Mündəricat:

Arduino və Ayar Təkərləri: 9 addım
Arduino və Ayar Təkərləri: 9 addım

Video: Arduino və Ayar Təkərləri: 9 addım

Video: Arduino və Ayar Təkərləri: 9 addım
Video: Bisikletiniz Için 9 Harika Fikir 2024, Iyul
Anonim
Arduino və Ayar Təkərləri
Arduino və Ayar Təkərləri

Bu yazıda Arduino sistemlərimizdə təkər/baş dönmə açarlarının istifadəsini araşdırırıq. PMD Way -dən qaynaqlanan bəzi nümunələr.

Addım 1:

Şəkil
Şəkil

Təcrübəsizlər üçün hər bir keçid bir şaquli seqmentdir və müxtəlif ölçüləri yaratmaq üçün bir -birinə bağlana bilər. Sıfırdan doqquzadək rəqəmləri seçmək üçün düymələrdən istifadə edə bilərsiniz. Artım/azalma düymələri yerinə baş barmağınızla hərəkət edə biləcəyiniz təkərli alternativlər var.

Zərif istifadəçi interfeysi günlərindən əvvəl bu açarlar rəqəmsal məlumatların daxil edilməsi üçün olduqca populyar üsullar idi. Ancaq bu gün hələ də mövcuddur, buna görə necə işlədiyini və onlardan necə istifadə edəcəyimizi görək. Keçidin dəyəri ikili kodlu onlu və ya düz ondalık vasitəsi ilə verilir. Açarın arxasını BCD şəklində düşünün.

Addım 2:

Şəkil
Şəkil

Solda ortaqlarımız var, sonra 1, 2, 4 və 8 üçün kontaktlar var. Ümumi olaraq kiçik bir gərginlik (5V deyək) tətbiq etsəniz, açarın dəyəri kontaktların dəyərlərini əlavə etməklə ölçülə bilər. YÜKSƏK dövlət. Məsələn, 3 seçsəniz - 1 və 2 kontaktları ümumi gərginlikdə olacaq. Sıfır ilə doqquz arasındakı dəyərlər cədvəldə belə göstərilə bilər.

Addım 3:

Şəkil
Şəkil

İndiyə qədər bir açarın dəyərini oxumağın asan olacağını başa düşməlisiniz - və haqlısınız. 5V -ni Arduino lövhələrimizin ümumi girişinə, çıxışlarını rəqəmsal giriş pinlərinə bağlaya bilərik, sonra hər bir çıxışın dəyərini təyin etmək üçün digitalRead () istifadə edə bilərik. Eskizdə BCD dəyərini ondalık rəqəmə çevirmək üçün bəzi əsas riyaziyyatdan istifadə edirik. Buna görə də indi bunu edək.

Avadanlıq baxımından bir şeyi də nəzərə almalıyıq-təkər açarı elektriklə normal olaraq açıq olan dörd düymə kimi davranır. Bu o deməkdir ki, yüksək və aşağı vəziyyətlər arasında aydın bir fərqə sahib olmaq üçün açılan rezistorlardan istifadə etməliyik. Beləliklə, bir keçid üçün sxem yuxarıda göstərildiyi kimidir.

Addım 4:

1, 2, 4 və 8 etiketli çıxışları (məsələn) 8, 9, 10 və 11 rəqəmsal pinlərə bağlamaq sadə bir işdir. 5V -ni 'C' nöqtəsinə, GND -ni isə … GND -ə bağlayın. Sonra, girişləri oxuya bilən və BCD çıxışını onluğa çevirə bilən bir eskizə sahib olmalıyıq. Aşağıdakı eskizi nəzərdən keçirin:

/ * SAA1064 sayısal ekran qalxanından istifadə edir https://www.gravitech.us/7segmentshield.html SAA1064 qalxanınız yoxdursa serial monitordan istifadə edir */#include "Wire.h" #define q1 8 #define q2 9 # q4 10 #define q8 11 void setup () {Serial.begin (9600); Wire.begin (); // i2c avtobusuna qoşul (master üçün isteğe bağlı) gecikmə (500); pinMode (q1, GİRİŞ); // thumbwheel '1' pinMode (q2, INPUT); // thumbwheel '2' pinMode (q4, INPUT); // thumbwheel '4' pinMode (q8, INPUT); // thumbwheel '8'} void dispSAA1064 (int Count) // "Count" tam ədədini Gravitech SAA1064 qalxanına göndərir {const int searchup [10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; int Minlərlə, Yüzlərlə, Onlarla, Baza; Wire.beginTransmission (0x38); Wire.write (0); Wire.write (B01000111); Wire.endTransmission (); Wire.beginTransmission (0x38); Wire.write (1); Minlərlə = Say/1000; Yüzlər = (Say- (Minlərlə*1000))/100; Onlarla = (Say-((Min*1000)+(Yüz*100)))/10; Baza = Say-((Minlərlə*1000)+(Yüzlərlə*100)+(Onlarla*10)); Wire.write ([Base] axtarın); Wire.write (axtarış [Onlarla]); Wire.write (axtarış [Yüzlərlə]); Wire.write (axtarış [Minlərlə]); Wire.endTransmission (); gecikmə (10); } int readSwitch () {int total = 0; if (digitalRead (q1) == YÜKSEK) {cəmi+= 1; } if (digitalRead (q2) == YÜKSEK) {cəmi+= 2; } if (digitalRead (q4) == YÜKSEK) {cəmi+= 4; } if (digitalRead (q8) == YÜKSEK) {cəmi+= 8; } ümumi qaytarma; } boşluq döngəsi () {dispSAA1064 (readSwitch ()); // keçid dəyərini Serial.println (readSwitch ()) ekranını göstərmək üçün göndərir; // keçid dəyərini serial monitor qutusuna göndərir}

ReadSwitch () funksiyası əsasdır. Hər bir keçid çıxışının ədədi təsvirini əlavə edərək açarın dəyərini hesablayır və nəticəni cəmi qaytarır. Bu nümunə üçün NXP SAA1064 tərəfindən idarə olunan ədədi ekran qalxanı istifadə etdik.

Addım 5:

Image
Image

ReadSwitch () funksiyası əsasdır. Hər bir keçid çıxışının ədədi təsvirini əlavə edərək açarın dəyərini hesablayır və nəticəni cəmi qaytarır. Bu nümunə üçün NXP SAA1064 tərəfindən idarə olunan ədədi bir ekran qalxanı istifadə etdik.

Biriniz yoxdursa, bu yaxşıdır - nəticələr də serial monitoruna göndərilir. İndi bunu videoda necə işlədiyini görək.

Addım 6:

Tamam o qədər də görünmür, amma rəqəmsal girişə ehtiyacınız varsa, çox fiziki yer saxlayır və dəqiq bir giriş üsulu təklif edir.

Deməli orda var. Əslində bunları bir layihədə istifadə edərdinizmi? Bir rəqəm üçün - bəli. Dörd üçün? Yəqin ki, yox-bəlkə də 12 rəqəmli klaviatura istifadə etmək daha asan olardı. Bir fikir var…

Addım 7: Birdən çox açar

Şəkil
Şəkil

İndi dörd rəqəmi necə oxuyacağımızı araşdıracağıq və bu müddətdə bütün rəqəmsal pinləri israf etməyəcəyik. Bunun əvəzinə, I2C avtobusu ilə əlaqə quran Microchip MCP23017 16 bitlik port genişləndiricisini istifadə edəcəyik. Hər bir keçidin vəziyyətini oxumaq üçün istifadə edə biləcəyimiz on altı rəqəmsal giriş/çıxış pininə malikdir.

İrəli getməzdən əvvəl, bu məqalə üçün I2C avtobusu (birinci və ikinci hissələr) və MCP23017 üçün bəzi ehtimal olunan biliklərin lazım olduğunu unutmayın. Əvvəlcə hardware əlaqələrini, sonra Arduino eskizini təsvir edəcəyik. Tək keçid nümunəsi üçün istifadə olunan sxemləri xatırlayın.

Şalter birbaşa Arduino -ya qoşulduqda, açarın dəyərini təyin etmək üçün hər pinin vəziyyətini oxuyuruq. Bunu MCP23017 istifadə edərək daha geniş miqyasda edəcəyik. Bağlama diaqramını nəzərdən keçirin:

Addım 8:

Dörd açarın bağlanmasına imkan verən 16 sancağımız var. Hər bir keçid üçün ortaqlar hələ də 5V-ə qoşulur və hər bir keçid kontaktında hələ də GND-ə qədər 10k aşağıya doğru müqavimət var. Sonra 1 rəqəminin 1, 2, 4, 8 sancağını GPBA0 ~ 3 -ə bağlayırıq; iki rəqəmin 1, 2, 4, 8 -dən GPA4 ~ 7 -ə qədər; üç rəqəmi 1, 2, 4, 8 GPB0 ~ 3 və dörd rəqəmi 1, 2, 4, 8 üçün GPB4 ~ 7.

İndi açarları necə oxuyaq? Bütün bu tellər çətin olduğunu düşünməyinizə səbəb ola bilər, ancaq eskiz olduqca sadədir. GPBA və B-nin dəyərini oxuduğumuzda, hər bank üçün bir bayt qaytarılır, ən önəmli bit əvvəlcə. Hər dörd bit, uyğun gələn I/O pinlərinə bağlı olan açarın parametrinə uyğun olacaq. Məsələn, həm IO banklar üçün məlumat istəsək və açarlar 1 2 3 4 olaraq təyin olunarsa - A bankı 0010 0001, B bankı isə 0100 0011 qaytarar.

Hər biti ayrı bir dəyişənə ayırmaq üçün bəzi bitshift əməliyyatlarından istifadə edirik - bu da bizi hər bir rəqəmin dəyərini tərk edir. Məsələn, dördüncü açarın dəyərini ayırmaq üçün bitləri B bankı 4 -dən köçürürük. Bu, üç açarın dəyərini itələyir və soldakı boş bitlər sıfıra çevrilir.

Üçüncü keçidin dəyərini ayırmaq üçün, bit olaraq & birləşməsindən istifadə edirik ki, bu da üç keçid dəyərini tərk edir. Şəkil ikili keçid dəyərlərinin parçalanmasını göstərir - xam GPIOA və B bayt dəyərlərini, sonra hər bir rəqəmin ikili dəyərini və ondalık dəyərini göstərir.

Addım 9:

Beləliklə, nümayiş eskizinə baxaq:

/ * Nümunə 40a-MCP23017 vasitəsilə dörd təkərli BCD keçidini oxuyun, SAA1064/4-rəqəmli 7-seqmentli LED displeydə göstərin */// MCP23017 pinləri 15 ~ 17-dən GND-ə qədər, I2C avtobus ünvanı 0x20 // SAA1064 I2C avtobus ünvanı 0x38 # "Wire.h" daxil edin // LED rəqəm tərifləri üçün int rəqəmləri [16] = {63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113 }; bayt GPIOA, GPIOB, dig1, dig2, dig3, dig4; etibarsız initSAA1064 () {// quraşdırma 0x38 Wire.beginTransmission (0x38); Wire.write (0); Wire.write (B01000111); // 12mA çıxışı, rəqəm boşluğu yoxdur Wire.endTransmission (); } void setup () {Serial.begin (9600); Wire.begin (); // I2C avtobusunun işə salınması initSAA1064 (); } void loop () {// A Wire.beginTransmission bankının girişlərini oxuyun (0x20); Wire.write (0x12); Wire.endTransmission (); Wire.requestFrom (0x20, 1); GPIOA = Wire.read (); // bu bayt 1 və 2 rəqəmləri üçün keçid məlumatlarını ehtiva edir // bankın Wire.beginTransmission (0x20) girişlərini oxuyun; Wire.write (0x13); Wire.endTransmission (); Wire.requestFrom (0x20, 1); GPIOB = Wire.read (); // bu bayt 3 və 4 rəqəmləri üçün keçid məlumatlarını ehtiva edir // hər bir keçid üçün çıxarış dəyəri // dig1 LHS, dig4 RHS dig4 = GPIOB >> 4; dig3 = GPIOB & B00001111; dig2 = GPIOA >> 4; dig1 = GPIOA & B00001111; // bütün GPIO və fərdi keçid məlumatlarını serial monitoruna göndərin // ayıklama və maraq naminə Serial.print ("GPIOA ="); Serial.println (GPIOA, BIN); Serial.print ("GPIOB ="); Serial.println (GPIOB, BIN); Serial.println (); Serial.print ("rəqəm 1 ="); Serial.println (dig1, BIN); Serial.print ("rəqəm 2 ="); Serial.println (dig2, BIN); Serial.print ("rəqəm 3 ="); Serial.println (dig3, BIN); Serial.print ("rəqəm 4 ="); Serial.println (dig4, BIN); Serial.println (); Serial.print ("rəqəm 1 ="); Serial.println (dig1, DEC); Serial.print ("rəqəm 2 ="); Serial.println (dig2, DEC); Serial.print ("rəqəm 3 ="); Serial.println (dig3, DEC); Serial.print ("rəqəm 4 ="); Serial.println (dig4, DEC); Serial.println (); // SAA1064 Wire.beginTransmission (0x38) vasitəsilə LED ekranına keçid dəyərini göndərin; Wire.write (1); Wire.write (rəqəmlər [dig4]); Wire.write (rəqəmlər [dig3]); Wire.write (rəqəmlər [dig2]); Wire.write (rəqəmlər [dig1]); Wire.endTransmission (); gecikmə (10); gecikmə (1000); }

İnanmayanlar üçün… video nümayiş.

Deməli orda var. Arduino rəqəmsal I/O sancaqlarını qoruyan I2C avtobusu üzərində bir əvəzinə dörd rəqəm. Səkkiz MCP23017 istifadə edərək bir anda 32 rəqəmi oxuya bilərsiniz. Bunu etməklə əylənin!

Dünyada pulsuz çatdırılma ilə PMD Way -dən müxtəlif ölçülərdə həm BCD, həm də ondalık açarları sifariş edə bilərsiniz.

Bu yazı pmdway.com tərəfindən sizə gətirildi - istehsalçılar və elektronika həvəskarları üçün hər şey, bütün dünyada pulsuz çatdırılma.

Tövsiyə: