Notions de base de CircuitPython pour un prototypage et un développement rapides avec microcontrôleur

Par Steve Leibson

Avec la contribution de Rédacteurs nord-américains de DigiKey

Bien que le langage Python ait rendu la programmation plus accessible, il a été conçu pour s'exécuter sur PC et sur des machines dotées d'un niveau considérable de ressources de traitement, de mémoire et d'autres ressources périphériques. Pour les systèmes embarqués soumis à des contraintes d'interface et de ressources plus strictes, une version optimisée pour les microcontrôleurs, appelée MicroPython, a gagné du terrain. L'ampleur de cette montée en puissance a amené la communauté open-source à adapter MicroPython à des microcontrôleurs et des cartes de développement spécifiques pour prendre en charge le développement plus poussé de microcontrôleurs.

Cet article présente un exemple de cette adaptation, le langage CircuitPython d'Adafruit. Après un bref exposé sur Python, notamment sa comparaison avec le langage de développement embarqué classique C++, l'article traite de l'évolution de Python vers MicroPython puis vers CircuitPython. Il décrit ensuite le processus d'écriture de logiciels à l'aide de CircuitPython avant de présenter quelques cartes de développement d'Adafruit et d'autres fournisseurs prenant en charge l'environnement CircuitPython.

La naissance de Python

La carte de développement Arduino originale et ses nombreux successeurs sont depuis toujours très populaires pour les projets des makers, des amateurs et des étudiants, ainsi que pour les prototypes embarqués. Cependant, l'environnement de développement intégré (IDE) et le langage de programmation d'Arduino sont basés sur C++, un langage compilé puissant mais complexe doté d'une syntaxe inhabituelle et de règles de ponctuation strictes que les programmeurs novices jugent rébarbatives.

Python est un langage de programmation plus récent. Il s'agit d'un langage orienté objet, interprété et interactif qui combine une puissance de programmation exceptionnelle et une syntaxe très claire. Il est renommé pour sa facilité d'écriture et sa lisibilité, ainsi que pour sa syntaxe simplifiée. La combinaison de ces caractéristiques permet de réduire le nombre d'erreurs de programmation et de faciliter la réutilisation du code pour accélérer le développement logiciel.

La nature interprétative du langage fournit un retour immédiat au programmeur, ce qui encourage l'expérimentation et favorise un apprentissage rapide. Par conséquent, Python est désormais le premier langage de programmation que les étudiants et les makers apprennent à utiliser.

L'inconvénient est que Python a été conçu pour s'exécuter sur des PC et des machines plus volumineuses dotées d'un niveau considérable de RAM, de grands espaces de stockage de masse et d'une interface utilisateur complète avec clavier, grand écran et souris. Il n'a pas été conçu en tant que langage de programmation embarqué. Cependant, une implémentation efficace et épurée du langage de programmation Python 3, appelée MicroPython, a émergé comme solution dédiée et optimisée pour une exécution adaptée aux ressources limitées d'un microcontrôleur.

Reconnaissant les mérites de MicroPython comme langage de programmation embarqué, la communauté open-source l'a adapté à certains microcontrôleurs et à certaines cartes de développement pour prendre en charge le développement plus poussé de microcontrôleurs. Par exemple, Adafruit a développé sa propre version de MicroPython, appelée CircuitPython. Conçu pour simplifier l'expérimentation et l'apprentissage de la programmation sur des cartes de microcontrôleur économiques, il est adapté aux microcontrôleurs et aux ressources matérielles disponibles sur les cartes de développement d'Adafruit. CircuitPython est préinstallé sur plusieurs cartes de développement d'Adafruit et peut être installé sur d'autres.

Différences entre C++ et Python

Étant donné l'élan et la présence de l'IDE Arduino et des nombreuses cartes de développement d'Arduino désormais disponibles, il est raisonnable de s'interroger quant à la nécessité d'une autre version de Python pour le développement de systèmes embarqués. La réponse se trouve dans la comparaison des langages.

C++ est une extension de l'ancien langage C avec des extensions orientées objet. Même avec ces extensions, le code C++ est quelque peu obscur, car il conserve la syntaxe C initialement créée par Brian Kernighan et Dennis Ritchie de chez Bell Labs entre la fin des années 60 et le début des années 70. Le langage C a été expressément conçu pour être facilement mappé dans les instructions-machine d'un processeur cible. La syntaxe du langage indique clairement que les besoins de la machine sont privilégiés au détriment de ceux du programmeur. Comme les microprocesseurs commerciaux ne sont apparus qu'en 1971, le langage C a été initialement développé pour les mini-ordinateurs. Les compilateurs C pour microprocesseurs sont progressivement devenus des outils pratiques durant les années 80. Le langage C a toujours été un langage compilé, tout comme C++.

L'informaticien danois Bjarne Stroustrup a commencé à développer C++ en 1979. Son premier manuel sur le langage a été publié en 1985. C++ n'est devenu un langage de programmation standard qu'en 1998. Comme le langage C, le langage C++ de Bjarne Stroustrup ciblait initialement les ordinateurs plus volumineux. Grâce à l'IDE Arduino, développé en 2003, C++ peut être utilisé sur les microcontrôleurs.

Python est également un langage orienté objet. Il a été développé par le programmeur néerlandais Guido van Rossumin et a été lancé en 1991. La conception syntaxique de Python met l'accent sur la lisibilité du code pour les humains, ce qui constitue une différence majeure entre Python et C++. La facilité d'écriture, qui est étroitement liée à la lisibilité, constitue un autre point fort de Python. Cette facilité d'écriture signifie que Python permet en général aux programmeurs d'écrire des applications plus rapidement, ce qui encourage l'expérimentation et peut réduire les cycles de prototypage et de développement.

La deuxième différence majeure repose sur le fait que Python est un langage interprété, tout comme le langage de programmation Basic qui est apparu dans les années 60 pour les mini-ordinateurs et qui s'est véritablement développé dans les années 70 avec l'introduction des micro-ordinateurs. Tout comme Basic, la nature interprétative de Python encourage l'expérimentation et donc l'apprentissage, notamment grâce à l'élimination du cycle de développement modification/compilation/téléchargement/exécution utilisé dans les langages de programmation compilés. Cependant, contrairement à Basic, Python constitue un langage orienté objet de haut niveau et moderne qui intègre les avancées informatiques survenues dans les cinquante années qui ont suivi le premier développement de Basic.

Par exemple, il n'est pas nécessaire de déclarer ou d'entrer les variables de Python avant leur utilisation. Les programmeurs n'ont pas à se demander si une variable doit être un entier ou un nombre à virgule flottante. L'interpréteur de Python s'en charge et définit les choix appropriés lors de l'exécution.

Le traitement des chaînes et la ponctuation constituent deux autres différences entre C++ et Python. De nombreux programmeurs jugent que le traitement des chaînes du langage C++ n'est pas clair et prête à confusion. Le traitement des chaînes de Python est beaucoup plus simple et rappelle les capacités de traitement des chaînes simples et populaires de Basic, qui ont été longtemps considérées comme un point fort du langage.

De même, la ponctuation de C et C++ (en particulier les accolades {}) constitue un autre obstacle fréquent pour les nouveaux programmeurs, et même pour les plus expérimentés. Il arrive très souvent qu'il y ait un nombre impair d'accolades dans le code de programmation. Le programmeur doit alors l'examiner minutieusement pour trouver l'emplacement de l'accolade manquante. La ponctuation de Python n'est pas aussi rigoureuse, mais utilise l'indentation, qui confère au code Python sa lisibilité.

Les origines de MicroPython

Tout comme C et C++, Python a été initialement conçu pour s'exécuter sur des ordinateurs plus volumineux. Par conséquent, le langage nécessitait trop de ressources et n'était pas adapté à la programmation de microcontrôleurs. Le programmeur et physicien australien Damien George a alors développé une version de Python appelée MicroPython, capable de s'exécuter sur les ressources plus limitées d'un microcontrôleur. Les cartes de développement d'Arduino ont été les cibles matérielles pour MicroPython.

La nature interactive de MicroPython se base sur son interface de commande, officiellement appelée la fenêtre REPL (read-eval-print-loop), qui fonctionne généralement grâce à une connexion série reliant un PC hôte à une carte de développement de microcontrôleur. L'interface REPL ressemble beaucoup aux interfaces de ligne de commande Basic des années 70 et 80. Elle reçoit les entrées utilisateur (expressions ou instructions simples), les évalue, puis retourne les résultats à l'utilisateur via la fenêtre REPL ou exécute la commande intégrée dans l'instruction.

