Programmer
Préambule
Ayant abordé de nombreux aspects techniques du Raspberry-Pi Pico (cf. chapitre Raspberry-Pi Pico) et sa prise en main avec le transfert de fichiers, REPL, exécution à la volée et la séquence de démarrage (cf. chapitre Prise de contrôle), il est maintenant temps de s’attarder sur la partie logicielle.
Ce chapitre va explorer les possibilités logicielles, la « colle » python entre les scripts Python résultant d’une idée de projet et la partie matérielle.
MicroPython n’a pas modifié le langage Python pour apporter le contrôle matériel des broches, des entrées analogiques, des bus, etc. Le support matériel est apporté de façon élégante par l’intermédiaire de bibliothèques spécialisées machine faisant l’interface entre les scripts Python et la partie matérielle.
Les bibliothèques MicroPython
1. Bibliothèque vs module
La distinction entre bibliothèque et module n’est pas forcément très claire. Ces deux termes sont généralement utilisés l’un à la place de l’autre.
D’une façon générale, il n’y a pas de problème à interchanger les deux terminologies.
Selon les conceptions communément admises, une bibliothèque est un fichier Python contenant du code réutilisable (fonction, classe, constante, etc.) chargé en mémoire, en utilisant l’instruction Python import fichier-python ou from fichier-python import MaClasse.
MicroPython et Python considèrent cet unique fichier « bibliothèque » comme un « module Python » constitué d’un seul et unique fichier script. Dans ce cas, module et bibliothèque se confondent. Cela représente pas loin de 90 % des cas d’utilisation sous MicroPython
Un module Python a une notion plus large puisqu’il peut être constitué d’un sous-répertoire portant le nom de la bibliothèque (nom du module) et contenant plusieurs fichiers Python accompagnés d’un fichier __init__.py. Ainsi, la commande d’importation devient import sous-répertoire.fichier-python. La création de modules permet de morceler une bibliothèque en éléments logiques plutôt que de créer un seul fichier monolithique.
2. Stockage des bibliothèques
Il faut déjà distinguer deux types de bibliothèques :
-
La bibliothèque utilisateurs présente sous forme de fichiers Python stockés dans le système de fichiers.
-
Les bibliothèques Frozen compilées et intégrées dans le firmware MicroPython (donc en mémoire Flash)....
Créer une bibliothèque
Pour bien comprendre et appréhender le fonctionnement d’une bibliothèque, le mieux est encore d’en créer une puis de l’utiliser.
Créer une bibliothèque permet de déplacer du code réutilisable dans un module séparé (un script), module que l’on pourra également copier et réutiliser dans d’autres projets.
L’auteur de cet ouvrage utilise ce principe pour écrire des « pilotes MicroPython », des bibliothèques destinées à faciliter la prise de contrôle de capteurs et actionneurs sans devoir s’encombrer des détails techniques de la communication entre le microcontrôleur et le capteur/actionneur. Voyez le lien suivant pour quelques exemples : https://github.com/mchobby/esp8266-upy
1. Où placer les bibliothèques ?
La réponse courte est dans « /lib », surtout si un projet commence à prendre de l’ampleur. Cela évite de mélanger le script principal avec les bibliothèques. Lors de la mise en œuvre de projets rudimentaires, il est tout à fait raisonnable de placer ensemble les bibliothèques et le script principal à la racine du système de fichiers.
2. Créer malib
Dans l’exemple suivant, la bibliothèque malib.py sera conçue pour contenir deux fonctions utilitaires : qui_mange() créant une phrase aléatoire et fibonacci() créant une suite de Fibonnaci.
Thonny IDE, déjà présenté dans cet ouvrage (cf. chapitre Prise de contrôle), permet de saisir et transférer facilement le script malib.py sur la carte MicroPython.
Voici le script à saisir dans le fichier malib.py :
from random import choice
def fibonacci( count ): ...
La bibliothèque machine
Le bibliothèque machine rassemble une série de classes permettant d’interagir avec la couche matérielle du microcontrôleur (les broches, les bus, les entrées et sorties, les broches analogiques, etc.).
Dans le monde MicroPython, la bibliothèque machine standardise les éléments afin d’offrir un socle commun d’accès matériel aux scripts MicroPython. Grâce à cette normalisation, le contrôle des périphériques est identique entre les différentes plateformes matérielles exécutant MicroPython (Pyboard, Pyboard-D, ESP32, Lopy) et donc aussi avec le Pico et Pico-W.
Ainsi, la classe Pin est utilisée pour les entrées/sorties numériques, la classe ADC pour la lecture d’entrée analogique, I2C pour l’accès aux bus I2C et ainsi de suite. Cet ensemble de classes est aussi appelée l’API machine.
1. Contenu de la bibliothèque machine
Voici une liste exhaustive des classes de l’API machine MicroPython pour le Raspberry-Pi Pico :
-
Pin : classe permettant de contrôler une broche numérique en entrée comme en sortie. La configuration de la broche en entrée permet également d’activer, au besoin, la résistance pull-up (tirant le potentiel de la broche à +3,3 V) ou la résistance pull-down (qui tire le potentiel de la broche à la masse).
-
ADC : classe permettant d’acquérir la tension analogique présente sur une broche analogique.
-
PWM : classe permettant de générer un signal en modulation de longueur d’impulsion pour une broche.
-
I2C : permet d’interagir avec un bus I2C matériel, bus utilisé par de nombreux capteurs.
-
SPI : permet d’interagir avec un bus SPI.
-
SoftI2C : bus I2C logiciel émulé...
Entrées/sorties
L’utilisation des entrées/sorties numérique représente 15 à 20 % du savoir utile mais permettra déjà de combler 70 % des besoins pour réaliser des projets avec le Pico.
C’est donc un point essentiel à ne pas négliger.
1. Entrée numérique
L’entrée numérique (digital input en anglais) est utilisée pour lire l’état d’une broche, état imposé par un dispositif externe comme un bouton ou un capteur.
La tension doit être :
-
3,3 V ou proche pour un niveau haut (dit HIGH en anglais).
-
0 V ou proche pour un niveau bas (dit LOW en anglais).
Une broche configurée en entrée présente une haute impédance (comme une grande résistance) empêchant le courant de « fuir » dans la broche. Cela permet de capturer l’état du signal sans perturber celui-ci.
Le montage suivant présente le montage d’un bouton poussoir sur la broche GP26 configurée en entrée. Il s’agit d’un montage de type pull-up avec résistance de protection.
Broche utilisée en entrée.
Ce premier montage va déjà apporter beaucoup d’informations :
-
Lorsque le bouton est pressé, le point A est connecté à la masse. Le point A est donc à 0 V.
-
À l’état de repos, le contact interne du bouton est ouvert. Le point A est donc raccordé au +3,3 V par l’intermédiaire de la résistance de 10K Ohms.
-
La résistance de 10K Ohms est dite résistance pull-up puisqu’elle ramène le potentiel du point A à +3,3 V. Lorsque le contact du bouton est ouvert, la broche GP26 est donc à 3,3 V.
-
La broche GP26 étant configurée en entrée (voir script...