Arduino, Eletrônica, Mecânica, Servo Motores

Controlando Braço MeArm por Controle Infravermelho

Braço MeArm V04 mais controle Infravermelho

Braço MeArm V04 mais controle Infravermelho

Braço MeArm V04 mais controle Infravermelho

Braço MeArm V04 mais controle Infravermelho

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.

ir-vs1838b pinagem

ir-vs1838b pinagem


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.

Guia de instalação Biblioteca Arduino

Guia de instalação de Biblioteca na 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:

controleIR

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 ;).