Dans l'article Premiers pas avec MicroPython et Raspberry Pi Pico, nous avons vu comment installer, configurer et exécuter MicroPython sur un microcontrôleur Raspberry Pi Pico.
Ici, nous nous concentrerons sur l'automatisation de ce processus et sa transformation en un pipeline d'intégration continue (CI). Transférer l'automatisation en CI garantit que notre code est testé chaque fois que nous envoyons un commit à notre dépôt de code.
Maintenant que nous avons vu comment démarrer avec MicroPython et le périphérique Raspberry Pi Pico, nous voulons trouver des moyens d'automatiser un peu plus notre processus de développement de code.
Dans l'article sur les premiers pas avec MicroPython et Raspberry Pi Pico, nous avons exécuté quelques commandes différentes pour présenter les différentes fonctionnalités du périphérique Raspberry Pi Pico. Ici, nous allons voir comment automatiser l'un de ces exemples en utilisant des scripts et en le plaçant dans la CI.
Examinons d'abord l'exemple que nous avons exécuté depuis le terminal :
Cette commande nous a fourni les informations sur l'instance de la machine. Dans notre cas :
Cela nous indique que nous exécutons MicroPython version 1.19.1 sur un Raspberry Pi Pico utilisant la puce RP2040.
Plutôt que d'exécuter cette commande par le biais d'un interpréteur de commandes utilisant PuTTY ou Thonny IDE, nous pouvons en fait exécuter l'ensemble du processus à partir de la ligne de commande en utilisant un outil fourni avec la bibliothèque MicroPython.
L'outil Pyboard.py nous fournit un mécanisme pour exécuter des commandes directement sur le périphérique cible sans ouvrir un interpréteur de commandes (ou charger de nouveaux fichiers directement sur la carte).
De plus, il nous permet d'exécuter d'autres commandes de système de fichiers telles que le listage et la copie de fichiers vers/depuis le périphérique cible.
Par exemple, on peut exécuter la commande sys.implementation (ci-dessus) en utilisant l'outil Pyboard.py comme suit :
python pyboard.py --device $TARGET_PORT --command "import sys; print(sys.implementation)"
où $TARGET_PORT est le port COM sous lequel votre périphérique est affiché. Cela évite l'étape PuTTY/Thonny IDE et permet l'automatisation.
Maintenant que nous pouvons automatiser l'exécution de commandes à distance sur notre appareil cible, nous devrions être en mesure de les intégrer dans un script Python complet. Il s'avère que l'utilisation de la bibliothèque Pyboard est assez simple.
Dans cet exemple de script Python, nous exécutons la même commande que ci-dessus avec quelques fantaisies supplémentaires (comme la détection automatique du port COM et l'ajout de vérifications basées sur des assertions). Le principe, cependant, reste le même : saisir l'instance de la machine et valider ce que nous pensons être en cours d'exécution.
Une fois que nous avons encapsulé tout cela dans un script, nous pouvons maintenant le déposer dans un système CI. Comme d'habitude, j'utilise Gitlab pour mon implémentation, et mon propre runner pour programmer l'appareil Raspberry Pi Pico.
Vous pouvez suivre l'ensemble du projet ici, mais le fichier le plus intéressant est le script .gitlab-ci.yml. Il contient les « instructions » pour que les builds se produisent automatiquement chaque fois que j'apporte une modification à mon code et que je le renvoie à Gitlab.
Plusieurs « tâches » se produisent ici, mais une seule n'implique pas le périphérique Raspberry Pi Pico : l'étape de build Docker.
La construction d'un conteneur Docker encapsule notre environnement dans une sorte de machine virtuelle. Si j'exécute ma tâche de CI dans un conteneur Docker, je peux l'exécuter pratiquement n'importe où (moyennant quelques conditions minimales).
Dans ce cas, je n'ai pas besoin d'installer de bibliothèques spéciales sur mon ordinateur de bureau qui est relié à mon appareil cible, car le conteneur Docker est livré avec tout cela. La seule distinction que je dois faire ici est que mon conteneur Docker doit être exécuté en mode « privilégié » (ou au moins avoir la permission explicite d'accéder au périphérique cible), sinon il ne pourra pas communiquer avec le périphérique cible.
Une fois que mon conteneur Docker est construit, je peux récupérer l'image de Gitlab à chaque fois qu'une tâche est exécutée, et c'est là que le plaisir commence. Vous remarquerez que mes tâches deviennent de plus en plus abstraites et donc plus complexes.
Enfin, dans la dernière tâche, nous exécutons l'ensemble du processus via le framework Pytest.
Si vous connaissez certains de mes articles précédents tels que FPGA : Création de pipelines d'intégration continue pour les systèmes embarqués ou PCB, Vérification à faible coût des filtres numériques et analogiques et Configuration d'un matériel dans le projet Loop, vous remarquerez que je suis un très grand fan du framework Pytest.
MicroPython n'est pas différent dans ce cas et j'utilise toujours par défaut Pytest comme moyen simple de valider certains de mes scripts Python.
La dernière tâche CI appelée exécute le script Pytest test_rpi_pico.py. Ce script est presque identique à rpi_pico_check.py sauf qu'il crée un rapport de test.
Comme toujours, nous prenons ce rapport de test et le soumettons à Gitlab pour analyse afin d'obtenir cette petite section de test montrant des résultats positifs :
Figure 1 : Résumé du test pour Pytest
Ce simple test valide les informations que nous avons examinées dans l'article précédent.
Ce qui est bien dans ce que nous avons fait ici, c'est l'automatisation. Chaque fois que le code est modifié, nous effectuons une vérification pour nous assurer qu'il s'agit bien du dispositif que nous attendons. Dans ce cas, nous utilisons MicroPython version 1.19.1 sur un Raspberry Pi Pico utilisant la puce RP2040.
Dans cet article, nous avons rappelé les étapes manuelles nécessaires pour communiquer avec un périphérique Raspberry Pi Pico. Nous avons ensuite pris ce processus manuel et l'avons transformé en un script.
Après avoir automatisé le processus via un script, nous avons regardé comment intégrer le workflow dans un système CI, puis l'incorporer à Pytest.
Maintenant que vous avez parcouru les exemples de cet article, vous devriez pouvoir écrire vos propres scripts, et même les intégrer dans votre CI.