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();
}
}