Contrôler vos modèles Lego au joypad à l'aide de BrickPi

Magazine
Marque
Hackable
Numéro
29
Mois de parution
avril 2019
Domaines


Résumé

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.


Body

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

 

IMGP6292

 

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

 

modele

 

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

 

 

explications

 

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/

 



Articles qui pourraient vous intéresser...

Prise en main de la NVIDIA Jetson Nano

Magazine
Marque
GNU/Linux Magazine
Numéro
247
Mois de parution
avril 2021
Domaines
Résumé

Les cartes de type Raspberry Pi ne sont pas forcément les plus adaptées pour y faire tourner des programmes mettant en œuvre des réseaux de neurones en embarqué. Aussi, de nouvelles cartes dédiées à l’IA apparaissent et nous allons découvrir dans cet article l’une de ces cartes, la Jetson Nano de NVIDIA.

Arithmétique sur divers systèmes embarqués aux ressources contraintes : les nombres à virgule fixe

Magazine
Marque
GNU/Linux Magazine
HS n°
Numéro
113
Mois de parution
mars 2021
Domaines
Résumé

Tracer les fractales de Mandelbrot ou de Newton sur de petits microcontrôleurs 8 bits ou 32 bits nous donne l’opportunité d’appréhender la représentation des nombres en virgule fixe pour une implémentation efficace de l’arithmétique – même sur des nombres complexes – sur systèmes embarqués à ressources réduites. Pouvoir tester le même code sur une multitude de plateformes impose de structurer son code pour séparer la partie algorithmique et l’accès aux ressources matérielles : nous allons proposer une architecture de code et de Makefile compatible à la fois avec des tests sur PC et sur diverses architectures de microcontrôleurs, en faisant appel aux stubs.

CrossDev sous Eclipse

Magazine
Marque
GNU/Linux Magazine
HS n°
Numéro
112
Mois de parution
janvier 2021
Domaines
Résumé

Le développement logiciel nécessite l’utilisation d’outils pour l’écriture, la compilation et le débogage de code. La prise en main de ces outils n’est pas toujours évidente, alors lorsqu’on en maîtrise un, autant l’utiliser dans le maximum de cas. Eclipse permet cela et nous allons le voir dans le cas du développement embarqué.

Facilitez le déploiement de vos Raspberry Pi en créant vos propres images préconfigurées

Magazine
Marque
Hackable
Numéro
35
Mois de parution
octobre 2020
Domaines
Résumé

Ne vous est-il pas arrivé d'avoir un Raspberry Pi et sa carte mémoire sans écran ni clavier et ni souris à proximité pour le configurer lors de sa mise en service ou tout bonnement, lorsque vous souhaitez mettre en route votre projet basé sur Raspberry Pi ? Comme nombre d'applications industrielles ou domotiques, il est possible de préparer une carte mémoire avec une préconfiguration qui permet un tel démarrage. C'est ce que nous allons voir dans cet article.

MiSTer : La solution rétro ultime ?

Magazine
Marque
Hackable
Numéro
35
Mois de parution
octobre 2020
Domaines
Résumé

Imaginez, un matériel unique capable de simuler fidèlement n'importe quel ordinateur, console et borne d'arcade rétro, sans émulation et vous donnant accès à une collection presque infinie de programmes, de démos et de jeux. Le tout compatible avec du matériel moderne (HDMI, USB, etc.), activement développé et accessible pour un budget raisonnable (mais pas économique pour autant). Cette solution existe, c'est MiSTer !