Sommario:
2025 Autore: John Day | [email protected]. Ultima modifica: 2025-01-13 06:57
Un encoder rotativo è un dispositivo elettromeccanico che converte il movimento rotatorio in informazioni digitali o analogiche. Può girare in senso orario o antiorario. Esistono due tipi di encoder rotativi: encoder assoluti e relativi (incrementali).
Mentre un encoder assoluto emette un valore proporzionale all'angolo dell'albero corrente, un encoder incrementale emette il passo dell'albero e la sua direzione. (In questo caso abbiamo un encoder incrementale)
Gli encoder rotativi stanno diventando più popolari perché è possibile utilizzare due funzioni in un modulo elettrico: un semplice interruttore per confermare le operazioni e l'encoder rotante per navigare, ad es. attraverso un menù.
Un encoder rotativo incrementale genera due segnali di uscita mentre il suo albero ruota. A seconda della direzione, uno dei segnali conduce l'altro. (vedi sotto)
Passaggio 1: comprensione dei dati di output
Come puoi vedere quando l'albero dell'encoder inizia a ruotare in senso orario, l'uscita A scende per prima su LOW e l'uscita B la segue. In senso antiorario l'operazione gira in senso opposto.
Ora non ci resta che implementarlo sul nostro µController (ho usato un Arduino Nano).
Passaggio 2: costruisci il circuito
Come ho descritto prima, le uscite creano un fianco ALTO e uno BASSO. Per ottenere un HIGH pulito ai pin dati A e B del µController dobbiamo aggiungere resistori Pull-Up. Il Pin comune C va dritto a massa per il fianco BASSO.
Per avere informazioni sull'interruttore interno (pulsante) utilizzeremo gli altri due pin. Uno di questi va a VCC e l'altro a un Pin dati del µController. Dobbiamo anche aggiungere un resistore pull-down al pin dati per ottenere un LOW pulito.
È anche possibile utilizzare resistori interni di Pull-Up e Pull-Down del tuo µController!
Nel mio caso il pinout è simile a:
- +3, 3V => +3, 3V (Arduino)(possibile anche +5V)
- GND => GND (Arduino)
- A => Pin10
-
B =>
Spillo
11
- C => GND
-
SW =>
Spillo
12
Passaggio 3: scrittura del codice
int pinA = 10; //interruttore interno A int pinB = 11; //interruttore interno B int pinSW = 12; //switch (premuto Encoder) int encoderPosCount = 0; // inizia da zero, cambia se vuoi
int positionval;
valore bool; int mrotateLast; int mrotate;
void setup() {
int mrotateLast = digitalRead(pinA); Inizio seriale (9600); ritardo(50); }
void loop() { readencoder(); if(readswitch() == 1){ Serial.println("Switch = 1"); } }
int readencoder (){
mrotate = digitalRead(pinA); if (mrotate != mrotateLast){ //la manopola sta ruotando if (digitalRead(pinB) != mrotate) { //switch A modificato per primo -> rotazione in senso orario encoderPosCount ++; Serial.println ("ruotato in senso orario"); } else {// switch B modificato per primo -> rotazione in senso antiorario encoderPosCount--; Serial.println ("ruotato in senso antiorario"); }
Serial.print("Posizione codificatore: "); Serial.println(encoderPosCount); Serial.println(""); } mrotateLast = mrotate; restituire encoderPosCount; } bool readswitch(){
if(digitalRead(pinSW)!=0){ // l'interruttore è premuto
while(digitalRead(pinSW)!=0){} //l'interruttore è attualmente premuto switchval = 1; } else{switchval = 0;} //l'interruttore non è premuto return switchval; }
Ora puoi ruotare l'encoder e la variabile encoderPosCount conterà in aumento se ruoti in senso orario e conto alla rovescia se ruoti in senso antiorario.
Questo è tutto! Semplice e utile.
Sentiti libero di modificare ed eseguire il codice. Puoi implementarlo nel tuo progetto.
Caricherò anche un progetto LED in cui ho utilizzato l'encoder per impostare la luminosità dei miei LED.