samedi 27 août 2022

Raspberry Pi Pico W: lire le contenu d'une page web (Micropython)

Dans cet article, nous utilisons un Raspberry Pi Pico W (programmé en Micropython) pour lire le contenu d'une page web. 


La page web que j'ai choisie à titre d'exemple sera... le blog "Électronique en Amateur" ! Nous allons faire en sorte que le Raspberry Pi Pico visite le blog et y trouve le titre de la publication la plus récente. Vous pourrez ensuite modifier ce script pour que votre Raspberry Pi Pico W affiche les conditions météorologique, les cours de la bourse, les résultats de votre équipe sportive préférée, etc.

La bibliothèque "urequests" de Micropython est spécialement conçue pour naviguer sur le web. On accède à la page web de cette façon:

page_web = urequests.get("http://electroniqueamateur.blogspot.com")

Tout le contenu html de la page est alors placé dans la chaîne de caractères (string) "page_web.text". 

Il reste ensuite ensuite à extraire de cette longue chaîne de caractères les informations qui nous intéressent. 

En affichant le code source de la page web, j'ai remarqué que le titre d'un article du blog est toujours précédé de ce tag html:

<h3 class='post-title entry-title' itemprop='name'>

Donc, en utilisant la méthode find pour localiser cette sous-chaîne à l'intérieure de la chaîne complète...

    position = page_web.text.find("<h3 class='post-title entry-title' itemprop='name'>")
    extrait = page_web.text[position:position + 300]

... j'obtiens une chaîne de 300 caractères qui contient, entre autres choses, le titre de l'article le plus récent du blog (qui s'intitule, au moment où j'écris ces lignes, "Dans un blog près de chez vous (24)"):


Mon extrait contient toutefois une grande quantité de caractères qui ne sont pas pertinents. On peut facilement omettre quelques dizaines de caractères au début de la chaîne. Ici, par exemple, ma chaîne débute 80 caractères plus loin:

    position = page_web.text.find("<h3 class='post-title entry-title' itemprop='name'>")
    extrait = page_web.text[position + 80:position + 300]

Le contenu de la variable "extrait" est maintenant:


L'url qui précède le titre de l'article n'aura pas toujours la même longueur, mais on peut détecter où il se termine en recherchant le caractère ">":

    position = extrait.find(">")
    extrait = extrait[position + 1:]

Le contenu de la variable "extrait" est maintenant:


...et il ne reste plus qu'à rechercher le caractère "<" pour retirer le texte superflu qui suit le titre de l'article:

    position = extrait.find("<")
    extrait = extrait[:position]

Maintenant, la variable "extrait" ne comporte plus que le titre désiré:



Voici le script complet:

-
-

... et le résultat affiché dans la console:



À lire également:

jeudi 11 août 2022

Utilisation d'un écran OLED SPI SSD1306 avec Arduino

Dans cet article, nous explorons l'utilisation d'un écran OLED SPI SSD1306 avec un Arduino.

OLED signfie "organic light-emitting diode": chaque pixel de l'écran peut s'allumer comme s'il s'agissait d'une LED (par opposition à d'autres technologies d'affichage qui nécessitent un rétroéclairage). Ces petits écrans monochromes ne coûtent pas cher et offrent un excellent contraste peu importe l'éclairage ambiant. 


J'ai fait mes tests avec un afficheur dont la résolution est 128 par 64 pixels (c'est la résolution la plus fréquente). 

Jusqu'à tout récemment, j'avais exclusivement utilisé des écrans OLED qui utilisaient une interface I2C: 4 connecteurs étaient suffisants pour les faire fonctionner. Les modèles SPI, qui sont en principe plus rapides, comportent 7 connecteurs.

Les broches de mon afficheur sont identifiées de cette façon:

  • GND (la masse)
  • VCC (alimentation qui, sur ce modèle, peut être de 5 V ou de 3,3 V)
  • D0 : qui est en fait le signal d'horloge SPI (SCLK)
  • D1: qui transmet les infos du microcontrôleur vers l'écran (MOSI)
  • RES: reset
  • DC: permet permuter entre les modes "data" ou "command"
  • CS: "chip select", essentiel si plusieurs appareils sont branchés sur le même bus SPI.


Par défaut, l'afficheur fonctionne en "SPI à 4 fils". Mais il est possible de le transformer en afficheur "SPI à 3 fils" ou I2C en modifiant la configuration des résistances au verso de l'écran.

Connexions de l'écran OLED à un Arduino Uno

J'ai fait mes premiers tests avec un Arduino Uno, et j'ai branché l'écran OLED de cette façon:

  • GND de l'écran OLED : GND de l'Arduino Uno
  • VCC de l'écran OLED: sortie 5 V de l'Arduino Uno
  • D0 : broche 13 de l'Arduino Uno
  • D1: broche 11 de l'Arduino Uno
  • RES: broche 8 de l'Arduino Uno
  • DC: broche 9 de l'Arduino Uno
  • CS: broche 10 de l'Arduino Uno

Les broches RES, DC et CS peuvent être branchées à n'importe quel broche de l'Arduino: nous les définissons dans le sketch. Les broches D0 et D1, toutefois, doivent être connectées aux broches dédiées à la communications SPI.

Autres cartes

J'ai aussi fait des tests sur d'autres cartes (ESP8266, ESP32, STM32), également programmées au moyen de l'IDE Arduino. J'indique ici les numéros des broches utilisées pour D0 et D1 (SCLK et MOSI):

ESP8266:   D0: GPIO14  et D1: GPIO13
ESP32:  D0: 18  et D1: 23
STM32 "Blue Pill":  D0: A5 et D1: A7

Vous branchez RES, DC et CS où vous voulez, en n'oubliant pas de modifier le sketch en conséquence.


Bibliothèque u8g2 ou Adafruit?

Les deux bibliothèques les plus utilisées pour piloter un écran OLED avec une carte Arduino sont u8g2 et la bibliothèque d'Adafruit. Chacune des deux constitue un excellent choix.

J'ai testé les deux bibliothèques avec un Arduino Uno, un ESP32, un ESP8266 et un STM32 "Blue Pill". Tout a fonctionné correctement avec la bibliothèque u8g2, mais je ne suis pas parvenu à faire fonctionner la Blue Pill avec la bibliothèque d'Adafruit (l'écran demeurait noir).

Il me semble que la bibliothèque d'Adafruit est un peu plus conviviale, et que u8g2 présente un plus grand choix de polices de caractères (incluant des polices accentuées, ce qui est bien pratique en français).

Évidemment, chacune des deux bibliothèques est accompagnée d'un grand nombre de fichiers d'exemples qui permettent de visualiser rapidement plusieurs résultats possibles.

Vous trouverez ci-dessous deux sketches qui sont assez similaire: ils affichent un peu de texte et quelques formes géométriques simples, ainsi qu'une illustration bitmap. Le premier sketch est conçu pour être utilisé avec la bibliothèque u8g2, alors que l'autre nécessite la bibliothèque d'Adafruit.

Sketch utilisant la bibliothèque u8g2

Ce premier sketch utilise la bibliothèque u8g2, que vous pouvez installer à partir du gestionnaire de bibliothèques.

-

-

Sketch utilisant la bibliothèque Adafruit

La bibliothèque Adafruit SSD1306 nécessite également la bibliothèque Adafruit GFX. Les deux bibliothèques peuvent être installées dans le gestionnaire de bibliothèques.


-

-

Affichage d'un dessin bitmap

Les deux scripts ci-dessus affichent un dessin bitmap dont les données se trouvent au début du sketch. Pour transformer un dessin bitmap en données exploitables par un Arduino, plusieurs options sont possible: on peut utiliser un logiciel comme Gimp pour sauvegarder l'illustration sous la forme d'un fichier XBM qu'on  ouvre ensuite avec un éditeur de texte, ou on peut utiliser un outil en ligne comme celui-ci.


À lire également:

J'ai publié quelques articles concernant l'utilisation d'un écran OLED I2C SH1106: avec un Arduino Uno,  avec une carte ESP8266 ou ESP32, ou avec une carte STM32.

D'autres articles concernent l'utilisation d'autres afficheur avec un Arduino: Écran couleur ST7735,  afficheur Nokia 5110, afficheur LCD 2 X 16, etc.


Yves Pelletier (Facebook)

samedi 6 août 2022

Lire des fichiers mp3 avec Raspberry Pi Pico et VS1053 (micropython)

Dans un récent article sur l'utilisation d'un module I2S, je déplorais que le décodage du format mp3 ne soit pas supporté par le langage micropython pour l'instant. Une solution consiste à déléguer le décodage à un circuit intégré spécialement conçu pour cette tâche, comme le VS1053, qui peut décoder les principaux formats de fichiers musicaux: Ogg Vorbis, MP3, AAC, FLAC, WMA, MIDI...

Dans cet article, j'utilise un Raspberry Pi Pico (programmé en micropython) et un module VS1053 pour faire jouer les fichiers mp3 enregistrés sur une carte SD.


Module VS1053

Mon module VS1053 a été fabriqué par LCSOFT STUDIO et porte la mention "VS1003/1053 MP3 CODEC". Il existe d'autres modules VS1053 différents de celui-ci, mais j'imagine qu'ils sont équivalents. Je crois qu'il existe des modules VS1053 qui comportent un lecteur de carte SD intégré. Dans mon cas, j'ai dû utiliser un lecteur de carte SD en plus du module VS1053.


Connexions

Le module VS1053 et le module de carte SD partagent le même bus SPI.

Connexions du module VS1053:

  • Broche 5 V du module VS1053 : Broche VBUS du Raspberry Pi Pico 
  • Broche DGND du module VS1053: Broche GND du Raspberry Pi Pico
  • Broche MISO du module VS1053: Broche GP4 du Raspberry Pi Pico
  • Broche MOSI du module VS1053: Broche GP7 du Raspberry Pi Pico
  • Broche SCK du module VS1053: Broche GP6 du Raspberry Pi Pico
  • Broche DREQ du module VS1053: Broche GP10 du Raspberry Pi Pico
  • Broche XRST du module VS1053: Broche GP13 du Raspberry Pi Pico
  • Broche XCS du module VS1053: Broche GP12 du Raspberry Pi Pico
  • Broche XDCS du moudle VS1053: Broche GP11 du Raspberry Pi Pico

Connexions du module lecteur de carte SD:

  • GND du lecteur SD: Broche GND du Raspberry Pi Pico
  • +3.3 du lecteur SD: Sortie 3,3 V du Raspberry Pi Pico
  • Broche SCK du lecteur SD: broche GP6 du Raspberry Pi Pico
  • Broche MOSI du lecteur SD: broche GP7 du Raspberry Pi Pico
  • Broche MISO du lecteur SD: broche GP4 du Raspberry Pi Pico
  • Broche CS du lecteur SD: broche GP15 du Raspberry Pi Pico

Bibliothèques

Deux pilotes micropython sont nécessaires pour ce projet: micropython-vs1053 par Peter Hinch, et le pilote officiel pour la carte SD.

Les fichiers sdcard.py et  vs1053_syn.py devront être copiés dans la mémoire flash du Raspberry Pi Pico pour que le script ci-dessous fonctionne correctement.

Script

Voici un script qui exécute tous les fichiers mp3 qui se trouvent sur la carte SD. Comme vous pouvez le constater, il s'agit d'un script très court: les deux bibliothèques font tout le travail pour nous!

-

-

À lire également:

Yves Pelletier (Facebook)


jeudi 4 août 2022

Jouer de la musique (fichiers WAV) avec un Raspberry Pi Pico et un décodeur I2S (micropython)

Dans cet article, nous utilisons un Rasbperry Pi Pico programmé en micropython et un décodeur I2S UDA1334A pour jouer la musique stockée sous forme de fichiers .wav sur une carte SD.


Module I2S

I2S est le nom d'un protocole de communication série permettant de connecter entre eux des appareils audio numériques. Un décodeur I2S est un convertisseur numérique-analogique: il produit un signal analogique audio à partir des informations numériques que lui envoie le Raspberry Pi Pico

J'ai utilisé le décodeur I2S stéréo UDA1334A qui était fabriqué par Adafruit, mais qui ne l'est plus. Adafruit l'a remplacé par un nouveau modèle basé sur le MAX98357A, et il existe d'autres modules du même genre (basés sur le PCM5102). En principe, vous devriez obtenir des bons résultats avec tous ces modules, mais moi je n'ai testé que l'UDA1334A d'Adafruit.


Bibliothèques wavplayer.py et sdcard.py

Mike Teachman a placé sur github de nombreux exemples d'utilisation du I2S en micropython.  Dans le répertoire "examples", vous trouverez un script qui génère un simple signal sinusoïdal (particulièrement utile pour vérifier les connexions du module I2S et s'assurer qu'il fonctionne correctement), d'autres qui jouent un fichier .wav enregistré en mémoire flash ou sur une carte SD, etc.

Pour exécuter un fichier audio en format .wav, nous devons copier le fichier wavplayer.py de Mike Teachman dans la mémoire flash du Raspberry Pi Pico. Puisque les fichiers .wav sont souvent volumineux, nous aurons également besoin du pilote sdcard.py.


Connexions

J'ai utilisé les connexions proposées par Mike Teachman.

Connexions du module décodeur I2S:

  • Broche VIN du module I2S : Sortie 3,3 V du Raspberry Pi Pico
  • Broche GND du module I2S: Broche GND du Raspberry Pi Pico
  • Broche BCLK du module I2S: Broche GP16 du Raspberry Pi Pico
  • Broche WSEL du module I2S: Broche GP17 du Raspberry Pi Pico
  • Broche DIN du module I2S: Broche GP18 du Raspberry Pi Pico

(les autres broches du décodeur I2S peuvent être laissées déconnectées)

Connexions du module lecteur de carte SD:

  • GND du lecteur SD: Broche GND du Raspberry Pi Pico
  • +3.3 du lecteur SD: Sortie 3,3 V du Raspberry Pi Pico
  • Broche SCK du lecteur SD: broche GP14 du Raspberry Pi Pico
  • Broche MOSI du lecteur SD: broche GP15 du Raspberry Pi Pico
  • Broche MISO du lecteur SD: broche GP12 du Raspberry Pi Pico
  • Broche CS du lecteur SD: broche GP13 du Raspberry Pi Pico


Script

Voici un script qui joue l'un après l'autre tous les fichiers .wav enregistrés à la racine de la carte SD (avant de l'utiliser, il faut évidemment avoir préalablement enregistré quelques fichiers en format .wav sur la carte). Vous pouvez écouter le résultat en branchant un casque d'écoute à la sortie jack du module I2S.

-

-

Mais pas de mp3?

Tout ceci fonctionne très bien, mais je préférerais pouvoir jouer de la musique en format mp3: un fichier wav, ça prend beaucoup de place! Malheureusement, ça ne semble pas possible pour l'instant en Micropython.  CircuitPython, en revanche, supporte le décodage du format mp3; c'est assez tentant d'aller faire quelques essais de ce côté...


À lire également:

Yves Pelletier (Facebook)