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)

lundi 6 juin 2016

Mesurer une force avec un ressort et un potentiomètre

Supposons que vous désirez mesurer une force ou peser un objet au moyen d'un système électronique (un Arduino, par exemple).   La méthode classique consiste à utiliser des jauges de déformation, un pont de Wheatstone et un circuit d'amplification.

Et si on procédait autrement?

J'ai tenté de construire mon propre dynamomètre/balance électronique en utilisant deux éléments principaux:  un ressort, et un potentiomètre rectiligne.  Le principe est simple:  le potentiomètre et une des extrémités du ressort sont fixés sur un même support rigide (en l'occurrence un petit morceau de bois). L'autre extrémité du ressort est fixé au curseur du potentiomètre rectiligne.  Lorsqu'on exerce une force sur cette extrémité du ressort, le ressort s'étire, ce qui déplace le curseur du potentiomètre.

(J'ai pris cette idée à la page 26 du livre "Engineer's MiniNotebook - Sensor Projects" par  Forrest Mims, sauf que le modèle présenté utilisait un ressort fixé à l'extrémité d'un levier dont l'axe de rotation était constitué d'un potentiomètre rotatif).


Et ça fonctionne?

Pour vérifier l'efficacité et la précision de mon dispositif, je l'ai utilisé comme une balance, en y suspendant des masses connues

Le curseur de mon potentiomètre peut se déplacer d'une distance maximale de 3 cm.  Lorsque le ressort n'est pas du tout étiré, le curseur occupe la position la plus haute.  Une masse d'environ 500 grammes (ou une force de 5 N) oblige le ressort à s'étirer de presque 3 cm, ce qui déplace le curseur près de sa position la plus basse.  Ces résultats dépendent évidemment de la rigidité du ressort utilisé.

J'ai branché le potentiomètre à une carte Arduino:  une extrémité à la masse (GND), l'autre extrémité à 5 V, et le curseur à l'entrée analogique A5.


Dans un premier temps, j'ai affiché la valeur mesurée sur l'entrée A5 pour différentes masses suspendues échelonnées entre 0 et 500 grammes:








J'avais choisi un potentiomètre dont le curseur glissait très facilement, ce qui m'avait permis d'espérer que la force de frottement allait être négligeable.  Mais les résultats montrent que ce n'est malheureusement pas tout à fait le cas:  d'une part, une masse de 50 g ou 100 g est insuffisante pour déplacer le curseur, qui demeure à la même position que quand aucune masse n'est suspendu.  D'autre part, le curseur ne se stabilise pas toujours à la même position pour une masse donnée.

Par exemple, pour une masse suspendue de 250 grammes, le signal lu par l'entrée A5 de l'Arduino peut parfois être de 217... et parfois de 318!

Pourrait-on améliorer les résultats en lubrifiant le potentiomètre, de façon à atténuer la force de frottement?  Peut-être, je n'ai pas essayé.  Si vous utilisez un ressort plus rigide, de façon à mesurer des masses de quelques kilogrammes, par exemple, la force de frottement devrait avoir un effet négligeable sur vos résultats.

Mon appareil n'est donc pas d'une très grande précision, mais il peut très bien distinguer une masse de 200 grammes d'une masse de 300 grammes, ce qui n'est déjà pas si mal.

Malgré la dispersion des points, le graphique est bel et bien linéaire pour des masses suspendues de 150 grammes et plus (en concordance avec la loi de Hooke).  Grâce à Excel, j'ai pu établir que l'équation de la droite est:

     valeur mesurée par l'Arduino = 2.2829 * masse  - 281,43


Avec un peu d'algèbre, on peut modifier l'équation de façon à calculer la masse en grammes à partir de la valeur mesurée par l'Arduino:

     masse = (valeur mesurée + 281.43)/2.2829

Voici un petit sketch minimaliste qui affiche dans le moniteur série la masse suspendue en grammes (et qui avertit l'utilisateur quand la masse est trop faible pour être mesurée):




Et voici quelques résultats obtenus pour quelques masses suspendues:


Comme je le disais, ce n'est pas une balance de précision, mais ça marche à peu près...

Yves Pelletier   (TwitterFacebook)


dimanche 5 juin 2016

Contrôle d'un ou deux moteurs cc avec L298 et Arduino

Récemment, je me suis procuré sur eBay un contrôleur de moteur constitué d'un L298N et de tous les composants nécessaires à son bon fonctionnement  (radiateur, diodes, résistances, condensateurs, connecteur).

En branchant cette petite carte à un microcontrôleur (qui sera, dans le présent article, une carte Arduino), il est possible de contrôler simultanément deux moteurs en courant continu, ou un moteur pas à pas.

L298N vs L293D

Le L298N n'est pas le seul pilote de moteur disponible.  Dans le passé, nous avons très souvent utilisé le L293D, ainsi que le L6205  Nous avons même créé notre propre pont en H à partir de transistors.

Pour des projets impliquant de petits moteurs de faible puissance, le L293D est souvent privilégié parce qu'il coûte moins cher, qu'il s'insère facilement dans une breadboard et qu'il n'est pas nécessaire de lui ajouter des diodes puisque ces dernières sont déjà intégrées à l'intérieur du circuit intégré.  Par contre, le L293D ne supporte pas des courants supérieurs à 1 A, et il n'est pas vraiment conçu pour qu'on puisse facilement le munir d'un radiateur.

Le L298N peut quant à lui supporter un courant de 2 A,  ce qui permet de contrôler des moteurs plus puissants. Si vous achetez un L298N (circuit intégré seulement), ça vous coûte plus cher qu'un L293D, ses broches sont disposées d'une façon qui s'insèrent difficilement dans une breadboard, et vous devez lui ajouter des diodes, des condensateurs, un radiateur, etc.

Tous ces inconvénients disparaissent si vous vous procurez un module déjà monté...même le prix! Ce truc m'a coûté environ 2 dollars américains, soit significativement moins que ce que coûte habituellement un circuit intégré L298N seul, sans les autres composants soudés sur la carte...

Serait-ce possible que le circuit intégré présent sur cette carte, qui porte fièrement le logo de ST Microelectronics, soit en fait une contrefaçon???  J'ai beau chercher, je ne trouve malheureusement pas d'autres explications...

Connexions

Ce ne sont pas les connecteurs qui manquent...

Les 4 sorties "OUT1", "OUT2", "OUT3" et "OUT4" servent à brancher les moteurs (un moteur branché à OUT1 et OUT2, et un deuxième moteur, s'il y a lieu, branché à OUT3 et OUT4).

Les moteurs et la cartes sont alimentés grâce aux connecteurs GND et +12 V.

Il n'est pas nécessaire que la tension de l'entrée "+12 V" soit de 12 V:  vous utilisez ce qui est approprié pour vos moteurs.   Selon les moteurs que vous utilisez, il est possible qu'une tension aussi faible que 6 V soit suffisante, et qu'une tension de 12 V soit trop élevée.

En fait, vous pouvez soumettre l'entrée +12 V à une tension allant jusqu'à 35 V si vous le désirez (et si vos moteurs le supportent!) mais attention:  si vous soumettez l'entrée +12V à une tension qui dépasse 12 V, vous devez d'abord enlever le jumper 12 V (identifié sur la photographie) afin d'éviter de griller le régulateur de tension qui alimente la sortie 5 V.

Contre toute attente, le connecteur "+5V" n'est pas une entrée, mais une sortie qui fournit 5 V et qui pourrait vous permettre, par exemple, d'alimenter un microcontrôleur.  Cette sortie 5 V est disponible à la condition que le "jumper 12 V" soit en place (il faut donc que la tension au connecteur +12V n'excède pas 12 V).

Notre Arduino sera branché aux entrées ENA, IN1, IN2, IN3, IN4 et ENB.

Si IN1 est à 5 V pendant que IN2 est à 0 V, le moteur branché aux sorties OUT1 et OUT2 tourne dans un sens.  Si IN1 est à 0 V pendant que IN2 est à 5 V, le moteur tourne dans l'autre sens.

ENA est l'entrée "enable":  le moteur tourne à la condition que cette pin se trouve à un niveau logique haut.  Si vous laissez en place le jumper qui se trouve sur cette pin, elle demeurera toujours active et le moteur tournera à sa vitesse maximale.  Pour contrôler la vitesse de rotation du moteur, vous devez retirer le jumper et brancher la pin ENA à une sortie PWM de l'Arduino.

Vous l'aurez deviné, c'est le même principe pour les pins ENB, IN3 et IN4, sauf que ces entrées permettent de contrôler le moteur relié aux sorties OUT3 et OUT4.

Circuit

Voici donc un circuit qui répond à toutes ces conditions.  Ce n'est pas indiqué sur le schéma, mais l'Arduino est déjà alimenté par le câble USB que le relie à l'ordinateur, ce qui explique pourquoi je n'ai pas relié la sortie +12V du contrôleur L298 à la pin 5V de l'Arduino.


Sketch

Et voici un sketch de démonstration qui fait tourner les deux moteurs à différentes vitesses , dans un sens comme dans l'autre.  Il ne vous reste plus qu'à modifier ce sketch pour répondre à vos besoins. Si vous disposez déjà d'un sketch conçu pour le L293, vous pouvez l'utiliser sans problème avec un L298 sans faire la moindre modification.



À lire également

Concernant le contrôle de moteurs à courant continu avec un Arduino: utilisation du L293D, utilisation du L9110Sutilisation du L6205, utilisation d'un pont en H de fabrication maison, et utilisation d'un relais DPDT.

De plus, le L298N dont on parle dans le présent billet peut également être utilisé pour contrôler un moteur pas à pas.

De façon plus générale, vous trouverez sur cette page tous les articles du blog concernant l'utilisation de moteurs de toutes sortes (incluant les servomoteurs et les moteurs pas à pas).

Yves Pelletier   (TwitterFacebook)