Lecture entrée audio

Bonjour, j’essaye de lire une entrée audio avec une arduino uno, mais le spectre que j’obtient ne convient pas :

J’ai fais un montage avec deux résistances de 22k, et un condensateur de 1000uF.

La valeur lu lorsque la musique est en pause est de environ 505 sur le traceur série. Mais avec de la musique, les valeurs tournent entre 350 et 650 (sur l’échelle 0-1024)

Le but serait d’avoir des valeurs entre 0 et 1024, et pas comme maintenant tous resserrées.

Le schémas du montage est celui ci dessous (Merci encore pepe de m’avoir aidé l’autre jour avec le montage)

Le code Arduino pour lire l’entrée A0 est celui-ci :

int audio = 0;
int sound;

void setup() {
Serial.begin(9600);
}

void loop() {
sound = analogRead(audio);
Serial.println(sound);
delay(10);
}

Merci beaucoup d’une réponse

Cordialement

Erwan

entrée_audio.png

Salut

1000uF me paraît énorme. Tu es sûr ?
De quelle source provient le signal ?
Quelles référence ADC utilises-tu ? celle par défaut 5V ou interne 1.1V ?

@+

hbachetti:
Salut

1000uF me paraît énorme. Tu es sûr ?
De quelle source provient le signal ?
Quelles référence ADC utilises-tu ? celle par défaut 5V ou interne 1.1V ?

@+

De base il faut un condensateur 1uF, mais je ne l'ai toujours pas reçus, mais normalement avec 1000uF, le spectre devrait être un peu moins précis, mais les tensions minimal et maximal ne devraient pas changer à mon avis.

La référence est celle de base, 5v

erwan3110:
De base il faut un condensateur 1uF, mais je ne l'ai toujours pas reçus,
......le spectre devrait être un peu moins précis.....

Dans l'absolu c'est l'inverse pour pouvoir descendre très bas dans les basses fréquences il faudrait un condensateur d'un milliard de Farad :slight_smile:
Théorie : la valeur d'un condensateur de liaison, comme celui ci, se calcule pour qu'à la plus basse fréquence à transmettre son impédance alternative soit suffisamment faible devant l'impédance d'entrée de la charge.
Sinon le risque est que le condensateur et l'impédance d'entrée de la charge forment un pont d'affaiblissement.
Ici l'impédance d'entrée de la charge est constituée des 2 résistances de 22k en parallèle et du million d'ohms de celle du micro, soit au final 11k.

C'est sûr que, comme je le répète souvent, un condensateur est farci d'éléments parasites (résistances, inductances)
Plus sa valeur est forte, mieux c'est pour les fréquences basses mais plus il y aura des parasites qui affecterons les hautes fréquences.
D'où la valeur de 1 µF qui est probablement un bon compromis pour l'application .

Nulle part je n'ai vu indiqué la valeur de la fréquence basse et de la fréquence haute du signal.
Nulle part je n'ai vu parlé de la fréquence d'échantillonnage de l'ADC.
L'ADC est configuré par Arduino de la manière la plus prudente qu'il soit qui est hélas la moins performante. Arduino a favorisé la mesure analogique de tensions continues pas de celle de tensions alternatives car ce domaine est trop vaste pour une IDE pour débutant.

Depuis Monsieur Shanon on sait qu'il faut échantillonner à une fréquence au moins double de la plus haute fréquence à transmettre.
Le réglage de l'ADC est-il compatible avec la plus haute fréquence du signal que tu veux
mesurer ?

La valeur lu lorsque la musique est en pause est de environ 505

C'est normal tu mesures le décalage de tension ( Vcc/2) nécessaire pour que l'entrée de l'ADC ne voit pas de valeurs négatives.

Mais avec de la musique, les valeurs tournent entre 350 et 650 (sur l'échelle 0-1024)
Le but serait d'avoir des valeurs entre 0 et 1024, et pas comme maintenant tous resserrées.

L'ADC mesure ce qu'on lui donne et si ce que tu lui donne n'atteint pas 2,5V crête ( ou 5V crête à crête) il ne donnera jamais ni 0 ni 1023.

Si tu veux plus d'amplitude dans le résultat de mesure il faut soit amplifier le signal soit appliquer sur l'entrée Aref une tension "adaptée".
Exemple : prenons ton max de 650.
650 représente avec la référence de l'ADC à Vcc une tension de 3,16 V.
Une manip toute simple : tu relies Aref avec la sortie 3,3V et tu choisi la référence externe et cela devrait être gagné.

En modifiant le programme pour que la AREF soit à 3,3v j'obtient un signal entre 660 et 900 environs, et en pause, c'est vers 780.

Pour les fréquences que tu me demande (haute et basse) j'en ai aucune idée.
Je vais utiliser l'entrée audio pour remplacer un module de son MAX4466, et avec une bibliothèque FHT, pour ensuite analyser le signal et jouer sur une bande de LED WS2812B.

Merci beaucoup pour ta réponse !

Il ne suffit pas de modifier le programme :
Il faut aussi brancher le 3.3V sur la pin AREF.
Deuxièmement ta résistance 2.2K supérieure ne doit plus être connectée au 5V mais aussi au 3.3.

@+

Oui biensur j'ai branché le 3,3 au AREF, mais j'ai oublié pour la résistance :o

Je recommence

Merci :wink:

Ça va rouler tout seul.
Par contre il ne faudra pas saturer. 3.16V c'est franchement près de 3.3V musicalement parlant.
6 décibels en tension revient à quadrupler la puissance sur un haut-parleur.
et 6 décibels ne sont pas grand chose d'un point de vue sensibilité de l'oreille.

Tu n'as pas répondu à la question : De quelle source provient le signal ?

@+

Le signal provient de mon téléphone ou un ordi

Le réglage de l'ADC est-il compatible avec la plus haute fréquence du signal que tu veux mesurer ?

CECI devrait aider.
Échantillonner à 44KHz ou 48KHz devrait suffire.

@+

Mais comment règle-t-on la fréquence d’échantillonnage ? Et la pause dans mon programme, il faut que je l'enlève pour que la courbe obtenue soit mieux ?

Programme :
int audio = 0;
int sound;

void setup() {
Serial.begin(9600);
analogReference(EXTERNAL);
}

void loop() {
sound = analogRead(audio);
Serial.println(sound);
delay(10);
}

En modifiant le programme pour que la AREF soit à 3,3v j'obtient un signal entre 660 et 900 environs, et en pause, c'est vers 780.

Tu aurais du me dire que n'est pas normal et que les valeurs auraient du être centrées autour de 550.
Et l'erreur est juste parce que j'en ai oublié :confused:

--> il faut modifier la valeur d'une des résistances de 22K pour adapter le décalage de tension à la nouvelle référence 3,3V
Décalage = 3,3V/2 = 1,65 V
et là tu devrais obtenir 550 sans signal et avec le signal max proche de 0 et proche de 1023 si ton signal max est bien toujours le même.

Pour le calcul de la résistance je ne te donne pas la valeur (ce serait trop facile) mais le moyen de la calculer.
On peut modifier la résistance du haut ou celle du bas, choisissons celle du bas.
On va calculer le courant dans la résistance du haut et avec ce courant on calculera la résistance du bas puisqu'on connait la tension a ses bornes (1,65V)
Ce n'est qu'une application de la loi d'ohms U= R I.

La tension aux bornes de la 22k sera égale à U1 = 5V -1,65V
Le courant Io = U1/R avec U1 = (5V - 1,65 V) et R = 22k
Résistance du bas la tension est U2 = 1,65 V et courant est Io celui qui traverse la 22k
Rb = U2/Io avec U2 = 1,65 V et Io
Prendre une valeur normalisée proche --> les résistances les plus courantes sont à 5%

Tu peux aussi mettre un potentiomètre de 22k ou 51 k cela fonctionnera tout aussi bien tant que tu n'es pas dans le domaine des centaines de kHz, mais là l'oreille est larguée depuis longtemps. :slight_smile:

Mais comment règle-t-on la fréquence d'échantillonnage ?

Désolé mais il va falloir mettre les mains dans le cambouis.
Sur ce sujet oublie Arduino et vive la datasheet du micro et l'écriture dans les registres.
Extrait du document fourni par hbachetti :

La configuration de l'ADC se fait avec 3 registres 8 bits : ADMUX, ADCSRA et ADCSRB.

Cela va être très instructif et tu va parfaitement comprendre pourquoi nous disons que les entrées analogiques sont en fait des entrées numériques qui ont une deuxième fonction : la mesure analogique.

Ce sera peut-être déroutant au début mais la "surprise" du début passée tu verra qu'en fait c'est simple et que certains font une montagne d'une taupinière.

Avec tes calculs je trouve des résistances de 11k, c'est bien ?

(U1=3,35V; I0 = 1,52*10-4)

Oui c'est un peu comme le pwm ...
Je vais regarder sa quand j'aurai un peu de temps

Avec tes calculs je trouve des résistances de 11k, c'est bien ?

Pour vérifier tu fais le calcul dans l'autre sens :
Vp = 5V * (11/(22+11) = 1,66 V --> C'est BON ! !

Merci beaucoup !

Mais tous à l’heure le 780 en pause, j’avais oublier de changer le 5V de l’entrée sur le 3,3V.
je viens de le faire, et le signal en pause est bien de environs 500 (sans changer les résistances)

Ah oui mais c'est soit l'un soit l'autre.
Soit tu change la tension du pont de décalage de 5V vers 3,3V
Soit tu change la tension de décalage

Tu es d'accord que dans les deux cas on cherche à avoir 3,3V/2.

Oui je vois très bien c'est bon. J'avais pas envie de racheter des résistances, mes 22k ont mis 3 semaines à arriver ...

Merci encore de l'aide apportée !

Mais tous à l'heure le 780 en pause, j'avais oublier de changer le 5V de l'entrée sur le 3,3V.
je viens de le faire, et le signal en pause est bien de environs 500 (sans changer les résistances)

Cela veut dire que c'est OK.
Si ta référence est 3.3V, ton point milieu entre les deux résistances de 22K doit être à 3.3V / 2.
Si tu obtiens une valeur de 500 au lieu de 1023 / 2, pas grave, on va pas chipoter pour 2%.
Si tu as un pas de 3 Db entre chaque LED, cela fait 40% de différence de niveau. Les 2% sont largement négligeables.

@+

mes 22k ont mis 3 semaines à arriver ...

Il existe des kits pour quelques euros avec 10 exemplaires de plein de valeurs. On ne commande pas les résistances valeur par valeur.
Une petite dizaines de potentiomètres 10 tours est aussi bien pratique.