Pages: [1] 2   Go Down
Author Topic: Analog input e potenziometro - lettura e stampa di valori instabili  (Read 4927 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 15
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...)
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7123
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hai dimenticato il pinmode --> http://arduino.cc/en/Reference/PinMode

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)
« Last Edit: October 27, 2012, 08:52:47 am by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

0
Offline Offline
Newbie
*
Karma: 0
Posts: 15
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley
Logged

Parma
Offline Offline
Edison Member
*
Karma: 21
Posts: 2387
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 15
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

http://www.ebay.it/itm/Potenziometro-10K-potenziometri-monogiro-lineare-/230771340545


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

grazie a tutti...
Logged

Parma
Offline Offline
Edison Member
*
Karma: 21
Posts: 2387
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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?

Quote
Puoi pubblicare qualche risultato che hai ottenuto?
Senza purtroppo non si può capire il problema..
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 15
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 15
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 129
Posts: 9493
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Parma
Offline Offline
Edison Member
*
Karma: 21
Posts: 2387
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Full Member
***
Karma: 2
Posts: 105
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 15
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ...
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7123
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Puoi modifica l'IF in modo da ottenere un intervallo
Code:
if(stato_knob < vecchio_stato_knob-1 || stato_knob  > vecchio_stato_knob+1)
{.....
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Parma
Offline Offline
Edison Member
*
Karma: 21
Posts: 2387
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Selvazzano Dentro - Padova
Offline Offline
Edison Member
*
Karma: 45
Posts: 1415
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Pages: [1] 2   Go Up
Jump to: