Taula de continguts:

Una solució rotativa Arduino completa: 5 passos
Una solució rotativa Arduino completa: 5 passos

Vídeo: Una solució rotativa Arduino completa: 5 passos

Vídeo: Una solució rotativa Arduino completa: 5 passos
Vídeo: Motor Paso a Paso con Driver L298n _full español . 2024, Desembre
Anonim
Una solució rotativa Arduino completa
Una solució rotativa Arduino completa

Els codificadors rotatius són comandaments giratoris per a projectes electrònics, sovint utilitzats amb microcontroladors de la família Arduino. Es poden utilitzar per afinar paràmetres, navegar pels menús, moure objectes a la pantalla, establir valors de qualsevol tipus. Són substitucions habituals per a potenciòmetres, ja que es poden girar amb més precisió i infinitat, augmenten o disminueixen un valor discret a la vegada i sovint s’integren amb un commutador empenyible per a funcions de selecció. Es presenten en totes les formes i mides, però és difícil relacionar el rang de preus més baix, tal com s’explica a continuació.

Hi ha infinitat d'articles sobre els detalls de treball i els modes d'ús dels codificadors rotatius, i nombrosos codis de mostra i biblioteques sobre com utilitzar-los. L’únic problema és que cap d’ells funciona al 100% amb precisió amb els mòduls rotatius xinesos de la gamma de preus més baixa.

Pas 1: codificadors rotatius a l'interior

Codificadors rotatius a l'interior
Codificadors rotatius a l'interior
Codificadors rotatius a l'interior
Codificadors rotatius a l'interior
Codificadors rotatius a l'interior
Codificadors rotatius a l'interior

La part giratòria del codificador té tres pins (i dos més per a la part d’interruptor opcional). Un és un terreny comú (GND negre), els altres dos serveixen per determinar la direcció quan es gira el comandament (se solen anomenar blau CLK i vermell DT). Tots dos s’uneixen a un pin d’entrada PULLUP del microcontrolador, cosa que fa que el nivell HIGH sigui la seva lectura per defecte. Quan el comandament es gira cap endavant (o en el sentit de les agulles del rellotge), primer el CLK blau cau al nivell BAIX i després el DT vermell. Si es gira més, el blau CLK torna a pujar a HIGH, i a mesura que el pegat GND comú deixa els dos pins de connexió, el DT vermell també torna a HIGH. Completant així una marca completa FWD (o en sentit horari). El mateix passa amb l’altra direcció BWD (o en sentit contrari a les agulles del rellotge), però ara el vermell cau primer i el blau puja darrere com es mostra a les imatges de dos nivells respectivament.

Pas 2: La misèria que causa dolor real a molts

La misèria que causa dolor real a molts
La misèria que causa dolor real a molts
La misèria que causa dolor real a molts
La misèria que causa dolor real a molts
La misèria que causa dolor real a molts
La misèria que causa dolor real a molts

Problema comú per als aficionats a l’Arduino: els mòduls de codificador rotatiu barats reboten canvis addicionals en els nivells de sortida, provocant lectures de recompte de direcció addicionals i incorrectes. Això evita un recompte impecable i fa impossible integrar aquests mòduls en projectes rotatius precisos. Aquests rebots addicionals són causats pels moviments mecànics dels pegats sobre els pins de connexió, i fins i tot aplicar condensadors addicionals no els pot eliminar completament. Els rebots poden aparèixer a qualsevol lloc dels cicles complets de tick i estan il·lustrats per escenaris de la vida real a les imatges.

Pas 3: solució de màquina d'estat finit (FSM)

Solució de màquina d'estat finit (FSM)
Solució de màquina d'estat finit (FSM)

La imatge mostra l'espai d'estat complet dels possibles canvis de nivell per als dos pins (blau CLK i vermell DT), tant per rebots correctes com falsos. Basant-se en aquesta màquina d’estats es pot programar una solució completa que sempre funcioni al 100% amb precisió. Com que no són necessaris retards de filtratge en aquesta solució, també és el més ràpid possible. Un altre avantatge de separar l’espai d’estat dels pins del mode de treball és que es poden aplicar modes de sondeig o interrupció al seu gust. El sondeig o les interrupcions poden detectar canvis de nivell als pins i una rutina independent calcularà el nou estat en funció de l'estat actual i dels esdeveniments reals dels canvis de nivell.

Pas 4: Codi Arduino

Codi Arduino
Codi Arduino

El codi següent compta les marques FWD i BWD al monitor sèrie i també integra la funció de commutador opcional.

// Peter Csurgay 2019-04-10

// Pins dels rotatius assignats als ports Arduino

#define SW 21 #define CLK 22 #define DT 23

// Valor actual i anterior del comptador sintonitzat pel rotatiu

int curVal = 0; int prevVal = 0;

// Set estats de FSM (màquina d'estats finits)

#define IDLE_11 0 #define SCLK_01 1 #define SCLK_00 2 #define SCLK_10 3 #define SDT_10 4 #define SDT_00 5 #define SDT_01 6 int state = IDLE_11;

configuració nul·la () {

Serial.begin (250000); Serial.println ("Inici …"); // El nivell HIGH serà per defecte per a tots els pins pinMode (SW, INPUT_PULLUP); pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); // Tant CLK com DT provocaran interrupcions per a tots els canvis de nivell attachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE); attachInterrupt (digitalPinToInterrupt (DT), rotaryDT, CHANGE); }

bucle buit () {

// Maneig del commutador opcional integrat en alguns codificadors rotatius if (digitalRead (SW) == LOW) {Serial.println ("Pressed"); mentre (! digitalRead (SW)); } // Qualsevol canvi en el valor del comptador es mostra a Serial Monitor si (curVal! = PrevVal) {Serial.println (curVal); prevVal = curVal; }}

// Transicions de màquina d'estat per als canvis de nivell CLK

void rotaryCLK () {if (digitalRead (CLK) == BAIX) {if (state == IDLE_11) state = SCLK_01; else if (state == SCLK_10) state = SCLK_00; else if (state == SDT_10) state = SDT_00; } else {if (state == SCLK_01) state = IDLE_11; else if (state == SCLK_00) state = SCLK_10; else if (state == SDT_00) state = SDT_10; else if (estat == SDT_01) {estat = IDLE_11; curVal--; }}}

// Estat Transicions de màquina per als canvis de nivell DT

void rotaryDT () {if (digitalRead (DT) == BAIX) {if (state == IDLE_11) state = SDT_10; else if (state == SDT_01) state = SDT_00; else if (state == SCLK_01) state = SCLK_00; } else {if (state == SDT_10) state = IDLE_11; else if (state == SDT_00) state = SDT_01; else if (state == SCLK_00) state = SCLK_01; else if (estat == SCLK_10) {estat = IDLE_11; curVal ++; }}}

Pas 5: integració perfecta

Podeu comprovar al vídeo adjunt que la solució FSM funciona amb precisió i rapidesa, fins i tot en cas de codificadors rotatius de rang baix amb diversos efectes de rebot esporàdics.

Recomanat: