mercredi 4 décembre 2019

Communication nRF24L01 avec cartes ESP32 et ESP8266

Voyons aujourd'hui comment utiliser un émetteur-récepteur nRF24L01 avec un ESP32 ou un ESP8266. Les modules nRF24L01 permettent d'établir une communication radio entre deux microcontrôleurs à une fréquence de 2,4 GHz.

Préparation de l'IDE Arduino

Puisque l'ESP sera programmé avec l'IDE Arduino, les cartes appropriées doivent avoir été installées dans l'IDE au moyen du gestionnaire de cartes (voir les instructions détaillées pour l'ESP8266 et pour l'ESP32).

La bibliothèque RF24 mise au point par TMRh20 doit également être installée (ça peut se faire par l'entremise du gestionnaire de bibliothèques). Il s'agit de la même bibliothèque qu'on utilise pour une carte Arduino conventionnelle (Uno, etc.).

Connecteurs du module nRF24L01

La figure ci-contre pourrait se révéler utile pour identifier les connecteurs du module nRF24L01.

Certains modèles, généralement verts, comportent 10 broches alors que d'autres, généralement noirs, en comportent 8.

La répartition des broches sur deux rangées ne permettent pas l'insertion du module sur une breadboard.

Connexions du nRF24L01 à l'ESP32

J'ai branché le module nRF24L01 à ma carte ESP32 de la façon suivante:
  • GND du nRF24L01 - GND de l'ESP32
  • VCC du nRF24L01 - 3V3 de l'ESP32
  • CE du nRF24L01 - D4 de l'ESP32
  • CSN du nRF24L01 - D5 de l'ESP32
  • SCK du nRF24L01 - D18 de l'ESP32
  • MOSI du nRF24L01 - D23 de l'ESP32
  • MISO du nRF24L01 - D19 de l'ESP32
  • IRQ du nRF24L01 - Pas branché


Connexions du nRF24L01 à l'ESP8266

J'ai branché le module nRF24L01 à ma carte Wemos D1 Mini de la façon suivante:
  • GND du nRF24L01 - GND de l'ESP8266
  • VCC du nRF24L01 - 3V3 de l'ESP8266
  • CE du nRF24L01 - GPIO4 (D2) de l'ESP8266
  • CSN du nRF24L01 - GPIO5 (D1) de l'ESP8266
  • SCK du nRF24L01 - GPIO14 (D5) de l'ESP8266
  • MOSI du nRF24L01 - GPIO13 (D7) de l'ESP8266
  • MISO du nRF24L01 - GPIO12 (D6) de l'ESP8266
  • IRQ du nRF24L01 - Pas branché


Sketch #1: émission d'un message

Voici un sketch minimaliste pour l'émission d'un message (il s'agit du même sketch déjà publié pour l'utilisation d'un nRF24L01 avec un Arduino, seule la numérotation des broches est différente).

-
-

Sketch #2: réception d'un message

Voici un deuxième sketch minimaliste qui rapporte dans le moniteur série tous les messages reçus par le nRF24L01.

-
-

Sketch #3: réception d'un message et publication dans une page web

Ce troisième exemple utilise également les possibilités WiFi de l'ESP32 ou de l'ESP8266: les messages reçus par le nRF24L01 sont publiés dans une page web. On peut ainsi concevoir un réseau de microcontrôleurs qui transmettraient les mesures de leurs capteurs à un ESP32 ou un ESP8266 qui se chargerait de transmettre les données par WiFi (les données peuvent être émises par une carte Arduino ou par un carte STM32, par exemple).

-
-

L'adresse IP de l'ESP32 ou de l'ESP8266 s'affiche dans le moniteur série au démarrage du programme.


En recopiant cette adresse dans un navigateur web, on atteint une page web qui indique le message le plus récent reçu par le module nRF24L01.

À lire également

Vous trouverez sur ce blogs d'autres tutos qui vous guideront dans l'utilisation d'un module nRF24L01 avec un Arduinoun STM32un Raspberry Piun MSP430 Launchpad.

Dans le passé, j'ai aussi utilisé le nRF24L01 pour fabriquer un véhicule téléguidé et un système MIDI sans fil.

Finalement vous trouverez sur cette page une liste de tous les articles impliquant l'ESP32 et l'ESP8266.


Yves Pelletier   (TwitterFacebook)

dimanche 1 décembre 2019

Analyse d'une communication SPI



Développé par Motorola dans les années 1980, SPI (acronyme de Serial Peripheral Interface) est un protocole de communication série conçu pour permettre à un microcontrôleur (le "maître") de communiquer à haute vitesse avec un ou plusieurs périphériques (les "esclaves").

Une communication SPI implique 4 lignes de transmissions: MOSI, MISO, SCLK et CS.

1) MOSI (Master Out, Slave In) est utilisée pour la transmission de données du microcontrôleur vers le périphérique. Elle est contrôlée par le microcontrôleur maître.

2) MISO (Master In, Slave Out) est utilisée pour la transmission de données du périphérique vers le microcontrôleur. C'est la seule des quatre lignes qui est contrôlée par le périphérique esclave.

3) SCLK (Serial Clock) transmet un signal d'horloge généré par le microcontrôleur maître. Il sert à synchroniser  l'esclave avec le maître. Contrairement à la communication UART, la communication SPI est donc une communication synchrone.

4) CS ou SS (Chip Select ou Slave Select) est utilisée pour activer un esclave. Contrairement à MOSI, MISO et SCLK, qui sont partagées par tous les périphériques esclaves branchés au microcontrôleur maître, chaque périphérique esclave doit avoir sa propre ligne CS. La ligne CS d'un périphérique doit être mise au niveau logique BAS pour que ce périphérique tienne compte des messages envoyés par le maître sur la ligne MOSI. De cette façon, le maître communique avec un esclave à la fois.

C'est une communication full duplex, ce qui signifie que des données circulent du maître à l'esclave et de l'esclave au maître au même moment.

Sur un Arduino Uno, MOSI est la broche 11, MISO est la broche 12 et SCLK est la broche 13. On utilise souvent la broche 10 pour CS, mais ce n'est évidemment pas obligatoire puisque plusieurs lignes CS différentes seront nécessaire en présence de plusieurs périphériques esclaves.

Des exemples de périphériques qui communiquent en SPI

Voici quelques exemples de périphériques qui communiquent en SPI avec un Arduino: lecteur de cartes SD, module de communicaton radio nRF24L01module RFID-RC522lecteur de fichiers mp3 VS1053, écran couleur ST7735, afficheur TM1638, potentiomètre numérique MCP41100, etc.

Observation d'une transaction SPI

Pour observer une communication SPI au moyen d'un analyseur logique, j'ai branché un convertisseur analogique-numérique (ADC) MCP3008 à un Arduino Uno. Ce circuit intégré comporte 8 entrées analogiques dont l'état est transmis de façon numérique par une communication SPI.
J'ai branché le MCP3008 à l'Arduino de la façon suivante:

  • Broche 5 du MCP3008: potentiomètre permettant de faire varier la tension entre 0 et  5 V.
  • Broches 9 et 14 du MCP3008: GND de l'Arduino
  • Broches 15 et 16 du MCP3008: 5 V de l'Arduino
  • Broche 10 du MCP3008: broche 10 de l'Arduino et canal 0 de l'analyseur logique
  • Broche 11 du MCP3008: broche 11 de l'Arduino et canal 3 de l'analyseur logique
  • Broche 12 du MCP3008: broche 12 de l'Arduino et canal 2 de l'analyseur logique
  • Broche 13 du MCP3008: broche 13 de l'Arduino et canal 1 de l'analyseur logique


L'ajout d'un analyseur logique m'a permis de visualiser la communication SPI avec le logiciel Pulseview.

Le sketch que j'ai utilisé est présenté plus loin dans cet article: il consiste à établir une connexion avec le MCP3008 et de lui demander la valeur mesurée sur son canal 4.

Puisque le MCP3008 est un ADC à 10 bits, les valeurs obtenues peuvent varier entre 0 et 1023. Le potentiomètre a d'abord été réglé de façon à produire une valeur de 562:


Voici une transaction SPI au cours de laquelle l'Arduino demande la valeur du canal 4, ainsi que la réponse du MCP3008 (vous pouvez agrandir l'image en cliquant dessus). Remarquez que la ligne CS, qui était initialement l'état logique HAUT, se met temporairement à l'état logique BAS pendant toute la durée de la transaction.

Dans le cas du MPC3008, cette transaction nécessite l'échange de 3 octets. L'horloge (SCLK) a donc accompli trois séries consécutives de 8 oscillations. L'état logique des lignes MOSI et MISO est lu à chaque front ascendant de l'horloge.



Analysons chacun des 3 octets d'une façon plus détaillée:

Le premier octet est le message d'initialisation envoyé par le microcontrôleur au périphérique (sur la ligne MOSI, donc): il s'agit du nombre binaire "00000001". Pendant cette phase, l'état de la ligne MISO n'a aucune importance. Cet octet est émis à la ligne 41 du sketch (voir plus bas). Sur le diagramme ci-dessous, j'ai ajouté des gros points noirs pour indiquer à quel moment ces valeurs sont lues, pendant le front ascendant du signal d'horloge:

Dans le deuxième octet, le microcontrôleur indique au périphérique l'adresse de l'entrée analogique dont il désire lire la valeur. Selon la fiche technique du MCP3008, pour lire le canal numéro 4, il faut que les 4 premiers bits sur la ligne MOSI soient "1100"; la valeur des 4 derniers bits n'a aucune importance (on envoie généralement 0); ce signal est généré à la ligne 49 du sketch :


Sur la ligne MISO, le périphérique utilise les deux derniers bits de ce deuxième octet pour transmettre les deux premiers bits de sa réponse (qui en comportera ultimement 10). Ici, ces deux bits sont 1 et 0:

Finalement, les 8 derniers bits de la réponse du périphérique sont communiqués dans le troisième octet, sur la ligne MISO. Pour ce troisième octet, l'état de la ligne MOSI n'a aucune importance. Ici, le signal reçu est 00110010.


En mettant bout à bout les deux derniers bits du deuxième octet (10) et les 8 bits du troisième octet (00110010), nous obtenons le nombre binaire 1000110010, ou 562 en décimal: c'est bien à cette valeur que le potentiomètre avait été réglé.

Voici une transaction lorsque le potentiomètre est à la position minimale (0); les dix derniers bits retournés sur la ligne MISO sont 0000000000:


...et une autre lorsque le potentiomètre est à la position maximale (1023); les dix derniers bits retournés sur la ligne MISO sont 1111111111:


Le sketch utilisé

Sur Arduino, la communication SPI est gérée par la bibliothèque du même nom, qui est fournie par défaut avec l'IDE Arduino.

À la ligne 35 du sketch ci-dessous, on initie une transaction SPI en spécifiant 3 paramètres:la fréquence, le boutisme et le mode SPI (dans ce cas: 2 MHz, le bit de poids fort en premier, et le mode SPI 0):

SPI.beginTransaction (SPISettings(2000000, MSBFIRST, SPI_MODE0));

Un Arduino Uno peut sans problème établir une communication SPI à une fréquence de 4 MHz, mais il faut également tenir compte de la fréquence maximale que peut supporter le périphérique. Des fils conducteurs trop longs peuvent aussi nous obliger à diminuer la fréquence. Il existe 4 modes de communication SPI. Le plus fréquemment utilisé est le mode 0, dans lequel l'horloge est au niveau logique BAS quand elle est inactive, et la lecture des données s'effectue pendant le front montant de l'horloge.

SPI.transfer() permet simultanément l'envoi d'un octet du maître vers l'esclave sur la ligne MOSI et la réception d'un octet de l'esclave vers le maître sur la ligne MISO:

octet_recu = SPI.transfer(octet_envoyé);

À la ligne 41, on envoie le premier des 3 octets (00000001). Puisque la réponse de l'ADC est sans importance à cette étape, on ne se donne pas la peine de la stocker dans une variable.

SPI.transfer (0b00000001);

Le deuxième octet est envoyé à la ligne 45. C'est la commande qui indique qu'on désire lire le canal numéro 4. Cette fois, la réponse est stockée dans la variable octet_recu_1, puisque les deux derniers bits de la réponse constituent une information utile.

octet_recu_1 = SPI.transfer(0b11000000);

À la ligne 49, on envoie un troisième octet qui n'est qu'une suite de zéros, puisque ce message sera ignoré par le MCP3008. C'est strictement le message reçu qui nous intéresse: nous le stockons dans la variable octet_recu_2:

octet_recu_2 = SPI.transfer(0b00000000);

La ligne 59 consiste à mettre, dans une même variable, les deux derniers bits de la variable octet_recu_1, suivis des 8 bits de la variable octet_recu_2. Si la syntaxe vous donne du fil à retordre, relisez l'article sur les opérations bit à bit!

resultat = (octet_recu_1 & 0b00000011)<< 8 | octet_recu_2;

-
-

À lire aussi

Cet article a été précédé par l'analyse d'une communication UART; dans un proche avenir, j'ai bien l'intention de compléter cette série d'articles par l'observation d'une communication I2C.

Le MCP3008 n'en est pas à sa première apparition dans ce blog: je l'avais utilisé afin d'ajouter des entrées analogiques au Raspberry Pi ainsi qu'à l'ESP8266.

Yves Pelletier   (TwitterFacebook)


mercredi 27 novembre 2019

pyserial: communiquer en python avec un Arduino

Aujourd'hui, nous allons programmer un script en Python qui communiquera avec une carte Arduino branchée à un port USB de l'ordinateur.

Ce programme sera utile, par exemple, pour consulter à partir de l'ordinateur des mesures prises par des capteurs branchés à l'Arduino,  pour contrôler à partir de l'ordinateur un bras robotisé branché à l'Arduino, etc.

Bien entendu, tout ça peut se faire à partir du moniteur série de l'IDE Arduino, mais l'écriture de notre propre programme nous offrira la flexibilité nécessaire pour mieux répondre à nos besoins spécifiques.

Avant d'aller plus loin, j'aimerais attirer votre attention sur la série d'articles que j'ai rédigée sur l'utilisation de pyFirmata: on y atteint le même objectif d'une façon différente. Firmata est un protocole de communication entre un ordinateur hôte et un microcontrôleur. À mon avis, l'utilisation de Firmata est particulièrement appropriée si vous êtes très à l'aise avec la programmation en Python, mais moins à l'aise avec la programmation d'un Arduino: vous pouvez télécharger dans l'Arduino un sketch générique déjà tout fait, et concentrer tous vos efforts du côté du script en Python qui s'exécutera sur l'ordinateur.

La méthode que nous allons employer aujourd'hui (sans Firmata) suppose que vous maîtrisez à la fois le Python (côté ordinateur) et le C (côté Arduino).

Installation de pyserial

Côté ordinateur, nous aurons besoin de la bibliothèque pyserial qui, comme son nom l'indique, permet d'établir une communication série dans un programme en Python. Pour ce faire, j'ai utilisé pip:

pip install pyserial


Exemple 1: Communication de l'Arduino vers l'ordinateur

Dans ce premier exemple, l'Arduino va envoyer un message à chaque demi seconde. Le script en Python affichera chaque message reçu.

Commençons par le sketch à télécharger dans l'Arduino. Rien de bien compliqué ici: après avoir activé la communication série et choisi la vitesse de transmission au début du programme (Serial.begin(9600)), chaque émission d'un message s'accomplit grâce à un Serial.println().

-
-

Du côté ordinateur, la réception des messages s'accomplit au moyen de l'instruction readline(). Mais auparavant, en plus d'avoir défini la vitesse de transmission (baud rate), il faut indiquer quel port série est utilisé par l'Arduino.

La plupart des tutos proposent d'écrire le nom du port série directement dans le programme, comme par exemple, sur Linux:

serial.Serial('/dev/ttyACM0', 9600, timeout=.1)

... ou sur Windows:

serial.Serial('COM4', 9600, timeout=.1)

Cette approche me semble assez peu pratique, surtout qu'une même carte Arduino peut se voir attribuer des ports différents d'une utilisation à l'autre. Pour cette raison, mon script est un tout petit peu plus compliqué, car il effectue un scan des ports série actifs et demande à l'utilisateur de choisir celui qu'il désire. Il demande aussi à l'utilisateur de choisir la vitesse de transmission.

-
-

L'image ci-dessous montre l'exécution du programme: 2 cartes Arduino étaient simultanément branchées à l'ordinateur, une sur le port ttyUSB1 et l'autre sur le port ttyACM5.  J'ai choisi la deuxième carte, avec une vitesse de transmission de 9600 bauds, et les données en provenance de la carte choisie ont commencé à s'afficher.



Exemple 2: Communication de l'ordinateur vers l'Arduino

Essayons maintenant une communication de l'ordinateur hôte vers l'Arduino. Le script en Python enverra à l'Arduino le nombre de clignotements que devra effectuer sa LED intégrée.

Voici d'abord le sketch de l'Arduino: sur réception d'un message UART, il vérifie s'il s'agit d'un nombre situé 1 et 9 et, si c'est le cas, il fait clignoter sa LED. Notez que le message reçu est codé en ASCII, d'où la soustraction du nombre 48 (puisque le code ASCII du chiffre zéro est 48).

-
-

Du côté de l'ordinateur, le script en Python envoie, par l'instruction write(), le nombre choisi par l'utilisateur. Tout le début du script est similaire à celui de l'exemple 1: on effectue d'abord un scan des ports série actifs, et on demande à l'utilisateur de faire son choix.

-
-

L'image ci-dessous montre l'exécution du programme alors qu'un seul Arduino était connecté à l'ordinateur (dans le port ttyACM2). La LED intégrée à la carte Arduino se met à clignoter chaque fois que je choisis un nombre entre 1 et 9.



Yves Pelletier   (TwitterFacebook)

samedi 23 novembre 2019

Écran couleur SPI ST7735 et Raspberry Pi

Je vous explique aujourd'hui comment j'ai procédé pour contrôler un petit écran couleur SPI ST7735 ("KMR-1.8 SPI") de 128 * 160 pixels, branché à un Raspberry Pi, grâce à un script en Python.


Connexions

Il existe plusieurs modèles d'écrans couleurs basés sur le contrôleur ST7735, et le nom des broches peut varier d'un modèle à l'autre.  Le modèle que j'ai utilisé comporte 16 connecteurs (mais 9 d'entre eux suffisent à faire fonctionner l'écran).




J'ai branché l'écran à mon Raspberry Pi 2 de la façon suivante:
  • Broche GND de l'écran - Une des broches GND du Raspberry Pi
  • Broche VCC de l'écran - Une des broches 5V du Raspberry Pi
  • Broches NC de l'écran - Pas branchées
  • Broche AO (ou DC/RS) de l'écran - Broche GPIO25 du Raspberry Pi
  • Broche SDA de l'écran - Broche GPIO10 du Raspberry Pi
  • Broche SCL de l'écran - Broche GPIO11 du Raspberry Pi
  • Broche CS de l'écran - Broche GPIO8 du Raspberry Pi
  • Broches SDA/MISO/MOSI/SD_CS de l'écran - Pas branchées (pour carte SD)
  • Broche LED+ de l'écran - Une des broches 3,3 V du Raspberry Pi
  • Broche LED- de l'écran - Une des broches GND du Raspberry Pi


Activation de SPI

Si ce n'est pas déjà fait, il est important d'activer le protocole SPI sur votre Raspberry Pi.  Pour ce faire, on ouvre "Configuration du Raspberry Pi" dans le menu "Préférences" de Raspbian.


Dans l'onglet, on coche "Activé" sur la ligne "SPI".



Installation de la bibliothèque

J'ai utilisée la bibliothèque Python ST7735, adaptée par Clement Skau à partir d'une bibliothèque qu'Adafruit avait conçue pour un autre modèle d'écran.

J'ai suivi à la lettre la procédure d'installation proposée sur la page github de la bibliothèque:

sudo apt-get update
sudo apt-get install build-essential python-dev python-smbus python-pip python-imaging python-numpy
sudo pip install RPi.GPIO
sudo pip install Adafruit_GPIO
git clone https://github.com/cskau/Python_ST7735
cd Python_ST7735
sudo python setup.py install

Le répertoire Python_ST7735 comporte un dossier "Examples". Le script "image.py" qui s'y trouve constitue une façon simple et rapide de vérifier le fonctionnement correct de l'écran (ça affiche à l'écran l'image contenue dans le fichier "cat.jpeg").



Vous pouvez facilement modifier ce script afin d'afficher une image de votre choix.



Le script "shapes.py", toutefois, n'est pas tout à fait au point: il a visiblement été conçu pour un écran ayant une résolution différente, et on ne voit à l'écran qu'une partie de l'image construite.

Exemple de script en python

Puisque la bibliothèque utilise la Python Imaging Library (PIL), c'est assez facile de trouver de la documentation pour apprendre à construire des images pouvant être affichées à l'écran.

Les coordonnées sont définies selon l'orientation en mode portrait; la bibliothèque ne semble pas comporter une façon simple de définir une orientation en mode paysage.

Dans le script ci-dessous, j'affiche quelques formes géométriques, puis j'écris l'adresse IP du Raspberry Pi (utile pour travailler en mode "headless") ainsi que la date et l'heure.





-

-

Inversion du bleu et du rouge!

Sur certains modèles d'écran ST7735, les couleurs seront incorrectes: ce qui devrait être rouge apparaît en bleu, et ce qui devrait être bleu apparaît en rouge!  (C'est un écran "bgr" plutôt que "rgb"). Si vous constatez ce phénomène sur votre écran, la solution consiste à modifier la bibliothèque Python_ST7735:
  • Ouvrez le fichier /Python_ST7735/ST7735/ST7735.py avec un éditeur de texte.
  • À la ligne 241, remplacez self.data(0xC8) par self.data(0xC0) .
  • Retournez dans le répertoire Python_ST7735 et tapez à nouveau la commande "sudo python setup.py install"


À lire aussi

Cet écran couleur ST7735 peut également être contrôlé par un Arduino, un STM32, un ESP8266 ou un ESP32.

Parmi les nombreux articles de ce blog portant sur le Raspberry Pi, certains décrivent l'utilisation d'autres modèles d'afficheurs: écran OLED SH1106, écran Nokia 5110,  afficheur LCD 16 X 2...

Yves Pelletier   (TwitterFacebook)

mercredi 20 novembre 2019

Raspberry Pi: présenter des mesures sous forme de graphique cartésien

Dans cet article, je vous présente comment j'ai pu présenter en temps réel, sous la forme d'un graphique cartésien, les mesures prises par un capteur branché aux broches GPIO du Rasbperry Pi.  Pour ce faire, j'ai utilisé un programme en langage Python, ainsi que la bibliothèque Matplotlib.



Installation de la bibliothèque Matplotlib

Matplotlib est une bibliothèque spécialement conçue pour représenter des données sous forme de graphique dans un programme en Python. Une façon simple de l'installer dans votre Raspberry Pi est d'écrire la commande suivante dans le terminal:

pip install matplotlib

Attention: ça risque d'être très long! Plusieurs dizaines de minutes sur mon Raspberry Pi 2.

Suite à l'installation de Matplotlib, mes scripts ont d'abord refusé de fonctionner sous prétexte que cairocffi n'était pas installé. Après un peu de recherche, j'ai fini par régler le problème en faisant:

sudo apt install libffi-dev
pip install cairoffi
sudo apt-get install python-gi-cairo

(je ne sais pas si chacune de ces manoeuvres est nécessaire, tout ce que je peux dire c'est qu'après avoir fait tout ça, ça s'est mis à fonctionner correctement).

Un exemple de script (données calculées)

Voici un script qui fait apparaître un graphique qui se met à jour à toutes les 500 ms. Pour que tout le monde puisse en faire l'essai sans autre matériel qu'un Rasbperry Pi, les données qui s'affichent sur le graphique sont issues d'un calcul plutôt que d'une mesure effectuée par un capteur.

-
-

La variable temps_pause contient le nombre de millisecondes entre chaque mise à jour du graphique. Vous pouvez évidemment modifier cette valeur selon vos besoins (si ce temps est trop court pour la vitesse de votre Raspberry Pi, le graphique restera vide).

Les données à mettre en graphique s'accumulent dans les variables valeurs_x et valeurs_y.

Grâce à la fonction FuncAnimation de matplotlib, la routine animate s'exécute automatiquement, à intervalle régulier.

Le programme s'interrompt lorsque vous fermez la fenêtre du graphique.



Un deuxième exemple de script (données mesurées)

Pour afficher dans le graphique les données mesurées par un capteur, il s'agit de remplacer le calcul de la ligne 30 par une procédure qui ajoute à la variable valeurs_y la mesure issue du capteur. Évidemment, la syntaxe exacte dépend du capteur que vous utilisez.

Voici par exemple un script qui met en graphique les valeurs mesurées par un module PCF8591 (il s'agit en fait de la tension contrôlée par le potentiomètre intégré au module).

-
-

En tournant lentement le potentiomètre, j'ai obtenu ce graphique:


À lire aussi

Vous trouverez sur cette page la liste de tous les articles du blog portant sur le Raspberry Pi, et sur celle-ci les articles portant sur l'utilisation des microcontrôleurs dans un contexte scientifique.

Yves Pelletier   (TwitterFacebook)


samedi 16 novembre 2019

Écran couleur SPI ST7735 et carte STM32

Je vous présente aujourd'hui un petit tuto sur l'art de piloter un écran couleur SPI ST7735 (128 X 160 pixels) au moyen d'une carte STM32 (Nucleo ou Blue Pill, par exemple) que nous programmerons au moyen de l'IDE Arduino.


(Si vous n'avez pas l'habitude de programmer une carte STM32 avec l'IDE Arduino, il pourrait être utile de consulter ce précédent billet qui explique comment ajouter les cartes STM32 grâce au gestionnaire de cartes.)

Installation des bibliothèques GFX et ST7735 d'Adafruit

Si ce n'est pas déjà fait, il faut installer les plus récentes version de la bibliothèque Adafruit GFX et de la bibliothèque Adafruit ST7735. Le plus simple est de passer par le gestionnaire de bibliothèque.




Connecteurs de l'écran

Mon écran ST7735 comporte 16 connecteurs, mais seulement 9 d'entre eux sont utiles pour faire apparaître une image sur l'écran.

4 connecteurs servent à l'utilisation du lecteur de carte SD, au verso de l'écran (je n'utilise pas ce lecteur dans le présent article), et 3 connecteurs  identifiés par la mention NC ne sont pas connectés à quoi que ce soit.






Connexions à la carte Nucleo

Pour utiliser l'écran avec mon Nucleo F030R8, j'ai utilisé les connexions suivantes:
  • Broche GND de l'écran - Broche GND du Nucleo
  • Broche VCC de l'écran - Broche 5 V du Nucleo
  • Broche RESET de l'écran - Broche PA9/D8 du Nucleo
  • Broche AO de l'écran - Broche PA10/D2 du Nucleo
  • Broche SDA de l'écran - Broche PA7/D11 du Nucleo
  • Broche SCL de l'écran - Broche PA5/D13 du Nucleo
  • Broche CS de l'écran - Broche PA8/D7 du Nucleo
  • Broche LED+ de l'écran - Broche 3V3 du Nucleo
  • Broche LED- de l'écran - Broche GND du Nucleo



Connexions à la Blue Pill (STM32F103C8T6)

Pour utiliser l'écran avec ma Blue Pill, j'ai utilisé ces connexions:
  • Broche GND de l'écran - Broche G de la Blue Pill
  • Broche VCC de l'écran - 5 V *
  • Broche RESET de l'écran - Broche A9 de la Blue Pill
  • Broche AO de l'écran - Broche A10 de la Blue Pill
  • Broche SDA de l'écran - Broche A7 de la Blue Pill
  • Broche SCL de l'écran - Broche A5 de la Blue Pill
  • Broche CS de l'écran - Broche A8 de la Blue Pill
  • Broche LED+ de l'écran - Broche 3.3 de la Blue Pill
  • Broche LED- de l'écran - Broche G de la Blue Pill
* Dans les faits, puisque ma Blue Pill était alimentée en 3,3 V, j'ai branché cette broche de l'écran à une sortie 5 V de mon programmateur ST-Link. Notez aussi que certains modèles d'écrans nécessitent une alimentation de 3,3 V, et qu'il est possible de retirer un pont de soudure pour que le modèle 5 V devienne un modèle 3,3 V.

Exemple de sketch

Voici, pour finir, un sketch qui montre les principales possibilités de la bibliothèque GFX: affichage de texte, dessin de différentes formes géométriques, affichage d'une image bitmap, etc.


----
---

À lire aussi

Si vous préférez, il est possible de contrôler cet écran avec un Arduino , un ESP32 ou un ESP8266.

Vous trouverez sur cette page une liste de projets réalisés avec des cartes STM32 (programmées avec l'IDE Arduino ou avec mbed), comme par exemple le contrôle d'un écran OLED SH1106 ou d'un afficheur LCD 2 X 16.

Yves Pelletier   (TwitterFacebook)

dimanche 10 novembre 2019

Communication nRF24L01 avec cartes STM32

Les modules nRF24L01 sont des émetteurs/récepteurs qui permettent la communication radio entre deux microcontrôleurs sur la bande 2,4 GHz. Je vous propose aujourd'hui quelques informations pour utiliser ces modules avec une carte STM32 programmée avec l'IDE Arduino (j'ai fait des tests avec une carte Nucleo et une Blue Pill).

Un truc intéressant, c'est qu'en plus de permettre une communication sans fil entre deux cartes STM32, une paire de modules nRF24L01 peuvent facilement être utilisée pour établir une connexion entre une carte STM32 et une carte Arduino, un ESP32, un ESP8266, un Raspberry Pi, etc.

Il existe sur le marché deux modèles de modules nRF24L01: un modèle vert comportant 10 broches, et un modèle noir comportant 8 broches. On peut se les procurer pour un prix qui tourne autour d'un euro par module. Il existe aussi un modèle plus puissant, vendu avec une antenne amovible, mais je n'ai pas eu l'occasion d'en faire l'essai.
Comme vous pouvez peut-être le deviner en lisant le nom des broches sur les images ci-dessus, chaque module communique avec le microcontrôleur auquel il est branché grâce au protocole SPI.

Pour les deux modèles, ça peut être une bonne idée d'ajouter un condensateur de 10 µF entre entre GND et VCC afin de stabiliser l'alimentation.

Préparation de l'IDE Arduino: installation des cartes STM32 et de la bibliothèque RF24-STM

Afin de programmer une carte STM32 avec l'IDE Arduino, il faut d'abord avoir installé le "STM32 core" au moyen du gestionnaire de cartes (instructions ici).

De plus, j'ai installé la bibliothèque RF24-STM; il s'agit d'une version de la bibliothèque RF24 de TMRh20 qui a été modifiée par Jaret Burkett pour la rendre compatible avec les cartes STM32. (J'avais d'abord tenté d'utiliser la version conventionnelle de la bibliothèque RF24 par TMRh20 mais  les messages reçus étaient remplacés par une suite de points d'interrogations dans le moniteur série).

Connexion du nRF24L01 à une carte Nucleo
  • broche VCC du module nRF24L01 - Broche 3.3 V de la carte Nucleo
  • broche CE du module nRF24L01 - Broche D7 de la carte Nucleo*
  • broche CSN du module nRF24L01 - Broche D6 de la carte Nucleo*
  • broche SCK du module nRF24L01 - Broche SCK/D13 de la carte Nucleo
  • broche MOSI du module nRF24L01 - Broche MOSI/D11 de la carte Nucleo
  • broche MISO du module nRF24L01 - Broche MISO/D12 de la carte Nucleo
  • broche IRQ du module nRF24L01 - pas branchée
  • broche GND du module nRF24L01 - Broche GND de la carte Nucleo
* Ces deux broches peuvent être remplacées par d'autres puisqu'on les définit au début du sketch. 





Connexion du nRF24L01 à une Blue Pill
  • broche VCC du module nRF24L01 - Broche 3.3 de la Blue Pill
  • broche CE du module nRF24L01 - Broche A8 de la Blue Pill*
  • broche CSN du module nRF24L01 - Broche B10 de la Blue Pill*
  • broche SCK du module nRF24L01 - Broche A5 de la Blue Pill
  • broche MOSI du module nRF24L01 - Broche A7 de la Blue Pill
  • broche MISO du module nRF24L01 - Broche A6 de la Blue Pill
  • broche IRQ du module nRF24L01 - pas branchée
  • broche GND du module nRF24L01 - Broche G de la Blue Pill


Sketches de démonstration

La bibliothèque RF24-STM est accompagnée d'une dizaine d'exemples qui vous aideront à découvrir les nombreuses possibilités du module nRF24L01.

Je vous présente ci-dessous un sketch pour l'émission d'un message (un nombre croissant est émis chaque seconde), et un autre pour la réception d'un message (le message reçu est affiché dans le moniteur série).  Leur simplicité constitue un avantage lorsqu'on désire vérifier que la communication fonctionne correctement.

Ces programmes sont parfaitement compatibles avec ceux que j'avais déjà publiés pour la communication nRF24L01 impliquant une carte Arduino ou un Raspberry Pi. Vous pouvez donc, par exemple, émettre un message avec un Arduino Uno et le capter avec une carte Nucleo.



Sketch pour l'émission d'un message

-
-

Sketch pour la réception d'un message

-
-

À lire aussi

Au risque de me répéter: vous trouverez sur ce blog d'autres tutos qui vous guideront dans l'utilisation d'un module nRF24L01 avec un Arduino, un Raspberry Pi, un MSP430 Launchpad.

Dans le passé, j'ai aussi utilisé le nRF24L01 pour fabriquer un véhicule téléguidé et un système MIDI sans fil.

Pour une communication unidirectionnelle, une paire émetteur/récepteur 433 MHz peut constituer une alternative intéressante.

D'autre part, vous trouverez sur cette page une liste d'articles impliquant les cartes STM32 (programmées avec l'IDE Arduino ou avec mbed).

Yves Pelletier   (TwitterFacebook)

dimanche 3 novembre 2019

Écran OLED SH1106 I2C et STM32

Le projet d'aujourd'hui consiste à afficher du texte et des images sur un petit écran OLED SH1106 i2c de 128 X 64 pixels. L'écran sera piloté par une carte STM32 (Blue Pill ou Nucleo, par exemple), programmée au moyen de l'IDE Arduino.


Afin de pouvoir programmer une carte STM32 avec l'IDE Arduino, ces cartes doivent préalablement avoir été installées dans l'IDE au moyen de son gestionnaire de cartes. Si ce n'est pas déjà fait, vous pouvez vous référer à ce précédent article.

Installation de la bibliothèque u8g2

Il faut aussi que la bibliothèque u8g2 soit installée. Cette bibliothèque est compatible avec de nombreuses cartes de développement, et avec pratiquement tous les modèles d'écrans monochromes. Le gestionnaire de bibliothèques de l'IDE constitue la façon la plus simple de l'installer.

Connexion de l'écran OLED à une carte STM32 Nucleo

Puisqu'il s'agit d'un périphérique I2C, 4 fils sont suffisants pour brancher l'écran à votre carte de développement.

Sur une carte Nucleo, les connexions sont assez évidentes:
  • GND de l'écran OLED - GND de la carte Nucleo
  • VCC de l'écran OLED - 3V3 de la carte Nucleo
  • SCL de l'écran OLED - SCL de la carte STM32
  • SDA de l'écran OLED - SDA de la carte STM32


Connexions à une Blue Pill

Si vous utilisez une Blue Pill, il faut savoir que les broches B6 et B7 sont consacrées à la communication I2C, car ce n'est pas indiqué sur la carte.
  • GND de l'écran OLED - G de la carte STM32
  • VCC de l'écran OLED - 3V3 de la carte STM32
  • SCL de l'écran OLED - broche B6 de la carte STM32
  • SDA de l'écran OLED - broche B7 de la carte STM32

N.B.: j'ai essayé sans succès de piloter l'écran OLED avec mon STM32F030 Demo Board V1.1, mais la bibliothèque u9g2 semble trop gourmande pour ses 16 kb de mémoire flash.

Sketch de démonstration

Voici un sketch qui écrit et dessine sur l'écran. Il s'agit en fait du sketch que j'avais écrit il y a quelques mois pour contrôler l'écran OLED avec un ESP32. Aucune modification n'a été nécessaire pour le faire fonctionner avec un STM32, et vous pouvez donc consulter ce précédent article pour plus d'explications.

-

-

À lire aussi

Vous serez peut-être intéressés par ces autres tutoriels qui montrent comment utiliser ce même écran OLED SH1106 avec un Raspberry Pi, un Arduino, un ESP32 ou un ESP8266.

D'autres types d'écrans peuvent être pilotés par une carte STM32: écran couleur ST7735, afficheur 2 X 16, etc.

De plus, vous trouverez ici la liste de tous les projets impliquant les cartes STM32 (programmées avec l'IDE Arduino ou avec mbed).

Yves Pelletier   (TwitterFacebook)