Aujourd’hui, la programmation de microcontrôleurs se fait généralement en C/C++. Ce langage permet certes de tout réaliser, mais la programmation est laborieuse et sujette à erreurs. Avant de pouvoir programmer quelque chose, il faut en outre installer et configurer une chaîne d’outils. Selon le matériel, même la configuration de l’environnement de développement est déjà un obstacle. Selon les réglages, on peut même détruire définitivement son microcontrôleur (flasher).
Il existe certes depuis un certain temps des alternatives, par exemple Micropython ou Circuitpython. Tous deux sont des interpréteurs spécialement conçus pour les microcontrôleurs et basés sur le célèbre langage de programmation Python. Python a toutefois le grand inconvénient d’être un langage dynamiquement typé qui utilise beaucoup de mémoire et présente un comportement d’exécution moins bon. La puissance de calcul et la mémoire sont disponibles en grande quantité sur les PC normaux, mais pas sur les microcontrôleurs. C’est pourquoi on ne peut aujourd’hui que choisir entre un travail efficace mais coûteux avec C/C++ et un travail rapide et compact avec Micropython, mais lent et avec de grandes limites de mémoire.
NanoPy comble cette lacune. Le langage est typé statiquement avec une gestion statique de la mémoire. Il peut ainsi gérer très efficacement les ressources limitées d’un microcontrôleur. Mais il est également facile à utiliser, car il reprend des concepts de langage connus du populaire langage Python. Cela est possible grâce à une technique de compilation moderne qui peut, dans une certaine mesure, imiter les pratiques de programmation dynamique. Lors de l’exécution, NanoPy génère un bytecode compact qui est exécuté sur la machine cible via un interpréteur efficace. Comme il n’utilise pas de mémoire dynamique, NanoPy est très robuste et fonctionne de manière stable, même à long terme.
exemple :
background(0,0,0)
for i in 100:
x = random(0,240)
y = random(0,240)
r = random(0,20)
drawCircle(x,y,r)
update()
Il existe de nombreux outils pour NanoPy, qui manquent généralement aux microcontrôleurs, sans qu’il soit nécessaire d’installer et de gérer quoi que ce soit en local. Tout se passe confortablement dans le navigateur. Dans l’environnement de développement intégré, nous trouvons des outils de débogage en direct, des fonctions d’autocomplétion, une documentation interactive complète, ainsi que de nombreux exemples déjà programmés que l’on peut utiliser immédiatement pour ses propres projets.
NanoPy combine des concepts linguistiques existants avec de nouveaux procédés techniques.
Cela permet même souvent d’exécuter du code Python simple avec peu de modifications sur les microcontrôleurs.
NanoPy peut utiliser de nombreuses constructions linguistiques de Python. Le langage utilise entre autres l’indentation des blocs. Les deux points et les parenthèses autour des appels de procédure, qui sont obligatoires en Python, ne le sont pas en NanoPy. Les débutants ont souvent du mal avec ces constructions, c’est pourquoi il est possible de les omettre dans NanoPy.
Dans NanoPy, les microcontrôleurs peuvent être programmés en fonction d’événements.
Le système NanoPy pour microcontrôleurs définit un certain nombre de procédures d’événements qui sont automatiquement appelées par le système lorsqu’une situation particulière se produit.
Actuellement, les événements suivants sont disponibles :
Événement | Déclencheur |
---|---|
onClick | est déclenché lorsqu’un bouton de l’appareil est pressé. |
onTimer | Si une minuterie est configurée, onTimer est appelé à l’arrivée de l’événement. Le timer peut être défini soit une fois (setTimer), soit comme un intervalle récurrent (setInterval). |
onDraw | Déclenché toutes les 20 ms environ, lorsque le contrôleur n’est pas occupé par des tâches de priorité supérieure. Cela permet d’afficher des animations d’écran fluides sur l’écran TFT des Oxocards. |
Lorsque le bouton est appuyé vers le bas, l’intervalle est défini et démarré. Un événement onTimer est ainsi déclenché toutes les 100 ms. Si le bouton est encore enfoncé vers le haut, l’intervalle s’arrête.
Style Python
def onTimer():
print("timer")
def onClick():
b = getButtons()
if b.down:
setInterval(100)
print("start interval")
if b.up:
stopInterval()
print("stop interval")
Style compact
def onTimer
print "timer"
def onClick
b = getButtons()
if b.down
setInterval 100
print "start interval"
if b.up
stopInterval
print "stop interval"
En cliquant sur le bouton, la variable globale on passe de true à false. L’événement onDraw est appelé 30 à 50 fois par seconde. Dans ces fonctions, nous vérifions l’état de la variable et dessinons un cercle si on est true.
Python-Style
on=false
def onDraw():
clear()
if on:
drawCircle(120,120,80)
update()
def onClick():
on = not on
delay(500)
Compact-Style
on=false
def onDraw
clear
if on
drawCircle 120,120,80
update
def onClick
on = not on
delay 500
Micropython | C/C++ / Arduino | NanoPy |
---|---|---|
Ensemble complet de langages Python | Ensemble complet de langages C/C++ | Langage optimisé pour les microcontrôleurs |
Typage dynamique | Typé statiquement | Typé statiquement |
Gestion dynamique de la mémoire | Gestion statique et dynamique de la mémoire | Gestion statique de la mémoire |
Plus lent car typage dynamique / gestion dynamique de la mémoire | rapide | rapide |
Exigences plus élevées en matière de mémoire | Faibles besoins en mémoire | Faibles besoins en mémoire |
Pas de débogage | Débogage avec adaptateur | Débogage directement via le navigateur |
Transfert de scripts utilisateur | Seul le micrologiciel complet peut être transféré | Transfert de scripts utilisateur |
Installation du firmware / mise à jour via flasher | Installation du logiciel. Compiler et flasher | Programmation via navigateur / App. / Firmware over the air |
Interpréte | Compilateur | Compilateur / interprète de bytecode |