lundi 28 décembre 2020

Bilan de l'année 2020

Alors que cette étrange année 2020 tire à sa fin,  je vous présente ce bilan des publications des 12 derniers mois.

Dès le début de l'année, j'ai commencé à expérimenter avec l'ESP32-CAM: mes premières observations constituent d'ailleurs l'article le plus lu cette année (près de 6000 visionnements). Plusieurs autres projets ont suivi: un web server minimalisteenregistrement de photos sur la carte microSDmouvement panoramique, contrôle des LEDs de la carte, photographie time-lapse, enregistrement des photos sur Google Drivecapteur infrarouge passif (PIR), et gestion à distance de la carte SD .

L'ESP32 (sans caméra) et l'ESP8266 ont également fait l'objet de quelques articles: envoi de données vers Google Sheets ou vers Google Docs, matrice de LEDs contrôlée par une page web et balance connectée.

L'Arduino Uno demeure tout de même ma carte de confiance quand vient le temps d'expérimenter un nouveau capteur, comme le module GPS NEO 6MV2, le capteur de champ magnétique à effet Hall KY-024, le capteur de couleurs TCS3200, le capteur DHT22 (humidité et température), un thermocouple avec MAX6675, une balance à base de HX711, le capteur de son KY-038 et un microphone amplifié à base de MAX4466

Toujours avec l'Arduino Uno, j'ai piloté une matrice de LEDs RGB WS2812B , joué des fichiers MIDI , conçu un jeu MIDI pour s'entraîner à lire les notes sur une portée et enregistré des données dans un EEPROM I2C et dans l'EEPROM interne de l'Arduino.

J'ai utilisé la carte STM32 "Blue Pill" pour quelques projets spécifiques: enregistreur GPS , jeu de Pong, affichage sur un écran ST7735 les fichiers d'une carte SD et  mesure d'une distance avec le télémètre laser VL53L1X.


J'ai aussi eu l'occasion de m'initier à la carte micro:bit, mais ce ne fut pas vraiment le coup de foudre, même après avoir trouvé une façon bien personnelle d'utiliser tous ses connecteurs

Je m'en suis quand même servi pour mesurer une distance avec des ultrasons, pour mesurer la pression atmosphérique et pour contrôler un moteur pas à pas.


J'ai aussi fait quelques projets avec mon Raspberry Pi: balance à base de Raspberry Pimesure de la température et l'humidité relative avec un DHT22mesure de la pression atmosphérique avec le BMP180 , mesure d'une distance avec télémètre laser VL53L1X et détermination de la couleur grâce au capteur TCS3200.

J'ai aussi fait un robot contrôlé par Raspberry Pi, lui faisant tour à tour suivre une ligne et éviter des obstacles. Et puisque les robots suiveurs de ligne sont vraiment amusants, j'en ai fait deux autres: l'un à base d'Arduino, et l'autre à base de LM393.

Joyeuse année 2021!

Yves Pelletier (TwitterFacebook

mardi 22 décembre 2020

Capteur de couleurs TCS3200 (GY-31) et Raspberry Pi

Dans cet article, nous allons piloter un module GY-31, qui comporte un capteur de couleurs TCS3200,  au moyen d'un Raspberry Pi programmé en Python.

Comme je l'avais mentionné lorsque j'en ai fait l'essai avec un Arduino, le capteur de couleur TCS3200 est constitué d'une matrice de minuscules photodiodes. Certaines de ces photodiodes sont munies d'un filtre qui laisse passer la lumière rouge, alors que d'autres ne captent que la lumière bleue ou la lumière verte. Ces photodiodes peuvent être activées tour à tour de façon à connaître la quantité de rouge, de bleu et de vert qui se trouve dans la lumière qui atteint le capteur.

En plus du capteur TCS3200, le module GY-31 comporte 4 LEDs blanches qui assurent un éclairage adéquat de la cible dont on désire déterminer la couleur.

Les connecteurs du module GY-31 sont les suivants:

  • VCC: Alimentation située entre 2,7 et 5,5 V
  • GND: La masse
  • S0 et S1: Sélection de l'échelle de fréquence à la sortie
  • S2 et S3: Sélection des photodiodes actives
  • OUT: signal de sortie
  • LED: contrôle des 4 LEDs

L'état logique des entrées S2 et S3 détermine les photodiodes actives:

  • Si S2 = 0 et S3 = 0 : photodiodes avec filtre rouge
  • Si S2 = 0 et S3 = 1:  photodiodes avec filtre bleu
  • Si S2 = 1 et S3 = 1: photodiodes avec filtre vert
  • Si S2 = 1 et S3 = 0: photodiodes sans filtre

Le signal de sortie est un peu inhabituel: il s'agit d'une onde carrée dont la fréquence dépend de l'intensité lumineuse (plus l'intensité lumineuse captée es grande, plus le signal de sortie oscille rapidement)­.  Pour faciliter la mesure de cette fréquence, les entrées S0 et S1 permettent, si on le désire, de la diviser par 5 ou par 50:

  • Si S0 =1 et S1 = 1: 100% de la fréquence (environ 600 kHz)
  • Si S0 = 1 et S1 = 0: 20% de la fréquence (environ 120 kHz)
  • Si S0 = 0 et S1 = 1: 2% de la fréquence (environ 12 kHz)
  • Si S0 = 0 et S1 = 0: capteur inactif

Quant aux LEDs, elles sont allumées par défaut. Si vous désirez qu'elles demeurent éteintes, vous reliez l'entrée LED du module GY-31 à la masse, pour que sa tension soit nulle.

Connexions du module GY-31 au Rasperry Pi

Voici comment j'ai branché le module GY-31 à mon Raspberry Pi:

  • Broche GND du module GY-31: Broche GND (#6) du Raspberry Pi
  • Broche VCC du module GY-31: Sortie 3,3 V (#1) du Raspberry Pi
  • Broche S0 du module GY-31: Broche GPIO 27 (#13) du Raspberry Pi
  • Broche S1 du module GY-31: Broche GPIO 22 (#15) du Raspberry Pi
  • Broche S2 du module GY-31: Broche GPIO 23 (#16) du Raspberry Pi
  • Broche S3 du module GY-31: Broche GPIO 24 (#18) du Raspberry Pi
  • Broche OUT du module GY-31: broche GPIO 25 (#22) du Raspberry Pi
  • Broche LED du module GY-31: pas branchée
Script en Python:

Le script ci-dessous affiche tour à tour la valeur mesurée pour le rouge, le vert, le bleu et la totalité de la lumière captée.

Aux lignes 31 et 32, je règle le module pour que la fréquence du signal de sortie ne soit que 2% de la valeur maximale possible, en suivant l'hypothèse qu'un signal lent sera plus facile à mesurer avec une bonne précision. Les résultats semblent quand même très bons si vous réglez le capteur à 100% de la fréquence. 

Aux lignes 37 et 38, j'utilise la fonction GPIO.wait_for_edge afin de chronométrer le temps nécessaire pour que le signal de sortie du module effectue 10 oscillations. C'est ce temps qui est affichée comme résultat: une petite valeur correspond à une forte intensité lumineuse.

- -

Les résultats obtenus dépendent de la lumière ambiante et de la distance entre le capteur et la surface dont on désire connaître la couleur. Pour minimiser les perturbations, j'ai placé le capteur au fond d'un récipient sombre qui bloque la lumière ambiante et maintient une distance constante entre le capteur et la surface colorée.


J'ai effectué des tests avec des cartons de couleur vive. En utilisant les mesures des différents paramètres pour chaque carton, on peut faire en sorte que le programme reconnaît le carton rouge, le carton vert, etc. (j'ai laissé un exemple aux lignes 66 et 67 du script).




Sources: je me suis inspiré de ce projet publié sur Electronics Hub.


À lire également:

Yves Pelletier (TwitterFacebook

vendredi 18 décembre 2020

Jouer des fichiers MIDI avec Arduino

Ce projet consiste à utiliser une carte Arduino Uno pour lire des fichier MIDI préalablement enregistrés sur une carte SD afin que le contenu de ces fichiers soit joué en temps réel par un clavier MIDI.

Le circuit

La carte Arduino UNO est branchée, d'une part, à un lecteur de cartes SD et, d'autre part, à un clavier MIDI.

J'ai utilisé un module de carte SD bas de gamme qui communique en SPI avec un niveau logique de 3,3 V, ce qui m'a obligé à utiliser un circuit intégré 4050 pour abaisser le niveau logique des broches SCK (13), MOSI (11) et CS (10) de l'Arduino Uno.


  • Broche GND du module carte SD: Broche GND de l'Arduino Uno
  • Broche +3.3 du module carte SD: Broche 3.3 V de l'Arduino Uno
  • Broche CS du module carte SD: broche 2 du 4050
  • Broche MOSI du module carte SD: broche 4 du 4050
  • Broche SCK du module carte SD: broche 6 du 4050
  • Broche MISO du module carte SD: broche 12 de l'Arduino Uno

  • Broche 1 du 4050 : sortie 3,3 V de l'Arduino Uno
  • Broche 3 du 4050: broche 10 de l'Arduino Uno
  • Broche 5 du 4050: broche 11 de l'Arduino Uno
  • Broche 7 du 4050: broche 13 de l'Arduino Uno
  • Broches 8, 9, 11 et 14 du 4050: broche GND de l'Arduino Uno

Pour la connexion avec le clavier MIDI, j'ai utilisé l'interface MIDI que j'avais fabriquée il y a quelques années, mais on peut se contenter d'un circuit assez minimaliste constitué de deux résistances de 220 Ω puisqu'on se contente d'envoyer des données vers le clavier, sans chercher à capter les données qui proviennent du clavier. Les données émise sur la broche TX de l'Arduino Uno seront ainsi acheminées à l'entrée MIDI IN du clavier.

Installation des bibliothèques

J'ai d'abord installé la bibliothèque MD_MIDIFile de Majic Designs (il faut l'installer à partir du fichier zip car elle n'est pas disponible dans le gestionnaire de bibliothèques).

Il faut également installer la bibliothèque SDFat de Bill Greiman (je suppose que la bibliothèque SD régulière est trop gourmande en mémoire pour être utilisée en même temps que la bibliothèque MIDIFile). Attention, toutefois: au moment où j'ai fait mes tests, la version la plus récente de SDFat était incompatible avec MD_MIDIFile (erreur de compilation causée par la méthode chdir): j'ai dû installer une version plus ancienne de SDFat (1.1.4), ce qui est très simple avec le gestionnaire de bibliothèque de l'IDE Arduino.


L'exemple "MD_MIDIFile_Play"

Parmi les exemples fournis avec la bibliothèque MD_MIDIFile, celui qui s'intitule "MD_MIDIFile_Play" s'avère le plus intéressant pour un premier essai. Avant de l'utiliser, toutefois, il faut copier sur la carte SD les 24 fichiers MIDI qui sont fournis avec la bibliothèque (chemin d'accès: libraries/MD_MIDIFile/examples/SD_Card_Files).


Lors de l'exécution du sketch, les fichiers MIDI sont joués un à la suite de l'autre. J'ai aussi fait quelques essais avec d'autres fichiers MIDI issus de ma collection personnelle: certains d'entre eux ont été correctement exécutés, alors que d'autres sont restés désespérément muets. 

D'autre part, j'ai remarqué que ce message est affiché lors de la compilation du programme: "La mémoire disponible est faible. Des problèmes de stabilité pourraient survenir". De toute évidence, si on désire développer quelque chose d'un peu plus sophistiqué, on aura intérêt à utiliser autre chose qu'un Arduino Uno.

À lire également

Beaucoup d'autres projets MIDI avec l'Arduino:

Yves Pelletier (TwitterFacebook

vendredi 4 décembre 2020

Microphone amplifié MAX4466 et Arduino

Il y a quelques mois, en faisant l'essai du capteur de son KY-038,  j'avais été déçu par son manque de sensibilité. C'est pour cette raison que je me suis procuré un microphone amplifié à base de MAX4466, qui s'est révélé beaucoup plus performant.



Il s'agit visiblement d'un clone du module mis au point par la compagnie Adafruit:  le fabriquant a même fidèlement reproduit les informations imprimées sous le microphone!


Le module est à peine plus grand que le microphone: tous les autres composants du circuit se trouvent au verso. 


Le MAX4466 est un circuit intégré spécialement conçu pour la préamplification d'un microphone électret. Un minuscule potentiomètre permet de modifier son gain.

Connexions à l'Arduino Uno

Le module ne comporte que 3 connecteurs:
  • OUT: sortie dont la tension dépend de l'intensité sonore capté par le micro. On la branche à une entrée analogique du microcontrôleur (j'ai utilisé A0).
  • GND: à brancher à une des broches GND de l'Arduino.
  • VCC: l'alimentation, qui peut prendre n'importe quelle valeur entre 2,4 V et 5,5 V. Je l'ai reliée à la sortie 3,3 V (je vous explique pourquoi ci-dessous).




Alimentation 5 V vs alimentation 3,3 V

Lorsque le micro ne capte aucun son, la tension de sortie du module est égale à la moitié de la tension d'alimentation: 2,5 V si le micro est alimenté avec 5 V, et 1,15 V si le micro est alimenté avec 3,3 V.

Cependant, la tension de 3,3 V fournie par carte Arduino est beaucoup plus stable que celle de 5 V (la sortie 3,3 V comporte un régulateur de tension, ce qui n'est pas le cas de la sortie 5 V).

Pour vérifier à quel point les fluctuations de l'alimentation 5 V affectent le comportement du micro, j'ai fait un petit test au moyen de ce sketch:

Voici un échantillon des résultats obtenus pendant que le micro était alimenté par la sortie 3,3 V de l'Arduino Uno, pendant qu'aucun son n'était capté. On peut constater que la mesure varie entre 335 et 343, donc l'écart entre les deux extrêmes est de 8.


Voici maintenant un échantillon des résultats obtenus pendant que le micro était alimenté par la sortie 5 V de l'Arduino Uno, toujours en absence de son. Cette fois, les résultats varient entre 471 et 601, soit un écart de 130!


Conclusion: il est préférable d'utiliser la sortie 3,3 V si on ne veut pas que notre micro détecte des sons qui n'existent pas.


Exemple de sketch

Voici un exemple de sketch pour un détecteur de son: la LED intégrée à la carte Arduino s'allume brièvement lorsqu'un son est détecté. Ici, la sensibilité a été réglée à un niveau très bas (la LED s'allume aussitôt que l'écart entre la valeur mesurée et la valeur de référence est de 25). Il s'agit d'augmenter cette valeur si la LED s'allume même en absence de son.

-
-

Yves Pelletier (TwitterFacebook

Dans un blog près de chez vous (15)


Encore une fois, quelques suggestions de lecture...





dimanche 15 novembre 2020

Mesurer la pression atmosphérique avec le BMP180 et un Rasbperry Pi

Le capteur BMP180 est conçu pour mesurer la pression atmosphérique ainsi que la température. Son application la plus évidente l'observation des conditions météorologiques, mais on peut également l'utiliser pour mesurer la pression d'un gaz dans un récipient fermé, ou pour mesurer l'altitude. Dans le passé, j'ai moi-même eu l'occasion de l'utiliser pour mesurer la pression dans un liquide, et pour détecter le souffle du flûtiste dans une flûte à bec MIDI.

Dans cet article, je vous présente quelques informations qui vous permettront d'utiliser un capteur BMP180 avec un Raspberry Pi programmé en Python.

Branchements du capteur

Le module BMP180 comporte 4 connecteurs: deux pour l'alimentation et deux pour la communication des données par le protocole I2C.


  • La broche VIN du module BMP180 est connectée à une sortie 3,3 V du Raspberry Pi (broche 1)
  • La broche GND du module BMP180 est connectée à une broche GND du Raspberry Pi (broche 6)
  • La broche SCL du module BMP180 est connectée à la broche SCL du Raspberry Pi (broche 5)
  • La broche SDA du module BMP180 est connectée à la broche SDA du Raspberry Pi (broche 3)

Activation de l'I2C

Par défaut, la communication I2C est désactivée sur le Raspberry Pi. Si ce n'est pas déjà fait, vous devez l'activer en allant dans Préférences - Configuration du Raspberry Pi.


Cliquez sur l'onglet "Interfaces" et assurez-vous que I2C est activé. Il est possible qu'un redémarrage soit nécessaire.



Pour vérifier que tout est fonctionnel, vous pouvez écrire "sudo i2cdetect -y 1" dans le terminal. Le module BMP180 devrait être trouvé à l'adresse 77.

Installation de la bibliothèque d'Adafruit

Pour faciliter la programmation, j'ai installé la bibliothèque Pyhton BMP d'Adafruit, en suivant les instructions fournies sur cette page J'ai donc tapé les 4 lignes suivantes dans le terminal:

   sudo apt-get install git build-essential python-dev python-smbus

   git clone https://github.com/adafruit/Adafruit_Python_BMP.git

   cd Adafruit_Python_BMP

   sudo python3 setup.py install


Script en Python

Le script ci-dessous est déjà très court, mais la plus grande partie consiste à créer avec Tkinter la fenêtre qui affichera les mesures prises par le capteur. Seules les lignes 14, 17, 43 et 44 concernent le capteur BMP180:

À la ligne 14:  (import Adafruit_BMP.BMP085 as BMP085), nous importons les méthodes de la bibliothèque BMP085 d'Adafruit.

À la ligne 17: (capteur = BMP085.BMP085()): création d'un objet de type BMP085.

À la ligne 43: (capteur.read_temperature()): mesure de la température en degrés Celsius.

À la ligne 44: (capteur.read_pressure()): mesure de la pression en Pascal.

Lorsqu'on exécute ce script, une fenêtre s'affiche et indique la température ainsi que la pression atmosphérique.



--

À lire également

Yves Pelletier (TwitterFacebook

samedi 14 novembre 2020

Balance connectée à base d'ESP32/ESP8266

Dans ce troisième projet impliquant une balance constituée d'une cellule de charge et d'un module HX711, j'ai fabriqué une balance connectée qui affiche la masse mesurée dans une page web. Le microcontrôleur, programmé au moyen de l'IDE Arduino peut être un ESP32 ou un ESP8266. La même balance a précédemment été utilisée avec un Arduino Uno ainsi qu'avec un Raspberry Pi.


Assemblage de la balance

La cellule de charge se trouve entre deux plateaux qui sont vissés à deux côtés opposés de la cellule: le profil de l'assemblage rappelle la lettre "S".  



Il faut aussi tenir compte de la flèche qui indique le sens de la déflexion: elle doit pointer vers le bas quand vous utilisez la balance.



Connexion de la cellule de charge au module HX711


D'un côté du module HX711, on trouve les connecteurs E+, E-, A- et A+ qui servent au branchement de la cellule de charge (nous n'utilisons pas B- et B+).

Le fil rouge se branche à E+, le fil noir à E-, le fil blanc à A- et le fil vert à A+. (Ces deux derniers fils peuvent être inversés sur certaines cellules de charge).



Connexions du module HX711 à l'ESP32 ou à l'ESP8266

De l'autre côté du module HX711, on retrouve les connecteurs qui permettent de brancher le module à un microcontrleur.:
  • GND du HX711: GND de l'ESP32 ou de l'ESP8266
  • DT du HX711: broche GPIO5 de l'ESP32 ou de l'ESP8266 (données numériques)
  • SCK du HX711: broche GPIO4 de l'ESP32 ou de l'ESP8266 (signal d'horloge)
  • VCC du HX711: sortie 3,3 V de l'ESP32 ou de l'ESP8266
Puisque les broches DT et SCK sont définies à l'intérieur de notre programme, vous pouvez les brancher différemment si vous désirez.




Installation de la bibliothèque HX711

Il existe plusieurs bibliothèques conçues pour l'utilisation du HX711; j'ai choisi la bibliothèque HX711 de Bogdan Necula.


Exemple de sketch

Voici un sketch qui affiche la masse mesurée dans une page web.


Au démarrage, le moniteur série affiche, entre autres informations, l'adresse de la page web (ici, c'est 192.168.0.116):

Il s'agit d'accéder à cette adresse au moyen d'un navigateur web:

Calibration de la balance

Pour calibrer la balance, il faut modifier la ligne 87 pour que set_scale soit utilisé sans paramètres:

balance.set_scale();

On exécute le sketch pendant que le plateau de la balance est vide et, une fois la balance en fonction, on place sur le plateau une masse dont on connaît la valeur.

Dans mon cas, la valeur 76486 s'affichait lorsqu'une masse de 200 g était placée sur le plateau. 

76486 divisé par 200 donne 382, et j'ai donc ajouté le paramètre "382" à la méthode set_scale (ligne 87):

balance.set_scale(382);

À lire également

La même balance a été utilisée avec un Arduino Uno ainsi qu'avec un Raspberry Pi. Je vous invite également à jeter un oeil sur mes autres projets impliquant l'ESP32 et l'ESP8266.

Yves Pelletier (TwitterFacebook

dimanche 1 novembre 2020

Mesurer la température et l'humidité relative avec un DHT22 (AM2302) et un Raspberry Pi

Le capteur DHT22 (aussi appelé AM2302) permet de mesurer l'humidité relative de l'air ainsi que la température ambiante. Nous l'utilisons aujourd'hui avec un Raspberry Pi programmé en Python. 


Le capteur comporte un condensateur dont la capacité dépend de l'humidité. Puisqu'il faut également connaître la température pour pouvoir calculer l'humidité relative, le DHT22 comporte également un capteur de température intégré.

J'ai utilisé un DHT22 qui est incorporé à un module comportant 3 broches: + , out et -. Ce module comporte déjà une résistance de tirage entre les broches + et OUT. Si ce n'est pas le cas pour le capteur que vous utilisez, il est recommandé de placer une résistance de 4,7 kΩ ou 10 kΩ environ entre DATA et VCC.

Pour ma part, j'ai branché mon module au Raspberry Pi de la façon suivante:
  • Broche + du DHT22: sortie 3,3 V du Raspberry Pi
  • Broche out du DHT22: broche GPIO 4 du Raspberry Pi
  • Broche - du DHT22: broche GND du Raspberry Pi

J'ai ensuite installé la bibliothèque d'Adafruit en tapant les 3 lignes suivantes dans le terminal:

pip3 install adafruit-blinka
pip3 install adafruit-circuitpython-dht
sudo apt-get install libgpiod2

Le script ci-dessous, inspiré d'un exemple fourni par Adafruit, affiche la température, l'humidité relative, le point de rosée et l'indice humidex.

-
-

Si vous décommentez la ligne 38, un message d'erreur sera affiché en cas d'échec de la lecture du capteur. Dans mon cas, j'ai eu la surprise de constater qu'environ une lecture sur quatre échouait avec une de ces deux mentions: "A full buffer was not returned. Try again." ou encore "Checksum did not validate. Try again.".  Après avoir vainement tenté de trouver une façon d'éviter ces erreurs, j'ai fini par me résigner et à simplement ne pas afficher le message d'erreur. De toute façon, la température et l'humidité sont des paramètres qui varient lentement, on a donc tout le temps de reprendre notre mesure si elle a échoué.

À lire également:

J'ai déjà utilisé un DHT22 avec un Arduino Uno


Yves Pelletier (TwitterFacebook)