Etape 5: Mise en œuvre de l’algorithme « Main gauche sur le mur » au Code de l’Arduino
Dès que nous aurons la fonction readLFSsensors() modifiée pour inclure l’extra 2 capteurs, nous pouvons réécrire la fonction Loop pour exécuter l’algorithme comme décrit sur la dernière étape :
void loop()
{
readLFSsensors() ;
interrupteur (mode)
{
affaire NO_LINE :
motorStop() ;
goAndTurn (gauche, 180) ;
rupture ;
affaire CONT_LINE :
runExtraInch() ;
readLFSsensors() ;
Si (mode == CONT_LINE) mazeEnd() ;
d’autre goAndTurn (gauche, 90); / / ou c’est un "T" ou "Croix"). Dans les deux cas, va à gauche
rupture ;
affaire RIGHT_TURN :
runExtraInch() ;
readLFSsensors() ;
Si (mode == NO_LINE) goAndTurn (droit, 90);
rupture ;
affaire LEFT_TURN :
goAndTurn (gauche, 90) ;
rupture ;
affaire FOLLOWING_LINE :
followingLine() ;
rupture ;
}
}
Quelques nouvelles fonctions apparaissent ici.
followingLine() est la même utilisée avec le Robot de ligne suivante, où si c’est seulement après une ligne, il doit calculatePID() ; et contrôler les moteurs en fonction des valeurs PID: motorPIDcontrol() ;
runExtraInch() : Fera avancer le robot un peu. Combien le robot se déroulera dépendra du temps que vous utilisez dans la fonction de retard, avant de vous commandez le moteur s’arrêter.
Sub runExtraInch(void)
{
motorPIDcontrol() ;
Delay(extraInch) ;
motorStop() ;
}
goAndTurn (direction, angle): Cette fonction spéciale est importante, car vous ne pouvez pas activer le robot que vous rendrez vite compte du type d’intersection que vous êtes. N’oubliez pas que nous avons projeté un Robot différentiel que lorsque vous faites un tour à tour, il « tourne autour de son axe » et donc, pour déplacer 90o et suivre en permanence la ligne, le Centre des roues doit être aligné avec le centre de l’intersection. Une fois que la ligne des censeurs sont en avance sur son axe, vous devez exécuter le robot vers l’avant afin de les aligner. La constante de temps adjGoAndTurn doit être ajustée en fonction de la distance entre l’axe et capteur de ligne ("d"), la vitesse et taille des roues (voir la photo d’illustration).
void goAndTurn (int direction, int degrés)
{
motorPIDcontrol() ;
Delay(adjGoAndTurn) ;
motorTurn (direction, degrés) ;
}
À ce stade le robot est en fait « résoudre un labyrinthe » ! Vous avez juste fini le « premier Pass ». N’importe pas où vous commencez à l’intérieur d’un labyrinthe, vous arriverez à la fin.
Ci-dessous, un test de cette phase du projet :