Review | Kit robot multifonctions pour Arduino (60€/100$)

Vous pouvez vous le procurer ici:

Bonjour ! Dans cette vidéo je vous présente un robot multifonctions pour Arduino à assembler et programmer soi-même. Il répond aux commandes par infrarouge et bluetooth en plus d'avoir un mode autonome avec capteur d'obstacle à ultrason et un mode suiveur de ligne. Vous pouvez bien sûr le modifier à votre guise et ajouter encore plus de capteurs et d'actionneurs pour le rendre unique :D Plus d'informations seront disponible sur mon site web (le lien est au début de la description). J'espère que vous aimerez la vidéo !

Musique:
Joakim Karud - I'll be there
http://youtube.com/joakimkarud

Images pour vous aider à monter le robot:

Branchements des différentes pièces du robot:

  • Capteur ultrason

    • Vcc = 5V sur l'Arduino
    • Trig = pin pin 12 du Arduino
    • Echo = pin 13 du Arduino
    • Gnd = Gnd sur l'Arduino
  • Capteur infrarouge

    • Vcc = 5V sur l'Arduino
    • Gnd = Gnd sur l'Arduino
    • S = pin 2 de l'Arduino
  • Bluetooth

    • Vcc = 5V sur l'Arduino
    • RX = pin 1 (TX) de l'Arduino
    • TX = pin 0 (RX) de l'Arduino
    • Gnd = Gnd de l'Arduino
  • Capteur de couleur gauche

    • Vcc = 5V sur l'Arduino
    • Out = pin 7 de l'Arduino
    • Gnd = Gnd sur l'Arduino
  • Capteur de couleur du milieu

    • Vcc = 5V sur l'Arduino
    • Out = pin 4 de l'Arduino
    • Gnd = Gnd sur l'Arduino
  • Capteur de couleur droit

    • Vcc = 5V sur l'Arduino
    • Out = pin 3 de l'Arduino
    • Gnd = Gnd sur l'Arduino
  • Drive de moteur L298N

    • ENA = 5V sur l'Arduino
    • ENB = 5V sur l'Arduino
    • IN1 = pin 5 de l'Arduino
    • IN2 = pin 6 de l'Arduino
    • IN3 = pin 10 de l'Arduino
    • IN4 = pin 11 de l'Arduino
    • Connecteur à vis MOTORA = Placez la carte de façon à lire le nom des connecteurs à l'endroit et branchez les deux fils rouge des moteurs gauche du côté droit du connecteur et les deux fils noirs du côté gauche.
    • Connecteur à vis MOTORB = Placez la carte de façon à lire le nom des connecteurs à l'endroit et branchez les deux fils rouge des moteurs droit du côté droit du connecteur et les deux fils noirs du côté gauche.
    • Connecteur à vis VMS = fil dénudé rouge du socle pour batteries
    • Connecteur à vis Gnd = fil dénudé noir du socle pour batteries
    • On ne connecte rien sur les pins 5V de la drive de moteur
  • Socle pour batteries

    • Connecteur = se branche dans le connecteur correspondant sur l'Arduino

Programme complet du robot:

/*
* Code originalement trouvé sur le site http://www.Banggood.com
* Adapté par https://www.TD72PRO.com
*
* Description des modifications apportées au code:
* - Seuls les commentaires en anglais ont été concervés. Ceux-ci ont aussi été mieux traduits et corrigés.
* - Certains éléments logiques ont été modifiés.
* - Les lignes doublées ont été supprimées.
* - Correction de la syntaxe.
* - La structure du code n'a pas changée (fonctions, conditions, déclarations...).
*
* Améliorations possibles:
* - Améliorer les conditions (switch au lieu de plusieurs if).
* - Optimiser les fonctions (certains éléments sont répétitifs).
* - Supprimer les println() qui ne sont plus nécessaires au débogage du code.
*/

#include <IRremote.h>
#include <Servo.h>

