Es kann ein dunkler wie auf einem hellen Hintergrund folgen. In diesem Fall habe ich schwarzes Klebeband auf einem Whiteboard. Es kalibriert sich zuerst für 5 Sekunden. Sie verschieben es auf der Linie ein paar Mal damit es auf die Differenz in Reflexion gewöhnt. Nach der Kalibrierung beginnt es voran. Ich habe einen Algorithmus um seine Fehler aus der Linie zu bestimmen. Wenn es durch den Algorithmus, die es zu einem extremen Fehler ist bestimmt, schaltet es sich für einen längeren Zeitraum hinweg. Ebenso, wenn der Roboter, dass es nur einen Bruchteil von einem Zoll von der Linie ist feststellt, schaltet es nur für einen Bruchteil einer Sekunde. Dies reduziert über Entschädigung und macht die Zeile nach ein wenig glatter und zuverlässiger.
Dies ist der Code ich habe, ich bei Null angefangen und die MegaServo-Bibliothek hinzugefügt. Ich bin mir bewusst, dass es eine Bibliothek für die Pololu IR-Sensor-Arrays, aber ich auf Probleme gestoßen, also beschloss ich, mit dem Sensor sowie Lesen von vorne anfangen. Ich benutze die analoge Version des Pololu Sensor-Arrays, im Gegensatz zu der RC-Version, die ein digitales Signal ausgibt. Meine Sensoren Ausgangsspannung eine analoge basierend auf die Reflexion von der Oberfläche. Z.B. Wenn Sie 5V an den Sensoren an Vcc, und Sie einer dunklen Oberfläche begegnen, dass der Sensor ausgeben wird eine Spannung näher auf 5V. Umgekehrt, wenn der Sensor eine reflektierende stößt, wird (weiße Fläche) es näher auf 0V ausgegeben. Ich kann lesen, diese 6 analoge Ausgänge von meinem 6 Sensoren durch die 6 Analog i/o-Pins auf mein Arduino.
Darüber hinaus verschachtelt mein STOP-Algorithmus verwendet, wenn Aussagen zu 3-Mal zu überprüfen, ob der Roboter wirklich am Ende, bevor es für 10 Sekunden, hält das Licht blinkt. Dies verhindert einen versehentlichen Halt in der Mitte der Strecke durch ungenaue Messwerte oder Pannen. Während der Kalibrierung rechnete ich einen durchschnittlichen Wert von Reflexion, die ich später verwenden, um Hilfe bei der Navigation und Entscheidungsfindung. Ich druckte auch einige Daten zum seriellen Bildschirm für Testzwecke.
Hier ist mein Code:
// ==========================================================
Fühlen Sie sich frei zu ändern und diesen Code verwenden, aber bitte geben Sie mir anrechnen.
Autor: 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-Turm;
MegaServo Servos [NBR_SERVOS];
Int PingPin = 7;
Int Mitte = 0;
Int Mn = 0;
Int Mx = 0;
void setup()
{
Servos [0] .attach (2, 800, 2200); Turm
Servos [1] .attach (9, 800, 2200); Links
Servos [2] .attach (10, 800, 2200); rechts
Serial.Begin(9600);
Servos[0].Write(65);
DigitalWrite (13, LOW);
Servos[2].Write(90);
Servos[1].Write(90);
für (Int ich = 0; ich < 5000; i ++)
{
DigitalWrite (13, HIGH);
Int Val = 0;
für (Int j = 0; j < = 5; j++)
{
Val = analogRead(j);
Wenn (Val > = Mx)
MX = Val;
Wenn (Val < = Mn)
MN = Val;
}
Delay(1);
}
Mitte = ((mx + mn)/2);
DigitalWrite (13, LOW);
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 ("Mitte:");
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 ("rechts");
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));
}
Wenn ((s0 > mid) & &(s5 > mid))
{
Servos[2].Write(90);
Servos[1].Write(90);
Serial.Print ("STOP");
Wenn ((s0 > mid) & &(s5 > mid))
{
Servos[2].Write(90);
Servos[1].Write(90);
Serial.Print ("STOP");
Wenn ((s0 > mid) & &(s5 > mid))
{
Servos[2].Write(90);
Servos[1].Write(90);
Serial.Print ("STOP");
für (Int k = 0; k < 50; k ++)
{
DigitalWrite (13, HIGH);
Delay(100);
DigitalWrite (13, LOW);
Delay(100);
}
Delay(5000);
}
}
}
}