Mundarija:

To'liq Arduino Rotary yechimi: 5 qadam
To'liq Arduino Rotary yechimi: 5 qadam

Video: To'liq Arduino Rotary yechimi: 5 qadam

Video: To'liq Arduino Rotary yechimi: 5 qadam
Video: Arduino Rotary Encoder Circuit Tutorial with Interrupts 2024, Noyabr
Anonim
Arduino -ning to'liq aylantiruvchi echimi
Arduino -ning to'liq aylantiruvchi echimi

Aylanadigan kodlovchi - bu elektron loyihalar uchun aylanadigan boshqaruv tugmalari, ko'pincha Arduino oilasining mikrokontrollerlari bilan ishlatiladi. Ular parametrlarni sozlash, menyularda harakatlanish, ob'ektlarni ekranda ko'chirish, har qanday qiymatlarni o'rnatish uchun ishlatilishi mumkin. Ular potentsiometrlarning umumiy almashinuvidir, chunki ularni aniqroq va cheksiz aylantirish mumkin, ular bir vaqtning o'zida bitta diskret qiymatni oshiradi yoki kamaytiradi va ko'pincha tanlash funktsiyalari uchun itariladigan kalit bilan birlashtiriladi. Ular har xil shakl va o'lchamlarda bo'ladi, lekin eng past narx oralig'ini quyida aytib o'tilganidek o'zaro bog'lash qiyin.

Rotary enkoderlarining ishlash tafsilotlari va ulardan foydalanish usullari haqida son -sanoqsiz maqolalar va ulardan foydalanish bo'yicha ko'plab namunali kodlar va kutubxonalar mavjud. Yagona muammo shundaki, ularning hech biri Xitoyning aylanadigan modullarining eng past narxlari bilan 100% aniq ishlamaydi.

1 -qadam: Ichkarida aylanadigan kodlovchi

Ichkarida aylanadigan kodlovchi
Ichkarida aylanadigan kodlovchi
Ichkarida aylanadigan kodlovchi
Ichkarida aylanadigan kodlovchi
Ichkarida aylanadigan kodlovchi
Ichkarida aylanadigan kodlovchi

Enkoderning aylanadigan qismida uchta pim bor (va ixtiyoriy kalit uchun yana ikkita). Ulardan biri umumiy asos (qora GND), ikkinchisi - tugma burilganda yo'nalishni aniqlash uchun (ular ko'pincha ko'k CLK va qizil DT deb ataladi). Ularning ikkalasi ham mikrokontrollerning PULLUP kirish piniga ulangan, bu esa yuqori darajani standart o'qishga aylantiradi. Tugma oldinga (yoki soat yo'nalishi bo'yicha) burilganda, avval ko'k CLK LOW darajasiga tushadi, keyin qizil DT keladi. Yana o'girilib, ko'k CLK yana yuqori darajaga ko'tariladi, keyin umumiy GND tuzatish ikkala ulagichdan ham chiqib ketganda, qizil DT ham yana yuqoriga ko'tariladi. Shunday qilib, bitta to'liq belgilash FWD (yoki soat yo'nalishi bo'yicha). BWD boshqa yo'nalishda ham (yoki soat sohasi farqli o'laroq) ketadi, lekin hozir qizil birinchi bo'lib tushadi va ko'k mos ravishda ikki darajali rasmda ko'rsatilgandek oxirgi marta ko'tariladi.

2 -qadam: Ko'pchilik uchun haqiqiy og'riq keltiradigan baxtsizlik

Ko'pchilik uchun haqiqiy og'riq keltiradigan baxtsizlik
Ko'pchilik uchun haqiqiy og'riq keltiradigan baxtsizlik
Ko'pchilik uchun haqiqiy og'riq keltiradigan baxtsizlik
Ko'pchilik uchun haqiqiy og'riq keltiradigan baxtsizlik
Ko'pchilik uchun haqiqiy og'riq keltiradigan baxtsizlik
Ko'pchilik uchun haqiqiy og'riq keltiradigan baxtsizlik

Arduino havaskorlari uchun umumiy muammo shundaki, arzon Rotary kodlovchi modullari chiqish darajasida qo'shimcha o'zgarishlarni keltirib chiqaradi, bu esa yo'nalishlarning qo'shimcha va noto'g'ri o'qilishini keltirib chiqaradi. Bu nuqsonli sanashni oldini oladi va bu modullarni aniq aylanuvchi loyihalarga qo'shib bo'lmaydi. Bu qo'shimcha sakrashlar aloqa pimlari ustidagi yamoqlarning mexanik harakatlari natijasida yuzaga keladi va hatto qo'shimcha kondansatkichlarni qo'llash ham ularni butunlay yo'q qila olmaydi. To'ntarish to'liq tsiklning istalgan joyida paydo bo'lishi mumkin va ular tasvirlardagi real hayot stsenariylari bilan tasvirlangan.

