quarta-feira, 24 de fevereiro de 2016

Carro de controle remoto utilizando controle de TV

Vamos criar um programa simples que irá controlar um pequeno veículo através de um controle de TV ou qualquer outro controle IR compatível com o auxilio da biblioteca IR e com a IDE do arduino .

Materiais:

  • Arduino Uno;
  • Ponte H dupla(  L9110, L298n ou de transistores)
  • Controle emissor IR( controle de TV, Rádio , DVD, Etc)
  • Receptor IR;
  • Resistor de 100 ohm para o receptor IR.
  • 2 Motores, motorredutores ou servos de parabólica adaptado;
  • 1 base para montar o conjunto.

O Receptor IR é responsável por receber os pulsos infra vermelhos codificados enviados pelo controle e convertê-los em sinal que possa ser lido e decodificado por um microcontrolador. Antes de fazer as ligações, atentar-se a pinagem do receptor IR. Existem alguns modelos e pinagens diferentes como na imagem abaixo:


Neste exemplo irei utilizar o modelo de pinagem do IS1U60, PIC12043S e SFH505A.
Também existem shields dedicados como este feito por mim mesmo na imagem abaixo:


Ponte H:

A ponte H é um esquema de transistores para controlar o sentido de giro de motores e fazer sua reversão. Para cada motor é necessário uma ponte. Abaixo o esquema de uma ponte H e exemplos de ponte H dupla feita com componentes discretos e um shield de Ponte H:

Controlador Ponte H L9110 - Dois Motores - Arduino Robotica

Vamos utilizar como exemplo o shield L9110 de ponte H dupla. Neste shield temos os pinos: A-1A, A-1B, B-1A E B-1B responsáveis por fazer a reversão e controle dos motores, serão ligados nas saídas digitais do Arduino 6,7,8 e 9 e nos motores conforme o esquema abaixo:


Caso o carro estiver com os movimentos invertidos, basta trocar os fios + com -.
Devemos ter uma certa atenção ao ligar os pinos 6,7,8 e 9 para que funcione semelhante a lógica abaixo:

0000= PARA
1111=NÃO VAMOS UTILIZAR

Ligaremos também o pino de saída do receptor IR no pino 13 do arduino e o resistor de 100ohm no pino de VCC do receptor IR.

Com relação a base ou chassis , existem algumas prontas na internet, no meu caso, utilizei uma placa de fenolite e colei os servos de parabólica adaptados na parte de trás. Neste caso removi o fim de curso do servo para que gire 3690 graus. Na frente coloquei um pequeno rodizio só para apoio.


Para o programa a seguir, precisaremos da biblioteca IRremote .


// Programa : Carro de Controle Controle Remoto IR  
// Autor : Fernando Moreira  
  
#include <IRremote.h>  
int RECV_PIN = 13;  
float armazenavalor;  
int IN1 = 6;  
int IN2 = 7; 
int IN3 = 8;  //PINOS DO ARDUINO UTILIZADOS PARA A PONTE H
int IN4 = 9; 

  IRrecv irrecv(RECV_PIN);  

decode_results results;  
  
void setup()  
{  
  pinMode(IN1, OUTPUT);   
  pinMode(IN2, OUTPUT);  
  pinMode(IN3, OUTPUT);   // //PINOS DEFINIDOS COMO SAÍDAS QUE SERÃO LIGADOS A PONTE H
  pinMode(IN4, OUTPUT);  
  
  Serial.begin(9600);  
  irrecv.enableIRIn(); // Inicializa o receptor IR  
}  
   
void loop()  
{  
  if (irrecv.decode(&results))  
  {  
    Serial.print("Valor lido : ");  
    Serial.println(results.value, HEX);  
    armazenavalor = (results.value);  
    if (armazenavalor == 0x20DF02FD) //Verifica se a tecla AVANÇAR foi acionada 
    {  
      digitalWrite(IN1, HIGH);
      digitalWrite(IN3, HIGH);
      digitalWrite(IN2, LOW); 
      digitalWrite(IN4, LOW);      //AVANÇAR
    }  
    if (armazenavalor == 0x20DF827D) //Verifica se a tecla RÉ foi acionada  
    {  
       digitalWrite(IN1, LOW); 
      digitalWrite(IN3, LOW);      //RÉ
      digitalWrite(IN2, HIGH);
      digitalWrite(IN4, HIGH);
    }  
    if (armazenavalor == 0x20DFE01F) //Verifica se a tecla ESQUERDA foi acionada  
    {  
      digitalWrite(IN1, HIGH);
      digitalWrite(IN3, LOW);
      digitalWrite(IN2, LOW); 
      digitalWrite(IN4, HIGH);      //ESQUERDA
    }  
    if (armazenavalor == 0x20DF609F) //Verifica se a tecla DIREITA foi acionada  
    {  
      digitalWrite(IN1, LOW); 
      digitalWrite(IN3, HIGH);      //DIREITA
      digitalWrite(IN2, HIGH);
      digitalWrite(IN4, LOW);
    }  
    if (armazenavalor == 0x20DF22DD) //Verifica se a tecla PARAR foi acionada  
    {  
       digitalWrite(IN1, LOW); 
      digitalWrite(IN3, LOW);      //PARAR
      digitalWrite(IN2, LOW);
      digitalWrite(IN4, LOW); 
    }  
   irrecv.resume(); //Le o próximo valor  
  }  

}  


Após compilar e gravar o programa no Arduíno, deixaremos conectado via usb para customizar as teclas de acionamento.
Vamos abrir o monitor serial da IDE do arduino para verificar o que está sendo enviado por cada tecla do controle.
Os valores são impressos via serial e exibidos em hexadecimal :



Com esses valores, podemos escolher qualquer tecla que for conveniente, anotar seu valor e substituir na função if no programa ex:

  if (armazenavalor == 0x20DF02FD) //Verifica se a tecla AVANÇAR foi acionada 
    {  
      digitalWrite(IN1, HIGH);
      digitalWrite(IN3, HIGH);
      digitalWrite(IN2, LOW); 
      digitalWrite(IN4, LOW);      //AVANÇAR


Neste caso, a tecla com o valor 0x20DF02FD é responsável por fazer o carro avançar.
 Fiz a seguinte configuração:





Os valores podem ser diferentes de controle para controle. O ideal é ler os valores e substituir no programa conforme necessário.
Esse programa pode ser utilizado para controlar relés, LEDs e qualquer outro dispositivo ligado as portas digitais. Podemos acrescentar mais botões e modificar a lógica conforme a nossa imaginação permitir.