Tutoriel sur le BOE Shield de Parallax

Pour ce tutoriel nous utiliserons ce kit : http://www.parallax.com/product/130-35000
Accompagné de celui-ci : http://www.parallax.com/product/910-28015a
Pour commencer nous allons montés les deux kit évoqués ci-dessus. Voici quelques photos du montage :

Maintenant faisons le bouger. Pour faire cela nous allons utiliser l’IDE arduino que vous trouverez ici : http://arduino.cc/en/Main/Software

Pour contrôler les moteurs nous allons avoir besoin de la librairie Servo qui est inclus dans l’IDE arduino. Pour l’importer écrivez cette ligne tout en haut de votre code :


#include 
                                        

Il faut ensuite déclarer nos moteurs pour cela on va instancier deux éléments de la classe Servo comme ceci :


Servo servoLeft ;
Servo servoRight;

                                        

Il ne nous reste plus qu’à préciser le port sur lequel ils sont attachés. Comme vous avez pu le voir il y a quatre sorties pour les servos moteur sur le BOE shield nous avons utilisé celles-là. Le moteur droit étant branché sur le port 12 et le moteur gauche sur le port 13. Pour le préciser au programme nous allons utiliser la méthode attach() :


servoLeft.attach(13); 
servoRight.attach(12);

                                        

Une fois tous ces paramètres définit vous devriez avoir un code qui ressemble à cela :


#include                            
 
Servo servoLeft;                             
Servo servoRight;                            

void setup()                                 
{ 
  servoLeft.attach(13); 
  servoRight.attach(12);  
}  
 
void loop()                                  
{}

                                        

Pour faire avancer nos moteurs nous allons rajouter du code dans la fonction loop ! Et ce code est une méthode : writeMicroseconds() qui va envoyer du courant à notre moteur. Couplé à un delay étant égale au temps ou vos moteurs vont tourner cela fera le travail demandé ! Par contre il faudra arrêter les moteurs après le delay.
Pour savoir quel courant envoyé à nos moteurs référez-vous à ce tableau :

Voici le code tant attendu :


#include                            
 
Servo servoLeft;                             
Servo servoRight;                            

void setup()                                 
{                            
  servoLeft.attach(13); 
  servoRight.attach(12);  
}  
 
void loop()                                  
{
      servoLeft.writeMicroseconds(1700); 
      servoRight.writeMicroseconds(1300);
      delay(4000); 
     servoLeft.writeMicroseconds(1500); 
      servoRight.writeMicroseconds(1500);
      delay(10000); 
}

                                        

Mais bon cela n’est pas trop drôle de juste le voir avancer… Je vais vous donner un petit code pour contrôler votre robot à partir de votre ordinateur grâce au terminal série d’arduino !


#include                            
 
Servo servoLeft;                             
Servo servoRight;                            

void setup()                                 
{                            
  Serial.begin(9600);                        
  servoLeft.attach(13); 
  servoRight.attach(12);  
  while (!Serial) {
    ;
  } 
}  
 
void loop()                                  
{
  int inByte = 0;

  if (Serial.available() > 0) {
    // get incoming byte:
    inByte = Serial.read();
    Serial.write(inByte);
    if(inByte == 'f'){
      servoLeft.writeMicroseconds(1700); 
      servoRight.writeMicroseconds(1300);
      delay(2000); 
    }
    if(inByte == 'b'){
      servoLeft.writeMicroseconds(1300); 
      servoRight.writeMicroseconds(170);
      delay(2000); 
    }
  }
  else{
    servoLeft.writeMicroseconds(1500);
    servoRight.writeMicroseconds(1500);
  }
}

                                        

Maintenant utilisons le capteur à ultrason pour s’arrêter devant un obstacle !
Si vous n’avez pas déjà lu notre tutoriel sur le capteur à ultrason c’est par ici : tuto capteur Ultrason
Voici un petit code qui fait avancer le robot jusqu’à une certaine distance préciser en paramètre de la fonction. Puis le robot recul tourne et recommence


#include                            
 
Servo servoLeft;                             
Servo servoRight;                            

const int pingPin = 7;

void setup()                                 
{                            
  Serial.begin(9600);                        
  servoLeft.attach(13); 
  servoRight.attach(12);  
  while (!Serial) {
    ; 
  } 
}  
 
void loop()                                  
{
  avancerObstacle(15);
  reculer();
  tournerDroite();
}


void avancerObstacle(int distance){
  long duration, cm;
  
  pinMode(pingPin, OUTPUT);
  digitalWrite(pingPin, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin, LOW);
  
  pinMode(pingPin, INPUT);
  duration = pulseIn(pingPin, HIGH);

  
  cm = microsecondsToCentimeters(duration);
  
  delay(100);
  
  servoLeft.writeMicroseconds(1600); 
  servoRight.writeMicroseconds(1400);
  
  while(cm > distance)
  {
    pinMode(pingPin, OUTPUT);
    digitalWrite(pingPin, LOW);
    delayMicroseconds(2);
    digitalWrite(pingPin, HIGH);
    delayMicroseconds(5);
    digitalWrite(pingPin, LOW);
    
    pinMode(pingPin, INPUT);
    duration = pulseIn(pingPin, HIGH);
  
    cm = microsecondsToCentimeters(duration);
    
    Serial.print("cm = ");
    Serial.println(cm);
    
    Serial.print("distance = ");
    Serial.println(distance);
    
    if(cm < distance){
      break;
    }
    
    delay(100);
  }
  
  Serial.println("sort de boucle avancer en attendant obstacle");
  servoLeft.writeMicroseconds(1510);
  servoRight.writeMicroseconds(1500);
}

void reculer()
{
  Serial.println("dans fonction reculer");
  servoLeft.writeMicroseconds(1400); // Pin 13 servo speed = pulse
  servoRight.writeMicroseconds(1600);
  delay(1000);
  servoLeft.writeMicroseconds(1510);
  servoRight.writeMicroseconds(1500);
}

void tournerDroite()
{
  Serial.println("dans fonction tourner droite");
  servoLeft.writeMicroseconds(1400); // Pin 13 servo speed = pulse
  servoRight.writeMicroseconds(1400);
  delay(600);
  servoLeft.writeMicroseconds(1510);
  servoRight.writeMicroseconds(1500);
}



long microsecondsToCentimeters(long microseconds)
{
  return microseconds / 29 / 2;
}

                                        

Pour finir ce tuto je vais vous montrez comment faire tourner le servo moteur qui est en dessous du capteur de distance pour le faire tourner précisément.
Comme avant il faut le déclarer et lui assigner la broche à laquelle il est branché.
La seule chose qui va changer est la méthode pour envoyer le courant dans le moteur. On utilisera write() au lieu de writeMicroseconds() :


#include                            
 
Servo servoTest;                              

void setup()                                 
{                            
  Serial.begin(9600) ;
  servoTest.attach(11);  
  while (!Serial) {
    ; 
  } 
}  
 
void loop()                                  
{
  int inByte = 0;

  if (Serial.available() > 0) {
    inByte = Serial.read();
    Serial.write(inByte);
    if(inByte == 'f'){
      servoTest.write(30);
    }
    if(inByte == 'b'){
      servoTest.write(150); 
    }
  }
}