Min Arduino linje efter Robot! -Med Pololu kvart-6A IR reflektans Sensor Array
Det kan följa en mörk ut, på en ljus bakgrund. I detta fall använt jag svart tejp på en whiteboard. Det först kalibrerar sig i 5 sekunder. Du flytta den över linjen några gånger så den vänjer sig skillnaden i reflektans. Efter kalibrering börjar det gå framåt. Jag använde en algoritm för att bestämma dess fel av fodra. Om det genom den algoritm som det är på ett extremt fel, kommer att det vända för en längre tid. På samma sätt om roboten bestämmer det är bara en bråkdel av en tum av fodra, blir det bara för en bråkdel av en sekund. Detta minskar över kompensation och gör linjen efter lite smidigare och mer tillförlitliga.
Detta är koden jag använde, jag började det från början och La MegaServo biblioteket. Jag vet att det finns ett bibliotek för Pololu IR-sensor arrayer, men jag stött på problem så jag beslöt att börja från början med sensor läsa också. Jag använder den analoga versionen av Pololu sensor array, i motsats till RC-versionen, som matar ut en digital signal. Min sensorer utgång en Analog spänning utifrån reflektansen av ytan. Till exempel om du tillhandahåller 5V till sensorer på Vcc, och du får en mörk yta, att sensorn matas en närmare en spänning på 5V. Omvänt, om sensorn stöter en mycket reflekterande, (vita yta) det kommer ut närmare till 0V. Jag kan läsa dessa 6 analoga utgångar från min 6 sensorer genom 6 analoga i/o-stiften på min Arduino.
Dessutom min STOP algoritm använder kapslade om uttalanden att kontrollera 3 gånger om roboten verkligen slutet, innan den stannar i 10 sekunder, blinkar ljuset. Detta förhindrar ett oavsiktligt stopp i mitten av banan på grund av felaktiga värden eller buggar. Under kalibreringen beräknas jag ett genomsnitt värderar av reflektansen som jag använder senare till hjälp med navigering och beslutsfattande. Jag har även tryckt lite data för att skärmen följetong för teständamål.
Här är min kod:
// ==========================================================
Känn dig fri att ändra och använda den här koden, men ge mig kredit.
Författare: Austin Duff - 24 juni, 2009
// ==========================================================
#include < PololuQTRSensors.h >
#include < Servo.h >
#include < MegaServo.h >
#define NBR_SERVOS 3
#define FIRST_SERVO_PIN 2
Servo vänster;
Servo höger;
Servo torn;
MegaServo servon [NBR_SERVOS];
int pingPin = 7.
int mid = 0;
int mn = 0;
int mx = 0;
void setup()
{
Servon [0] .attach (2, 800, 2200); Tower
Servon [1] .attach (9, 800, 2200); vänster
Servon [2] .attach (10, 800, 2200); höger
Serial.BEGIN(9600);
Servos[0].write(65);
digitalWrite 13, låg.
Servos[2].write(90);
Servos[1].write(90);
för (int jag = 0; jag < 5000; i ++)
{
digitalWrite 13, hög.
int val = 0;
för (int j = 0; j < = 5; j ++)
{
Val = analogRead(j);
om (val > = mx)
MX = val;
om (val < = mn)
mn = val;
}
Delay(1);
}
mitten av = ((mx + mn)/2);
digitalWrite 13, låg.
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 ("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 ("höger");
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 ("vänster");
Delay(ABS(((S5+S4+S3)/3)-((S0+S1+S2)/3))/2));
}
om ((s0 > mid) & &(s5 > mid))
{
Servos[2].write(90);
Servos[1].write(90);
Serial.Print ("STOP");
om ((s0 > mid) & &(s5 > mid))
{
Servos[2].write(90);
Servos[1].write(90);
Serial.Print ("STOP");
om ((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, hög.
Delay(100);
digitalWrite 13, låg.
Delay(100);
}
Delay(5000);
}
}
}
}