À l'aide de l'interface REPL, il est possible d'interroger une variable, d'activer ou de désactiver une ligne E/S, ou d'envoyer une chaîne de caractères vers un périphérique connecté. La ligne est interprétée, puis directement exécutée dès qu'on appuie sur la touche Entrée. C'est la nature même d'un langage interprété.

Cette fonctionnalité de MicroPython simplifie la programmation et le débogage exploratoires, et constitue l'un des aspects expliquant la simplicité d'utilisation du langage, tant pour les programmeurs débutants que pour les plus expérimentés. L'interface utilisateur REPL prend en charge des cycles de développement plus rapides que le cycle classique de modification-compilation-exécution-débogage de l'IDE Arduino. Même les programmeurs chevronnés peuvent expérimenter de nouveaux types de périphériques de manière interactive à l'aide de l'interface utilisateur REPL de MicroPython.

Support CircuitPython pour les cartes de développement

Chaque microcontrôleur présente un jeu unique de périphériques, auquel s'ajoute chaque carte de développement. Ces périphériques nécessitent des bibliothèques de support. Cela s'applique tant à l'IDE Arduino qu'à MicroPython. En outre, il existe de nombreux dispositifs périphériques d'extension, comme les LED RVB adressables 1655 NeoPixel d'Adafruit, qui nécessitent également une bibliothèque de support.

Pour fournir un meilleur niveau de support, Adafruit a développé sa propre version de MicroPython, appelée CircuitPython, pour répondre aux exigences spécifiques de plusieurs cartes de développement de microcontrôleur économiques de la société. La société a également converti de nombreuses bibliothèques de périphériques depuis son immense collection Arduino en bibliothèques CircuitPython, proposant déjà un nombre important et croissant de bibliothèques de support périphérique pour CircuitPython.

Adafruit a conçu une gamme de cartes de développement de microcontrôleur spécifiquement dédiée à la prise en charge de CircuitPython. Citons notamment :

  • La carte 3333 Circuit Playground Express dotée de dix LED RVB contrôlables et adressables (Figure 1)

Image de la carte 3333 Circuit Playground Express d'Adafruit

Figure 1 : La carte 3333 Circuit Playground Express d'Adafruit comprend dix LED RVB contrôlables et adressables. (Source de l'image : Adafruit)

  • La carte de développement 3500 Trinket M0 qui mesure seulement 27 mm x 15,3 mm x 2,75 mm (Figure 2)

Image de la carte de développement 3500 Trinket M0 d'Adafruit

Figure 2 : La carte de développement 3500 Trinket M0 d'Adafruit mesure seulement 27 mm x 15,3 mm x 2 mm. (Source de l'image : Adafruit)

  • La carte 3501 Gemma M0 fait à peu près la taille d'une pièce de deux euros et peut être alimentée à partir de son port USB ou d'un port de batterie séparé (Figure 3)

Image de la carte 3501 Gemma M0 d'Adafruit

Figure 3 : La carte 3501 Gemma M0 d'Adafruit fait à peu près la taille d'une pièce de deux euros et peut être alimentée à partir de son port USB ou d'un port de batterie séparé. (Source de l'image : Adafruit)

  • La carte de développement 3403 Feather M0 Express comprend une petite zone de montage d'essai pour les circuits personnalisés (Figure 4)

Image de la carte de développement 3403 Feather M0 Express d'Adafruit

Figure 4 : La carte de développement 3403 Feather M0 Express d'Adafruit présente une petite zone de montage d'essai pour les circuits personnalisés. (Source de l'image : Adafruit)

Ces quatre cartes de développement de microcontrôleur d'Adafruit sont toutes basées sur la gamme de microcontrôleurs SAMD21 de Microchip Technology (anciennement Atmel) avec prise en charge USB native. Cependant, CircuitPython prend en charge bien plus de dispositifs que les cartes de développement d'Adafruit et le microcontrôleur SAMD21. Des versions de CircuitPython dédiées à d'autres cartes de développement avec d'autres modèles de microcontrôleurs émergent également, notamment les cartes de développement 3406 Feather NRF52 d'Adafruit et nRF52-DK de Nordic Semiconductor, toutes deux basées sur le microcontrôleur nRF52832 de Nordic Semiconductor. En outre, CircuitPython prend également en charge la carte de développement nRF52840-DK de Nordic Semiconductor (Figure 5), basée sur le microcontrôleur nRF52840 de la société. Les deux microcontrôleurs sur lesquels se basent ces trois cartes ont une fonction BLE (Bluetooth Low Energy) intégrée, avec une prise en charge logicielle adaptée.

Image de la carte de développement nRF52840-DK de Nordic Semiconductor

Figure 5 : La carte de développement nRF52840-DK de Nordic Semiconductor intègre la technologie BLE. (Source de l'image : Nordic Semiconductor)

Développer avec CircuitPython

Adafruit a adopté une approche unique pour intégrer CircuitPython sur les cartes de développement conçues pour une prise en charge immédiate du langage. Connectez l'une de ces cartes sur le port USB d'un PC hôte et la carte apparaît comme lecteur de disque. Le répertoire racine du lecteur de disque affiche les fichiers CircuitPython stratégiques, notamment l'interpréteur, le programme utilisateur et un dossier contenant les fichiers de la bibliothèque. Cette disposition permet au PC hôte d'accéder facilement à la carte de développement avec son système de fichiers existant et ses pilotes.

L'interface utilisateur CircuitPython sur le PC hôte requiert une interface REPL et un éditeur open-source, téléchargeable gratuitement. Adafruit recommande l'application open-source Mu illustrée à la Figure 6. L'écran Mu est divisé entre une fenêtre de code, où s'effectue la modification, et la fenêtre de commande et de surveillance REPL, où le programmeur contrôle l'interpréteur CircuitPython de la carte de développement.

Image de l'interface de programmation open-source Mu d'Adafruit

Figure 6 : Adafruit recommande l'utilisation de l'interface de programmation open-source Mu. L'écran Mu est divisé entre une fenêtre de code, où s'effectue la modification, et la fenêtre de commande et de surveillance REPL, où le programmeur contrôle l'interpréteur CircuitPython de la carte de développement. (Source de l'image : codewith.mu/en/tutorials/1.0/adafruit)

Le fait de saisir un programme dans la fenêtre de code et de cliquer sur le bouton « Save » de Mu permet d'enregistrer le code sur les cartes de développement CircuitPython d'Adafruit, dans la vaste mémoire Flash intégrée du microcontrôleur SAMD21. L'ensemble du code CircuitPython réside sur la carte de développement, dans la mémoire Flash du microcontrôleur. Rappelez-vous que la carte CircuitPython ressemble à un lecteur de disque. D'un point de vue du système d'exploitation, ce mode de fonctionnement est donc tout à fait normal.

Conclusion

Le langage Python offre aux programmeurs de nombreux avantages, notamment des fonctions interactives de programmation, d'expérimentation et de débogage. Il présente une syntaxe de langage simplifiée, plus humaine, sans nécessiter de déclaration ou d'entrée de variables et sans ponctuation rigoureuse. MicroPython constitue une variation de Python 3 qui permet la programmation des microcontrôleurs sous Python.

Comme indiqué ici, Adafruit a adapté MicroPython pour dériver CircuitPython, pour une prise en charge matérielle directe destinée à simplifier davantage l'expérimentation et l'apprentissage, et à accélérer le développement logiciel. CircuitPython prend déjà en charge plusieurs cartes de développement de microcontrôleur économiques basées sur les microcontrôleurs SAMD21 de Microchip, ainsi que d'autres cartes de développement basées sur les microcontrôleurs nRF compatibles BLE de Nordic Semiconductor.

Avertissement : les opinions, convictions et points de vue exprimés par les divers auteurs et/ou participants au forum sur ce site Web ne reflètent pas nécessairement ceux de DigiKey ni les politiques officielles de la société.

À propos de l'auteur

Steve Leibson

Steve Leibson a été ingénieur système pour HP et Cadnetix, rédacteur en chef pour EDN et Microprocessor Report, blogger technique pour Xilinx et Cadence (entre autres), et il est intervenu en tant qu'expert technologique dans deux épisodes de "The Next Wave with Leonard Nimoy". Il a aidé les ingénieurs de conception à développer des systèmes améliorés, plus rapides et plus fiables pendant 33 ans.

À propos de l'éditeur

Rédacteurs nord-américains de DigiKey