//*********************** Definition of motor pins ********************* ****
int MotorLeft1 = 6;
int MotorLeft2 = 5;
int MotorRight1 = 11;
int MotorRight2 = 10;
int counter = 0;
const int irReceiverPin = 2; //IR receiver connected to pin 2
char val;

//*********************** Set to detect the IRcodes ****************** *******
long IRfront = 0x00FF629D; //Forward
long IRback = 0x00FF02FD; //Reverse
long IRturnright = 0x00FFC23D; //Right
long IRturnleft = 0x00FF22DD; //Left
long IRstop = 0x00FFa25D; //Stop
long IRcny70 = 0x00FF9867; //Line following
long IRAutorun = 0x00FFE21D; //Self-propelled mode ultrasound
long IRturnsmallleft = 0x00FF22DD;

//************************* Defined CNY70 pins ******************* *****************
const int SensorLeft = 7; //Left sensor input pin
const int SensorMiddle = 4; //Middle sensor input pin
const int SensorRight = 3; //Right sensor input pin
int SL; //Left sensor status
int SM; //Middle sensor status
int SR; //Right sensor status
IRrecv irrecv(irReceiverPin); //Define an object to receive infrared signals IRrecv
decode_results results; //Decoding results will result in structural variables in decode_results

//************************* Defined ultrasound pins ****************** ************
int inputPin = 13 ; //Echo pin
int outputPin = 12; //Trig pin
int Fspeedd = 0; //Distance in front
int Rspeedd = 0; //Distance right
int Lspeedd = 0; //Distance left
int directionn = 0; //Forward = 8, Rear = 2, Left = 4, Right = 6
Servo myservo; //Set myservo
int delay_time = 250; //Settling time after steering servo motors
int Fgo = 8; //Forward
int Rgo = 6; //Turn right
int Lgo = 4; //Turn left
int Bgo = 2; //Reverse

//************************ Setup **************************************************
void setup()
{
  Serial.begin(9600);
  pinMode(MotorRight1, OUTPUT); //Pin 8 (PWM)
  pinMode(MotorRight2, OUTPUT); //Pin 9 (PWM)
  pinMode(MotorLeft1, OUTPUT);  //Pin 10 (PWM)
  pinMode(MotorLeft2, OUTPUT);  //Pin 11 (PWM)
  irrecv.enableIRIn(); //Start infrared decoding
  pinMode(SensorLeft, INPUT); //Define left Sensors
  pinMode(SensorMiddle, INPUT); //Define middle sensors
  pinMode(SensorRight, INPUT); //Define right sensor
  digitalWrite(2, HIGH);
  pinMode(inputPin, INPUT); //Define ultrasound echo pin
  pinMode(outputPin, OUTPUT); //Define ultrasonic trig pin
  myservo.attach(9); //Define servo motor output pin (PWM)
}

//************************************ (Void)*************************************
void advance(int a) //Go Forward
{
  digitalWrite(MotorLeft1,LOW);
  digitalWrite(MotorLeft2,HIGH);
  digitalWrite(MotorRight1,HIGH);
  digitalWrite(MotorRight2,LOW);
  delay(a * 100);
}

void right(int b) //Turn right
{
  digitalWrite(MotorLeft1,LOW);
  digitalWrite(MotorLeft2,HIGH);
  digitalWrite(MotorRight1,LOW);
  digitalWrite(MotorRight2,LOW);
  delay(b * 100);
}

void left(int c) //Turn left
{
  digitalWrite(MotorLeft1,LOW);
  digitalWrite(MotorLeft2,LOW);
  digitalWrite(MotorRight1,HIGH);
  digitalWrite(MotorRight2,LOW);
  delay(c * 100);
}

void turnR(int d) //Pivot right
{
  digitalWrite(MotorLeft1,LOW);
  digitalWrite(MotorLeft2,HIGH);
  digitalWrite(MotorRight1,LOW);
  digitalWrite(MotorRight2,HIGH);
  delay(d * 100);
}

