Disturbi su lettura segnale microfono

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... :wink:

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
}

la dimensione dei condensatori deve essere in funzione alla frequenza dei disturbi che vuoi eliminare. In oltre i condensatori non vanno solo sul microfono, ma anzi sui componenti che più sporcano l'alimentazione! anche il pin AREF meriterebbe un condensatore, perchè essendo il riferimento se flotta quello sballa tutto

ciao lesto,
in verità ho già diversi condensatori "filtranti nel progetto": per la parte alimentazione dei led, per il ricevitore IR. Mi manca sugli arduini (ma dovrebbero avere già qualcosa al lori interno) e sul display LCD (non credo ce ne sia bisogno).
Detto questo, a me interessa prelevare dal microfono le frequenze relative alla voce, come devo fare per capire la dimensione del condensatore?
Altra info: non utilizzo il piedino Aref dell'arduino (ho provato ad utilizzarlo in effetti, ma non cambia niente), la lettura dell'ADC avviene comparando direttamente con l'alimentazione dell'arduino a 5V stabilizzati (come di default)..
Grazie in anticipo per il tempo dedicato! :wink:

Ho il dubbio che l'alimentazione che usi non sia sufficente,perchè se guardi la configurazione dell'operazionale all'interno del micofono ha un partitore resistivo (10K +10K)sull'ingresso non invertente che serve per fissare il punto 0 di tensione(Vcc/2) che fa sì di avere una lettura di 512 circa, se su questo partitore varia la tensione applicata per troppo assorbimento di corrente da parte di tutto il circuito ecco che le letture si sballano . E' come se l'alimentazione che usi andasse in protezione e ripartisse dandoti valori compresi tra 0 e 1023.Con cosa alimenti il tutto?

Utilizzo una batteria a 12v 7Ah con questo regolatore di tensione (fornisce 5v e fino a 3,5 A):
http://www.robot-italy.com/product_info.php?products_id=2408
Ma ho provato anche con un alimentatore da banco e con la sola presa usb.. stessa cosa.
Ma perchè anche alimentando solo l'arduino e il microfono ottengo comunque valori che oscillano da 300 a 700? non dovrebbe dare 512??

Già che ci sono, pongo un veloce (spero!) quesito sul regolatore di tensione del precedente post.. se alimento il tutto tramite un alimentatore per PC a 20V e 6.7A, rischio di bruciare tutto o il regolatore di tensione farà egregiamente il suo dovere? Se aiuta: il circuito con arduini, led, display non assorbe più di 3A. Grazie!

Se usi un regolatore che ti da 3,5A max ed il circuito ti assorbe intorno ai 3A sei un po troppo vicino il limite secondo me. Ma il regolatore non ti scalda?

Una normale batteria non riesce a fornire 3a istantanei, forse arriva ad 1/3, control
la la c di scarica della batteria. Con l'alimentatore non dovresti far danni, dato che dovrebbe lavorare anche con il doppio della potenze in gioco.

Editore. Hai ragione, il punto debole potrebbe essere il regolatore

Ma perchè anche alimentando solo l'arduino e il microfono ottengo comunque valori che oscillano da 300 a 700? non dovrebbe dare 512??

Questo problema è un difetto preciso nel senso che hai una oscillazione precisa di -200,+200 rispetto a 512 sarebbe bello se lo potresti osservare ad oscilloscopio per controllare la frequenza ,comunque essendo il regolatore di tipo switching l'uscita in tensione ha un ripple residuo pari ad una certa quantità di mV ad una certa frequenza che mi pare nel caso specifico sia intorno ai 100KHz,per avere delle letture precise hai bisogno di tensioni ben stabilizzate ed usando questo tipo di alimentatori avresti bisogno di filtri LC,però se non riesci a risolvere il problema potresti pensare di utilizzare due alimentazioni separate se si può (non ho guardato benissimo lo schema).

Grazie a tutti per il supporto..
andando per punti:

Ma il regolatore non ti scalda?

no, in effetti nemmeno un pochino..

Con l'alimentatore non dovresti far danni, dato che dovrebbe lavorare anche con il doppio della potenze in gioco

