Un robot de ce genre peut être réalisé avec un Arduino, ou avec un autre microcontrôleur, ou sans microcontrôleur du tout. Dans ce tutoriel, j'utilise un Raspberry Pi programmé en Python.
Voici tout d'abord une courte vidéo montrant le robot suiveur de ligne en pleine action.
Nous réutilisons la plate-forme robotique mise au point dans l'article Robot Raspberry Pi; il s'agissait d'un robot contrôlable par Wi-Fi, et nous n'aurons qu'à lui ajouter des capteurs et à le programmer différemment. Je vous invite donc à consulter cet article pour plus d'informations sur la façon de brancher les moteurs au Raspberry Pi.
Connexion des capteurs optiques
Dans mon précédent article (Robot suiveur de ligne, version Raspberry Pi (1): fabrication du capteur), j'ai conçu un capteur double qui produit un signal logique de 3,3 V lorsque la surface est blanche, et de 0 V lorsque la surface est noire. Notez qu'il est également possible de vous procurer un capteur prêt à l'emploi, spécialement conçu pour ce genre d'utilisation.
J'ai branché la sortie du capteur de gauche à la broche BCM 17 (BOARD 11) du Raspberry Pi et la sortie du capteur de droite à la broche BCM 27 (BOARD 13). Il faut bien sûr alimenter les capteurs (broches GND et 3,3 V). J'ai conçu mon capteur pour que les LEDs soient alimentées en 5 V, ce qui n'est pas nécessairement le cas si vous utilisez un autre modèle de capteur.
Les capteurs sont placés à l'avant du robot, et orientés vers le sol.
Script en langage Python
Au démarrage du script, le robot doit être positionné de façon à ce qu'aucun des deux capteurs ne soit sur la ligne: l'état initial de chaque capteur est alors déterminé (lignes 41 et 42).
Ensuite, le sketch vérifie continuellement l'état des capteurs (lignes 46 et 47).
- Si les deux capteurs sont dans leur état initial, le robot continue tout droit.
- Si le capteur de gauche n'est plus dans son état initial (il est donc au-dessus de la ligne), le robot tourne à gauche.
- Si le capteur de droite n'est plus dans son état initial (il est donc au-dessus de la ligne), le robot tourne à droite.
- Si les deux capteurs ne sont pas dans leur était initial (ils sont tous les deux sur la ligne), le robot s'arrête (on peut mettre une ligne perpendiculaire pour indiquer la fin du parcours).
-
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding: latin-1 -*- | |
''' | |
Robot suiveur de ligne, version Raspberry Pi. | |
Pour plus d'informations: | |
https://electroniqueamateur.blogspot.com/2020/04/robot-suiveur-de-ligne-version_13.html | |
''' | |
import RPi.GPIO as GPIO | |
GPIO.setmode(GPIO.BOARD) #notation board plutôt que BCM | |
Moteur1A = 16 ## premiere sortie du premier moteur, broche 16 | |
Moteur1B = 18 ## deuxieme sortie de premier moteur, broche 18 | |
Moteur1E = 22 ## enable du premier moteur, broche 22 | |
Moteur2A = 19 ## premiere sortie du deuxieme moteur, broche 19 | |
Moteur2B = 21 ## deuxieme sortie de deuxieme moteur, broche 21 | |
Moteur2E = 23 ## enable du deuxieme moteur, broche 23 | |
capteurGauche = 11 # capteur optique du côté gauche, broche 11 | |
capteurDroite = 13 # capteur optique du côté droit, broche 13 | |
## ces 6 broches du Raspberry Pi sont des sorties: | |
GPIO.setup(Moteur1A,GPIO.OUT) | |
GPIO.setup(Moteur1B,GPIO.OUT) | |
GPIO.setup(Moteur1E,GPIO.OUT) | |
GPIO.setup(Moteur2A,GPIO.OUT) | |
GPIO.setup(Moteur2B,GPIO.OUT) | |
GPIO.setup(Moteur2E,GPIO.OUT) | |
# ces 2 broches sont des entrées; | |
GPIO.setup(capteurGauche,GPIO.IN) | |
GPIO.setup(capteurDroite,GPIO.IN) | |
# Initialisation des capteurs (on suppose qu'ils sont de part et d'autre de la ligne) | |
initialGauche = GPIO.input(capteurGauche) | |
initialDroite = GPIO.input(capteurDroite) | |
while True: | |
etatGauche = GPIO.input(capteurGauche) | |
etatDroite = GPIO.input(capteurDroite) | |
# s'il faut avancer en ligne droite | |
if etatGauche == initialGauche and etatDroite == initialDroite: | |
GPIO.output(Moteur1A,GPIO.HIGH) | |
GPIO.output(Moteur1B,GPIO.LOW) | |
GPIO.output(Moteur1E,GPIO.HIGH) | |
GPIO.output(Moteur2A,GPIO.HIGH) | |
GPIO.output(Moteur2B,GPIO.LOW) | |
GPIO.output(Moteur2E,GPIO.HIGH) | |
# s'il faut tourner à gauche | |
if etatGauche != initialGauche and etatDroite == initialDroite: | |
GPIO.output(Moteur1A,GPIO.HIGH) | |
GPIO.output(Moteur1B,GPIO.LOW) | |
GPIO.output(Moteur1E,GPIO.HIGH) | |
GPIO.output(Moteur2E,GPIO.LOW) | |
# s'il faut tourner à droite | |
if etatGauche == initialGauche and etatDroite != initialDroite: | |
GPIO.output(Moteur1E,GPIO.LOW) | |
GPIO.output(Moteur2A,GPIO.HIGH) | |
GPIO.output(Moteur2B,GPIO.LOW) | |
GPIO.output(Moteur2E,GPIO.HIGH) | |
# s'il faut arrêter | |
if etatGauche != initialGauche and etatDroite != initialDroite: | |
GPIO.output(Moteur1E,GPIO.LOW) | |
GPIO.output(Moteur2E,GPIO.LOW) |
-
À lire aussi:
- Un robot similaire à celui-ci, mais basé sur une carte Arduino Uno.
- D'autres robots à base de Raspberry Pi: robot contrôlé par WiFi, robot éviteur d'obstacles
- D'autres projets de rotobotique
- D'autres projets impliquant le Raspberry Pi
Yves Pelletier (Twitter, Facebook)
Aucun commentaire:
Enregistrer un commentaire