void turnL(int e) //Pivot left
{
  digitalWrite(MotorLeft1,HIGH);
  digitalWrite(MotorLeft2,LOW);
  digitalWrite(MotorRight1,HIGH);
  digitalWrite(MotorRight2,LOW);
  delay(e * 100);
}

void stopp(int f) //Stop
{
  digitalWrite(MotorRight1,LOW);
  digitalWrite(MotorRight2,LOW);
  digitalWrite(MotorLeft1,LOW);
  digitalWrite(MotorLeft2,LOW);
  delay(f * 100);
}

void back(int g) //Reverse
{
  digitalWrite(MotorLeft1,HIGH);
  digitalWrite(MotorLeft2,LOW);
  digitalWrite(MotorRight1,LOW);
  digitalWrite(MotorRight2,HIGH);
  delay(g * 100);
}

void detection() //Measure three angles (front, left, right)
{
  int delay_time = 250; //Settling time after steering servo motors
  ask_pin_F(); //Read from front

  if(Fspeedd < 10) //If the distance is less than 10 cm in front
  {
    stopp(1); //Stop
    back(2); //Reverse 0.2 seconds
  }

  if(Fspeedd < 25) //If the distance is less than 25 cm in front
  {
    stopp(1); //Stop
    ask_pin_L(); //Read from left
    delay(delay_time); //Wait for stable servo motor
    ask_pin_R(); //Read the right distance
    delay(delay_time); //Wait for stable servo motor

    if(Lspeedd > Rspeedd) //If the left distance is greater than the right
    {
      directionn = Lgo; //Go left
    }

    if(Lspeedd <= Rspeedd) //If the left distance is less than or equal to the right
    {
      directionn = Rgo; //Go right
    }

    if (Lspeedd < 15 && Rspeedd < 15) //If the distance to the left and right are less than 15 cm
    {
      directionn = Bgo; //Reverse
    }
  }
  else //If the distance is greater than 25 cm in front
  {
    directionn = Fgo; //Go Forward
  }
}

//*************************************************************************************
void ask_pin_F() //Measure the distance from the front
{
  myservo.write(90);
  digitalWrite(outputPin, LOW); //Make ultrasonic transmitter low voltage 2 μs
  delayMicroseconds(2);
  digitalWrite(outputPin, HIGH); //Make ultrasonic transmitting high voltage 10 μs
  delayMicroseconds(10);
  digitalWrite(outputPin, LOW); //Maintain low voltage ultrasonic transmitter
  float Fdistance = pulseIn(inputPin, HIGH); //Read time difference
  Fdistance = Fdistance/5.8/10; //Will turn time to distance (Unit: cm)
  Serial.println("Front distance:"); //Output distance (unit: cm)
  Serial.println(Fdistance); //Display the distance
  Fspeedd = Fdistance;
}

//****************************************************************************************
void ask_pin_L() //Measure the distance from the left
{
  myservo.write( 177);
  delay( delay_time);
  digitalWrite(outputPin, LOW); //Make ultrasonic transmitter low voltage 2 μs
  delayMicroseconds( 2);
  digitalWrite(outputPin, HIGH); //Make ultrasonic transmitting high voltage 10 μs
  delayMicroseconds( 10);
  digitalWrite(outputPin, LOW); //Maintain low voltage ultrasonic transmitter
  float Ldistance = pulseIn(inputPin, HIGH); //Read time difference
  Ldistance= Ldistance/5.8/10; //Will turn time to distance (unit: cm)
  Serial.println("Left distance:"); //Output distance (Unit: cm)
  Serial.println(Ldistance); //Display the distance
  Lspeedd = Ldistance;
}

