Stap 2: Ontleden ReadOptical() methode
Zoals ik al zei er zijn een paar typefouten in het commentaar van de code in linefollow.ino.Every loop de programma-aanroepen de volgende function:sensor_in=line_following.read_optical();
De commentaren voor deze read_optical()-methode leest het volgende:
Rendement
0 × 000 optical1 zwart
0x0ff optical1 wit
0 × 100 optical1 wit
0x1ff optical1 zwart
0x2XX niet klaar; geen gebruik maken van deze waarde
Eigenlijk moet de volgende
Rendement
0 × 000 optical1 zwart
0xFF optical1 wit
0 × 100 optical2 wit
0x1ff optical2 zwart
0x2XX niet klaar; geen gebruik maken van deze waarde (ofwel sensor kan deze waarde retourneren)
Eigenlijk moeten 0x0ff 0xff
Verwijs naar blogpost Software deel 3
U zult zien in de paragrafen hieronder het belang van deze typefouten. (heeft te maken met het lezen van elke andere sensor) Op de regel na robot zijn er twee optische sensoren, telkens als de loop-functie de linefollow.ino schets oproepen een methode om te zien voert als een van de sensoren ziet licht of donker.
Op een micro-controller, zoals de Arduino, is één seconde een zeer lange tijd. De loop-functie kunt uitvoeren veel duizend keer per seconde. Hoe lang elke lus duurt, hangt af van hoeveel programmaopdrachten plaatsvinden. Sommige instructies duurt langer dan andere instructies uitvoeren.
Instructie (wat functies en methoden zijn samengesteld uit) uitvoeringstijd wordt gemeten in cycli van CPU-klok. De Arduino standaard werkt bij 16 MHz of 16 miljoen klok cycli een seconde. De schets van de linefollow.ino voert sommige vrij eenvoudige logica.
Na het opzetten van sommige variabelen, roept de loop een functie om te zien of een sensor licht is of donker, afhankelijk van het antwoord wat fancy logica wordt uitgevoerd om het antwoord op een waarde van 0, 1, 2 of 3. Deze waarden worden vervolgens gebruikt om te vertellen van de motoren te ofwel gaan naar voren, links of rechts.
Elke 15 milliseconden de lus-programma wordt verteld om te schakelen en te lezen van de andere sensor. Dus vertel hebt u een programma dat lussen lezen van de eerste sensor, converteert het antwoord op 0, 1, 2 of 3, de motoren wat te doen, de andere sensor Lees, converteer vervolgens het antwoord op 0, 1, 2 of 3 en dan de motoren vertellen wat te doen. In veel gevallen, afhankelijk van de waarden van de variabelen Actie1 en Actie2, worden de instructies voor het controleren van de motoren overgeslagen. Verwijzen naar een latere blogpost.
Deze operaties zijn weer gedaan op duizenden keren per seconde. De rest van deze blog en later blogs gaan om je te leren wat er gebeurt met de fancy logica die leest de sensor en converteert het antwoord op 0, 1, 2 of 3. Het volgende codesegment is de fancy code die de sensor lezingen worden omgezet in een waarde-of0, 1, 2 of 3. Deze code omvat sommige programma-instructies die nogal verwarrend voor newmicro-controller programmeurs kunnen.
Raadpleeg een andere blog post dat ik schreef "Tutorial – beetje bonzen en Booleaanse Math zonder the Math" deze tutorial gaat hand in hand met het begrip van het volgende codesegment:
Als ((sensor_in & 0xf00) == 0)
sensorValue1 = sensor_in & 0xff;
anders als ((sensor_in & 0xf00) >> 8 == 1)
sensorValue2 = sensor_in & 0xff;
Als (sensorValue1 == 0x00) Actie1 = Actie1 & 0xfe;
Als (sensorValue1 == 0xFF) Actie1 = Actie1 | 0x01;
Als (sensorValue2 == 0x00) Actie1 = Actie1 | 0x02;
Als (sensorValue2 == 0xFF) Actie1 = Actie1 & 0xfd;
Dit segment van code maakt gebruik van drie speciale operators (instructies die op bepaalde waarden werken) de code gebruikt de volgende binaire operatoren: & operator, bitsgewijze AND, | Bitsgewijze OR operatorand de >> Bitwise recht Shift exploitant.
(Lees de handleiding)