Mundarija:

Arduino va thumbwheel kalitlari: 9 qadam
Arduino va thumbwheel kalitlari: 9 qadam

Video: Arduino va thumbwheel kalitlari: 9 qadam

Video: Arduino va thumbwheel kalitlari: 9 qadam
Video: One Arduino 10 Thumbwheels binary escape room - Code and Diagram In Link Below 2024, Iyul
Anonim
Arduino va thumbwheel kalitlari
Arduino va thumbwheel kalitlari

Ushbu maqolada biz Arduino tizimimiz bilan g'ildirak-g'ildirak kalitlari ishlatilishini ko'rib chiqamiz. Bu erda PMD Way -dan olingan ba'zi misollar.

1 -qadam:

Rasm
Rasm

Boshlanmaganlar uchun har bir kalit bitta vertikal segment bo'lib, ular bir -biriga ulanib, har xil o'lchamda bo'ladi. Siz tugmalar yordamida noldan to'qqizgacha raqamlarni tanlashingiz mumkin. G'ildirakka ega bo'lgan alternativalar mavjud, siz ularni oshirish/kamaytirish tugmachalari o'rniga bosh barmog'ingiz bilan harakat qilishingiz mumkin.

Aqlli foydalanuvchi interfeysi kunlaridan oldin, bu kalitlar raqamli ma'lumotlarni kiritishning juda mashhur usullari edi. Ammo ular bugungi kunda ham mavjud, shuning uchun ular qanday ishlashini va biz ulardan qanday foydalanishimizni ko'rib chiqaylik. Kommutatorning qiymati ikkilik kodli o'nlik yoki to'g'ri kasr orqali beriladi. Kalitning orqa qismini BCD shaklida ko'rib chiqing.

2 -qadam:

Rasm
Rasm

Bizda chap tomonda umumiy, keyin 1, 2, 4 va 8 uchun kontaktlar mavjud. Agar siz umumiy kuchlanishga (masalan, 5V) kichik kuchlanishni qo'ysangiz, kalitning qiymatini kontaktdagi kontaktlarning qiymatlarini qo'shib o'lchash mumkin. YUQORI davlat. Masalan, agar siz 3 -ni tanlasangiz - 1 va 2 -kontaktlar umumiy kuchlanishda bo'ladi. Noldan to'qqizgacha bo'lgan qiymatlar jadvalda shunday ifodalanishi mumkin.

3 -qadam:

Rasm
Rasm

Hozircha siz kalitning qiymatini o'qish oson bo'lishini tushunishingiz kerak - va siz haqsiz. Biz 5V ni Arduino platalarimizning umumiy raqamli kirish pinlariga ulashimiz mumkin, keyin digitalRead () yordamida har bir chiqish qiymatini aniqlashimiz mumkin. Eskizda biz BCD qiymatini o'nli raqamga aylantirish uchun ba'zi asosiy matematikadan foydalanamiz. Shunday qilib, hozir buni qilaylik.

Uskuna nuqtai nazaridan, biz yana bir narsani e'tiborga olishimiz kerak-g'ildirakli tugmachaning elektr quvvati odatdagi ochiq to'rtta tugmachaga o'xshaydi. Bu shuni anglatadiki, yuqori va past holatlar o'rtasida aniq farq bo'lishi uchun biz pastga tushadigan rezistorlardan foydalanishimiz kerak. Shunday qilib, bitta kalitning sxemasi yuqorida ko'rsatilgan.

4 -qadam:

1, 2, 4 va 8 bilan belgilangan chiqishlarni (masalan) 8, 9, 10 va 11 raqamli pimlarga ulash oddiy ish. 5Vni "C" kalitiga, GND ni esa … GND ga ulang. Keyinchalik, biz kirishni o'qiy oladigan va BCD chiqishini o'nli kasrga o'zgartiradigan eskizga ega bo'lishimiz kerak. Quyidagi eskizni ko'rib chiqing:

/ * SAA1064 raqamli ekran qalqonidan foydalanadi https://www.gravitech.us/7segmentshield.html Agar sizda SAA1064 qalqoni bo'lmasa, ketma -ket monitordan foydalanadi */#include "Wire.h" #define q1 8 #define q2 9 # q4 ni belgilang 10 #define q8 11 void setup () {Serial.begin (9600); Wire.begin (); // i2c avtobusiga qo'shilish (manzil uchun ixtiyoriy) kechiktirish (500); pinMode (q1, INPUT); // aylanma g'ildirak '1' pinMode (q2, INPUT); // aylanma g'ildirak '2' pinMode (q4, INPUT); // bosh aylanasi '4' pinMode (q8, INPUT); // thumbwheel '8'} void dispSAA1064 (int Count) // "Count" butun sonini Gravitech SAA1064 qalqoniga yuboradi {const int searchup [10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; int Minglar, Yuzlar, O'nliklar, Asosiy; Wire.beginTransmission (0x38); Wire.write (0); Wire.write (B01000111); Wire.endTransmission (); Wire.beginTransmission (0x38); Wire.write (1); Minglar = hisoblash/1000; Yuzlar = (Count- (Minglar*1000))/100; O'nlik = (Hisob-((Minglar*1000)+(Yuzlar*100)))/10; Baza = Hisob-((Minglar*1000)+(Yuzlar*100)+(O'nlab*10)); Wire.write (qidirish [Base]); Wire.write (qidirish [O'nlab]); Wire.write (qidirish [Yuzlab]); Wire.write (qidirish [Minglar]); Wire.endTransmission (); kechikish (10); } int readSwitch () {int jami = 0; if (digitalRead (q1) == YUQORI) {jami+= 1; } if (digitalRead (q2) == HIGH) {jami+= 2; } if (digitalRead (q4) == HIGH) {jami+= 4; } if (digitalRead (q8) == HIGH) {jami+= 8; } qaytish jami; } void loop () {dispSAA1064 (readSwitch ()); // kalit qiymatini Serial.println ekraniga yuboradi (readSwitch ()); // kalit qiymatini ketma -ket monitor qutisiga yuboradi}

ReadSwitch () funktsiyasi kalit hisoblanadi. U har bir kalit chiqishining raqamli ko'rinishini qo'shib, kalit qiymatini hisoblab chiqadi va natijani jami sifatida qaytaradi. Bu misol uchun biz NXP SAA1064 tomonidan boshqariladigan raqamli ekran qalqonidan foydalanganmiz.

5 -qadam:

Image
Image

ReadSwitch () funktsiyasi kalit hisoblanadi. U har bir kalit chiqishining raqamli ko'rinishini qo'shish orqali kalit qiymatini hisoblab chiqadi va natija sifatida jamini qaytaradi. Bu misol uchun biz NXP SAA1064 tomonidan boshqariladigan raqamli ekran qalqonidan foydalanganmiz.

Agar sizda yo'q bo'lsa, bu yaxshi - natijalar ketma -ket monitorga ham yuboriladi. Keling, buni videoda amalda ko'raylik.

6 -qadam:

OK, bu unchalik ko'rinmaydi, lekin agar sizga raqamli yozuv kerak bo'lsa, u ko'p joyni tejaydi va aniq kiritish usulini taklif qiladi.

Demak, sizda bor. Siz ularni loyihada ishlatasizmi? Bir raqam uchun - ha. To'rt uchunmi? Ehtimol emas-balki 12 xonali klaviaturadan foydalanish osonroq bo'lardi. Bir fikr bor…

7 -qadam: bir nechta kalit

Rasm
Rasm

Endi biz to'rtta raqamni qanday o'qish kerakligini ko'rib chiqamiz va bu jarayonda barcha raqamli pinlarni behuda sarflamaymiz. Buning o'rniga, I2C avtobusi orqali bog'lanadigan Microchip MCP23017 16-bitli port kengaytirgichidan foydalanamiz. U har bir kalit holatini o'qish uchun foydalanishimiz mumkin bo'lgan o'n oltita raqamli kirish/chiqish piniga ega.

Oldinga o'tishdan oldin, iltimos, ushbu maqola uchun ba'zi taxminiy bilimlar talab qilinishini unutmang - I2C avtobus (birinchi va ikkinchi qismlar) va MCP23017. Avval biz apparat ulanishlarini tasvirlaymiz, keyin Arduino eskizini. Bitta kalit misolida ishlatilgan sxemani eslang.

Kalit Arduino -ga to'g'ridan -to'g'ri ulanganida, biz kalit qiymatini aniqlash uchun har bir pin holatini o'qiymiz. Biz buni yana MCP23017 yordamida keng miqyosda qilamiz. Tugatish sxemasini ko'rib chiqing:

8 -qadam:

Bizda 16 ta pin bor, bu to'rtta kalitni ulash imkonini beradi. Har bir kalit uchun umumiy birliklar hali ham 5V ga ulanadi va har bir kontaktning kontaktida hali ham GND uchun 10k pastga tushadigan qarshilik mavjud. Keyin biz 1 -raqamning 1, 2, 4, 8 pinlarini GPBA0 ~ 3 ga ulaymiz; 2, 1, 2, 4, 8 raqamlari GPA4 ~ 7 gacha; GPB0 ~ 3 uchun 1, 2, 4, 8 raqamlari va to'rtinchi raqamlar 1, 2, 4, 8 GPB4 ~ 7 gacha.

Endi kalitlarni qanday o'qiymiz? Bu simlarning barchasi sizni qiyin deb o'ylashingizga olib kelishi mumkin, lekin eskiz juda oddiy. GPBA va B qiymatlarini o'qiganimizda, har bir bank uchun bitta bayt qaytariladi, birinchi navbatda eng muhim bit. Har to'rt bit mos keladigan kirish -chiqish pinlariga ulangan kalit sozlamasiga mos keladi. Masalan, agar biz IO banklari uchun ma'lumotni so'rasak va kalitlar 1 2 3 4 ga o'rnatilsa - A banki 0010 0001 ni qaytaradi va B banki 0100 0011 ni qaytaradi.

Biz har bir bitni alohida o'zgaruvchiga ajratish uchun ba'zi bitshift operatsiyalaridan foydalanamiz - bu bizga har bir raqamning qiymatini qoldiradi. Masalan, to'rtinchi kalitning qiymatini ajratish uchun biz bitni B >> 4 bankidan siljitamiz. Bu uch kalitning qiymatini tashqariga chiqaradi va chapdagi bo'sh bitlar nolga aylanadi.

Uchinchi kalitning qiymatini ajratish uchun biz bitli ravishda birikma ishlatamiz va bu uch kalitning qiymatini qoldiradi. Rasmda ikkilik kalitlarning taqsimoti ko'rsatilgan - GPIOA va B baytlari, keyin har bir raqamning ikkilik qiymati va kasr qiymati ko'rsatilgan.

9 -qadam:

Shunday qilib, ko'rgazmali eskizni ko'rib chiqaylik:

/ * 40a misol-MCP23017 orqali to'rtta BW tugmachasini o'qing, SAA1064/4-raqamli 7-segmentli LED displeyda */// MCP23017 pinlari 15 ~ 17 gacha GND, I2C avtobus manzili 0x20 // SAA1064 I2C avtobus manzili 0x38 # "Wire.h" ni kiriting // LED raqamli ta'riflar uchun int raqamlari [16] = {63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113 }; bayt GPIOA, GPIOB, dig1, dig2, dig3, dig4; void initSAA1064 () {// sozlash 0x38 Wire.beginTransmission (0x38); Wire.write (0); Wire.write (B01000111); // 12mA chiqish, raqamli bo'sh joy yo'q Wire.endTransmission (); } void setup () {Serial.begin (9600); Wire.begin (); // I2C avtobusini ishga tushirish initSAA1064 (); } void loop () {// A Wire.beginTransmission bankining kirishini o'qing (0x20); Wire.write (0x12); Wire.endTransmission (); Wire.requestFrom (0x20, 1); GPIOA = Wire.read (); // bu baytda 1 va 2 raqamlar uchun kalit ma'lumotlari mavjud // B bankining kirishini o'qing Wire.beginTransmission (0x20); Wire.write (0x13); Wire.endTransmission (); Wire.requestFrom (0x20, 1); GPIOB = Wire.read (); // bu baytda 3 va 4 raqamlar uchun kalit ma'lumotlari mavjud // har bir kalit uchun qiymatni ajratish // dig1 LHS, dig4 RHS dig4 = GPIOB >> 4; dig3 = GPIOB va B00001111; dig2 = GPIOA >> 4; dig1 = GPIOA & B00001111; // barcha GPIO va individual o'tish ma'lumotlarini ketma -ket monitorga yuboring // disk raskadrovka va qiziqish uchun Serial.print ("GPIOA ="); Serial.println (GPIOA, BIN); Serial.print ("GPIOB ="); Serial.println (GPIOB, BIN); Serial.println (); Serial.print ("raqam 1 ="); Serial.println (dig1, BIN); Serial.print ("raqam 2 ="); Serial.println (dig2, BIN); Serial.print ("3 -raqam ="); Serial.println (dig3, BIN); Serial.print ("raqam 4 ="); Serial.println (dig4, BIN); Serial.println (); Serial.print ("raqam 1 ="); Serial.println (dig1, DEC); Serial.print ("raqam 2 ="); Serial.println (dig2, DEC); Serial.print ("3 -raqam ="); Serial.println (dig3, DEC); Serial.print ("raqam 4 ="); Serial.println (dig4, DEC); Serial.println (); // SAA1064 Wire.beginTransmission (0x38) orqali LED qiymatiga kalit qiymatini yuborish; Wire.write (1); Wire.write (raqamlar [dig4]); Wire.write (raqamlar [dig3]); Wire.write (raqamlar [dig2]); Wire.write (raqamlar [dig1]); Wire.endTransmission (); kechikish (10); kechikish (1000); }

Va imonsizlar uchun … video namoyish.

Demak, sizda bor. Bitta raqam o'rniga to'rtta raqam va I2C avtobusi orqali Arduino raqamli kirish -chiqish pinlarini saqlaydi. Sakkizta MCP23017 -dan foydalanib, siz bir vaqtning o'zida 32 ta raqamni o'qishingiz mumkin. Buni qilishdan zavqlaning!

Siz PMD Way -dan har xil o'lchamdagi BCD va o'nlik kalitlarga buyurtma berishingiz mumkin, butun dunyo bo'ylab bepul etkazib berish.

Bu xabar sizga pmdway.com tomonidan olib kelingan - ishlab chiqaruvchilar va elektronika ixlosmandlari uchun hamma narsa, butun dunyo bo'ylab bepul etkazib berish.

Tavsiya: