Analog input e potenziometro - lettura e stampa di valori instabili

Carissimi,

porgo un caloroso saluto, sono nuovo nel forum e sono felice di fare la Vostra conoscenza...

chiedo cortesemente se esiste un metodo efficace per stabilizzare i valori di un potenziometro in ingresso ad una porta analogica. Ho collegato un potenziometro da 10k e ruotandolo, vorrei leggere detti valori su terminale: tutto funziona correttamente se non per il fatto che viene inondato il bus di messaggi spuri dati dall'instabilità della lettura analogica. Esiste un modo per 'quantizzare' o stabilizzare detti valori?

// Codice by Tonetta Ivan(Ruben) in data 23.10.2012

int vecchio_stato_knob = 0;

void setup() { Serial.begin(9600); }
void loop() {
// Lettura del valore del potenziometro
int stato_knob = analogRead(2); // INSTABILE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
delay(10); // debounce PS: va da sè che se dovessi leggere i valori di 16 potenziometri, il delay così non va più bene
if(stato_knob != vecchio_stato_knob) {
// invio valori al serial monitor per la stampa
Serial.println(stato_knob);
// memorizzazione nuovo valore
vecchio_stato_knob = stato_knob;
}
}

Ringrazio calorosamente, Ruben (PS: essendo provvisoriamente senza linea internet, impiego un pochino a rispondere ad eventali domande...)

Hai dimenticato il pinmode --> pinMode() - Arduino Reference

Inoltre controlla il pin a cui attaccato il potenziometro. I valori oscillanti mi fanno pensare che tu abbia sbagliato ingresso e stia leggendo un pin flottante.
Se i collegamenti sono giusti

allora è il potenziometro da sostituire... forse è sporco

Usa i tag code per racchiudere il codice. E' il simbolo # sopra le faccine.
Usa l'indentazione per rendere il codice più leggibile. (CRLT + T nell'IDE di Arduino)

Carissimo PaoloP,

ti ringrazio molto,

Su vari libri viene indicato il fatto che le porte Analog sono in SOLA LETTURA, quindi si può omettere il discorso del pinMode (ho capito bene?)

