Problème de gestion des priorités capteur IR

Bonjour,

Nous réalisons un robot qui doit suivre une ligne noir à l'aide de capteur infrarouge.
Il se déplace à l'aide de 2 moteurs et pont en H et réalise des allés et venues sur la ligne.
Le robot doit aussi détecter des pastilles de couleur et s'arrêter pour communiquer des informations.
Il doit analyser les informations d'un capteur ultrason et analyser la distance.
Enfin, un système de microrupteur et d'arrêt d'urgence positionnné le long du robot permet d'arrêter les moteurs en cas de contact. Afin de réaliser le système d'arrêt des moteurs, et de demander le redémarrage par l'utilisateur, nous disposons de 3 relais automobile et d'un relais de réarmement.

L'ensemble des capteurs sont commandés par une carte arduino mega et la communication avec l'utilisateur s'éffectue via un écran et raspberry.

Nous avons réalisé l'ensemble du cablage et il est fonctionnel. Nous avons testé chaque fonctionnalité séparémment et elles sont fonctionnelles.

Le code d'ensemble ne fonctionne pas. Je pense que cela est dû à un problème de gestion des priorités et des interruptions mais les capteurs sont analogiques nous empêchant d'utiliser des interruptions par front montant.

En effet, avec le code d'ensemble le robot ne parvient plus à suivre la ligne il dérive sur la droite.

Avez-vous une idée de solution ?

Voici le code réalisé :


int IR1Pin = A3;  // Infrarouge droit sens marche
int IR2Pin = A2;  // Infrarouge gauche sens marche
bool CoteGauche = false;
bool CoteDroit = false;

int INAMoteur1 = 24;  //Définir le pin INA du moteur 1 Droit sens de la marche
int INBMoteur1 = 26;  //Définir le pin INB du moteur 1 Droit sens de la marche
int PWMMoteur1 = 2;   //Définir le pin PWM du moteur 1 Droit sens de la marche
int VHMoteur1 = 200;  //Définir une variable de vitesse haute du moteur 1
int VBMoteur1 = 40;   //Définir une variable de vitesse basse du moteur 1

int INAMoteur2 = 27;  //Définir le pin INA du moteur 2 Gauche sens de la marche
int INBMoteur2 = 25;  //Définir le pin INB du moteur 2 Gauche sens de la marche
int PWMMoteur2 = 3;   //Définir le pin PWM du moteur 2 Gauche sens de la marche
int VHMoteur2 = 130;  //Définir une variable de vitesse haute du moteur 2
int VBMoteur2 = 45;   //Définir une variable de vitesse basse du moteur 2

#define S0Couleur 4   //Associer le pin S0 au pin 4 du capteur couleur
#define S1Couleur 5   //Associer le pin S1 au pin 5 du capteur couleur
#define S2Couleur 6   //Associer le pin S2 au pin 6 du capteur couleur
#define S3Couleur 7   //Associer le pin S3 au pin 7 du capteur couleur
#define OUTCouleur 8  //Associer le pin OUT au pin 8 du capteur couleur

int ToleranceCouleur = 50;  //Définir un seuil de tolérance permettant d'analyser la couleur

byte rougeCouleur = 0;  //Création de variables pour le rouge et initialisation à 0
byte vertCouleur = 0;   //Création de variables pour le vert et initialisation à 0
byte bleuCouleur = 0;   //Création de variables pour le bleu et initialisation à 0

int RougeCouleur1 = 150;  //Définir le rouge de la couleur 1
int BleuCouleur1 = 55;    //Définir le bleu de la couleur 1
int VertCouleur1 = 94;    //Définir le vert de la couleur 1

int RougeCouleur2 = 40;  //Définir le rouge de la couleur 2
int BleuCouleur2 = 69;   //Définir le bleu de la couleur 2
int VertCouleur2 = 39;   //Définir le vert de la couleur 2

int RougeCouleur3 = 34;  //Définir le rouge de la couleur 3
int BleuCouleur3 = 99;   //Définir le bleu de la couleur 3
int VertCouleur3 = 135;  //Définir le vert de la couleur 3

int RougeCouleur4 = 26;  //Définir le rouge de la couleur 4
int BleuCouleur4 = 64;   //Définir le bleu de la couleur 4
int VertCouleur4 = 38;   //Définir le vert de la couleur 4

int Incrementation1 = 0;
int Incrementation2 = 0;
int Incrementation3 = 0;
int Incrementation4 = 0;
int Incrementation5 = 0;

int IRUltrason = 0;

int TrigPinUltrason = 10;  //Définition du pin d'émition du capteur ultrason
int EchoPinUltrason = 9;   //Définiton du pin de réception du capteur ultrason
int DistanceUltrason = 0;
int DureeUltrason = 0;

int servoPin = 13;  //Affectuation du pin au servomoteur
#include "Servo.h"  //Ajout de la librairie pour controler le servomoteur
Servo servo;        //Déclaration du nom du servomoteur

int ARU = 12;  //Pin d'analyse de l'arrêt d'urgence

int Rearmement = 11;  //Pin de réarmement du système de relais^

int Redemarrage = 0;
int Debut = 0;
int ChoixCouleur = 0;

String Couleur = "";
String ArretUrgence = "";

void setup() {
  Serial.begin(9600);  // démarrer la communication série à 9600 bauds

  pinMode(IR1Pin, INPUT);  // définir le pin du capteur en entrée IR1
  pinMode(IR2Pin, INPUT);  // définir le pin du capteur en entrée IR2

  pinMode(INAMoteur1, OUTPUT);  //Définir le pin INA du moteur 1 en sortie
  pinMode(INBMoteur1, OUTPUT);  //Définir le pin INB du moteur 1 en sortie
  pinMode(PWMMoteur1, OUTPUT);  //Définir le pin PWM du moteur 1 en sortie

  pinMode(INAMoteur2, OUTPUT);  //Définir le pin INA du moteur 1 en sortie
  pinMode(INBMoteur2, OUTPUT);  //Définir le pin INB du moteur 1 en sortie
  pinMode(PWMMoteur2, OUTPUT);  //Définir le pin PWM du moteur 1 en sortie

  pinMode(S0Couleur, OUTPUT);  //Mise de S0 en Sortie
  pinMode(S1Couleur, OUTPUT);  //Mise de S1 en Sortie
  pinMode(S2Couleur, OUTPUT);  //Mise de S2 en Sortie
  pinMode(S3Couleur, OUTPUT);  //Mise de S3 en Sortie
  pinMode(OUTCouleur, INPUT);  //Mise de OUT en Entrée

  digitalWrite(S0Couleur, HIGH);  //Allumage de S0 pour la fréquence
  digitalWrite(S1Couleur, LOW);   //Couper S1 pour la fréquence

  pinMode(TrigPinUltrason, OUTPUT);  //Déclaration du trig en Sortie
  pinMode(EchoPinUltrason, INPUT);   //Déclaration du echo en Entrée

  servo.attach(servoPin);  //Association du pin du servomoteur à la librairie du servomoteur

  pinMode(ARU, INPUT);  //Déclaration du pin d'ARU en entée analyse de l'ARU

  pinMode(Rearmement, OUTPUT);  //Déclaration du pin de réarmement en sortie
}

void loop() {
  if (analogRead(IR1Pin) > 270) {  //Analyse du capteur IR1
    digitalWrite(INAMoteur2, LOW);
    digitalWrite(INBMoteur2, HIGH);
    digitalWrite(INAMoteur1, LOW);
    digitalWrite(INBMoteur1, HIGH);
    analogWrite(PWMMoteur2, 130);  //Gauche = 2
    analogWrite(PWMMoteur1, 60);
  }
  if (analogRead(IR2Pin) > 250) {  //Analyse du capteur IR2
    digitalWrite(INAMoteur1, LOW);
    digitalWrite(INBMoteur1, HIGH);
    digitalWrite(INAMoteur2, LOW);
    digitalWrite(INBMoteur2, HIGH);
    analogWrite(PWMMoteur1, 200);
    analogWrite(PWMMoteur2, 45);
  }
  lecture();
  //ultrason(); //Lancement du calcul de la distance ultrason
  //couleur(); //Boucle pour capteur de couleur
  //servomoteur(); //Boucle pour servomoteur

  while (digitalRead(ARU) == LOW) {  //Tant que l'ARU est appuyé ou moustache enclenchée
    lecture();
    Serial.println("ARU");
    if (Redemarrage == 1) {            // SI le caractère R est reçu
      digitalWrite(Rearmement, HIGH);  // Allumer le réarmement
      delay(10);                       // Attendre 0.01s
    }
  }

  if (digitalRead(ARU) == HIGH) {   //Si le robot est reparti
    digitalWrite(Rearmement, LOW);  //Enlever le relais de réarmement
  }

  if (DistanceUltrason < 65) {  //Si la distance est au dessus de 80cm
    moteur(0, 0, 0, 0, 0, 0);   //Arrêter les moteurs
    IRUltrason = 1;
  } else {
    IRUltrason = 0;
  }

  if (DistanceUltrason < 100) {  //Si ultrason détecte 100cm
    VHMoteur1 = 200;             //Réduire vitesse haute moteur 1
    VBMoteur1 = 60;              //Réduire vitesse basse moteur 1
    VHMoteur2 = 140;             //Réduire vitesse haute moteur 2
    VBMoteur2 = 45;              //Réduire vitesse basse moteur 2
  } else {
    VHMoteur1 = 200;  //Remettre la vitesse haute moteur1
    VBMoteur1 = 30;   //Remettre la vitesse basse moteur1
    VHMoteur2 = 60;   //Remettre la vitesse haute moteur1
    VBMoteur2 = 25;   //Remettre la vitesse basse moteur1
  }

  while (abs(rougeCouleur - RougeCouleur1) <= ToleranceCouleur && abs(bleuCouleur - BleuCouleur1) <= ToleranceCouleur && abs(vertCouleur - VertCouleur1) <= ToleranceCouleur && Incrementation1 == 0) {  //Comparaison de la couleur analysées avec la couleur 1
    moteur(0, 0, 0, 0, 0, 0);                                                                                                                                                                            //Arrêter les moteurs
    Couleur = "Bleu";
    //lecture();
    if (Redemarrage == 1) {
      Incrementation1 = 1;
    }
  }
  while (abs(rougeCouleur - RougeCouleur2) <= ToleranceCouleur && abs(bleuCouleur - BleuCouleur2) <= ToleranceCouleur && abs(vertCouleur - VertCouleur2) <= ToleranceCouleur && Incrementation2 == 0) {  //Comparaison de la couleur analysées avec la couleur 1
    moteur(0, 0, 0, 0, 0, 0);                                                                                                                                                                            //Arrêter les moteurs
    Couleur = "Vert";
    //lecture();
    if (Redemarrage == 1) {
      Incrementation2 = 1;
    }
  }
  while (abs(rougeCouleur - RougeCouleur3) <= ToleranceCouleur && abs(bleuCouleur - BleuCouleur3) <= ToleranceCouleur && abs(vertCouleur - VertCouleur3) <= ToleranceCouleur && Incrementation3 == 0) {  //Comparaison de la couleur analysées avec la couleur 1
    moteur(0, 0, 0, 0, 0, 0);                                                                                                                                                                            //Arrêter les moteurs
    Couleur = "Rouge";
    //lecture();
    if (Redemarrage == 1) {
      Incrementation3 = 1;
    }
  }
  while (abs(rougeCouleur - RougeCouleur4) <= ToleranceCouleur && abs(bleuCouleur - BleuCouleur4) <= ToleranceCouleur && abs(vertCouleur - VertCouleur4) <= ToleranceCouleur && Incrementation4 == 0) {  //Comparaison de la couleur analysées avec la couleur 1
    moteur(0, 0, 0, 0, 0, 0);                                                                                                                                                                            //Arrêter les moteurs
    Couleur = "Jaune";
    lecture();
    if (Redemarrage == 1) {
      Incrementation4 = 1;
    }
  }
}

void ultrason() {                      //Boucle de calcul de distance ultrason
  digitalWrite(TrigPinUltrason, LOW);  //On coupe trig
  delayMicroseconds(2);                //Attend 2 microsecondes

  digitalWrite(TrigPinUltrason, HIGH);  //Activation de trig
  delayMicroseconds(10);                //Attend 10 microsecondes
  digitalWrite(TrigPinUltrason, LOW);   //Fin du signal de trig

  DureeUltrason = pulseIn(EchoPinUltrason, HIGH);  //Calcul du temps mis à la récépetion du signal par echo
  DistanceUltrason = DureeUltrason * 0.0343 / 2;   //Convertion du temps pour trouver la distance
}

void moteur(int INA1, int INB1, int PWM1, int INA2, int INB2, int PWM2) {  //Boucle de déclenchement des moteurs
  analogWrite(INAMoteur1, INA1);                                           //Sens de rotation moteur 1
  analogWrite(INBMoteur1, INB1);                                           //Sens de rotation moteur 1
  analogWrite(INAMoteur2, INA2);                                           //Sens de rotation moteur 2
  analogWrite(INBMoteur2, INB2);                                           //Sens de rotation moteur 2
  analogWrite(PWMMoteur1, PWM1);                                           //Vitesse de rotation moteur 1
  analogWrite(PWMMoteur2, PWM2);                                           //Vitesse de rotation moteur 2
}

void servomoteur() {
  if (Debut == 1) {  // SI le caractère R est reçu
    servo.write(0);
  }
  if (Debut == 2) {
    servo.write(90);
  }
}

void couleur() {
  digitalWrite(S2Couleur, LOW);             //Arrêter S2
  digitalWrite(S3Couleur, LOW);             //Arrêter S3
  delay(100);                               //Attendre 0.1s
  rougeCouleur = pulseIn(OUTCouleur, LOW);  //analyse du signal reçu de couleur rouge
  digitalWrite(S3Couleur, HIGH);            //On initialise S3 pour analyser le bleu
  delay(100);                               //Attendre 0.1s
  bleuCouleur = pulseIn(OUTCouleur, LOW);   //analyse du signal reçu de couleur bleue
  digitalWrite(S2Couleur, HIGH);            //On inintialise S2 en plus de S3 pour analyser le vert
  delay(100);                               //Attendre 0.1s
  vertCouleur = pulseIn(OUTCouleur, LOW);   //analyse du signal reçu de couleur verte
}

void lecture() {
  if (Serial.available() > 0) {
    Redemarrage = Serial.parseInt();
    Debut = Serial.parseInt();
    ChoixCouleur = Serial.parseInt();
  }
}

:warning:

Post mis dans la mauvaise section, on parle anglais dans les forums généraux. ➜ je l’ai déplacé vers le forum francophone pour vous pour cette fois...

Merci de prendre en compte les recommandations listées dans « Les bonnes pratiques du Forum Francophone” à commencer par l’usage des balises de code…

Merci d’éditer votre post en utilisant le :pencil2: dans la barre d’outil juste sous votre post et rajoutez les balises de de code (c’est difficilement lisible tel quel) :

  • sélectionner la partie du texte qui correspond au code
  • appuyez sur l’icône <code/> dans la barre d’outils pour indiquer que c’est du code

(Assurez vous aussi d’indenter le code correctement dans l’IDE avant de le copier pour le coller ici. Cela se fait en pressant ctrlT sur PC ou cmdT sur un Mac)

Bonjour,

Merci pour votre réponse, j'ai réalisé les changements nécessaires.

Si vous avez des remarques, conseils ou solutions je reste à votre disposition !!

Je pense que là, il y a un petit problème

Si DistanceUltrason est inférieure à 65, tu satisfais les conditions des 2 tests donc tu arrêtes les moteurs puis tu les mets au ralenti.
Au passage, le commentaire du premier test ne reflète pas la réalité du test

Bonjour,

Merci pour votre réponse. En effet il y a une erreur mais nous avons essayé de mettre le code de l'infrarouge avec chaque bloque (ultrason, aru, couleur) et aucun ne marche, le problème n'est donc pas lié à l'ultrason.

Voyez-vous un autre problème ?

Bonne fin de journée

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.