Un sonomètre, parfois appelé capteur de bruit ou de niveau sonore, fait partie des capteurs qu'on nous a plusieurs fois demandés, mais que nous n'offrons pas encore. En effet, les petits processeurs embarqués que nous utilisons dans nos modules n'ont pas la puissance de calcul nécessaire à faire cette mesure, et jusqu'à ce jour, nous n'avions pas trouvé de composant externe que nous puissions intégrer et qui corresponde à nos critères de qualité. Mais il y a un espoir que cela change...
Reprenons par le commencement: qu'est-ce qu'on entend précisément par un capteur de niveau sonore, et pourquoi le son est-il compliqué à mesurer ?
La pression acoustique
La grandeur physique correspondant au niveau sonore s'appelle la pression acoustique. C'est l'amplitude de l'onde sonore, mesurée relativement au seuil d'audibilité humaine, et donnée sur une échelle logarithmique, en décibels (dB): la puissance sonore est multipliée par 10 chaque fois qu'on ajoute 10 dB.
- 0 dB correspond à une pression de 20 micropascals, le seuil de sensibilité humaine pour une fréquence de 1 kHz;
- 40 dB est le niveau de pression acoustique dans une pièce à peu près silencieuse;
- 80 dB est le niveau de bruit généré par du trafic routier;
- 120 dB correspond typiquement au seuil de la douleur, avec fort risque de lésions.
Jusque là, c'est assez simple.
Pour mesurer l'amplitude de l'onde sonore, on utilise un microphone. Là où cela se complique, c'est qu'il n'existe pas de micro ayant une sensibilité uniforme sur toutes les fréquences. Il faut donc décomposer l'onde mesurée par fréquence et appliquer une correction spécifique à chaque bande de fréquence, en fonction d'une calibration effectuée à l'aide d'instruments de référence.
De plus, pour que la mesure soit représentative de la perception humaine, on ne considère pas l'amplitude totale de l'onde sonore, mais on effectue une pondération des fréquences en fonction de la sensibilité de l'oreille humaine. Un sonomètre offre donc en général plusieurs mesures:
- en dB(A), selon la pondération classique pour la sensibilité de l'oreille humaine;
- en dB(C), selon une pondération élargie pour mieux tenir compte des basses fréquences;
- en dB(Z), pour une mesure non filtrée.
Ceci explique pourquoi les petits processeurs 16 bits embarqués sur nos capteurs ne peuvent pas en eux-mêmes faire les calculs nécessaires à implémenter un sonomètre.
Or nous avons récemment trouvé sur internet un petit module I2C qui fait exactement tous ces calculs: le I2C Decibel Sound Level Meter Module, fabriqué par PCB Artists.

Le module I2C sonomètre fabriqué par PCB Artists
Comme il s'agit d'un module I2C, on peut facilement l'utiliser à l'aide d'un Yocto-I2C. Voyons comment faire...
Test du I2C Decibel Sound Level Meter Module
Le module fonctionne en I2C 3.3V. Il n'est pas nécessaire de raccorder la pin INT, vous pouvez donc le raccorder au Yocto-I2C comme ceci:

Schéma de connexion
Il existe plusieurs variantes du module, en fonction du prix que vous êtes prêt à mettre, de l'utilisation d'un micro externe, etc. Commençons par une configuration de base des paramètres du Yocto-I2C qui fonctionne avec toutes les variantes:

Configuration de base des paramètres I2C
Le job de communication configuré sert à interroger automatiquement le capteur. Sachant que l'adresse I2C du module est 0x48 et que la mesure courante en décibels se trouve dans le registre 0x0A, le job est composé d'une seule tâche:

Tâche pour lire la mesure courante en décibels
Nous avons trouvé la variante Pro du module particulièrement intéressante:
- elle fournit simultanément les mesures en dB(A), dB(C) et dB(Z)
- elle fournit les valeur normalisées sur le temps LApk, LAeq, etc.
- elle fournit des mesures avec une résolution de 0.01 dB (plutôt que 1dB)
- elle fournit un aperçu des bandes de fréquences par octaves
- elle couvre plus de basses fréquences (jusqu'à 20 Hz)
La variante Pro supporte la communication à 400 kbit/s. On peut donc changer la configuration du Yocto-I2C en conséquence. Pour lire les trois valeurs en dB(A), dB(C) et dB(Z) d'un coup, y compris leur deux décimales, on peut faire un job avec un protocole custom:
expect "48:{A}{A} 48:{A}($dBA:BYTE)($dBAdec:BYTE)
($dBC:BYTE)($dBCdec:BYTE)
($dBZ:BYTE)($dBZdec:BYTE).*"
compute $1 = dBA + (dBAdec / 100)
compute $2 = dBC + (dBCdec / 100)
compute $3 = dBZ + (dBZdec / 100)
On peut alors utiliser Yocto-Visualization pour obtenir un graphe en temps réel montrant l'évolution de la pression sonore. Voici un exemple de mesures prises pendant qu'on joue une gamme chromatique ascendante et descendante sur quelques octaves à l'aide d'un Yocto-MaxiBuzzer diposé à quelques dizaines de centimètre:
Mesure d'amplitude sur une gamme chromatique
Le capteur mesure bien les variations d'amplitude sonores dues aux fréquences de résonance du haut-parleur, et les mesures sont cohérentes avec les valeurs que nous donne un sonomètre calibré disposé à côté du capteur.

Comparaison avec un sonomètre de référence
Conclusion
Ce petit module sonomètre est clairement une solution compacte et abordable pour mesurer la pression acoustique et obtenir facilement des mesures crédibles. Il ne remplacera pas un instrument certifié pour les applications avec des exigences légales, mais est un parfait exemple de solution pragmatique, qui fournit des mesures crédibles pour évaluer rapidement ou surveiller continuellement un environnement sonore.
