Errata lettura sensore microfono

Buonasera,

sono nuovo nel forum e nell’uso di arduino. Sto realizzando un progetto utilizzando l’High_sensitive Voice sensor della SunFounder e un arduino uno. Voglio leggere i valori analogici del mio sensore con relativo cambio di intensità in base agli stimoli esterni ma leggo sempre lo stesso valore. Il codice che ho scritto è il seguente:

int soundSensorPin=A0;
int soundReading=0;

void setup()
{
//pinMode(soundSensorPin, INPUT);
Serial.begin(9600);
Serial.println(“Tempo Valori”);
Serial.flush();
for (int t=0; t <= 300; t++){
Serial.print(t);
Serial.print(" ");
soundReading=analogRead(soundSensorPin);
Serial.println(soundReading);
delay(1000);
}
}

void loop()
{
}

Ma non riesco a capire quale sia la falla nel progetto.

Prima di tutto, nella sezione in lingua Inglese si può scrivere SOLO in Inglese … quindi, per favore, la prossima volta presta più attenzione …
… poi, essendo questo il tuo primo post, nel rispetto del regolamento, ti chiedo di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il su citato REGOLAMENTO, infine, ti ricordo che in conformità al suddetto regolamento, punto 7, devi editare il tuo post (in basso a destra del post, bottone More → Modify) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).

Grazie.

Guglielmo

P.S.: Il tuo post è stato spostato nell’opportuna sezione del forum “Italiano”

Metti un link a sto coso. Sul sito www.sunfounder.com non trovo nulla. Che hai comprato ? Manco San Google trova qualcosa.

Forse è questo:

https://www.sunfounder.com/sound-sensor-module.html

Scusate per gli errori, cerco si rimediare:

-Il sensore in questione è questo:
https://tkkrlab.nl/wiki/Arduino_KY-037_Sensitive_microphone_sensor_module

-Le righe di codice le edito in conformità al regolamento:

int soundSensorPin=A0;
int soundReading=0;

void setup()
{
  //pinMode(soundSensorPin, INPUT);
  Serial.begin(9600);
  Serial.println("Tempo  Valori");
  Serial.flush();
  for (int t=0; t <= 300; t++){
    Serial.print(t);
    Serial.print("      ");
    soundReading=analogRead(soundSensorPin);
    Serial.println(soundReading);
    delay(1000);
  }
}

void loop()
{
}

Il serial flush sono abbastanza certo si possa eliminare, ma mi spieghi perché hai commentato il pinMode? Decommentalo (leva //) e vedi che succede!

aster94: ... NO, lo ha commentato perché, per il codice che ha scritto, è giusto che NON ci sia ! Non vedi che quel pin lo utilizza con una analogRead() ?

E' vero invece che quella Serial.flush() è del tutto initile ed usata senza alcuno scopo.

Guglielmo

Gervax: ... mah, sinceramente io dubito che tu riesca a leggere qualche cosa da quel sensore microfonico. La foto mostra poco, ma non mi sembra di vedere amplificatori microfonici a bordo e ... quei microfoni generano normalmente un segnale così debole che è veramente difficile fare delle misure significative senza amplificarli.

Diverso dovrebbe essere il caso dell'uscita digitale che è normalmente prelevata da un comparatore che ti da un segnale digitale a seconda se rilevi un segnale inferiore o superiore ad una soglia che dovresti poter impostare con un trimmer.

Se proprio vuoi continuare a vedere se esce qualche cosa dal pin analogico ... prova a cambiare il riferimento del ADC utilizzando il riferimento interno (... utilizzando la analogReference(INTERNAL)) così da portare il range di misura da 0 a circa 1.1V ... ::)

Guglielmo

Opsss non ci avevo fatto caso, scusa Gervax!

gpb01:

Gervax: ... mah, sinceramente io dubito che tu riesca a leggere qualche cosa da quel sensore microfonico. La foto mostra poco, ma non mi sembra di vedere amplificatori microfonici a bordo e ... quei microfoni generano normalmente un segnale così debole che è veramente difficile fare delle misure significative senza amplificarli.

Diverso dovrebbe essere il caso dell'uscita digitale che è normalmente prelevata da un comparatore che ti da un segnale digitale a seconda se rilevi un segnale inferiore o superiore ad una soglia che dovresti poter impostare con un trimmer.

Se proprio vuoi continuare a vedere se esce qualche cosa dal pin analogico ... prova a cambiare il riferimento del ADC utilizzando il riferimento interno (... utilizzando la analogReference(INTERNAL)) così da portare il range di misura da 0 a circa 1.1V ... ::)

Guglielmo

Ciao Guglielmo, grazie per la dritta ma neppure così sono riuscito ad ottenere buoni risultati. Da quanto ho capito quindi il problema di mancanza di informazione è causato da un segnale debole, quindi per ovviare a ciò potrei pensare di inserire un OpAmp in modo da amplificare il segnale o neanche questo espediente può aiutarmi? Ti spiego, vorrei visualizzare dei picchi se ad esempio urlo nel microfono, anzi mi servirebbe anche una buona sensibilità per valutare anche livelli di intensità minori di un caso estremo come l'urlo.

Dovresti vedere che tipo di capsula microfonica monta e cercare uno schema di un amplificatore microfonico da inserire tra l'uscita del microfono ed Arduino considerando che ... i pin in ingresso di Arduino accettano SOLO tensioni positive, quindi ... occhio con la sinusoide amplificata ... la devi traslare in modo che non scenda mai sotto GND.

Guglielmo

Giuglielmo, secondo me su quella schedina é monatato in amplificatore operazionale; sulla foto vedi 3 piedini e il resto é nascosto dietro il potenziometro. Poi di com'é il circuito é un altro paio di maniche. Ciao Uwe

uwefed: Giuglielmo, secondo me su quella schedina é monatato in amplificatore operazionale; sulla foto vedi 3 piedini e il resto é nascosto dietro il potenziometro. Poi di com'é il circuito é un altro paio di maniche.

Certo che c'è montato ;) ... per fare da comparatore e pilotare l'uscita digitale ... e con il trimmer regoli la soglia, ma NON ha nulla a che vedere con l'uscita analogica.

Guglielmo

Giuglielmo Ti do ragione. Senza schema rimane sempre un incertezza riguardante il funzionamento. Suppongo che ci sia sia un amplificatore a guadagno fisso che un comparatore il cui intervento puó essere tarato col potenziometro e che agisce sul uscita digitale.

Ciao Uwe

uwefed:
Guglielmo Ti do ragione …

:smiley: … Grazie

Non ho quella, ma ne ho altre SIMILI (Vcc, GND, D0, A0) e … sono fatte tutte così :wink:

Guglielmo

Quello è un modulo Keyes KY-038 da un euro dalla Cina. C’è un LM394 e il trimmer serve per alzare o abbassare il livello per cui scatta il segnale digitale. Le versioni a 3 pin hanno solo l’uscita digitale mentre quelle a 4 hanno anche l’uscita analogica amplificata… male.
L’ho usato, devi collegare massa e 5V e il piedino AO (Analog Output) va al piedino A0 (A zero) dell’Arduino o a un altro piedino analogico.
Poi carica l’esempio AnalogReadSerial, metti la velocità della seriale a 115200 e carica quello sketch.

Ma, ripeto, questa board a me ha dato risultati pessimi, il livello era sempre troppo basso. In rete ci sono dei progettini migliori e su ebay c’è un preamplificatorino da un euro che però non ha lo shift in tensione. Io banalmente ho messo un diodo perché non dovevo registrare ma non è una bella soluzione.

zoomx:
Quello è un modulo Keyes KY-038 da un euro dalla Cina. C’è un LM394 e il trimmer serve per alzare o abbassare il livello per cui scatta il segnale digitale. Le versioni a 3 pin hanno solo l’uscita digitale mentre quelle a 4 hanno anche l’uscita analogica amplificata… male.
L’ho usato, devi collegare massa e 5V e il piedino AO (Analog Output) va al piedino A0 (A zero) dell’Arduino o a un altro piedino analogico.
Poi carica l’esempio AnalogReadSerial, metti la velocità della seriale a 115200 e carica quello sketch.

Ma, ripeto, questa board a me ha dato risultati pessimi, il livello era sempre troppo basso. In rete ci sono dei progettini migliori e su ebay c’è un preamplificatorino da un euro che però non ha lo shift in tensione. Io banalmente ho messo un diodo perché non dovevo registrare ma non è una bella soluzione.

Ciao, grazie per il suggerimento, ho trovato in rete questo esempio:

const int sampleWindow = 50; // Sample window width in mS (50 mS = 20Hz)
unsigned int sample;
 
void setup() 
{
   Serial.begin(9600);
}
 
 
void loop() 
{
   unsigned long startMillis= millis();  // Start of sample window
   unsigned int peakToPeak = 0;   // peak-to-peak level
 
   unsigned int signalMax = 0;
   unsigned int signalMin = 1024;
 
   // collect data for 50 mS
   while (millis() - startMillis < sampleWindow)
   {
      sample = analogRead(0);
      if (sample < 1024)  // toss out spurious readings
      {
         if (sample > signalMax)
         {
            signalMax = sample;  // save just the max levels
         }
         else if (sample < signalMin)
         {
            signalMin = sample;  // save just the min levels
         }
      }
   }
   peakToPeak = signalMax - signalMin;  // max - min = peak-peak amplitude
   double volts = (peakToPeak * 3.3) / 1024;  // convert to volts
 
   Serial.println(volts);
}

e sembrerebbe, almeno ad occhio dare dei buoni risultati. Anche se alcune righe di codice le sto ancora studiando bene per adattarlo alle mie esigenze.

Ma vorrei una misurazione con sensibilità maggiore, quindi non so se applicare un amplificatore tra l’uscita del sensore e il pin analogico di arduino o se dedicare più bit al ‘double volts’ del codice.

Suggerimenti?

Ho provato anche io quello sketch, non fa altro che amplificare il segnale moltiplicando il valore ottenuto dall'ADC. Solo che il sensore in questione sembra sensibile ad un battito di mani ma non ad un suono.