Il peut suivre un noir comme, sur un fond clair. Dans ce cas, j’ai utilisé une bande noire sur un tableau blanc. Il se calibre tout d’abord pendant 5 secondes. Vous déplacez à travers la ligne plusieurs fois, il s’habitue à la différence de réflectivité. Après l’étalonnage il commence à aller de l’avant. J’ai utilisé un algorithme pour déterminer son erreur sur la ligne. S’il constate par le biais de l’algorithme qu’il soit une erreur extrême, il tournera pendant un temps plus long. De même, si le robot détermine que c’est seulement une fraction de pouce sur la ligne, il tournera seulement pour une fraction de seconde. Ceci réduit à l’indemnisation et rend la ligne qui suit un peu plus lisse et plus fiable.
C’est le code que j’ai utilisé, j’ai commencé à partir de zéro et ajouté à la bibliothèque de MegaServo. Je suis conscient qu’il existe une bibliothèque pour les baies de capteur IR Pololu, mais j’ai rencontré des problèmes, alors j’ai décidé de repartir à zéro avec le capteur de lecture aussi bien. J’utilise la version analogique du tableau de capteur Pololu, par opposition à la version RC, qui émet un signal numérique. Mes capteurs une tension analogique issue de la réflectance de la surface de sortie. Par exemple, si vous fournissez à 5V pour les capteurs à Vcc, et rencontrez une surface sombre, ce capteur aura pour résultat une une tension plus proche à 5V. À l’inverse, si le capteur rencontre un très réfléchissante, (surface blanche) il sortira plus près à 0V. Je peux lire ces 6 sorties analogiques de mon 6 capteurs à travers les 6 broches d’e/s analogiques sur mon Arduino.
En outre, mon arrêt algorithme utilise imbriqué si des déclarations de vérifier 3 fois si le robot est vraiment à la fin, avant elle s’arrête pendant 10 secondes, la lumière clignotante. Cela empêche un arrêt accidentel au milieu de la piste en raison des mesures imprécises ou des pépins. Lors de l’étalonnage, j’ai calculé une valeur moyenne de réflexion dont je me sers plus tard pour aider à la navigation et la prise de décision. Aussi, j’ai imprimé quelques données à l’écran de série pour des fins de test.
Voici mon code :
// ==========================================================
N’hésitez pas à changer et copiez le code suivant, mais s’il vous plaît me donner crédit.
Auteur : Austin Duff - 24 juin 2009
// ==========================================================
#include < PololuQTRSensors.h >
#include < Servo.h >
#include < MegaServo.h >
#define NBR_SERVOS 3
#define FIRST_SERVO_PIN 2
Servo gauche ;
Droit de servo ;
Tour de servo ;
Servos MegaServo [NBR_SERVOS] ;
int pingPin = 7 ;
int mi = 0 ;
mn int = 0 ;
mx int = 0 ;
void setup()
{
Servos [0] .Brancher (2, 800, 2200) ; tour
.Brancher servos [1] (9, 800, 2200) ; gauche
.Brancher servos [2] (10, 800, 2200) ; droit
Serial.Begin(9600) ;
Servos[0].Write(65) ;
digitalWrite (13, faible) ;
Servos[2].Write(90) ;
Servos[1].Write(90) ;
pour (int i = 0; i < 5000; i ++)
{
digitalWrite (13, HIGH) ;
int val = 0 ;
pour (int j = 0; j < = 5; j ++)
{
Val = analogRead(j) ;
Si (val > = mx)
MX = val ;
Si (val < = mn)
mn = val ;
}
Delay(1) ;
}
Mid = ((mx + mn)/2) ;
digitalWrite (13, faible) ;
Servos[2].Write(90) ;
Servos[1].Write(90) ;
}
void loop()
{
s0 int = 0 ;
s1 int = 0 ;
s2 int = 0 ;
s3 int = 0 ;
s4 int = 0 ;
s5 int = 0 ;
S0 = analogRead(0) ;
S1 = analogRead(1) ;
S2 = analogRead(2) ;
S3 = analogRead(3) ;
S4 = analogRead(4) ;
S5 = analogRead(5) ;
Serial.Print ("Mid:") ;
Serial.Print(Mid) ;
Serial.Print("") ;
Serial.Print(S0) ;
Serial.Print("") ;
Serial.Print(S1) ;
Serial.Print("") ;
Serial.Print(S2) ;
Serial.Print("") ;
Serial.Print(S3) ;
Serial.Print("") ;
Serial.Print(S4) ;
Serial.Print("") ;
Serial.Print(S5) ;
Serial.Print("") ;
Serial.println() ;
Servos[2].Write(180) ;
Servos[1].Write(0) ;
Delay(10) ;
if(((S0+S1+S2)/3) > (((s3+s4+s5)/3) + 250)) & & (! () (S0 > Mid) & &(s5 > mid)))
{
Servos[2].Write(180) ;
Servos[1].Write(90) ;
Serial.Print ("droite") ;
Delay(ABS(((S5+S4+S3)/3)-((S0+S1+S2)/3))/2)) ;
}
if(((S0+S1+S2)/3) < (((s3+s4+s5)/3) -250)) & & (! () (S0 > Mid) & &(s5 > mid)))
{
Servos[2].Write(90) ;
Servos[1].Write(0) ;
Serial.Print ("gauche") ;
Delay(ABS(((S5+S4+S3)/3)-((S0+S1+S2)/3))/2)) ;
}
Si ((s0 > mid) & &(s5 > mid))
{
Servos[2].Write(90) ;
Servos[1].Write(90) ;
Serial.Print ("STOP") ;
Si ((s0 > mid) & &(s5 > mid))
{
Servos[2].Write(90) ;
Servos[1].Write(90) ;
Serial.Print ("STOP") ;
Si ((s0 > mid) & &(s5 > mid))
{
Servos[2].Write(90) ;
Servos[1].Write(90) ;
Serial.Print ("STOP") ;
pour (int k = 0; k < 50; k ++)
{
digitalWrite (13, HIGH) ;
Delay(100) ;
digitalWrite (13, faible) ;
Delay(100) ;
}
Delay(5000) ;
}
}
}
}