mardi 29 août 2023

Magnétomètre/boussole HMC5883L et Raspberry Pi Pico (Micropython)

Dans cet article, nous utilisons un module HMC5883L relié à un Raspberry Pi Pico programmé en Micropython, afin de fabriquer une boussole électronique.


Le circuit intégré HMC5883L de la compagnie Honeywell permet de mesurer les 3 composantes (x, y, z) du champ magnétique dans lequel il se trouve. Il existe sur le marché plusieurs module ("breakout") faciles à connecter à un microcontrôleur. Celui que j'ai utilisé comporte 5 connecteurs identifiés VCC, GND, SCL, SDA et DRDY.


Installation du pilote micropython-rp2040-hmc5883l

Il existe quelques sur github quelques pilotes destinés à l'utilisation d'un module HMC5883L, qui semblent tous à peu près identiques. J'ai choisi micropython-rp2040-hmc5883l par SindormirNet. Il faut copier le fichier hmc5883l.py dans la mémoire du Raspberry Pi Pico.


Connexions

J'ai branché le module HMC5883L au Raspberry Pi Pico de cette façon:

  • Broche VCC du module HMC5883L: sortie 3,3 V du Raspberry Pi Pico
  • Broche GND du module HCM5883L: une des broches GND du Raspberry Pi Pico
  • Broche SCL du module HMC5883L: broche GP1 du Raspberry Pi Pico
  • Broche SDA du module HMC5883L: broche GP0 du Raspberry Pi Pico
  • Broche DRDY du module HMC5883L: pas branché


Script #1 (affichage dans la console)

La bibliothèque hmc5883l.py comporte une méthode "heading" qui calcule l'angle de l'axe x du capteur par rapport au nord...dans l'hypothèse extrêmement optimiste que le capteur ne nécessitera pas de calibration.

Dans les faits, le capteur qui mesure la composante dans la direction x n'aura probablement pas la même sensibilité que celui qui mesure la composante dans la direction y, et un champ magnétique nul ne produira pas nécessairement une mesure nulle.

Le script ci-dessous comporte donc une routine qui sert à calibrer les capteurs: on demande à l'utilisateur de faire tourner le module HMC5883L dans un plan horizontal sur au moins un tour complet. Pendant cette rotation, le script garde en mémoire la valeur maximale et la valeur minimale mesurées par le capteur x et par le capteur y. Les mesures brutes sont ensuite recalculées de façon à atténuer les imperfections des capteurs.

Pour que la direction soit affichée en fonction du nord géographique et non en fonction du nord magnétique, il faut que vous écriviez dans le script la valeur de la déclinaison magnétique là où vous êtes (variable "declinaison", à la ligne 18).

-

-

Boussole autonome

J'ai ensuite ajouté un écran OLED à mon circuit, de façon à obtenir une boussole parfaitement autonome qui ne dépend pas d'un ordinateur pour afficher ses mesures.

Il s'agit d'un écran OLED spi de 128 par 64 pixels.


J'ai branché l'écran OLED au Raspberry Pi Pico de cette façon:

  • Broche GND de l'écran: broche GND du Raspberry Pi Pico
  • Broche VCC de l'écran: sortie 3,3 V du Raspberry Pi Pico
  • Broche DO de l'écran: broche GP6 du Raspberry Pi Pico
  • Broche DI de l'écran: broche GP7 du Raspberry Pi Pico
  • Broche RES de l'écran: broche GP14 du Raspberry Pi Pico
  • Broche DC de l'écran: broche GP15 du Raspberry Pi Pico
  • Broche CS de l'écran: broche GP5 du Raspberry Pi Pico

Script #2 (boussole autonome)

Ce script affiche à l'écran OLED un plan cartésien (qui doit être aligné avec celui qui est imprimé sur le module HMC5883L), et une "aiguille de boussole" qui pointe obstinément vers le nord. Encore une fois, pour qu'elle pointe vers le nord géographique, vous devez modifier la valeur de la variable "declinaison" à la ligne 24, pour qu'elle reflète la valeur de la déclinaison magnétique là où vous êtes.


-

-


À lire également:


Yves Pelletier


samedi 12 août 2023

Lévitation acoustique

J'ai fait l'essai d'un petit appareil permettant de mettre en lévitation, au moyen d'ultrasons, des petits morceaux mousse de polystyrène. On peut en trouver sur les boutiques en ligne pour pas très cher.

Le dispositif est constitué de deux émetteurs d'ultrasons de 40 kHz placés face à face, l'un au-dessus de l'autre. Vous avez peut-être déjà vu dans des cours de physique que lorsque qu'on superpose deux ondes identiques qui se déplacent en sens contraire, on obtient ce qu'on appelle une onde stationnaire: il y a certaines positions, qu'on appelle les noeuds,  pour lesquelles l'amplitude de l'onde est toujours nulle. À d'autres endroits, qu'on appelle les ventres, l'amplitude de l'onde est à son maximum.

Le circuit électronique qui contrôle les deux émetteurs à ultrason est constitué d'un microcontrôleur STC15W et d'un "MOSFET driver" TC4427.

Deux interrupteurs n'ont, d'après la documentation fournie par le vendeur, aucune utilité!

Près du jack réservé à l'alimentation, on peut lire la mention DC 12 V. Il s'agit toutefois d'une valeur maximale, car l'appareil fonctionne correctement avec une tension d'alimentation aussi basse que 5 V. 


Si vous préférez construire vous même votre lévitateur acoustique, vous trouverez facilement sur le web des instructions pour assembler un circuit constitué d'un Arduino, d'un L298N et de deux émetteurs prélevés sur des modules HC SR-04. Mais puisque l'Arduino sert strictement à provoquer l'oscillation de 40 kHz, aussi bien le remplacer par un simple NE555...

Yves Pelletier

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