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/

 

Sur le même sujet

Contrôler vos modèles LEGO Powered Up au Nunchuk à l'aide de votre Arduino

Magazine
Marque
Hackable
Numéro
33
|
Mois de parution
avril 2020
|
Domaines
Résumé

Dans cet article, nous allons voir comment piloter un robot LEGO Powered Up à l’aide d’un Nintendo Nunchuk, grâce à un Arduino. Nous allons installer les librairies nécessaires pour pouvoir piloter notre modèle Powered Up et accéder aux informations du Nunchuk. Nous développerons ensuite notre programme de contrôle en C.

Maîtriser la sécurité de son accès Internet avec OpenWRT

Magazine
Marque
Linux Pratique
Numéro
117
|
Mois de parution
janvier 2020
|
Domaines
Résumé

Nous allons voir dans cet article comment installer le système GNU/Linux embarqué de type OpenWRT. OpenWRT est un système GNU/Linux pour les matériels embarqués et pour les matériels de types routeurs et box. Il constitue donc la part essentielle pour se libérer des GAFA. C’est un système léger, rapide et performant pour administrer et contrôler son accès Internet. Ce système est optimisé pour la gestion des ressources et supporte de nombreux routeurs.

La liberté jusqu’au cœur du processeur avec RISC-V

Magazine
Marque
Hackable
Numéro
31
|
Mois de parution
octobre 2019
|
Domaines
Résumé
RISC-V est un jeu d’instructions 32 bits libre, développé initialement par l’université de Berkeley. Ce jeu d’instructions (ISA pour Instruction Set Architecture) est maintenant soutenu par une fondation regroupant quasiment tous les grands noms de l’industrie informatique. Dans cet article, nous allons décrire succinctement le concept de RISC vs CISC, puis nous expliquerons les bases du jeu d’instructions avec un peu de code assembleur, enfin nous terminerons par une description de quelques émulateurs et processeurs RISC-V disponibles aujourd’hui sur le marché.

Contrôler vos modèles Lego PoweredUp au Joypad à l'aide de votre Raspberry Pi

Magazine
Marque
Hackable
Numéro
30
|
Mois de parution
juillet 2019
|
Domaines
Résumé
Dans cet article, nous allons voir comment piloter un robot Lego PoweredUp à l’aide d’un JoyPad, grâce à un Raspberry Pi. Nous allons installer tout le nécessaire sur notre Raspberry Pi pour pouvoir piloter notre modèle Lego PoweredUp. Nous utiliserons NodeJS, donc le langage JavaScript, pour piloter notre modèle Lego.

Démarrez avec MicroPython

Magazine
Marque
GNU/Linux Magazine
Numéro
228
|
Mois de parution
juillet 2019
|
Domaines
Résumé
Pour mettre sur pied une preuve de concept ou un prototype électronique, il faut habituellement choisir une carte de développement et ensuite acquérir les outils de développement logiciel du fabricant. Ces logiciels s’appuient généralement sur les langages bas niveau comme le C, dont la maîtrise n’est pas accessible à tout le monde. MicroPython est a été mis sur pied pour permettre l’utilisation d’un langage de programmation haut niveau (Python) sur microcontrôleur, pour créer de magnifiques applications d’IoT.

Par le même auteur

Contrôler vos modèles LEGO Powered Up au Nunchuk à l'aide de votre Arduino

Magazine
Marque
Hackable
Numéro
33
|
Mois de parution
avril 2020
|
Domaines
Résumé

Dans cet article, nous allons voir comment piloter un robot LEGO Powered Up à l’aide d’un Nintendo Nunchuk, grâce à un Arduino. Nous allons installer les librairies nécessaires pour pouvoir piloter notre modèle Powered Up et accéder aux informations du Nunchuk. Nous développerons ensuite notre programme de contrôle en C.

Auto-héberger son agenda avec Baïkal

Magazine
Marque
Linux Pratique
HS n°
Numéro
46
|
Mois de parution
octobre 2019
|
Domaines
Résumé
Il est très utile de pouvoir avoir un calendrier partagé accessible à tout moment sur toute sorte de clients : PC, tablette, téléphone... La solution la plus simple est souvent d’utiliser Google Calendar. Dans cet article, nous allons voir qu’il n’est pas si compliqué d’héberger soi-même un calendrier partagé à l’aide de Baïkal. Nous aborderons l’installation et la configuration de Baïkal. Pour finir, nous découvrirons la configuration des clients Thunderbird, Android et iOS.

Contrôler vos modèles Lego PoweredUp au Joypad à l'aide de votre Raspberry Pi

Magazine
Marque
Hackable
Numéro
30
|
Mois de parution
juillet 2019
|
Domaines
Résumé
Dans cet article, nous allons voir comment piloter un robot Lego PoweredUp à l’aide d’un JoyPad, grâce à un Raspberry Pi. Nous allons installer tout le nécessaire sur notre Raspberry Pi pour pouvoir piloter notre modèle Lego PoweredUp. Nous utiliserons NodeJS, donc le langage JavaScript, pour piloter notre modèle Lego.

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.

Créer vos feuilles de tournoi avec jQuery Bracket

Magazine
Marque
Linux Pratique
HS n°
Numéro
44
|
Mois de parution
février 2019
|
Domaines
Résumé

Lorsque l’on organise des tournois, il est souvent intéressant de mettre les résultats en ligne et de pouvoir les modifier aisément. Dans cet article, nous allons utiliser la librairie jQuery Bracket pour publier des feuilles de tournoi. Nous ajouterons aussi notre propre code pour rendre l’utilisation de la librairie plus facile.