Programme pour une télécommande infrarouge/récepteur infrarouge

Bonjour, je suis actuellement en 1ère S avec une option Sciences de l'ingénieur et d'ici le mois de mars, je dois passer mon oral de TPE avec le robot que moi et mon groupe avons élaboré pendant 9 séances de 4h.

Le robot consiste à transporter un objet tout en le pilotant grâce à une télécommande infrarouge qui envoie des radiations infrarouge sur le receveur infrarouge GROV branché à la broche "D5" d'une Base Shield V2 (superposé sur une carte Arduino Uno) pour le faire avancer. Quand le robot rencontre un obstacle (mur, objets, pieds...), il arrête d'avancer grâce au capteur ultrasons HC-SR04 branché aux broches d'une carte Motor Shield (superposé sur la Base Shield V2) : il faut donc appuyer sur un autre bouton de la télécommande pour le faire reculer.
Le code pour le fonctionnement du capteur ultrason fonctionne (le robot avance et arrive à détecter les obstacles) mais le problème est que je n'arrive pas à trouver un code pour la télécommande infrarouge qui fonctionne, j'en ai testé plein mais sans succès.

Donc, auriez-vous la possibilité de répondre à ces questions s'il vous plaît : Avez-vous des codes pour la télécommande à me proposer ?

Faut-il que je combine le code de la télécommande + celui du capteur ultrasons pour que le robot soit piloté et en même qu'il détecte les obstacles?

Merci d'avance

bonjour,

Donc, auriez-vous la possibilité de répondre à ces questions s'il vous plaît : Avez-vous des codes pour la télécommande à me proposer ?

Faut-il que je combine le code de la télécommande + celui du capteur ultrasons pour que le robot soit piloté et en même qu'il détecte les obstacles?

si tu mettais un code pour que l'on dise ce qui va ou pas.

oui, il faut combiner les deux pour tout piloter ensemble.

mais question bête, pourquoi appuyer sur un bouton pour faire reculer le robot?
il suffit de coder pour qu'il recule tout seul, tourne de X degrés et ravance, non?

Code du capteur ultrasons :

// définition des broches utilisées 
int trig = 4; // broche "Trig Input" du capteur connecté à la broche numérique 4 de l'Arduino Motor Shield
int echo = 2; // broche "Echo" du capteur connecté à la broche numérique 2 de l'Arduino Motor Shield
long lecture_echo; // déclare une varible de type long pour stocker la mesure de la durée de l'aller-retour des ultrasons
long cm; // déclare une variable de type long pour stocker le calcul de la distance entre le capteur et l'obstacle

void setup() // début de l'éxécution du programme
{ 
  pinMode(trig, OUTPUT); // broche numérique 4 avec le capteur en sortie : l'emetteur (T) ne se déclenche pas
  digitalWrite(trig, LOW); // n'envoie pas une série de 8 impulsions ultrasoniques : les ultrasons ne se propagent pas dans l'air
  pinMode(echo, INPUT); // broche numérique 2 avec le capteur en entrée : le récepteur (R) se déclenche mais n'éxécute pas l'ordre
  pinMode(9, OUTPUT); // déclare frein A (roue droite)
  pinMode(8, OUTPUT); // déclare frein B (roue gauche)
  pinMode(11, OUTPUT); // déclare direction B (roue gauche)
  pinMode(12, OUTPUT); // déclare direction A (roue droite)
}

void loop() // programme exécutée en boucle
{ 
  digitalWrite(trig, HIGH); // envoie une série de 8 impulsions ultrasoniques : l'emetteur (T) envoie des ultrasons dans l'air jusqu'à toucher un obstacle et se retournent vers le capteur
  delayMicroseconds(10); // impulsion sur "Trig Input" de 10µs
  digitalWrite(trig, LOW); // n'envoie plus une série de 8 impulsions ultrasoniques : le récepteur (R) reçoit les ultrasons et cloture la prise de mesure
  lecture_echo = pulseIn(echo, HIGH); // mesure la durée de l'aller-retour des ultrasons pendant le fonctionnement de la broche "Trig Input"
  cm = lecture_echo / 58; // calcul la distance de l'aller-retour des ultrasons pendant le fonctionnement de la broche "Trig Input"
 if (cm < 10) { // distance capteur-obstacle inférieur à 10 cm
   digitalWrite(12, HIGH); // direction roue droite ne fonctionne plus
  digitalWrite(9, HIGH); // roue droite s'arrête
  analogWrite(3, 200);
   digitalWrite(11, HIGH);
  digitalWrite(8, HIGH); // roue gauche s'arrête
  analogWrite(11, 200); //
   delay(500); // attendre 0,5 secondes pour éxécuter le programme
 }
 if (cm > 10) { // distance capteur-obstacle supérieur à 10 cm
   digitalWrite(12, LOW); // direction roue droite fonctionne
  digitalWrite(9, LOW); // roue droite avance
  analogWrite(3, 200);
   digitalWrite(11, LOW);
  digitalWrite(8, LOW); // roue gauche avance
  analogWrite(11, 200);
   delay(500); // attendre 0,5 secondes pour éxécuter le programme
 }
  
}

Tentative de code pour la télécommande infrarouge :

#include <IRremote.h>

int IR_RECV_PIN = 5;
int MOTOR_D_PIN = 3;
int MOTOR_G_PIN = 11;

IRrecv irrecv(IR_RECV_PIN);
decode_results results;

void setup() {
  irrecv.enableIRIn();

  pinMode(MOTOR_D_PIN, OUTPUT);
  pinMode(MOTOR_G_PIN, OUTPUT);
}  
void loop () {
  if (irrecv.decode(&results)) { 

    if(results.value == 0xFF02FD) {
      digitalWrite(MOTOR_D_PIN, HIGH);
      digitalWrite(MOTOR_G_PIN, HIGH); 

    }  else if (results.value == 0xFF9867) {
      digitalWrite(MOTOR_D_PIN, LOW); 
      digitalWrite(MOTOR_G_PIN, LOW); 
    }

    irrecv.resume();
  } 
}

Tentative de code pour la télécommande+capteur ultrason

#include <IRremote.h>                  // liste des codes telecommande
// définition des broches utilisées 
int IR_RECV_PIN = 5;
int trig = 4; // broche "Trig Input" du capteur connecté à la broche numérique 4 de l'Arduino Motor Shield
int echo = 2; // broche "Echo" du capteur connecté à la broche numérique 2 de l'Arduino Motor Shield
long lecture_echo; // déclare une varible de type long pour stocker la mesure de la durée de l'aller-retour des ultrasons
long cm; // déclare une variable de type long pour stocker le calcul de la distance entre le capteur et l'obstacle
int MOTOR_D_PIN = 3;
int MOTOR_G_PIN = 11;

IRrecv irrecv(IR_RECV_PIN);
decode_results results;



void setup()                           // début de l'éxécution du programme
{ 
  irrecv.enableIRIn();
  pinMode(trig, OUTPUT); // broche numérique 4 avec le capteur en sortie : l'emetteur (T) ne se déclenche pas
  digitalWrite(trig, LOW); // n'envoie pas une série de 8 impulsions ultrasoniques : les ultrasons ne se propagent pas dans l'air
  pinMode(echo, INPUT); // broche numérique 2 avec le capteur en entrée : le récepteur (R) se déclenche mais n'éxécute pas l'ordre
  pinMode(MOTOR_D_PIN, OUTPUT);
  pinMode(MOTOR_G_PIN, OUTPUT);
}


void loop()                            // programme exécutée en boucle
 {
        digitalWrite(trig, HIGH); // envoie une série de 8 impulsions ultrasoniques : l'emetteur (T) envoie des ultrasons dans l'air jusqu'à toucher un obstacle et se retournent vers le capteur
        delayMicroseconds(10); // impulsion sur "Trig Input" de 10µs
        digitalWrite(trig, LOW); // n'envoie plus une série de 8 impulsions ultrasoniques : le récepteur (R) reçoit les ultrasons et cloture la prise de mesure
        lecture_echo = pulseIn(echo, HIGH); // mesure la durée de l'aller-retour des ultrasons pendant le fonctionnement de la broche "Trig Input"
        cm = lecture_echo / 58; // calcul la distance de l'aller-retour des ultrasons pendant le fonctionnement de la broche "Trig Input"
           if (cm < 10) { // distance capteur-obstacle inférieur à 10 cm{
               if (irrecv.decode(&results)) {
                  if(results.value == 0xFF02FD){            
                    digitalWrite(MOTOR_D_PIN,LOW); 
                    digitalWrite(MOTOR_G_PIN,LOW ); 
 }
 }
            if (cm > 10) { // distance capteur-obstacle supérieur à 10 cm{
                 if (irrecv.decode(&results)) {
                   if(results.value == 0xFF02FD)
                    digitalWrite(MOTOR_D_PIN, HIGH);
                    digitalWrite(MOTOR_G_PIN, HIGH); 
 }
                 else if (results.value == 0xFF9867) {
                   digitalWrite(MOTOR_D_PIN, LOW); 
                   digitalWrite(MOTOR_G_PIN, LOW); 
  }      

 }
      irrecv.resume();
}
 }

En ce qui concerne de le faire reculer, je ne connais pas le code pour le faire tourner

chaque code fonctionne correctement?

Le 1er et le 2ème oui mais le 3ème non

pourquoi modifier autant ton code de départ?

 if (cm < 10) { // distance capteur-obstacle inférieur à 10 cm
   digitalWrite(12, HIGH); // direction roue droite ne fonctionne plus
  digitalWrite(9, HIGH); // roue droite s'arrête
  analogWrite(3, 200);
   digitalWrite(11, HIGH);
  digitalWrite(8, HIGH); // roue gauche s'arrête
  analogWrite(11, 200); //
   delay(500); // attendre 0,5 secondes pour éxécuter le programme
 }

pour remplacer par

         if (cm < 10) { // distance capteur-obstacle inférieur à 10 cm{
               if (irrecv.decode(&results)) {
                  if(results.value == 0xFF02FD){           
                    digitalWrite(MOTOR_D_PIN,LOW);
                    digitalWrite(MOTOR_G_PIN,LOW );
 }
 }

pas testé ni regardé le tout mais tu peux faire ca

 if (cm < 10) { // distance capteur-obstacle inférieur à 10 cm
   digitalWrite(12, HIGH); // direction roue droite ne fonctionne plus
  digitalWrite(9, HIGH); // roue droite s'arrête
  analogWrite(3, 200);
   digitalWrite(11, HIGH);
  digitalWrite(8, HIGH); // roue gauche s'arrête
  analogWrite(11, 200); //
   delay(500); // attendre 0,5 secondes pour éxécuter le programme
            if (irrecv.decode(&results)) {
               recule();
           }
 }

//après fin de loop
void recul()[
  if (irrecv.decode(&results)) {
                  if(results.value == 0xFF02FD){           
                    digitalWrite(MOTOR_D_PIN,LOW);
                    digitalWrite(MOTOR_G_PIN,LOW );
                   }

   }

}

mais tu es certain de ton truc?

   if(results.value == 0xFF02FD){           
                    digitalWrite(MOTOR_D_PIN,LOW);
                    digitalWrite(MOTOR_G_PIN,LOW );
 }
---
---------
            if (cm > 10) { // distance capteur-obstacle supérieur à 10 cm{
                 if (irrecv.decode(&results)) {
                   if(results.value == 0xFF02FD) /// MEME CODE QUE <10 cm
                    digitalWrite(MOTOR_D_PIN, HIGH);
                    digitalWrite(MOTOR_G_PIN, HIGH);
 }
                 else if (results.value == 0xFF9867) { /// MEME INSTRUCTION QUE <10 cm
                   digitalWrite(MOTOR_D_PIN, LOW);
                   digitalWrite(MOTOR_G_PIN, LOW);
  }

J'ai vérifié ton programme sur arduino et il me signal une erreur sur le code "IRrecv irrecv(IR_RECV_PIN);".
C'est étrange car j'ai testé sur l'ancien code et il me signal aucune erreur.