INHOUDSOPGAWE:

N Volledige Arduino -roterende oplossing: 5 stappe
N Volledige Arduino -roterende oplossing: 5 stappe

Video: N Volledige Arduino -roterende oplossing: 5 stappe

Video: N Volledige Arduino -roterende oplossing: 5 stappe
Video: Грунтовка развод маркетологов? ТОП-10 вопросов о грунтовке. 2024, November
Anonim
'N Volledige roterende oplossing van Arduino
'N Volledige roterende oplossing van Arduino

Draaikodeerders is draaibare knoppies vir elektroniese projekte, wat dikwels saam met die Arduino -familie -mikrobeheerders gebruik word. Dit kan gebruik word om parameters te verfyn, deur spyskaarte te navigeer, voorwerpe op die skerm te skuif, waardes van enige aard in te stel. Dit is algemene vervangings vir potensiometers, omdat dit meer akkuraat en oneindig gedraai kan word, dit verhoog of verlaag een diskrete waarde op 'n slag, en word dikwels geïntegreer met 'n drukknop vir funksies van die keuse. Hulle kom in alle vorms en groottes voor, maar die laagste prysklas is moeilik om mee te skakel, soos hieronder uiteengesit.

Daar is talle artikels oor die werkbesonderhede en gebruiksmodi van Rotary -enkoders, en talle voorbeeldkodes en biblioteke oor hoe om dit te gebruik. Die enigste probleem is dat nie een van hulle 100% akkuraat werk met die Chinese roterende modules met die laagste prysklas nie.

Stap 1: Draaikoders binne

Draaikoders binne
Draaikoders binne
Draaikoders binne
Draaikoders binne
Draaikoders binne
Draaikoders binne

Die roterende deel van die encoder het drie penne (en nog twee vir die opsionele skakelaar). Die een is gemene saak (swart GND), die ander twee is om die rigting te bepaal wanneer die knop gedraai word (hulle word dikwels blou CLK en rooi DT genoem). Beide is gekoppel aan 'n PULLUP -invoerpen van die mikrobeheerder, wat die vlak HOOG hul standaardlesing maak. As die knop vorentoe (of met die kloksgewys) gedraai word, val die blou CLK eers tot vlak LAAG, dan volg rooi DT. As ons verder draai, styg blou CLK terug na HIGH, en as die algemene GND -pleister albei verbindingspenne verlaat, styg rooi DT ook terug na HIGH. Hiermee voltooi u 'n volle regmerkie FWD (of kloksgewys). Dieselfde geld vir die ander rigting BWD (of teen die kloksgewys), maar nou val rooi eerste, en blou styg laas terug soos getoon in die twee vlakbeelde.

Stap 2: ellende wat vir baie mense pyn veroorsaak

Ellende wat vir baie mense pyn veroorsaak
Ellende wat vir baie mense pyn veroorsaak
Ellende wat vir baie mense pyn veroorsaak
Ellende wat vir baie mense pyn veroorsaak
Ellende wat vir baie mense pyn veroorsaak
Ellende wat vir baie mense pyn veroorsaak

'N Algemene probleem vir Arduino -stokperdjies, dat goedkoop Rotary -enkodeermodules ekstra veranderinge in die uitsetvlakke oplewer, wat ekstra en verkeerde rigtingsmetings veroorsaak. Dit voorkom foutlose tel en maak dit onmoontlik om hierdie modules in akkurate roterende projekte te integreer. Hierdie ekstra bons word veroorsaak deur die meganiese bewegings van die pleisters oor die aansluitpenne, en selfs die toediening van ekstra kapasitors kan dit nie heeltemal uitskakel nie. Weiering kan oral in die volledige bosluisiklusse verskyn en word geïllustreer deur werklike scenario's op die beelde.

Stap 3: Finite State Machine (FSM) -oplossing

Finite State Machine (FSM) oplossing
Finite State Machine (FSM) oplossing

Die beeld toon die volle toestand van die moontlike vlakveranderings vir die twee penne (blou CLK en rooi DT), beide vir korrekte en vals weiering. Op grond van hierdie staatsmasjien kan 'n volledige oplossing geprogrammeer word wat altyd 100% akkuraat werk. Omdat geen filtervertragings in hierdie oplossing nodig is nie, is dit ook die vinnigste moontlike. 'N Ander voordeel van die skeiding van die penne se staatsruimte van die werkmodus is dat 'n mens sowel die peilings- as die onderbrekingsmodus na eie smaak kan toepas. Peiling of onderbrekings kan vlakveranderinge op penne opspoor en 'n aparte roetine sal die nuwe toestand bereken op grond van die huidige toestand en die werklike gebeurtenisse van vlakveranderinge.

Stap 4: Arduino -kode

Arduino -kode
Arduino -kode

Die onderstaande kode tel die FWD- en BWD -bosluise op die seriële monitor en integreer ook die opsionele skakelfunksie.

// Peter Csurgay 2019-04-10

// Pennetjies van die rotator wat na Arduino -poorte gekarteer is

#definieer SW 21 #definieer CLK 22 #definieer DT 23

// Huidige en vorige waarde van die toonbank wat deur die draaiknop afgestel is

int curVal = 0; int prevVal = 0;

// Sewe state van FSM (eindige toestand masjien)

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

ongeldige opstelling () {

Serial.begin (250000); Serial.println ("Begin …"); // Vlak HOOG sal standaard wees vir alle penne pinMode (SW, INPUT_PULLUP); pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); // Beide CLK en DT sal onderbrekings veroorsaak vir alle vlakveranderinge attachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE); attachInterrupt (digitalPinToInterrupt (DT), rotaryDT, CHANGE); }

leemte -lus () {

// Hantering van die opsionele skakelaar wat in 'n paar roterende enkoders geïntegreer is as (digitalRead (SW) == LOW) {Serial.println ("Pressed"); terwyl (! digitalRead (SW)); } // Enige verandering in die tellerwaarde word in Serial Monitor vertoon as (curVal! = PrevVal) {Serial.println (curVal); prevVal = curVal; }}

// Staatsmasjienoorgange vir CLK -vlakveranderings

void rotaryCLK () {if (digitalRead (CLK) == LOW) {if (state == IDLE_11) state = SCLK_01; anders as (toestand == SCLK_10) toestand = SCLK_00; anders as (toestand == SDT_10) toestand = SDT_00; } anders {if (state == SCLK_01) state = IDLE_11; anders as (toestand == SCLK_00) toestand = SCLK_10; anders as (toestand == SDT_00) toestand = SDT_10; anders as (staat == SDT_01) {toestand = IDLE_11; curVal--; }}}

// Staatsmasjienoorgange vir veranderinge op DT -vlak

void rotaryDT () {if (digitalRead (DT) == LOW) {if (state == IDLE_11) state = SDT_10; anders as (toestand == SDT_01) toestand = SDT_00; anders as (toestand == SCLK_01) toestand = SCLK_00; } anders {if (state == SDT_10) state = IDLE_11; anders as (toestand == SDT_00) toestand = SDT_01; anders as (toestand == SCLK_00) toestand = SCLK_01; anders as (staat == SCLK_10) {toestand = IDLE_11; curVal ++; }}}

Stap 5: Foutlose integrasie

U kan in die aangehegte video kyk of die FSM -oplossing akkuraat en vinnig werk, selfs in die geval van 'n lae reeks roterende enkoders met verskillende sporadiese weieringseffekte.

Aanbeveel: