Affichage des articles dont le libellé est Communication. Afficher tous les articles
Affichage des articles dont le libellé est Communication. Afficher tous les articles

lundi 24 juillet 2023

Contrôler un Raspberry Pi Pico avec une télécommande de téléviseur (Micropython)

Dans bien des situations, une télécommande à infrarouge constitue une bonne façon d'interagir avec le dispositif électronique que vous avez fabriqué. Dans cet article, je vous explique comment communiquer avec un Raspberry Pi Pico (programmé en Micropython) avec une télécommande à infrarouge conçue pour un téléviseur.


La télécommande

C'est généralement facile de trouver une vieille télécommande à infrarouge. Il y a quelques années,  il y en avait quatre sur ma table de salon: une pour le téléviseur, une pour le lecteur de DVD, une pour le lecteur de cassettes VHS, et une autre pour la chaîne stéréo... Au cours des années, les appareils ont été remplacés ou mis au rancart, mais la télécommande est demeurée fonctionnelle.


Lorsque vous appuyez sur un des boutons de la télécommande, une LED à infrarouge se met à clignoter. Puisqu'il s'agit d'infrarouge et non de lumière visible, vous ne pouvez pas percevoir ce clignotement à l'oeil nu. Par contre, si vous regardez la LED à travers la caméra de votre téléphone, vous devriez la voir s'allumer lorsque vous appuyez sur un des boutons (il s'agit d'une façon rapide et efficace de vérifier qu'une vieille télécommande fonctionne encore).


Ce signal infrarouge transporte un message. Ce qui vient compliquer les choses, c'est qu'il existe un grand nombre de protocoles (NEC, Sony. RC-5, RC-6, Samsung, Panasonic, etc), et la bibliothèque Micropython que nous allons utiliser ne supporte qu'un certain nombre de ces protocoles.

Le récepteur

Pour capter le signal optique émis par la télécommande et le transformer en un signal électrique pouvant être interprété par le Raspberry Pi Pico, vous aurez besoin d'un composant spécialement conçu à cette fin. Pour la rédaction de cet article, j'ai utilisé le TSOP4838 fabriqué par la compagnie Vishay. Une autre option consiste à récupérer le récepteur à l'intérieur d'un vieux téléviseur qui ne fonctionne plus (ce sera possiblement un autre modèle et vous devrez donc faire quelques recherches ou expérimentations).

Le TSOP4838 comporte 3 broches: OUT (le signal de sortie), GND et VCC. 

La façon la plus simple de brancher le TSOP4838 au Raspberry Pi Pico est celle-ci:

  • Broche OUT du  TSOP4838: Broche GP16 du Raspberry Pi Pico
  • Broche GND du TSOP4838: Broche GND du Raspberry Pi Pico
  • Broche VCC du TSOP4838: Broche 3,3 V du Raspberry Pi Pico

Pour améliorer la stabilité du circuit, on peut aussi ajouter une résistance de 100 Ω entre la broche VCC du TSOP4838 et la sortie 3,3 V du Raspberry Pi Pico, ainsi qu'un condensateur de 0,1 µF entre GND et VCC. J'ai testé les deux options sans constater la moindre différence dans le comportement du circuit.


Installation de la bibliothèque micropython_ir 

Nous utiliserons la bilbliothèque micropython_ir mise au point par Peter Hinch. Tout le répertoire "ir_rx" qui doit être copié dans la mémoire du Raspberry Pi Pico.



Identification du protocole utilisé par la télécommande

Pour écrire votre programme en Micropython, il est important de savoir quel est le protocole utilisé par votre télécommande. Si vous ne le connaissez pas, la bibliothèque micropython_ir vous offre deux façon de le découvrir:

Option 1, vous écrivez ceci dans la console REPL:

    from ir_rx.acquire import test
    test()

Option 2, vous écrivez ceci dans la console REPL:

    from ir_rx.test import test

... puis vous choisissez le protocole que vous désirez tester en écrivant test() pour tester le protocole NEC 8 bit, test(1) pour tester le protocole NEC 16 bits, etc.

Je dois dire que j'ai été un peu déçu par le manque d'efficacité de ces tests. L'option 2 s'interrompt généralement en affichant "unknown protocol" avant même que j'aie eu le temps d'appuyer sur un bouton de la télécommande.

L'option 1 me retourne beaucoup de messages d'erreurs, mais lorsque je sélectionne le protocole qui correspond à ma télécommande, des lignes montrant les valeurs hexadécimales de Data, Addr et Ctrl sont affichées (je suggère de maintenir le bouton enfoncé un certain temps, ça permet d'afficher plusieurs lignes consécutives qui sont plus faciles à repérer parmi les lignes qui affichent une erreur).

Ainsi, parmi les télécommandes que j'ai testées, j'en ai trouvé une qui fonctionne selon le protocole "Sony 20 bits", et une autre qui utilise le protocole "Samsung". Comme je le disais plus haut, plusieurs protocoles ne sont pas supportés pour l'instant. Par exemple, ma télécommande Hitachi qui m'avait été bien utile dans certains projets Arduino ne peut pas être utilisée avec micropython_ir.


Exemples de scripts

Une fois que vous connaissez le protocole utilisé par votre télécommande, c'est assez facile d'écrire un programme qui accomplira une action différente selon le bouton qui est enfoncé.

Voici, par exemple, un script qui affiche dans la console les valeurs hexadécimales associées aux boutons de ma télécommande Samsung. Les valeurs de Data et de Addr me permettent de savoir quel bouton de la télécommande a été enfoncé, et je peux ensuite modifier ce programme pour que le Raspberry Pi Pico effectue la tâche qui correspond à ce bouton (allumer une LED, faire tourner un robot vers la droite, etc.).

-

-

Le script ci-dessous est identique, mais pour ma télécommande Sony.

-

-


À lire également:

Yves Pelletier

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)


lundi 14 février 2022

Raspberry Pi Pico et nRF24L01 (MicroPython)

Dans cet article, nous établissons une communication sans fil entre deux Raspberry Pi Pico munis d'un module nRF24L01. Les Raspberry Pi Pico seront programmés en MicroPython.


Les modules nRF24L01 sont conçus pour transmettre des informations à une fréquence radio de 2,4 GHz. Chaque module peut émettre et capter des signaux. La portée peut être de quelques dizaines de mètres (j'ai fait mes test avec deux modules distants d'environ 10 mètres et situés dans deux pièces différentes).

Connexions

Je possède deux paires de modules nRF24L01: des modules verts comportant 10 broches clairement identifiées, et des modules noirs comportant 8 broches qui ne comportent aucune identification.

Chaque Raspberry Pi Pico a été branché à un module nRF24L01 de la façon suivante:

  • Broche VCC du nRF24L01 : sortie 3,3 V du Raspberry Pi Pico
  • Broche GND du nRF24L01 : broche GND du Raspberry Pi Pico
  • Broche SCK du nRF24L01 : broche GP6 du Raspberry Pi Pico
  • Broche MOSI du nRF24L01 : broche GP7 du Raspberry Pi Pico
  • Broche MISO du nRF24L01 : broche GP4 du Raspberry Pi Pico
  • Broche IRQ du nRF24L01: pas branchée
  • Broche CE du nRF24L01 : broche GP12 du Raspberry Pi Pico
  • Broche CSN du nRF24L01: broche GP5 du Raspberry Pi Pico
De plus, il est souvent recommandé d'ajouter un condensateur de 10 µF entre les broches GND et VCC du module nRF24L01: c'est une solution à considérer si vous constatez un fonctionnement erratique.


Installation de la bibliothèque nrf24l01.py

Après avoir téléchargé la bibliothèque nrf24l01.py, il est important d'installer le fichier nrf24l01.py dans la mémoire flash du Raspberry Pi Pico (en utilisant, par exemple, le volet "Fichiers" de Thonny).


Cette bibliothèque est accompagnée d'un programme très bien fait intitulé "nrf24l01test.py". Pour l'utiliser avec le Raspberry Pi Pico, vous devrez toutefois modifier les numéros des broches au début du programme.

En me basant sur cet exemple, j'ai produit deux scripts distincts conçus pour être utilisés simultanément sur deux Raspberry Pi Pico différents: un script pour l'émetteur, et un script pour le récepteur.

Script de l'émetteur

Une fois par seconde, ce Raspberry Pi Pico incrémente un nombre entier et le fait émettre par le module nRF24L01. Il vérifie ensuite s'il reçoit une réponse de la part du récepteur.

-

-


Script du récepteur

Si ce Raspberry Pi Pico reçoit un message en provenance de l'émetteur, il calcule le modulo du nombre reçu et retourne le résultat à l'émetteur (il retourne donc le nombre "0" lorsqu'il reçoit un nombre pair, et le nombre "1" lorsqu'il reçoit un nombre impair).

-

-



À lire également:

D'autres projets impliquant le Raspberry Pi Pico:

D'autres projets impliquant le module nRF24L01:


Yves Pelletier (Facebook)


lundi 24 mai 2021

Module Bluetooth HC-06 et Raspberry Pi Pico

Vous aimeriez pouvoir contrôler votre Raspberry Pi Pico au moyen de votre smartphone?

Un module HC-06 permettra à votre Raspberry Pi Pico de communiquer par Bluetooth avec un téléphone ou une tablette situé à une distance maximale d'une dizaine de mètres. 

Dans cet article, le Raspberry Pi Pico sera programmé en MicroPython.



Connexions du module HC-06 au Raspberry Pi Pico

Le module HC-06 ne comporte que 4 broches: deux pour l'alimentation, et deux pour la communication UART. Le verso de mon module indique que l'alimentation doit se situer entre 3,6 V et 6 V, mais que la communication s'effectue à un niveau logique de 3,3 V.

Voici comment j'ai branché le module HC-06 au Raspberry Pi Pico:
  • Broche VCC du HC-06 - Broche VBUS (5 V) du Raspberry Pi Pico
  • Broche GND du HC-06 - Broche GND du Raspberry Pi Pico
  • Broche TXD du HC-06 - Broche GP1 (RX) du Raspberry Pi Pico
  • Broche RXD du HC-06 - Broche GP0 (TX) du Raspberry Pi Pico

Couplage avec l'appareil hôte

Aussitôt que le module HC-06 est alimenté, sa LED rouge se met à clignoter, ce qui indique qu'il est prêt à être couplé avec un appareil hôte (smartphone, tablette, etc.). Cette procédure s'effectue de façon autonome par le module HC-06, elle ne dépend aucunement du Raspberry Pi Pico.

Les captures d'écran ci-dessous proviennent d'une tablette Android. Je suis allé dans "Paramètres", puis "Bluetooth".  J'active Bluetooth si ce n'est pas déjà fait, et HC-06 apparaît dans la liste des appareils disponibles.



Par défaut, le mot de passe est "1234" (si vous le désirez, toutefois, le mot de passe peut être modifié au moyen d'une commande AT).


Si le mot de passe est bon, HC-06 apparaît désormais dans la liste "Périphériques couplés".



Une appli pour la communication Bluetooth

Il existe un grand nombre d'applis qui permettent de communiquer en Bluetooth avec votre téléphone ou votre tablette. Sur Android, j'aime bien Serial Bluetooth Terminal par Kai Morich.

À l'intérieur de Serial Bluetooth Termnal, cliquez sur ce bouton afin d'établir la connexion avec le HC-06.

À cette étape, le bouton change de forme et la LED du HC-06 cesse de clignoter (elle demeure allumée de façon continue).



Exemple 1: envoi d'un message du Raspberry Pi Pico vers le téléphone

Ce script en MicroPython envoie un message qui pourra être capté par votre téléphone. Puisque le HC-06 retransmet via Bluetooth tout ce qu'il reçoit sur sa broche RXD, le script ne comporte rien de spécifique au Bluetooth: il émet simplement un message UART (dans ce cas particulier: un nombre entier qui augmente d'une unité à chaque seconde).

-

-

Exemple 2: envoi d'un message du téléphone vers le Raspberry Pi Pico

Dans ce deuxième exemple, on envoie un message au Raspberry Pi Pico à partir du téléphone. Si on envoie le message "a", la LED verte du Raspberry Pi Pico s'allume, alors qu'elle s'éteint si on envoie le message "b".

Ici encore, le message Bluetooth reçu par le HC-06 sera transmis par UART au Raspberry Pi Pico.


-
-

À lire également


Yves Pelletier (Facebook)

samedi 9 janvier 2021

Communication RF 433 MHz avec RadioHead (Arduino, ESP32, ESP8266)

Dans cet article, nous établissons une communication radio à une fréquence de 433 MHz entre cartes Arduino , ESP8266 et ESP32. Il peut s'agir, par exemple, d'un Arduino Uno qui transmet des informations à un ESP8266,  d'un ESP32 transmettant des informations à un Arduino Nano, etc.


L'émetteur et le récepteur

Les modules utilisés sont vendus par paire: l'émetteur, de forme carrée, comporte trois broches: deux pour l'alimentation (VCC et GND) et une entrée pour le message à transmettre (DATA).

Le récepteur comporte 4 broches, mais les deux broches centrales (DATA) sont reliées ensemble, on utilise l'une ou l'autre pour recueillir le message capté. Les deux autres broches (VCC et GND) servent à alimenter le module.


Les deux modules comportent également un connecteur "ANT" qui permet d'ajouter une antenne.

Il est possible de brancher un émetteur et un récepteur au même microcontrôleur de façon à établir une communication bidirectionnelle. Dans les sketches ci-dessous, toutefois, je me contente d'une communication unidirectionnelle.

Installation de la bibliothèque RadioHead

Nous utiliserons la bibliothèque RadioHead qui, en plus d'être compatible avec les cartes Arduino "classiques", fonctionne également avec l'ESP32 et l'ESP8266 (ce qui n'était pas le cas de VirtualWire, le prédécesseur de Radiohead). Puisqu'elle ne semble pas disponible dans le gestionnaire de bibliothèque, vous devrez l'installer à partir du fichier zip disponible sur la page web de RadioHead.

Connexions de l'émetteur à un Arduino Uno

Si vous désirez émettre un message avec un Arduino Uno, l'émetteur sera branché de cette façon:
  • Broche VCC de l'émetteur : 5 V
  • Broche GND de l'émetteur: GND
  • Broche DATA de l'émetteur: broche 12 de l'Arduino

Connexions de l'émetteur à un ESP8266

Pour émettre à partir d'un ESP8266, l'émetteur est branché de la façon suivante:

  • Broche VCC de l'émetteur : 5 V
  • Broche GND de l'émetteur: GND
  • Broche DATA de l'émetteur: broche GPIO 5 de l'ESP8266

Connexions de l'émetteur à un ESP32

Pour brancher l'émetteur à un ESP32:

  • Broche VCC de l'émetteur : VIN (5 V)
  • Broche GND de l'émetteur: GND
  • Broche DATA de l'émetteur: broche D5 de l'ESP32

Connexion du récepteur à un Arduino Uno

Pour recevoir des données sur un Arduino Uno, vous connectez le récepteur de cette façon:

  • Broche VCC du récepteur:  5 V
  • Broche GND du récepteur: GND
  • Broche DATA du récepteur: Broche 11 de l'Arduino

Connexion du récepteur à un ESP8266

Pour un ESP8266, le récepteur est branché de cette façon:

  • Broche VCC du récepteur:  3,3 V
  • Broche GND du récepteur: GND
  • Broche DATA du récepteur: Broche GPIO 4 de l'ESP8266

Connexion du récepteur à un ESP32

Finalement, pour un ESP32, les branchements du récepteur sont:

  • Broche VCC du récepteur:  3,3 V
  • Broche GND du récepteur: GND
  • Broche DATA du récepteur: Broche D4 de l'ESP32


Exemple: sketch de l'émetteur

Le sketch ci-dessous émet un message chaque seconde (il s'agit d'un nombre entier qui augmente d'une unité à chaque émission, ce qui permet de constater si tous les messages arrivent à destination ou non). Le même sketch fonctionnera aussi bien sur une carte Arduino classique que sur un ESP32 ou un ESP8266.

-
-


Exemple: sketch du récepteur

Le sketch ci-dessous affiche dans le moniteur série le message radio reçu par le récepteur. Encore une fois, le même sketch s'applique à l'ESP32, à l'ESP8266 et aux cartes Arduino conventionnelles comme le UNO.

-
-




À lire également:


Yves Pelletier (Twitter, Facebook)