Përmbajtje:

Një zgjidhje e plotë rrotulluese Arduino: 5 hapa
Një zgjidhje e plotë rrotulluese Arduino: 5 hapa

Video: Një zgjidhje e plotë rrotulluese Arduino: 5 hapa

Video: Një zgjidhje e plotë rrotulluese Arduino: 5 hapa
Video: Как измерить любое напряжение постоянного тока с Arduino ARDVC-01 2024, Nëntor
Anonim
Një zgjidhje e plotë rrotulluese Arduino
Një zgjidhje e plotë rrotulluese Arduino

Kodifikuesit rrotullues janë çelësa kontrolli të kthyeshëm për projekte elektronike, të përdorura shpesh me mikrokontrolluesit e familjes Arduino. Ato mund të përdoren për të rregulluar parametrat, për të lundruar në menutë, për të lëvizur objektet në ekran, për të vendosur vlerat e çdo lloji. Ato janë zëvendësime të zakonshme për potenciometrat, sepse ato mund të rrotullohen më saktë dhe pafundësisht, ato rrisin ose zvogëlojnë një vlerë diskrete në të njëjtën kohë, dhe shpesh integrohen me një ndërprerës të shtytshëm për funksionet e llojit të përzgjedhjes. Ato vijnë në të gjitha format dhe madhësitë, por vargu i çmimeve më të ulët është i vështirë për tu ndërlidhur siç shpjegohet më poshtë.

Ka artikuj të panumërt në lidhje me detajet e punës dhe mënyrat e përdorimit të koduesve Rotary, dhe kode të shumta mostre dhe biblioteka se si t'i përdorin ato. Problemi i vetëm është se asnjëri prej tyre nuk funksionon 100% i saktë me modulet rrotulluese kineze të çmimit më të ulët.

Hapi 1: Kodifikuesit rrotullues brenda

Kodifikuesit rrotullues brenda
Kodifikuesit rrotullues brenda
Kodifikuesit rrotullues brenda
Kodifikuesit rrotullues brenda
Kodifikues rrotullues brenda
Kodifikues rrotullues brenda

Pjesa rrotulluese e kodifikuesit ka tre kunja (dhe dy të tjerë për pjesën e ndërrimit opsional). Njëra është pika e përbashkët (GND e zezë), dy të tjerat janë për përcaktimin e drejtimit kur rrotullohet çelësi (ato shpesh quhen CLK blu dhe DT të kuqe). Të dyja këto janë bashkangjitur në një pin hyrës PULLUP të mikrokontrolluesit, duke e bërë nivelin HIGH leximin e tyre të paracaktuar. Kur çelësi kthehet përpara (ose në drejtim të akrepave të orës), së pari CLK blu bie në nivelin LOW, pastaj DT e kuqe ndjek. Duke u kthyer më tej, CLK blu kthehet në HIGH, atëherë ndërsa arna e zakonshme GND largohet nga të dy kunjat e lidhjes, DT e kuqe gjithashtu ngrihet përsëri në HIGH. Duke plotësuar kështu një shënim të plotë FWD (ose në drejtim të akrepave të orës). E njëjta gjë vlen edhe për drejtimin tjetër BWD (ose kundër akrepave të orës), por tani e kuqja bie e para, dhe bluja kthehet e fundit, siç tregohet në dy imazhet përkatësisht.

Hapi 2: Mjerimi që shkakton dhimbje të vërteta për shumë njerëz

Mjerim që shkakton dhimbje të vërtetë për shumë njerëz
Mjerim që shkakton dhimbje të vërtetë për shumë njerëz
Mjerim që shkakton dhimbje të vërtetë për shumë njerëz
Mjerim që shkakton dhimbje të vërtetë për shumë njerëz
Mjerim që shkakton dhimbje të vërtetë për shumë njerëz
Mjerim që shkakton dhimbje të vërtetë për shumë njerëz

Problem i zakonshëm për hobistët Arduino, se modulet e lirë të kodimit Rotary kërcejnë ndryshime shtesë në nivelet e prodhimit, duke shkaktuar lexime shtesë dhe të gabuara të numërimit të drejtimit. Kjo parandalon numërimin e përsosur dhe e bën të pamundur integrimin e këtyre moduleve në projekte të sakta rrotulluese. Këto kërcime shtesë shkaktohen nga lëvizjet mekanike të arnave mbi kunjat e lidhjes, madje edhe aplikimi i kondensatorëve shtesë nuk mund t'i eliminojë ato plotësisht. Kërcimet mund të shfaqen kudo në ciklet e plota të shënimit dhe ilustrohen me skenarë të jetës reale në imazhe.

