Go Down

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

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

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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy