Encoder rotativo - Comprendilo e usalo (Arduino/altro Controller): 3 passaggi
Encoder rotativo - Comprendilo e usalo (Arduino/altro Controller): 3 passaggi
Anonim
Encoder rotativo - Comprendilo e usalo (Arduino/altro ΜController)
Encoder rotativo - Comprendilo e usalo (Arduino/altro ΜController)

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

Comprensione dei dati di output
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

Costruisci il circuito
Costruisci il circuito
Costruisci il circuito
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.