dimanche 10 janvier 2016

Visualisation d'un son avec le traceur série de l'Arduino

Dans mon article précédent, j'ai fabriqué une interface qui transforme un signal audio afin qu'il respecte les limites d'une entrée Arduino (minimum de 0 V, maximum de 5 V).  Grâce à un oscilloscope, j'avais pu constater le fonctionnement correct du circuit:  la forme du signal est préservée suite à l'amplification et la superposition à une tension continue de 2,5 V.

L'étape logique suivante:  si j'achemine ce signal sur une de ses entrées analogiques, l'Arduino voit-il la même chose que moi?

Le montage

La sortie pour casque d'écoute d'un clavier musical est branchée à l'entrée de l'interface précédemment fabriquée, et la sortie de l'interface est acheminée à l'entrée A0 d'une carte Arduino Uno.

Dans un premier temps, je règle le clavier pour qu'il produise un signal simple (dent de scie), et j'appuie sur la touche "do 3" (262 Hz), ce qui donne ce résultat si je mesure le signal à la sortie du clavier, avec un oscilloscope:


Première tentative (ratée...)

Au départ, j'ai naïvement affiché mes mesures une par une dans le moniteur série, puis je les ai copiées dans un tableur pour visualiser le signal.


Échec total; la forme du signal enregistré par l'Arduino  n'avait rien à voir avec la forme du signal d'origine.


Raison:  taux d'échantillonnage trop lent.  Le signal audio variait trop rapidement par rapport au rythme auquel l'Arduino prenait les mesures.

Deuxième tentative (ça fonctionne!)

J'ai croisé les doigts pour que le principal responsable de cette lenteur soit l'affichage de la valeur numérique sur le moniteur série.  Augmenter la vitesse de transmission (baud rate) a semblé améliorer les choses, mais pas suffisamment.

J'ai donc essayé un deuxième sketch, dans lequel je commençait par accumuler une centaine de données, pour ne les afficher qu'à la fin de la prise de mesures.



Et cette fois, le résultat a été beaucoup plus satisfaisant:


En utilisant la fonction "millis()", j'ai constaté qu'environ 11 millisecondes étaient nécessaires pour que l'Arduino effectue les 100 mesures.  Nous voyons sur le tracé que presque 3 périodes ont été effectuées pendant ces 11 millisecondes, ce qui donne une fréquence estimée de 273 Hz, très similaire à la valeur réelle de 262 Hz.

Troisième étape, le traceur série

Le nouveau traceur série de l'IDE Arduino m'a semblé une façon pratique de visualiser le signal audio en temps réel, sans avoir besoin de sortir de l'IDE. Pour étaler un peu l'échelle de temps (horizontale), je dois toutefois ajouter un délai lors du traçage.

Voici donc un sketch qui effectue 200 mesures du signal audio (ce qui nécessite un temps imperceptible de 22 ms), puis affiche le résultat au traceur série (ce qui nécessite une durée d'environ 2 secondes, à cause du délai que j'ai imposé).

J'ai aussi soustrait 512 à la valeur mesurée, qui correspond à la tension continue de 2,5 V, afin que le signal affiché oscille autour de zéro.   De plus j'ai ajouté une suite de zéros pour séparer les différentes suites de mesure.




 Le do situé un octave plus bas (131 Hz) comporte deux fois moins d'oscillations:






Et le do situé un octave plus haut (523 Hz) en comporte deux fois plus:





Essayons maintenant des formes plus complexes... Voici le do 262 Hz joué avec plusieurs timbres différents, en comparant le résultat affiché par l'Arduino (en haut, en bleu) à celui obtenu à l'oscilloscope (en bas, en rouge).

Imitation de clarinette:


Imitation de hautbois:


Imitation de saxophone alto:




Imitation de trompette:


Et un dernier test:  une guitare électrique branchée sans ampli (j'ai dû régler le gain de mon interface audio au maximum):





Yves Pelletier   (TwitterFacebook)

1 commentaire: