Moteurs
La propulsion de l’AlphaBot est de type différentielle : deux moteurs indépendants propulsent et dirigent le robot.
Principe du contrôle des moteurs
Chaque moteur est piloté par un circuit dédié :
Ce circuit comprend :
- un hacheur de tension pour faire varier la tension moyenne (et donc la vitesse de rotation du moteur) (voir des explications sur les signaux PWM)
Voici les correspondances entre les ports de communications du Raspberry et les interfaces de commande du pilote moteur :
Moteur gauche | Moteur droit | |
nom de l’interface | ENA | ENB |
Arduino UNO | D5 | D6 |
Raspberry Pi |
GPIO6 | GPIO26 |
- un pont en H (L298P) pour modifier le sens de rotation
Voici les correspondances entre les ports de communications du Raspberry ou de l’Arduino , ainsi que les états qu’ils doivent prendre (LOW
ou HIGH
) pour obtenir le comportement moteur attendu :
Arrêt (moteur libre) |
Avant | Arrière | Arrêt (moteur freiné) |
||||
![]() |
![]() |
![]() |
![]() |
||||
IN+ | IN- | IN+ | IN- | IN+ | IN- | ||
LOW | LOW | HIGH | LOW | LOW | HIGH | pas possible ! |
Moteur gauche | Moteur droit | |||
IN+ | IN- | IN+ | IN- | |
nom de l’interface | IN1 | IN2 | IN3 | IN4 |
Arduino UNO | A0 | A1 | A2 | A3 |
Raspberry Pi | GPIO12 | GPIO13 | GPIO20 | GPIO21 |
Programmation avec Arduino
Bibliothèque
Pour utiliser plus simplement le détecteur de ligne, il faut installer la bibliothèque AlphaBot.
Elle procure aux programmes une classe AlphaBot
représentant le traqueur. Ainsi on peut créer un objet (appelé par exemple bot
) avec la ligne suivante, placé en début de programme (avant la fonction setup
) :
AlphaBot bot = AlphaBot();
Gestion des mouvements
Deux méthodes de la classe AlphaBot sont intéressantes :
- la méthode
.MotorRun
, qui attend deux arguments de typeint
(Lspeed
etRspeed
) représentant la vitesse angulaire des roues Gauche et Droite.
Lspeed
etRspeed
doivent être compris entre-255
et255
- la méthode
.Brake
, qui permet d’arrêter les deux moteurs.
Le petit programme ci-dessous montre comment les utiliser :
#include "AlphaBot.h" AlphaBot bot = AlphaBot(); void setup() { } void loop() { delay(1000); bot.MotorRun(-250,-250); delay(1000); bot.Brake(); }
Programmation en Python
Initialisation
Pour gérer les ports du Raspberry, il faut importer la bibliothèque Python RPi.GPIO
:
import RPi.GPIO as GPIO
Remarque : le nom derrière le as permet dans la suite du programme d’utiliser le module sous le nom
GPIO
au lieu deRPi.GPIO
, c’est plus court !
Il faut ensuite choisir le mode d’adressage, il en existe plusieurs, retenons simplement le mode BCM :
GPIO.setmode(GPIO.BCM) #GPIO.setmode(GPIO.BOARD) # autre mode d'adressage
On peut obtenir des infos (adressage, mode, état, …) sur les ports en tapant
gpio readall
dans un Terminal Linux :
Configuration des ports
Un port ne peut avoir qu’un seul mode à la fois : entrée (GPIO.IN
) ou sortie (GPIO.OUT
).
Il faut configurer chaque port avant son utilisation :
GPIO.setup(CH, GPIO.IN) # broche CH est une entrée numérique GPIO.setup(CH, GPIO.OUT) # broche CH est une sortie numérique GPIO.setup(CH, GPIO.OUT, initial = GPIO.HIGH)# broche CH est une sortie initialement à l’état haut
Exemple : pour configurer le port 12 en mode sortie avec l’état initial BAS :
GPIO.setup(12, GPIO.OUT, initial = GPIO.LOW)
Selon le circuit que l’on y connecte, il faut parfois utiliser les résistances de pull-up ou de pull-down internes au RPi, pour les ports configurés en mode entrée :
GPIO.setup(CH, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(CH, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
Lecture d’un port d’entrée
etat = GPIO.input(CH)
Écriture sur un port de sortie
GPIO.output(CH, GPIO.LOW) GPIO.output(CH, GPIO.HIGH)
Signal PWM
Les ports du RPi sont capables de générer des signaux PWM.
p = GPIO.PWM(CH, frequence) # fréquence en Hz p.start(rapport_cyclique) # rapport_cyclique entre 0 et 100 p.ChangeFrequency(nouvelle_frequence) p.ChangeDutyCycle(nouveau_rapport_cyclique) p.stop()
Module AlphaBot
Un module Python « maison », nommé AlphaBot.py
, permet un accès rapide aux principales fonctions de pilotage des moteurs :
class AlphaBot(builtins.object) | AlphaBot(in1=12, in2=13, ena=6, in3=20, in4=21, enb=26) | | __init__(self, in1=12, in2=13, ena=6, in3=20, in4=21, enb=26) | Initialize self. See help(type(self)) for accurate signature. | | backward(self) | Action sur le pont en H : | Les deux moteurs dans le sens ARRIERE | | forward(self) | Action sur le pont en H : | Les deux moteurs dans le sens AVANT | | left(self) | Action sur le pont en H : | Moteur Gauche dans le sens AVANT | Moteur Droit dans le sens ARRIERE | | right(self) | Action sur le pont en H : | Moteur Gauche dans le sens ARRIERE | Moteur Droit dans le sens AVANT | | setMotor(self, left, right) | | setPWMA(self, value) | Change le rapport cyclique moteur Gauche | 0 <= value <= 100 | | setPWMB(self, value) | Change le rapport cyclique moteur Droit | 0 <= value <= 100 | | stop(self) | Action sur le pont en H : | Les deux moteurs ARRETES
Téléchargement : AlphaBot
Utilisation
with AlphaBot() as Ab: Ab.stop()