Bonjour,
Quelqu'un pourrait-il m'aider ?
Je réussis à commander mon robot arduino avec une télécommande IR : si j'appuie une fois sur 2 il avance en continu, si j'appuie sur 4 il tourne à gauche, etc...
Je souhaite qu'il s'arrête seul si l'un de ces deux capteurs IR de ce type détecte un obtacle :
J'ai donc ajouté des lignes de code (en rouge ci-dessous) au programme de départ qui fonctionne parfaitement.
/*
Pilotage Robot 2WD à partir d’une télécommande Infra-rouge
*/
#include <IRremote.h>
int broche_reception_ir = 8; // broche 8 utilisée
IRrecv reception_ir(broche_reception_ir); // crée une instance
decode_results decode_ir; // stockage données reçues
// définition des broches utilisées sur le shield contrôle moteur DRI0001
int direction_moteur_droite = 7;
int controle_moteur_droite = 6;
int direction_moteur_gauche = 4;
int controle_moteur_gauche = 5;
int capteurIR1 = 2;
int capteurIR2 = 3;
int Etat_capteurIR1;
int Etat_capteurIR2;
void moteur (int moteur_gauche, boolean sens_moteur_gauche, int moteur_droite, boolean sens_moteur_droite)
{
// définition sens moteur LOW avance, HIGH recule
digitalWrite(direction_moteur_gauche, sens_moteur_gauche);
analogWrite(controle_moteur_gauche, moteur_gauche);
digitalWrite(direction_moteur_droite, sens_moteur_droite);
analogWrite(controle_moteur_droite, moteur_droite);
}
void virage_90 (boolean sens)
{
// on va toujours garder une valeur PWM à 200
// et on va jouer sur la durée en ms pour effectuer le virage souhaité
// sens à HIGH pour gauche, LOW pour droite
digitalWrite(direction_moteur_gauche, sens);
digitalWrite(direction_moteur_droite, !sens);
analogWrite(controle_moteur_gauche, 200);
analogWrite(controle_moteur_droite, 200);
delay(480);
analogWrite(controle_moteur_gauche, 0);
analogWrite(controle_moteur_droite, 0);
}
void setup()
{
int i;
for (i=4;i<=7;i++)
pinMode(i, OUTPUT); //définit les port 4 à 7 en sortie
pinMode(capteurIR1, INPUT);
pinMode(capteurIR2, INPUT);
analogWrite(controle_moteur_gauche, 0); // arrêt moteur gauche
analogWrite(controle_moteur_droite, 0); // arrêt moteur droite
reception_ir.enableIRIn(); // démarre la réception
}
void loop()
{
Etat_capteurIR1 = digitalRead (capteurIR1);
Etat_capteurIR2 = digitalRead (capteurIR2);
if (Etat_capteurIR1 == LOW || Etat_capteurIR2 == LOW ) {
analogWrite(controle_moteur_gauche, 0);
analogWrite(controle_moteur_droite, 0);}
if (reception_ir.decode(&decode_ir))
{
if (decode_ir.value == 0x804E58A7)
{
// touche 1 –> Robot avance et tourne à gauche
moteur(250, HIGH, 150, HIGH);
}
else if (decode_ir.value == 0x804EF807)
{
// touche 2 –> Robot avance tout droit
moteur(150, HIGH, 150, HIGH);
}
else if (decode_ir.value == 0x804E1AE5)
{
// touche 3 –> Robot avance et tourne à droite
moteur(150, HIGH, 250, HIGH);
}
else if (decode_ir.value == 0x804E6897)
{
// touche 4 –> Robot tourne à gauche toute et avance
virage_90(HIGH);
moteur(150, HIGH, 150, HIGH);
}
else if (decode_ir.value == 0x804ED827)
{
// touche 5 –> Robot stop
moteur(0, HIGH, 0, HIGH);
}
else if (decode_ir.value == 0x804E2AD5)
{
// touche 6 –> Robot tourne à droite toute et avance
virage_90(LOW);
moteur(150, HIGH, 150, HIGH);
}
else if (decode_ir.value == 0x804E48B7)
{
// touche 7 –> Robot recule et tourne à gauche
moteur(250, LOW, 150, LOW);
}
else if (decode_ir.value == 0x804EE817)
{
// touche 8 –> Robot recule tout droit
moteur(150, LOW, 150, LOW);
}
else if (decode_ir.value == 0x804E0AF5)
{
// touche 9 –> Robot recule et tourne à droite
moteur(150, LOW, 250, LOW);
}
reception_ir.resume(); // reçoit le prochain code
delay (10);
}
}
Le robot réagit aux commandes mais de façon sporadique : il s'arrête tout de suite (sans obstacle devant les capteurs biensûr).
Je suis un peu perdu : j'ai essayé beaucoup de choses mais rien n'y fait.
Merci pour votre aide. Cdlt.