Playlist de vidéos Arduino: https://www.youtube.com/playlist?list=PL5h7NsxkT9YNiPHjexrj3NEB4Hb8Mhouj
Bonjour! Dans cette vidéo nous allons terminer la programmation du robot multifonctions Arduino. J’espère que vous aimerez la vidéo 😀
Procurez-vous le robot ici:
Vérifiez vos branchements:
https://TommyDesrochers.com/review-kit-robot-multifonctions-pour-arduino/
Programme créé dans la vidéo:
#include <IRremote.h>
#include <Servo.h>
//DÉCLARATION DES VARIABLES EN LIEN AVEC LE CHOIX DU MODE --------------------------------------------------------------------------------------------------------- DÉCLARATION DES VARIABLES EN LIEN AVEC LE CHOIX DU MODE
int choixMode = 0;
int choixModeUltrason = 1;
int choixModeSuiveur = 2;
//DÉCLARATIONS EN LIEN AVEC LES MOTEURS --------------------------------------------------------------------------------------------------------------- DÉCLARATIONS EN LIEN AVEC LES MOTEURS
const int moteurGaucheA = 5;
const int moteurGaucheR = 6;
const int moteurDroitA = 11;
const int moteurDroitR = 10;
char valSerie;
//DÉCLARATIONS EN LIEN AVEC L'INFRAROUGE -------------------------------------------------------------------------------------------------------------- DÉCLARATIONS EN LIEN AVEC L'INFRAROUGE
const int irPin = 2; //Pin du récepteur IR
//Constantes associées aux boutons de la manette
const long irAvancer = 0x00FF629D;
const long irReculer = 0x00FF02FD;
const long irDroite = 0x00FFC23D;
const long irGauche = 0x00FF22DD;
const long irArreter = 0x00FFa25D;
const long irModeSuiveur = 0x00FF9867;
const long irModeUltrason = 0x00FFE21D;
IRrecv irrecv(irPin); //Objet recevant les signaux à décoder
decode_results irResultat; //Contient le résultat du décodage
//DÉCLARATIONS EN LIEN AVEC LE CAPTEUR DE DISTANCE ET LE SERVOMOTEUR -------------------------------------------------------------------------------- DÉCLARATIONS EN LIEN AVEC LE CAPTEUR DE DISTANCE ET LE SERVOMOTEUR
const int echoPin = 13;
const int triggerPin = 12;
int distanceAvant;
int distanceDroite;
int distanceGauche;
float intervalle;
Servo myservo; //Création de l'objet servo
const int delay_time = 250; //Temps accordé au servo pour la mesure de la distance de chaque côté
//DÉCLARATIONS EN LIEN AVEC LES CAPTEURS DE LUMINOSITÉ -------------------------------------------------------------------------------------------- DÉCLARATIONS EN LIEN AVEC LES CAPTEURS DE LUMINOSITÉ
const int capteurGauche = 7;
const int capteurCentre = 4;
const int capteurDroit = 3;
bool etatCapteurGauche;
bool etatCapteurCentre;
bool etatCapteurDroit;
//SETUP --------------------------------------------------------------------------------------------------------------------------------------------- SETUP
void setup()
{
//Initialisation de la communication série
Serial.begin(9600);
//Initialisation des broches des moteurs
pinMode(moteurGaucheA, OUTPUT);
pinMode(moteurGaucheR, OUTPUT);
pinMode(moteurDroitA, OUTPUT);
pinMode(moteurDroitR, OUTPUT);
digitalWrite(moteurGaucheA, LOW);
digitalWrite(moteurGaucheR, LOW);
digitalWrite(moteurDroitA, LOW);
digitalWrite(moteurDroitR, LOW);
//Initialisation du décodage infrarouge
irrecv.enableIRIn();
//Initialisation du capteur de distance et du servomoteur
pinMode(echoPin, INPUT);
pinMode(triggerPin, OUTPUT);
myservo.attach(9);
myservo.write(90);
//Initialisation des capteurs de couleur
pinMode(capteurGauche, INPUT);
pinMode(capteurCentre, INPUT);
pinMode(capteurDroit, INPUT);
}
//FONCTIONS POUR LES MOTEURS ------------------------------------------------------------------------------------------------------------------------ FONCTIONS POUR LES MOTEURS
void avancer()
{
digitalWrite(moteurGaucheA, HIGH);
digitalWrite(moteurGaucheR, LOW);
digitalWrite(moteurDroitA, HIGH);
digitalWrite(moteurDroitR, LOW);
}
void gauche()
{
digitalWrite(moteurGaucheA, LOW);
digitalWrite(moteurGaucheR, LOW);
digitalWrite(moteurDroitA, HIGH);
digitalWrite(moteurDroitR, LOW);
}
void droite()
{
digitalWrite(moteurGaucheA, HIGH);
digitalWrite(moteurGaucheR, LOW);
digitalWrite(moteurDroitA, LOW);
digitalWrite(moteurDroitR, LOW);
}
void reculer()
{
digitalWrite(moteurGaucheA, LOW);
digitalWrite(moteurGaucheR, HIGH);
digitalWrite(moteurDroitA, LOW);
digitalWrite(moteurDroitR, HIGH);
}
void arreter()
{
digitalWrite(moteurGaucheA, LOW);
digitalWrite(moteurGaucheR, LOW);
digitalWrite(moteurDroitA, LOW);
digitalWrite(moteurDroitR, LOW);
}
void pivoterGauche()
{
digitalWrite(moteurGaucheA, LOW);
digitalWrite(moteurGaucheR, HIGH);
digitalWrite(moteurDroitA, HIGH);
digitalWrite(moteurDroitR, LOW);
}
void pivoterDroite()
{
digitalWrite(moteurGaucheA, HIGH);
digitalWrite(moteurGaucheR, LOW);
digitalWrite(moteurDroitA, LOW);
digitalWrite(moteurDroitR, HIGH);
}
//FONCTIONS POUR LE MODE ULTRASON -------------------------------------------------------------------------------------------------------------- FONCTIONS POUR LE MODE ULTRASON
void mesurerDistanceAvant()
{
myservo.write(90);
delay(delay_time);
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH); //Envoie d'une onde sonore
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
intervalle = pulseIn(echoPin, HIGH); //Réception de l'écho
intervalle = intervalle/5.8/10; //Conversion de la différence de temps entre l'envoie de l'onde sonore et la réception de l'écho en distance (cm)
Serial.println("Distance avant:");
Serial.println(intervalle);
distanceAvant = intervalle; //Arrondissement de la distance
}
void mesurerDistanceGauche()
{
myservo.write(180);
delay(delay_time);
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH); //Envoie d'une onde sonore
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
intervalle = pulseIn(echoPin, HIGH); //Réception de l'écho
intervalle = intervalle/5.8/10; //Conversion de la différence de temps entre l'envoie de l'onde sonore et la réception de l'écho en distance (cm)
Serial.println("Distance gauche:");
Serial.println(intervalle);
distanceGauche = intervalle;
}
void mesurerDistanceDroite()
{
myservo.write(0);
delay(delay_time);
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH); //Envoie d'une onde sonore
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
intervalle = pulseIn(echoPin, HIGH); //Réception de l'écho
intervalle = intervalle/5.8/10; //Conversion de la différence de temps entre l'envoie de l'onde sonore et la réception de l'écho en distance (cm)
Serial.println("Distance droite:");
Serial.println(intervalle);
distanceDroite = intervalle;
}
void modeUltrason()
{
mesurerDistanceAvant();
if(distanceAvant < 25) //Si la distance avant est de moins de 25cm
{
arreter();
mesurerDistanceGauche();
delay(delay_time);
mesurerDistanceDroite();
delay(delay_time);
if(distanceGauche < 15 && distanceDroite < 15) //Si la distance à gauche et la distance à droite sont de moins de 15cm
{
reculer();
delay(500);
pivoterGauche();
delay(250);
}
else if(distanceGauche > distanceDroite) //Si la distance gauche est plus grande que la distance droite
{
pivoterGauche();
delay(250);
}
else if(distanceGauche <= distanceDroite) //Si la distance gauche est plus petite ou égale à la distance droite
{
pivoterDroite();
delay(250);
}
}
else //Si la distance avant est de plus de 25cm
{
avancer();
}
}
void commandeSerie()
{
if(Serial.available())
{
valSerie = Serial.read();
choixMode = 0;
if(valSerie == 'w')
avancer();
else if(valSerie == 'a')
gauche();
else if(valSerie == 's')
reculer();
else if(valSerie == 'd')
droite();
else if(valSerie == 'q')
arreter();
else if(valSerie == 'z')
pivoterGauche();
else if(valSerie == 'x')
pivoterDroite();
else if(valSerie == '1')
choixMode = choixModeUltrason;
else if(valSerie == '2')
choixMode = choixModeSuiveur;
}
}
void modeSuiveur()
{
etatCapteurGauche = digitalRead(capteurGauche);
etatCapteurCentre = digitalRead(capteurCentre);
etatCapteurDroit = digitalRead(capteurDroit);
if(etatCapteurCentre) //Si le capteur du centre détecte du noir
{
if ((etatCapteurGauche) && (!etatCapteurDroit)) //S'il y a du noir à gauche et du blanc à droite, tourner à gauche
gauche();
else if ((!etatCapteurGauche) && (etatCapteurDroit)) //S'il y a du blanc à gauche et du noir à droite, tourner à droite
droite();
else //Si les conditions plus haut ne s'appliquent pas, continuer tout droit
avancer();
}
else //Si le capteur du centre détecte du blanc
{
if ((etatCapteurGauche) && (!etatCapteurDroit)) //S'il y a du noir à gauche et du blanc à droite, tourner à gauche
gauche();
else if ((!etatCapteurGauche) && (etatCapteurDroit)) //S'il y a du blanc à gauche et du noir à droite, tourner à droite
droite();
else //Si les conditions plus hautdne s'appliquent pas, reculer
reculer();
}
}
void lireInfrarouge()
{
if (irrecv.decode(&irResultat)) //Réception d'un signal IR
{
irrecv.resume(); //Accepter les nouveaux résultats IR
if((irResultat.value < 0xFFF000) && (irResultat.value > 0xFF0000)) //Filtrage des mauvaises détections IR
{
choixMode = 0;
if (irResultat.value == irAvancer) //Avancer
avancer();
else if (irResultat.value == irReculer) //Reculer
reculer();
else if (irResultat.value == irDroite) //Tourner à droite
droite();
else if (irResultat.value == irGauche) //Tourner à gauche
gauche();
else if (irResultat.value == irArreter) //Arrêter
arreter();
else if(irResultat.value == irModeSuiveur)
choixMode = choixModeSuiveur;
else if(irResultat.value == irModeUltrason)
choixMode = choixModeUltrason;
irResultat.value = 0;
}
}
}
//BOUCLE --------------------------------------------------------------------------------------------------------------------------------------- BOUCLE
void loop()
{
commandeSerie();
lireInfrarouge();
if(choixMode == choixModeUltrason)
{
modeUltrason();
}
else if(choixMode == choixModeSuiveur)
{
modeSuiveur();
}
}
