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...)
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)
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
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?
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...
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
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!!!
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?
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
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.
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,
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