Stap 5: Uitvoering van het "Linker Hand op de muur" algoritme op Arduino Code
Zodra we de functie van de readLFSsensors() gewijzigd hebben zodat de extra 2 sensoren, kunnen we de lus functie als u de algoritme beschreven in de laatste stap opnieuw schrijven:
void loop
{
readLFSsensors();
schakelaar (modus)
{
Case NO_LINE:
motorStop();
goAndTurn (links), 180;
breken;
Case CONT_LINE:
runExtraInch();
readLFSsensors();
Als (modus == CONT_LINE) mazeEnd();
anders goAndTurn (links), 90; / / of is het een "T" of "Cross"). In beide gevallen gaat naar links
breken;
Case RIGHT_TURN:
runExtraInch();
readLFSsensors();
Als (modus == NO_LINE) goAndTurn (recht, 90);
breken;
Case LEFT_TURN:
goAndTurn (LEFT, 90);
breken;
Case FOLLOWING_LINE:
followingLine();
breken;
}
}
Enkele nieuwe functies wordt hier weergegeven.
followingLine() is hetzelfde gebruikt met de volgende regel Robot, waar als het alleen op een regel volgt is, het calculatePID() moet; en controle van de motoren afhankelijk van PID waarden: motorPIDcontrol();
runExtraInch(): Zal duwen de robot vooruit net een beetje. Hoeveel de robot wordt uitgevoerd zal afhangen van de tijd die u in de functie van de vertraging, gebruikt voordat u de motor om te stoppen met command.
VOID runExtraInch(void)
{
motorPIDcontrol();
delay(extraInch);
motorStop();
}
goAndTurn (richting, hoek): Deze speciale functie is belangrijk, omdat je niet kan draai de robot zoals snel je je realiseert dat het type snijpunt die u bent. Vergeet niet dat wij een differentiële Robot dat bij het maken van bochten, het "draait zich om haar bijl" en dus, om te verplaatsen 90o en continu volgen de lijn, het centrum van de wielen moet worden afgestemd op het midden van de kruising geprojecteerd. Zodra de lijn van censoren zijn voorsprong op de bijl, moet u de robot vooruit uitvoeren om te lijnen. De constante van tijd adjGoAndTurn moet worden aangepast afhankelijk van de afstand tussen de bijl en sensor lijn ("d"), de snelheid en de grootte van de wielen (Zie de afbeelding ter illustratie).
VOID goAndTurn (int richting, int graden)
{
motorPIDcontrol();
delay(adjGoAndTurn);
motorTurn (richting, graden);
}
Op dit punt is de robot in feite "oplossen van een doolhof"! U hebt alleen de "eerste Pass". Geen kwestie waar u in een doolhof, zal u het einde hebt bereikt.
Balg, een test van deze fase van het project: