Ingressi Analogici MEGA

utilizzo gli ingressi analogici (A0...A15), per mia scelta e comodità, utilizzo solo il A10,A12,A14, naturalmente in ingresso.
Tutti e tre misurano dei valori X, però anche gli altri ingressi (NON UTILIZZATI) hanno valori casuali, superiore a 0.
Se scollego uno dei tre pin da me utilizzati, legge ugualmente dei valori che in realta non sono vere, dovrebbe leggermi 0. Giusto?
di seguito riporto il codice sommario.

int Pin1 = A10;    
int Pin2 = A12;   
int Pin3 = A14;   

void setup() 
{
 Serial.print(9600);
 pinMode(Pin1 , INPUT);
 pinMode(Pin2 , INPUT);
 pinMode(Pin3 , INPUT);
}

void loop() 
{
 ValorePin1 = analogRead(Pin2);
 ValorePin2 = analogRead(Pin3);
 ValorePin3 = analogRead(Pin4);
Serial.print("Valore 1="); Serial.println(ValorePin1); 
Serial.print("Valore 2="); Serial.println(ValorePin2); 
Serial.print("Valore 3="); Serial.println(ValorePin3); 
 delay(1000);
}

Dove è il mio errore?
Grazie in anticipo.

Qualunque pin analogico lasciato flottante, non collegato a nulla, legge valori a caso, in parte influenzati dalla tensione presente sul pin vicino, in parte dall’onnipresente rumore elettrico, per ottenere letture pari a 0 il pin deve essere collegato a GND.
Stessa cosa vale per i pin digitali, se lasciati flottanti possono leggere sia 1 che 0 in modo random.

i tre pin “usati”, sono messi con 3 partitori di tensione, quindi leggo 3 batterie, quindi come da schema del partiore, il negativo e presente (file allegato). Quindi per questi tre se tolgo la tensione positivo batteria (visto che i negativi sono tutti insieme), dovrei avere una lettura stabile o quasi zero.

partitore.GIF

Certo, se lasci solo R2 agisce da pull-down, dovresti quindi leggere 0.

astrobeed:
Qualunque pin analogico lasciato flottante, non collegato a nulla, legge valori a caso,

La stessa cosa vale anche per le entrate digitali. Anche questi leggono LOW o HIGH a caso se non sono collegati (flottanti).
Ciao Uwe

Controlla il listato perché c'è qualcosa che non va.

...
 ValorePin1 = analogRead(Pin2);   // Pin2 dovrebbe essere Pin1
 ValorePin2 = analogRead(Pin3);   // Pin3 dovrebbe essere Pin2
 ValorePin3 = analogRead(Pin4);   // Pin4 dovrebbe essere Pin3
...

Ma si fa la pinmode anche per gli input analogici?

cyberhs:
Controlla il listato perché c'è qualcosa che non va.

...

ValorePin1 = analogRead(Pin2);  // Pin2 dovrebbe essere Pin1
ValorePin2 = analogRead(Pin3);  // Pin3 dovrebbe essere Pin2
ValorePin3 = analogRead(Pin4);  // Pin4 dovrebbe essere Pin3
...

Si era un errore di scrittura che comunque era importantissimo, mi ero accorto.

docsavage:
Ma si fa la pinmode anche per gli input analogici?

No.
Il pinMode agisce sulla parte digitale del pin, non su quella analogica (ADC).
Sarebbe megli infatti disattivare la parte digitale quando si usano i pin per la lettura analogica.

astrobeed:
Qualunque pin analogico lasciato flottante, non collegato a nulla, legge valori a caso, in parte influenzati dalla tensione presente sul pin vicino, in parte dall'onnipresente rumore elettrico

Esatto, infatti in un paio di casi ho usato questo metodo come seme del generatore di numeri casuali (per chi è meno pratico: non è una battuta, prendetelo anche come spunto se dovesse servirvi qualcosa del genere!).

PaoloP:
No.
Il pinMode agisce sulla parte digitale del pin, non su quella analogica (ADC).
Sarebbe megli infatti disattivare la parte digitale quando si usano i pin per la lettura analogica.

Sarebbe meglio ?!?!?!?!
ma io ho necessita di usare sia gli analogici (A0..A15) che i digitali (5-9) (22-48). ?
Allora dovro tenerle quelle letture false?

PaoloP:
Sarebbe megli infatti disattivare la parte digitale quando si usano i pin per la lettura analogica.

Non l'ho capita, puoi spiegarmi perché? Ovviamente se lui non usa qualche pin, che quindi non è connesso, avrà letture "random", ma se non li usa che importa se ci sono valori flottanti?
E perché disattivare (?) i digitali quando si usano letture analogiche? Io non l'ho mai fatto e non ho avuto problemi.

In alcuni progetti come l'ArduTester di Alberto Piganti o il Frequenzimetro di Michele Menniti, prima dell'acquisizione dei segnali analogici e stata disattivata la parte digitale che interessa gli stessi pin.
Sono dei piccoli miglioramenti che nell'uso quotidiano non si notano. La disattivazione comporta la riduzione del rumore nella linea analogica e un miglioramento sul fronte dei consumi; è irrilevante sulla board Arduino ma importante per usi specifici stand-alone.
Si ottiene agendo sui registri specifici del microcontrollore. Non esiste un macro pronta all'uso.

Confermo quanto detto da PaoloP, se si vogliono fare misure analogiche con la massima precisione possibile, nei limiti del ADC degli AVR, è corretto disattivare, per la durata della misura, la parte digitale del port interessato.
Sopratutto sarebbe buona cosa non usare la digital.read di Arduino, troppo generica e lavora solo single shot, e agire direttamente su i registri del ADC per ottimizzare la procedura di lettura.
Ovviamente ha un senso prendere tutte le precauzione lato software solo se ci sono le stesse attenzioni lato hardware, a partire da una alimentazione del processore il più pulita possibile, il che esclude immediatamente l'alimentazione diretta da USB, l'uso di idonei filtri per l'alimentazione della parte analogica, pin Avcc del micro, uso di un buon generatore di tensione riferimento, con idoneo filtro, sul pin Aref, tutte cose mancanti sulle normali board Arduino. :slight_smile:

Dal data sheet del Atmega328, ma vale anche per gli altri modelli di AVR.

The ADC Noise Reduction mode stops the CPU and all I/O modules except asynchronous timer and
ADC, to minimize switching noise during ADC conversions.

astrobeed:
Ovviamente ha un senso prendere tutte le precauzione lato software solo se ci sono le stesse attenzioni lato hardware,

Proprio a questo proposito, potresti darmi qualche dritta nel thread di MyTrackr? :wink: