Laboratoire SUPINFO de recherche en robotique

Suivie de ligne Arduino avec le capteur TCS3200

Suivie de ligne Arduino avec le capteur TCS3200

1 avr, 2015

                   SUIVI DE LIGNE TUTOS

 

1) Matériels et branchements

Pour réaliser ce projet, j’ai utilisé une BOE shield de de Parallax

ce shield dispose de deux moteurs à courant continu.

Pour plus d’information sur le shield je vous redirige vers le site du constructeur.

http://www.parallax.com/product/130-35000

 

Un capteur de couleurs TCS3200, qui à l’avantage de communiquer directement avec le microcontrôleur.

et pour finir des raccordement pour relier les capteur à l’Arduino

 

 capteur TCS3200

Pour commencer nous allons effectuer le branchement de notre capteur à l’Arduino pour ce faire nous allons utilisé le schema suivant :

 

 schemaTCS3200

 

Et voici le résultat final:

photomontage photoMontage2

 

Après le câblage (qui était la partie la plus simple :) ), Nous allons nous attaquer ensuite sur l’algorithme qui va gérer le déplacement et permettre au robot de suivre une ligne définie et de rester dessus en occurrence une ligne noire.

 

Avant toute chose je vais vous expliquer le fonctionnement du capteur de couleur qui je rappel est de type TCS3200.

Ce capteur dispose donc de 4 LEDs blanches et délivre une fréquence en fonction de la couleur en face.

Ces LEDS sont des photodiodes avec filtres de couleur. Par-dessus

ces photodiodes il y’a : un filtre vert, rouge, bleu et enfin un clair.

Son principe de fonctionnement est simple, la capteur va prendre une mesure avec le filtre clair et ensuite la comparer avec les autres filtres (R,G,B) afin de déterminer quelle couleur est en face.

 

Etant donné que ce projet a été réalisé dans des conditions qui n’était pas optimale, il y’a quelques ambiguïtés  sur les valeurs que retourne le capteur.

 

2) Programmation :

 

 

Tout d’abords nous allons regarder les valeurs retournées par le capteur au-dessus de la couleur noir et de la couleur blanche. Je tiens à préciser que ces valeurs peuvent varier légèrement ou énormément selon la lumière ambiante dans la pièce.

Ainsi :

 

int s0=3,s1=4,s2=5,s3=6;

int out=2;

int flag=0;

byte counter=0;

byte countR=0,countG=0,countB=0;

void setup()

{

Serial.begin(9600);

pinMode(s0,OUTPUT);

pinMode(s1,OUTPUT);

pinMode(s2,OUTPUT);

pinMode(s3,OUTPUT);

 

}

void TCS()

{

flag=0;

digitalWrite(s1,HIGH);

digitalWrite(s0,HIGH);

digitalWrite(s2,LOW);

digitalWrite(s3,LOW);

attachInterrupt(0, ISR_INTO, CHANGE);

timer0_init();

 

}

void ISR_INTO()

{

counter++;

}

void timer0_init(void)

{

TCCR2A=0×00;

TCCR2B=0×07;   //the clock frequency source 1024 points

TCNT2= 100;    //10 ms overflow again

TIMSK2 = 0×01; //allow interrupt

}

int i=0;

ISR(TIMER2_OVF_vect)//the timer 2, 10ms interrupt overflow again. Internal overflow interrupt executive function

{

TCNT2=100;

flag++;

if(flag==1)

{

countR=counter;

//Serial.print(« red= »);

//Serial.println(countR,DEC);

digitalWrite(s2,HIGH);

digitalWrite(s3,HIGH);

}

else if(flag==2)

{

countG=counter;

//Serial.print(« green= »);

//Serial.println(countG,DEC);

digitalWrite(s2,LOW);

digitalWrite(s3,HIGH);

}

else if(flag==3)

{

countB=counter;

//Serial.print(« blue= »);

//Serial.println(countB,DEC);

Serial.println(« \n »);

digitalWrite(s2,LOW);

digitalWrite(s3,LOW);

}

else if(flag==4)

{

flag=0;

}

counter=0;

delay(1000);

}

void loop()

{

delay(10);

TCS();

while(1){

Serial.print(« green= »);

Serial.println(countG,DEC);

Serial.print(« blue= »);

Serial.println(countB,DEC);

Serial.print(« red= »);

Serial.println(countR,DEC);

delay(1000);

}

}

 

Vous permettra de récupérer les valeurs que vous cherchez

 

Nous trouvons donc comme valeur pour la couleur noir :

red=11

green=5

blue=3

 

Et pour la couleur blanche :

 

red=33

green=15

blue=11

 

 

Maintenant nous allons faire du suivie de ligne. Pour l’utilisation des moteurs du BOE shield veuillez-vous référez à ce tutoriel :

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

 

Au code précédent nous allons rajouter la partie permettant de suivre la ligne :

 

if (countR < 20 && countG < 15 && countB < 10){ //Si on est sur du noir on avance

motorLeft.writeMicroseconds(1550);

motorRight.writeMicroseconds(1460);

delay(200);

}

else if(countR > 20 && countG > 15 && countB > 10) // Si on est sur du blanc on tourne à gauche

{

motorLeft.writeMicroseconds(1510);

motorRight.writeMicroseconds(1480);

delay(200);

 

while(countR > 20 && countG > 15 && countB > 10) // Tant qu’on est sur du blanc

{

temps = millis();

if(temps – tempsPrec > 1500) // SI il passe une seconde et demi sur du blanc il repars a droite

{

motorLeft.writeMicroseconds(1490);

motorRight.writeMicroseconds(1500);

tempsPrec = temps;

}

}

 

 

Et maintenant le code complet :

 

 

#include <Servo.h> //include de la librairie pour les moteurs

 

int s0=3,s1=4,s2=5,s3=6;

int out=2;

int flag=0;

byte counter=0;

byte countR=0,countG=0,countB=0;

long tempsPrec;

unsigned long temps;

 

 

Servo motorLeft;

Servo motorRight;

 

void setup()

{

Serial.begin(115200);

pinMode(s0,OUTPUT);

pinMode(s1,OUTPUT);

pinMode(s2,OUTPUT);

pinMode(s3,OUTPUT);

motorLeft.attach(13);

motorRight.attach(12);

 

}

void TCS()

{

flag=0;

digitalWrite(s1,HIGH);

digitalWrite(s0,HIGH);

digitalWrite(s2,LOW);

digitalWrite(s3,LOW);

attachInterrupt(0, ISR_INTO, CHANGE);

timer0_init();

 

 

}

void ISR_INTO()

{

counter++;

}

void timer0_init(void)

{

TCCR2A=0×00;

TCCR2B=0×07;   //the clock frequency source 1024 points

TCNT2= 100;    //10 ms overflow again

TIMSK2 = 0×01; //allow interrupt

}

int i=0;

ISR(TIMER2_OVF_vect)//the timer 2, 10ms interrupt overflow again. Internal overflow interrupt executive function

{

TCNT2=100;

flag++;

if(flag==1)

{

countR=counter;

digitalWrite(s2,HIGH);

digitalWrite(s3,HIGH);

}

else if(flag==2)

{

countG=counter;

digitalWrite(s2,LOW);

digitalWrite(s3,HIGH);

}

else if(flag==3)

{

countB=counter;

digitalWrite(s2,LOW);

digitalWrite(s3,LOW);

}

else if(flag==4)

{

flag=0;

}

counter=0;

}

void loop(){

TCS();

while(1){

// On récupère les valeurs du capteur afin avoir un résultat visuel.

 

Serial.print(« red= »);

Serial.println(countR,DEC);

Serial.print(« green= »);

Serial.println(countG,DEC);

Serial.print(« blue= »);

Serial.println(countB,DEC);

Serial.println(« \n »);

if (countR < 20 && countG < 15 && countB < 10){ //On avance au ralenti

motorLeft.writeMicroseconds(1550);

motorRight.writeMicroseconds(1460);

delay(200);

}

else if(countR > 20 && countG > 15 && countB > 10) // Si il devis de la ligne il part a gauche

{

motorLeft.writeMicroseconds(1510);

motorRight.writeMicroseconds(1480);

delay(200);

 

while(countR > 20 && countG > 15 && countB > 10)

{

temps = millis(); // SI il passe une seconde et demi sur du blanc il repars a droite

if(temps – tempsPrec > 1500)

{

motorLeft.writeMicroseconds(1490);

motorRight.writeMicroseconds(1500);

tempsPrec = temps;

}

}

}

}

}

 

Une petite video du robot en Action

 

Ecrit par Sylva Etokabeka

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>