Kit Braço Robótico 3 Eixos Programável – Controle Local e Remoto com Arduino e Bluetooth
Componentes e Materiais
| Componente | Quantidade | Observações |
|---|---|---|
| Arduino Mega 2560 | 1 | |
| SainSmart DIY 3-Axis Control Palletizing Robot Arm Model para Arduino UNO MEGA2560 | 1 | |
| MeArm DIY Robot Arm Kit | 1 | |
| Módulo Bluetooth HC-06 | 1 | |
| LCD RGB Backlight Adafruit 16x2 | 1 | |
| Dispositivo Android | 1 | |
| Potenciômetro Rotativo (genérico) 10Kohm | 4 | |
| Chave Pushbutton SparkFun 12mm | 3 | |
| LED (genérico) VERMELHO, AZUL, VERDE, AMARELO | 4 |
Aplicações e Serviços Online
- Arduino IDE
- MIT App Inventor 2
Sobre o Projeto
O objetivo deste tutorial é desenvolver passo a passo um projeto para controle e programação de um Braço Robótico, simulando as funções básicas de um robô industrial.
Passo 1: Especificações
O robô tem duas funções básicas:
- Programar: Gravar posições do braço em três dimensões (cada registro é um "passo")
- Executar: Realizar em sequência as posições gravadas no "Programa". O robô executa o programa até o comando "ABORTAR" ser usado.
Características principais:
- Controla robôs com 3 ou 4 GDL ("Graus de Liberdade").
- Modos de controle "LOCAL" e "REMOTO" (este via dispositivo Android).
- Durante a programação, usuário pode alternar entre "LOCAL" e "REMOTO".
- Informações ao usuário via LEDs coloridos, display LED 2 linhas e som (buzzer).
- Alarme sonoro também pode ser disparado remotamente.
Passo 2: O Projeto
O diagrama de blocos mostra o "Bill of Material". Optei pelo Arduino MEGA para não me preocupar com número de portas (I/Os). O UNO funcionaria, mas precisaria de expansão de portas (ex: decodificador 74138).
Primeiro protótipo sendo programado em "modo local".
Para rede Bluetooth, uso o HC-06.
O app Android para "modo remoto" foi desenvolvido com MIT App Inventor 2, plataforma poderosa para apps Android. Disponível grátis na Google Play: MJRoBot Arduino Robot Arm Control.
O vídeo abaixo mostra o projeto final com programação remota.
Passo 3: Desenvolvimento do Projeto
Braços robóticos classificados pelo número de "juntas" ou "Graus de Liberdade" (GDL):
- Base (ou Cintura): Gira o braço 180° ou 360° (servo 180° usado aqui).
- Ombro: Responsável por "levantar ou abaixar" o braço verticalmente.
- Cotovelo: Faz o braço "ir para frente ou para trás".
- Garra (ou Gripper): Abre/fecha para "pegar coisas".
Passo 4: O Circuito
Motores servo acionam as juntas, conectados diretamente ao Arduino. Não é incomum ver "Motores de Passo" na base para maior torque e precisão. A escolha adequada dos servos é crucial (servos chineses baratos como MG995 são mal construídos, mas serviram para este projeto).
A alimentação DC dos servos deve ser separada do Arduino e outros componentes. Fonte externa de 5 ou 6V funciona (verifique DataSheet dos servos). Prática comum: capacitores 470uF entre VCC e GND para minimizar ruído dos motores DC internos. Conecte todos os "Terras" (fonte externa com pino GND do Arduino).
Se servos vibram muito, ajuste os "delays" do código. Importante dar tempo aos servos para atingir posição antes de novo comando. Verifique se servos são digitais ou analógicos: digital = 300Hz, analógico = 50Hz. Biblioteca padrão Servo.h foi feita para analógicos, pode ser modificada para digitais.
Passo 5: O Código
O projeto não é complexo, mas tem muitas variáveis. O mais prudente é defini-las claramente com comentários em arquivo único: ArmDefine.h
Este arquivo também define ângulos mínimo, máximo e iniciais dos servos. O código inclui dois conjuntos de parâmetros para os braços testados (use apenas um grupo):
// MeArm 4-GDL
#define minGrip 15
#define minBase 0
#define minShou 60
#define minElbw 60
#define maxGrip 45
#define maxBase 170
#define maxShou 180
#define maxElbw 150
#define midGrip 30
#define midBase 87
#define midShou 138
#define midElbw 100
/* SS 3-GDL
#define minGrip 75
#define minBase 5
#define minShou 5
#define minElbw 0
#define maxGrip 125
#define maxBase 150
#define maxShou 155
#define maxElbw 0
#define midGrip 100
#define midBase 90
#define midShou 90
#define midElbw 0 */
Cada tipo de braço tem parâmetros diferentes. Sugiro: inicialmente potenciômetros no ponto médio e mapeamento PWM padrão (Max=255, Min=0, Mid=126). Vá variando os pots (um a um) e observe no Serial Monitor (ou LCD) os valores mín/máx onde o braço funciona bem. Esses serão os valores finais para ArmDefine.h.
Para "gravar" conjuntos de coordenadas (passos) que o robô deve executar, uso arrays de dados:
int gripPosition[100];
int basePosition[100];
int shouPosition[100];
int elbwPosition[100];
int positionIndex = 0; // Índice para array de posições usadas em tarefas gravadas
Não mantenho posições "armazenadas" permanentemente; ao fim do programa, índice volta a zero e robô espera nova sequência. Alternativamente, poderia guardar no EEPROM do Arduino para persistir programas.
Passo 6: Lógica do Programa
O bloco principal (Loop) é simples:
void loop() {
checkBTcmd();
defineLocalRemote();
execTaskCmd = digitalRead(execTaskPin);
if (execTaskCmd == HIGH || command == "runon") {
RunProgram();
} else {
recArmPosition();
}
command = "";
}
- Verifica se comando para executar "programa" (sequência de passos) foi usado. Se sim, executa. Senão, programa incompleto, deve gravar novos passos.
- Se "nova posição" definida, adiciona ao programa.
- Primeiro, checa mensagens no buffer serial vindas do Android.
- Verifica se modo de controle é "Local" ou "Remoto" (padrão: Local).
- Volta ao início.
A função checkBTcmd() monta string com caracteres que chegam do módulo BT, passa para variável command.
A função defineLocalRemote() analisa command para mudar modo ou disparar alarme. Se alarme acionado no Android, braço deve ir para modo Remoto.
A função RunProgram() prepara LEDs, etc., e invoca ExecuteTask(), que contém a lógica de execução da sequência. Incrementa positionIndex enviando dados de posição ao braço via armPosition(grip, base, shoulder, elbow).
A função que realmente comanda servos e grava "passos" é recArmPosition(). Define posicionamento dos servos via pots ou "sliders" do app Android. A cada mudança, envia coordenadas via armPosition. A leitura real e ativação dos servos ocorre quando comando "SALVAR" ou "PROGRAMAR" é acionado. Nesse momento, índice do array incrementa e passo é armazenado.
Para simplificar, todo código baseado em funções específicas:
- MJRoBot_Arm_Robot_Task_Prgm.ino: Setup, Loop, funções principais descritas acima.
- General_Functions.ino: Funções gerais - leitura BT
checkBTcmd(), gerador sombeep(), debouncedebounce(). - Arm_Ctrl_and_Display.ino: Leitura pots
readPotenciometers(), leitura sliders AndroidreadSliders(), posicionamento servosarmPosition(), funções de display LCD, Serial Monitor, alarmes.
Importante: Arduino executa instruções a 16MHz, botões lidos centenas/milhares vezes/seg → debounce essencial no botão de gravação.
O vídeo mostra o braço 4GDL "meArm" sendo programado remotamente via app Android.
Código completo no GitHub: https://github.com/Mjrovai/MJRoBot-Programmed-Arm
Arquivos do projeto: F49C85FIL8CVX0P.ino, FC4OQJNIL8CVX1C.h, FBYPQAMIL8CVX1D.ino, F2SBAXVIL8CVX1E.ino
Passo 7: Conclusão
Espero que este projeto ajude outros a entrar no mundo da Eletrônica, Robótica e IoT! Mais projetos no blog: MJRoBot.org
Saudações do sul do mundo! Até o próximo tutorial!
Obrigado,
Marcelo
Código
Trecho de Código #1 (Arduino) - Definições de Parâmetros
// MeArm 4-GDL
#define minGrip 15
#define minBase 0
#define minShou 60
#define minElbw 60
#define maxGrip 45
#define maxBase 170
#define maxShou 180
#define maxElbw 150
#define midGrip 30
#define midBase 87
#define midShou 138
#define midElbw 100
/* SS 3-GDL
#define minGrip 75
#define minBase 5
#define minShou 5
#define minElbw 0
#define maxGrip 125
#define maxBase 150
#define maxShou 155
#define maxElbw 0
#define midGrip 100
#define midBase 90
#define midShou 90
#define midElbw 0 */
Trecho de Código #2 (Arduino) - Arrays de Posição
int gripPosition[100];
int basePosition[100];
int shouPosition[100];
int elbwPosition[100];
int positionIndex = 0; // Índice para array de posições usadas em tarefas gravadas
Trecho de Código #3 (Arduino) - Loop Principal
void loop() {
checkBTcmd();
defineLocalRemote();
execTaskCmd = digitalRead(execTaskPin);
if (execTaskCmd == HIGH || command == "runon") {
RunProgram();
} else {
recArmPosition();
}
command = "";
}
GitHub
https://github.com/Mjrovai/MJRoBot-Programmed-Arm
Esquemáticos
Braço Robótico
Processo de manufatura
- Controle Remoto Universal Android com Arduino, 1Sheeld e IR
- Como Braços Robóticos Industriais Transformam a Manufatura: Principais Benefícios
- Manipuladores Robóticos vs. Braços Robóticos: Diferenças-Chave Explicadas
- Crie Animações e Jogos Envolventes em LCD com Arduino UNO
- Construa um Voltímetro Inteligente com Arduino e Smartphone – Projeto DIY Fácil
- Controle IoT Remoto de Braço Robótico Personalizado
- Construa um Braço Robótico 3D Impresso Funcional com Arduino – Guia Passo a Passo
- Braço Robótico 6 GDL Controlado por Nunchuk com Arduino Mega
- Construa um Voltímetro DIY com Arduino e Display Nokia 5110 – Guia Passo a Passo
- Braço Robótico Inteligente Controlado por Arduino: Tutorial DIY Fácil