jeudi 23 juin 2016

Fabrication d'un anémomètre (Arduino)

Un anémomètre est un appareil qui permet de mesurer la vitesse du vent.  C'est très facile de construire un anémomètre à coupelle, et de mesurer sa vitesse de rotation au moyen d'une carte Arduino et d'un capteur approprié.

L'anémomètre

J'ai construit un anémomètre à coupelles rudimentaire constitué de 3 petits bols de plastique (de forme vaguement hémisphérique) fixés à l'extrémité de 3 légères tiges de bois. L'extrémité opposée des tiges de bois est fixée à un axe de rotation:  quelque chose qui tourne facilement (dans mon cas:  un ventilateur d'ordinateur n'ayant plus de pales).

Visez la légèreté:  celui que j'ai fabriqué ne réagit pas du tout si la brise est trop légère.


Le capteur: un interrupteur reed

L'intérêt de notre montage d'un point de vue électronique, c'est qu'il comportera un capteur nous permettant de déterminer automatiquement la vitesse de rotation.  J'aurais pu compter les tours au moyen d'un système optique (un duo LED infrarouge/phototransistor, par exemple).  J'ai toutefois opté pour un capteur magnétique (qui demeure immobile), alors qu'un aimant est fixé à une des tiges de l'anémomètre.

Si j'avais eu besoin de mesurer avec précision le champ magnétique causé par l'aimant, j'aurais utilisé comme capteur un magnétomètre numérique (comme le HMC5883L) ou un capteur analogique à effet Hall (comme l'Allegro A1302).  Mais pour compter les tours effectués par l'anémomètre, je n'ai besoin que de détecter la présence (ou l'absence) d'un champ magnétique:  c'est pourquoi j'ai choisi d'utiliser un interrupteur reed.



L'interrupteur reed est constitué de deux lames conductrices qui entrent en contact uniquement lorsqu'elle se trouvent à l'intérieur d'un champ magnétique suffisamment intense (donc à proximité d'un aimant).

Pas d'aimant à proximité:  l'interrupteur reed ne laisse pas circuler le courant
Aimant à proximité:  l'interrupteur reed laisse circuler le courant

Ces deux contacts se trouvent à l'intérieur d'un petit tube en verre TRÈS FRAGILE:  je m'étais procuré un lot de 5 interrupteurs reed, et j'en ai cassé 3 lors de la réalisation de ce projet!

Le circuit

On branche l'interrupteur reed à l'Arduino de la même façon qu'on brancherait un bouton poussoir. Lorsque l'aimant (qui est fixé à une des tiges de l'anémomètre) passe au-dessus de l'interrupteur reed, la pin 8 de l'Arduino sera soumise à un niveau logique HAUT (5 V), alors qu'elle sera soumise à un niveau logique BAS (0 V) le reste du temps.

Une LED branchée à la pin 13 de l'Arduino (ou simplement la LED qui se trouve déjà sur la carte) s'allumera à chaque passage de l'aimant, ce qui nous aidera à vérifier que tout fonctionne correctement.


Calcul de la vitesse

Le temps écoulé entre deux passages successifs de l'aimant représente la période de révolution de l'anémomètre.

On peu ensuite calculer la vitesse des coupelles; puisqu'elles sont en mouvement circulaire, elle parcourent une distance égale à la circonférence pendant une durée correspondant à la période:

vitesse des coupoles = (2 * pi * rayon)/période

...où le rayon est mesuré de l'axe de rotation jusqu'au centre des coupelles (c'était 15 cm dans mon cas).


S'agit-il de la vitesse du vent?  Oui, dans l'hypothèse où les coupelles se déplacent aussi vite que le vent,  mais ce n'est malheureusement pas le cas.

Pour obtenir la véritable vitesse du vent, il faut ensuite multiplier le résultat par une fonction d'étalonnage qui dépend de la forme et des dimensions de l'anémomètre et de sa vitesse de rotation! Pour trouver cette fonction, il faudrait donc mesurer le vent au même endroit et au même moment au moyen d'un anémomètre commercial correctement calibré, et produire une courbe de calibration.

Sinon, tout ce que nous mesurons représente une limite inférieure: nous savons que le vent va au moins aussi vite que les coupelles, dont nous connaissons la vitesse.

Un sketch

Voici un sketch qui affiche dans le moniteur série la période de rotation et la vitesse des coupoles.




Pour une utilisation sur une longue période, il sera utile d'emmagasiner nos données, par exemple sur une carte SD, ou grâce à un service en ligne.

Yves Pelletier   (TwitterFacebook)

mardi 14 juin 2016

Récepteur radio FM RDA5807 et Arduino

Aujourd'hui, nous allons "fabriquer" un récepteur radio FM.  Pourquoi j'écris "fabriquer" avec des guillemets?  Parce que, plutôt que construire notre circuit à partir de composants individuels (transistors, condensateurs, etc), nous allons utiliser un module RDA5807 spécialement conçu à cette fin:  le défi consiste donc à envoyer des instructions à ce module au moyen d'un microcontrôleur.



Breakout RDA5807

Le circuit intégré RDA5807 constitue à lui seul un récepteur radio presque complet:  il s'agit de l'alimenter, de lui envoyer des instructions par le protocole i2C (pour sélectionner la fréquence de réception, changer le volume, booster les basses,etc) et d'y brancher un casque d'écoute et une antenne, et voilà:  votre récepteur FM est fonctionnel.

Il s'agit d'un circuit intégré prenant la forme d'un petit carré dont les côtés mesurent environ 3 mm: pas question de souder ça moi-même!  En échange d'une poignée de petite monnaie, je me suis procuré sur eBay un breakout comportant déjà le circuit intégré ainsi qu'un quartz de 33 MHz. Attention:  ce breakout (portant la mention "RRD-102 ver 2.01"), également de forme carrée, ne mesure que 1 cm de côté. Ses 10 connecteurs sont trop rapprochés pour pouvoir être directement utilisés sur une breadboard, et vous devrez donc faire preuve d'une certaine dextérité pour effectuer les soudures nécessaires (en ce qui me concerne, ce fut l'étape la plus compliquée de tout le projet).

Connexions

Le breakout est tellement petit qu'il ne comporte même pas l'espace nécessaire à l'identification de ses connecteurs.  Un peu de recherche nous permet d'obtenir les informations suivantes:

  • SDA (Serial Data) s'occupe de l'échange de données avec le microcontrôleur, par le protocole i2c:  nous la branchons à la pin A4 de l'Arduino Uno (si vous utilisez un autre modèle d'Arduino, comme le Mega ou le Leonardo, vérifiez quel est le numéro de la pin pour la communication i2c).
  • SCK (Serial Clock) assure la bonne synchronisation pendant la communication i2c:  nous la branchons à la pin A5 de l'Arduino Uno (encore une fois, ça peut être une autre pin si votre Arduino n'est pas un Uno).
  • NC (Not connected):  Apparemment, les connecteurs 3, 4 et 9 ne servent à rien!
  • Vcc:  Pour alimenter notre module, ce connecteur doit être branché à la sortie 3,3 V de l'Arduino.
  • GND est branché au GND de l'Arduino.
  • LOUT est la sortie audio du côté gauche.  Vous pouvez y brancher un casque d'écoute de 32 Ω sans autre amplification.
  • ROUT est la sortie audio du côté droit.
  • ANT sert à brancher une antenne.  Je n'y a rien branché, et la réception était excellente, malgré tout.
Comme vous pouvez le constater sur le schéma, j'ai ajouté, entre les sorties audio et le casque d'écoute, un condensateur de découplage et une résistance.  Le condensateur permet de bloquer toute composante continue superposée au signal audio, alors que la résistance évite qu'un courant trop fort ne circule.  J'ai utilisé des résistances de 100 Ω et des condensateurs de 4,7 µF.  Ceci dit, mon circuit fonctionnait tout aussi bien sans la présence des résistances et des condensateurs.


Bibliothèque Radio

Matthias Hertel a conçu une bibliothèque qui facilite l'utilisation des principaux modules de réception FM:  en plus du RDA5807, la bibliothèque supporte également le TEA5767, le SI4703 et le SI4705. Télécharger la bibliothèque.

Une fois la bibliothèque installée, on peu faire un test rapide de notre module radio (et de nos délicates soudures!) en utilisant l'exemple "Test RDA5807M" fourni avec la bibliothèque.


Avant de télécharger le sketch dans votre carte Arduino, prenez soin de remplacer la fréquence de 8930 (89,30 MHz) par une fréquence correspondant à une station de radio facile à capter là où vous êtes.


Le sketch est très simple, mais il permet de constater comment sélectionner la fréquence de réception (setBandFrequency), régler le volume (setVolume), mettre en sourdine (setMute), etc.

Dans mon cas, ce fut la réception parfaite, dès le premier essai.

D'autres exemples fournis avec la bibliothèque permettent de fabriquer des récepteurs plus sophistiqués, avec affichage LCD, etc.


Yves Pelletier   (TwitterFacebook)


samedi 11 juin 2016

Mesurer la pression atmosphérique avec BMP180 et Arduino (ou ESP8266, ESP32, STM32...)

Cet article a été mis à jour le 16 janvier 2021 (ajout des instructions pour les cartes ESP8266, ESP32 et STM32).

Dans cet article, je vais vous expliquer comment j'ai utilisé un capteur BMP180 pour mesurer la pression atmosphérique.  Pour tester le capteur, je l'ai placé à l'intérieur d'un récipient hermétique mis sous pression grâce à une pompe à vélo.

Le BMP180

Le BMP180 est un circuit intégré mis au point par Bosch Sensortec conçu pour mesurer la pression atmosphérique avec précision.  Typiquement, il est utilisé pour des observations météorologiques ou pour la détermination de l'altitude à partir de la pression.

Le circuit intégré est minuscule; pour nous faciliter la tâche, c'est important de nous procurer un breakout tout fait, qui pourra facilement être inséré dans une breadboard, ou branché à une carte Arduino. Le module que j'ai utilisé porte le numéro GY-68.

Connexions du module GY-68 à un Arduino Uno

Le BMP180 utilise le protocole i2c, nous ne sommes donc pas surpris de constater qu'il comporte 4 connecteurs:
  • VIN doit être branché à la sortie 5 V de l'Arduino*
  • GND doit être branché à une des broches GND de l'Arduino
  • SCL doit être branché à l'entrée A5 de l'Arduino Uno**
  • SDA doit être branché à l'entrée A4 de l'Arduino Uno**
* Le module GY-68 comporte un régulateur de tension 662K permettant de l'alimenter à 5 V. Ce n'est pas le cas de tous les modules BMP180, toutefois; certains d'entre eux (comme celui conçu par Sparkfun)), doivent être alimentés à 3,3 V pour ne pas être endommagés.

** Ces broches sont différentes pour certains modèles d'Arduino, comme par exemple Mega et Leonardo.


Connexions du module GY-68 à un ESP8266
  • VIN branché à 3,3 V  de l'ESP8266
  • GND branché à une des broches GND de l'ESP8266
  • SCL branché à la broche GPIO 5 de l'ESP8266
  • SDA branché à la broche GPIO 4 de l'ESP8266


Connexions du module GY-68 à un ESP32
  • VIN branché à 3,3 V  de l'ESP32
  • GND branché à une des broches GND de l'ESP32
  • SCL branché à la broche D22 de l'ESP32
  • SDA branché à la broche D21 de l'ESP32


Connexions du module GY-68 à un STM32F103C8T6 "Blue Pill"

  • VIN branché à 3,3 V de la Blue Pill
  • GND branché à une des broches GND de la Blue Pill
  • SCL branché à la broche B6 de la Blue Pill
  • SDA branché à la broche B7 de la Blue Pill


Connexions du module GY-68 à un STM32 Nucleo (F030R8)

  • VIN branché à 3,3 V de du Nucleo
  • GND branché à une des broches GND du Nucleo
  • SCL branché à la broche SCL/D15 du Nucleo
  • SDA branché à la broche SDA/D14 du Nucleo



Bibliothèque Sparkfun

Plutôt qu'étudier la fiche technique du BMP180 afin de tout programmer moi-même, j'ai installé la bibliothèque conçue par Sparkfun.

Après avoir procédé à l'installation de cette bibliothèque, vous  pouvez jeter un coup d'oeil à l'exemple "SFE_BMP180_example" qui montre comment mesurer la température et la pression, en plus de calculer la pression au niveau de la mer en utilisant l'altitude.


Dispositif pour tester le capteur

Pour vérifier que le capteur fonctionnait adéquatement, j'ai construit un petit récipient dans lequel il était possible d'augmenter la pression grâce à une pompe conçue pour gonfler les ballons.


Le capteur BMP180 se trouve à l'intérieur du récipient, alors que l'Arduino est à l'extérieur:  les fils qui relient le BMP180 à l'Arduino passent par un petit trou, calfeutré avec de l'epoxy.


Voici le dispositif complet.  J'ai ajouté une brique par-dessus le récipient pour éviter que le couvercle s'ouvre trop tôt sous l'effet de la pression (un couvercle vissable aurait donné de meilleurs résultats).


Sketch

L'exemple "SFE_BMP180_example" fourni avec la bibliothèque affiche un certain nombre d'informations inutiles, et le délai de 5 secondes entre deux mesures consécutives ne convenait pas à mes besoins.  Je l'ai donc modifié pour qu'il n'affiche rien d'autre que la pression en hectopascals, en prenant deux mesures à chaque seconde.

D'après ce que j'ai compris, il est nécessaire de prendre une mesure de température avant de prendre la mesure de pression, c'est pourquoi j'ai laissé en place la fonction getTemperature même si je n'affiche pas la valeur mesurée.


Résultats

Voici ce que ça donne.  Au moment de la mesure, la pression atmosphérique était d'environ 1002 hPa, mais elle a grimpé jusqu'à 1059 hPa pendant que je pompais de l'air à l'intérieur du récipient.


À lire également



Yves Pelletier   (TwitterFacebook)