Het kan volgen van een donker als, op een lichte achtergrond. In dit geval gebruikte ik zwarte tape op een whiteboard. Het eerste kalibreert zelf gedurende 5 seconden. U verplaatst het over de lijn een paar keer zodat het went aan het verschil in reflectie. Na de kalibratie begint het vooruit. Ik gebruikt een algoritme om te bepalen van de fout uit de lijn. Als wordt bepaald door middel van het algoritme dat het op een extreme fout is, zal het weer voor een langere tijd. Op dezelfde manier als de robot dat het is slechts een fractie van een duim uit de lijn bepaalt, zal het alleen veranderen voor een fractie van een seconde. Dit vermindert over compensatie en maakt de regel die volgt, een beetje soepeler en betrouwbaarder.
Dit is de code die ik gebruikte, ik vanaf nul begonnen en de MegaServo-bibliotheek toegevoegd. Ik ben mij ervan bewust dat er een bibliotheek voor de Pololu IR sensor arrays, maar ik problemen, ondervonden dus heb ik besloten om te beginnen vanaf nul met de sensor ook lezen. Ik ben met behulp van de analoge versie van de Pololu sensor-array, in tegenstelling tot de RC-versie, die een digitaal signaal uitgangen. Mijn sensoren uitgangsspanning een analoge op basis van de reflectiecoëfficiënt van het oppervlak. Bijvoorbeeld, als u bent het verstrekken van 5V aan de sensoren op Vcc en u een donker oppervlak tegenkomt, dat sensor zal de uitgang van een een spanning dichter naar 5V. Omgekeerd, als de sensor een zeer reflecterende aantreft, (witte oppervlak) het zal output dichter naar 0V. Ik kan het lezen van deze 6 analoge uitgang van mijn 6 sensoren via de 6 analoge i/o-pinnen op mijn Arduino.
Bovendien, mijn STOP algoritme gebruikt genest als verklaringen 3 keer controleren als de robot echt aan het eind, voordat hij voor 10 seconden stopt, het licht knippert is. Hiermee voorkomt u dat een toevallige stop in het midden van het spoor als gevolg van onnauwkeurige lezingen of glitches. Tijdens de kalibratie berekend ik een gemiddelde waarde van de reflectiecoëfficiënt die ik gebruik later om te helpen bij de navigatie en de besluitvorming. Ik heb ook enkele gegevens naar het seriële scherm voor testdoeleinden afgedrukt.
Hier is mijn code:
// ==========================================================
Voel je vrij om te wijzigen en gebruik deze code, maar geef me krediet.
Auteur: Austin Duff - 24 juni 2009
// ==========================================================
#include < PololuQTRSensors.h >
#include < Servo.h >
#include < MegaServo.h >
#define NBR_SERVOS 3
#define FIRST_SERVO_PIN 2
Servo links;
Servo recht;
Servo toren;
MegaServo servo's [NBR_SERVOS];
int pingPin = 7;
int midden = 0;
int mn = 0;
int mx = 0;
VOID Setup
{
Servo's [0] .attach (2, 800, 2200); toren
Servo's [1] .attach (9, 800, 2200); links
Servo's [2] .attach (10, 800, 2200); rechts
Serial.begin(9600);
Servos[0].write(65);
digitalWrite (13, laag);
Servos[2].write(90);
Servos[1].write(90);
for (int i = 0; ik < 5000; i ++)
{
digitalWrite (13, hoge);
int val = 0;
for (int j = 0; j < = 5; j ++)
{
Val = analogRead(j);
Als (val > = mx)
MX = val;
Als (val < = mn)
MN = val;
}
delay(1);
}
Midden = ((mx + mn)/2);
digitalWrite (13, laag);
Servos[2].write(90);
Servos[1].write(90);
}
void loop
{
int s0 = 0;
int s1 = 0;
int s2 = 0;
int s3 = 0;
int s4 = 0;
int s5 = 0;
S0 = analogRead(0);
S1 = analogRead(1);
S2 = analogRead(2);
S3 = analogRead(3);
S4 = analogRead(4);
S5 = analogRead(5);
Serial.Print ("Midden:");
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 ("recht");
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 ("links");
delay(ABS(((S5+S4+S3)/3)-((S0+S1+S2)/3))/2));
}
Als ((s0 > mid) & &(s5 > mid))
{
Servos[2].write(90);
Servos[1].write(90);
Serial.Print ("STOP");
Als ((s0 > mid) & &(s5 > mid))
{
Servos[2].write(90);
Servos[1].write(90);
Serial.Print ("STOP");
Als ((s0 > mid) & &(s5 > mid))
{
Servos[2].write(90);
Servos[1].write(90);
Serial.Print ("STOP");
voor (int k = 0; k < 50; k ++)
{
digitalWrite (13, hoge);
delay(100);
digitalWrite (13, laag);
delay(100);
}
delay(5000);
}
}
}
}