terça-feira, 30 de julho de 2013

Carrinho Controle IR Arduino


      Esta página irá ensinar como fazer um carrinho controlado por controle remoto emissor de infravermelho (controle de televisão, dvd, recptor de parabólica, controle de rádio de carro, etc). Para isso será necessário o seguinte material:
-Arduino (no caso utilizei o UNO)
-7 Resistores 330 Ω
-2 Capacitores 100 nF
-1 Ponte H dupla: CI L298N
-2 Motores com caixa de redução
-1 Receptor de infravermelho de 3 terminais
-1 Protoboard
-4 Leds alto brilho
-4 Leds amarelos
-2 Leds vermelhos
-1 Receptor infravermelho
-1 Bateria 9V (para alimentar o arduino)
-1 Suporte para 6 pilhas AA
-6 Pilhas AA
-Fios

    O esquemático da ligação segue abaixo:


  O fundo do carrinho foi feito seguindo o seguinte modelo:
     O vídeo mostrando o resultado do projeto está mostrado abaixo:


     O código para a programação do arduino segue abaixo:

#include <IRremote.h>
#include <IRremoteInt.h>

int RECV_PIN = 8;
IRrecv irrecv(RECV_PIN);
decode_results results;

#define BT_1 0xFF18E7   //Botao 1 - Cima
#define BT_2 0xFF4AB5   //Botao 2 - Baixo
#define BT_3 0xFF5AA5   //Botao 3 - Direita
#define BT_4 0xFF10EF   //Botao 4 - Esquerda
#define BT_5 0xFF38C7   //Botao 5 - Para
#define BT_6 0xFFA25D   //Botao 6 - Acende Farol


#define MOTOR1_Enable 5  //Enable Motor 1
#define MOTOR1_1 2       //Pino 1 Motor 1
#define MOTOR1_2 3       //Pino 2 Motor 1
#define MOTOR2_1 4       //Pino 1 Motor 2
#define MOTOR2_2 7       //Pino 2 Motor 2
#define MOTOR2_Enable 6  //Enable Motor 2

#define LUZ_VERMELHA 9       //Saída Luz Vermelha
#define LUZ_SETA_DIREITA 10  //Saída Luz Seta Direita
#define LUZ_SETA_ESQUERDA 11 //Saída Luz Seta Esquerda
#define LUZ_BRANCA_RE 12     //Saída Luz Re
#define LUZ_BRANCA_FRENTE 13 //Saída Luz Branca Farol


int MOTOR1_1State = LOW;   //Estado atual do MOTOR1_1
int MOTOR1_2State = LOW;   //Estado atual do MOTOR1_2
int MOTOR2_1State = LOW;   //Estado atual do MOTOR2_1
int MOTOR2_2State = LOW;   //Estado atual do MOTOR2_2
int FAROL_State = LOW;     //Estado atual do FAROL


long bt = 0; //Ultimo botao precionado
long penultimo = 0; //Penultimo botao precionado
unsigned long startMilis = 0; //Contado para blink sem delay

int value = LOW;                // último valor do LED da SETA
long previousMillis = 0;        // último momento que o LED foi atualizado
long interval = 400;           // tempo de transição entre estados do pisca da seta (milisegundos)

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();

  pinMode(MOTOR1_1, OUTPUT);
  pinMode(MOTOR1_2, OUTPUT);
  pinMode(MOTOR1_Enable, OUTPUT);
  pinMode(MOTOR2_1, OUTPUT);
  pinMode(MOTOR2_2, OUTPUT);
  pinMode(MOTOR2_Enable, OUTPUT);
  pinMode(LUZ_VERMELHA, OUTPUT);
  pinMode(LUZ_SETA_DIREITA, OUTPUT);
  pinMode(LUZ_SETA_ESQUERDA, OUTPUT);
  pinMode(LUZ_BRANCA_RE, OUTPUT);
  pinMode(LUZ_BRANCA_FRENTE, OUTPUT);

  //Motor Ativo no Inicio
  digitalWrite(MOTOR1_Enable,HIGH);
  digitalWrite(MOTOR2_Enable,HIGH);
}

void loop() {
  if (irrecv.decode(&results)) {
    irrecv.resume();

    Serial.println(results.value, HEX); //Aqui voce descobre qual o botao do seu controle
    //Apenas para filtrar os botoes apertados, no meu caso para filtrar outros controles =)
    if(results.value == BT_1 || results.value == BT_2 || results.value == BT_3 || results.value == BT_4 || results.value == BT_5 || results.value==BT_6)
    {
      startMilis = millis(); //Apertou um botao, reseta o contador
      bt = results.value; //Salva ultimo botao apertado
     
      if(bt==BT_1)
        mod(1);
      else if(bt==BT_2)
        mod(2);
      else if(bt==BT_3)
      {
        if(penultimo==BT_1)
          mod(3);
        else if(penultimo==BT_2)
          mod(4);
        else
          mod(5);
      }
      else if(bt==BT_4)
      {
        if(penultimo==BT_1)
          mod(6);
        else if(penultimo==BT_2)
          mod(7);
        else
          mod(8);
      }
      else if(bt==BT_5)
        mod(9);
      else
        mod(10);
    }
  }
  if(bt==BT_3)
  {
    if (millis() - previousMillis > interval)
    {
      previousMillis = millis();   // lembre-se do último tempo que piscamos o LED
      value=!value;
      digitalWrite(LUZ_SETA_DIREITA, value);
    }
  }
  else if(bt==BT_4)
  {
    if (millis() - previousMillis > interval)
    {
      previousMillis = millis();   // lembre-se do último tempo que piscamos o LED
      value=!value;
      digitalWrite(LUZ_SETA_ESQUERDA, value);
    }
  }
}

void mod(int x)
{
  unsigned long currentMillis = millis();

  if(x == 1)
  {
    //Mod 1, Anda para Frente
    digitalWrite(MOTOR1_Enable,HIGH);
    digitalWrite(MOTOR2_Enable,HIGH);
    digitalWrite(LUZ_SETA_DIREITA,LOW);
    digitalWrite(LUZ_SETA_ESQUERDA,LOW);
    digitalWrite(LUZ_BRANCA_RE,LOW);
    penultimo=BT_1;
    MOTOR1_1State = LOW;
    MOTOR1_2State = HIGH;
    MOTOR2_1State = LOW;
    MOTOR2_2State = HIGH;
  }
 
  if(x == 2)
  {
    //Mod 2, Anda para Traz
    digitalWrite(MOTOR1_Enable,HIGH);
    digitalWrite(MOTOR2_Enable,HIGH);
    digitalWrite(LUZ_SETA_DIREITA,LOW);
    digitalWrite(LUZ_SETA_ESQUERDA,LOW);
    digitalWrite(LUZ_BRANCA_RE,HIGH);
    penultimo=BT_2;
    MOTOR1_1State = HIGH;
    MOTOR1_2State = LOW;
    MOTOR2_1State = HIGH;
    MOTOR2_2State = LOW;
  }
 
  if(x == 3)
  {
    //Mod 3, Anda para Frente e Direita
    analogWrite(MOTOR1_Enable, 90); //Corresponde a 35% do ciclo
    digitalWrite(MOTOR2_Enable,HIGH);
    digitalWrite(LUZ_SETA_ESQUERDA,LOW);
    MOTOR1_1State = LOW;
    MOTOR1_2State = HIGH;
    MOTOR2_1State = LOW;
    MOTOR2_2State = HIGH;
  }
 
  if(x == 4)
  {
    //Mod 4, Anda para Traz e Direita
    analogWrite(MOTOR1_Enable, 90); //Corresponde a 35% do ciclo
    digitalWrite(MOTOR2_Enable,HIGH);
    digitalWrite(LUZ_SETA_ESQUERDA,LOW);
    MOTOR1_1State = HIGH;
    MOTOR1_2State = LOW;
    MOTOR2_1State = HIGH;
    MOTOR2_2State = LOW;
  }
 
  if(x == 5)
  {
    //Mod 5, Gira sobre o eixo no sentido horário
    digitalWrite(MOTOR1_Enable, HIGH);
    digitalWrite(MOTOR2_Enable,HIGH);
    digitalWrite(LUZ_SETA_ESQUERDA,LOW);
    MOTOR1_1State = HIGH;
    MOTOR1_2State = LOW;
    MOTOR2_1State = LOW;
    MOTOR2_2State = HIGH;
  }
 
  if(x == 6)
  {
    //Mod 6, Anda para Frente e Esquerda
    digitalWrite(MOTOR1_Enable, HIGH);
    analogWrite(MOTOR2_Enable,90); //Corresponde a 35% do ciclo
    digitalWrite(LUZ_SETA_DIREITA,LOW);
    MOTOR1_1State = LOW;
    MOTOR1_2State = HIGH;
    MOTOR2_1State = LOW;
    MOTOR2_2State = HIGH;
  }
 
  if(x == 7)
  {
    //Mod 7, Anda para Traz e Esquerda
    digitalWrite(MOTOR1_Enable, HIGH);
    analogWrite(MOTOR2_Enable,90); //Corresponde a 35% do ciclo
    digitalWrite(LUZ_SETA_DIREITA,LOW);
    MOTOR1_1State = HIGH;
    MOTOR1_2State = LOW;
    MOTOR2_1State = HIGH;
    MOTOR2_2State = LOW;
  }
 
  if(x == 8)
  {
    //Mod 8, Gira sobre o eixo no sentido anti-horário
    digitalWrite(MOTOR1_Enable, HIGH);
    digitalWrite(MOTOR2_Enable,HIGH);
    digitalWrite(LUZ_SETA_DIREITA,LOW);
    MOTOR1_1State = LOW;
    MOTOR1_2State = HIGH;
    MOTOR2_1State = HIGH;
    MOTOR2_2State = LOW;
  }
 
  if(x == 9)
  {
    //Mod 9, Para
    penultimo=BT_5;
    digitalWrite(LUZ_BRANCA_RE,LOW);
    digitalWrite(LUZ_SETA_DIREITA,LOW);
    digitalWrite(LUZ_SETA_ESQUERDA,LOW);
    MOTOR1_1State = LOW;
    MOTOR1_2State = LOW;
    MOTOR2_1State = LOW;
    MOTOR2_2State = LOW;
  }
 
  if(x == 10)
  {
    //Mod 10, Acende Farol
    FAROL_State=!FAROL_State;
    digitalWrite(LUZ_VERMELHA,FAROL_State);
    digitalWrite(LUZ_BRANCA_FRENTE,FAROL_State);
  }
 
  digitalWrite(MOTOR1_1, MOTOR1_1State);
  digitalWrite(MOTOR1_2, MOTOR1_2State);
  digitalWrite(MOTOR2_1, MOTOR2_1State);
  digitalWrite(MOTOR2_2, MOTOR2_2State);
}


16 comentários:

  1. Olá amigo, belo trabalho! estou querendo fazer um exatamente igual, mas o codigo não está compilando no IDE do Arduino... qual a versão do IDE você utilizou? tou usando a versão 1.0.5!

    Abraços!!

    ResponderExcluir
    Respostas
    1. A versão da IDE que eu utilizei foi a 1.0.2
      Você deve baixar e instalar a biblioteca IRremote.
      Eu baixei em: http://labduino.blogspot.com.br/2012/09/estava-testando-um-modulo-e-controle.html
      Baixei a versão para o arduino 1.0.1.
      Veja aí se isto resolve seu problema.

      Excluir
  2. na ide 1.0.5 da varios erro sabe como retirar

    ResponderExcluir
  3. ola amigo qual codigo vc usa para deixar o pulso do infravermelho continuo sem ficar oscilando aguardo

    ResponderExcluir
    Respostas
    1. int RECV_PIN = 8;
      IRrecv irrecv(RECV_PIN);
      decode_results results;
      if (irrecv.decode(&results))
      irrecv.resume();

      Não sei se foi exatamente isso que você perguntou.
      Se não foi, tente explicar melhor para que eu possa tentar te ajudar.

      Excluir
  4. Respostas
    1. Eu baixei em: http://labduino.blogspot.com.br/2012/09/estava-testando-um-modulo-e-controle.html
      Escolha a opção Biblioteca para IRremote para o Arduino 1.0.1

      Excluir
  5. Brother eu conseguiria me explicar de forma simples como vc fez a inversão de rotação dos motores utilizando a ponte H?

    ResponderExcluir
    Respostas
    1. Basta você trocar os valores dos bits.
      No meu caso, para o motor um funcionar, o pino 5 (enable motor 1) deve estar em 1.
      Já para inverter o sentido de rotação do motor, basta vc fazer combinações entre os pinos 2 e 3 do arduino (pinos de direção da ponte h): 1 e 0 vira pra um lado, 0 e 1 vira para o outro e 0 e 0 fica parado. Não coloque 1 e 1 pois pode danificar o componente.

      Excluir
  6. Este comentário foi removido pelo autor.

    ResponderExcluir
  7. amigão como eu faço pra ligar sem a ponte h.
    e que eu tenho ser com três pinos já.

    ResponderExcluir
    Respostas
    1. Não sei se entendi sua pergunta. Se você não utilizar uma ponte h, os motores só irão rotacionar para um lado. Uma forma de fazer isso é usando um transistor de potencia, pode ser um mosfet tipo n. Você deve ligar o dreno no motor, o source em gnd da bateria e o gate na porta do arduino. O outro terminal do motor você deve ligar direto em VCC da bateria.

      Excluir
  8. olá amigo é possível eu usar um infravermelho para um carrinho de 12v andar só em linha reta?

    ResponderExcluir
  9. Ola amigo, na função mod como voce atribui valores a x?

    ResponderExcluir