Tartalomjegyzék:

Teljes Arduino rotációs megoldás: 5 lépés
Teljes Arduino rotációs megoldás: 5 lépés

Videó: Teljes Arduino rotációs megoldás: 5 lépés

Videó: Teljes Arduino rotációs megoldás: 5 lépés
Videó: Arduino Servo Control: How to Make a Laser Turret with XOD 2024, Július
Anonim
Teljes Arduino rotációs megoldás
Teljes Arduino rotációs megoldás

A forgó kódolók elfordítható vezérlőgombok elektronikus projektekhez, gyakran használják az Arduino család mikrovezérlőivel. Használhatók a paraméterek finomhangolására, a menükben való navigálásra, objektumok mozgatására a képernyőn, bármilyen érték beállítására. Ezek gyakori helyettesítői a potenciométereknek, mivel pontosabban és végtelenül elforgathatók, egy -egy diszkrét értéket növelnek vagy csökkentenek, és gyakran egy tolható kapcsolóval vannak integrálva a kiválasztási jellegű funkciókhoz. Mindenféle formában és méretben megtalálhatók, de a legalacsonyabb árkategóriát nehéz kezelni, amint azt az alábbiakban ismertetjük.

Számtalan cikk található a forgó kódolók működési részleteiről és használati módjairól, valamint számos mintakód és könyvtár a használatukról. Az egyetlen probléma az, hogy egyik sem működik 100% -osan pontosan a legalacsonyabb árkategóriájú kínai forgó modulokkal.

1. lépés: Rotary Encoders Inside

Forgó kódolók belül
Forgó kódolók belül
Forgó kódolók belül
Forgó kódolók belül
Forgó kódolók belül
Forgó kódolók belül

A jeladó forgó részének három csapja van (és további kettő az opcionális kapcsoló részhez). Az egyik közös (fekete GND), a másik kettő az irány meghatározására szolgál, amikor a gombot elfordítják (ezeket gyakran kék CLK -nak és piros DT -nek hívják). Mindkettő a mikrokontroller PULLUP bemeneti érintkezőjéhez van csatlakoztatva, így a HIGH szint az alapértelmezett érték. Ha a gombot előre (vagy az óramutató járásával megegyező irányba) forgatja, először a kék CLK a LOW szintre csökken, majd a piros DT következik. Tovább fordulva a kék CLK visszamarad a HIGH -ra, majd amikor a közös GND -patch elhagyja mindkét csatlakozócsapot, a piros DT is visszaáll a HIGH -ra. Így töltsön ki egy teljes pipát FWD (vagy az óramutató járásával megegyezően). Ugyanez vonatkozik a BWD másik irányára (vagy az óramutató járásával ellentétes irányba), de most először a piros esik le, a kék pedig utoljára emelkedik vissza, ahogy a kétszintes képeken látható.

2. lépés: Sokak számára valódi fájdalmat okozó nyomor

A sors sokaknak valódi fájdalmat okoz
A sors sokaknak valódi fájdalmat okoz
A sors sokaknak valódi fájdalmat okoz
A sors sokaknak valódi fájdalmat okoz
A sors sokak számára valódi fájdalmat okoz
A sors sokak számára valódi fájdalmat okoz

Gyakori probléma az Arduino hobbisták számára, hogy az olcsó Rotary encoder modulok extra változásokat eredményeznek a kimeneti szintekben, ami extra és rossz irányszám -leolvasást okoz. Ez megakadályozza a hibátlan számlálást, és lehetetlenné teszi ezen modulok integrálását a pontos forgó projektekbe. Ezeket az extra visszapattanásokat a tapaszok mechanikus mozgása okozza a csatlakozócsapokon, és még extra kondenzátorok alkalmazása sem tudja teljesen megszüntetni őket. Az ugrálások a teljes kullancsciklusban bárhol megjelenhetnek, és a képeken látható valós forgatókönyvek illusztrálják.

3. lépés: Véges állapotú gép (FSM) megoldás

Véges állapotú gép (FSM) megoldás
Véges állapotú gép (FSM) megoldás

A kép a két csap (kék CLK és piros DT) lehetséges szintváltozásainak teljes állapotterületét mutatja, mind a helyes, mind a hamis visszapattanások esetén. Ennek az állapotgépnek az alapján egy teljes megoldás programozható, amely mindig 100% -osan működik. Mivel ebben a megoldásban nincs szükség szűrési késleltetésre, ez a lehető leggyorsabb is. A csapok állapottérének a munkamódtól való elválasztásának másik előnye, hogy tetszés szerint alkalmazhat lekérdezési vagy megszakítási módokat. A lekérdezés vagy a megszakítások észlelhetik a csapok szintváltozásait, és egy külön rutin kiszámítja az új állapotot az aktuális állapot és a szintváltozások tényleges eseményei alapján.

4. lépés: Arduino kód

Arduino kód
Arduino kód

Az alábbi kód megszámolja az FWD és BWD kullancsokat a soros monitoron, és integrálja az opcionális kapcsoló funkciót is.

// Csurgay Péter 2019-04-10

// A forgó csapjai az Arduino portokhoz vannak hozzárendelve

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

// A forgó által hangolt számláló aktuális és előző értéke

int curVal = 0; int prevVal = 0;

// Az FSM (véges állapotú gép) hét állapota

#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 ("Start…"); // A HIGH szint lesz az alapértelmezett minden csapnál pinMode (SW, INPUT_PULLUP); pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); // Mind a CLK, mind a DT megszakításokat vált ki minden szintváltozáshoz attachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE); attachInterrupt (digitalPinToInterrupt (DT), rotaryDT, CHANGE); }

void loop () {

// Az opcionális kapcsoló kezelése néhány forgó jeladóba, ha (digitalRead (SW) == LOW) {Serial.println ("Pressed"); while (! digitalRead (SW)); } // A számláló értékének bármilyen változása megjelenik a Soros monitorban, ha (curVal! = PrevVal) {Serial.println (curVal); prevVal = curVal; }}

// Állapotgép -átmenetek CLK szintű változásokhoz

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

// Állapotgép -átmenetek a DT szintű változásokhoz

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

5. lépés: Hibátlan integráció

A mellékelt videóban ellenőrizheti, hogy az FSM megoldás pontosan és gyorsan működik -e, még akkor is, ha a szórványos visszapattanási effektusokkal rendelkező kis hatótávolságú forgó jeladók vannak.

Ajánlott: