jeudi 6 juin 2019

Faire du bruit avec un ARDUINO





Faire du bruit avec un ARDUINO


Nous allons aborder ici les solutions matérielles permettant de générer des sons à partir d'un ARDUINO ou de tout autre processeur.

Tout d'abord il faut distinguer les différents types de transducteurs à notre disposition :
  • buzzer électromagnétique
  • buzzer piézo-électrique
  • haut-parleur
  • sirène
  • etc.
 Suivant l'utilisation, il va falloir orienter son choix de différentes manières :
  • alarme anti-effraction
  • alarme de signalisation
  • diffusion de musique
  • etc.

1. Alarme anti-effraction

Ces alarmes possèdent plus ou moins tous les éléments de sécurité nécessaires:
  • batterie de secours avec chargeur intégré
  • signalisation par flash
  • détection de coupure du câble
  • détection d'arrachement
  • détection d'ouverture du boîtier
Leur puissance sonore est importante, souvent au dessus de 100db à 1m. Elles sont en général équipées de leur propre processeur.
Les piloter à l'aide d'une carte ARDUINO peut s'avérer plus ou moins complexe.

Une sirène disposant d'une interface dédiée à une centrale d'alarme particulière proposera rarement une documentation précise permettant de la piloter à partir d'un ARDUINO.

2. Alarme de signalisation

Il ne s'agit plus d'alarme à caractère dissuasif mais de signalisation de défaut :
  • surveillance de température
  • surveillance de niveau d'eau
  • détection de proximité
  • etc.
Cette signalisation ne nécessite pas de volume sonore important ou des fonctions de sécurité élaborées.
Ici nous allons examiner différents transducteurs :
  • buzzer électromagnétique
  • buzzer piézoélectrique
  • haut-parleur
Le buzzer électromagnétique comporte un enroulement et un diaphragme permettant de générer un son.
Un buzzer électromagnétique peut avoir une impédance plus ou moins importante, et peut donc être alimenté avec des tensions très variables : 1.5V, 5V, ou 12V.
Il peut être équipé d'un oscillateur interne à fréquence fixe (buzzer actif).

Le buzzer piézoélectrique est constitué d'un diaphragme piézoélectrique.
Un buzzer piézoélectrique, même s'il est prévu pour fonctionner avec une tension nominale, accepte souvent une plage de tension importante : 3V à 20V par exemple.
Il peut également être équipé d'un oscillateur interne à fréquence fixe (buzzer actif).

Comment les distingue t-on ?
Sans une datasheet précise, c'est plus ou moins facile, car ils peuvent se présenter sous différentes formes :

Buzzer piézoélectrique

Buzzer piézoélectrique
Buzzer électromagnétique
Buzzer piézoélectrique
Buzzer électromagnétique

L'aspect ne suffit pas à dissiper le doute, spécialement en ce qui concerne les modèles cylindriques en diamètre 12mm.

Un fournisseur sérieux doit pouvoir préciser de quel type de transducteur il s'agit.
Souvent chez les revendeurs chinois seule la tension de service est précisée, et le type de produit : actif ou passif.

On possède parfois des buzzers dont on ne connaît pas les caractéristiques, par exemple des exemplaires récupérés sur de vieilles cartes mère de PC, qui sont souvent des buzzers électromagnétique passifs d'ailleurs.

Un moyen simple permet d'en déterminer le type : on peut brancher la borne marquée + sur une source de tension 5V et l'autre borne à la masse de l'alimentation.

Un buzzer actif produira un son, en général situé à environ 400Hz pour les gros modèles, 2KHz pour les petits modèles.

Un buzzer passif produira un simple click quand on le branche, et un autre click quand on le débranche, mais aucun son continu.

La mesure de la résistance à ses bornes peut indiquer également s'il s'agit d'un buzzer électromagnétique ou non. En général l'enroulement présente une résistance comprise entre 15Ω et 50Ω.
Les autres transducteurs, y compris électromagnétiques actifs ont une résistance beaucoup plus élevée.

2.1. Pilotage par un ARDUINO

Suivant le type de transducteur, le pilotage par l'ARDUINO sera différent :

La première chose à faire va être de savoir quel est le courant nécessaire pour l'alimentation.

2.1.1. Le buzzer
Un buzzer piézoélectrique consomme peu, aux alentour de 10mA. Il sera directement connectable sur une sortie digitale d'un ARDUINO.

Un buzzer électromagnétique, en fonction de l'impédance de sa bobine, va avoir besoin d'un courant plus ou moins important pour fonctionner, entre 30mA et plus de 100mA. Suivant le cas on pourra difficilement obtenir un volume sonore important en le connectant directement sur une sortie de l'ARDUINO, capable de sortir 40mA au grand maximum. On le commandera de préférence avec un transistor.

Les deux modes de commande sont représentés ci dessous :
L'utilité du transistor n'est pas liée au fait que le buzzer soit actif ou non. Cela dépend totalement du transducteur employé.

A noter : si l'on se contente d'un niveau sonore faible, il est parfaitement possible de brancher un buzzer électromagnétique passif directement sur une sortie de l'ARDUINO en intercalant une résistance adaptée, 100Ω par exemple.

Un buzzer électromagnétique passif n'a pas de polarité, même s'il a une borne marquée +. Tous les autres transducteurs sont polarisés.

2.1.2. Le haut-parleur
Un haut-parleur a une impédance faible, entre 4Ω et 16Ω. Il est bien entendu hors de question de la brancher en direct sur une sortie de microcontrôleur.

Si l'on se contente d'un niveau sonore faible, on peut le brancher en intercalant une résistance adaptée, comme pour un buzzer passif, 150Ω par exemple.

On peut aussi le brancher en utilisant le montage à transistor décrit précédemment. Le courant sera certainement beaucoup plus important qu'avec un buzzer passif. Choisir le transistor en conséquence. Un 2N2222 me semble être un minimum.

Enfin on peut aussi passer par un petit amplificateur fonctionnant en 5V (LM386, PAM8403, XPT8871 ou autre).

2.2. Pilotage logiciel

Suivant qu'il s'agit d'un buzzer actif ou non, le logiciel devra se comporter différemment :

Cas d'un buzzer actif. On se contente d'une simple commande en tout ou rien :

#define BUZZER 3

void setup(){
  pinMode(BUZZER, OUTPUT);
}

void loop(){

  digitalWrite(BUZZER, HIGH);
  delay(2000);
  digitalWrite(BUZZER, LOW);
  delay(2000);
}


Cas d'un buzzer passif ou d'un haut-parleur. Un signal carré est employé, en précisant sa fréquence :

#define BUZZER 3

void setup(){
  pinMode(BUZZER, OUTPUT);
}

void loop(){

  tone(BUZZER, 1500);
  delay(2000);
  noTone(BUZZER);
  delay(2000);
}


Avec un buzzer passif ou un haut-parleur on pourra donc générer des sons de fréquence variable.

3. Diffusion de musique

S'il est parfaitement possible de générer une mélodie avec la fonction tone() de l'ARDUINO, on peut difficilement appeler ça de la musique.
S'il s'agit de diffuser des sons sous forme de signaux carrés, on emploiera un buzzer passif ou un petit haut-parleur (voir paragraphes précédents).

3.1. La source sonore

Nous allons distinguer deux sources possibles :
  • l'ARDUINO lui-même
  • un module externe
Dans le premier cas, les sons sont stockés dans la mémoire de l'ARDUINO et transmis au haut-parleur sans ajout de matériel, hormis l'amplification bien sûr.
Dans le deuxième cas, les sons sont stockés sur une carte SD et transmis au haut-parleur à l'aide d'un module capable de reproduire des morceaux WAV, MP3, etc.

3.1.1. La librairie PCM
Vous connaissez peut être cette librairie : https://github.com/damellis/PCM
Il vous suffit de brancher un haut parleur sur la pin 11 d'un ARDUINO et de charger l'exemple playback pour entendre "Arduino duemillanove".

Le morceau à jouer est stocké sous forme d'un tableau binaire directement dan sle code.
Avec un ARDUINO NANO ou UNO vous pourrez stocker une séquence sonore de quelques secondes, avec une MEGA, vous aurez plus de place.

Il faut pour cela convertir votre échantillon avec un logiciel comme Audacity par exemple :
  • sélectionner le morceau
  • cliquer sur "Fichier / Exporter l'audio sélectionné"
  • choisir "Autres formats non compressés"
  • choisir "RAW (header-less)"
  • choisir "Unsigned 8 bits PCM"
Choisir un nom pour votre fichier, sample.raw par exemple.

Ensuite j'ai trouvé un petit logiciel permettant de convertir ce fichier binaire en fichier header .h : https://github.com/dparnell/bin2h
Il vous faudra installer le langage ruby.
C'est un petit script qu'il suffit de lancer comme ceci :

./bin2h sample.raw sample.h

Il n'y a plus qu'à inclure ce fichier .h dans votre source et à appeler la fonction adéquate :

startPlayback(data, sizeof(data));

J'ai essayé avec un aboiement de chien. Sincèrement ce n'est pas avec un son de cette qualité que vous allez faire peur au facteur.

D'autres versions de bin2h existent sous forme d'exécutable Windows, y compris avec interface graphique. Ne possédant pas de machine Windows et n'envisageant pas d'en posséder une, je n'ai pas pu essayer.


3.1.2. Le DFPlayer (YX5200)
Le DFPlayer est un module MP3 monophonique muni d'une carte µSD. Il est relié à l'ARDUINO par une ligne série et reçoit ses ordres par celle-ci.
Le son qu'il est capable de produire est excellent. Il dispose d'un DAC 24bits et supporte des taux d'échantillonnage jusqu'à 48KHz.
Son ampli (8002a) intégré délivre 3W.

J'en ai déjà parlé ici : https://riton-duino.blogspot.com/2018/04/dfplayer-mini-et-bruit-de-fond.html

Cette librairie est nécessaire : https://github.com/DFRobot/DFRobotDFPlayerMini

3.1.3. Le KT403A
Le KT403A est un module MP3 stéréo muni d'une carte µSD. Il est relié à l'ARDUINO par une ligne série comme le DFPLAYER.
Il dispose d'un DAC 24bits et supporte des taux d'échantillonnage jusqu'à 48KHz.
Certains modules intègrent un ampli (8002a) de 3W. Le Groove par exemple en est dépourvu.

3.1.4. Le YX5300
Le YX5300 dispose également d'une carte µSD et d'une prise JACK en guise de sortie. Il est également relié à l'ARDUINO par une ligne série.

 3.1.5. Le VS1053


Le VS1053 est stéréo. Il fonctionne sur un BUS SPI et possède un DAC 18 bits. Il permet également l'enregistrement.
Il est disponible sous forme de module ou de carte shield pour UNO.


3.1.6. Le WT5001
Le WT5001 est stéréo. Il fonctionne également sur un BUS SPI. J'ai peu de données à son sujet, en particulier la résolution de son DAC.

3.2. L'amplification

Si une puissance de quelques watts ne suffit pas, vous pourrez augmenter celle-ci à l'aide d'un amplificateur, en classe D de préférence :
TPA3110 mono
TDA8932 mono
TPA3118 mono
TPA3116 mono
Il existe une quantité pharamineuse d'amplificateurs en classe D, capables de délivrer entre 5W et 1000W.

Ces amplificateurs ont l'énorme avantage de pouvoir fonctionner avec une alimentation simple, contrairement aux amplificateurs en classe B qui nécessitent généralement un rail d'alimentation positif et un rail négatif.
Ils supportent des tensions d'alimentation variées et existent également en version stéréo ou mono bridgé.

Les datasheets permettent de déterminer la tension d'alimentation en fonction de l'impédance du haut-parleur et de la puissance voulue.

Par exemple un TDA8932 mono bridgé (BTL) :
  • 15W pour une alimentation de 12V et un HP de 4Ω
  • 30W pour une alimentation de 22V et un HP de 8Ω
Si l'amplificateur choisi ne dispose pas d'un potentiomètre de réglage de volume, il faudra en intercaler un entre la sortie du module MP3 et son entrée :


Comme je l'explique ici, le réglage de volume logiciel est assez pénalisant en terme de rapport signal / bruit.

En fonction de la puissance désirée il est nécessaire de choisir une alimentation ayant une tension et une puissance adaptée :




Bien entendu, le haut-parleur choisi devra supporter également la puissance efficace demandée.

4. Conclusion

Après ce petit tour dans le monde de l'audio pour ARDUINO, j'espère vous avoir donné envie de faire du bruit ...


Cordialement
Henri


2 commentaires:

  1. Super infos, j'ai appris pleins de trucs!
    J'ai réalisé un projet de lecteur de musique qui se déclenche grâce à la RFID avec le module MP3 YX5300. Tout marche super avec le casque mais j'ai essayé d'insérer 2 petits HP de 1,5W chacun et le son émis est vraiment pas top...même avec le potentiomètre au maximum. Je suppose qu'il faut que j’installe un petit ampli mais lequel choisir et où le brancher ? Mon installation fonctionne avec une pile 9V.
    Merci d'avance !
    JC

    RépondreSupprimer
    Réponses
    1. Avec une pile 9V cela ne marchera pas longtemps.
      Il est possible que vos haut-parleurs soient de qualité médiocre.

      Supprimer