Sommario:
- Passaggio 1: Schema del circuito
- Passaggio 2: elenco delle parti
- Passaggio 3: teoria
- Passaggio 4: software
Video: Decodificatore rotativo semplice: 4 passaggi
2024 Autore: John Day | [email protected]. Ultima modifica: 2024-01-30 10:02
Questa istruzione descrive un metodo semplice per decodificare un encoder rotativo sequenziale utilizzando un Arduino Uno R3.
Le routine software compatte vengono utilizzate per contare il numero di transizioni, eliminare il rimbalzo dei contatti e determinare la direzione di rotazione. Non sono necessari componenti aggiuntivi e tabelle di ricerca.
Vengono fornite versioni con e senza interruzioni del codice.
La versione di interruzione del codice richiede solo un singolo pin di interruzione.
Immagini:
- La foto di apertura mostra l'encoder assemblato.
- La schermata mostra il codice per la versione di interrupt e il conteggio quando l'albero dell'encoder viene ruotato in senso orario e antiorario.
- Il video mostra il conteggio durante la rotazione rapida.
Passaggio 1: Schema del circuito
Lo schema elettrico dell'encoder è mostrato in fig.1.
I fili dei ponticelli sono saldati direttamente ai pin dell'encoder.
Scambiare i due fili blu se la direzione di conteggio è invertita.
Passaggio 2: elenco delle parti
Le seguenti parti sono state ottenute da
- 1 solo Arduino UNO R3 con cavo USB.
- 1 solo encoder rotativo sequenziale (EC11 o equivalente) con interruttore.
- 1 unica manopola per adattarsi all'albero.
- 3 soli ponticelli Arduino maschio-maschio.
Passaggio 3: teoria
Gli encoder rotativi sequenziali generano due onde quadre ciascuna delle quali è spostata di 90 gradi come mostrato in Fig.1.
Gli schemi logici al contatto A e al contatto B sono diversi quando l'albero viene ruotato in senso orario (CW) e antiorario (CCW) attraverso le posizioni da 1 a 6.
I metodi comuni per determinare la direzione di rotazione includono:
- hardware
- interruzioni gemelle
- tabelle di ricerca dei modelli
Questo progetto utilizza un metodo software che non richiede tabelle di ricerca. [1]
Direzione
Invece di esaminare i modelli di output del contatto A e del contatto B, concentriamoci sul contatto A.
Se campioniamo il contatto B dopo ogni transizione del contatto A, notiamo che:
- Il contatto A e il contatto B hanno stati logici opposti quando l'encoder viene ruotato in senso orario
- Il contatto A e il contatto B hanno lo stesso stato logico quando l'encoder viene ruotato in senso antiorario
Codice effettivo:
// ----- Conta le transizioni
StatoCorrenteA = statoContattoA(); if (CurrentStateA != LastStateA) { CurrentStateB = digitalRead(ContactB); if (StatoCorrenteA ==StatoCorrenteB) Conteggio++; if (CurrentStateA != CurrentStateB) Conteggio--; LastStateA = CurrentStateA; }
Questo metodo offre i seguenti vantaggi:
- le tabelle di ricerca non sono necessarie
- è necessaria solo una singola linea di interruzione
antirimbalzo
Tutti gli encoder meccanici soffrono di "rimbalzo del contatto".
Se un contatto dell'interruttore non si chiude/si interrompe in modo pulito, il suo stato logico oscillerà rapidamente da ALTO a BASSO finché il contatto dell'interruttore non si stabilizza. Ciò si traduce in conteggi falsi.
Un metodo per sopprimere il rimbalzo dei contatti consiste nell'aggiungere un piccolo condensatore su ciascun contatto dell'interruttore. Il condensatore e il resistore di pull-up associato formano un integratore che cortocircuita efficacemente le alte frequenze e consente alla tensione dell'interruttore di salire/scendere con grazia.
Lo svantaggio di questo approccio è che le transizioni possono essere perse se l'albero dell'encoder viene ruotato rapidamente.
Software antirimbalzo
Questo metodo utilizza due contatori (Aperto, Chiuso) che sono stati impostati a zero. [2]
Una volta rilevata una transizione sul contatto A:
- Sondaggio continuo Contattare A.
- Incrementa il contatore Aperto e resetta il contatore Chiuso, ogni volta che il Contatto A è ALTO.
- Incrementa il contatore Chiuso e resetta il contatore Aperto, ogni volta che il Contatto A è BASSO.
- Uscire dal ciclo quando uno dei contatori raggiunge un conteggio predeterminato. Stiamo effettivamente cercando il periodo di stato stazionario successivo a qualsiasi rimbalzo dei contatti.
Codice effettivo:
// ----- Antirimbalzo Contatto A
while (1) { if (digitalRead(ContactA)) { // ----- ContactA è Aperto Chiuso = 0; // Integratore opposto vuoto Open++; // Integra if (Open > MaxCount) return HIGH; } else { // ----- ContactA è Chiuso Aperto = 0; // Integratore opposto vuoto Closed++; // Integra if (Closed > MaxCount) return LOW; } }
Non è necessario eseguire l'antirimbalzo del contatto B poiché le transizioni del contatto A e del contatto B non coincidono.
Conteggio
Un "arresto" meccanico raddoppia efficacemente il conteggio poiché vengono registrati due conteggi tra i clic (vedi figura 1).
Il numero di "fermi" può essere determinato utilizzando l'aritmetica modulo 2 come mostrato di seguito.
Codice effettivo:
// ----- Conta i "fermi"
if (Conteggio % 2 == 0) { Serial.print("Conteggio: "); Serial.println(Conteggio / 2); }
Riferimenti
Ulteriori informazioni possono essere trovate su:
[1]
howtomechatronics.com/tutorials/arduino/ro…
[2]
newbiehack.com/ButtonorSwitchDebounceinSof…
Passaggio 4: software
Questo progetto richiede una versione recente dell'IDE Ardino Uno R3 (ambiente di sviluppo integrato) disponibile su
Scarica ciascuno dei seguenti due sketch Arduino (in allegato)
- codificatore_rotativo_1.ino (versione polling)
- rotary_encoder_2.no (versione con interrupt)
Fare doppio clic sulla versione preferita e seguire le istruzioni sullo schermo.
Godere …
Fai clic qui per visualizzare gli altri miei istruttori.
Consigliato:
LabDroid: codificatore/decodificatore di codice Morse: 4 passaggi
LabDroid: codificatore/decodificatore di codice Morse: Nota: questa istruzione non può essere realizzata 1:1 nella versione più recente di LabDroid. Lo aggiornerò presto. Questo progetto ti mostrerà cosa puoi fare con LabDroid. Dato che un Hello World è normalmente realizzato in base a testo, luce o suono, ho pensato per LabDr
Decodificatore Morse ad albero binario: 7 passaggi (con immagini)
Binary Tree Morse Decoder: a.articles {font-size: 110.0%; font-weight: grassetto; stile del carattere: corsivo; decorazione del testo: nessuna; background-color: red;} a.articles:hover {background-color: black;} Questa istruzione spiega come decodificare il codice Morse usando un Arduino Uno R3.T
Come realizzare un semplice decodificatore di linea telefonica DTMF (tono): 3 passaggi
Come realizzare un semplice decodificatore di linea telefonica DTMF (tono): Questo è un semplice progetto che consente di decodificare i segnali DTMF praticamente su qualsiasi linea telefonica. In questo tutorial, stiamo utilizzando il decoder MT8870D. Usiamo un decoder di toni precostruito perché, credetemi, è una spina nel fianco provare a farlo con il
Decodificatore di protocollo di controllo remoto RC5 senza libreria: 4 passaggi
Decodificatore di protocollo di controllo remoto RC5 senza libreria: prima di decodificare rc5, discutiamo prima cosa è il comando rc5 e qual è la sua struttura. quindi fondamentalmente il comando rc5 utilizzato nei telecomandi utilizzati in televisori, lettori cd, d2h, sistemi home theater ecc. ha 13 o 14 bit disposti in un
Come programmare il decodificatore IR per il controllo del motore CA a più velocità: 7 passaggi
Come programmare il decodificatore IR per il controllo del motore CA a più velocità: I motori a corrente alternata monofase si trovano in genere in articoli per la casa come i ventilatori e la loro velocità può essere facilmente controllata quando si utilizza un numero di avvolgimenti discreti per le velocità impostate. In questo Instructable costruiamo un controller digitale che