Lettura di un encoder rotativo con un solo pin
Per il mio impianto domotico, ho necessità di leggere un encoder rotativo, ma sull'ESP8266 iniziano a scarseggiarmi i pin di I/O e non voglio usare un ulteriore chip... Come fare?
Beh, la soluzione è abbastanza semplice, dato che uno dei pin liberi è l'ingresso analogico...
Sull'ESP8266 l'ADC legge tensioni tra 0V e 1V, con una risoluzione di 10 bit (anche se agli estremi non è molto lineare).
Quindi, ispirato da un progetto simile ho iniziato realizzando un partitore con 3 resistenze in serie. Il valore assoluto non è importante (io ho scelto R=15K), così da avere tra massa e l'altro capo di R3 (collegato all'ADC) al max 1.1V . Questa è la situazione "idle". Non ho messo condensatori di filtro, poiché i margini di manovra mi paiono sufficienti anche in presenza di un po' di rumore.
Il pulsante dell'encoder è collegato per cortocircuitare R3 a massa, portando quindi a (circa) 0 il valore letto dall'ADC. Questa situazione può essere facilmente riconosciuta, poiché basta vedere quando il valore di ingresso va al di sotto di 200 (elevata tolleranza al rumore e alla non linearità).
Il contatto 'A' dell'encoder è collegato per mettere in parallelo ad R3 una resistenza da 5K, mentre il contatto 'B' mette in parallelo ad R3 10K.
Il trucco chiave che ho usato è di guardare solo il livello di tensione a cui si assesta l'ADC uscendo dalla posizione idle, ovvero quando è chiuso solo A o solo B (a seconda del verso di rotazione).
A causa della relativa lentezza dell'ADC non è possibile gestire senza errori elevate velocità di rotazione, ma il sistema mi pare abbastanza robusto per gestirci senza particolari problemi funzioni semplici (menu).
In allegato uno screenshot della forma d'onda del sistema in funzione e il relativo sketch (molto banale!).
Probabilmente lo sketch (un po' espanso!) diventerà una libreria, così da essere facilmente riutilizzato.
Allegato | Dimensione |
---|---|
analogencoder.ino | 669 byte |