Utilizzo di un microfono con un Arduino


18

EDIT : Sto indagando su questo problema da un po 'di tempo. Risulta essere un progetto molto più difficile di quanto pensassi e non qualcosa per i principianti. Ciò richiede hardware costoso (microfono e amplificatore) e alcune sofisticate analisi audio sul microcontrollore. Anche un microfono completo con circuito amplificatore non fornisce i risultati desiderati (secondo i commenti su questo prodotto)


Sono completamente nuovo su Arduino (ma ho familiarità con la programmazione). Per costruire un misuratore VU , voglio mettere un microfono sul pin analogico 0 di Arduino e visualizzare il valore tramite la connessione seriale.

Ho cercato su Google e ho trovato questo circuito:

Preamplificatore audio semplice

... e ho provato a costruirlo con questo risultato:

(Ora sto usando il circuito suggerito da Oli Glaser nella sua risposta)

I valori sul monitor seriale non cambiano a seconda del volume della musica.

Qual è il modo più semplice per misurare il volume sull'ingresso analogico di Arduino?

Inoltre, ho un TDA2822M , ma non so se sia utile per questo progetto. La didascalia sul microfono indica XF-18D .

Modifica: il mio codice arduino:

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

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

L'uscita seriale: 1023 1022 1022 1022 1022 1023 1022 e così via

Come posso verificare se il microfono funziona? È direzionale?

Modifica: ora sto usando un transistor S9014. L'ADC e la connessione seriale funzionano (li ho testati con un potenziometro).

L'uscita seriale è ora di circa 57.

Inoltre, non ho un multimetro o un oscilloscopio. Adesso ho un multimetro.


Hai verificato con un ambito che puoi vedere una forma d'onda audio all'uscita del tuo circuito?
HikeOnPast,

Whoa, perché i pin 3V3 e 5V sono in corto nello schema? Potrebbe essere un problema.
Connor Wolf,

No, non ho disegnato lo schema correttamente.
Brindisi il

Risposte:


14

Il modo "più semplice" è semplicemente applicare il segnale e campionare con l'ADC. Memorizza i risultati in un buffer, quindi visualizzali come desiderato (nel tuo caso invia al PC tramite RS232)
Se desideri il livello RMS del segnale, dovrai calcolarlo ad un certo punto, prima di inviarlo al PC o successivamente.

Il circuito di amplificazione come mostrato non è l'ideale, ma dovrebbe funzionare ragionevolmente per un misuratore VU di base. EDIT - Ho appena notato C2, rimuoverlo poiché bloccherà la polarizzazione DC dal transistor e il segnale oscillerà sotto terra.

EDIT: ecco un circuito migliore per il transistor amplificatore:

Amplificatore elettrete

Questo non dovrebbe interessare troppo al transistor utilizzato, il bias di uscita dovrebbe essere di circa 2,5 V.
I valori esatti per il divisore di input (R3 e R4) non sono troppo importanti, è il rapporto di 1: 4 che lo è di più. Quindi puoi usare ad esempio 400k e 100k, oppure 40k e 10k, ecc. (Cerca di non andare sopra o sotto questi rispettivi valori). C2 dovrebbe essere> 10uF. C1 dovrebbe essere> 1uF (sostituisce C1 nello schema)
R1 e R2 devono tuttavia essere questi valori.
Tutto ciò che serve è l'elettrete con la sua resistenza di polarizzazione (R1 nello schema)

Un punto di preoccupazione è che le linee Arduino 3.3V e 5V sembrano essere collegate tra loro - suppongo che questo sia un errore schematico, ma se questo è il caso nel circuito reale non funzionerà e potrebbe danneggiare qualcosa.
Per individuare i problemi sarebbe utile vedere il tuo codice e quello che stai vedendo sul lato PC. Inoltre quale transistor stai usando?

Se si dispone di un oscilloscopio, è possibile verificare se il microfono / transistor funziona correttamente. In caso contrario, è possibile utilizzare un multimetro per eseguire altri test di base (ad es. Confermare + 5 V presente, confermare la base del transistor è a ~ 0,6 V, test collector per assicurarsi che non sia bloccato a + 5 V o terra senza segnale presente)

Inoltre, è necessario assicurarsi che RS232 funzioni correttamente, quindi scrivere un codice semplice per inviare alcuni valori di test sarebbe una buona idea.

Se riesci a fornire le informazioni richieste e facci sapere quali strumenti hai a disposizione è possibile fornire un aiuto più specifico.

EDIT - se stai campionando così lentamente, avrai bisogno di un circuito di rilevamento picco come questo:

Peak Detect

Inseriresti questo circuito tra il transistor e il pin Arduino (meno C2)

Il diodo può essere praticamente qualsiasi diodo. I valori di protezione e resistenza sono solo indicativi, possono essere leggermente modificati. I loro valori determinano quanto tempo impiegherà la tensione a cambiare con il livello del segnale. Puoi calcolarlo usando la costante RC (cioè R * C - nell'esempio precedente, la costante RC è 1e-6 * 10e3 = 10ms. La tensione impiegherà circa 2,3 volte la costante temporale a scendere del 90% del suo valore originale, quindi nell'esempio sopra se la tensione inizia a 1 V e si rimuove il segnale, esso sarà sceso a 0,1 V circa 23 ms più tardi.

EDIT - okay, penso di aver trovato un grosso problema. Il transistor S9012 è un transistor PNP (come lo è l'S9015), per questo circuito è necessario un transistor NPN. L' S9014 è un transistor NPN, quindi dovrai utilizzarlo.

I condensatori contrassegnati con "104" sono quasi certamente condensatori ceramici da 0,1 uF. Il valore (in pF) sono i primi 2 numeri seguiti da un numero di zeri impostati dall'ultimo numero. Quindi per 104, il valore è 10 + 4 zeri o 100.000 pF. 100.000pF è 100nF o 0.1uF.

EDIT - Non avere un ambito o un multimetro rende la vita molto difficile qui (dovresti procurartene uno o entrambi il prima possibile)
Tuttavia, ci sono alcuni oscilloscopi di base per schede audio per PC che potrebbero essere utilizzati per testare il tuo circuito elettrete / transistor. Visual Analyzer è un buon esempio:

Visual Analyzer

Se si sostituisce C2 (non strettamente necessario ma una buona idea), si dovrebbe essere in grado di inviare il segnale direttamente al PC e osservare nel software per vedere se il microfono e l'amplificazione funzionano correttamente. Se il tuo PC ha una linea in uso, ma l'ingresso del microfono è in genere buono fino a 2 V IIRC. Potresti anche testare direttamente l'elettro - basta rimuovere il bit del transistor e mantenere R1 e C1, prendere il segnale dall'altro lato di C1.
Si noti che questo metodo non testerà i livelli CC, ma solo l'AC (a causa di un cappuccio di blocco CC nell'ingresso souncard) ma il segnale AC (audio) è ciò che ti interessa qui.

Se provi questo, pubblica le schermate in modo che possiamo avere un'idea di ciò che sta accadendo.


3.3V e 5V non sono legati insieme. È la prima volta che utilizzo questo software - scusa. Metterò il mio codice nella domanda ma non c'è nulla che possa andare storto. Inoltre, oggi ho realizzato un progetto che utilizza un fotoresistenza e visualizza il valore su sei led come se volessi che il mio misuratore di vu fosse simile e ho testato la connessione seriale con quello. Non ho né un oscilloscopio né un multimetro. Il transistor ha la didascalia "S9012 H 331" Ho anche "S9014 C 331" e S9015.
Brindisi del

@Toast - vedi modifica su C2, rimuovilo e connettiti direttamente.
Oli Glaser,

Ho rimosso C2 e aggiunto le parti come descritto da Kristoffon nella sua risposta. Sempre gli stessi risultati.
Brindisi il

1
Se si dispone di un potenziometro o di una sorgente di tensione variabile, è possibile applicare un ingresso 0-5 V all'ingresso dell'ADC per testare il proprio codice, indipendentemente dal circuito di ingresso. Stai cercando di eseguire il debug di due cose contemporaneamente: isolare il circuito e verificarne il comportamento utilizzando un oscilloscopio e / o isolare il codice e fornire un input prevedibile ma variabile per convalidare il codice.
HikeOnPast

1
@OliGlaser Sono confuso dal circuito. L '"elettrete" è un microfono? Dove va l'altro filo del microfono, GND o VCC? Collego 5 o 3,3 V a quel circuito? Potresti in qualche modo rimuovere i EDITblocchi e modificarlo in modo che possa essere compreso senza leggere il thread dei commenti? Sono anche un principiante e non capisco come sia stato risolto il problema e se posso usare il circuito che hai pubblicato così com'è.
Tomáš Zato - Ripristina Monica

4

Supponendo che il circuito funzioni, il segnale audio è nell'intervallo kHz mentre l'Arduino ha un ADC adatto ai livelli CC. Il componente DC sul segnale è zero, vale a dire che galleggia su una tensione fissa. È quella tensione fissa che sta leggendo il tuo ADC.

Per risolvere il problema, metterebbe un diodo in serie con l'uscita collegata all'ADC e a un condensatore e un resistore.

Il tappo si carica al valore di picco ricevuto mentre il resistore scarica il tappo quando il segnale si spegne.

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

Modifica: l'ingresso ADC è in realtà fluttuante in quanto non presenta alcun bias a causa del condensatore serie. Se hai intenzione di provare la mia soluzione, elimina C2.


Ok, l'ho aggiunto al circuito e il segnale sul monitor seriale ora è 458 (ma non cambia ancora quando c'è rumore).
Brindisi

Ho scambiato il transistor da "S9012 H 331" a "S9014 C 331" e il valore è 56.
Brindisi il

1
Arduino ADC è in grado di campionare abbastanza velocemente per l'audio. Non li uso, ma penso che 10ksps (quindi fino a 5kHz di larghezza di banda) sia possibile con le funzioni di libreria, il che va bene per roba lo-fi (sono abbastanza sicuro che l'ATMega reale possa campionare più velocemente se usato normalmente)
Oli Glaser,

@Toast: quanto velocemente stai campionando? Se è molto lento, il rilevatore di picco è una buona idea. Puoi farlo nel software però.
Oli Glaser,

2
@Kristoffon - Non con un Arduino no, ma ho usato simili micros a 8 bit (ad esempio PIC16F, 18F, ecc.) Per campionare e riprodurre l'audio molte volte. 10ksps è facilmente realizzabile. Per citare questo documento 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

Le tue letture di 1022, 1023 sono sostanzialmente in scala reale sull'ADC dell'Arduino. Supponendo che tu abbia installato un condensatore in serie non difettoso, come mostrato nel diagramma, questo livello non può provenire dal circuito del microfono che hai costruito, dal momento che può solo accoppiare le tensioni variabili (cioè, AC).

Di conseguenza, sospetto che tu stia leggendo la corrente di dispersione all'interno dello stesso ATMEGA - probabilmente otterrai lo stesso risultato su uno qualsiasi degli altri pin analogici (non collegati).

Prova a creare un partitore di tensione molto "leggero" con alcuni resistori di alto valore (tra 10K e 100K) e usalo per polarizzare l'ingresso analogico a metà della tensione di riferimento (potresti anche usare un potenziometro, che ti offre una capacità di test extra). Quindi la tua lettura senza input dovrebbe essere nelle vicinanze di 512.

Una volta che l'ingresso ADC è opportunamente distorto, è possibile iniziare a lavorare cercando di vedere se si ottiene una variazione attraverso di esso. Potresti sottocampionare un po 'la tua larghezza di banda, il che significa che otterrai aliasing di componenti ad alta frequenza, ma se tutto ciò che stai cercando di fare è stimare il volume complessivo che non dovrebbe essere un problema.


Sembra giusto, immagino sia sovraccarico. OP hai pensato di collegare un piccolo altoparlante per eseguire il debug di quella linea analogica durante la lettura. Quando ho realizzato un vu meter ho preso le linee da un jack per cuffie, praticamente direttamente nell'AnalRead e ho tracciato il risultato.
Hellonearthis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.