Pour comprendre

Pour comprendre : principe général de l'utilisation de micropython

Le principe général est le suivant :

  • on connecte la carte avec Micropython sur le port USB : un port série lui est attribué : /dev/ttyACM0 par exemple sous Gnu/Linux
  • la carte va alors apparaître sur le système comme un disque : on voit les fichiers présents dans la flash
  • on va alors pouvoir :
    • soit lancer le mode interpréteur et interagir directement avec la carte : TOP pour tester !
    • soit écrire des codes (directement sur la flash ou même sur le pc) et les exécuter dans la foulée qui seront stockés soit en RAM, soit sur carte SD
    • soit pouvoir faire exécuter les codes au démarrage

Pourquoi micropython est-il intéressant ?

Python : un langage de haut niveau porté sur microcontrôleur

Le langage Python est un langage dit de "haut niveau" et dispose de plusieurs outils de codage particulièrement puissant pour coder rapidement des choses qui seraient plus compliquées à faire dans d'autres langage. Donc, en soi, le langage Python est très séduisant et personnellement, je l'utilise depuis plusieurs années déjà pour mes codages desktop et mini-pc. Micropython porte le langage python sur microcontrôleur : il est donc possible de coder en Python le microcontrôleur et de bénéficier de toute la puissance de ce langage sur une simple petite carte électronique.

Un microcontrôleur plus puissant

Ce faisant, passer à micropython, c'est également bénéficier d'un microcontrôleur plus puissant qu'avec Arduino : on dispose ici de 32bits@168Mhz (Pyboard) contre 8bits@16Mhz(Arduino UNO, Mega). De nombreuses fonctionnalités non-disponibles sur les cartes Arduino sont par ailleurs ici disponibles (conversion numérique-analogique (permettant de faire un générateur de fonction par exemple), compteurs pour encodeurs rotatifs, carte SD intégrée, RTC intégré, etc. ) Le prix et la mise en oeuvre sont par ailleurs en tout point comparables.

Un apprentissage "multi-plateformes" et "multi-usage"

En utilisant Micropython sur un microcontrôleur, on apprend un langage très polyvalent : le même langage permettra de coder également sur mini-pc (Raspberry Pi and co) ou sur poste fixe (aussi bien sous Gnu/Linux que Mac ou Windows). Python est un langage qui dispose de très nombreuses librairies permettant d'être "multi-usage" : interfaces graphiques, réseau, données, traitement d'image, sons, librairies mathématiques, astronomiques, protocoles divers (XML, HTML, NMEA, etc.), manipulation de fichier 3D ou 2D, etc. A peu près tout est possible en Python !

A l'inverse, si on connaît déjà Python, on retrouve tout ce qu'on aime côté micro-contrôleur.

Micropython est multi-matériel

Micropython est un langage interprété qui va pouvoir être installé sur de très nombreuses cartes différentes, ce qui offre un niveau d'abstraction vis à vis du matériel qui est intéressant. Cela évite d'être enfermé dans une gamme trop contrainte de matériel ou de type de processeur. Le nombre de "ports", autrement dit le nombre d'architecture de microcontrôleur qui sont supportées par MicroPython sont déjà nombreuses, de l'ordre de la 20 aine. Et cela n'est à priori pas terminé...

Le Raspberry Pi Pico : un change gamer !

Au début 2021, l'arrivée du Raspberry Pi Pico a tout d'un "change gamer", apportant simultanément plusieurs disruptions (le prix, le caractère "conçu en interne" du microcontrôleur, etc.) qui vont probablement venir donner à Micropython son caractère de langage standard sur les plateformes à micro-contrôleur, au moins dans le cadre d'une approche didactique ou de type "maker".

"IoT ready" (IoT="Internet Of Things" = l'internet des objets)

Micropython est d'ors et déjà disponibles sur plusieurs cartes qui permettent la communication sans fil selon plusieurs protocoles : Wifi, bluetooth, sigfox, etc. Micropython permet donc de bénéficier de la puissance de Python pour mettre en oeuvre simplement des applications connectées embarquées ou même des serveurs embarqués.

Pas un véritable OS mais une sorte de "micro-OS"

Clairement, une carte Micropython n'est pas un OS, un système d'exploitation, tel qu'un système Linux que l'on peut installer sur un Raspberry Pi. Mais ce qui est extrêmement intéressant et aussi très agréable à utiliser, c'est que Micropython fourni en natif des librairies de "gestion système" telles qu'on les trouve sur un vrai système d'exploitation, notamment la gestion des répertoires, des fichiers, des volumes mêmes (mémoire flash ou carte SD), du temps voire de l'heure temps réel (RTC), etc. et en ce sens Micropython joue le rôle d'un réel "micro-OS" qui le distingue très clairement d'une solution de programmation en C tel qu'Arduino. Le caractère "interprété" du langage Python vient renforcer cette sensation de gestion en "ligne de commande" qui est le propre d'un système d'exploitation.

Selon moi, Micropython joue clairement au final le rôle d'un micro-OS pour micro-contrôleur, qui plus est en mode temps réel car il permet de gérer les GPIO, etc. de façon totalement directe et transparente.

Micropython apporte juste ce qu'il faut de complexité !

Et à contrario, le niveau "micro-OS" obtenu avec Micropython a l'avantage de ne pas apporter une complexité inutile pour de petits projets, à l'inverse du Raspberry Pi qui nécessite un système complet pour parfois simplement accéder au GPIO, avec tous les problèmes de sécurité d'un système Gnu/Linux complet que cela entraîne. On pourrait dire que Micropython apporte une sorte de juste équilibre entre des fonctionnalités "système" fournies en natif ce qui simplifie grandement les choses comparativement à du code C compilé tel qu'Arduino et un système Gnu/Linux complet qui apporte une complexité inutile tout en faisant perdre en réactivité pour les opérations de bas niveau.

Quelques avantages de l'utilisation du Python sur microcontrôleur

Test de code python possible sur desktop

Imaginez que vous soyez en train de développer un calcul de trajectoire ou que vous vouliez tester un bout de code Python un peu complexe ou "tordu" : le fait de coder en Python permet de réaliser le test sur son desktop dans l'interpréteur classique, tel que le notebook Jupyter, de faire quelques essais de validation, de vérifier le résultat obtenu et même d'afficher des graphiques de validation le cas échéant. Une fois le code validé, un simple copier/coller permet de l'utiliser sur le microcontrôleur avec micropython.

Doc et assistance Python très fournie

Python est un langage très utilisé et qui dispose d'une très grosse communauté d'utilisateurs, d'une section très active sur Stackoverflow (site sépcialisé de codeurs avec plus de 50 millions de membres, des réponses classées par niveau de pertinence, etc.)... et par conséquent, on trouve très vite et très rapidement les solutions aux divers problèmes de codage "pur Python" rencontrés. Micropython, c'est avant tout du Python, et donc tous les "trucs et astuces" du langage Python (et ils sont nombreux) sont valables pour utilisation sur le microcontrôleur !

Les ressources d'apprentissage du Python sont très (très) nombreuses

Les outils d'apprentissage du Python sont très nombreux et on met le pied dans un environnement de ressources disponibles très riche de ce point de vue.

Python est un langage de niveau professionnel

En apprenant Python, on n'apprend pas un langage "pour faire mumuse"... C'est un langage très puissant, très polyvalent, de niveau professionnel et sur lequel de nombreuses applications de qualité sont basées. C'est un langage moderne qui simplifie la syntaxe tout en rendant le code plus efficace. Bref, un investissement "rentable", notamment pour de jeunes codeurs qui auront ainsi les bases pour aller très très loin avec ce langage à peu près sans limites.

Langage Python, CPython, Micropython : quelles différences ?

Le Langage Python

En soi, le langage Python est un langage de programmation de haut niveau, interprété. Pour pouvoir être utilisé le langage Python nécessite un "moteur logiciel" ou "moteur Python" comme on veut, qui va être capable de comprendre et exécuter les instructions Python.

En soi, donc, le langage Python n'est pas attaché à une plateforme donnée.

Concrètement, un "moteur" de langage Python est à la base du code C qui est compilé pour une plateforme donnée. Et il existe plusieurs implémentations de ce langage : CPython, Micropython et même Brython.

CPython, le Python pour desktop

L'implémentation la plus usuelle et la plus habituelle est l'implémentation de Python pour micro-processeur qui tourne sur un système d'exploitation qui s'appelle CPython (mais que l'on nomme le plus souvent Python tout simplement).

Cette implémentation de Python, celle que l'on utilise par défaut lorsque l'on programme en Python, comprend :

  • des fonctions et instructions dîtes "built-in" : c'est le coeur du langage
  • des librairies rassemblant des fonctions supplémentaires dédiées, organisées par thématiques, pour gérer les fichiers, le temps, etc. Il existe de très nombreuses librairies qui sont considérées comme partie intégrantes du langage Python et que l'on appelle "librairies standards"
  • des librairies supplémentaires écrites en Python ou compilées à partir du C et qui fournissent un très large éventail de possibilités : réseau, web, graphiques, maths, science, interface graphique, machine Learning, etc. Certaines de ces librairies sont tellement utilisées qu'elles sont considérées quasiment comme des "standards". Ainsi de numpy, matplotlib, etc. Le nombre de librairies disponibles est très important, de l'ordre de plusieurs milliers.

Un desktop ayant des ressources matérielles importantes (mémoire RAM, espace disque, puissance de calcul,...) le CPython n'est à peu près pas limité dans ses possibilités d'implémentation dans ce contexte.

Micropython, le Python pour micro-contrôleur

Micropython est une implémentation du langage Python dédiée pour micro-contrôleur, autrement dit pour des plateformes "très petites" en terme de ressources matérielles (RAM, capacité de calcul). Nécessairement, Micropython n'implémente pas l'intégralité des possibilités du CPython, mais il permet de retrouver sur microcontrôleur l'essentiel, le coeur de ce qui fait le langage Python, et même un peu plus.

Ainsi à ce jour, Micropython implémente :

  • les fonctions "built-in" : le coeur du langage
  • quelques librairies standards essentielles, notamment celles pour gérer les fichiers, le temps, etc. Ce qui d'ailleurs confère à mon sens à MicroPython un statut de "micro-OS" permettant d'interagir avec la plateforme sur laquelle il est implémenté de façon interactive, en "ligne de commande" via l'interpréteur Python. C'est beaucoup moins qu'un vrai OS, mais c'est beaucoup plus qu'un simple micro-contrôleur.
  • des librairies "hardware" dédiées pour le cas de l'utilisation d'un micro-contrôleur, à savoir la gestion des communications SPI, UART, I2C, 1-wire, DHT, l'utilisation de certains matériels usuels tels que afficheurs LCD, etc.
  • et on commence à voir des implémentations de quelques librairies "essentielles", telle que Numpy par exemple qui a un portage allégé pour Micropython... Encore expérimental, mais très prometteur.

Note

Pour distinguer les librairies CPython des librairies Micropython, le nom des librairies est précédé d'un u dans le cas de Micropython. Ainsi, la librairie CPython os s'appelle uos en Micropython, la librairie CPython io s'appelle uio en Micropython, etc. On trouvera la listes de librairies / modules implémentés en Micropython ici

Franchement, c'est vraiment pas mal, l'essentiel y est et est très suffisant dans un contexte d'usage sur microcontôleur.

Et aussi... Brython, le Python pour navigateur web !

Dans la même logique de diffusion de Python "à tous les étages"... il existe un portage de Python pour navigateur Web, j'ai nommé Brython ! Brython est le diminutif de "Browser-Python".

Il n'y a pas de lien direct avec Micropython en soi, mais il s'agit de la même logique d'implémentation du langage Python dans un contexte différent du contexte "desktop" ou "système". Techniquement, Brython est une implémentation de Python basée sur Javascript qui est le seul langage de programmation possible dans le navigateur à ce jour (mais çà pourrait bien changer à terme...).

De la même façon, Brython va implémenter :

  • les fonctions "built-in" : le coeur du langage
  • quelques librairies standards, celles qui font sens dans le contexte d'une utilisation web "client side"
  • des librairies dédiées propres au contexte d'une utilisation web "client side", tel que websocket, ajax, etc.
  • et cerise sur le gâteau, Brython supporte l'intégration/utilisation simplifiée de librairies Javascript existantes dans le code Brython lui-même (en permettant d'exposer les objets Javascripts dans le code Python).

C'est un autre domaine que je développe par ailleurs, mais je le cite ici pour bien faire comprendre et saisir le principe des implémentations multiples du langage Python.

Pour plus d'informations sur Brython, voir ici.

Micropython et pyduino

Micropython est un portage du langage Python sur microcontrôleur et à ce titre, en plus du langage Python lui-même, micropython expose les éléments hardware (broches GPIO, mesures analogiques, PWM, timer, etc.) via des fonctions micropython dédiées. L'ensemble des fonctions fournies est très complet et pourra le cas échéant sembler "complexe" comparativement à une utilisation de type "arduino".

C'est pourquoi j'ai porté la librairie Pyduino que j'avais écrite en 2013 (portage des instructions Arduino en Python sur mini-pc) en micropython. Cette version de Pyduino s'appelle upyduino (toutes les libs pour micropython sont préfixées d'un u) et s'utilise ici par simple copier/coller d'un fichier dans la flash de la carte utilisée : une fois fait il suffit de l'importer dans son code pour exposer les fonctions "Arduino like" dans le code Python.

Il est donc possible, de cette façon, d'écrire des codes Python utilisant des fonctions "à la arduino" sur les cartes micropython. Cela permet de garder les "réflexes" déjà acquis avec Arduino et de transposer plutôt facilement des codes d'une plateforme vers l'autre.

Ce faisant, upyduino n'est qu'une simple ré-écriture des fonctions Arduino avec les instructions micropython : ainsi upyduino n'est qu'un code micropython et par conséquent, micropython reste directement et totalement accessible depuis un code qui utilise upyduino. De plus, upyduino ne fait que 10-15ko et donc n'impute quasiment pas les ressources disponibles sur la carte micropython. Enfin, upyduino ne concerne que les fonctions "dédiées microcontrôleur" et n'impacte et ne modifie en rien le langage Python lui-même. En clair, "on a le beurre et l'argent du beurre" !

Sur ce site, vous trouverez une section Micropython qui exposera les fonctions natives micropython et une section upyduino qui exposera l'utilisation de upyduino.

Note

En pratique, je vous conseille de débuter avec upyduino pour ensuite approfondir au besoin les fonctions natives micropython.

Pourquoi Pyduino ?

Pourquoi vouloir conserver les fonctions "Arduino-like" (=Pyduino) en Python ? Les fonctions du langage micropython ne suffisent-elles pas ?

Soyons clair, tout ce que fait Pyduino repose sur micropython, donc micropython sait le faire.

Par contre :

  • les instructions Arduino-like ne concernent que la partie "micro-contrôleur" (accès GPIO, fonctions hardware, etc.) et préservent complètement par ailleurs les atouts du langage Python, véritable plus-value de micropython. Mais Arduino a apporté une couche d'abstraction vis à vis du matériel qui a fait tout son succès et il est très tentant de garder cette abstraction. Ainsi, les broches au lieu de s'appeler X1, Y17 ou G21 sont simplement numérotées de 0 à xx selon la carte : simple !

  • les instructions Arduino-like sont simples et c'est ce que l'on souhaite en pratique. Ainsi, lire une broche analogique se résume à analogRead(broche) là où en micropython il faut caster une broche en ADC avant de réaliser une mesure. De la même façon, la génération d'une onde PWM se fait avec simplement analogWrite() là où en micropython il faut configurer un timer, un channel, une fréquence, et associer le tout à une broche.

  • si on vient de l'Arduino, on a pris des réflexes de codage que l'on peut transposer facilement : on est vite opérationnel. De plus, les utilisateurs Arduino sont très nombreux et une nouvelle plateforme ne peut pas faire l'impasse sur cette communauté. Les codes existants sont par ailleurs nombreux et donc source d'inspiration assez simples à transposer en Pyduino.

  • les cartes et autres shields Arduino sont nombreux, permettant simplement d'utiliser des capteurs, moteurs, etc... et le plus court chemin vers l'utilisation de ce matériel existant est la transposition similaire des noms de fonctions, de broches, etc.

Note

Pour dire les choses simplement, avec Pyduino, on a le meilleur des 2 mondes : la puissance du langage Python, la simplicité de l'Arduino pour la partie microcontrôleur.

A vous de jouer

S'installer pour utiliser micropython, c'est très simple : vous avez besoin d'une carte tournant sous micropython, d'un poste fixe, d'un éditeur de texte à coloration syntaxique.

Le plus simple, c'est d'utiliser une carte Pi Pico Prêt ? C'est parti...

Liens utiles