Linefollower robot från Arduino och skräp - tankar och koden (4 / 5 steg)
Steg 4: Arduino kod - kalibrering
Raden efter robot sensorer kamerakalibrering skript
Mikko
***/
/*
HUR DU ANVÄNDER:
Ladda upp skriptet.
Arduino har till stanna kopplet till computern.
Sensorer måste ha sin spänning som tillhandahålls.
Placera roboten helt på dess vita glidyta
förmodligen så att det finns svart linje dess vänster,
men inte i vyn av sensorer.
Tryck på arduinos reset knappen.
Efter 2 sekunder ska stift 13 ombord LED tändas.
Vit yta kalibrering measurings görs medan LED lyser - ca 2 sek.
LED kommer att gå ut efter detta.
Efter en 2 sekunder tänds fördröjning lysdioden igen.
Nu har du 5 sekunder att flytta roboten i sidled över en svart linje.
Linje måste vara till vänster när man står inför samma sätt som robot kommer att vara igång.
Du måste flytta roboten till vänster och ungefärligt i rätt vinkel till raden.
Under detta steg den maximala behandlingen tas som uppstår när en enda sensor direkt över linjen.
Inte bråttom, men alla sensorerna måste vara över linje när ledde går ut efter 5 sek.
Efter en annan 2 sek tänds fördröjning lysdioden igen.
Nu måste du flytta roboten tillbaka över linjen, motsatsen till vad du gjorde i sista steget.
Det innebär under 5 sek flytta roboten tillbaka till höger över linjen.
Viktigt: denna tid robot har att flytta höger - höger sensor har att passera över linje först!
Under detta skall gå vidtas åtgärder att säga hur lågt gör två sida vid sida sensorerna, när raden är exakt emellan två.
Measurings slutet när ledde går ut efter 5 sek.
Starta seriell monitor.
Stoppa autoscroll och kopiera korrigering värden från alla på varandra följande tre linjer till robotar ridning skript.
*/
/ * sensor ingång stift * /
CONST int sensorPins [] = {A0, A1, A2}; höger, center, vänster
/ * ombord LED stift * /
CONST int indicatorPin = 13.
/ * matriser för lagring av sensor och beräknade data
tre sensorer i varje matris:
0 - 1 - CENTER, 2 - VÄNSTER HÖGER, * /
float avläsningar [3]. sensormätningar
flyta averageReadings [3] = {0, 0, 0}; genomsnittliga avläsningar
flyta whitePoints [3] = {0, 0, 0}; behandlingen på vit yta
int blackPoints [3] = {0, 0, 0}; maximal läsning medan passerar över svart linje
float unitSteps [3]. skillnaden mellan vitt och svart dividerat med 100
int korrigeringar [3]. vita punkter som int
flyta peakDetect [3] = {0, 0, 0};
flyta betweenReadings [2] = {1024, 1024}; avläsningar när raden är emellan två sensorer, höger-CENTER, vänster-CENTER
booleska betweenState [3] = {false, false, false}; hjälpare för att veta vilka minimum för att lagra
/ * loop helper variabler * /
int i;
int j;
void setup() {
Serial.BEGIN(9600); Starta seriell övervaka att utdata efter measurings
pinMode (indicatorPin, produktionen); Ställ in Cooler ledde stift till indikera mätning läge
/ * Starta kalibreringen efter 2 sek fördröjning * /
Delay(2000);
/ * MÄTNING PÅ VIT YTA I CA 2 SEKUNDER ANTOG * /
digitalWrite (indicatorPin, hög); Onboard-LED lyser
för (jag = 0; jag < 125; i ++) {//125 avläsningar från varje sensor
för (j = 0; j < = 2, j ++) {//loop genom varje sensor
avläsningar [j] = analogRead(sensorPins[j]); få valuta
/ * beräkna genomsnittlig sensor värden * /
whitePoints [j] = (whitePoints [j] * j + readings[j]) / (j + 1); genomsnittliga från alla measurings tagit detta långt
Delay(2);
}
Delay(10);
}
digitalWrite (indicatorPin, låg); Onboard lysdioden slocknar
Delay(2000); 2 sekunders fördröjning
/ * GÅ SIDEWAYS ÖVER SVART LINJE INOM NÄSTA 5 SEKUNDER ANTOG * /
digitalWrite (indicatorPin, hög); Onboard-LED lyser
för (jag = 0; jag < 320; i ++) {//320 avläsningar från varje sensor
för (j = 0; j < = 2, j ++) {//loop genom varje sensor
avläsningar [j] = analogRead(sensorPins[j]); få valuta
om (avläsningar [j] > blackPoints[j]) {//if aktuella värde är rivjärn än en olready sparas
blackPoints [j] = avläsningar [j]; lagra om policyn
}
Delay(2);
}
Delay(10);
}
digitalWrite (indicatorPin, låg); Onboard lysdioden slocknar
/ * beräkna "enhet steg" - 1/100 av skillnaden mellan vitt och svart för varje sensor
och omvandla vita punkter till int (korrigeringar) * /
för (j = 0; j < = 2, j ++) {
unitSteps [j] = (blackPoints [j] - whitePoints [j]) / 1000;
korrigeringar [j] = (int) (whitePoints [j] + 0,5);
}
Delay(2000); 2 sekunders fördröjning
/ * GÅ SIDLEDES (TILL HÖGER!) UNDER SVART LINJE INOM NÄSTA 5 SEKUNDER ANTOG * /
digitalWrite (indicatorPin, hög); Onboard-LED lyser
för (j = 0; j < = 2, j ++) {//to återanvända denna array, satt allt till 0
blackPoints [j] = 0;
}
för (jag = 0; jag < 320; i ++) {//320 avläsningar från varje sensor
för (j = 0; j < = 2, j ++) {//loop genom varje sensor
avläsningar [j] = (analogRead(sensorPins[j]) - corrections[j]) / unitSteps [j]; få valuta för varje i sista enheter
}
för (j = 0; j < = 2, j ++) {//loop genom tre sensormätningar
om (avläsningar [j] > blackPoints[j]) {//if nuvarande behandlingen är större än lagrade maxima
blackPoints [j] = avläsningar [j]; lagra om appicable
}
annars om (avläsningar [j] + 30 < blackPoints[j]) {//if behandlingen minskar (lagrade är större än nuvarande)
betweenState [j] = true; Ange i denna variabel att sensorn har flyttat över maximalt läsa (linje)
}
om (betweenState [0] == true & & betweenState [1] == false) {//if sensor förstabehandlingen har passerat sin maxima och andra har inte
om (betweenReadings [0] > avläsningar [0] + readings[1]) {//if lagrade summan av två sensormätningar är större än nuvarande summan
betweenReadings [0] = avläsningar [0] + avläsningar [1]. lagra i tillämpliga
}
}
annars om (betweenState [1] == true & & betweenState [2] == false) {//if sensor andrabehandlingen har passerat sin maxima och tredje har inte
om (betweenReadings [1] > avläsningar [1] + readings[2]) {//if lagrade summan av två sensormätningar är större än nuvarande summan
betweenReadings [1] = avläsningar [1] + avläsningar [2]. lagra i tillämpliga
}
}
Delay(2);
}
Delay(10);
}
digitalWrite (indicatorPin, låg); Onboard lysdioden slocknar
} / / / setup
void loop() {
/ * skriva ut resultat i följetong monitor * /
Serial.Print ("const int korrigeringar [3] = {");
Serial.Print(Corrections[0]);
Serial.Print(",");
Serial.Print(Corrections[1]);
Serial.Print(",");
Serial.Print(Corrections[2]);
Serial.println("};");
Serial.Print ("const float unitSteps [3] = {");
Serial.Print(unitSteps[0]);
Serial.Print(",");
Serial.Print(unitSteps[1]);
Serial.Print(",");
Serial.Print(unitSteps[2]);
Serial.println("};");
Serial.Print ("const float betweenReadings [2] = {");
Serial.Print(betweenReadings[0]);
Serial.Print(",");
Serial.Print(betweenReadings[1]);
Serial.println("};");
Serial.println("");
} / / / slinga