0
Offline
Newbie
Karma: 0
Posts: 15
Arduino rocks
|
 |
« on: October 27, 2012, 07:49:45 am » |
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
Offline
Faraday Member
Karma: 49
Posts: 3000
|
 |
« Reply #1 on: October 27, 2012, 08:50:34 am » |
Hai dimenticato il pinmode --> http://arduino.cc/en/Reference/PinModeInoltre 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
|
IDE 1.0.4 - Arduino UNO R3 - Ethernet Shield R3 - DCF77 Module - Adafruit Data Loggin Shield - LCD 16x2 RGB positive backlight - i2c LCD backpack - RTC 1307 Board - Saleae Compatibile Logic Analyzer 8ch 24Mhz - ATtiny2313 ProtoBoard - Xino Board - ATtiny 4313 - Arduino 2009 - Arduino USB Serial Ligth - DS18B20 - LM35DZ - ShiftRegister - TL431 - ATtiny 85 Ultimi acquisti: CodeBender: http://codebender.cc/register/?referrer=PaoloP
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 15
Arduino rocks
|
 |
« Reply #2 on: October 27, 2012, 09:12:49 am » |
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 
|
|
|
|
|
Logged
|
|
|
|
|
Parma
Online
Edison Member
Karma: 10
Posts: 2106
|
 |
« Reply #3 on: October 27, 2012, 09:17:14 am » |
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
Newbie
Karma: 0
Posts: 15
Arduino rocks
|
 |
« Reply #4 on: October 27, 2012, 09:55:36 am » |
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-/230771340545Vorrei stabilizzare detta lettura in quanto se già con 1 c'è confusione, non oso immaginare quando saranno 16.... grazie a tutti...
|
|
|
|
|
Logged
|
|
|
|
|
Parma
Online
Edison Member
Karma: 10
Posts: 2106
|
 |
« Reply #5 on: October 27, 2012, 10:09:40 am » |
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..
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 15
Arduino rocks
|
 |
« Reply #6 on: October 27, 2012, 10:17:37 am » |
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
Newbie
Karma: 0
Posts: 15
Arduino rocks
|
 |
« Reply #7 on: October 27, 2012, 10:20:16 am » |
PS: /10, il problema diminuisce, ma non è cmq stabile...
|
|
|
|
|
Logged
|
|
|
|
|
Rome (Italy)
Offline
Tesla Member
Karma: 74
Posts: 7348
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
|
 |
« Reply #8 on: October 27, 2012, 10:40:02 am » |
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
Online
Edison Member
Karma: 10
Posts: 2106
|
 |
« Reply #9 on: October 27, 2012, 10:47:16 am » |
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
Jr. Member
Karma: 2
Posts: 90
|
 |
« Reply #10 on: October 27, 2012, 10:51:30 am » |
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
Newbie
Karma: 0
Posts: 15
Arduino rocks
|
 |
« Reply #11 on: October 27, 2012, 10:56:59 am » |
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
Offline
Faraday Member
Karma: 49
Posts: 3000
|
 |
« Reply #12 on: October 27, 2012, 11:05:17 am » |
Puoi modifica l'IF in modo da ottenere un intervallo if(stato_knob < vecchio_stato_knob-1 || stato_knob > vecchio_stato_knob+1) {.....
|
|
|
|
|
Logged
|
IDE 1.0.4 - Arduino UNO R3 - Ethernet Shield R3 - DCF77 Module - Adafruit Data Loggin Shield - LCD 16x2 RGB positive backlight - i2c LCD backpack - RTC 1307 Board - Saleae Compatibile Logic Analyzer 8ch 24Mhz - ATtiny2313 ProtoBoard - Xino Board - ATtiny 4313 - Arduino 2009 - Arduino USB Serial Ligth - DS18B20 - LM35DZ - ShiftRegister - TL431 - ATtiny 85 Ultimi acquisti: CodeBender: http://codebender.cc/register/?referrer=PaoloP
|
|
|
|
Parma
Online
Edison Member
Karma: 10
Posts: 2106
|
 |
« Reply #13 on: October 27, 2012, 11:22:48 am » |
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
God Member
Karma: 17
Posts: 526
"Chi sa fa, chi non sa insegna"
|
 |
« Reply #14 on: October 27, 2012, 11:48:34 am » |
C'è un bellissimo articolo sulla lettura dei valori da un ADC che consiglio a tutti di leggere: sites.google.com/site/giandgisoftwaresolution/software-solution/oversamplingarduinoconadca12bitNell'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
|
|
|
|
|
|