dimanche 31 juillet 2022

Clavier numérique et Raspberry Pi Pico (Micropython)

Dans cet article, nous branchons à un Raspberry Pi Pico un petit clavier numérique à 16 touches, et nous utilisons micropython pour interpréter correctement les touches qui ont été enfoncées.


Il s'agit d'un clavier matriciel: les 16 interrupteurs sont reliés entre eux par groupes de quatre, de façon à former des lignes et des colonnes. 


Au moyen d'un multimètre, on peut facilement constater que les 4 connecteurs de gauche sont reliés aux lignes horizontales, alors que les 4 connecteurs de droite sont reliés aux colonnes verticales. Par exemple, si j'appuie sur la touche 1, la résistance électrique devient nulle entre le connecteur "ligne 1" et le connecteur "colonne 1":

L'avantage de cette disposition matricielle, c'est l'économie de connecteurs: on peut brancher les 16 touches du clavier avec 8 fils conducteurs alors qu'il faudrait au moins 17 fils pour brancher chaque touche à sa propre entrée du microcontrôleur. En contrepartie, la programmation est un petit peu plus compliquée car pour détecter et identifier une touche enfoncée, il faut modifier successivement le niveau logique de chaque ligne et vérifier, dans chaque cas, le niveau logique de toutes les colonnes.

Connexions du clavier au Raspberry Pi Pico

Le script montré à la prochaine section suppose que les 8 connecteurs  du clavier numérique sont branchés, dans l'ordre, aux broches GP1 à GP8 du Raspberry Pi Pico:

  • Broche 1 du clavier (à l'extrême gauche): Broche GP1 du Raspberry Pi Pico
  • Broche 2 du clavier: Broche GP2 du Raspberry Pi Pico
  • Broche 3 du clavier: Broche GP3 du Raspberry Pi Pico
  • ...
  • Broche 8 du clavier (à l'extrême droite): Broche GP8 du Raspberry Pi Pico

Il est parfaitement possible d'utiliser une connexion différente, mais il faudra alors modifier le script.

Script "mot de passe"

Le script en micropython présenté ci-dessous demande un mot de passe, et il exécute ensuite le programme principal si on a entré le bon mot de passe (dans ce cas, le "programme principal" se limite à faire clignoter la LED du Pico).

Pour que le script soit facile à utiliser peu importe votre matériel, j'ai choisi un affichage dans la console. Vous pourrez facilement adapter le script pour l'afficheur (OLED, LCD, etc.) de votre choix (ou, bien entendu, pour toute application où le clavier servirait à écrire autre chose qu'un mot de passe).


Pour simplifier le débogage, j'écris le mot de passe à l'écran. Vous pouvez facilement le remplacer par des astérisques en modifiant la ligne 71 de cette façon:  

          print('*', end='')

-

-

Pourquoi ce mot de passe?

Le choix du mot de passe "662607004" est une référence à la série télévisée Stranger Things: dans le dernier épisode de la troisième saison, Hopper et Joyce, qui sont à l'intérieur de la basse secrète russe,  doivent entrer un code secret qui est la constante de Planck.

(Il semble toutefois que les chiffres utilisés correspondent à la constante de Planck telle que révisée en 2014, alors que l'action se déroule en 1985).



À lire également:
Yves Pelletier (Facebook)

vendredi 15 juillet 2022

Écran OLED SSD1306 et Raspberry Pi Pico (micropython)

Dans cet article, nous étudions l'utilisation d'un petit écran OLED SSD1306 I2C avec un Raspberry Pi Pico programmé en micropython. 

J'ai utilisé un écran OLED dont la résolution est 128 X 32, mais les exemples pourront facilement être modifiés pour un résolution de 128 X 64. Si vous cherchez plutôt des informations pour un écran OLED à base de SH1106, j'ai déjà publié un article à ce sujet.


Connexions de l'écran au Raspberry Pi Pico

Il s'agit d'un modèle I2C, qui comporte donc 4 connecteurs (deux pour l'alimentation, et deux pour la communication avec le Pico).

J'ai branché l'écran OLED de la façon suivante:

  • Broche GND de l'écran: une des broches GND du Raspberry Pi Pico
  • Broche VCC de l'écran: sortie 3,3 V du Raspberry Pi Pico
  • Broche SCL de l'écran: broche GP9 du Raspberry Pi Pico
  • Broche SDA de l'écran: broche GP8 du Raspberry Pi Pico


Installation du pilote SSD1306.py

Nous allons utiliser le pilote pour micropython SSD1306. Le fichier "ssd1306.py" doit être copié dans le Raspberry Pi Pico.



Afficher du texte et des formes géométriques simples

Le module framebuf de micropython nous fournit des méthodes qui permettent d'écrire du texte et de tracer des formes géométriques à l'écran. 

Ainsi, si je programme "oled.text('BONJOUR',20,10)", le mot "BONJOUR" sera affiché. Le début du mot sera positionné au 20e pixel horizontal et au 10e pixel vertical.

Il est possible de dessiner quelques formes géométriques de base:
  • hline pour tracer une droite horizontale
  • vline pour tracer une droite verticale
  • line pour tracer une droite
  • rect pour tracer un rectangle
  • pixel pour régler un seul pixel
  • fill pour remplir tout l'écran en noir ou en blanc

Les changements ne sont visibles à l'écran que lorsque qu'on écrit "oled.show()".

Voici un script qui affiche un peu de texte (parfois défilant), ainsi que quelques lignes:

-

-

Cette séquence vidéo montre le résultat sur l'écran OLED:


Afficher une image bitmap

On peut aussi afficher une image bitmap stockée dans un fichier.


Dans ce cas, il faut produire une image monochrome de format .pbm ayant une résolution maximale de 128 X 32 pixels.

Voici un exemple de conversion d'image réalisée avec le logiciel Gimp. L'image de départ était en couleur, avec une définition bien meilleure que 128 X 32 pixels.


J'ai sélectionné le menu Image / Mode / Couleurs Indexées.  Dans la boîte de dialogue, j'ai choisi "Utiliser un palette noir et blanc (1-bit)".



Ensuite, je choisi le menu Image / Échelle et taille de l'image... Dans la boîte de dialogue, on règle les dimensions de l'image à un maximum de 128 pixels de largeur et 32 pixels de hauteur.


Sur l'écran OLED, les parties noires de l'image seront affichées en blanc, et les parties blanches seront en noir. Si ce n'est pas ce que vous désirez, vous pouvez inverser l'image grâce au menu Couleurs / Inverser.

(si vous préférez, il est également possible de programmer le Raspberry Pi Pico pour que les couleurs soient inversées :  oled.invert(1) )


J'ai finalement utilisé le menu Fichier / Exporter sous ... et j'ai choisi un nom de fichier qui se termine par l'extension ".pbm" (il faut choisir un formatage de type "Raw" et non "ASCII").

Ce fichier de format pbm doit être enregistré dans le Raspberry Pi Pico avant l'exécution du script ci-dessous.


Voici le script en micropython qui permet l'affichage de l'image bitmap sur l'écran OLED:

-

-

À lire également:

Yves Pelletier (Facebook)



lundi 11 juillet 2022

Raspberry Pi Pico W: contrôler des LEDs à partir d'une page web

Continuons notre exploration du nouveau Raspberry Pi Pico W. Maintenant que nous savons comment afficher la mesure d'un capteur dans une page web, nous allons contrôler, à partir d'une page web, 3 LEDs branchées au Raspberry Pi Pico W. Ce sera facile de modifier le script pour qu'il réponse à vos besoins spécifiques: plutôt que contrôler des LEDs, la page web pourra servir à contrôler des relais, des moteurs, etc.

Comme d'habitude, le Pico W sera programmé en micropython; si vous avez besoin d'informations sur la façon de programmer un Raspberry Pi Pico (W ou non) en micropython avec Thonny, c'est par ici.

Circuit

J'ai branché une LED à chacune de ces broches du Raspberry Pi Pico W: GP13, GP14 et GP15. La résistance de protection de chaque LED devrait être d'au moins 100 Ω, mais la valeur exacte n'est pas importante.

Page web

À mon avis, la façon la plus conviviale d'allumer et d'éteindre des LEDs à partir d'une page web consiste à offrir à l'utilisateur un bouton à cocher pour chacune des LEDs: on coche la case pour que la LED s'allume, on la décoche pour qu'elle s'éteigne, et les changements sont appliqués lorsqu'on clique sur le bouton "Appliquer".

Notre page web comportera donc un formulaire html.


Script micropython

Voici le script en micropython; il a été inspiré d'un exemple fourni dans le guide officiel Connecting to the internet with Raspberry Pi Pico W.

Avec ce programme, le pico se branche à un réseau wifi (il faut écrire le nom du réseau et le mot de passe avant d'exécuter le script), puis il construit la page web contenant le formulaire et modifie l'état des 3 LEDs en fonction des cases qui ont été cochées.

Le contenu de la page web est presque entièrement statique. Le seul élément qui peut changer est la mention "checked" qui peut apparaître ou non dans les paramètres de chaque case à cocher, pour indiquer si la case est cochée ou non: c'est la raison des variables bouton1Str, bouton2Str et bouton3Str qui sont insérées aux endroits appropriés du code html lors de la construction de la page.

-

-

Après la réussite de la connexion au réseau wifi, l'adresse IP du Raspberry Pi Pico est affichée. Cette adresse vous permet d'accéder à la page web à partir de n'importe quel navigateur web.


Le programme affiche également l'état des LEDs chaque fois qu'on clique sur le bouton"Appliquer", ce qui vous permet de tester le script même si aucune LED n'est réellement connectée à votre Raspberry Pi Pico W.


À lire également:


Yves Pelletier (Facebook)


samedi 9 juillet 2022

Raspberry Pi Pico W: afficher les mesures d'un capteur sur une page web

Avec le nouveau Raspberry Pi Pico W, c'est maintenant possible de communiquer en WiFi puisque le fabricant a remplacé le logo en forme de framboise par une puce Infineon CYW4343.


Dans cet article, nous transformons le Raspberry Pi Pico W en serveur web, afin d'afficher dans une page web la valeur mesurée par un capteur.

Le Raspberry Pi Pico W sera programmé en Micropython. Il faut donc avoir préalablement installé le firmware Micropython de la façon habituelle: vous pressez le bouton BOOTSEL au moment où vous branchez le Raspberry Pi Pico W à un port USB, puis vous enregistrez le fichier uf2 approprié. Si vous n'êtes pas familier avec la programmation d'un Raspberry Pi Pico en Micropython, cet article d'introduction pourrait vous être utile.


En ce qui concerne le capteur, il s'agira pour l'instant d'un simple potentiomètre branché à la broche GP26 du Raspberry Pi Pico W. Ce sera facile d'adapter le script à d'autres capteurs selon vos besoins.


Voici le script en Micropython: le Raspberry Pi Pico se connecte d'abord à un réseau WiFi (vous devrez écrire le nom du réseau et le mot de passe dans le script pour que ça fonctionne). Ensuite, on créé une page web qui présente la valeur du potentiomètre (puisque j'avais plein d'espace sur la page web, j'ai présenté la valeur brute, le pourcentage et la conversion en volts). 

La page web est réglée pour se rafraîchir automatiquement toutes les 2 secondes, vous réglez évidemment cette fréquence selon vos besoins.

-
-

Au démarrage du script, si la connexion au réseau wifi est réussie, le programme affiche l'adresse IP du Raspberry Pi Pico W.  Il s'agit de coller cette adresse dans un navigateur web pour accéder à la page web.


Si vous tournez le bouton du potentiomètre, la valeur affichée sera modifiée.



À lire également:

Yves Pelletier (Facebook)

jeudi 7 juillet 2022

Affichage sur un PC d'un graphique montrant les mesures prises par un Raspberry Pi Pico

Ce projet consiste à afficher à l'écran d'un ordinateur un graphique cartésien qui montre les données transmises par un Raspberry Pi Pico branché à un de ses ports USB (il s'agit d'un projet similaire à celui que j'avais réalisé il y a quelques années avec un Arduino).


Les donnés sont acheminées du Raspberry Pi Pico à l'ordinateur par une communication série à travers le câble USB. Le Raspberry Pi Pico est programmé en MicroPython, alors que l'ordinateur affichant le graphique exécute un script en Python en utilisant la bibliothèque Matplotlib.

Circuit

Pour faire mes tests, j'ai utilisé un potentiomètre branché à la broche GP26 du Raspberry Pi Pico. Il sera facile de modifier le script pour remplacer le potentiomètre par un capteur de votre choix.


Script en Micropython exécuté par le Raspberry Pi Pico

Le rôle du Raspberry Pi Pico se résume à peu de chose. D'abord, il doit vérifier s'il reçoit un message en provenance de l'ordinateur. Si c'est le cas, il doit envoyer à l'ordinateur la mesure du capteur ainsi que le moment où cette mesure a été prise.

L'envoi de données du Raspberry Pi Pico vers l'ordinateur se fait tout simplement par la commande "print()".

La réception d'un message série par le port USB est un peu plus compliquée et, surtout, moins intuitive. Il s'agit des lignes 20, 21, 24 et 25 du script (ça nécessite également l'inclusion des bibliothèques sys et select):

poll = select.poll() 
poll.register(sys.stdin, select.POLLIN)
res = poll.poll()     
mess = res[0][0].read(1) 

-

Script en Python exécuté par l'ordinateur auquel est branché le Raspberry Pi Pico

Sur l'ordinateur hôte, le script est plus élaboré. Si ce n'est pas déjà fait, il faut d'abord installer la bibliothèque Matplotlib , qui prend en charge le tracé du graphique (si vous utilisez Thonny, l'installation est très facile en passant par le menu "Outil - Gérer les plugin...").  La méthode FuncAnimation() permettra une mise à jour régulière du graphique en y ajoutant de nouvelles mesures.

Le script cherche d'abord un port série disponible, et il s'y branche s'il n'en trouve qu'un seul (il demande à l'utilisateur de faire un choix s'il en trouve plusieurs). L'utilisateur doit ensuite choisir le nombre de secondes qui s'écouleront entre deux mesures consécutives.


Un graphique s'affiche alors à l'écran de l'ordinateur, et il se met à jour au rythme qui a été choisi par l'utilisateur. Voici un graphique obtenu pendant que je tournais lentement le bouton du potentiomètre.


Lorsqu'il est temps de prendre une nouvelle mesure, le script envoie le message "e" au Raspberry Pi Pico.
Le message "i" est envoyé au début d'un graphique, pour que le temps initial du graphique soit nul.

-

-

Astuce: exécution des deux scripts avec Thonny

Il est possible d'exécuter les deux scripts en utilisant Thonny, sans que Thonny n'intercepte les messages envoyés par le Raspberry Pi Pico. Voici comment j'ai procédé:

- J'ai d'abord exécuté le script sur le Pico au moyen de Thonny, en utilisant l'interpréteur Micropython approprié.

- J'ai ensuite sélectionné le menu "Exécuter - Déconnecter" sur Thonny. Cette action a pour effet d'interrompre les communications entre Thonny et le Raspberry Pi Pico, mais elle n'interrompt pas le script, qui continue son exécution de façon autonome.


- Finalement, j'ai changé d'interpréteur (menu "Exécuter - Sélectionner l'interpréteur...") et j'ai exécuté le deuxième script directement sur le PC.


Il existe d'autres options possibles, comme installer le premier script dans le Pico en le nommant "main.py" pour qu'il s'exécute automatiquement.


À lire également:

Yves Pelletier (Facebook)