per i danni mi riferivo all'arduino, led, ecc.. scusate l'ignoranza (l'ultima lezione di elettronica risale a più di 5 anni fà) ma se l'alimentatore eroga troppi ampere, non c'è il rischio di bruciare ciò che alimento? oppure i vari componenti "tirano" solo gli ampere che servono?

potresti pensare di utilizzare due alimentazioni separate

nessun problema, domani ci provo (adesso è un pò tardi). Chiaramente le masse devono essere collegate insieme, giusto?

sì per le masse collegate, e per le ampere la seconda, ovvero il circuito "ciuccia" solo il necessario.

ok, ho provato sia ad alimentare il tutto con il nuovo alimentatore, sia ad alimentare separatamente il microfono.. I valori non cambiano :astonished:, stanno sempre a fondo scala... altre idee? :drooling_face:

Ma i led danno segno di vita o sono morti ? Hai provato a vedere se hai un corto nella parte dei led ? Le masse sono in collegamento tra di loro (controllalo con il tester)? Hai uno schema da vedere? Scusa se ti faccio queste domande banali ma a volte alcuni problemi si nascondono proprio li dove diamo per scontato che sia apposto.

Nessun problema, nessuna strada deve essere lasciata intentata! comunque, i led funzionano benissimo, tutto funziona alla perfezione come dovrebbe sia quando il microfono è attaccato, sia senza..
per quanto riguarda gli schemi ecco a voi:
LCD (ho fatto una piccola schedina per collegarlo più facilmente):
https://docs.google.com/open?id=0Byq8pmbCwTL7RV94TWpNU1E5VFE
DRIVER LED (ce ne sono 8 di questi):
https://docs.google.com/open?id=0Byq8pmbCwTL7a2VDRlpoWWFIWHc

E ho provato con il tester ogni singolo componente, saldatura, connessione.. tutto ok!

E la misura della tensione di 5v ti risulta stabile?

Misurandola con il tester non varia nemmeno di 0,1... certo, magari provando con un oscilloscopio forse potrei vedere qualcosa di più, peccato che non ce l'ho!! comunque sia ho provato anche con diversi alimentatori che, come ho detto prima, hanno una portata di gran lunga più grande rispetto a quello che effettivamente il circuito utilizza.. in sostanza rimango sempre dell'idea che il problema non sia l'alimentazione, ma lo sporco che generano i vari componenti del progetto..

Quello che dici è anche giusto però i problemi che derivano da auto oscillazioni vengono eliminati aggiungendo negli integrati condensatori da 100nF il più vicino possibile alle rispettive alimentazioni. Nello schema di ogni singolo driver che mi hai postato hai un 100nF ed un 1000uF,nel datasheet del microfono ne hai un'altro all'alimentazione ed uno da 1uF a quel famoso punto 0 che ti dicevo nei post precedenti,andando per esclusione ci rimane solo più lo stadio di alimentazione e quello siamo sicuri che fa rumore ....ma "abbiamo" provato ad alimentare arduino e microfono con l'alimentatore incriminato? (senza driver,led,ecc.) Altra domanda ,l'alimentatore lo tieni vicino ad arduino?

ma "abbiamo" provato ad alimentare arduino e microfono con l'alimentatore incriminato?

Ho provato ad alimentare separatamente il solo arduino + microfono con più di un alimentatore ed ha sempre funzionato tutto bene, nessun problema... Chiaramente sono gli stessi alimentatori che sto usando adesso..

L'alimentatore é sempre stato a circa 1 metro da qualsiasi circuito, dovrebbe essere una distanza più che sufficiente per evitare qualsiasi disturbo da "vicinanza"..

Posto che ogni oggetto che dispone di alimentazione ha bisogno di un condensatore per filtrare i disturbi, qual'è la grandezza ottimale di questo condensatore? Mi pare di capire che non vada sempre utilizzato un valore fisso di 100uF, per esempio per filtrare i disturbi sul ricevitore IR mi sono trovato meglio con uno da 10uF... C'è qualche valore standard che posso provare?

in teoria devi analizzare la frequenza del segnale che vuoi eliminare, ed usare un condensatore con con un tempo di scarica uguale. Il tempo di scarica lo calcoli a partire dalla capacità del condensatore, se hai fatto elettronica dovresti sapere come si fa.. Scarica di un condensatore - Wikipedia

Grazie per la dritta, ma non mi ricordo praticamente niente sui condensatori... ho fatto elettronica solo perchè sono un perito informatico, non è decisamente la mia materia primaria... non credo proprio di riuscire a calcolare il tempo di scarica, tantomeno a recuperare la frequenza del segnale da eliminare? non c'è proprio altro che possa fare? prove disperate o roba simile.. =(