Sensore suono KY-038 (?) letture non soddisfacenti

Ciao,
ho un problema su un programma di cui sono all'inizio proprio.
Praticamente l'idea è di rilevare il volume del rumore ambientale e mostrarlo in una scala di led. Una cosa semplice, ma che mi serve per moderare la voce mentre faccio videoconferenze in covid.

Il problema è che sto usando un modulo sensore audio del mio primo set di sensori Arduino, un Elegoo Mega, questo: https://www.elegoo.com/product/elegoo-mega-2560-project-the-most-complete-starter-kit/
che però non specifica quale modulo di sensore audio sia inserito. A me sembra un KY-038, ma non sono abbastanza esperto da esserne sicuro.

Ho collegato il + a 5v di Arduino (mega o nano, ho provato con entrambi), G al ground di Arduino e A0 al pin A0 di Arduino.

Le letture che però ottengo non si discostano mai dal valore che viene impostato ruotando la vite che dovrebbe impostare la sensibilità del microfono (immagino sia un potenziometro).

Sia parlando piano che urlando arrivo ad ottenere uno scostamento minimo, da 350 passo magari a 355 o 357, e così a tutti i livelli di sensibilità.

Il codice è quanto di più banale si possa immaginare...

void setup() {
pinMode(A0, INPUT);
Serial.begin(9600);
}
void loop() {
int volume = analogRead(A0);
Serial.println (volume);
delay (500);
}

Il pin digitale del sensore non lo ho collegato ma ho lo stesso problema anche se lo collego, per esempio, al pin 9 e anche se lo leggo.

Sto sbagliando altro? Ho cercato in rete e il modulo dovrebbe già avere tutte le resistenze e i condensatori per filtrare i rumori e funzionare direttamente, ma ottengo un risultato molto diverso da quello dei video di Youtube. Praticamente nessun risultato...

Mi è venuto il dubbio che, semplicemente, sia di scarsissima qualità o addirittura fallato il modulo e che quindi sto perdendo tempo e devo semplicemente comprarne uno migliore. Nel caso sapreste consigliarmi?

Grazie in anticipo
Andrea

Non so se potrai riuscire nel tuo intento usando quel modulo. Intanto per capire di cosa stiamo parlando :

Praticamente l'uscita analogica è collegata direttamente alla capsula microfonica, quindi il segnale in uscita sarà inevitabilmente molto basso. Una cosa che puoi provare è mettere nel setup() un analogReference(INTERNAL); , usando un riferimento di tensione più basso (1,1 V circa contro i 5 V di default) i valori si alzeranno un pò, vedi se può essere sufficiente, altrimenti devi cambiare modulo.
(Ripensandoci non va bene e corri il rischio di danneggiare la scheda, a meno che tu non abbia un tester e prima di collegare l'A0 tari il trimmer per avere 0,5 V all'uscita)

Tieni conto che comunque l'uscita a 'vuoto' viene tenuta fissa dal potenziometro, quello che misuri sarà la variazione in entrambe le direzioni (+ e -).

Ciao, Ale.

A "vista" il modulo è proprio quello e penso quindi che anche lo schema da te riportato sia quello.
Quello che mi stupisce di quando uso il modulo è che il led montato dietro al trimmer rileva effettivamente il suono e si accende regolarmente e dipendendo dal suono che emetto.

Per testarlo in accoppiata con il movimento del trimmer ho usato un podcast su cellulare, aumentando e diminuendo il volume e allontanandolo e avvicinandolo al microfono.

I dati che però ricevo dal pin A0 sono poco coerenti con l'accensione del led, nel senso che a led spento oscillano di 1 o 2 punti (sempre indipendentemente dalla sensibilità che imposto sul trimmer, o sia con il trimmer che mi riporta un valore di base di 800 o di 300 si spostano COMUNQUE di 1 o 2 punti fino a 802 e a 302) ed è questa una cosa che non mi aspettavo.
Nel senso che se la sensibilità è più alta mi aspettavo escursioni maggiori.

A meno che l'escursione del sensore non sia logaritmica e io non mi stia posizionando con il trimmer "troppo in avanti" nella curva, nel qual caso l'escursione andrebbe a ridursi. Potrebbe essere? O sto dicendo cose assolutamente senza senso?

Hai provato a prelevare il segnale da "D0"?

andreacrocetti:
I dati che però ricevo dal pin A0 sono poco coerenti con l'accensione del led, nel senso che a led spento oscillano di 1 o 2 punti

Eh, si, provo a spiegare qualcosa, anche se nei miei limiti. Se vedi lo schema, il LED è a valle di due operazionali (LM393), mentre A0, come ha detto correttamente anche ilguargua, è di fatto l'uscita diretta dalla capsula. Il segnale dal microfono non è ovviamente un segnale TTL (tra 0 e 5V) ma una piccola forma d'onda di qualche mV che va da valori negativi a positivi. Il primo operazionale quindi "confronta" il segnale con un riferimento dato dal partitore (le due resistenze da 100k) e ne dà la "differenza". Il trimmer serve per "centrare" il segnale e quindi avere la giusta variabilità del valore in uscita in base alla soglia voluta.

Se a te basta avere l'informazione che il suono rilevato supera la soglia, usa l'uscita D0 portandola su un pin digitale, che diventerà HIGH quando il suono è alto (e che corrisponde sostanzialmente al LED che vedi accendersi). Se invece vuoi anche misurare l'intensità per stabilirne la soglia, non ti basta questo modulino perché, come detto, l'uscita dalla capusla microfonica è di pochi millivolt.

roberto1155:
Hai provato a prelevare il segnale da "D0"?

Il segnale da D0 è un segnale "digitale" che indica il superamento o meno di una soglia, quindi LOW o HIGH ...
... se a lui interessa il valore "analogico" del segnale con D0 NON ci fa nulla, se invece gli basta sapere quando un segnale ha superato una certa ampiezza allora lo può usare.

La stessa cosa l'ha ben spiegata docdoc qui sopra ... :slight_smile:

Guglielmo

Sì: quel circuito è un comparatore che amplifica enormemente il segnale (l'operazionale non è controreazionato, perciò guadagna svariate decine di dB) e da in uscita un'onda quadra che segue il segnale in ingresso.

Per un'applicazione del genere, invece, devi amplificare e raddrizzare il segnale del microfono e usare Arduino solo per pilotare i LED in funzione del livello in ingresso. I livelli a cui si accenderanno i LED dovranno essere in progressione geometrica, per avere una rappresentazione logaritmica del segnale, ad esempio:
1, 2, 3, 5, 7, 10, 15, 22, 33, 50, 70, 100, 150, 220, 330, 500, 700, 1000.
Potresti anche seguire la serie E6 delle resistenze:
1, 2, 3, 5, 7, 10, 15, 22, 33, 47, 68, 100, 150, 220, 330, 470, 680, 1000.
:slight_smile:

Devi usare un modulo come questo, che raddrizza il segnale e fornisce in uscita una tensione continua, variabile in funzione del livello del suono:
analog-sound-sensor-microphone-module-for-arduino

Grazie veramente a tutti, praticamente ho raggiunto già il mio scopo, comprendendo di più come funziona il tutto.

Il segnale digitale riesco a prenderlo correttamente, ma effettivamente non è quanto mi serve per il progetto. O meglio, in realtà potrebbe andare anche bene, perché a me interessa solo sapere di non stare urlando nel microfono quando tengo lezione e sono in cuffia, di conseguenza potrei utilizzare un led o un buzzer per avvertirmi al superamento della soglia di accettabilità del tono di voce.

Se invece mi bastasse il led, posso semplicemente collegare direttamente il modulo a una sorgente a 5v e il led montato sopra già fa l'uso che serve... senza scomodare un Arduino, o sbaglio?

Comunque adesso vado a vedermi il modulo suggerito da Datman per evolvere un po' in futuro.

Grazie ancora
Andrea

Datman:
Devi usare un modulo come questo, che raddrizza il segnale e fornisce in uscita una tensione continua, variabile in funzione del livello del suono:
analog-sound-sensor-microphone-module-for-arduino

Ho capito bene se dico che potrebbe essere anche un modulo tipo questo?
https://www.dfrobot.com/product-83.html

di cui allego schema

DFR0034SCH V2.0.pdf (36 KB)

Deve avere il raddrizzatore (in realtà, anche per quello che ti ho segnalato non posso garantire...). Comunque, credo proprio che ti convenga cercarlo già fatto con un operazionale e un apposito LM3915.

Datman:
Deve avere il raddrizzatore ...

Scusa, ma per fare cosa? Non capisco ...non usa mica un'alimentazione differenziale con tensioni sopra e sotto il GND ... Il segnale è compreso tra GND e +5V quindi il diodo a che serve ?

>andreacrocetti: SI, secondo me quel sensore va bene e ci sono anche vari esempi d'uso sia con Arduino che con Raspberry ... :slight_smile: Guardati il WiKi dove c'è proprio l'esempio di ciò che vuoi fare tu ... :wink:

Guglielmo

Il raddrizzatore, il condensatore e la resistenza che lo seguono servono per avere una tensione che segue l'inviluppo del segnale, altrimenti misuri valori casuali che dipendono dal valore istantaneo del segnale! Ad esempio, già se fosse un segnale sinusoidale, il valore misurato varierebbe continuamente alla frequenza del segnale stesso!

... gli esempi che danno sembrano funzionare stando al loro WiKi ... dagli un'occhiata ... ::slight_smile:

Comunque, al massimo, deve aggiungere una manciata di componenti, ma quel sensore va più che bene.

Guglielmo

Controlla se può fare il caso tuo -> 24. Arduino microfono e indicatore led - PROGETTI ARDUINO

roberto1155:
Controlla se può fare il caso tuo -> 24. Arduino microfono e indicatore led - PROGETTI ARDUINO

... usa il solito microfono di pessima qualità, NON amplificato, che da i risultati che abbiamo già visto.

Guglielmo

@gp01 → lui dice “Praticamente l’idea è di rilevare il volume del rumore ambientale e mostrarlo in una scala di led. Una cosa semplice, ma che mi serve per moderare la voce”

L'ideale sarebbe il semplice kit LX 852 di Nuova Elettronica (riv.119): Spilla elettronica da discoteca...

roberto1155:
@gp01 -> lui dice "Praticamente l'idea è di rilevare il volume del rumore ambientale e mostrarlo in una scala di led.

Esatto e ... con quella "ciofeca" di microfono hai una risoluzione talmente bassa (non essendo amplificato) che viene una "bojata". Serve un microfono ampilficato che dia un buon segnale!

Guglielmo

Datman:
L’ideale sarebbe il semplice kit LX 852 di Nuova Elettronica (riv.119): Spilla elettronica da discoteca…

… ehhhhh … i kit di NE … bei tempi quelli … :smiley:

Guglielmo