//****************************************************************************************
void ask_pin_R() //Measure the distance from the right
{
  myservo.write( 5);
  delay( delay_time);
  digitalWrite(outputPin, LOW); //Make ultrasonic transmitter low voltage 2 μs
  delayMicroseconds( 2);
  digitalWrite(outputPin, HIGH); //Make ultrasonic transmitting high voltage 10 μs
  delayMicroseconds( 10);
  digitalWrite(outputPin, LOW); //Maintain low voltage ultrasonic transmitter
  float Rdistance = pulseIn(inputPin, HIGH); //Read time difference
  Rdistance= Rdistance/5.8/10; //Will turn time to distance (Unit: cm)
  Serial.println("Right distance:"); //Output distance (Unit: cm)
  Serial.println(Rdistance); //Display the distance
  Rspeedd = Rdistance;
}

//**************************************** LOOP ******************************************
void loop()
{
  SL = digitalRead(SensorLeft);
  SM = digitalRead(SensorMiddle);
  SR = digitalRead(SensorRight);
  performCommand();

  //***************************************************************************** Normal remote mode
  if (irrecv.decode(&results))
  {
    //Decoding is successful, you receive a set of infrared signals
    irrecv.resume(); //Continue to accept a set of infrared signals
    Serial.println(results.value,HEX);

    if (results.value == IRfront) //Forward
    {
      advance(6); //Forward
    }

    if (results.value == IRback) //Reverse
    {
      back(6); //Reverse
    }

    if (results.value == IRturnright) //Turn right
    {
      right(6); //Turn right
    }

    if (results.value == IRturnleft) //Turn left
    {
      left(6); //Turn left
    }

    if (results.value == IRstop) //Stop
    {
      digitalWrite(MotorRight1,LOW);
      digitalWrite(MotorRight2,LOW);
      digitalWrite(MotorLeft1,LOW);
      digitalWrite(MotorLeft2,LOW);
    }

    //**************************************************************************** Line following
    if (results.value == IRcny70)
    {
      Serial.println("Line tracking mode");
      while(1)
      {
        SL = digitalRead(SensorLeft);
        SM = digitalRead(SensorMiddle);
        SR = digitalRead(SensorRight);

        if(SM == HIGH) //If the middle sensor is in a black area
        {
          if (SL == HIGH && SR == LOW) //If left detects black and right detects white, turn left
          {
            Serial.println("Left");
            digitalWrite(MotorLeft1,LOW);
            digitalWrite(MotorLeft2,LOW);
            digitalWrite(MotorRight1,HIGH);
            digitalWrite(MotorRight2,LOW);
          }
          else if (SR == HIGH && SL == LOW) //If right detects black and left detects white, turn right
          {
            Serial.println("Right");
            digitalWrite(MotorLeft1,LOW);
            digitalWrite(MotorLeft2,HIGH);
            digitalWrite(MotorRight1,LOW);
            digitalWrite(MotorRight2,LOW);
          }
          else //If all sensors detect black, go forward
          {
            Serial.println("Forward");
            digitalWrite(MotorLeft1,LOW);
            digitalWrite(MotorLeft2,HIGH);
            digitalWrite(MotorRight1,HIGH);
            digitalWrite(MotorRight2,LOW);
          }
        }
        else //If the middle sensor is in a white area
        {
          if (SL == HIGH && SR == LOW) //If left detects black and right detects white, turn left
          {
            Serial.println("Left");
            digitalWrite(MotorLeft1,LOW);
            digitalWrite(MotorLeft2,LOW);
            digitalWrite(MotorRight1,HIGH);
            digitalWrite(MotorRight2,LOW);
          }
          else if (SR == HIGH && SL == LOW) //If right detects black and left detects white, turn right
          {
            Serial.println("Right");
            digitalWrite(MotorLeft1,LOW);
            digitalWrite(MotorLeft2,HIGH);
            digitalWrite(MotorRight1,LOW);
            digitalWrite(MotorRight2,LOW);
          }
          else //If all sensors detect white, reverse
          {
            Serial.println("Reverse");
            digitalWrite(MotorLeft1,HIGH);
            digitalWrite(MotorLeft2,LOW);
            digitalWrite(MotorRight1,LOW);
            digitalWrite(MotorRight2,HIGH);
          }
        }

        if (irrecv.decode(&results))
        {
          irrecv.resume();
          Serial.println(results.value,HEX);
          if( results.value == IRstop)
          {
            digitalWrite(MotorRight1,LOW);
            digitalWrite(MotorRight2,LOW);
            digitalWrite(MotorLeft1,LOW);
            digitalWrite(MotorLeft2,LOW);
            break;
          }
        }
      }
      results.value=0;
    }

    //********************************************************************************************* Self-propelled mode ultrasound
    if (results.value == IRAutorun)
    {
      Serial.println("Ultrasound mode");
      while(1)
      {
        myservo.write(90); //Put servo in middle position (pointing to the front of the robot)
        detection(); //Measure the distance in each direction
        if(directionn == 8) //Forward
        {
          if (irrecv.decode(&results))
          {
            irrecv.resume();
            Serial.println(results.value,HEX);
            if( results.value == IRstop)
            {
              digitalWrite(MotorRight1,LOW);
              digitalWrite(MotorRight2,LOW);
              digitalWrite(MotorLeft1,LOW);
              digitalWrite(MotorLeft2,LOW);
              break;
            }
          }
          results.value=0;
          advance(1); //Go forward
          Serial.println("Forward");
        }
        if(directionn == 2) //Reverse
        {
          if (irrecv.decode(&results))
          {
            irrecv.resume();
            Serial.println(results.value,HEX);
            if( results.value == IRstop)
            {
              digitalWrite(MotorRight1,LOW);
              digitalWrite(MotorRight2,LOW);
              digitalWrite(MotorLeft1,LOW);
              digitalWrite(MotorLeft2,LOW);
              break;
            }
          }
          results.value=0;
          back(8); //Reverse
          turnL(3); //Move slightly to the left
          Serial.println("Reverse");
        }
        if(directionn == 6) //Turn right
        {
          if (irrecv.decode(&results))
          {
            irrecv.resume();
            Serial.println(results.value,HEX);
            if(results.value == IRstop)
            {
              digitalWrite(MotorRight1,LOW);
              digitalWrite(MotorRight2,LOW);
              digitalWrite(MotorLeft1,LOW);
              digitalWrite(MotorLeft2,LOW);
              break;
            }
          }
          results.value=0;
          back(1);
          turnR(6); //Turn right
          Serial.print("Right");
        }
        if(directionn == 4) //Turn left
        {
          if (irrecv.decode(&results))
          {
            irrecv.resume();
            Serial.println(results.value,HEX);
            if( results.value == IRstop)
            {
              digitalWrite(MotorRight1,LOW);
              digitalWrite(MotorRight2,LOW);
              digitalWrite(MotorLeft1,LOW);
              digitalWrite(MotorLeft2,LOW);
              break;
            }
          }
          results.value=0;
          back( 1);
          turnL(6); //Turn left
          Serial.print("Left");
        }

        if (irrecv.decode(&results))
        {
          irrecv.resume();
          Serial.println(results.value,HEX);
          if( results.value == IRstop)
          {
            digitalWrite(MotorRight1,LOW);
            digitalWrite(MotorRight2,LOW);
            digitalWrite(MotorLeft1,LOW);
            digitalWrite(MotorLeft2,LOW);
            break;
          }
        }
      }
      results.value=0;
    }
    else
    {
      digitalWrite(MotorRight1,LOW);
      digitalWrite(MotorRight2,LOW);
      digitalWrite(MotorLeft1,LOW);
      digitalWrite(MotorLeft2,LOW);
    }
  }
}

void performCommand()
{
  if (Serial.available())
  {
    val = Serial.read();
  }
  if (val == 'f') //Forwards
  {
    advance(10);
  }
  else if (val == 'b') //back
  {
    back(10);
  }
  else if (val == 'l') //right
  {
    turnL(10);
  }
  else if (val == 'r') //left
  {
    turnR(10);
  }
  else if (val == 's' ) //stop
  {
    stopp(10);
  }
}