lundi 13 avril 2020

Robot suiveur de ligne, version Raspberry Pi (2): Assemblage et programmation

Le classique robot suiveur de ligne est souvent une des premières réalisations d'un roboticien amateur: vous tracez une trajectoire sombre sur fond clair (ou une trajectoire claire sur fond sombre), et un véhicule autonome suit docilement cette trajectoire grâce à des capteurs optiques.

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.


Assemblage du châssis, connexion des moteurs

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).
-
#!/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:



Yves Pelletier (TwitterFacebook)

Aucun commentaire:

Enregistrer un commentaire