CLUE d'Adafruit: Une Solution Intelligente pour les Projets IoT
sur
La carte BBC micro:bit a connu un grand succès, bien au-delà du marché éducatif auquel elle était destinée. Maintenant, CLUE d'Adafruit a émergé sur le marché, avec un écran à part entière et une mémoire plus grande. Doté de Bluetooth LE et d'une multitude de capteurs intégrés, il est particulièrement adéquat aux petits projets IoT.
Après le succès d'Arduino et du Raspberry Pi, il est devenu évident qu'il y a de l'argent à faire avec les différents types d’ordinateurs éducatifs. En 2016, la BBC est entrée dans la course avec micro:bit, un ordinateur monocarte doté d'un SoC Bluetooth de Nordic Semiconductor au lieu d'un processeur à part entière sous Linux. Depuis lors, des histoires incroyables ont été racontées d'entreprises, telles que Spy oz en Slovaquie, qui ont lancé des sociétés entières autour de la distribution exclusive de l'écosystème micro:bit [1].
Le vieux dicton selon lequel "on ne mange pas trop longtemps seul dans une plat bien remplie" s'applique également au domaine de l'informatique embarquée. Les progrès continus dans le domaine des SoC Bluetooth ont laissé les 16 MHz et les 16 kB de SRAM de micro:bit paraitre un peu dépassés. De plus, son afficheur LED 5 × 5 ne convient pas pour afficher autre chose que les plus simples des graphiques.
Adafruit Attaque avec CLUE
Avec le lancement du nRF52840 de Nordic Semiconductor, un SoC Bluetooth monocœur dont le processeur ARM atteint 64 MHz et doté de 256 kB de RAM — un vecteur d'attaque a émergé. Figures 1 et Figure 2 montrent le résultat — le CLUE d'Adafruit qui semble très similaire au micro:bit de BBC. A part le SoC, qui n'est pas immédiatement visible sur ces photos, c'est l'écran beaucoup plus grand situé à l'avant qui se distingue vraiment. Au lieu des LEDs, on a un écran couleur de 240 × 240 pixels basé sur la technologie classique IPS LCD plutôt que sur la technologie organique.
Un autre détail agréable du module est le connecteur placé à l'arrière, comme montré à la Figure 3. Il présente un bus I2C utilisant le format interne d'Adafruit sur lequel d'autres capteurs peuvent être facilement connectés. Il existe également un adaptateur pour le format Grove utilisé par Seeed, qui propose divers capteurs à prix raisonnable.
Il est à noter que CLUE ne semble être que partiellement compatible avec son prédécesseur. Bien que le connecteur le long du bord inférieur soit d’une construction identique, l'utilisation d'un afficheur différent signifie qu'à première vue, il semblait que la plupart des boîtiers disponibles pour le BBC micro:bit ne conviendraient pas au CLUE d'Adafruit.
L'auteur a testé cette hypothèse avec un boîtier ThingiVerse de domw disponible sur[2]. La partie avant ne convenait pas certes, car l'afficheur de CLUE était beaucoup plus grand que la matrice de LED de l'original de BBC. Compte tenu de cela, l'auteur a été particulièrement surpris par le fait que la face arrière du boîtier s'est correctement monté, malgré les connecteurs supplémentaires. Cependant, lorsqu’on l’examine de plus près, cela est probablement dû au fait que la conception du boîtier était relativement généreuse. Si le boîtier avait été conçu avec un ajustement plus serré, il aurait été probablement inutile.
Une Question de Programmation
Etant un système éducatif, le développement avec micro:bit ne ressemble pas à l'expérience que l'on peut avoir en utilisant les environnements de développement embarqués classiques tels que ARM Keil. Cela peut être gênant pour les puristes de l'embarqué, mais en pratique il est indispensable car de nombreuses universités n'ont pas assez de personnel compétent pour déboguer les programmes C++ (croyez l'auteur : les étudiants créent des erreurs de programmation vraiment complexes).
Au lieu de cela, on s'appuie généralement sur un quator composé d’Arduino IDE, CircuitPython, MakeCode et Scratch. Cependant, pour CLUE, seulement deux de ces environnements sont actuellement disponibles. MakeCode est en cours d’élaboration, sans une date de livraison précise, et on ne dispose d’aucune information sur Scratch. Un chargeur d‘amorçage série assurant le déploiement du code est inclus, tout comme le Raspberry Pi Pico.
Pour une première petite expérience, faisons fonctionner CircuitPython. Si vous connectez une nouvelle carte à l'ordinateur via le connecteur Micro-USB à l'arrière, l'écran affiche une page de status (Figure 4) qui fournit des informations sur l'état fonctionnel.
En appuyant deux fois sur le bouton reset situé au dos de la carte, le tampon de trame du dispositif de commande d'affichage à l'écran se fige. Le poste de travail connecté (l'auteur utilise Linux) voit alors une nouvelle clé USB où le code compilé peut être uploadé.
Fait intéressant, CLUE d'Adafruit est toujours visible par l'ordinateur. S'il n'est pas en mode bootloader, dmesg le détecte comme suit :
. . .
[28292.202193] usb 1-2.7: Manufacturer: Adafruit LLC
[28292.202195] usb 1-2.7: SerialNumber: 7687A137B6FDB874
[28292.204040] cdc_acm 1-2.7:1.0: ttyACM0: USB ACM device
Après une double pression sur le bouton reset, plutôt une clé USB apparaît, comme montré ici:
. . . .
[28371.624193] sd 10:0:0:0: Attached scsi generic sg6 type 0
Il est important de noter que ce lecteur ne reste pas activé pour toujours. S'il demeure inutilisé pendant plus de 30 secondes environ, le firmware se remet à un fonctionnement normal..
Recherche de fichier
En visitant l'URL https://circuitpython.org/board/clue_nrf52840_express/, nous pouvons faire notre première étape et télécharger le adafruit-circuitpython-clue_nrf52840_express-en_US-6.1.0.uf2 file. Il contient le runtime qui doit être placé sur la clé USB.
Il est intéressant de noter que vous trouverez également un fichier nommé CURRENT.UF2 sur le lecteur. Celui-ci vous permet de télécharger le firmware qui se trouve actuellement dans la mémoire du système cible.
Étrangement, le runtime n’est pas fourni pas avec une bibliothèque complète spécifique à tous les capteurs disponibles. Nous devons plutôt aller dans l’URL https://circuitpython.org/libraries pour télécharger l’archive adafruit-circuitpython-bundle-6.x-mpy-20210329.zip puis l'extraire dans un dossier approprié du système de fichiers.
À ce stade, vous devriez jeter un autre coup d'œil à l'écran de CLUE, car le runtime délivre en sortie et en permanence le contenu de la console. Un détail agréable est que le dispositif sur le PC—comme montré dans la figure 5—représente la mémoire interne de l'environnement de travail Python.
Il est important de déplacer les dossiers suivants de l'archive vers le dossier Libs du dispositif:
adafruit_bus_device
adafruit_display_shapes
adafruit_display_text
adafruit_lsm6ds
adafruit_register
Comme si cela n’était pas assez de travail, Adafruit s’attend également à ce que vous rassembliez les fichiers individuels suivants. Ce n’est pas clair pourquoi ils ne sont pas tous regroupés dans une seule archive:
adafruit_clue.mpy
adafruit_lis3mdl.mpy
adafruit_sht31d.mpy
adafruit_slideshow.mpy
neopixel.mpy
Example de Code
Pour un premier essai simple avec l'environnement Python, vous pouvez utiliser l'exemple fourni sur https://learn.adafruit.com/adafruit-clue/clue-spirit-level. Ceci implémente une application de niveau à bulle utilisant plusieurs idiomes spécifiques à CLUE.
La première étape du code consiste à inclure un ensemble de bibliothèques :
import displayio
from adafruit_display_shapes.circle import Circle
from adafruit_clue import clue
En plus de l'objet clue, qui assure diverses fonctions liées à la carte, importer la classe Circle est également intéressant ici. Le stack GUI permet à la fois de dessiner directement dans un frame buffer et de travailler avec des objets, convertis par le firmware, en éléments visibles à l'écran.
Dans la section suivante, le firmware initialise une référence à l'afficheur et assemble un objet groupe d'affichage :
clue_group = displayio.Group(max_size=4)
L'objet clue_group est intéressant du fait qu’il génère un élément parent qui rappelle un arbre DOM. Alors notre code crée plus ou moins des objets arbitraires dans cet arbre à afficher.
En regardant l'image de la figure 6, il s'ensuit que la prochaine étape du programme consiste à générer les trois cercles responsables de la représentation de la déviation et à les enregistrer pour la sortie :
middle_circle = Circle(120, 120, 75, outline=clue.YELLOW)
inner_circle = Circle(120, 120, 35, outline=clue.GREEN)
clue_group.append(outer_circle)
clue_group.append(middle_circle)
clue_group.append(inner_circle)
On trouve ensuite quelques tâches de housekeeping, dont le sens est plus facile à comprendre en examinant l'exemple de code ci-dessous :
bubble_group = displayio.Group(max_size=1)
level_bubble = Circle(int(x + 120), int(y + 120), 20, fill=clue.RED, outline=clue.RED)
bubble_group.append(level_bubble)
clue_group.append(bubble_group)
display.show(clue_group)
Enfin et surtout, nous avons besoin d'une boucle qui analyse les valeurs de position fournies par la bibliothèque Adafruit via l'attribut acceleration et qui les écrit dans les propriétés de l'objet bubble_group:
x, y, _ = clue.acceleration
bubble_group.x = int(x * -10)
bubble_group.y = int(y * -10)
La façon la plus pratique d'exécuter rapidement un code sur CLUE est d'utiliser le fichier code.py montré à la Figure 5. Le firmware CircuitPython l'exécute automatiquement à chaque démarrage. La figure 6 représente ce que vous pouvez obtenir.
En raison de la présence d'une radio Bluetooth, celle-ci peut également être utilisée pour communiquer avec l'ordinateur hôte. Sur [3], Adafruit fournit un exemple amusant qui illustre l'utilisation de l'API Bluetooth web implémentée dans Google Chrome.
Et Maintenant en Utilisant le C
Python est peut être un moyen rapide d'obtenir des résultats non bureaucratiques d'un système embarqué. Cependant, la performance maximale est obtenue en utilisant le langage C. En particulier, sur un système radio mono core, la mise en œuvre d’une communication est un défi si l'on veut que l'application ne soit pas assaillie par des problèmes de timing. A cause de ça, Adafruit oblige plus ou moins les développeurs à utiliser Arduino IDE. Ensuite Un système d'exploitation temps réel fonctionne en arrière-plan, allouant la puissance de calcul aux différentes tâches.
Sous Linux, la première étape nécessite un paquet d'extension qui permet à Arduino IDE (version 1.8.6 ou supérieure) de communiquer avec le bootloader non standard de CLUE :
Collecting adafruit-nrfutil
. . .
Successfully installed adafruit-nrfutil-0.5.3.post13
Ensuite, il faut saisir l'URL https://www.adafruit.com/package_adafruit_index.json dans le Board Manager pour rendre le package de la carte Adafruit nRF52 disponible pour le téléchargement. Une fois ces étapes terminées, la carte sera disponible sous Tools > Board > Adafruit CLUE.
Malheureusement, comme dans le cas de CircuitPython, l’installation de ces bibliothèques et des autres paramètres est un processus laborieux. Vous trouverez plus d’informations à ce sujet dans[4].
CLUE: Est-ce Que Ça Vaut le Voup?
Si vous optez pour CLUE, vous obtenez une plateforme d'évaluation très attrayante, agréable à utiliser dans le domaine de l'interfaçage en combinaison avec les avantages d'un écran couleur. D’autre part le prix est relativement élevé par rapport au BBC micro:bit, qui coûte nettement moins cher. Il faut également noter que CLUE n'est pas compatible à 100% avec micro:bit. L'expérience nous apprend que ce détail insignificatif a le plus grand impact et c’est précisément lorsque l'on se trouve dans une situation difficile, comme la migration d'un projet existant et fonctionnel entre les deux plateformes.
Pour ceux qui veulent travailler avec un microcontrôleur propre, basé sur la technologie Nordic, ou un module radio vous serez probablement mieux servis par une carte d'évaluation classique. En résumé, CLUE est un produit attachant pour ceux qui veulent profiter d'un micro:bit BBC mais qui ont besoin d'un peu plus de performances ou d'un afficheur complet.
Questions ou Commentaires à propos CLUE
Avez-vous des questions techniques ou des commentaires à propos cet article ? Contactez l'équipe Elektor sur l'adresse editor@elektor.com.
Traduction: Asma Adhimi
Discussion (0 commentaire(s))