Lego + Raspberry = voiture télécommandée – Partie 1

Après la borne rétrogaming à base de Raspberry 3, place aux Lego avec un Raspberry Pi 0W embarqué largement inspiré de cet article 🙂 Afin de rester dans la thématique “rétro”, je suis resté sur de vieux Lego techniques et uniquement ceux en ma possession. Le Set 8850 m’a bien été utile pour la propulsion et la direction du véhicule.

Set 8850

Afin de mener à bien ce projet, je l’ai découpé en plusieurs parties, partant d’une solution “simple”, à savoir créer une véhicule télécommandé et capable de tourner via une manette de jeu BT, pour arriver à un véhicule “espion” avec une caméra et pouvant être contrôlé en SSH depuis l’extérieur.

Le montage électrique

Pour cette 1ère étape, avant d’assembler 2 pièces de Lego ensemble, le montage électrique utilisé comprant :

  • un raspberry 0W pour profiter de la connexion BT et Wifi (simplifié par Gnd/Vcc/IO);
  • un servo moteur pour contrôler la direction des roues; ce servo moteur sera asservi depuis l’entrée GPIO 18 du RP;
  • deux moteurs Lego pour avancer; 1 seul pourrait suffire mais 2 moteurs donnent carrément plus de puissance et donc de vitesse. Les moteurs sont montés en parallèle;
  • une batterie externe 5V capable d’alimenter le RP et le servo motezr;
  • deux piles 6LR61 9V montées en série pour alimenter les 2 moteurs Lego

Note : 

  • Mes moteurs Lego fonctionnent sur du 9V et peuvent “tourner” dans les 2 sens si on inverse la polarité. Ce point sera particulièrement utile lors de l’ajout de la fonctionnalité “marche arrière” du véhicule;
  • Les moteurs ne sont pas asservis et démarrent donc dès le branchement de la batterie. Ce point sera amélioré dans la partie suivante avec l’ajout d’un relais, contrôlé par la GPIO 4 du RP;
  • les moteurs Lego en ma possession sont de vieux moteurs de type 2838, pas très performants. Même si je possède de nouveaux moteurs, je suis resté sur ces vieux moteurs afin de ne pas mélanger nouveaux et anciens. Le site Philohome compare les moteurs produits par Lego.
  • Il semble possible de directement alimenter des moteurs Lego à partir des GPIO 17 et 18 du RP et de gérer le “sens” du moteur avec 2 pin (cf. article de Karl). Mais avec mes moteurs “old school” ayant besoin de 9V, pas possible de réaliser ce type de montage.

Validation du montage et test des GPIO

Une fois le connecteur externe soudé au RP, on peut tester la GPIO 18. 

Pour cela, le binaire gpio de WiringPi est particulièrement utile. Mais il faut d’abord l’installer via les commandes suivantes :

Pour WiringPi, la même sortie peut avoir jusqu’à 3 noms différents :

  • en mode BOARD (numérotation physique de 1 à 40 des pins)
  • en mode BCM (Broadcom SOC channel) pour faire référence à une GPIO pilotable
  • en mode wiringPI

Les GPIO du Raspberry Pi 0

Une fois installé, on peut commander les GPIO directement depuis un terminal. La fonction gpio readall permet de voir l’état des sorties et les nomenclatures possibles (BCM, wPi et Physical).

Etat des différentes sorties

Pour activer la GPIO 18, il suffit de taper les commandes suivantes : $ gpio -g mode 18 out && gpio -g write 18 1

L’option -g permet d’indiquer à wPi l’utilisation de la nomenclature BCM.


Test de la GPIO 18

Et pour éteindre la sortie, $ gpio -g write 18 0

Les mêmes contrôles sont possibles en Python avec le package RPi.GPIO. Un simple sudo apt-get install python-dev python-rpi.gpio permet d’installer la suite complète.

Le code équivalent en Python est le suivant :

Pour visualiser le résultat, un buzzer ou une LED relié à la GPIO permet de valider le bon fonctionnement de la sortie.

Appairage de la manette BT via bluetoothctl

La manette BT est une des manettes BT de ma borne d’arcade rétrogaming. Je l’ai donc appairé en ligne de commande et je lance ensuite un script pour réaliser la connexion BT une fois la manette allumé. La binaire utilisé est bluetoothctl. Une fois la manette appairée, la connexion se fait au démarrage via un script.

Les commandes de base pour bluetoothctl sont :

  1. power on pour s’assurer que le bluetooth est bien activé
  2. agent on pour s’assurer que le bluetooth fonctionne
  3. scan on pour rechercher les périphériques bluetooth à proximité
  4. La commande scan on renvoie les @MAC des périphériques BT. A vous d’identifier la bonne @MAC pour se connecter dessus.
  5. connect suivi de l’@ MAC connect E4:17:D8:EA:65:6A

Les scripts

Pour pouvoir télécommander le véhicule à partir d’une télécommande, je suis parti sur le langage Python. Très rapidement, un simple listener sur une manette BT appairée permet d’exécuter les scripts nécessaires pour contrôler son véhicule.

Pour le listener, les lignes print(event.type) et print(repr(event)) peuvent vous aider pour trouver le code correspondant à votre manette. Dans ce 1er jet de listener,  les directions “Avant”, “Droite” et “Gauche” sont détectées avec la touche “Start” pour stopper le listener. La touche “Avant” permet de remettre les roues droite

autopair.sh

listener.py

testServo.py

servo.py

Assemblage du Lego

Pour l’assemblage du Lego, il a d’abord fallu réfléchir à quelques points essentiels pour s’assurer de pouvoir :

  1. diriger le véhicule via le servo moteur;
  2. faire avancer le véhicule avec deux moteurs;
  3. caser les différents éléments du circuit dans différents logements :
    • le RP
    • la batterie externe
    • les piles 9V pour les moteurs
    • les 2 moteurs Lego
    • Le servo moteur
    • les composants rajoutés ultérieurement (relais, circuit électrique, caméra; …)
  4. construire un chassis suffisamment grand pour tout accueillir sans être trop lourd;
  5. réaliser le tout avec les pièces de Lego à ma disposition.

La direction

Comme mentionné ci-dessus, le set 8850 m’a été d’une grande utilité. J’ai réutilisé le mécanisme de direction proposé dans ce set. Deux axes parallèles dont un mobile et l’autre fixe. L’axe mobile cranté est bougé grace à une petite roue. Un axe perpendiculaire est ensuite ajouté et c’est cet axe qui est ensuite asservi au servo moteur.





La propulsion

Hormis le fait que les moteurs sont des 9V, rien de spécial à signaler. J’ai préféré “additionner” la puissance des 2 moteurs pour faire tourner les 2 roues ensemble que coupler 1 moteur sur 1 roue. Et plutôt que d’utiliser des roues crantées, j’ai utilisé des élastiques comme suggéré dans la motorisation du Set 8850. Le montage est le suivant :

 

Les logements

Pour éviter que tous les composants ne bougent sans cesse, il a fallu créer des compartiments pour les éléments suivants :

  • le raspberry 0

  • le servo moteur relié à la direction

  • la batterie externe qui sert d’alimentation au servo moteur et au RP

  • les 2 piles 9V en série pour pouvoir donner suffisamment de puissance aux 2 moteurs Lego 9V

  • le bornier permettant de relier les différents composants et éviter de faire de vilaines soudures

 

Test et video

 

Test du servo avant montage (photo)

 Test de la direction avec le script testServo.py

Test de la voiture sur circuit privé 🙂

Tagged with: , ,