Per quanto riguarda il fatto che il potenziometro sia sporco, ne ho provati ben 16 e sono tutti nuovi. (Avrei infatti intenzione di leggere i valori generati su tutte e 16 le porte...

ti chiedo ancora scusa se non ho capito bene e grazie per la risposta....
ruben :slight_smile:

Io ho avuto esperienze con potenziometri di bassa qualità.. di plastica, blu, piccolini.. ho provato poi con dei modelli di buona marca e tutto magicamente ha funzionato alla grande
Ti consiglio di fare la media di 10 valori e scartando il più alto e il più basso oltre ad aumentare a 50ms il ritardo..
Puoi pubblicare qualche risultato che hai ottenuto?
Da quanto sono i potenziometri?

carissimo, i potenziometri sono lineari da 10k in metallo nuovi (comprati non su ebay, ma in negozio), il modello è questo:

Vorrei stabilizzare detta lettura in quanto se già con 1 c'è confusione, non oso immaginare quando saranno 16....

grazie a tutti...

Ti consiglio di fare la media di 10 valori e scartando il più alto e il più basso oltre ad aumentare a 50ms il ritardo..

Hai provato?

Puoi pubblicare qualche risultato che hai ottenuto?

Senza purtroppo non si può capire il problema..

Sì, /10 diminuisce il problema, (è chiaro,) ma non leggo più il valore reale 0-1023 (anche se potrei moltiplicarli *10 al momento dell'invio al serial monitor)... che consigli?

Se aumento il delay a 50 l'aggiornamento della lettura del nuovo valore, ritarda troppo tempo...

grazie, grazie, grazie

PS: /10, il problema diminuisce, ma non è cmq stabile...

Codesound:
Sì, /10 diminuisce il problema, (è chiaro,) ma non leggo più il valore reale 0-1023 (anche se potrei moltiplicarli *10 al momento dell'invio al serial monitor)... che consigli?

Non devi semplicemente dividerli per 10, meglio usare una potenza di due, p.e. 8 o 16, devi fare la media su tot valori, ovvero li sommi tutti in una variabile e poi dividi questa per il numero di letture.
Comunque leggendo un potenziometro tramite ADC, se è correttamente collegato, la lettura al massimo flutta di +/-1 count e non serve fare la media, se a te fluttua molto c'è un problema hardware di mezzo.

Se fai correttamente la media leggi ugualmente un valore compreso tra 0 e 1023. Per fare la media devi fare la somma e poi dividere.
Se vuoi fare una media un pò più avanzata fai come ti ho detto prima, non prendere il valore più basso e più alto

Es. se leggi
10 20 40 40 20 90

Fai così:
elimina 10 e 90
somma 20+40+40+20=120
dividi per 4: 120/4
il risultato sarà 30

Cosa intendi per stabile?
Leggi ogni tanto un 100 al posto di un 1? Un 1000 al posto di un 2? Se non definisci bene con qualche numero i risultati che ottieni difficilmente ti si potrà aiutare.

L'ADC di arduino è a 10 bit quindi puoi ottenere una risoluzione massima di 10K / 1024 = 9,76 ohm

Ciao

Anche io avevo lo stesso problema...sonde NTC e potenziometri instabili sugli ingressi analogici di Arduino1 ...

SOLUZIONE :
-(almeno nel mio caso )

Io avevo alimentato l'Arduino con un'alimentatore switching a 220 volt con doppia uscita 12Vcc -5Vcc ... e per risolvere il problema ho dovuto collegare il GND dell'Arduino alla terra (filo giallo-verde) dell'impianto di casa...ho risolto all'istante!!!

Spero che possa essere il tuo caso...

Ciao

carissimi:

la lettura è ben corretta, quello che vorrei ottenere è semplicemente che arduino aggiorni la lettura sul bus del nuovo stato del potenziometro SOLO quando lo ruoto... ecco perchè l' 'if'. Tuttavia, (io immagino) il potenziometro si può trovare in uno stato che non è nè 323, nè 324 ma (magari), 323,5 (grazie allla sua natura meccanica) questo valore continua a 'generare confusione' ad arduino che continua ad emettere sul bus 323,poi 324, poi 323, poi ancora 324 e così via... quindi chiedo: esiste un modo per fermare questa confusione?

grazie ancora ...

Puoi modifica l'IF in modo da ottenere un intervallo

 if(stato_knob < vecchio_stato_knob-1 || stato_knob  > vecchio_stato_knob+1) 
{.....

Se colleghi Arduino all'USB del computer connesso a terra anche Arduino diventa connesso a terra, se vai a batteria il computer non è a terra e nemmeno Arduino

Ciao

C'è un bellissimo articolo sulla lettura dei valori da un ADC che consiglio a tutti di leggere:
sites.google.com/site/giandgisoftwaresolution/software-solution/oversamplingarduinoconadca12bit

Nell'articolo viene spiegato il metodo per ridurre il rumore attraverso la tecnica dell'oversampling che risolverebbe il tuo problema.

Con la decimazione, invece, si può anche aumentare la risoluzione dell'ADC portandolo da 10 bit a 11bit o addirittura a 12 bit.

Comunque non dimenticare che devi inserire un ritardo di almeno 100 us tra una misura e l'altra per consentire al condensatore dell'ADC di caricarsi opportunamente.

carissimi,

sono veramente entusiasto nel leggere 2 risposte:
PaoloP non ci avevo pensato all'introdurre uno step... (ci proverò domani, altrimenti mia moglie...)
cyberhs, grazie, leggerò con attenzione il link e inserirò i us necessari...

grazie a tutti, appena troverò il tempo e la linea, posterò i miei risultati. Se nel frattempo avete altre soluzioni da porre, sentitevi ringraziati,

Ruben

Se specificavi subito che avevi un valore +-1 si faceva prima a risolvere il problema. Di 1024 step ti conviene farne il numero che necessiti effettivamente per avere una migliore soglia al rumore

Per l'ADC già con 10ms sei a posto, 10ms = 10000us

Ciao

carissimi, con notevole ritardo, chiedo scusa, ma il problema lo ha risolto PaoloP con il suo 'if'

Grazie di tutto a tutti, e scusate se non ho formulato bene la domanda da subito... :cold_sweat:

Ruben