VU meter Arduino

Ciao a tutti, vorrei riuscire a misurare il livello audio di un' uscita cuffia di un qualsiasi lettore mp3 (va bene anche l'uscita cuffie di un pc), su internet ho trovato molti tutorial, alcuni corredati da video, che sembrano funzionare egregiamente. Il mio problema è che collegando l'uscita cuffie ad Arduino (seguendo le indicazioni dei vari tutorial), i valori che osservo sul monitor seriale sembrano completamente slegati dall'audio: metto il volume al minino o al massimo o disinserisco il jack audio osservo che i valori variano in modo (apparentemente) casuale. E' logico aspettarsi valori prossimi allo 0 se il file audio in riproduzione viene messo in pausa oppure se il volume viene posto al minimo? E' giusto pensare che se il volume è al massimo dovrei visualizzare sempre dei valori elevati (inferiori a 1023)?

Avete indicazioni?

Grazie in anticipo!!!

gabriele.

E "come" hai fatto questi collegamenti? Che circuito stai usando? Che sketch stai usando?

Senza dare informazioni sul progetto mica possiamo aiutarti..

PS: i titoli tutto in maiuscolo non vanno bene ;)

Ciao, anzi tutto grazie per la risposta, purtroppo non mi è stato possibile disegnare lo schema circuitale ma i collegamenti sono estremamente semplici: il jack audio (femmina) è collegato al pin GND e per mezzo di una resistenza (ho provato con diversi valori da 1 a 100 Kohm ) al pin ANALOG INPUT 0 (A0). Il codice è il seguente:

int ingressoAudio= 0;

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

void loop() {
  ingressoAudio = analogRead(0);
        Delay(100);
    Serial.println(ingressoAudio);

}

il risultato è che i valori che osservo dal monitor seriale sembrano "slegati" dall'andamento del file audio e se stacco il jack audio continuo a visualizzare ancora dei valori (quando mi aspetterei 0).

Spero che la mia descrizione sia stata abbastanza chiara, anche in assenza di uno schema.

Vi ringrazio tutti anticipatamente!!!!

Un pin di ingresso Analogico è un pin ad alta impedenza e ... se lo lasci staccato ... capta pure il volare di una mosca ... :grin:

Io proverei mettendo una resistenza (... cercala empiricamente) tra il pin Analogico e la massa ... ;)

Guglielmo

Ma il voltaggio di un'uscita audio non è nell'ordine di 1V?

dab77: Ma il voltaggio di un'uscita audio non è nell'ordine di 1V?

Quella è una cosa che risolviamo in un secondo tempo cambiando la tensione di riferimento del ADC ... adesso vediamo se ottiene delle letture abbastanza stabili e congrue ... anche se con valori bassi ;)

Guglielmo

Possibilità:
il jack è stereo (massa, ring e tip), magari invece di misurare tra massa e tip (Left, o ring-Right) stai misurando tra Left e Right, ovvero tra ring e tip?

Grazie per le immediate risposte, inserendo un resistore sul collegamento verso GND i valori hanno un andamento più "naturale" ovvero se interrompo la riproduzione del file audio o azzero il volume i valori scendono, dopo qualche secondo, a 0. Per quanto riguarda il jack ne sto usando uno STEREO. Tra quali terminali sarebbe più corretto misurare il segnale?

Grazie anticipatamente!!

n.b. al momento sto usando due resistori da 1 Kohm.

Già che ci sei, visto che è stereo, leggi entrambi i canali, su 2 pin analogici.
Se sono riuscito a mettere l’immagine devi collegare la massa audio e quella arduinica insieme, senza resistenze, e poi il sinistro con una resistenza da 10k o anche più a massa e (prima della resistenza) ad un pin analogico. La stessa figura ripetuta per il canale destro su un altro pin analogico.
Conta che visto il basso voltaggio avrai letture da 0 a circa 200 a volume massimo.

jack.GIF

..non so quanto dura il frame di campionamento dell'ADC di Arduino.. e non so questo quanto possa pesare sulla lettura del solo volume del segnale audio. Magari qualcuno con più conoscenze sa suggerire se bisogna (ipotizzo) aggiungere un piccolo condensatore per "ammorbidire" la lettura...

Grazie mille!!! Domani provo e vi faccio sapere!

Ma il segnale audio non é un segnale in alternata e mettendo il centrale a massa non do anche tensioni negative all pin di entrata? e rischio di rompere l' Arduino? Ciao Uwe

guarda, se vedi in giro la maggior parte delle persone non mette neanche una resistenza sugli ingressi analogici…
tipo QUI.
Non dico che sia giusto, però, probabilmente se la resistenza è troppo grande non passa abbastanza corrente da far “modulare” i convertitori…
altri ti sapranno dire.

Come segnala giustamente Uwe, occorre tenere conto che stiamo parlando di un segnale sinusoidale ...

Per fare una cosa fatta bene il segnale andrebbe fatto entrare tramite un diodo e, tra l'analog-input e GND andrebbe messa la resistenza ed un condensatore.

Basta fare una ricerca su Google per "Analog VU Meter" per trovare un'infinità di schemi ... ;)

Per alzare la risoluzione di Arduino, dato il segnale piuttosto basso che si deve trattare, come ho già segnalato, occorre poi cambiare il riferimento con analogReference().

Guglielmo

Dato che stiamo parlando di segnali di piccolo livello, un diodo in serie potrebbe "tagliartene via" una parte (gli 0.7V di caduta del diodo stesso) ... meglio in quel caso usare un diodo in parallelo, fra pin e GND, catodo sul pin, cosi tagli a massa la parte negativa ... (meglio ancora se si riesce a ricuperare un paio di vecchi diodi al germanio, ma anche degli 1N4148 vanno bene ...

Un'altra cosa da considerare, se misuri un'uscita cuffie, e' che in genere sono previste per impedenze di cuffia da 100 ohm a circa 1K, non per gli 8 ohm degli altoparlanti, quindi non usate resistenze troppo basse (ma neppure troppo alte) ... inoltre, non sapendo com'e' il circuito di uscita, non sai se sovrappone della continua al segnale (ma se e' fatto in modo appena decente, non dovrebbe, quindi per ora ignoriamo questa parte) ... prova cosi, 100 ohm fra segnale e pin, 1K con in parallelo 10nF ed un 1N4148 (catodo verso il pin) fra pin e massa ... e settare il riferimento dell'ADC con i 3,3V o con quello interno da circa 1V ...

Se decidi di utilizzare i led al posto dell'LCD ti consiglio l'ULN2803 come driver di pilotaggio. Esiste infatti un limite massimo di corrente erogabile per singolo pin, per gruppo di pin e per l'intero Arduino. Se, come in alcuni progetti, colleghi tutti i led alle uscite di Arduino (ne ho visti anche senza resistenze :astonished:) è possibile che l'ATmega328 si bruci per eccessivo passaggio di corrente.

@ete belle considerazioni.

Per i LED, se non hai un driver per LED, puoi: A- prenderlo... B-usare dei transistor e un'alimentazione esterna per comandarli. C-intanto per sperimentare li attacchi sempre tramite resistenza ad Arduino, ma anzichè accenderli tutti insieme, accendi solo quello riferito al livello di volume in ingresso.