Satura rādītājs:

Pilnīgs Arduino rotācijas risinājums: 5 soļi
Pilnīgs Arduino rotācijas risinājums: 5 soļi

Video: Pilnīgs Arduino rotācijas risinājums: 5 soļi

Video: Pilnīgs Arduino rotācijas risinājums: 5 soļi
Video: Could this tiny tube of metal fix our broken suspension? - Edd China's Workshop Diaries 28 2024, Jūlijs
Anonim
Pilnīgs Arduino rotācijas risinājums
Pilnīgs Arduino rotācijas risinājums

Rotējošie kodētāji ir pagriežamas vadības pogas elektroniskiem projektiem, ko bieži izmanto kopā ar Arduino ģimenes mikrokontrolleriem. Tos var izmantot, lai precizētu parametrus, pārvietotos izvēlnēs, pārvietotu objektus uz ekrāna, iestatītu jebkura veida vērtības. Tie ir bieži sastopami potenciometru aizstājēji, jo tos var pagriezt precīzāk un bezgalīgi, tie palielina vai samazina pa vienai atsevišķai vērtībai vienlaikus un bieži vien ir integrēti ar nospiežamu slēdzi, lai atlasītu dažādas funkcijas. Tie ir visu formu un izmēru, taču zemāko cenu diapazonu ir grūti saskarties, kā paskaidrots turpmāk.

Ir neskaitāmi raksti par rotējošo kodētāju darba detaļām un lietošanas veidiem, kā arī daudzi paraugu kodi un bibliotēkas par to izmantošanu. Vienīgā problēma ir tā, ka neviens no tiem nedarbojas 100% precīzi ar zemākā cenu diapazona ķīniešu rotācijas moduļiem.

1. darbība: rotējošie kodētāji iekšpusē

Rotācijas kodētāji iekšpusē
Rotācijas kodētāji iekšpusē
Rotācijas kodētāji iekšpusē
Rotācijas kodētāji iekšpusē
Rotācijas kodētāji iekšpusē
Rotācijas kodētāji iekšpusē

Kodētāja rotējošajai daļai ir trīs tapas (un vēl divas papildu slēdža daļai). Viens ir kopīgs (melns GND), pārējie divi ir paredzēti virziena noteikšanai, pagriežot pogu (tos bieži sauc par zilu CLK un sarkanu DT). Abi šie elementi ir pievienoti mikrokontrollera PULLUP ievades tapai, padarot līmeni HIGH par noklusējuma rādījumu. Kad poga ir pagriezta uz priekšu (vai pulksteņrādītāja virzienā), vispirms zilais CLK nokrīt līdz LOW līmenim, pēc tam seko sarkanais DT. Pagriežoties tālāk, zils CLK paceļas atpakaļ uz HIGH, tad, kad kopējais GND plāksteris atstāj abas savienojuma tapas, arī sarkanais DT paceļas atpakaļ uz HIGH. Tādējādi aizpildot vienu pilnu atzīmi FWD (vai pulksteņrādītāja virzienā). Tas pats attiecas uz otru BWD virzienu (vai pretēji pulksteņrādītāja virzienam), bet tagad vispirms nokrīt sarkanā krāsa, bet pēdējā-zilā krāsa, kā parādīts attiecīgi divu līmeņu attēlos.

2. solis: posts, kas daudziem rada patiesas sāpes

Bēdas, kas daudziem sagādā patiesas sāpes
Bēdas, kas daudziem sagādā patiesas sāpes
Bēdas, kas daudziem sagādā patiesas sāpes
Bēdas, kas daudziem sagādā patiesas sāpes
Bēdas, kas daudziem sagādā patiesas sāpes
Bēdas, kas daudziem sagādā patiesas sāpes

Bieža problēma Arduino entuziastiem ir tas, ka lēti rotējošie kodētāja moduļi rada papildu izmaiņas izvades līmeņos, izraisot papildu un nepareizus virziena skaitīšanas rādījumus. Tas novērš nevainojamu skaitīšanu un neļauj integrēt šos moduļus precīzos rotācijas projektos. Šos papildu atlēcienus izraisa plāksteru mehāniskās kustības virs savienojuma tapām, un pat papildu kondensatoru pielietošana nevar tos pilnībā novērst. Atlekšana var parādīties jebkur pilnu ērču ciklu laikā, un attēlus ilustrē reālās dzīves scenāriji.

3. solis: galīgā stāvokļa mašīnas (FSM) risinājums

Finite State Machine (FSM) risinājums
Finite State Machine (FSM) risinājums

Attēlā redzama visu iespējamo līmeņu izmaiņu stāvokļa telpa abām tapām (zilā CLK un sarkanā DT), gan pareizām, gan viltus atlēcieniem. Pamatojoties uz šo stāvokļa mašīnu, var ieprogrammēt pilnīgu risinājumu, kas vienmēr darbojas 100% precīzi. Tā kā šajā risinājumā nav nepieciešama filtrēšanas aizkavēšanās, tas ir arī ātrākais iespējamais. Vēl viena priekšrocība, atdalot tapas stāvokļa telpu no darba režīma, ir tā, ka pēc savas patikas var izmantot gan aptaujas, gan pārtraukšanas režīmus. Aptauja vai pārtraukumi var noteikt tapas līmeņa izmaiņas, un atsevišķa rutīna aprēķinās jauno stāvokli, pamatojoties uz pašreizējo stāvokli un faktiskajiem līmeņa izmaiņu notikumiem.

4. solis: Arduino kods

Arduino kods
Arduino kods

Zemāk esošais kods skaita FWD un BWD ērces sērijveida monitorā, kā arī integrē izvēles slēdža funkciju.

// Peter Csurgay 2019-04-10

// Rotācijas tapas, kas kartētas ar Arduino ostām

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

// Pašreizējā un iepriekšējā skaitītāja vērtība, ko noregulē rotējošais

int curVal = 0; int prevVal = 0;

// Septiņi MFV stāvokļi (ierobežota stāvokļa mašīna)

#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;

void setup () {

Serial.begin (250000); Serial.println ("Sākt …"); // HIGH līmenis būs noklusējums visām tapām pinMode (SW, INPUT_PULLUP); pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); // Gan CLK, gan DT aktivizēs pārtraukumus visām līmeņu izmaiņām attachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE); attachInterrupt (digitalPinToInterrupt (DT), rotaryDT, CHANGE); }

void loop () {

// Dažos rotācijas kodētājos integrēta papildu slēdža apstrāde, ja (digitalRead (SW) == LOW) {Serial.println ("Pressed"); while (! digitalRead (SW)); } // Visas skaitītāja vērtības izmaiņas tiek parādītas Serial Monitor, ja (curVal! = PrevVal) {Serial.println (curVal); prevVal = curVal; }}

// Statusa mašīnu pārejas CLK līmeņa izmaiņām

void rotaryCLK () {if (digitalRead (CLK) == LOW) {if (state == IDLE_11) state = SCLK_01; cits if (štats == SCLK_10) stāvoklis = SCLK_00; cits if (valsts == SDT_10) stāvoklis = SDT_00; } cits {if (state == SCLK_01) state = IDLE_11; cits if (štats == SCLK_00) stāvoklis = SCLK_10; cits if (valsts == SDT_00) stāvoklis = SDT_10; cits if (valsts == SDT_01) {valsts = IDLE_11; līkne--; }}}

// Stāvokļa mašīnas pārejas DT līmeņa izmaiņām

void rotaryDT () {if (digitalRead (DT) == LOW) {if (state == IDLE_11) state = SDT_10; cits if (valsts == SDT_01) stāvoklis = SDT_00; cits if (štats == SCLK_01) stāvoklis = SCLK_00; } cits {if (state == SDT_10) state = IDLE_11; cits if (štats == SDT_00) stāvoklis = SDT_01; cits if (štats == SCLK_00) stāvoklis = SCLK_01; cits if (štats == SCLK_10) {valsts = IDLE_11; curVal ++; }}}

5. solis: nevainojama integrācija

Pievienotajā videoklipā varat pārbaudīt, vai FSM risinājums darbojas precīzi un ātri pat zema diapazona rotācijas kodētāju gadījumā ar dažādiem sporādiskiem atlēcienu efektiem.

Ieteicams: