Aller au contenu


Loïc Gengembre

Inscrit(e) (le) 01 oct. 2014
Déconnecté Dernière activité mai 28 2016 12:50
-----

Sujets que j'ai initiés

robot arduino télécommandé IR et détecteur d'obstacle

09 mars 2016 - 09:41

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 : 

 

SEN0019.jpg

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.


Salut les makers....

09 mars 2016 - 08:46

Bonjour à tous,

Je m'appelle Loïc et je m'intéresse à tout ce qui touche à la technologie en particulier l'électronique, la programmation, la robotique et la radio-électricité.

J'ai plaisir à découvrir des applications sur Arduino, Raspberry Pi2 et Picaxe.

Au plaisir...