Բովանդակություն:

Arduino- ի ամբողջական պտտվող լուծում. 5 քայլ
Arduino- ի ամբողջական պտտվող լուծում. 5 քայլ

Video: Arduino- ի ամբողջական պտտվող լուծում. 5 քայլ

Video: Arduino- ի ամբողջական պտտվող լուծում. 5 քայլ
Video: Կառավարեք AC լամպը Arduino AC Dimmer- ով 2024, Հուլիսի
Anonim
Ադուինոյի ամբողջական պտտվող լուծում
Ադուինոյի ամբողջական պտտվող լուծում

Պտտվող կոդավորիչները էլեկտրոնային նախագծերի համար պտտվող կառավարման կոճակներ են, որոնք հաճախ օգտագործվում են Arduino ընտանիքի միկրոկոնտրոլերների հետ: Դրանք կարող են օգտագործվել պարամետրերը ճշգրտելու, ընտրացանկերում նավարկելու, էկրանին օբյեկտներ տեղափոխելու և ցանկացած տեսակի արժեքներ սահմանելու համար: Դրանք սովորական փոխարինիչներ են պոտենցիոմետրերի համար, քանի որ դրանք կարող են ավելի ճշգրիտ և անվերջ պտտվել, դրանք միաժամանակ ավելացնում կամ նվազեցնում են մեկ դիսկրետ արժեք և հաճախ ինտեգրվում ընտրության տեսակի գործառույթների համար դրդվող անջատիչով: Նրանք գալիս են բոլոր ձևերի և չափերի, բայց ամենացածր գների միջակայքը դժվար է ինտերֆեյսի մեջ դնել, ինչպես բացատրվում է ստորև:

Կան անհամար հոդվածներ Rotary կոդավորիչների աշխատանքային մանրամասների և օգտագործման ռեժիմների մասին, ինչպես նաև բազմաթիվ նմուշների կոդեր և գրադարաններ, թե ինչպես օգտագործել դրանք: Միակ խնդիրն այն է, որ դրանցից ոչ մեկը 100% ճշգրիտ չի աշխատում չինական պտտվող մոդուլների ամենացածր գների միջակայքում:

Քայլ 1. Պտտվող կոդավորիչներ ներսում

Պտտվող կոդավորիչներ ներսում
Պտտվող կոդավորիչներ ներսում
Պտտվող կոդավորիչներ ներսում
Պտտվող կոդավորիչներ ներսում
Պտտվող կոդավորիչներ ներսում
Պտտվող կոդավորիչներ ներսում

