Comment fonctionne « Arduino Python »
Cette page décrit exactement ce que fait notre atelier « Arduino Python » — ce qu'il traduit, ce qu'il refuse, et où il s'écarte de Python. Elle s'adresse à qui veut vérifier plutôt que croire.
1. Ce n'est pas MicroPython qui tourne sur la carte
L'élève écrit de la syntaxe MicroPython. La plateforme la traduit en C++ Arduino, compile ce C++, et envoie le résultat à la carte. Aucun interpréteur Python ne s'exécute sur le microcontrôleur.
Ce n'est pas un choix de commodité : un Arduino Uno ne peut pas héberger MicroPython. Les chiffres le disent mieux qu'une explication.
| Ressource | Arduino Uno (ATmega328P) | MicroPython, port minimal |
|---|---|---|
| Mémoire de programme | 32 Ko | ~256 Ko |
| Mémoire vive | 2 Ko | ~16 Ko |
Un facteur huit sur les deux. Toute plateforme qui annonce « MicroPython sur Uno » sans autre précision fait la même chose que nous — une traduction — ou ne dit pas ce qu'elle fait.
2. Un sous-ensemble, et le mot est important
Traduire un langage dynamique vers un langage statique, sur une machine à 2 Ko de mémoire vive, ne se fait pas sans perte. Ce qui est disponible est un sous-ensemble de la syntaxe, et tout ce qui n'en fait pas partie est refusé en le nommant — jamais ignoré en silence.
Traduit
- if / elif / else
- while True — devient la boucle loop()
- for i in range(n)
- variables numériques, opérations, comparaisons
- and, or, not — dans une condition
- machine.Pin(n, Pin.OUT), .value(), .on(), .off()
- time.sleep(), time.sleep_ms()
Refusé, avec sa raison
- listes et dictionnaires — pas de tas dans 2 Ko
- def, class, lambda, yield
- try / except — pas de mécanisme d'exception
- break, continue, return
- print — la carte n'a pas d'écran
- une variable qui change de type
- les modules autres que machine, time, digibus
3. Les quatre endroits où Python et le C++ ne disent pas la même chose
C'est la partie qui compte, et celle qu'on tait d'habitude. Traduire naïvement chacune de ces expressions donnerait un résultat faux sans provoquer la moindre erreur — le pire type de défaut, parce qu'il se recopie. Voici ce que nous produisons, et pourquoi.
| Écrit | Python | C++ naïf | Ce que nous produisons |
|---|---|---|---|
| 3 / 2 | 1.5 | 1 | ((float) 3 / (float) 2) |
| -7 // 2 | -4 | -3 | floor(...) |
| -7 % 3 | 2 | -1 | fmod(fmod(a,b)+b,b) |
| x = a or b | rend a ou b | rend vrai/faux | refusé hors condition |
Le simulateur applique exactement les mêmes règles que le code envoyé à la carte : un programme donne le même résultat à l'écran et sur le matériel, y compris sur les nombres négatifs.
4. Ce que nous ne pouvons pas corriger
- La largeur des entiers. Python compte sans limite ; la carte compte sur 32 bits dans nos croquis. Un nombre au-delà de deux milliards environ cesse d'être exact.
- La double précision n'existe pas. Sur AVR, « double » est identique à « float » — 32 bits. Un calcul qui demande plus de précision donnera un autre résultat qu'en Python, et aucune traduction n'y peut rien.
- La récursion profonde. La pile d'appels tient dans les 2 Ko partagés avec tout le reste.
5. La vérification que nous vous proposons
L'atelier affiche le C++ produit à côté du Python écrit, ligne pour ligne, pendant que l'élève tape. Il est téléchargeable en fichier .ino et s'ouvre dans le logiciel Arduino officiel.
Nous ne vous demandons donc pas de nous croire : le code envoyé à la carte est lisible, vérifiable et compilable ailleurs. Et il est identique à celui que produit notre éditeur de blocs pour le même programme — c'est le même traducteur.