Satura rādītājs:
- 1. darbība: rotējošie kodētāji iekšpusē
- 2. solis: posts, kas daudziem rada patiesas sāpes
- 3. solis: galīgā stāvokļa mašīnas (FSM) risinājums
- 4. solis: Arduino kods
- 5. solis: nevainojama integrācija
Video: Pilnīgs Arduino rotācijas risinājums: 5 soļi
2024 Autors: John Day | [email protected]. Pēdējoreiz modificēts: 2024-01-30 10:56
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ē
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
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
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
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:
Vintage signālu ģeneratora pilnīgs remonts: 8 soļi
Pilnīgs Vintage signālu ģeneratora kapitālais remonts: pirms dažiem gadiem es iegādājos Eico 320 RF signālu ģeneratoru šķiņķa radio apmaiņas sanāksmē par pāris dolāriem, bet līdz šim nekad neesmu neko darījis. Šim signālu ģeneratoram ir pieci pārslēdzami diapazoni no 150 kHz līdz 36 MHz un ar ha
Pilnīgs viedās mājas papildinājums: 8 soļi
Pilnīgs viedās mājas papildinājums: mans iepriekšējais projekts " Pilnīgā viedā māja " veiksmīgi darbojas gandrīz 5 gadus bez problēmām. Tagad, kad es nolēmu pievienot atgriezenisko saiti, nemainot pašreizējo shēmu un shēmu. Tātad šis papildinājums pro
Pilnīgs iesācēju ceļvedis SMD lodēšanai: 5 soļi (ar attēliem)
Pilnīgs iesācēju ceļvedis SMD lodēšanai: Labi, tāpēc lodēšana ir diezgan vienkārša detaļām caur caurumiem, bet tad ir reizes, kad jums ir jāiet sīki *ievietojiet atsauci uz cilvēku šeit *, un TH lodēšanas iemācītās prasmes vienkārši nav pieteikties vairs. Laipni lūdzam pasaulē
Pilnīgs ceļvedis augsnes mitruma sensora lietošanai ar praktisku piemēru: 7 soļi
Pilnīgs ceļvedis augsnes mitruma sensora izmantošanai W/ praktisks piemērs: šo un citas pārsteidzošas pamācības varat izlasīt ElectroPeak oficiālajā vietnē Pārskats Šajā apmācībā jūs uzzināsit, kā izmantot augsnes mitruma sensoru. Ir sniegti arī praktiski piemēri, lai palīdzētu apgūt kodu. Ko jūs uzzināsit: kā augsne
Pieejams redzes risinājums ar robota roku, pamatojoties uz Arduino: 19 soļi (ar attēliem)
Pieejams redzes risinājums ar robota roku, pamatojoties uz Arduino: Kad mēs runājam par mašīnas redzi, tas mums vienmēr šķiet tik nesasniedzams. Kamēr mēs izveidojām atklātu redzes demonstrāciju, kuru būtu ļoti viegli izgatavot ikvienam. Šajā video ar OpenMV kameru neatkarīgi no tā, kur atrodas sarkanais kubs, robots ir