Stap 9: Kalibreren de lijn detectoren
Dit is misschien een eenvoudige stap zal, maar met dit eenvoudige algoritme de robot de lijn volgen op dezelfde manier in verschillende tracks met verschillende lichtomstandigheden. Daarom moeten we de cny70 sensoren kalibreren? Want hoewel ik zei eerder deze sensor een 0 voor zwart en een 1024 voor white geeft, eigenlijk krijgen we niet bijna nooit een ronde 0-1024 omdat er geen track waar hun wit 100% van het licht en hun zwarte 0% weerspiegelt. In de echte wereld zullen we waarschijnlijk krijg een waarde, we kunnen noemen het een voor de donkerste donker van het spoor, en een andere waarde, oproep het B, voor de helderste wit. Het klopt 0 < = A < B = < = 1024. Hoe we de robot kalibreren? Voordat de robot begint na de regel zullen we verplaatsen de lijn volgen sensor-array te laten alle Lees volledig de zwarte en de witte gedeelte van de baan.
Dit is de code voor de kalibratie lezen (het heet voor de 5 seconden kalibratie keer)
void initLED(){ ///We initialize the read variables (this is called one time when the program starts) int x; for (x = 0;x < 8;x++){ amax[x] = 0; ///Amax is the value called B in the tutorial amin[x] = 1024; ///Amin is the value called A in the tutorial } } void CalRead(){ ///We read calibration values (this is called in the 5 seconds calibration period L_ROJO = T1000 < 500*6; ///We make the red led to blink int x; for (x = 0;x < 7;x++){ //For the first 7 line follower detectors /***Attention: We use T(x) because it is defined in the first part of the program and makes the line follower detectors to be in the right order 0 to 7 ***/ amax[x] = max(amax[x],T(x)); ///if we store a value higher than the last stored we replace it amin[x] = min(amin[x],T(x)); ///if we store a value lower than the last stored we replace it } ///The seventh sensor can not be acceded by using T(7). ///We don't use this sensor to use the line, we use it to read the sign that ///is given in some competitions to make the robot know there is a curve. Ignore it if you don't need it. amax[7] = max(amax[7],J(7)); amin[7] = min(amin[7],J(7)); }
Dus wanneer de kalibratie tijd eindigt, zullen we de 7 waarden lezen door de sensor in de C-serie. elke sensor heeft haar amin (A) en de waarde ervan amax (B). Klik vervolgens in het programma omzetten we gewoon in de waarde lezen (A-B) het bereik (0-1024) met behulp van eenvoudige wiskunde. Als het optreedt wij lezen een waarde minder than A dan wij overwegen we lezen A en het ocurrs lezen we een hogere waarde dan B dan wij overwegen we lezen B.
///This is just pseudo-code, does not work directly, only with learning proposes. ///In the real program I shared amax[x] is B and amin[x] is A int w = W[x]; ///W[x] goes from 0 to 1024 w = min(w,B); //If w is higher than B, then w is B w = max(w,A); //If w is lower than A, then w is A w -= A; ///We make w logically go from 0 to B-A w *= 1024; ///Now w will go from 0 to (B-A)*1024 w /= (B-A); ///And now we make w to go from 0 to 1024