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.


Body

 

photo

 

Dans l’article « Contrôler vos modèles Lego au joypad à l'aide de BrickPi » de Hackable n°29, nous avons vu comment piloter des moteurs Lego Mindstorms à l’aide de la carte d’extension BrickPi. Nous allons maintenant faire de même, en replaçant BrickPi par le Hub Lego PoweredUp. Il existe une librairie NodeJS pour piloter ce hub, c’est pour cela que nous allons développer notre programme en JavaScript. Le principe et le fonctionnement du programme sont les mêmes que dans l’article précédent, seule l’implémentation change.

1. PoweredUp Lego

Lego propose depuis peu des moteurs et senseurs pilotables par Bluetooth. Toute l’intelligence est donc déportée sur la tablette ou le téléphone mobile. Le composant central est appelé hub. Ce composant est à la fois le boîtier contenant les piles, ainsi que le récepteur Bluetooth 4.1.

 

poweredup

 

Le but de cet article est donc de remplacer l’application Lego PoweredUp [1] par du code JavaScript, que nous exécuterons sur RaspBerry Pi.

2. Le matériel

La liste du matériel est assez simple, car Lego nous propose déjà un modèle contenant pratiquement tout ce qui nous intéresse :

  • 1 Raspberry Pi supportant le Bluetooth 4.1. Dans notre exemple, nous utiliserons un RaspBerry Pi 3 A+.
  • 1 carte SD ou micro SD, en fonction du modèle de RaspBerry Pi choisi.
  • 1 Lego «La Batmobile télécommandée» modèle 76112. Ce modèle fonctionne avec Lego PoweredUp.[2]
  • 1 JoyPad reconnu sous Linux. Ici, nous utiliserons un Logitech F710.
  • 6 piles AAA, de préférence rechargeables, pour alimenter le Hub Lego PoweredUp.

3. Construction du robot Lego

 

modele

 

Lego propose un modèle contenant tout ce qui nous intéresse, il s’agit de « La Batmobile télécommandée » modèle numéro 76112. On trouve la notice de montage sur le site Lego : https://www.lego.com/fr-fr/service/buildinginstructions/search#?search&text=76112

Vous trouverez ce modèle sur le site MecaBricks : https://mecabricks.com/en/models/WRaZLqdAjpZ

4. 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.

Ensuite, nous avons besoin d’installer quelques packages pour la suite :

sudo aptitude install git npm
sudo npm install gamepad

Installons la librairie prenant en charge PoweredUp [3] :

sudo npm install node-poweredup --save

5. 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 NodeJS. Il nous faut donc 2 bibliothèques :

  • gamepad : pour nous permettre de récupérer les événements sur le JoyPad ;
  • node-poweredup : 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 -1,00 à +1,00.

Les valeurs d’entrée du moteur se situent entre -100 et +100, avec un moteur à l’arrêt à 0.

Nous allons donc devoir convertir les valeurs d’entrée récupérées du JoyPad pour obtenir les bonnes valeurs de sortie à transmettre aux 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 PoweredUp induit de la latence, donc un robot qui obéit avec un temps de retard. 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.

6. Programmation

1 const GAMEPAD_EVENEMENTS_MS = 100;

2 const BOUTON_FIN = 7;

3 const BOUTON_AV_AR = 0;

4 const AXES = [2,5];

5

6 const gamepad = require("gamepad");

7

8 var robot =

9 {

10    "type":"PoweredUP",

11    "pret":false,

12    "connexion":null,

13    "moteurs":

14    [

15       {

16          "description":"Moteur gauche",

17          "nom":"B",

18          "vitesse":0,

19          "sens":-1

20       },

21       {

22          "description":"Moteur droite",

23          "nom":"A",

24          "vitesse":0,

25          "sens": 1

26       }

27    ],

28    "vitesse_min": 40,

29    "seuil_detection":40

30 }

31

32 robot.init = function() {

33    const PoweredUP = require("node-poweredup");

34    const poweredUP = new PoweredUP.PoweredUP();

35    poweredUP.on("discover", async (hub) => {

36       await hub.connect();

37       robot.connexion = hub;

38       robot.pret = true;

39       console.log("Lego PoweredUP OK");

40    });

41    poweredUP.scan();

42 }

43

44 robot.modifie_vitesse = function(moteur,vitesse) {

45    robot.moteurs[moteur].vitesse=robot.moteurs[moteur].sens*vitesse;

46    robot.connexion.setMotorSpeed(

47    robot.moteurs[moteur].nom,

48    robot.moteurs[moteur].vitesse)

49 }

50

51 robot.init();

52 gamepad.init();

53 setInterval(gamepad.processEvents, GAMEPAD_EVENEMENTS_MS);

54 console.log("GamePad OK")

55

56 gamepad.on("down", function (id, num) {

57    if (num == BOUTON_FIN) return process.exit(0);

58    if (num == BOUTON_AV_AR)

59    {

60       if ((robot.moteurs[0].vitesse==0) &&

61          (robot.moteurs[1].vitesse==0))

62       {

63          robot.moteurs[0].sens = -1 * robot.moteurs[0].sens;

64          robot.moteurs[1].sens = -1 * robot.moteurs[1].sens;

65       }

66    }

67 });

68

69 gamepad.on("move", function (id, axis, value) {

70    if (!robot.pret) return;

71       vitesse=Math.round((value+1)*50);

72

73    if (vitesse < robot.vitesse_min) vitesse=0;

74

75    for (i = 0; i < AXES.length; i++)

76       if (axis==AXES[i])

77          if (Math.abs(robot.moteurs[i].vitesse - vitesse) > robot.seuil_detection)

78             robot.modifie_vitesse(i,vitesse);

79    });

Voici une description du fonctionnement de notre programme.

Tout d’abord, quelques constantes (lignes 1 à 4) :

  • GAMEPAD_EVENEMENTS_MS : période de rafraîchissement de données du GamePad ;
  • BOUTON_FIN : identifiant du bouton mettant fin au programme ;
  • BOUTON_AV_AR : identifiant du bouton permettant la bascule marche avant / marche arrière ;
  • AXES : tableau contenant les 2 axes du JoyPad, à utiliser pour le moteur gauche et le moteur droit.

En ligne 6, nous chargeons la librairie d’utilisation du GamePad.

Des lignes 8 à 30, nous définissons les caractéristiques du robot.

Une des grandes forces de JavaScript est que nous pouvons dynamiquement ajouter une fonction à un objet. C’est ce que nous faisons des lignes 32 à 42 avec la fonction init, ainsi que des lignes 44 à 49 avec la fonction modifie_vitesse.

La fonction init du robot permet la connexion Bluetooth et l’initialisation du Hub Lego.

La fonction modifie_vitesse prend 2 arguments, le moteur dont on veut changer la vitesse et la nouvelle vitesse.

Des lignes 51 à 54, nous démarrons le programme en initialisant le JoyPad et le robot.

Il ne nous reste donc plus qu’à réagir sur les actions du JoyPad.

Des lignes 56 à 67, nous détectons si on appuie sur un bouton du JoyPad :

  • s’il s’agit du bouton de fin, nous arrêtons le programme (ligne 57) ;
  • s’il s’agit du bouton marche avant / marche arrière, nous vérifions d’abord que le robot est bien arrêté (vitesse == 0) et ensuite, nous changeons le sens de rotation des 2 moteurs (lignes 60 à 65).

Des lignes 69 à 79, nous détectons la pression sur les gâchettes du JoyPad. Tout d’abord, nous testons si le robot est prêt (ligne 70). Ensuite, nous calculons la nouvelle vitesse et nous vérifions si la vitesse minimale est atteinte (lignes 71 et 73). Pour finir, nous vérifions quelle gâchette est pressée (ligne 76) et nous modifions la vitesse du moteur uniquement s’il y a un écart de vitesse significatif (seuil_detection) avec la vitesse précédente (lignes 77 et 78).

Conclusion

Nous pouvons désormais piloter facilement au JoyPad notre Lego PowerUp. Avec ces bases, les possibilités de développement sont infinies… À vous de créer vos modèles et programmes et de les partager avec la communauté.

Il existe aussi une boîte de Lego appelée Lego Boost. Le fonctionnement est exactement le même à une exception : le hub intègre 2 moteurs et 2 ports. Ces ports permettent d’ajouter un moteur supplémentaire ainsi qu’un détecteur de couleur.

Lors de la création de cet article, il n’y avait malheureusement pas de librairie Python disponible. Ce qui n’est plus le cas [4] [5]. Le Raspberry Magazine numéro 81 (en anglais) aborde lui aussi le sujet Lego Boost piloté par Raspberry Pi. [6]

Références

[1] PoweredUp sur le site Lego : https://www.lego.com/en-us/service/device-guide/powered-up

[2] La Batmobile télécommandée sur le site Lego : https://www.lego.com/en-us/themes/dc-superheroes/products/app-controlled-batmobile-76112

[3] La librairie node-poweredup : https://www.npmjs.com/package/node-poweredup

[4] Une librairie Python pour Lego Boost  : https://github.com/undera/pylgbst

[5] Une autre librairie Python pour Lego Boost  : https://github.com/JorgePe/pyb00st

[6] Raspberry Magazine 81 en anglais : https://www.raspberrypi.org/magpi-issues/MagPi81.pdf

 



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 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.

Les derniers articles Premiums

Les derniers articles Premium

Stubby : protection de votre vie privée via le chiffrement des requêtes DNS

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

Depuis les révélations d’Edward Snowden sur l’espionnage de masse des communications sur Internet par la NSA, un effort massif a été fait pour protéger la vie en ligne des internautes. Cet effort s’est principalement concentré sur les outils de communication avec la généralisation de l’usage du chiffrement sur le web (désormais, plus de 90 % des échanges se font en HTTPS) et l’adoption en masse des messageries utilisant des protocoles de chiffrement de bout en bout. Cependant, toutes ces communications, bien que chiffrées, utilisent un protocole qui, lui, n’est pas chiffré par défaut, loin de là : le DNS. Voyons ensemble quels sont les risques que cela induit pour les internautes et comment nous pouvons améliorer la situation.

Surveillez la consommation énergétique de votre code

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

Être en mesure de surveiller la consommation énergétique de nos applications est une idée attrayante, qui n'est que trop souvent mise à la marge aujourd'hui. C'est d'ailleurs paradoxal, quand on pense que de plus en plus de voitures permettent de connaître la consommation instantanée et la consommation moyenne du véhicule, mais que nos chers ordinateurs, fleurons de la technologie, ne le permettent pas pour nos applications... Mais c'est aussi une tendance qui s'affirme petit à petit et à laquelle à terme, il devrait être difficile d'échapper. Car même si ce n'est qu'un effet de bord, elle nous amène à créer des programmes plus efficaces, qui sont également moins chers à exécuter.

Donnez une autre dimension à vos logs avec Vector

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

Avoir des informations précises et détaillées sur ce qu’il se passe dans une infrastructure, et sur les applications qu'elle héberge est un enjeu critique pour votre business. Cependant, ça demande du temps, temps qu'on préfère parfois se réserver pour d'autres tâches jugées plus prioritaires. Mais qu'un système plante, qu'une application perde les pédales ou qu'une faille de sécurité soit découverte et c'est la panique à bord ! Alors je vous le demande, qui voudrait rester aveugle quand l'observabilité a tout à vous offrir ?

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