Quels langages choisir pour la Pi Pico : MicroPython, CircuitPython, code Arduino ou SDK natif ?

Il existe une multitude de langage disponibles pour programmer la Raspberry Pi Pico ; on peut facilement se retrouver perdu devant toutes ces possibilités. L’objectif de cet article est de vous présentez les différents langages avec leurs atouts et leurs faiblesses pour que vous puissiez choisir le bon langage pour vous.

Un peu d’histoire

Historiquement, les microcontrôleurs sont programmés en C/C++ avec un SDK généralement fourni par le fabricant. Un SDK (Software Développent Kit en anglais) est un ensemble de librairies qui facilite le travail des développeurs. La programmation très bas niveau est gérée par le SDK et est donc cachée du développeur. Il s’agit de la manière professionnelle pour développer des programmes pour des microcontrôleurs. Le principal inconvénient est qu’il y a un SDK différent pour chaque type de microcontrôleur.

L’arrivé d’Arduino aux débuts des années 2000, a complétement révolutionné ce milieu en rendant la programmation en C++ abordable aux amateurs et même aux débutants grâce au fameux code Arduino et à ses nombreuses librairies disponibles. On utilise des fonctions et des librairies très simples qui utilisent en arrière-plan le SDK dédié du microcontrôleur. Avec les années, d’autres cartes non Arduino ont été intégrées au sein du logiciel Arduino IDE comme les ESP8266, ESP32 ou encore la Raspberry Pi Pico récemment. Ainsi on peut avec presque le même code, l’exécuter à la fois sur une Arduino, une ESP32 ou encore une Pi Pico. Cela donne l’impression d’avoir un code « universel » même si derrière ce sont bien différents compilateurs qui sont utilisés pour chaque type de carte. Les librairies sont pour la plupart compatible sur différentes cartes même s’il y en a qui sont spécifiques : par exemple la gestion du Wi-Fi de l’ESP32 de marchera pas sur une simple Arduino, car il n’y a pas de Wi-Fi de base

Ces dernières années, la popularité croissante du langage Python fait qu’il y a eu un portage de celui-ci sur les microcontrôleurs : il est désormais possible d’exécuter des scripts Python basique sur des petits microcontrôleurs. Cette version ‘embarquée’ de Python est connue sous le nom de MicroPython. Contrairement au code Arduino, le code n’est pas compilé sur l’ordinateur mais directement interprété à la volée par MicroPython. Il est disponible sur la plupart des microcontrôleurs 32-bit utilisés par les Makers : STM32, ESP8266, ESP32, Raspberry Pi Pico mais pas sur l’Arduino. Comme pour le code Arduino, le code Python est portable entre les différents types de cartes, même s’il y a des fonctions spécifiques à chaque carte. Puisqu’il n’y a pas de compilation, le chargement d’un nouveau programme est très rapide et permet de prototyper très rapidement. De plus, Python est un langage simple à apprendre et est très utilisés dans les domaines scientifiques, de data-science, d’intelligence artificielle. Tous ces avantages surtout pour les débutants, fait qu’il est mis en avant par la fondation Raspberry Pi.

MicroPython VS Arduino IDE VS SDK

Maintenant que les différents langages ont été introduits, ils vont être comparés sur différents critères :
  • Outils de développement nécessaires

  • Complexité du code

  • Temps de développement

  • Rapidité d’exécution du code

  • La communauté associée

Les outils nécessaires sur l’ordinateur

Le grand gagnant est MicroPython car il n’y a besoin d’aucun SDK, d’aucun compilateur mais juste d’un éditeur texte et d’un terminal série pour communiquer avec la carte. Il suffit d’un seul éditeur de code pour toutes les types de cartes car c’est l’interpréteur Python du microcontrôleur qui se charge du travail. Il existe une pléthore d’éditeur de texte comme VS Code, Notepad++, Sublime Text voir le bloc note de Windows.

Les logiciels utilisés par la communauté des makers est Thonny IDE, Mu pour leur simplicités ou VS Code avec une extension.

A contrario, pour programmer en C/C++ avec le SDK de base ou via l’Arduino IDE, il faudra télécharger pour chaque type de carte tous les fichiers nécessaires pour la compilation du programme. D’ailleurs on ne se rend pas forcément compte de la quantité de fichiers nécessaires lorsqu’on installe une nouvelle carte via l’Arduino IDE car il suffit d’appuyer sur un bouton et le logiciel s’occupe du reste.

Par exemple, il y a 550 Mo de fichiers nécessaires pour l’ESP32 et 400 Mo pour la Raspberry Pi Pico.

Taille package ESP32 et Raspberry Pi Pico sur l'Arduino IDE

Il y a un package avec tous les fichiers nécessaires pour chaque catégorie de carte

Complexité du code

Pour ce qui est de la difficulté du langage de programmation, la 1 ère place se partage entre le code Arduino et MicroPython et dépend de vos compétences dans ses langages. Le code Arduino a été conçus justement pour être simple à appréhender par les débutants même s’il s’agit de la programmation en C++. En effet, la structuration du code (avec les fameuses fonctions setup() et loop()) et ses librairies quasi universelles entre les cartes (Serial, SD, gestion des GPIO, capteurs) rendent la programmation en C++ abordable. Si vous programmez déjà des Arduinos et que vous n’avez jamais fait du Python, alors vous serez surement plus à l’aise en restant avec du code Arduino. Ceci-dit, le Python est de base plus simple et plus intuitif que le C++ : les variables ne sont pas typées, une gestion des chaines de charactères et des tableaux pratique …

Si vous avez déjà fait du Python sur ordinateur, alors MicroPython sera très facile à prendre en main.

La programmation avec le SDK natif du constructeur est bien sûr la solution la plus complexe mais aussi celle qui donne le plus de liberté possible, d’où son utilisation dans le milieu professionnel.

Temps de développement

Une fois de plus le gagnant est MicroPython car puisque le code est interprété et non pas compilé, le chargement d’un nouveau code est super rapide. Le fait de pouvoir changer une ligne de code dans le programme et de pouvoir tester presque instantanément le nouveau code constitue un énorme gain de temps.

Ce temps de compilation est peu gênant si on utilise une carte Arduino, mais sur une carte ESP32 le temps de compilation est facilement entre 30s et plusieurs minutes en fonction de la puissance de l’ordinateur.

De plus, on peut aussi tester des portions de code Python directement sur l’ordinateur au lieu de faire sur le microcontrôleur. Si on n’utilise pas les fonctions propres de MicroPython, il est possible par exemple de tester des fonctions qui manipulent des tableaux, du texte.

Rapidité de l’exécution du code

C’est la bête noire de MicroPython car le code n’est pas préalablement compilé en instructions machine. Le grand gagnant est sans hésiter l’utilisation du SDK natif, qui permet de programmer le plus proche possible du hardware (accès direct aux registres). Le code Arduino arrive en deuxième place : la surcouche introduite via le code Arduino rajoute beaucoup de codes de configuration et de vérification avant d’utiliser les fonctions du SDK. (la fonction pinMode() par exemple.

S’il y a besoin de faire des tâches avec des contraintes de temps précise à respecter, alors MicroPython ne sera pas le bon langage pour ce programme. De plus, ce ne sera pas non plus le langage à privilégier s’il on veut économiser au maximum l’utilisation d’une batterie. Qui dit plus de temps pour exécuter un programme dit plus d’énergie consommée. Ceci étant, pour la plupart des projets électroniques DIY, la lenteur de MicroPython ne sera pas néfaste car les librairies utilisées pour interagir avec les capteurs seront optimisées.

Note

En effet, il est possible d’écrire des portions critiques du code en C depuis MicroPython, mais l’on perd les avantages majeurs du Python.

La communauté

C’est le critère qu’il ne faut pas négliger. En effet, ce qui a fait que le code Arduino est devenu aussi populaire, c’est grâce à sa communauté. Les tutoriels, les livres, les documentations, les librairies disponibles font la force d’un langage. Le gagnant à ce jour, est probablement le code Arduino avec ses centaines de librairies disponibles pour tout type de capteurs et ses nombreux tutoriels disponibles sur la toile. Puisque MicroPython est plus récent, sa communauté est plus faible mais elle ne fait que grandir de jour en jour. Cela se traduit par moins de tutoriels (surtout en français) et moins de librairies supportées pour le moment. Le fait qu’il ne soit pas disponible sur les cartes Arduino 8-bit limite aussi la taille de sa communauté : il faut avoir une pyboard, soit une ESP32 ou une Pi Pico.

Dérivé Python : MicroPython VS CircuitPython

Jusqu’à maintenant, le comparatif était fait entre du code compilé en C++ avec MicroPython. Cependant, il existe également un dérivé de MicroPython développé par Adafruit qui s’appelle CircuitPython. Il a été pensé dès sa conception pour être le plus simple et le plus facile d’accès possible. Adafruit a développé sa propre version de MicroPython pour intégrer le plus facilement possible ses cartes de développement et ses capteurs. La société américaine a également converti la plupart de ses librairies Arduino en bibliothèques CircuitPython. Il n’est donc pas nécessaire d’aller chercher des librairies externes, ce qui est pratique lorsqu’on débute.

C’est donc une très bonne alternative à MicroPython pour les débutants qui n’ont jamais fait de programmation à condition d’utiliser les produits d’Adafruit et d’être bon anglais. En effet, puisque qu’Adafruit est une entreprise américaine, la quasi-totalité des tutoriels disponibles sont en anglais et la communauté est essentiellement anglophone. Cette barrière de la langue complexifie au final l’apprentissage de CircuitPython.

C’est pourquoi je vous conseille même si vous débutez d’utiliser MicroPython au lieu de CircuitPython.

Recapitulatif

Voici un tableau récapitulatif des forces et faiblesses de chaque langage :

Code Arduino VS MicroPython VS CircuitPython VS SDK natif

Code Arduino

MicroPython

CircuitPython

SDK natif

Outils nécessaires

⭐⭐

⭐⭐⭐⭐⭐

⭐⭐⭐⭐⭐

⭐⭐

Simplicité du code

⭐⭐⭐⭐

⭐⭐⭐⭐⭐

⭐⭐⭐⭐⭐

Temps de developpement

⭐⭐⭐

⭐⭐⭐⭐⭐

⭐⭐⭐⭐⭐

Rapidité d’execution

⭐⭐⭐

⭐⭐⭐⭐⭐

Communauté

⭐⭐⭐⭐⭐

⭐⭐⭐

⭐⭐