mercoledì 8 giugno 2011

Arduino: leggere i valori dal microfono

Il microfono è stato uno dei primi trasduttori inventati dall'uomo, la pressione delle onde sonore che impatta sulla superficie del microfono viene trasformata in un segnale elettrico. Se avete una vecchia radio oppure un telefono cellulare da rottamare potete procurarvi un piccolo microfono a capsula! Possiamo provarne il funzionamento misurandone la resistenza interna con un multimetro, soffiando oppure parlando nel microfono la sua resistenza interna aumenterà. Il segnale generato dal microfono risulta debole e va quindi amplificato prima di poterne apprezzare i valori con Arduino. Nel datasheet del circuito integrato LM386 ho trovato lo schema di un semplice amplificatore:


Se vogliamo utilizzare questo circuito per leggere il segnale generato da un microfono dobbiamo usare l'uscita Vout del condensatore C3 come pin di ingresso per la nostra scheda Arduino. In fase di realizzazione, per favorire il setup del circuito, ho sostituito i resistori R1 ed R2 con due resistori variabili. Il condensatore C2 permette di ottenere un guadagno pari a 200 (se omesso il guadagno scende a 20).


Il led sul pin numero 13 (variabile LED) si accenderà non appena il segnale generato dal microfono supera un valore limite (variabile NOISE_MARGIN). Il segnale di input generato dal microfono (la sua versione amplificata) è mappato sul pin (analogico) numero 0 (variabile MIC) ed è aggiornato ogni 20ms circa (variabile SAMPLING). La frequenza di campionamento e la soglia minima di rumore possono essere modificate solo all'interno del codice sorgente che trovate qui. Alcune regolazioni in fase di setup possono essere fatte attraverso i resistori R1 ed R2 che regolano il volume in ingresso.
int MIC=0;
int LED=13;
int NOISE_MARGIN=489;
int SAMPLING=10;

int value=0;

void setup() {
pinMode(MIC,INPUT);
pinMode(LED,OUTPUT);
Serial.begin(9600);
}

void loop() {
value=analogRead(MIC);
if(value>NOISE_MARGIN) digitalWrite(LED,HIGH);
else digitalWrite(LED,LOW);
Serial.println(value);
delay(SAMPLING);
}
Spero di aver disegnato bene lo sketch per Arduino, se avete problemi scrivete. Ecco un video del circuito in funzione:

8 commenti:

  1. Possibile che su RS-online non trovi i condensatori da 0.01nF?

    RispondiElimina
  2. ciao, ho provato il tuo circuito ma non mi funziona, il microfono non legge niente e il monitor seriale restituisce un valore costante, forse qualche errore nello schema? e il microfono, ovvero il pin positivo, deve essere alimentato?

    RispondiElimina
  3. Lo schema è corretto, al microfono è applicata una tensione di 5V. La variazione della resistenza causata dal rumore percepito dal microfono viene amplificata dal circuito integrato LM386. Appena posso eseguo nuovamente questo sketch su Arduino ;)

    RispondiElimina
  4. è possibile avere la lista componenti per realizzare questo circuito?

    RispondiElimina
    Risposte
    1. Nella prima figura sono riportati tutti i componenti coni rispettivi valori da utilizzare ;)

      Elimina
  5. Ciao, sto provando a realizzare questo circuito, ma ho un dubbio, sullo schema fatto con fritzing c'è un trimmer in parallelo al microfono, da quanto è? oppure è l'altro che non è presente nello schema elettrico? grazie

    RispondiElimina
  6. Il primo trigger ha una resistenza massima di 100K, il secondo trigger invece sostituisce il secondo resistore ed ha una resistenza massima di 10K.

    RispondiElimina