Utiliser un microphone avec un Arduino


18

EDIT : J'étudie ce problème depuis un certain temps. Cela s'avère être un projet beaucoup plus difficile que je ne le pensais et pas quelque chose pour les débutants. Cela nécessite un matériel coûteux (microphone et amplificateur) et une analyse audio sophistiquée sur le microcontrôleur. Même un microphone complet avec circuit amplifié ne donne pas les résultats souhaités (selon les commentaires sur ce produit)


Je suis entièrement nouveau sur l'Arduino (mais je suis familier avec la programmation). Afin de construire un VU-mètre , je veux mettre un microphone sur la broche 0 analogique de l'Arduino et afficher la valeur via la connexion série.

J'ai googlé et trouvé ce circuit:

Préamplificateur audio simple

... et j'ai essayé de le construire avec ce résultat:

(J'utilise maintenant le circuit suggéré par Oli Glaser dans sa réponse)

Les valeurs sur le moniteur série ne changent pas en fonction du volume de la musique.

Quelle est la façon la plus simple de mesurer le volume sur l'entrée analogique de l'Arduino?

De plus, j'ai un TDA2822M , mais je ne sais pas s'il est utile pour ce projet. La légende du microphone indique XF-18D .

Edit: Mon code arduino:

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

void loop() {
  Serial.println(analogRead(0));
  delay(300);
}

La sortie série: 1023 1022 1022 1022 1022 1023 1022 et ainsi de suite

Comment puis-je vérifier si le microphone fonctionne? Est-ce directionnel?

Edit: j'utilise maintenant un transistor S9014. L'ADC et la connexion série fonctionnent (je les ai testés avec un potentiomètre).

La sortie série est maintenant d'environ 57.

De plus, je n'ai ni multimètre ni oscilloscope. J'ai un multimètre maintenant.


Avez-vous vérifié avec un oscilloscope que vous pouvez voir une forme d'onde audio à la sortie de votre circuit?
HikeOnPast

Whoa, pourquoi la broche 3V3 et 5V est-elle court-circuitée dans le schéma? Cela pourrait être un problème.
Connor Wolf

Non, je n'ai pas dessiné le schéma correctement.
Toast

Réponses:


14

La manière "la plus simple" consiste simplement à appliquer le signal et l'échantillon avec l'ADC. Stockez les résultats dans un tampon puis affichez-les comme vous le souhaitez (dans votre cas, envoyez-les au PC via RS232)
Si vous voulez le niveau RMS du signal, vous devrez le calculer à un moment donné, soit avant de l'envoyer au PC, soit après.

Votre circuit d'amplification comme indiqué n'est pas idéal, mais devrait fonctionner raisonnablement pour un VU-mètre de base. EDIT - Je viens de remarquer C2, supprimez-le car cela bloquera la polarisation CC du transistor et le signal oscillera sous la terre.

EDIT - voici un meilleur circuit pour le transistor amplificateur:

Ampli électret

Cela ne devrait pas trop se soucier du transistor utilisé, la polarisation de sortie devrait être d'environ 2,5V.
Les valeurs exactes du diviseur d'entrée (R3 et R4) ne sont pas trop importantes, c'est le rapport de 1: 4 qui l'est davantage. Vous pouvez donc utiliser par exemple 400k et 100k, ou 40k et 10k, etc. (essayez de ne pas aller au-dessus ou en dessous de ces valeurs respectives). C2 devrait être> 10uF. C1 doit être> 1uF (remplace C1 dans votre schéma)
R1 et R2 doivent cependant être ces valeurs.
Tout ce dont vous avez besoin est l'électret avec sa résistance de polarisation (R1 dans votre schéma)

Un point préoccupant est que les lignes Arduino 3,3 V et 5 V semblent être liées ensemble - je suppose que c'est une erreur schématique, mais si c'est le cas dans le circuit réel, cela ne fonctionnera pas et pourrait endommager quelque chose.
Pour identifier le (s) problème (s), il serait utile de voir votre code et ce que vous voyez du côté PC. Quel transistor utilisez-vous également?

Si vous avez un oscilloscope, vous pouvez vérifier si votre micro / transistor fonctionne correctement. Sinon, un multimètre peut être utilisé pour effectuer des tests plus basiques (par exemple, confirmer + 5 V présent, confirmer que la base du transistor est à ~ 0,6 V, tester le collecteur pour s'assurer qu'il n'est pas fixé à + 5 V ou mis à la terre sans signal présent)

Vous devez également vous assurer que le RS232 fonctionne correctement, donc écrire un code simple pour envoyer des valeurs de test serait une bonne idée.

Si vous pouvez fournir les informations demandées et faites-nous savoir quels outils vous disposez d'une aide plus spécifique peut être fournie.

EDIT - si vous échantillonnez si lentement, vous aurez besoin d'un circuit de détection de crête comme celui-ci:

Détection de crête

Vous mettriez ce circuit entre le transistor et la broche Arduino (moins C2)

La diode peut être à peu près n'importe quelle diode. Les valeurs de cap et de résistance ne sont qu'une indication, elles peuvent être légèrement modifiées. Leurs valeurs dictent le temps que prendra la tension pour changer avec le niveau du signal. Vous pouvez calculer cela en utilisant la constante RC (c.-à-d. R * C - dans l'exemple ci-dessus, la constante RC est 1e-6 * 10e3 = 10 ms. La tension prendra environ 2,3 constante de temps pour chuter de 90% de sa valeur d'origine, donc dans l'exemple ci-dessus, si la tension commence à 1 V et que vous supprimez le signal, il sera tombé à 0,1 V environ 23 ms plus tard.

EDIT - d'accord, je pense avoir trouvé un problème majeur. Votre transistor S9012 est un transistor PNP (tout comme le S9015), vous avez besoin d'un transistor NPN pour ce circuit. Le S9014 est un transistor NPN, vous devrez donc utiliser celui-ci.

Les condensateurs marqués "104" sont presque certainement des condensateurs en céramique de 0,1 uF. La valeur (en pF) correspond aux 2 premiers chiffres suivis d'un nombre de zéros défini par le dernier nombre. Ainsi, pour 104, la valeur est de 10 + 4 zéros, soit 100 000pF. 100 000 pF est 100 nF ou 0,1 uF.

EDIT - Le fait de ne pas avoir de portée ou de multimètre rend la vie très difficile ici (vous devriez en saisir un ou les deux dès que vous le pouvez)
Cependant, il existe certains oscilloscopes de carte son PC de base qui pourraient être utilisés pour tester votre circuit électret / transistor. Visual Analyzer est un assez bon exemple:

Analyseur visuel

Si vous remplacez C2 (pas strictement nécessaire mais une bonne idée), vous devriez être en mesure d'introduire le signal directement dans le PC et d'observer dans le logiciel pour voir si le microphone et l'amplification fonctionnent correctement. Si votre PC a une ligne en cours d'utilisation, mais l'entrée microphone est généralement bonne pour jusqu'à 2V IIRC. Vous pouvez également tester l'électret directement - retirez simplement le bit du transistor et conservez R1 et C1, prenez le signal de l'autre côté de C1.
Notez que cette méthode ne testera pas les niveaux DC, seulement l'AC (en raison d'un capuchon de blocage DC dans l'entrée de la carte son) mais le signal AC (audio) est ce qui vous intéresse ici.

Si vous essayez cela, postez les captures d'écran afin que nous puissions avoir une idée de ce qui se passe.


3.3V et 5V ne sont pas liés. C'est la première fois que j'utilise ce logiciel - désolé. Je vais mettre mon code dans la question mais il n'y a rien qui puisse mal tourner avec. De plus, j'ai fait un projet aujourd'hui qui utilise une photorésistance et affiche la valeur sur six LED comme si je voulais que mon vu-mètre ressemble et j'ai testé la connexion série avec ça. Je n'ai ni oscilloscope ni multimètre. Le transistor a la légende "S9012 H 331", j'ai également ceux "S9014 C 331" et S9015.
Toast le

@Toast - voir modifier sur C2, supprimez-le et connectez-vous directement.
Oli Glaser

J'ai supprimé C2 et ajouté les parties comme Kristoffon l'a décrit dans sa réponse. Toujours les mêmes résultats.
Toast le

1
Si vous avez un potentiomètre ou une source de tension variable, vous pouvez appliquer une entrée 0-5V à l'entrée de l'ADC pour tester votre code, indépendamment de votre circuit d'entrée. Vous essayez de déboguer deux choses à la fois - isoler le circuit et vérifier son comportement à l'aide d'un oscilloscope et / ou isoler votre code et fournir une entrée prévisible mais variable pour valider votre code.
HikeOnPast

1
@OliGlaser Je suis confus par le circuit. L'électret est un microphone? Où va l'autre fil du microphone, GND ou VCC? Dois-je connecter 5 ou 3,3 V à ce circuit? Pourriez-vous s'il vous plaît supprimer les EDITblocs et les modifier de manière à ce qu'ils puissent être compris sans lire le fil de commentaires? Je suis également un débutant et je ne comprends pas comment le problème a été résolu et si je peux utiliser le circuit que vous avez affiché tel quel.
Tomáš Zato - Rétablir Monica

4

En supposant que votre circuit fonctionne, le signal audio est dans la plage des kHz tandis que l'Arduino a un ADC adapté aux niveaux DC. La composante continue de votre signal est nulle, c'est-à-dire qu'elle flotte sur une tension fixe. C'est cette tension fixe que votre ADC lit.

Pour résoudre ce problème, vous devez mettre une diode en série avec votre sortie connectée à l'ADC et à un condensateur et une résistance.

Le capuchon se charge jusqu'à la valeur de crête reçue tandis que la résistance décharge le capuchon lorsque le signal s'éteint.

--|>|---*---- adc
        *---- resistor -----*----ground
        \----- capacitor ---/

Edit: L'entrée ADC est en fait flottante car elle n'a aucun biais en raison du condensateur série. Si vous allez essayer ma solution, supprimez C2.


D'accord, j'ai ajouté cela au circuit et le signal sur le moniteur série est maintenant 458 (mais ne change toujours pas quand il y a du bruit).
Toast le

J'ai échangé le transistor de "S9012 H 331" à "S9014 C 331" et la valeur est 56.
Toast

1
L'Arduino ADC est capable d'échantillonner assez rapidement pour l'audio. Je ne les utilise pas, mais je pense que 10 kps (donc jusqu'à 5 kHz de bande passante) est possible avec les fonctions de la bibliothèque, ce qui est bien pour les trucs lo-fi (je suis presque sûr que l'ATMega réel peut échantillonner plus rapidement s'il est utilisé normalement)
Oli Glaser

@Toast - à quelle vitesse échantillonnez-vous? Si c'est très lentement, le détecteur de crête est une bonne idée. Vous pouvez cependant le faire dans le logiciel.
Oli Glaser

2
@Kristoffon - Pas avec un Arduino non, mais j'ai utilisé des micros 8 bits similaires (par exemple PIC16F, 18F, etc.) pour échantillonner et lire de l'audio plusieurs fois. 10ksps est facilement réalisable. Pour citer ce document AVR ADC :When using single-ended mode, the ADC bandwidth is limited by the ADC clock speed. Since one conversion takes 13 ADC clock cycles, a maximum ADC clock of 1 MHz means approximately 77k samples per second. This limits the bandwidth in single-ended mode to 38.5 kHz, according to the Nyquist sampling theorem.
Oli Glaser

4

Vos lectures de 1022, 1023 sont essentiellement à pleine échelle sur l'ADC de l'Arduino. En supposant que vous avez installé un condensateur série non défectueux comme indiqué dans votre schéma, ce niveau ne peut pas provenir du circuit de microphone que vous avez construit, car cela ne peut que coupler des tensions changeantes (c.-à-d. AC).

Par conséquent, je soupçonne que vous lisez le courant de fuite dans l'ATMEGA lui-même - vous obtiendriez probablement le même résultat sur n'importe quelle autre broche analogique (non connectée).

Essayez de créer un diviseur de tension très "léger" avec des résistances de haute valeur (entre 10K et 100K) et utilisez-le pour polariser l'entrée analogique à la moitié de la tension de référence (vous pouvez également utiliser un potentiomètre, ce qui vous donne une capacité de test supplémentaire). Ensuite, votre lecture sans entrée devrait être de l'ordre de 512.

Une fois que l'entrée ADC est correctement biaisée, vous pouvez commencer à essayer de voir si vous obtenez des variations. Vous sous-échantillonnez peut-être votre bande passante, ce qui signifie que vous obtiendrez un aliasing des composants haute fréquence, mais si tout ce que vous essayez de faire est d'estimer le volume global, cela ne devrait pas poser trop de problème.


Cela semble juste, je suppose que c'est surchargé. OP avez-vous pensé à connecter un petit haut-parleur pour déboguer cette ligne analogique de votre lecture. Quand j'ai fait un vu-mètre, j'ai pris les lignes d'une prise casque, directement dans l'AnalogRead et tracé le résultat.
Hellonearthis
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.