- Encoder rotativo e suoi tipi
- Pinout e descrizione dell'encoder rotativo KY-040
- Come funziona l'encoder rotativo
- Componenti richiesti
- Schema del circuito di interfacciamento dell'encoder rotativo PIC16F877A
- Spiegazione del codice
Un codificatore a rotazione è un dispositivo di input che aiuta l'utente a interagire con un sistema. Sembra più un potenziometro radio ma emette un treno di impulsi che rende la sua applicazione unica. Quando la manopola dell'Encoder viene ruotata, ruota sotto forma di piccoli passi che ne facilitano l'utilizzo per il controllo dello stepper / servomotore, navigando attraverso una sequenza del menu e aumentando / diminuendo il valore di un numero e molto altro ancora.
In questo articolo, impareremo i diversi tipi di encoder rotativi e come funzionano. Lo interfacciamo anche con il microcontrollore PIC PIC16F877A e controlleremo il valore di un numero intero ruotando l'Encoder e visualizzeremo il suo valore su uno schermo LCD 16 * 2. Alla fine di questo tutorial, ti sentirai a tuo agio nell'usare un codificatore rotante per i tuoi progetti. Quindi iniziamo…
Encoder rotativo e suoi tipi
Codificatore a rotazione spesso chiamato codificatore ad albero. È un trasduttore elettromeccanico, nel senso che converte i movimenti meccanici in impulsi elettronici o in altre parole converte la posizione angolare o il movimento o la posizione dell'albero in un segnale digitale o analogico. Consiste in una manopola che ruotando si muoverà passo passo e produrrà una sequenza di treni di impulsi con ampiezza predefinita per ogni passo.
Esistono molti tipi di encoder rotativi sul mercato, il progettista può sceglierne uno in base alla sua applicazione. I tipi più comuni sono elencati di seguito
- Encoder incrementale
- Encoder assoluto
- Encoder magnetico
- Encoder ottico
- Encoder laser
Questi encoder sono classificati in base al segnale di uscita e alla tecnologia di rilevamento, l'encoder incrementale e gli encoder assoluti sono classificati in base al segnale di uscita e gli encoder magnetico, ottico e laser sono classificati in base alla tecnologia di rilevamento. L' encoder utilizzato qui è un encoder di tipo incrementale.
L'encoder assoluto memorizza le informazioni sulla posizione anche dopo che l'alimentazione è stata rimossa e le informazioni sulla posizione saranno disponibili quando applicheremo nuovamente l'alimentazione.
L'altro tipo di base, l' encoder incrementale fornisce dati quando l'encoder cambia la sua posizione. Non è stato possibile memorizzare le informazioni sulla posizione.
Pinout e descrizione dell'encoder rotativo KY-040
Di seguito sono illustrate le piedinature dell'encoder rotativo di tipo incrementale KY-040. In questo progetto, interfacciamo questo codificatore rotante con il popolare microcontrollore PIC16F877A di microchip.
I primi due pin (Ground e Vcc) vengono utilizzati per alimentare l'Encoder, in genere viene utilizzata l'alimentazione + 5V. Oltre a ruotare la manopola in senso orario e antiorario, l'encoder dispone anche di un interruttore (Active low) che può essere premuto premendo la manopola all'interno. Il segnale da questo interruttore è ottenuto tramite il pin 3 (SW). Infine ha i due pin di uscita (DT e CLK) che producono le forme d'onda come già discusso di seguito. Abbiamo interfacciato questo codificatore rotante in precedenza con Arduino.
Come funziona l'encoder rotativo
L'uscita dipende interamente dalle pastiglie di rame interne che forniscono il collegamento con GND e VCC con l'albero.
Ci sono due parti dell'encoder rotativo. Albero Ruota che è collegata all'albero e ruota in senso orario o antiorario a seconda della rotazione dell'albero e la base dove viene effettuato il collegamento elettrico. La base ha porte o punti che sono collegati a DT o CLK in modo tale che quando la ruota dell'albero ruota, collegherà i punti di base e fornirà un'onda quadra su entrambe le porte DT e CLK.
L'uscita sarà come quando l'albero ruota-
Due porte forniscono l'onda quadra ma c'è una leggera differenza nei tempi. Per questo motivo, se accettiamo l'uscita come 1 e 0, possono esserci solo quattro stati, 0 0, 1 0, 1 1, 0 1. La sequenza dell'uscita binaria determina la rotazione in senso orario o antiorario. Come, ad esempio, se il codificatore rotante fornisce 1 0 in condizione di riposo e fornisce 1 1 dopo di ciò, significa che l'encoder cambia la sua posizione di un singolo passo in senso orario, ma se fornisce 0 0 dopo il minimo 1 0, significa che l'albero sta cambiando le sue posizioni in senso antiorario con un passo.
Componenti richiesti
È il momento di identificare ciò di cui abbiamo bisogno per interfacciare l'encoder rotativo con il microcontrollore PIC,
- PIC16F877A
- Resistenza da 4.7k
- Resistenza da 1k
- Pentola da 10k
- Condensatore a disco ceramico 33pF - 2pz
- Cristallo da 20 Mhz
- Display 16x2
- Encoder rotativo
- Adattatore 5V.
- Tagliere per il pane
- Fili di collegamento.
Schema del circuito di interfacciamento dell'encoder rotativo PIC16F877A
Di seguito è riportata l'immagine della configurazione finale dopo aver collegato i componenti secondo lo schema del circuito:
Abbiamo utilizzato un singolo resistore da 1K per il contrasto del display LCD invece di utilizzare un potenziometro. Inoltre, controlla il video completo di lavoro fornito alla fine.
Spiegazione del codice
Il codice PIC completo viene fornito alla fine di questo progetto con un video dimostrativo, qui stiamo spiegando alcune parti importanti del codice. Se sei nuovo con PIC Microcontroller, segui i nostri tutorial PIC dall'inizio.
Come abbiamo discusso in precedenza, dobbiamo controllare l'output e differenziare l'output binario sia per DT che per CLK, quindi abbiamo creato una parte if-else per l'operazione.
if (Encoder_CLK! = position) { if (Encoder_DT! = position) { // lcd_com (0x01); counter ++; // Aumenta il contatore che verrà stampato sull'LCD lcd_com (0xC0); lcd_puts (""); lcd_com (0xC0); lcd_bcd (1, contatore); } altro { // lcd_com (0x01); lcd_com (0xC0); counter--; // diminuisce il contatore lcd_puts (""); lcd_com (0xC0); lcd_bcd (1, contatore); // lcd_puts ("Left"); } }
Dobbiamo anche memorizzare la posizione su ogni passaggio. Per fare questo, abbiamo utilizzato una variabile "position" che memorizza la posizione corrente.
position = Encoder_CLK; // Serve per memorizzare la posizione del clock dell'encoder sulla variabile. Può essere 0 o 1.
Oltre a questo, viene fornita un'opzione per notificare la pressione dell'interruttore sul display LCD.
if (Encoder_SW == 0) { sw_delayms (20); // ritardo antirimbalzo if (Encoder_SW == 0) { // lcd_com (1); // lcd_com (0xC0); lcd_puts ("interruttore premuto"); // itoa (contatore, valore, 10); // lcd_puts (valore);
La funzione system_init viene utilizzata per inizializzare il funzionamento dei pin I / O, LCD e per memorizzare la posizione dell'encoder rotativo.
void system_init () { TRISB = 0x00; // PORTA B come uscita, questa porta è utilizzata per LCD TRISDbits.TRISD2 = 1; TRISDbits.TRISD3 = 1; TRISCbits.TRISC4 = 1; lcd_init (); // Questo inizializzerà la posizione LCD = Encoder_CLK; // Sotred la posizione CLK su inizializzazione del sistema, prima dell'inizio del ciclo while. }
La funzione LCD è scritta nella libreria lcd.c e lcd.h dove vengono dichiarati lcd_puts (), lcd_cmd ().
Per la dichiarazione delle variabili, i bit di configurazione e altri frammenti di codice, trova il codice completo di seguito.