Ciao a tutti.
So che probabilmente mi sto perdendo in un bicchier d'acqua... ma ci sto provando da un'ora e non ne vengo a capo...
Sto cercando di far andare il debounce hardware di un pin analogico.
Ho 4 pulsanti collegati ad un pin analogico seguendo lo schema allegato (che ho trovato in questa discussione). Sono certo che lo schema di Etem è corretto, quindi sto sbagliando io da qualche parte.
Tra i pulsanti ho messo tutte resistenze da 1K.
Il condensatore è un ceramico da 100n (non ne ho in casa da 10n).
La resistenza di debounce è da 120 ohm.
La resistenza di pull-up è da 4k7.
Lo schetch è banale... leggo da A5 e scrivo su seriale...
// pin dei pulsanti (4 pulsanti collegati in srie con delle resistenze)
byte pin_pulsante = A5;
// variabile valore analogico letto dal pin
int valore_pulsante;
void setup() {
Serial.begin(9600);
Serial.println("inizio");
}
void loop() {
// leggo il valore del pulsante
valore_pulsante = analogRead(pin_pulsante);
delay(5);
if (valore_pulsante < 900) {
Serial.print("pulsante");
Serial.println(valore_pulsante);
}
}
Allego un paio di foto della breadboard, magari qualche anima pia riesce a capire cosa ho sbagliato.
EDIT: non l'avevo specificato, ma ovviamente è il problema è che ad ogni pressione mi ritrovo con 5 o 6 print su seriale.
Il problema non è che hai n letture, ma che il condensatore fa variare lentamente la tensione passando per tutti i valori dei pulsanti a livello più basso. Già senza condensatori, piuttosto, devi ritardare un attimo la lettura, perché ci sono capacità parassite e la prima lettura potrebbe rilevare un valore minore di quello che viene raggiunto un attimo dopo.
Io dico che non si può fare perché il programma, per principio, dovrebbe girare alla massima velocità. Se fosse così, verrebbero letti tutti i valori che assume il condensatore per passare da 0V alla tensione del pulsante premuto, transitando per i valori dei pulsanti a tensione più bassa e rilevandoli premuti in sequenza.
Il mio dubbio è di aver collegato male i vari componenti... per questo ho allegato le foto, nella speranza che qualcuno trovasse l'errore... io dopo un'ora di tentativi non l'ho trovato...
fratt ... se hai un condensatore che si carica/scarica attraverso una risistenza, hai una costante di tempo τ = R x C. Il condensatore si considera carico (se lo stai caricando), o scarico (se lo stai scaricando), dopo un tempo pari a 5 x τ.
Fatti due conti e vedi con un condensatore da 100e-9 F (i tuoi 100 nF) x il valore di R Ω (a seconda del bottone premuto) quanto vale τ e quindi quanto tempo ci vuole per avere una lettura stabile.
L'antirimbalzo hardware, in realtà, si può fare... ma devi farlo su ogni pulsante, poi per ogni pulsante metti un inverter di Schmitt (es. CD40106) e infine fai un convertitore D/A di tipo R/2R (cerca con Google) con le resistenze.
Ok, a questo punto va oltre le mie capacità hardware...
Provo la strada software che mi è più congeniale.
Grazie a entrambi per il tempo che mi avete dedicato.
fratt:
Porta pazienza ma con questi concetti un po' mi perdo...
C = 100 nF, R = 120 Ω, τ = 12 µSec -> τ x 5 = 60 µSec ...
... un istruzione macchina del ATmega328P che lavora a 16 MHz viene eseguita in 62.5 nSec ... hai idea di quante istruzioni macchina esegue in 60 µSec ? E all'aumentare della resistenza la cosa peggiora ...