Go Down

Topic: Robô controle IR (Read 918 times) previous topic - next topic

lucaslimaduarte

Boa noite pessoal, fiz um codigo para um robô controlado por controle IR, bem o codigo "esta correto", o robô funciona mas com um detalhe,
Por exemplo, quando aperto o botão MODE do controle que faz o robô ir para frente ele vai indo ate eu apertar outro botão, ou seja a função fica ativa mesmo depois de soltar o botão MODE.

O que eu quero e não estou conseguindo fazer, é fazer com que o robô so obedeça o comando enquanto o botão esteja apertado, quando não houver nem um botão pressionado o robô fique parado.

o meu codigo é este:
Code: [Select]
#include <IRremote.h>

int motor1pin1 = 3;
int motor1pin2 = 4;
int motor2pin1 = 5;
int motor2pin2 = 6;
int led1 = 8;
int led2 = 9;
int receiver = A0;

IRrecv irrecv(receiver);
decode_results results;

void setup(){
  pinMode(motor1pin1, OUTPUT);
  pinMode(motor1pin2, OUTPUT);
  pinMode(motor2pin1, OUTPUT);
  pinMode(motor2pin2, OUTPUT);
  pinMode(led1, OUTPUT); 
  pinMode(led2, OUTPUT);
  pinMode(receiver, INPUT);
  Serial.begin(9600);
  irrecv.enableIRIn();
}

void loop(){
 
if (irrecv.decode(&results)){ 
switch(results.value){
   
            //CONTROLE
 
case 16736925:{ //  Mode
  digitalWrite(motor1pin1,HIGH);
  digitalWrite(motor1pin2,LOW);
  digitalWrite(motor2pin1,HIGH);
  digitalWrite(motor2pin2,LOW);
  Serial.println("IR - FRENTE");
   break;
}
case 16761405:{ //  >>/
  digitalWrite(motor1pin1,HIGH);
  digitalWrite(motor1pin2,LOW);
  digitalWrite(motor2pin1,LOW);
  digitalWrite(motor2pin2,HIGH);
  Serial.println(" GIRAR HORARIO ");
  break;
}
case 16720605:{ //      >//
  digitalWrite(motor1pin1,LOW);
  digitalWrite(motor1pin2,HIGH);
  digitalWrite(motor2pin1,HIGH);
  digitalWrite(motor2pin2,LOW);
  Serial.println("GIRAR ANTI-HORARIO");
  break;
}
case 16754775:{ //     VOL -
  digitalWrite(motor1pin1,LOW);
  digitalWrite(motor1pin2,HIGH);
  digitalWrite(motor2pin1,LOW);
  digitalWrite(motor2pin2,HIGH);
  Serial.println("IR - TRAS");
  break;
}
case 16712445:{ //     /<<
  digitalWrite(led1, HIGH);
  digitalWrite(led2, HIGH);
  Serial.println("LIGAR LEDs");
  break;
}
case 16753245:{ //   on/off
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  Serial.println("APAGAR LEDs");
  break;
  }

}
  delay(100);
  irrecv.resume();
  }
}


E aqui um vídeo do robô caso não tenha ficado claro o meu problema
http://www.youtube.com/watch?v=LgnrWxHKbeg&feature=youtu.be

mmoscz

Você deve colocar algum "contador" para desligar o acionamento do motor, após algumas interações do loop sem receber sinal do controle.

Code: [Select]

#include <IRremote.h>

int SemSinal = 0; // Controla quantas vezes rodou sem sinal
int motor1pin1 = 3;
int motor1pin2 = 4;
int motor2pin1 = 5;
int motor2pin2 = 6;
int led1 = 8;
int led2 = 9;
int receiver = A0;

IRrecv irrecv(receiver);
decode_results results;

void setup(){
  pinMode(motor1pin1, OUTPUT);
  pinMode(motor1pin2, OUTPUT);
  pinMode(motor2pin1, OUTPUT);
  pinMode(motor2pin2, OUTPUT);
  pinMode(led1, OUTPUT); 
  pinMode(led2, OUTPUT);
  pinMode(receiver, INPUT);
  Serial.begin(9600);
  irrecv.enableIRIn();
}

void loop(){
 
if (irrecv.decode(&results)){ 
SemSinal = 0;
switch(results.value){
   
            //CONTROLE
 
case 16736925:{ //  Mode
  digitalWrite(motor1pin1,HIGH);
  digitalWrite(motor1pin2,LOW);
  digitalWrite(motor2pin1,HIGH);
  digitalWrite(motor2pin2,LOW);
  Serial.println("IR - FRENTE");
   break;
}
case 16761405:{ //  >>/
  digitalWrite(motor1pin1,HIGH);
  digitalWrite(motor1pin2,LOW);
  digitalWrite(motor2pin1,LOW);
  digitalWrite(motor2pin2,HIGH);
  Serial.println(" GIRAR HORARIO ");
  break;
}
case 16720605:{ //      >//
  digitalWrite(motor1pin1,LOW);
  digitalWrite(motor1pin2,HIGH);
  digitalWrite(motor2pin1,HIGH);
  digitalWrite(motor2pin2,LOW);
  Serial.println("GIRAR ANTI-HORARIO");
  break;
}
case 16754775:{ //     VOL -
  digitalWrite(motor1pin1,LOW);
  digitalWrite(motor1pin2,HIGH);
  digitalWrite(motor2pin1,LOW);
  digitalWrite(motor2pin2,HIGH);
  Serial.println("IR - TRAS");
  break;
}
case 16712445:{ //     /<<
  digitalWrite(led1, HIGH);
  digitalWrite(led2, HIGH);
  Serial.println("LIGAR LEDs");
  break;
}
case 16753245:{ //   on/off
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  Serial.println("APAGAR LEDs");
  break;
  }

}
  delay(100);
  irrecv.resume();
  }
  SemSinal++;
  if (SemSinal == 100) // Se passou 100 vezes e não teve sinal, desliga os motores.
{
  digitalWrite(motor1pin1,LOW);
  digitalWrite(motor1pin2,LOW);
  digitalWrite(motor2pin1,LOW);
  digitalWrite(motor2pin2,LOW);
}

}
4x Duemilanove (clone)
Uno torrado (clone)
Amiga 1200 40MB
Windows XP

lucaslimaduarte

Obrigado mmoscz pela ajuda, mas ao testa vi que ainda não é exatamente o que eu quero, no seu codigo o robô so da um pulso assim que aperta o botão, eu quero que o robô execute a função enquanto o botão estiver pressionado, ou seja se eu segurar o botão que manda ele ir para frente ele vai enquanto eu segurar o botão e ao soltar o botão ele para.

Desculpe se não expliquei direito o que queria e obrigado novamente pela ajuda

mmoscz


Obrigado mmoscz pela ajuda, mas ao testa vi que ainda não é exatamente o que eu quero, no seu codigo o robô so da um pulso assim que aperta o botão, eu quero que o robô execute a função enquanto o botão estiver pressionado, ou seja se eu segurar o botão que manda ele ir para frente ele vai enquanto eu segurar o botão e ao soltar o botão ele para.

Desculpe se não expliquei direito o que queria e obrigado novamente pela ajuda


O exemplo que dei é bem simplificado, tipo, ir aumentando o valor do contador, pois ele está parando entre os intervalos que o controle remoto envia os comandos.
muda para unsigned long o tipo e coloca algo como 400000. e vai abaixando ou aumentando, até ter um valor que se adeque ao intervalo entre os pulsos e não fique acionado muito tempo após você ter desacionado o botão.
4x Duemilanove (clone)
Uno torrado (clone)
Amiga 1200 40MB
Windows XP

Go Up