Կոդավորիչի պտտվող հատվածն ունի երեք կապում (և ևս երկուսը `անջատիչի անջատիչ մասի համար): Մեկը ընդհանուր հիմք է (սև GND), մյուս երկուսը ՝ բռնակ պտտվող ուղղությամբ ուղղությունը որոշելու համար (դրանք հաճախ անվանում են կապույտ CLK և կարմիր DT): Սրանք երկուսն էլ կցված են միկրոկառավարիչի PULLUP մուտքագրման քորոցին ՝ բարձր մակարդակը դարձնելով իրենց կանխադրված ընթերցումը: Երբ կոճակը շրջվում է առաջ (կամ ժամացույցի սլաքի ուղղությամբ), սկզբում կապույտ CLK- ն ընկնում է LOW մակարդակի, այնուհետև հետևում է կարմիր DT- ին: Շրջվելով ՝ կապույտ CLK- ն վերադառնում է HIGH, այնուհետև, երբ սովորական GND կարկատանը թողնում է կապի երկու կապում, կարմիր DT- ն նույնպես վերադառնում է HIGH: Այսպիսով լրացնելով մեկ լրիվ տիզ FWD (կամ ժամացույցի սլաքի ուղղությամբ): Նույնը գնում է BWD- ի հակառակ ուղղությամբ (կամ ժամացույցի սլաքի հակառակ ուղղությամբ), բայց այժմ կարմիրը առաջինն է ընկնում, իսկ կապույտը բարձրանում է վերջին, ինչպես ցույց է տրված համապատասխանաբար երկու մակարդակի պատկերներում:

Քայլ 2. Թշվառություն, որը շատերի համար իսկական ցավ է պատճառում

Թշվառություն, որը շատերի համար իսկական ցավ է պատճառում
Թշվառություն, որը շատերի համար իսկական ցավ է պատճառում
Թշվառություն, որը շատերի համար իսկական ցավ է պատճառում
Թշվառություն, որը շատերի համար իսկական ցավ է պատճառում
Թշվառություն, որը շատերի համար իսկական ցավ է պատճառում
Թշվառություն, որը շատերի համար իսկական ցավ է պատճառում

Arduino- ի հոբբիստների համար սովորական խնդիր է, որ Rotary- ի էժան կոդավորող մոդուլներն արտացոլում են ելքային մակարդակների լրացուցիչ փոփոխություններ `առաջացնելով ուղղությունների հաշվարկի լրացուցիչ և սխալ ընթերցումներ: Սա կանխում է անթերի հաշվարկը և անհնար է դարձնում այս մոդուլների ինտեգրումը ճշգրիտ պտտվող նախագծերի մեջ: Այս լրացուցիչ ցատկումները առաջանում են կապի մեխերի վրա կարկատանների մեխանիկական շարժումներից, և նույնիսկ լրացուցիչ կոնդենսատորների կիրառումը չի կարող դրանք ամբողջությամբ վերացնել: Վերադարձները կարող են հայտնվել ցանկացած վայրում ՝ տիզերի ամբողջական ցիկլերում և պատկերված են պատկերների վրա իրական կյանքի սցենարներով:

Քայլ 3. Վերջավոր վիճակի մեքենայի (FSM) լուծում

Սահմանափակ վիճակի մեքենայի (FSM) լուծում
Սահմանափակ վիճակի մեքենայի (FSM) լուծում

Պատկերը ցույց է տալիս երկու կապում (կապույտ CLK և կարմիր DT) մակարդակի հնարավոր փոփոխությունների ամբողջական վիճակի ամբողջականությունը ՝ երկուսն էլ ճիշտ և կեղծ վերադարձի դեպքում: Այս պետական մեքենայի հիման վրա կարելի է ծրագրավորել ամբողջական լուծում, որը միշտ աշխատում է 100% ճշգրիտ: Քանի որ այս լուծման մեջ զտման հետաձգումներ անհրաժեշտ չեն, այն նաև հնարավորինս արագ է: Քորոցների վիճակի տարածությունն աշխատանքային ռեժիմից առանձնացնելու մեկ այլ առավելություն այն է, որ կարելի է կիրառել ինչպես հարցման, այնպես էլ ընդհատման եղանակներ `իր ցանկությամբ: Հարցումը կամ ընդհատումները կարող են հայտնաբերել կապերի մակարդակի փոփոխությունները, և առանձին ռեժիմը կհաշվարկի նոր վիճակը `հիմնվելով ընթացիկ վիճակի և մակարդակի փոփոխությունների իրական իրադարձությունների վրա:

Քայլ 4: Arduino կոդ

Arduino կոդ
Arduino կոդ

Ստորև բերված ծածկագիրը հաշվում է սերիական մոնիտորի FWD և BWD տիզերը և միավորում է անջատիչի անջատիչ գործառույթը:

// Պիտեր urgուրգեյ 2019-04-10

// Պտույտի կապում քարտեզագրված Arduino նավահանգիստներին

#սահմանել SW 21 #սահմանել CLK 22 #սահմանել DT 23

// Պտտվողի կողմից կարգավորվող հաշվիչի ընթացիկ և նախորդ արժեքը

int curVal = 0; int prevVal = 0;

// FSM- ի յոթ վիճակ (վերջնական վիճակի մեքենա)

#սահմանել IDLE_11 0 #սահմանել SCLK_01 1 #սահմանել SCLK_00 2 #սահմանել SCLK_10 3 #սահմանել SDT_10 4 #սահմանել SDT_00 5 #սահմանել SDT_01 6 int state = IDLE_11;

void setup () {

Serial.begin (250000); Serial.println («Սկսել …»); // Մակարդակը HIGH կլինի կանխադրված բոլոր pinMode (SW, INPUT_PULLUP) համար; pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); // Ե՛վ CLK- ն, և՛ DT- ն բոլոր մակարդակի փոփոխությունների դեպքում առաջացնում են ընդհատումներ attachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE); attachInterrupt (digitalPinToInterrupt (DT), rotaryDT, CHANGE); }

դատարկ շրջան () {

// Որոշակի պտտվող կոդավորիչների մեջ ներառված կամընտիր անջատիչի կառավարում, եթե (digitalRead (SW) == LOW) {Serial.println ("Սեղմված"); իսկ (! digitalRead (SW)); } // Հաշվիչի արժեքի ցանկացած փոփոխություն ցուցադրվում է Serial Monitor- ում if (curVal! = PrevVal) {Serial.println (curVal); prevVal = curVal; }}

// Պետական մեքենայի անցումներ CLK մակարդակի փոփոխությունների համար

void rotaryCLK () {if (digitalRead (CLK) == LOW) {if (state == IDLE_11) state = SCLK_01; այլապես եթե (վիճակ == SCLK_10) վիճակ = SCLK_00; այլապես, եթե (վիճակ == SDT_10) վիճակ = SDT_00; } else {if (վիճակ == SCLK_01) վիճակ = IDLE_11; այլապես եթե (վիճակ == SCLK_00) վիճակ = SCLK_10; այլապես եթե (վիճակ == SDT_00) վիճակ = SDT_10; այլապես եթե (վիճակ == SDT_01) {վիճակ = IDLE_11; curVal--; }}}

// Պետական մեքենայի անցումներ DT մակարդակի փոփոխությունների համար

void rotaryDT () {if (digitalRead (DT) == LOW) {if (state == IDLE_11) state = SDT_10; այլապես եթե (վիճակ == SDT_01) վիճակ = SDT_00; այլապես եթե (վիճակ == SCLK_01) վիճակ = SCLK_00; } else {if (վիճակ == SDT_10) վիճակ = IDLE_11; այլապես, եթե (վիճակ == SDT_00) վիճակ = SDT_01; այլապես եթե (վիճակ == SCLK_00) վիճակ = SCLK_01; այլապես եթե (վիճակ == SCLK_10) {վիճակ = IDLE_11; curVal ++; }}}

Քայլ 5. Անթերի ինտեգրում

Կից տեսանյութում կարող եք ստուգել, որ FSM լուծումն աշխատում է ճշգրիտ և արագ նույնիսկ ցածր տիրույթի պտտվող կոդավորիչների դեպքում ՝ տարբեր պարբերական ցատկման էֆեկտներով:

Խորհուրդ ենք տալիս: