Este Post foi criado para documentar um exemplo criado por mim para controlar o braço robótico MeArm V0.4 através de controle remoto de Infravermelho. Não abordarei a montagem do braço em si. Para a montagem indico a publicação Pocket-Sized-Robot-Arm-meArm-V04.
OBS: Já existe uma versão mais nova do braço. Para informações sobre como montar o seu, visite o site do meArm.
Continuando… existem vários exemplos controlando o braço com potenciômetros… mas é digamos… algo sem graça =D. Procurei algo diferente e simples e não achei. Então resolvi fazer esse código só para mostrar que nem tudo é só potenciômetros =p. Ao mesmo tempo este programa serve de exemplo para controle de servos e utilização de infravermelho.
1-Ligações Elétricas:
Importante: os servos motores consomem muita corrente. O regulador do Arduino não é capaz de suportar os 4 servos ligados a ele. Neste exemplo utilizei 6V(4 pilhas) para alimentar os servos e alimentar o Arduino através do Vin. Alimentar os servos pela USB NÃO é uma opção.
Os sinais dos servos motores foram configurados para os pinos 2,3,4,5 do Arduino.
O sensor de IR foi ligado ao pino 11, que é o padrão da biblioteca IRremote. Foi utilizado um módulo receptor de IR que possui o receptor Vs1838B. Caso não possua o módulo mas apenas o vs1838b então monte na protoboard o circuito.
2- Baixar e instalar a biblioteca IRremote no IDE do Arduino:
Para fazer a decodificação dos sinais recebidos pelo sensor de IR utilizei a biblioteca IRremote versão 2.01 encontrada no GitHub. É só entrar na página e baixar clicando no botão “download ZIP”. Descompacte. Renomeie a pasta descompactada para IRremote. Copie e cole a pasta IRremote para dentro da pasta “libraries” que fica dentro do IDE arduino.
DICA: Arduino não tolera alguns caracteres especiais em suas bibliotecas… por isso foi renomeado neste exemplo.
DICA2: talvez exista conflito entre a biblioteca “IRremote” com a “RobotIRremote”. Neste caso apague a pasta “RobotIRremote”.
3-Descobrindo os Códigos dos Controles Remotos:
Cada controle remoto possui seu sistema de codificação(existem vários). Felizmente a biblioteca IRremote consegue descobrir qual o sistema de codificação e nos retornará o código da tecla. Como cada controle pode ter sua codificação diferente… temos que “descobrir” e “anotar” o código de cada tecla.
OBS: Sim, poderia ter escrito um código para descobrir e aprender a tecla de qualquer controle e salvar na EEPROM do Arduino… mas estava com preguiça 😉 e queria manter um exemplo simples…
Para “descobrir” o código de cada tecla utilizei o código exemplo da IRremote de nome “IRrecvDemo” (Arquivo>exemplos>IRremote>IRrecvDemo) ele decodifica o sinal recebido e envia pela porta serial o código. Após enviar esse exemplo para sua placa Arduino, abra o serial monitor (fica no canto direito superior) e saia anotando os códigos de cada tecla do seu controle.
4-Código Completo:
De posse dos códigos das teclas do seu controle… atualize a tabela de teclas do código abaixo e mande para o Arduino.
//Autor: Almir M Ventura
//site: www.omecatronico.com.br
//controla Braço “MeArm V0.4” através de controle remoto IR.
//importando bibliotecas
#include <IRremote.h>
#include <Servo.h>
//definições das teclas do controle remoto(dica não tem “;” após comando #define)
//”0x” na frente dos códigos é para o compilador entender que são números Hexadecimais
#define TECLA0 0xFDB04F
#define TECLA1 0xFD00FF
#define TECLA2 0xFD807F
#define TECLA3 0xFD40BF
#define TECLA4 0xFD20DF
#define TECLA5 0xFDA05F
#define TECLA6 0xFD609F
#define TECLA7 0xFD10EF
#define TECLA8 0xFD906F
#define TECLA9 0xFD50AF
#define TECLAVELHA 0xFD30CF
#define TECLAAST 0xFD708F
#define TECLASUP 0xFD8877
#define TECLAESQ 0xFD28D7
#define TECLAOK 0xFDA857
#define TECLADIR 0xFD6897
#define TECLAINF 0xFD9867
//criando objetos para controlar os servos.
Servo servo0; // cria objeto servo para controlar o servo
Servo servo1; // cria objeto servo para controlar o servo
Servo servo2; // cria objeto servo para controlar o servo
Servo servo3; // cria objeto servo para controlar o servo
//VARIAVEIS para guardar os angulos atuais dos servos:
int angulo0 = 90;
int angulo1 = 90;
int angulo2 = 90;
int angulo3 = 90;
//configurando biblioteca do receptor IR
int RECV_PIN = 11; //configurando receptor de infravermelho para pino 11
IRrecv irrecv(RECV_PIN);
decode_results results; //objeto que guardará resultados da recepção do IR.
void setup()
{
//configurando servos
servo0.attach(2); // configura objeto servo0 para o pino 2
servo1.attach(3); // configura objeto servo1 para o pino 3
servo2.attach(4); // configura objeto servo2 para o pino 4
servo3.attach(5); // configura objeto servo3 para o pino 5
//configurando comunicação serial
Serial.begin(19200);
irrecv.enableIRIn(); // inicia recepção de IR
}
void loop() {
if (irrecv.decode(&results)) {
switch(results.value)
{
//servo 0 ——————————————————
//tecla 1
case TECLA1:
angulo0=angulo0-5;
servo0.write(angulo0); //diminui em 5 graus
break;
//tecla 2
case TECLA2:
angulo0=90;
servo0.write(angulo0); //faz angulo ir para 90 graus.
break;
//tecla 3
case TECLA3:
angulo0=angulo0+5;
servo0.write(angulo0); //aumenta em 5 graus
break;
//servo 1 ——————————————————–
//tecla 4
case TECLA4:
angulo1=angulo1-5;
servo1.write(angulo1); //diminui em 5 graus
break;
//tecla 5
case TECLA5:
angulo1=90;
servo1.write(angulo1); //faz angulo ir para 90 graus.
break;
//tecla 6
case TECLA6:
angulo1=angulo1+5;
servo1.write(angulo1); //aumenta em 5 graus
break;
//servo 2 ——————————————————–
//tecla 7
case TECLA7:
angulo2=angulo2-5;
servo2.write(angulo2); //diminui em 5 graus
break;
//tecla 8
case TECLA8:
angulo2=90;
servo2.write(angulo2); //faz angulo ir para 90 graus.
break;
//tecla 9
case TECLA9:
angulo2=angulo2+5;
servo2.write(angulo2); //aumenta em 5 graus
break;
//servo 3 ——————————————————–
//tecla *
case TECLAAST:
angulo3=angulo3-5;
servo3.write(angulo3); //diminui em 5 graus
break;
//tecla 0
case TECLA0:
angulo3=90;
servo3.write(angulo3); //faz angulo ir para 90 graus.
break;
//tecla #
case TECLAVELHA:
angulo3=angulo3+5;
servo3.write(angulo3); //aumenta em 5 graus
break;
//codigo não encontrado/desconhecido…—————————–
default:
// se o codigo não for conhecido ou for errado
// não faz nada
break;
}
Serial.println(results.value, HEX);
irrecv.resume(); //Recebe o proximo valor pelo IR.
}
delay(100);
}
5-Funcionamento:
Ao iniciar, o programa faz todos os servos irem para 90 graus.
Tecla 1 diminui em 5 graus o ângulo do servo0. Tecla 2 faz servo0 ir para 90 graus. Tecla 3 adiciona 5 graus no ângulo atual do servo0.
As teclas 456 funcionam da mesma forma mas para o servo1, 789 para servo2 e *0# para servo 3.
Espero ter sido claro nas explicações e documentação desse pequeno projeto. Qualquer erro favor apontar para que eu possa corrigir. Obrigado e até a próxima ;).