Aller au contenu


Photo
- - - - -

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


7 réponses à ce sujet

#1 Loïc Gengembre

Loïc Gengembre

    Nouveau membre

  • Membres
  • 4 messages

Posté 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.



#2 Taupiot_Jr

Taupiot_Jr

    Habitué

  • Membres
  • PipPip
  • 232 messages
  • Gender:Male

Posté 09 mars 2016 - 11:15

Hello,

 

Une première piste serait de mesurer les données renvoyées par tes capteurs, peut-être qu'ils sont câblés faux ou quelque chose dans le genre.

Fournit nous le schéma électrique de ton montage, surtout la partie capteur.

 

Petite remarque en passant, pourquoi mets-tu toutes les init' dans la boucle?..

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
}

 

Je ne vois pas l'intérêt de définir 7 fois que le capteur est un input...

 

A plus!
~Taupiot_Jr



#3 ashira

ashira

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 333 messages
  • Gender:Male

Posté 09 mars 2016 - 11:26

Salut! Vu le code que tu as ajouté, tes capteurs ir envoient une info en tout ou rien c'est bien ca ? Essai de voir si des résistances de rappels règlent le problème.

#4 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 969 messages
  • Gender:Male
  • Location:Anglet

Posté 10 mars 2016 - 03:29

Salut, 

Ashira te donne peut être une bonne piste, après une rapide recherche la doc semble un peut contradictoire entre le schémas et la question 4 ici
Du coup il faudrait peut être ajouter une résistance de pull up ... 

Quoi qu'il en soit avant d'ajouter tes capteurs dans ton code je te suggère de vérifier leur fonctionnement avec le code suivant : 

const int IR1= 2;//Connect the signal pin to the digital pin 2
const int IR2= 3;//Connect the signal pin to the digital pin 3
const int Led = 13;
 
void setup()
{
  Serial.begin(9600);
  Serial.println("Start!");  
  pinMode(IR1,INPUT);
  pinMode(IR2,INPUT);
  pinMode(Led,OUTPUT);
  digitalWrite(Led,LOW);
}
 
void loop()
{
  if((digitalRead(IR1) == LOW)|(digitalRead(IR2) == LOW))  digitalWrite(Led,HIGH);
  else  digitalWrite(Led,LOW);
  Serial.print("Infrared Switch 1 Status:");
  Serial.println(digitalRead(IR1),BIN);
  Serial.print("Infrared Switch 2 Status:");
  Serial.println(digitalRead(IR2),BIN);
  delay(50);
}

Et dit nous comment cela se comporte, voir fait une vidéo. 

Une fois que tu auras tes deux codes " fonctionnels" séparément, on pourra les "mixer " sans problème. Mais avant de le mixer il faut s'assurer qu'indépendamment il fonctionnent sinon si le mixage ne fonctionne pas, comment savoir si cela provient : 
a) Du mixage qui est mal fait ?
b ) Du  code pour les capteurs qui ne fonctionne pas pour avoir les info des capteurs ? 
c) Du câblage du capteur qui est mal fait

d) Du capteur qui est HS ? 

 

Si le code si dessus marche alors la réponse est a) si ça ne marche pas il va falloire que tu fasses d'avantage de tests pour déterminer si ça vient de b ) c) ou d). 
 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#5 Loïc Gengembre

Loïc Gengembre

    Nouveau membre

  • Membres
  • 4 messages

Posté 10 mars 2016 - 07:36

Bonsoir tout le monde et merci pour vos réponses...

Alors , je viens de tester le programme ci-dessus et il fonctionne correctement :

j'ai bien un statut 0 affiché sur le moniteur quand le capteur est sollicité (les 2 fonctionnent) et la led s'allume.

Par ailleurs, le programme de la télécommande (c'est à dire sans les parties en rouge dans le code de mon premier message) fonctionne aussi parfaitement.

Donc il semble que le mixage des deux soit mal fait :help: si quelqu'un a une idée ?!?



#6 ashira

ashira

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 333 messages
  • Gender:Male

Posté 10 mars 2016 - 08:31

On dirait bien. Truc bête, mais essai "0" à la place de "LOW", car par rapport au programme fourni par Mike118 et qui fonctionne, tu passes par une variable intermédiaire.



#7 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 969 messages
  • Gender:Male
  • Location:Anglet

Posté 11 mars 2016 - 07:48

Ma méthode pour mixer deux codes 

 

1)    On copie les définitions des variables et des includes ( = l’ensemble de ce qu’il y a en «  pré setup »  en vérifiant qu'il y a pas de conflits ni doublon ( on effectue les modifications si nécessaire ( attention il peut parfois y avoir des conflits entres les librairies incluse) puis on compile, normalement ça devrait compiler sans problème

2)    On copie l’ensemble des « fonctions » qu’on a écrites ( différent de loop et setup ) ,  on vérifie qu’il n’y a ni conflit ni doublon ( on effectue les modifications si nécessaire puis on compile, normalement ça devrait compiler sans problème

3)    On copie le contenu des deux setup à la suite et on vérifie qu’il n’y a ni conflit ni doublon ( on effectue les modifications si nécessaire puis on compile, normalement ça devrait compiler sans problème

4)    On ajoute directement le code le plus long dans le loop et on vérifie qu’il fonctionne toujours comme attendu.

5)    On ajoute dans la loop les bouts de code du code le plus court afin d’avoir le mélange souhaité en testant à chaque fois ce qu'il se passe.

#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;


const int IR1= 2;//Connect the signal pin to the digital pin 2
const int IR2= 3;//Connect the signal pin to the digital pin 3
const int Led = 13;


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()
{
  Serial.begin(9600);
  Serial.println("Start!");
  pinMode(IR1,INPUT);
  pinMode(IR2,INPUT);
  pinMode(Led,OUTPUT);
  digitalWrite(Led,LOW);
    int i =0;
    for (i=4;i<=7;i++)    // la boucle for peut être remplacée par :   "  DDRD=B11110010; // Met les pins 4 à 7 en sortie + TX en sortie " 
    {
       pinMode(i, OUTPUT); //définit les port 4 à 7 en sortie
    }
    
   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()
{
Serial.print("Infrared Switch 1 Status:");
Serial.println(digitalRead(IR1),BIN);
Serial.print("Infrared Switch 2 Status:");
Serial.println(digitalRead(IR2),BIN);

if((digitalRead(IR1) == LOW)|(digitalRead(IR2) == LOW))
{
digitalWrite(Led,HIGH);
analogWrite(controle_moteur_gauche, 0);
  analogWrite(controle_moteur_droite, 0);
}
  else // si absence d'obstacle
{
digitalWrite(Led,LOW);
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

  } // fin du if reception ordre IR
   
 } // fin du else absence d'obstacle

 delay (10); // qu'on detecte ou pas un obstacle délais de 10.
}

 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#8 Loïc Gengembre

Loïc Gengembre

    Nouveau membre

  • Membres
  • 4 messages

Posté 14 mars 2016 - 06:18

Bonjour à tous,

En déplacement ce week-end, je n'ai pas pu essayer ce code....c'est donc chose faite ce soir et il fonctionne à merveille : un grand merci donc à toi mike118...c'est la bonne nouvelle qui fait plaisir après le boulot

Je note ta méthode pour compiler deux codes qui risque de m'être bien utile à l'avenir





Répondre à ce sujet



  


0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users