Hapi 3: Zgjidhja e makinës së gjendjes së fundme (FSM)

Zgjidhja e makinës së gjendjes së fundme (FSM)
Zgjidhja e makinës së gjendjes së fundme (FSM)

Imazhi tregon hapësirën e plotë të gjendjes së ndryshimeve të mundshme të nivelit për dy kunjat (CLK blu dhe DT e kuqe), si për kërcimet e sakta ashtu edhe ato të rreme. Bazuar në këtë makinë shtetërore, mund të programohet një zgjidhje e plotë që funksionon gjithmonë 100% e saktë. Për shkak se asnjë vonesë filtrimi nuk është e nevojshme në këtë zgjidhje, është gjithashtu më e shpejta e mundshme. Një përfitim tjetër i ndarjes së hapësirës së gjendjes së kunjave nga mënyra e punës është se dikush mund të aplikojë mënyrat e votimit ose të ndërpresë sipas dëshirës së tij. Sondazhi ose ndërprerjet mund të zbulojnë ndryshimet e nivelit në kunjat dhe një rutinë e veçantë do të llogarisë gjendjen e re bazuar në gjendjen aktuale dhe ngjarjet aktuale të ndryshimeve të nivelit.

Hapi 4: Kodi Arduino

Kodi Arduino
Kodi Arduino

Kodi më poshtë numëron rriqrat FWD dhe BWD në monitorin serik dhe gjithashtu integron funksionin opsional të kalimit.

// Peter Csurgay 2019-04-10

// Kunjat e rrotullimit të hartuar në portet Arduino

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

// Vlera aktuale dhe e mëparshme e numëruesit të akorduar nga rrotulluesi

int curVal = 0; int prevVal = 0;

// Shtatë gjendje të FSM (makinë me gjendje të fundme)

#përcakto IDLE_11 0 #përcakto SCLK_01 1 #përcakto SCLK_00 2 #përcakto SCLK_10 3 #përcakto SDT_10 4 #përcakto SDT_00 5 #përcakto SDT_01 6 gjendje int = IDLE_11;

void setup () {

Serial.filloj (250000); Serial.println ("Fillo …"); // Niveli i Lartë do të jetë i paracaktuar për të gjitha kunjat pinMode (SW, INPUT_PULLUP); pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); // Si CLK ashtu edhe DT do të shkaktojnë ndërprerje për të gjitha ndryshimet e nivelit attachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE); attachInterrupt (digitalPinToInterrupt (DT), rotaryDT, CHANGE); }

lak void () {

// Trajtimi i ndërprerësit opsional i integruar në disa kodues rrotullues nëse (digitalRead (SW) == LOW) {Serial.println ("Presed"); ndërsa (! digitalRead (SW)); } // Çdo ndryshim në vlerën e kundërsulmit shfaqet në Serial Monitor nëse (curVal! = PrevVal) {Serial.println (curVal); prevVal = curVal; }}

// Kalimet e Makinës Shtetërore për ndryshimet e nivelit CLK

void rotaryCLK () {if (digitalRead (CLK) == LOW) {if (gjendja == IDLE_11) gjendja = SCLK_01; tjetër nëse (gjendja == SCLK_10) gjendja = SCLK_00; tjetër nëse (gjendja == SDT_10) gjendja = SDT_00; } else {if (gjendja == SCLK_01) gjendja = IDLE_11; tjetër nëse (gjendja == SCLK_00) gjendja = SCLK_10; tjetër nëse (gjendja == SDT_00) gjendja = SDT_10; tjetër nëse (gjendje == SDT_01) {gjendje = IDLE_11; curVal--; }}}

// Kalimet e Makinës Shtetërore për ndryshimet e nivelit DT

void rotaryDT () {if (digitalRead (DT) == LOW) {if (gjendja == IDLE_11) gjendja = SDT_10; tjetër nëse (gjendje == SDT_01) gjendje = SDT_00; tjetër nëse (gjendja == SCLK_01) gjendja = SCLK_00; } else {if (gjendja == SDT_10) gjendja = IDLE_11; tjetër nëse (gjendja == SDT_00) gjendja = SDT_01; tjetër nëse (gjendja == SCLK_00) gjendja = SCLK_01; tjetër nëse (gjendje == SCLK_10) {gjendje = IDLE_11; curVal ++; }}}

Hapi 5: Integrimi pa të meta

Ju mund të kontrolloni në videon e bashkangjitur që zgjidhja FSM funksionon me saktësi dhe shpejt edhe në rast të kodifikuesve rrotullues me rreze të ulët me efekte të ndryshme sporadike të kërcimit.

Recommended: