Démo d'un capteur de couleur personnalisé envoyant sa détection sur un Hub LEGO
Cet article présente MyOwnBricks, une librairie Arduino/ESP que j'ai développée pour construire des modules tiers à connecter aux hubs LEGO PoweredUp.
Il s'agit pour une fois d'un gros travail de reversing à cheval entre l'électronique et le code; mais c'est également la première implémentation complète et publique d'un capteur tiers fonctionnant sur un Hub LEGO PoweredUp !
L'écosystème LEGO PoweredUP (capteurs, moteurs, etc.) est assez fermé car il n'est pas prévu d'y ajouter du matériel non fabriqué par l'entreprise.
Une récente collaboration entre LEGO et la Fondation Raspberry Pi a abouti à la mise en vente d'un HAT pour Rasbperry Pi permettant d'échanger avec les capteurs PoweredUp de façon économique (25€ vs plus de 80€ pour un hub officiel) et très didactique. L'initiation à l'informatique, la programmation et un début d'électronique s'en trouve facilitée.
Malgré ce projet il était toujours impossible de construire ses propres capteurs. Voici la présentation de la librairie qui rend cela possible !
PS: Je considère cette page comme un miroir de la version FR de la documentation du projet hébergé sur GitHub-MyOwnBricks.
Sommaire
MyOwnBricks
MyOwnBricks est une librairie de l'écosystème Arduino pour construire ses propres capteurs et périphériques compatibles avec le système LEGO PoweredUp (successeur de PowerFunctions).
Ce projet rend accessible (dans la limite de l'API LEGO actuelle et de son application mobile) le prototypage électronique avec l'écosystème LEGO.
En utilisant vos propres capteurs vous pouvez reproduire les capteurs LEGO tout en améliorant/modifiant certaines de leurs caractéristiques (portée, précision des mesures, détection de couleurs, interrupteurs et détecteurs personnalisés, etc.).
Le détournement de capteurs comme le Capteur de Couleur et de Distance ouvre également la voie à de nombreuses actions automatisées depuis l'application officielle en réponse par exemple, à une demande de changement de couleur: l'activation de robots, trains, mécanismes, capteurs, écran OLED/LCD, relais ou encore phares colorés.
En bref il s'agit d'ajouter des fonctionnalités sur des hubs qui ne sont pas censés les supporter (ex: périphériques de type Spike/education sur hubs classiques (Technic, Move, City)).
Ce projet est compatible avec le projet de firmware alternatif PyBricks (dépôt) (site officiel) avec lequel vous pourrez si vous le souhaitez créer de nouveaux capteurs de A à Z sans devoir se limiter à détourner l'API des capteurs existants. Prévoyez cependant un certain travail d'intégration.
En alternative à PyBricks, utilisant une plateforme ESP32 vous trouverez aussi le projet Legoino.
MyOwnBricks est libre ET open source; publié sous licence GPL. Cela veut dire que vous pouvez lire, tester et modifier son code mais pas l'incorporer dans du code non libre lui aussi. Cela veut aussi dire que Microsoft-GitHub n'a pas le droit de l'utiliser pour nourrir ses algorithmes propriétaires sans me le demander; ce qu'ils font de toute façon...
Hubs et capteurs officiels supportés
Actuellement tous les hubs PoweredUp sont compatibles:
- LEGO Technic Hub 88012
- LEGO BOOST Move Hub 88006
- LEGO City Hub 88009
- Raspberry Pi Build HAT (Un Hub Technic programmable pour 25€)
Les capteurs suivants sont implémentés:
- LEGO Color & Distance Sensor 88007
- LEGO Tilt Sensor 45305
Quel microcontrôleur ?
MyOwnBricks fonctionne avec n'importe quel MCU (ESP, Arduino) sur lequel on peut charger un sketch Arduino.
Il faut toutefois noter que le Hub fonctionne avec une tension de 3.3V ce qui peut être limitant dans le choix du matériel.
Le développement a été fait sur un Arduino Pro-Micro basé sur Atmega32u4; il dispose de 2 ports série. Cela permet de dédier le port série USB au débuggage du firmware, tout en laissant le mcu interagir avec les capteurs sur un autre port. Cette carte d'expérimentation peut fonctionner à 16MHz sur 3.3V (même si hors spécifications).
Note: Certaines copies "non officielles" peuvent disposer de régulateurs de tension qui ne délivrent pas exactement une tension de 3.3V. Vérifiez les tensions avant toute connexion de quelque-chose au Hub qui ne soit pas alimenté par lui-même. À défaut de modifier l'alimentation de la carte en sectionnant la piste d'alimentation de l'Atmega32u4 pour qu'il ne reçoive plus que du 3.3V en provenance de la batterie et non du régulateur de tension, le plus sûr est de débrancher l'Arduino de la prise USB avant tout test avec le Hub.
Usage
Exemples
Des exemples de sketchs sont fournis dans le répertoire du projet avec une documentation complète pour démarrer rapidement avec les capteurs testés.
Sketch | Description |
---|---|
color_distance_sensor | Implémentation complète du capteur Color & Distance officiel utilisant le capteur de couleur TCS34725 et le capteur de distance VL6180X. |
color_sensor | Implémentation seule du capteur de couleur. |
distance_sensor | Implémentation seule du capteur de distance. |
IR_emitter | Implémentation d'un transmetteur infrarouge pour les modules PowerFunctions. L'usage d'un callback recevant le code envoyé depuis le Hub y est démontré. |
tilt_sensor | Squelette pour l'implémentation du capteur d'orientation générique. |
Usurpation de Hub en Python | Preuve de concept simulant un Hub au travers d'une liaison série (UART); cet exemple est utile pour débugger l'implémentation d'un capteur sur un microcontrôleur sans passer par le Hub officiel. |
Branchements
Voici le schéma de branchement suivi des annotations des pins du connecteur Wedo 2.0.
Schéma de branchement des capteurs de distance et de vision ainsi que d'un émetteur infrarouge à un Arduino puis à un Hub PoweredUp
Rappel des branchements des connecteurs Wedo 2.0 / PoweredUp (source)
Pin | Label | Function |
1 | M1 | Motor power lead 1 (PWM controlled) |
2 | M2 | Motor power lead 2 (PWM controlled) |
3 | GND | Ground |
4 | VCC | Power for device electronics (3.3V) |
5 | ID1 | Analog identification line 1 / Serial data (hub -> device) |
6 | ID2 | Analog identification line 2 / Serial data (device -> hub) |
Code blocks sur l'application LEGO PoweredUp
L'application PoweredUp permet d'orchestrer les actions et données des capteurs selon le principe de la programmation par blocs.
Blockly vs Scratch
Tout le monde parle de Blockly aujourd'hui; il s'agit d'un projet développé par Google. Pourtant son ancêtre est Scratch, développé au MIT 6 ans avant (en 2006); il repose maintenant sur Blockly.
La documentation "non officielle de référence" des blocs programmables se trouve sur racingbrick.com. "Non officielle" car LEGO ne sait pas documenter ses produits informatiques, j'y reviendrai dans un article futur...).
Code Arduino
Le code de base est le suivant; déclarer par exemple une variable de type ColorDistanceSensor
puis l'initialiser dans la fonction setup()
.
Les callbacks de notification de l'envoi d'un code IR ou d'un changement de couleur provoqué par l'application sont configurés dans setup()
.
La fonction habituelle loop()
servira à mettre à jour les variables, puis à traiter les requêtes échangées avec le hub par l'appel de la méthode process()
de chaque objet proposé par MyOwnBricks
.
#include "MyOwnBricks.h"
ColorDistanceSensor myDevice;
bool connection_status;
/**
* @brief Callback for IR code sent by the hub
*/
void IRCallback(const uint16_t value) {
...
}
void setup() {
// Device config
myDevice.setIRCallback(&IRCallback);
connection_status = false;
}
void loop() {
...
myDevice.process();
if (myDevice.isConnected()) {
// Already connected ?
if (!connection_status) {
Serial.println(F("Connected !"));
connection_status = true;
}
} else {
Serial.println(F("Not Connected !"));
connection_status = false;
}
}
Matériel testé
Ce chapitre détaille essentiellement les caractéristiques des capteurs testés avec le projet.
Câble de connexion au hub
- Câble en silicone souple 28AWG (maximum, 26AWG passerait mieux à mon avis)
- Connecteurs WEDO 2.0 (Achetez-les séparément, les connecteurs pré-câblés coutent les yeux de la tête.)
Le saviez-tu?
AWG (American Wire Gauge), est une norme américaine (donc à la con car hors du système métrique international, mais que tout le monde utilise quand même) qui détermine le nombre de passage d'un fil dans la machine de tréfilage responsable de l'étirement de celui-ci.
28AWG = 28 passages; plus le chiffre est grand plus le fil a une section faible.
Capteur de distance
VL6180X
Capteur de télémétrie temps de vol; technologie laser Détection jusqu'à 20cm par défaut, peut aller jusqu'à 50cm au détriment de la résolution. Adresse i2c modifiable Pins: shutdown, interrupt VIN: 3-5V VCC: 2.8V
Capteur de couleur
TCS34725
Capteur RGB + canal clear Calcul de l'intensité lumineuse en lux Filtre IR Adresse i2C NON modifiable Pins: LED, interrupt VIN: 3-5V VCC: 3.3V
Note: Pour ce capteur vous devriez utiliser ma propre version de la librairie Adafruit (la librairie d'origine doit toujours être installée). Plus de détails ici.
Émetteur infrarouge
LED IR
940nm 3-5V, 30mA
La LED est pilotée par un transistor NPN 2N3904 très classique.
Développement avec capteur non testé
Pour utiliser des capteurs différents il faudra adapter les exemples fournis. Toutefois ce travail consistera essentiellement à convertir les données du nouveau capteur vers les données attendues par l'application LEGO. La librairie MyOwnBricks s'occupe du protocole d'échange entre la carte d'expérimentation et le Hub PoweredUp.
Les fonctions de base sont déjà implémentées pour ne devoir écrire que le code spécifique au nouveau capteur.
Conclusion
Toute contribution pour apporter de nouveaux exemples, supporter de nouveaux capteurs LEGO et tierce partie est évidemment bienvenue.
Pour plus de détails notamment sur l'installation, consulter le dépôt qui sera plus tenu à jour que cette page de présentation.
J'adresse un clin d'œil à @JorgePe et @philohome ainsi qu'à leurs contributeurs pour les premiers pas dans la rétro ingénierie du protocole (BOOSTreveng, philohome.com). Merci aussi à @ahmedjouirou pour la première implémentation inspiratrice.