Salve a tutti, da qualche giorno stò impazzendo sulla lettura del segnale di un microfono tramite arduino.
Ho comprato questo microfono che contiene al suo interno un amplificatore di segnale 100x:
Riassumo brevemente la situazione:
Se collego l'alimentazione del microfono al +5V e GND dell'arduino e il segnale al pin A0, stando in silenzio leggo dei valori che oscillano da 300 a 700 (fin qui tutto bene, il segnale è analogico e sinusoidale, è normale che oscilli intorno ai 512)... quando faccio rumore il segnale varia e riesco a leggerlo bene.
Ma rendiamo la cosa più difficile... per il progetto che stò facendo (vedi post http://arduino.cc/forum/index.php/topic,73634.0.html) devo usare 2 arduino collegati alla stessa alimentazione, con 128 led, un display...
Se alimento l'arduino e il microfono da soli (sia tramite usb che tramite batteria), tutto bene. Quando collego anche gli altri componenti del progetto ALLA STESSA ALIMENTAZIONE, l'output del microfono dà segnali da 0 a 1023, quindi entrambi fondo scala.
Ho passato ore a cercare su forum e siti vari, ho provato le seguenti configurazioni ma non riesco a risolvere:
- resistenza di pullup/pulldown su ingresso analogico dell'arduino
- condensatore tra VCC e GND dell'alimentazione del microfono, e tra GND e OUTPUT del microfono
- diodo all'uscita del microfono, anche con resistenze e condensatori che vanno a massa.
Il problema, fondamentalmente, dovrebbe essere causato dai disturbi che provocano gli altri componenti del progetto (ricordo che se alimento arduino+microfono da soli funziona tutto bene). C'è qualcosa che posso utilizzare come filtro antidisturbo?
Se qualcuno mi può dare una mano gliene sarei estremamente grato...
Posto anche il semplice codice utilizzato per recuperare i valori letti dall'arduino:
#define AUDIO A0 // the piezo is connected to analog pin 0
// these variables will change:
int sensorReading = 0; // variable to store the value read from the sensor pin
int sensorMax = 0;
int sensorMin = 1023;
void setup() {
Serial.begin(9600); // use the serial port
Serial.println("calibration START");
pinMode(AUDIO, INPUT);
//while (millis() < 3000) {
for (int i=0; i< 3000; i++) {
sensorReading = analogRead(AUDIO);
if (sensorReading > sensorMax) {
sensorMax = sensorReading;
}
if (sensorReading < sensorMin) {
sensorMin = sensorReading;
}
}
Serial.print("sensor MAX: "); Serial.println(sensorMax, DEC);
Serial.print("sensor MIN: "); Serial.println(sensorMin, DEC);
Serial.println("calibration END");
}
void loop() {
// read the sensor and store it in the variable sensorReading:
//for (int i=0; i<10; i++) {
// sensorReading += analogRead(AUDIO);
//}
//sensorReading = sensorReading/10;
sensorReading = analogRead(AUDIO);
// if the sensor reading is greater than the threshold:
//if (sensorReading >= sensorMax) {
//Serial.print("MAX: "); Serial.print(sensorReading, DEC); Serial.print(" (diff. "); Serial.print(sensorReading - sensorMax, DEC); Serial.print(") --> "); Serial.println(map(sensorReading, sensorMax, 1024, 0, 1024), DEC);
//}
if (sensorReading <= sensorMin) {
Serial.print("MIN: "); Serial.print(sensorReading, DEC); Serial.print(" (diff. "); Serial.print(sensorMin - sensorReading, DEC); Serial.print(") --> "); Serial.println(map(sensorReading, sensorMin, 0, 0, 1024), DEC);
}
else{
//Serial.println(0, DEC);
}
delay(3); // Better for Processing showing data
}