Robot Arduino: Le code final

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 :D

Procurez-vous le robot ici:

Vérifiez vos branchements:

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