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

Magazine
Marque
Hackable
Numéro
29
Mois de parution
avril 2019
Spécialité(s)


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/

 



Article rédigé par

Par le(s) même(s) auteur(s)

Auto-héberger son agenda avec Baïkal

Magazine
Marque
Linux Pratique
HS n°
Numéro
46
Mois de parution
octobre 2019
Spécialité(s)
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
Spécialité(s)
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.

Les derniers articles Premiums

Les derniers articles Premium

Cryptographie : débuter par la pratique grâce à picoCTF

Magazine
Marque
Contenu Premium
Spécialité(s)
Résumé

L’apprentissage de la cryptographie n’est pas toujours évident lorsqu’on souhaite le faire par la pratique. Lorsque l’on débute, il existe cependant des challenges accessibles qui permettent de découvrir ce monde passionnant sans avoir de connaissances mathématiques approfondies en la matière. C’est le cas de picoCTF, qui propose une série d’épreuves en cryptographie avec une difficulté progressive et à destination des débutants !

Game & Watch : utilisons judicieusement la mémoire

Magazine
Marque
Contenu Premium
Spécialité(s)
Résumé

Au terme de l'article précédent [1] concernant la transformation de la console Nintendo Game & Watch en plateforme de développement, nous nous sommes heurtés à un problème : les 128 Ko de flash intégrés au microcontrôleur STM32 sont une ressource précieuse, car en quantité réduite. Mais heureusement pour nous, le STM32H7B0 dispose d'une mémoire vive de taille conséquente (~ 1,2 Mo) et se trouve être connecté à une flash externe QSPI offrant autant d'espace. Pour pouvoir développer des codes plus étoffés, nous devons apprendre à utiliser ces deux ressources.

Raspberry Pi Pico : PIO, DMA et mémoire flash

Magazine
Marque
Contenu Premium
Spécialité(s)
Résumé

Le microcontrôleur RP2040 équipant la Pico est une petite merveille et malgré l'absence de connectivité wifi ou Bluetooth, l'étendue des fonctionnalités intégrées reste très impressionnante. Nous avons abordé le sujet du sous-système PIO dans un précédent article [1], mais celui-ci n'était qu'une découverte de la fonctionnalité. Il est temps à présent de pousser plus loin nos expérimentations en mêlant plusieurs ressources à notre disposition : PIO, DMA et accès à la flash QSPI.

Les listes de lecture

7 article(s) - ajoutée le 01/07/2020
La SDR permet désormais de toucher du doigt un domaine qui était jusqu'alors inaccessible : la réception et l'interprétation de signaux venus de l'espace. Découvrez ici différentes techniques utilisables, de la plus simple à la plus avancée...
8 article(s) - ajoutée le 01/07/2020
Au-delà de l'aspect nostalgique, le rétrocomputing est l'opportunité unique de renouer avec les concepts de base dans leur plus simple expression. Vous trouverez ici quelques-unes des technologies qui ont fait de l'informatique ce qu'elle est aujourd'hui.
9 article(s) - ajoutée le 01/07/2020
S'initier à la SDR est une activité financièrement très accessible, mais devant l'offre matérielle il est parfois difficile de faire ses premiers pas. Découvrez ici les options à votre disposition et les bases pour aborder cette thématique sereinement.
Voir les 23 listes de lecture

Abonnez-vous maintenant

et profitez de tous les contenus en illimité

Je découvre les offres

Déjà abonné ? Connectez-vous