3 -qadam: Cheklangan holat mashinasi (FSM) yechimi

Cheklangan holat mashinasi (FSM) yechimi
Cheklangan holat mashinasi (FSM) yechimi

Rasmda ikkita pin uchun (ko'k CLK va qizil DT) to'g'ri va noto'g'ri sakrashlar uchun mumkin bo'lgan darajadagi o'zgarishlarning to'liq holati ko'rsatilgan. Ushbu davlat mashinasi asosida har doim 100% aniq ishlaydigan to'liq echimni dasturlash mumkin. Filtrni kechiktirishga hojat yo'qligi sababli, bu ham eng tezdir. Pimlarning bo'sh joyini ish rejimidan ajratishning yana bir afzalligi shundaki, xohlaganingizcha so'rov yoki uzilish rejimini qo'llash mumkin. Ovoz berish yoki uzilishlar pimlardagi darajadagi o'zgarishlarni aniqlay oladi va alohida tartib yangi holatni hozirgi holat va darajadagi o'zgarishlarning haqiqiy hodisalari asosida hisoblab chiqadi.

4 -qadam: Arduino kodi

Arduino kodi
Arduino kodi

Quyidagi kod ketma -ket monitorda FWD va BWD belgilarini hisobga oladi va ixtiyoriy almashtirish funktsiyasini birlashtiradi.

// Piter Csurgay 2019-04-10

// Arduino portlariga aylanadigan pinlar

#ta'rif SW 21 #define CLK 22 #define DT 23

// Aylanadigan dastgohning joriy va oldingi qiymati

int curVal = 0; int prevVal = 0;

// FSMning etti holati (cheklangan holat mashinasi)

#delefilm IDLE_11 0 #define SCLK_01 1 #define SCLK_00 2 #define SCLK_10 3 #define SDT_10 4 #define SDT_00 5 #deffine SDT_01 6 int state = IDLE_11;

bo'sh o'rnatish () {

Serial.begin (250000); Serial.println ("Boshlash …"); // pinMode (SW, INPUT_PULLUP) pinlari uchun HIGH darajasi standart bo'ladi; pinMod (CLK, INPUT_PULLUP); pinMod (DT, INPUT_PULLUP); // CLK ham, DT ham barcha darajadagi o'zgarishlar uchun uzilishlarni ishga soladi attachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE); attachInterrupt (digitalPinToInterrupt (DT), rotaryDT, CHANGE); }

void loop () {

// ixtiyoriy kalitni boshqarish, agar (digitalRead (SW) == LOW) {Serial.println ("Bosilgan"); while (! digitalRead (SW)); } // Hisoblagich qiymatidagi har qanday o'zgarish Serial Monitorda ko'rsatiladi, agar (curVal! = PrevVal) {Serial.println (curVal); prevVal = curVal; }}

// CLK darajasidagi o'zgarishlar uchun davlat mashinasi o'tishlari

bekor rotaryCLK () {if (digitalRead (CLK) == LOW) {if (holat == IDLE_11) holat = SCLK_01; aks holda (holat == SCLK_10) holat = SCLK_00; aks holda (holat == SDT_10) holat = SDT_00; } boshqa {agar (holat == SCLK_01) holat = IDLE_11; aks holda (holat == SCLK_00) holat = SCLK_10; aks holda (holat == SDT_00) holat = SDT_10; aks holda (holat == SDT_01) {holat = IDLE_11; curVal--; }}}

// DT darajasidagi o'zgarishlar uchun davlat mashinasi o'tishlari

void rotaryDT () {if (digitalRead (DT) == LOW) {if (state == IDLE_11) state = SDT_10; aks holda (holat == SDT_01) holat = SDT_00; aks holda (holat == SCLK_01) holat = SCLK_00; } boshqa {agar (holat == SDT_10) holat = IDLE_11; aks holda (holat == SDT_00) holat = SDT_01; aks holda (holat == SCLK_00) holat = SCLK_01; aks holda (holat == SCLK_10) {holat = IDLE_11; curVal ++; }}}

5 -qadam: benuqson integratsiya

Siz qo'shilgan videodan FSM yechimining har xil sporadik sakrash effektlari bo'lgan past diapazonli aylanma kodlovchi bo'lsa ham aniq va tez ishlashini tekshirishingiz mumkin.

Tavsiya: