Dexter Industries propose des cartes d’extension pour Raspberry Pi. Dans cet article, nous allons nous intéresser à la carte BrickPi permettant de piloter les moteurs et senseurs Lego MindStorms. Nous verrons comment piloter notre robot Lego à l’aide d’un joypad. Nous développerons notre programme grâce au langage Python.
Lorsqu’on cherche des vidéos de robots Lego sur Internet, on trouve une multitude de résultats. Ces résultats vont d’un simple robot inerte, tel qu’un robot Ninjago à des robots beaucoup plus complexes, tels que les modèles Mindstorms permettant par exemple de résoudre des Rubicubes. Dans cet article, nous allons commencer en douceur en pilotant un robot Lego à chenilles à l’aide d’un JoyPad.
1. Le matériel
Pour commencer, réalisons un petit robot en Lego, voici notre liste de matériel :
- 1 RaspBerry Pi. Dans notre exemple, nous utiliserons un Raspberry Pi Modèle 1 B ;
- 1 carte SD ou micro SD en fonction du modèle de Raspberry Pi choisi ;
- 1 carte d’extension BrickPi [1]. Il existe 3 versions : BrickPi, BrickPi+ et BrickPi3. BrickPi et BrickPi+ utilisent la même librairie, il faudra prendre une nouvelle librairie pour le BrickPi3. Dans notre article, nous utiliserons le vieux modèle : BrickPi ;
- 2 moteurs Lego MindStorms. Dans notre exemple, nous prendrons 2 « EV3 Large Servo Motor » modèles 45502 ;
- 1 Lego Technic pour construire notre robot motorisé. Dans notre exemple, nous utiliserons un vieux modèle Lego Technic Bulldozer numéro 6092224 ;
- 1 joypad reconnu sous Linux. Ici, nous utiliserons un Logitech F710 ;
- 8 piles AA, de préférence rechargeables, pour alimenter le Raspberry Pi et les moteurs Lego MindStorms.
2. Construction du robot Lego
C’est la partie où nous pouvons laisser libre cours à notre imagination. Tout est permis, la seule contrainte pour notre robot est l’utilisation d’un moteur permettant de tourner à droite et d’un autre moteur pour tourner à gauche. Pour se simplifier la vie, il est recommandé d’utiliser des chenilles.
Vous trouverez sur le site MecaBricks notre modèle à l’adresse suivante :
3. Configuration logicielle
Nous supposerons ici que nous disposons d’un système Raspbian opérationnel. Par exemple, la version 2018-11-13-raspbian-stretch-lite.img [2].
Dexter Industries propose un script d’installation complètement automatisé. Attention, ce script finit par redémarrer le Raspberry Pi. Le script n’installe pas git, commençons donc par l’installer :
sudo aptitude install git
Si vous posséder un BrickPi ou un BrickPi+, il faudra lancer la commande suivante :
sudo curl -kL dexterindustries.com/update_brickpi_plus | bash
Si vous posséder un BrickPi3, il faudra lancer la commande suivante :
sudo curl -kL dexterindustries.com/update_brickpi3 | bash
La dernière chose dont nous avons besoin, c’est de la librairie python inputs nous permettant de gérer notre joypad :
sudo pip install inputs
4. Principe et fonctionnement
Le but du programme que nous allons écrire est très simple : pouvoir piloter notre robot à l’aide d’un joypad.
Nous allons développer notre programme en Python. Il nous faut donc 2 bibliothèques :
- inputs : pour nous permettre de récupérer les événements sur le joypad ;
- BrickPi : pour nous permettre de piloter les 2 moteurs de notre robot Lego.
Nous allons piloter le moteur gauche du robot par la gâchette gauche du joypad et le moteur droit par la gâchette droite.
Les valeurs de la pression sur la gâchette se situent dans l’intervalle 0 à 255. Valeurs retournées par la bibliothèque inputs.
Les valeurs d’entrée du moteur se situent entre -255 et +255 avec un moteur à l’arrêt à 0.
Nous pouvons donc transmettre directement les valeurs récupérées du joypad vers les moteurs.
Nous devons prendre en suite en considération 2 paramètres :
- la valeur minimale du moteur pour que celui-ci fasse avancer le robot (variable VITESSE_MIN) ;
- les valeurs de vitesse que l’on veut transmettre au robot. Dans l’absolu, nous pourrions tout transmettre, mais le temps de prise en compte de la vitesse par la librairie BrickPi induit de la latence. Nous définissons donc ici un seuil au-dessus duquel nous propagerons les ordres (variable SEUIL_DETECTION).
Vous pouvez visualiser tout ceci sur le schéma.
5. Programmation
01: from inputs import get_gamepad
02: from BrickPi import *
03:
04: VITESSE_MIN=65
05: SEUIL_DETECTION=20
06:
07: BOUTON_FIN = 'BTN_START'
08: BOUTON_AV_AR = 'BTN_SOUTH'
09:
10: infos = [[PORT_C,0,'ABS_Z'],[PORT_B,0,'ABS_RZ']]
11:
12: BrickPiSetup()
13: BrickPiSetupSensors()
14: BrickPi.Timeout=10000
15: BrickPiSetTimeout()
16: for moteur in range(2):
17: BrickPi.MotorEnable[infos[moteur][0]] = 1
18:
19: try:
20: fin=False
21: avant=True
22:
23: while not fin:
24: events = get_gamepad()
25: for event in events:
26: if (event.code == BOUTON_FIN):
27: fin=True
28: elif (event.code == BOUTON_AV_AR):
29: if ((infos[0][1] == 0) and (infos[1][1] == 0)) :
30: avant = (event.state == 1 ) ^ avant
31: else :
32: for moteur in range(2):
33: if (event.code == infos[moteur][2]):
34: if (abs(infos[moteur][1]-event.state) >= SEUIL_DETECTION):
35: infos[moteur][1]=event.state
36: if (infos[moteur][1] < VITESSE_MIN):
37: infos[moteur][1] = 0
38: BrickPi.MotorSpeed[infos[moteur][0]] = infos[moteur][1] * (1 if avant else -1)
39: BrickPiUpdateValues()
40:
41: except Exception as e:
42: print("Joypad non trouvé" )
43: print(e)
44:
45: for moteur in range(2):
46: BrickPi.MotorSpeed[infos[moteur][0]] = 0
47:
48: BrickPiUpdateValues()
Voici une description du fonctionnement de notre programme.
En lignes 01 et 02, nous chargeons les librairies dont nous avons besoin.
En lignes 04 et 05, définition de la vitesse minimale pour un moteur, ainsi que du seuil de détection.
En lignes 07 et 08, définition des boutons que nous allons utiliser pour mettre fin au programme ou pour basculer de marche avant à marche arrière.
En ligne 10, nous définissons les informations pour faire fonctionner notre robot. Voici la description :
[[MoteurGauche,VitesseGauche,JoypadGauche],[MoteurDroite,VitesseDroite,JoypadDroite]]
Des lignes 12 à 17, nous initialisons BrickPi. En ligne 17, nous spécifions où se trouvent les moteurs que nous voulons piloter (dans notre cas PORT_C et PORT_B).
En ligne 19, nous gérons le cas où il y aurait un problème, par exemple, l’impossibilité de trouver un joypad. Dans un tel cas, nous afficherons un message d’erreur : lignes 41 à 42.
En lignes 20 et 21, nous créons 2 variables, la première fin pour déterminer la fin du programme, la seconde avant pour savoir si le robot est en marche avant ou en marche arrière.
En ligne 23, nous bouclons tant que la fin du programme n’est pas déclenchée.
En ligne 24, nous récupérons les actions sur le joypad, nous traitons ces actions en ligne 25.
En lignes 26 et 27, nous détectons la fin du programme.
En ligne 28, 29 et 30, nous détectons si l’on passe la marche arrière.
En ligne 32 et 33 pour chacun des deux moteurs, si l’axe de joypad correspondant change de valeur, alors :
Si le seuil de détection a été dépassé (ligne 34), alors :
On enregistre la valeur de la nouvelle vitesse (ligne 35). Si cette valeur est en dessous de la valeur minimale, la vitesse du moteur reste à zéro (ligne 36).
On envoie les informations de vitesse et de sens au moteur et on applique les changements (lignes 38 et 39).
Entre les lignes 45 à 48 il s’agit de la fin du programme. On passe les vitesses de moteur à 0.
On pourra lancer automatiquement le programme au lancement du Raspberry Pi en rajoutant la ligne :
python /home/pi/robot.py &
dans le fichier /etc/rc.local. Il faudra rajouter la ligne juste avant le exit 0.
Conclusion
Maintenant que nous savons piloter notre robot à l’aide d’un joypad, l’étendue des possibles est infinie :
- rajouter la camera Raspberry à notre Pi ou bien une webcam et piloter notre robot à l’aide de reconnaissance d’image en OpenCV ;
- rajouter des senseurs MindStorms : palpeurs, détecteurs de distance… pour détecter les obstacles ;
- utiliser GPIO pour créer des détecteurs en tout genre : obstacle, distance…
Et pour finir, n’oubliez pas de partager vos créations.
Références
[1] BrickPi sur le site Dexter Industries : https://www.dexterindustries.com/brickpi/
[2] Site de téléchargement de RaspBian : https://www.raspberrypi.org/downloads/raspbian/