Stap 4: Arduino code - sensor kalibratie
Line na robot sensoren kalibratie script
Braian
***/
/*
HOE TE GEBRUIKEN:
Dit script uploaden.
Arduino heeft om te verblijven aangesloten op computer.
Sensoren moeten hun spanning geboden.
Plaats de robot helemaal op haar wit oppervlak uitgevoerd
vermoedelijk dus dat er zwarte lijn aan de linkerkant, is
maar niet in de weergave van sensoren.
Pers arduinos reset-knop.
Na 2 seconden moet pin 13 aan boord LED oplichten.
Witte oppervlakte kalibratie measurings zijn gedaan, terwijl de LED - ongeveer 2 sec brandt.
LED zal gaan na die.
Na een 2 seconden oplichten vertraging de LED opnieuw.
Nu heb je 5 seconden tot de robot zijwaarts overgaan met een zwarte lijn.
Lijn moet worden aan de linkerkant wanneer geconfronteerd met dezelfde manier als robot is gonna worden uitgevoerd.
U moet de robot links daarvan en ongeveer in rechte hoek naar de regel gaan.
Tijdens deze beweging die de maximale lezingen zijn genomen die optreden wanneer een enkele sensor direct boven de lijn is.
Geen haast, maar alle de sensoren moet over lijn als LED dooft na 5 sec.
Na een andere 2 seconden oplichten vertraging de LED nogmaals.
Nu heb je om te bewegen van de robot terug over de lijn, tegengesteld aan wat je deed in de laatste stap.
Het betekent gedurende 5 sec zet robot terug naar rechts over de lijn.
Belangrijk: deze tijd robot moet naar rechts verplaatsen - rechterkant sensor moet regel eerst voorbij!
Tijdens deze zijn gaan genomen maatregelen die zeggen, hoe laag de twee naast elkaar sensoren doen, wanneer lijn precies tussen de twee.
Measurings einde toen leidde dooft na 5 sec.
Begin seriële monitor.
Stop autoscroll en correctie waarden van elke opeenvolgende drie lijnen naar robots rijden script kopiëren.
*/
/ * sensor input pinnen * /
Const int sensorPins [] {A0, A1, A2} =; rechts, midden, links
/ * ingebouwde LED pin * /
Const int indicatorPin = 13;
/ * arrays voor het opslaan van sensor en berekende gegevens
drie sensoren in elke matrix:
0 - RECHTS, 1 - CENTER, 2 - LINKS * /
float lezingen [3]; sensor lezingen
zweven averageReadings [3] = {0, 0, 0}; gemiddelde lezingen
zweven whitePoints [3] = {0, 0, 0}; lezing op witte ondergrond
int blackPoints [3] = {0, 0, 0}; maximaal lezen tijdens het passeren over zwarte lijn
float unitSteps [3]; verschil tussen wit en zwart verdeeld met 100
int correcties [3]; witte punten als int
zweven peakDetect [3] = {0, 0, 0};
zweven betweenReadings [2] = {1024, 1024}; lezingen wanneer lijn inbetween twee sensoren, rechts midden, links-CENTER
Booleaanse betweenState [3] = {false, false, false}; helper om te weten welke minimum om op te slaan
/ * lus helper variabelen * /
int i;
int j;
VOID Setup {}
Serial.begin(9600); begin van seriële monitor output gegevens na measurings
pinMode (indicatorPin, OUTPUT); set nboard leidde pin om aan te geven van de meting staat
/ * start kalibratie na 2 seconden vertraging * /
delay(2000);
/ * METEN OP WITTE ONDERGROND VOOR ONGEVEER 2 SECONDEN AANGENOMEN * /
digitalWrite (indicatorPin, hoge); ingebouwde LED-lampje brandt
voor (ik = 0; ik < 125; i ++) {//125 lezingen van elke sensor
voor (j = 0; j < = 2; j ++) {//loop door elke sensor
lezingen [j] = analogRead(sensorPins[j]); optimaal te
/ * berekenen gemiddelde sensor waarden * /
whitePoints [j] = (whitePoints [j] * j + readings[j]) / (j + 1); gemiddelde van alle measurings genomen dit ver
delay(2);
}
delay(10);
}
digitalWrite (indicatorPin, laag); ingebouwde LED gaat uit
delay(2000); 2 seconden vertraging
/ * ZIJWAARTS GAAN OVER ZWARTE LIJN BINNEN DE VOLGENDE 5 SECONDEN AANGENOMEN * /
digitalWrite (indicatorPin, hoge); ingebouwde LED-lampje brandt
voor (ik = 0; ik < 320; i ++) {//320 lezingen van elke sensor
voor (j = 0; j < = 2; j ++) {//loop door elke sensor
lezingen [j] = analogRead(sensorPins[j]); optimaal te
Als (lezingen [j] > blackPoints[j]) {//if huidige waarde is groter dan één olready opgeslagen
blackPoints [j] = lezingen [j]; opslaan als aplicable
}
delay(2);
}
delay(10);
}
digitalWrite (indicatorPin, laag); ingebouwde LED gaat uit
/ * berekenen "eenheid stap" - 1/100ste van verschil tussen wit en zwart voor elke sensor
en transformeren van witte punten aan int (correcties) * /
voor (j = 0; j < = 2; j ++) {}
unitSteps [j] = (blackPoints [j] - whitePoints [j]) / 1000;
correcties [j] = (int) (whitePoints [j] + 0,5);
}
delay(2000); 2 seconden vertraging
/ * ZIJWAARTS GAAN (AAN DE RECHTERKANT!!!) OVER ZWARTE LIJN BINNEN DE VOLGENDE 5 SECONDEN AANGENOMEN * /
digitalWrite (indicatorPin, hoge); ingebouwde LED-lampje brandt
voor (j = 0; j < = 2; j ++) {//to gebruiken deze array, allemaal instellen op 0
blackPoints [j] = 0;
}
voor (ik = 0; ik < 320; i ++) {//320 lezingen van elke sensor
voor (j = 0; j < = 2; j ++) {//loop door elke sensor
lezingen [j] = (analogRead(sensorPins[j]) - corrections[j]) / unitSteps [j]; waarde voor elk in definitieve eenheden krijgen
}
voor (j = 0; j < = 2; j ++) {//loop via drie sensor lezingen
Als (lezingen [j] > blackPoints[j]) {//if huidige lezen groter is dan opgeslagen maxima
blackPoints [j] = lezingen [j]; opslaan als appicable
}
anders als (lezingen [j] + 30 < blackPoints[j]) {//if lezing afneemt (opgeslagen is groter dan de huidige)
betweenState [j] = true; geven in deze variabele die sensor heeft verplaatst over een maximum lezen (lijn)
}
Als (betweenState [0] == true & & betweenState [1] == false) {//if eerste sensorgegevens verstreken zijn maxima en ten tweede heeft niet
Als (betweenReadings [0] > lezingen [0] + readings[1]) {//if opgeslagen som van twee lezingen van de sensor is groter dan de som van de huidige
betweenReadings [0] = lezingen [0] + lezingen [1]; winkel indien van toepassing
}
}
anders als (betweenState [1] == true & & betweenState [2] == false) {//if tweede sensorgegevens verstreken zijn maxima en derde heeft niet
Als (betweenReadings [1] > lezingen [1] + readings[2]) {//if opgeslagen som van twee lezingen van de sensor is groter dan de som van de huidige
betweenReadings [1] = lezingen [1] + lezingen [2]; winkel indien van toepassing
}
}
delay(2);
}
delay(10);
}
digitalWrite (indicatorPin, laag); ingebouwde LED gaat uit
} / / / setup
void loop {}
/ * afdrukken van resultaten in seriële monitor * /
Serial.Print ("const int correcties [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("");
} / / / loop