Laboratoire SUPINFO de recherche en robotique

Utiliser le BOE shield

Utiliser le BOE shield

11 déc, 2014

Vous pouvez retrouver l’article qui va suivre sur le site de l’association RobotLabo qui est composé des étudiants du laboratoire robotique pour pouvoir profiter d’une meilleure lecture :

http://robotlabo.eu/pageTuto/tutoBOEShield.html

 

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

 

Ici quelques photos du montage :

2 1

3 4

5 6

7 8

9

 

 

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 <Servo.h>

 

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.h>

 

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.h>

 

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.h>

 

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 :

http://robotlabo.eu/pageTuto/tutoCapteurUltrason.html

 

 

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.h>

 

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.h>

 

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

}

}

}

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>