Taula de continguts:
- Pas 1: codificadors rotatius a l'interior
- Pas 2: La misèria que causa dolor real a molts
- Pas 3: solució de màquina d'estat finit (FSM)
- Pas 4: Codi Arduino
- Pas 5: integració perfecta
Vídeo: Una solució rotativa Arduino completa: 5 passos
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:14
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
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
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)
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
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:
Una solució de visió assequible amb braç de robot basat en Arduino: 19 passos (amb imatges)
Una solució de visió assequible amb braç de robot basat en Arduino: quan parlem de visió artificial, sempre ens resulta tan inabastable. Tot i que vam fer una demostració de visió de codi obert que seria molt fàcil de fer per a tothom. En aquest vídeo, amb la càmera OpenMV, independentment d’on estigui el cub vermell, el robot és
Una solució senzilla al problema de la mà infame: 9 passos
Una solució senzilla per al famós problema de la mà amiga: recentment, he comprat una d’aquestes mans econòmiques i he començat a notar que les "mans" esgotaven, així que vaig intentar trobar una solució intel·ligent (i barata, per descomptat) per a aquest petit problema. El problema és aquest: el cargol fix era
Una solució de Media Center fins i tot la dona i els nens faran servir: 9 passos
Una solució de Media Center fins i tot que faran servir la dona i els nens: aquest instructiu és un resum de la meva experiència provant una gran varietat d'aplicacions, sistemes operatius, maquinari i formats de fitxer de media center. Això no és un PVR com i no us permet gravar o pausar la televisió en directe, tot i que us suggeriré una bona alternativa
Una altra solució de tercera mà: 6 passos
Una altra solució de tercera mà: no és una cosa nova. Durant un temps estava planejant fer de tercera mà, així que se m’acut … Podeu dir que és una tercera mà multifuncional
Solució completa de la bateria del raspall de dents Sonic Oral-B: 8 passos
Correcció de la bateria del raspall de dents Sonic Complete Oral-B: aquest projecte mostra com substituir les bateries d’un raspall de dents Oral-B Sonic Complete. Es tracta d’un excel·lent raspall de dents elèctric, però Oral-B us diu que el llenceu quan moren les bateries recarregables internes de Ni-CD. A part del malbaratament de tha