lundi 21 septembre 2020

Capteur de son KY-038 et Arduino

Le capteur de son KY-038 est un module constitué d'un microphone à électret et d'un comparateur LM393. On l'appelle parfois KY-037 ou HXJ-17 (mon exemplaire porte au verso le numéro HW-484 ...qui est en principe le nom d'un module à interrupteur Reed!).

Le module ne comporte aucun étage d'amplification; pour cette raison, il est plutôt dur d'oreille: s'il réagit bien à un bruit intense (comme taper des mains à proximité du microphone), ne comptez pas trop sur lui pour détecter un chuchotement.




Le module comporte 4 broches:
  • G et + pour l'alimentation (5 V)
  • AO: sortie analogique. Il s'agit de la tension issue du micro électret, sans la moindre amplification. 
  • D0: sortie numérique, qui atteint le niveau logique "haut" si l'intensité sonore détectée dépasse un certain seuil que l'utilisateur a ajusté au moyen du potentiomètre.


Connexions du module KY-038 à une carte Arduino Uno

Pour faire mes tests, j'ai branché le module KY-038 à une carte Arduino Uno de la façon suivante:

  • Broche AO du capteur de son : broche A0 de l'Arduino
  • Broche G du capteur de son: broche GND de l'Arduino
  • Broche + du capteur de son: broche 5 V de l'Arduino
  • Broche DO: broche 7 de l'Arduino

(Notez qu'il est rarement utile de connecter les deux sorties A0 et D0 simultanément). 


Ajustement du potentiomètre

Le module comporte 2 LEDs: une LED situé près du comparateur LM393 est allumée quand le module est alimenté, et une deuxième LED (situé près du potentiomètre) est supposée s'allumer uniquement lorsqu'un son est détecté.

Avant d'utiliser la sortie numérique, il est essentiel d'ajuster le potentiomètre afin que la LED reste éteinte en absence de son, et s'allume lorsqu'il y a un son.  Si votre LED est toujours éteinte (même quand vous tapez des mains près du micro), tournez la vis du potentiomètre dans le sens horaire. Si la LED est toujours allumée (même en absence de son), tournez la vis dans le sens antihoraire. Puisque le signal issu du microphone n'est pas amplifié, la marge de manoeuvre est vraiment mince.

Dans le circuit, le potentiomètre contrôle la résistance de tirage qui relie la sortie analogique à l'alimentation de 5 V. Pour cette raison, tourner le potentiomètre a également un effet sur la tension de la sortie analogique lorsqu'il n'y a pas de son (elle devrait idéalement se situer à mi-chemin entre 0 et 5 V).

Exemple de sketch:  Sortie numérique

Voici un exemple de sketch qui utilise la sortie numérique du module KY-038: tapez dans les mains, et la LED intégrée à la carte Arduino s'allume. Tapez des mains à nouveau, et elle s'éteint.

--

Exemple de sketch:  Sortie analogique

Pour faire l'essai de la sortie analogique du capteur, j'ai utilisé un sketch que j'avais utilisé il y a quelques années avec l'interface audio que j'avais fabriquée pour l'Arduino.

-

-

Ce programme accumule 200 mesures prises sur l'entrée analogique A0, pour ensuite les transmettre par UART pour qu'on puisse les visualiser sur le traceur série.

Voyez le résultat obtenu pendant que je jouait une note continue sur un clavier électronique. Le volume  était relativement fort, et le micro du capteur KY-038 était placé tout près du haut-parleur.


Portez une attention particulière à l'axe vertical: la valeur affichée varie entre 0 et 9...la résolution est pitoyable!

Il s'agit de la valeur récoltée par analogRead() à laquelle j'ai soustrait 512.  La valeur réelle, avant soustraction, oscillait donc entre 512 et 521, soit une minuscule fraction des 1023 valeurs pouvant être exprimées par l'ADC de 10 bits.

Conclusion

À cause de l'absence d'amplification, les applications pratiques de ce capteur sont très limitées! Je crois bien que je vais tenter de trouver (ou de fabriquer) quelque chose de mieux...

Yves Pelletier (TwitterFacebook)

mardi 15 septembre 2020

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



Accueillons d'abord un petit nouveau: Tutoduino!





Yves Pelletier (TwitterFacebook)

dimanche 13 septembre 2020

Utilisation d'un thermocouple avec MAX6675 et Arduino

Nous avons déjà eu de nombreuses occasions de mesurer une température avec une carte Arduino, en utilisant différents capteurs comme le DS18B20, le LM35DZ, le BMP180 ou le DHT22. Si ces capteurs sont tout à fait appropriés pour mesurer la température ambiante (pour une station météorologique, par exemple), ils ne conviennent pas du tout pour mesurer des températures beaucoup plus élevées, comme par exemple celle qui règne à l'intérieur d'un four.

Un thermocouple, par contre, est tout à fait approprié pour cette tâche.  La photographie ci-dessus montre un thermocouple de type K accompagné d'un module MAX6675: ce dispositif peut mesurer des températures frôlant les 500°C.

Un thermocouple est fabriqué au moyen de deux fils conducteurs constitués de métaux différents, qui sont soudés ensemble à une de leurs extrémités. Une faible différence de potentiel est générée lorsque cette soudure se trouve à une température différente des deux autres extrémités (c'est l'effet Seebeck, découvert il y a 200 ans).

Le MAX6675 est un circuit intégré spécialement conçu pour transformer la faible tension issue du thermocouple en un signal numérique de 12 bits exprimant la température avec une résolution de 0,25°C. 


Choix et installation d'une bibliothèque

Le gestionnaire de bibliothèque de l'IDE Arduino nous offre 3 bibliothèques conçues pour l'utilisation d'un thermocouple avec le MAX6675: la bibliothèque d'Adafruitcelle de Yurri Salimov et celle d'Evgeny Kremer. Les trois bibliothèques sont très similaires, elles offrent la possibilité d'afficher la température en degrés Celsius ou Fahrenheit. La bibliothèque de Yurri Salimov est la seule qui offre également l'affichage en Kelvin, ainsi que des méthodes conçues pour lisser la courbe ou afficher la moyenne de plusieurs mesures.

Puisqu'il fallait bien que j'en choisisse une, j'ai opté pour la bibliothèque MAX6675 d'Evgeny Kremer; son concepteur a choisi d'utiliser le bus SPI hardware et il a prévu une protection au cas où l'utilisateur tenterait d'acquérir les mesures à un rythme trop rapide (la fiche technique du MAX6675 mentionne un temps de conversion d'environ 200 ms).

Connexions

Un bornier à vis permet de brancher le thermocouple au module MAX6675: fil rouge à la borne + et fil bleu à la borne -.


5 connecteurs mâles permettent la connexion du module à la carte Arduino Uno:

  • GND : une des broche GND de l'Arduino
  • VCC: sortie 5 V de l'Arduino
  • SCK: broche 13 de l'Arduino Uno* (horloge SPI)
  • CS: broche 10 de l'Arduino (chip select, défini dans notre sketch)
  • SO: broche 12 de l'Arduino Uno* (MISO SPI)

(* Les broches dédiées à la communication SPI peuvent être différentes si vous utilisez un modèle autre que le UNO.)


L'exemple "TempOverSerial", fourni avec la bibliothèque, montre à quel point il est facile d'obtenir la température grâce à la fonction readTempC().



Voici ce qu'indiquait le moniteur série lorsque j'ai exécuté l'exemple  "TempOverSerial". 


J'ai ensuite allumé ma cuisinière et placé l'extrémité de la sonde à l'intérieur du four pendant environ 10 minute, en mesurant la température toutes les 10 secondes:


(Conseil important: l'Arduino et le module MAX6675 demeurent à l'extérieur du four...)

Yves Pelletier (TwitterFacebook)

lundi 7 septembre 2020

Capteur de couleurs TCS3200 (GY-31) et Arduino


Cette semaine, j'ai eu l'agréable surprise de trouver dans ma boîte aux lettres le capteur de couleurs TCS3200 que j'avais commandé...5 mois plus tôt! 

Le TCS3200 est un capteur conçu pour déterminer la couleur d'un objet, Il est constitué d'une matrice de minuscules photodiodes: 16 d'entre elles sont munies d'un filtre qui ne laisse passer que la lumière rouge, 16 autres ne captent que la lumière verte, 16 photodiodes ne captent que la lumière bleue, et les 16 dernières n'ont pas de filtre et captent donc la totalité de la lumière reçue.

En plus du capteur TCS3200, le module GY-31 comporte 4 LEDs qui permettent de bien éclairer la cible.

Le module comporte 10 connecteurs (mais 2 d'entre eux sont redondants):

  • 2 connecteurs Vcc: Alimentation située entre 2,7 V et 5,5 V
  • 2 connecteurs GND: la masse, évidemment
  • S0 et S1 : sélection de l'échelle de fréquence
  • S2 et S3: sélection des photodiodes actives
  • OUT: signal de sortie
  • LED: contrôle des 4 LEDs d'éclairage

C'est l'état logique des entrées S2 et S3 qui détermine quel groupe de photodiode est actif:

  • S2 = 0 et S3 = 0 : Rouge
  • S2 = 0 et S3 = 1:  Bleu
  • S2 = 1 et S3 = 1: Vert
  • S2 = 1 et S3 = 0: Sans filtre
Le signal de sortie est une onde carrée dont la fréquence est proportionnelle à l'intensité lumineuse désirée. Pour faciliter la mesure de cette fréquence, on peut la diviser par 5 ou par 50 grâce aux entrées S0 et S1:
  • S0 =1 et S1 = 1: 100% de la fréquence (environ 600 kHz)
  • S0 = 1 et S1 = 0: 20% de la fréquence (environ 120 kHz)
  • S0 = 0 et S1 = 1: 2% de la fréquence (environ 12 kHz)
  • S0 = 0 et S1 = 0: capteur inactif
Puisque j'ai choisi de mesurer la demi-période du signal au moyen de la fonction pulseIn(), il m'a semblé préférable de travailler à l'échelle 2%, ce qui m'a donné des mesures de quelques centaines de microsecondes. 

Les LEDs seront allumées par défaut si on ne branche rien à l'entrée LED du module. Si on désire les éteindre, il s'agit de régler cette entrée au niveau logique 0.

Pour un même objet coloré, les résultats obtenus dépendent beaucoup de la lumière ambiante et de la distance entre le capteur et l'objet. Dans le but d'uniformiser mes résultats, j'ai placé mon capteur au fond d'un réceptacle noir qui bloquait la lumière ambiante, et qui me permettait de placer l'échantillon coloré à exactement 3 cm de distance par rapport au capteur.



J'ai branché le module GY-31 à l'Arduino Uno de la façon suivante:


  • VCC du module GY-31 : Arduino 5 V
  • GND du module GY-31: Arduino GND
  • S0 du module GY-31: Arduino 2
  • S1 du module GY-31: Arduino 3
  • S2 du module GY-31: Arduino 4
  • S3 du module GY-31: Arduino 5
  • OUT du module GY-31: Arduino 6
  • LED du module GY-31: Arduino 7

Voici un sketch qui affiche dans le moniteur série les valeurs mesurées par chaque groupe de photodiodes. Puisque la fonction pulseIn() mesure un temps et non une fréquence, un petit nombre correspond à une forte intensité lumineuse.

-
-



Ça fonctionne vraiment bien pour différencier deux objets dont les couleurs sont vives et très différentes l'une de l'autre. 

Même en prenant des précautions pour assurer une certaine uniformité des conditions de mesure (même carton coloré, écran bloquant la lumière ambiante, même distance entre le capteur et le carton), les mesures pour une même couleur peuvent varier de plusieurs dizaines de microsecondes d'un essai à l'autre (surtout si la couleur est foncée).  Il est peut-être possible d'obtenir de meilleurs résultats en améliorant la procédure pour mesurer la fréquence, ou en utilisant un microcontrôleur plus rapide.

À lire également:

On peut aussi détecter des couleurs en fabriquant une sonde RGB au moyen d'une simple LED RGB.

Ce module TCS3200 peut également être utilisé avec un Raspberry Pi.

Yves Pelletier (TwitterFacebook)