Construa Sauron: O Robô Semi-Humanoide – Guia Completo com Arduino Mega 2560
Componentes e Materiais
| Arduino Mega 2560 | 1 |
| 1Sheeld | 1 |
| Dispositivo Android | 1 |
Ferramentas Necessárias
- Cortadora a laser
Aplicativos e Serviços Online
- Arduino IDE
Sobre o Projeto
Fã de O Senhor dos Anéis? Então conhece Sauron! Neste projeto, construímos um robô semi-humanoide do tamanho humano com a aparência de Sauron.
O robô possui dois braços com 3 GDL (graus de liberdade) e uma cabeça com 3 GDL, sobre uma base fixa. Opera em três modos, alternados por dois botões em pinos digitais:
- Modo Standby: Sequência de movimentos para atrair atenção em eventos.
- Modo Gamepad: Controle manual via shield Gamepad do app 1Sheeld.
- Modo Imitação: O robô imita movimentos do usuário (como o garoto em Real Steel). Use uma luva com smartphone fixo; o Arduino lê sensores (orientação, giroscópio) e controla os braços.
Projeto feito para a New York Maker Faire, para inspirar crianças a usar Arduino e 1Sheeld para construir personagens de filmes. Inclui todos os arquivos: desenhos CAD, esquemáticos, códigos Arduino e arquivos DXF para corte a laser.
Passo 1: Construindo a Cabeça do Robô
Usei a cabeça robótica open-source "Fritz" do xyzbot. Baixei os arquivos de corte a laser e cortei as peças em uma makerspace próxima. Usei compensado de 3mm. Pulei a impressão 3D das partes dos olhos, sobrancelhas e lábios para reduzir tempo e custo.
Siga o vídeo de montagem do kit original, mas:
- Pule a montagem da base.
- Pule passos relacionados às partes 3D dos olhos.
- Pule passos de sobrancelhas e lábios.
Arquivos: Open_Source_Files.zip, FFRDB2LIKJ8MS1G.dxf
Passo 2: Construindo o Corpo do Robô
Corpo portátil para fácil montagem em eventos. Usei hastes Artelon e chapas de compensado 3mm. Junções lingueta-e-ranhura fixam peito, ombros, pescoço e costas. Parafusos 4mm x 20mm fixam a estrutura de madeira ao esqueleto Artelon; parafusos 12mm x 30mm fixam o esqueleto à base; parafusos 4mm x 10mm fixam servomotores à estrutura.
O esqueleto Artelon tem 5 partes: haste básica (50mm), esqueleto (25mm), hastes de largura (15mm, 3 peças). Ver desenhos anexos.
Arquivos PDF e ZIP anexos.
Passo 3: Criando a Base do Robô
Base projetada no Solidworks para fixar o robô à mesa (3 parafusos ou 2 grampo C de 4"). Chapa de metal 6mm com aberturas para reduzir peso. Parafusos 12mm x 30mm fixam base ao esqueleto. Arquivo DXF: FMZODFWIKMXHHIV.dxf
Passo 4: Construindo os Braços do Robô
Maior desafio: braços modulares, fáceis de montar/desmontar para viagem. Projetados para serem genéricos: podem ter espada/gancho (pirata), punhos (boxeador como Atom), ou garras (uso geral).
Estrutura do braço em compensado 3mm, juntas pan-tilt de alumínio nos ombros, armas (espada/gancho) em folhas de balsa. Juntas do antebraço fatiadas via Autodesk 123D Make e cortadas a laser. Modelo Solidworks anexo para modificações e cálculo de torque (precisa servos 3kg/cm, usei maiores).
Passo 5: Capacete e Armadura Cosplay do Sauron
Meu amigo Kareem ajudou no cosplay, baseado nestes tutoriais (adaptados às dimensões do robô):
Passo 6: Eletrônica do Robô
- Arduino Mega + 1Sheeld controlam servomotores dos braços e cabeça.
- Fonte 5V/5A alimenta motores e Arduino.
- Protoboard pequena conecta VCC/GND de todos os motores à fonte.
- 1Sheeld: plataforma de prototipagem rápida que acessa sensores do smartphone via Bluetooth. App 1Sheeld tem muitos shields; selecione: Gamepad, Orientation, Music Player, Toggle Button, Terminal.
Detalhes dos shields:
- Gamepad Shield: GUI no smartphone com botões tipo PlayStation; envia dados via Bluetooth para Arduino controlar servos.
- Orientation Shield: Smartphone na luva; mapeia valores dos sensores para ângulos dos servos.
- Music Player Shield: Toca trilha com voz do Sauron sincronizada com movimento da boca.
- Toggle Button Shield: Seleciona modo desejado (substitui botões físicos).
- Terminal Shield: Substitui Serial Monitor do IDE (1Sheeld não comunica com PC e Bluetooth simultaneamente).
Passo 7: Código do Arduino
- Coloque o 1Sheeld no Arduino e conecte ao PC.
- Baixe o app 1Sheeld no Android (Google Play: 1sheeld.com/app).
- Baixe a biblioteca 1Sheeld e instale na pasta libraries do Arduino.
- Abra meu sketch Arduino (arquivo anexo
F5KJZGXIKMXG3DG.ino). - IMPORTANTE: Coloque o 1Sheeld em Uploading-mode (chave UART afastada do logo) ANTES de fazer upload no IDE. Após upload, volte para Operating-mode (chave próxima ao logo). Sem isso, não há comunicação.
- Use o app 1Sheeld: escaneia Bluetooth, pareie (código padrão 1234).
- Selecione os shields (Gamepad, Orientation, Music Player, Toggle Button, Terminal) e pressione o ícone de múltiplos shields.
- Ao ligar, o robô inicia no modo Standby. Para Gamepad: no Toggle Button, escolha pino 2 e ligue. Para voltar ao Standby, desligue.
- Para Imitação: no Toggle Button, escolha pino 3 e ligue (pino 2 deve estar LOW).
Passo 8: Sauron na Maker Faire New York
Fotos do robô em ação no evento.
Passo 9: Trabalhos Futuros
- Gravar vídeo de montagem e teste dos três modos.
- Cabeça: adicionar restantes motores e imprimir peças 3D dos olhos (pálpebra, suporte, anel, pino, globo ocular).
- Base: substituir base fixa por base com 4 rodas mecanum para mobilidade. Design no Solidworks pronto, falta integrar.
Código do Arduino (Sauron Arduino Code)
#define CUSTOM_SETTINGS
#define INCLUDE_GAMEPAD_SHIELD
#define INCLUDE_MUSIC_PLAYER_SHIELD
#define INCLUDE_TERMINAL_SHIELD
#define INCLUDE_ORIENTATION_SENSOR_SHIELD
#include <OneSheeld.h>
#include <Servo.h>
Servo rightArm_Motor1, rightArm_Motor2, rightArm_Motor3;
Servo leftArm_Motor1, leftArm_Motor2, leftArm_Motor3;
Servo neckHorizontal, neckVertical, mouth;
const int modePin1 = 2;
const int modePin2 = 3;
volatile int modeState1 = LOW;
volatile int modeState2 = LOW;
volatile boolean gamepadMode_Enabled = false;
volatile boolean imitationMode_Enabled = false;
const int ledPin1 = A0;
const int ledPin2 = A1;
void setup() {
OneSheeld.begin();
pinMode(modePin1, INPUT);
pinMode(modePin2, INPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, HIGH);
attachInterrupt(digitalPinToInterrupt(modePin1), gampadMode_ChangeISR, CHANGE);
attachInterrupt(digitalPinToInterrupt(modePin2), imitationMode_ChangeISR, CHANGE);
rightArm_Motor1.attach(4);
rightArm_Motor2.attach(5);
rightArm_Motor3.attach(6);
leftArm_Motor1.attach(7);
leftArm_Motor2.attach(8);
leftArm_Motor3.attach(9);
neckHorizontal.attach(10);
neckVertical.attach(11);
mouth.attach(12);
// Posição inicial (home)
rightArm_Motor1.write(95);
rightArm_Motor2.write(150);
rightArm_Motor3.write(20);
leftArm_Motor1.write(90);
leftArm_Motor2.write(45);
leftArm_Motor3.write(180);
neckHorizontal.write(105);
neckVertical.write(30);
mouth.write(100);
}
void loop() {
modeState1 = digitalRead(modePin1);
modeState2 = digitalRead(modePin2);
if (modeState1 == HIGH) {
Terminal.println("GamePad Mode was selected");
gamePadMode();
} else if (modeState2 == HIGH) {
Terminal.println("Imitation Mode was selected");
imitationMode();
} else {
Terminal.println("Standby Mode was selected");
standbyMode();
}
}
void standbyMode() {
Terminal.println("Standby mode activated");
// Posição home
rightArm_Motor1.write(95); rightArm_Motor2.write(150); rightArm_Motor3.write(20);
leftArm_Motor1.write(90); leftArm_Motor2.write(45); leftArm_Motor3.write(180);
neckHorizontal.write(105); neckVertical.write(30);
MusicPlayer.play();
for (int i = 0; i <= 19; i++) {
mouth.write(100); OneSheeld.delay(150);
mouth.write(75); OneSheeld.delay(150);
}
MusicPlayer.pause();
mouth.write(100);
OneSheeld.delay(3000);
// Verifica interrupção para outros modos
if (gamepadMode_Enabled) { gamePadMode(); return; }
if (imitationMode_Enabled) { imitationMode(); return; }
// Sequência de movimentos: 9 posições com música e movimento de boca
// (código abreviado - sequência completa no original)
// 1. Move cabeça 90->0->180->90
// 2. Move mãos e cabeça a 45°
// 3. Move mão direita e cabeça a 135°
// 4. Move cabeça ao centro
// 5. Move mãos para cima
// 6. Move mãos para lados
// 7. Golpeia mão direita
// 8. Golpeia mão esquerda
// 9. Retorna à posição home com música longa
}
void gamePadMode() {
Terminal.println("Gamepad mode activated");
if (GamePad.isUpPressed()) {
// Move ambas mãos para cima
rightArm_Motor1.write(110); rightArm_Motor2.write(0); rightArm_Motor3.write(45);
leftArm_Motor1.write(90); leftArm_Motor2.write(180); leftArm_Motor3.write(145);
neckHorizontal.write(105); neckVertical.write(30); mouth.write(100);
}
if (GamePad.isDownPressed()) {
// Move ambas mãos para baixo
rightArm_Motor1.write(110); rightArm_Motor2.write(170); rightArm_Motor3.write(45);
leftArm_Motor1.write(90); leftArm_Motor2.write(20); leftArm_Motor3.write(145);
neckHorizontal.write(105); neckVertical.write(30); mouth.write(100);
}
if (GamePad.isRightPressed()) {
// Move mão direita para lado
rightArm_Motor1.write(110); rightArm_Motor2.write(80); rightArm_Motor3.write(60);
leftArm_Motor1.write(90); leftArm_Motor2.write(20); leftArm_Motor3.write(145);
neckHorizontal.write(105); neckVertical.write(30); mouth.write(100);
}
if (GamePad.isLeftPressed()) {
// Move mão esquerda para lado
rightArm_Motor1.write(110); rightArm_Motor2.write(170); rightArm_Motor3.write(45);
leftArm_Motor1.write(90); leftArm_Motor2.write(115); leftArm_Motor3.write(140);
neckHorizontal.write(105); neckVertical.write(30); mouth.write(100);
}
if (GamePad.isRedPressed()) {
// Combo 1
rightArm_Motor1.write(180); rightArm_Motor2.write(45); rightArm_Motor3.write(100);
leftArm_Motor1.write(90); leftArm_Motor2.write(180); leftArm_Motor3.write(110);
neckHorizontal.write(105); neckVertical.write(30); mouth.write(100);
}
if (GamePad.isOrangePressed()) {
// Combo 2
rightArm_Motor1.write(15); rightArm_Motor2.write(100); rightArm_Motor3.write(0);
leftArm_Motor1.write(180); leftArm_Motor2.write(100); leftArm_Motor3.write(180);
neckHorizontal.write(105); neckVertical.write(30); mouth.write(100);
}
if (GamePad.isGreenPressed()) {
// Combo 3
rightArm_Motor1.write(95); rightArm_Motor2.write(45); rightArm_Motor3.write(120);
leftArm_Motor1.write(90); leftArm_Motor2.write(135); leftArm_Motor3.write(60);
neckHorizontal.write(105); neckVertical.write(10); mouth.write(100);
}
if (GamePad.isBluePressed()) {
// Combo 4
rightArm_Motor1.write(90); rightArm_Motor2.write(0); rightArm_Motor3.write(90);
leftArm_Motor1.write(180); leftArm_Motor2.write(45); leftArm_Motor3.write(180);
neckHorizontal.write(105); neckVertical.write(30); mouth.write(100);
}
}
void imitationMode() {
Terminal.println("Imitation mode activated");
if (OrientationSensor.getY() > -90 && OrientationSensor.getY() <= 90) {
leftArm_Motor1.write(map(OrientationSensor.getY(), -90, 90, 0, 180));
}
if (OrientationSensor.getZ() > -70 && abs(OrientationSensor.getZ()) <= 70) {
leftArm_Motor2.write(map(OrientationSensor.getZ(), 0, 60, 100, 160));
leftArm_Motor3.write(map(OrientationSensor.getZ(), 0, 60, 160, 100));
}
}
void gampadMode_ChangeISR() {
if (gamepadMode_Enabled && !imitationMode_Enabled) {
gamepadMode_Enabled = false;
imitationMode_Enabled = false;
} else {
gamepadMode_Enabled = true;
imitationMode_Enabled = false;
}
}
void imitationMode_ChangeISR() {
if (imitationMode_Enabled && !gamepadMode_Enabled) {
gamepadMode_Enabled = false;
imitationMode_Enabled = false;
} else {
gamepadMode_Enabled = false;
imitationMode_Enabled = true;
}
}
Esquemático
Diagrama de conexões dos servomotores ao Arduino Mega via 1Sheeld.
Processo de manufatura
- Aprimorando a Consistência com Robôs de Pulverização Autônomos
- Como Robôs de Pintura Reduzem Retrabalho, Aumentam Consistência e Economizam Custos
- Reduzindo Custos de Retrabalho na Manufatura: Estratégias para Eficiência e Qualidade
- Visão Robótica na Indústria: Da Visão à Auto-Programação
- O Que é um Robô de Auto-Programação e Por Que Importa
- Robôs Industriais: Design, Fabricação e Tendências Futuras
- Maximizando Eficiência: Célula de Injeção Multi-Robô Produz Copo Shaker Completo em Um Ciclo
- Construa a Equipe Ideal de Implementação de ERP: Estratégias Comprovadas para Sucesso
- Construa um Robô SCARA DIY com Arduino – Guia Passo a Passo
- O Futuro da Automação: Robôs Auto-Replicantes Remodelando a Indústria 4.0