Cuprins:

Comutatoare Arduino și Thumbwheel: 9 pași
Comutatoare Arduino și Thumbwheel: 9 pași

Video: Comutatoare Arduino și Thumbwheel: 9 pași

Video: Comutatoare Arduino și Thumbwheel: 9 pași
Video: Button Switch with 7 segment 2 2024, Noiembrie
Anonim
Comutatoare Arduino și Thumbwheel
Comutatoare Arduino și Thumbwheel

În acest articol examinăm utilizarea comutatoarelor cu roată-împingere / roată cu sistemele noastre Arduino. Iată câteva exemple provenite din PMD Way.

Pasul 1:

Imagine
Imagine

Pentru cei neinițiați, fiecare comutator este un segment vertical și pot fi conectați împreună pentru a forma diferite dimensiuni. Puteți utiliza butoanele pentru a selecta de la cifre zero până la nouă. Există alternative disponibile care au o roată pe care o puteți deplasa cu degetul mare în loc de butoanele de mărire / micșorare.

Înainte de zilele interfețelor de utilizator elegante, aceste comutatoare erau metode destul de populare pentru setarea introducerii numerice de date. Cu toate acestea, acestea sunt încă disponibile astăzi, așa că să vedem cum funcționează și cum le putem folosi. Valoarea comutatorului este pusă la dispoziție prin zecimal codat binar sau zecimal drept. Luați în considerare partea din spate a comutatorului în formă BCD.

Pasul 2:

Imagine
Imagine

Avem comune în stânga, apoi contacte pentru 1, 2, 4 și 8. Dacă aplicați o tensiune mică (să zicem 5V) la comun, valoarea comutatorului poate fi măsurată adăugând valorile contactelor care sunt în Starea HIGH. De exemplu, dacă selectați 3 - contactele 1 și 2 vor fi la tensiunea comună. Valorile cuprinse între zero și nouă pot fi reprezentate ca atare în tabel.

Pasul 3:

Imagine
Imagine

Până acum ar trebui să vă dați seama că ar fi ușor să citiți valoarea unui comutator - și aveți dreptate, da. Putem conecta 5V la ieșirile comune la pinii de intrare digitale ai plăcilor noastre Arduino, apoi putem folosi digitalRead () pentru a determina valoarea fiecărei ieșiri. În schiță folosim câteva matematici de bază pentru a converti valoarea BCD într-un număr zecimal. Să facem asta acum.

Din punct de vedere al hardware-ului, trebuie să ținem cont încă de un lucru - comutatorul rotativ se comportă electric ca patru butoane deschise în mod normal. Aceasta înseamnă că trebuie să folosim rezistențe pull-down pentru a avea o diferență clară între stările înalte și cele joase. Deci, schema pentru un comutator este așa cum se arată mai sus.

Pasul 4:

Acum este o chestiune simplă să conectați ieșirile etichetate 1, 2, 4 și 8 la (de exemplu) pinii digitali 8, 9, 10 și 11. Conectați 5V la punctul comutatorului „C” și GND la … GND. Apoi, trebuie să avem o schiță care să poată citi intrările și să convertească ieșirea BCD în zecimal. Luați în considerare următoarea schiță:

/ * Utilizează ecranul numeric SAA1064 https://www.gravitech.us/7segmentshield.html Utilizează monitorul serial dacă nu aveți ecranul SAA1064 * / # includeți "Wire.h" #define q1 8 #define q2 9 # define q4 10 #define q8 11 void setup () {Serial.begin (9600); Wire.begin (); // alăturați autobuzului i2c (adresă opțională pentru master) întârziere (500); pinMode (q1, INPUT); // thumbwheel '1' pinMode (q2, INPUT); // thumbwheel '2' pinMode (q4, INPUT); // thumbwheel '4' pinMode (q8, INPUT); // thumbwheel '8'} void dispSAA1064 (int Count) // trimite numărul întreg 'Count' la Gravitech SAA1064 shield {const int lookup [10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; int Mii, sute, zeci, bază; Wire.beginTransmission (0x38); Wire.write (0); Wire.write (B01000111); Wire.endTransmission (); Wire.beginTransmission (0x38); Wire.write (1); Mii = Număr / 1000; Sute = (Număr- (Mii * 1000)) / 100; Zeci = (Număr - ((Mii * 1000) + (Sute * 100))) / 10; Baza = Număr - ((Mii * 1000) + (Sute * 100) + (Zeci * 10)); Wire.write (căutare [bază]); Wire.write (căutare [Zeci]); Wire.write (căutare [Sute]); Wire.write (căutare [Mii]); Wire.endTransmission (); întârziere (10); } int readSwitch () {int total = 0; if (digitalRead (q1) == HIGH) {total + = 1; } if (digitalRead (q2) == HIGH) {total + = 2; } if (digitalRead (q4) == HIGH) {total + = 4; } if (digitalRead (q8) == HIGH) {total + = 8; } returnare totală; } void loop () {dispSAA1064 (readSwitch ()); // trimite valoarea comutatorului pentru a afișa ecranul Serial.println (readSwitch ()); // trimite valoarea comutatorului la caseta monitorului serial}

Funcția readSwitch () este cheia. Calculează valoarea comutatorului adăugând reprezentarea numerică a fiecărei ieșiri a comutatorului și returnează totalul ca rezultat. Pentru acest exemplu am folosit un ecran numeric care este controlat de NXP SAA1064.

Pasul 5:

Image
Image

Funcția readSwitch () este cheia. Calculează valoarea comutatorului adăugând reprezentarea numerică a fiecărei ieșiri a comutatorului și returnează totalul ca rezultat. Pentru acest exemplu am folosit un ecran numeric care este controlat de NXP SAA1064.

Dacă nu aveți unul, este ok - rezultatele sunt trimise și la monitorul serial. Acum, să-l vedem în acțiune în videoclip.

Pasul 6:

Ok, nu arată prea mult, dar dacă aveți nevoie de introducere numerică, economisește mult spațiu fizic și oferă o metodă precisă de introducere.

Deci, iată-l. Le-ați folosi de fapt într-un proiect? Pentru o cifră - da. Pentru patru? Probabil că nu - poate ar fi mai ușor să folosiți o tastatură cu 12 cifre. Există o idee …

Pasul 7: Comutatoare multiple

Imagine
Imagine

Acum vom examina cum să citiți patru cifre - și să nu pierdeți toți acei pins digitali în proces. În schimb, vom folosi un microchip MCP23017 pe 16 biți pentru expansiunea portului care comunică prin magistrala I2C. Are șaisprezece pini de intrare / ieșire digitale pe care îi putem folosi pentru a citi starea fiecărui comutator.

Înainte de a merge mai departe, vă rugăm să rețineți că sunt necesare anumite cunoștințe presupuse pentru acest articol - autobuzul I2C (părțile unu și două) și MCP23017. Mai întâi vom descrie conexiunile hardware, apoi schița Arduino. Reamintim schema utilizată pentru exemplul de comutator unic.

Când comutatorul a fost conectat direct la Arduino, citim starea fiecărui pin pentru a determina valoarea comutatorului. Vom face acest lucru din nou, pe o scară mai mare, folosind MCP23017. Luați în considerare diagrama pinout:

Pasul 8:

Avem 16 pini, ceea ce permite conectarea a patru comutatoare. Comunele pentru fiecare comutator se conectează în continuare la 5V și fiecare contact de comutare are încă un rezistor de 10k la GND. Apoi conectăm 1, 2, 4, 8 pini ai cifrei unu la GPBA0 ~ 3; cifrele două 1, 2, 4, 8 la GPA4 ~ 7; cifrele trei 1, 2, 4, 8 la GPB0 ~ 3 și cifra patru 1, 2, 4, 8 la GPB4 ~ 7.

Acum, cum citim comutatoarele? Toate aceste fire vă pot face să credeți că este dificil, dar schița este destul de simplă. Când citim valoarea GPBA și B, se returnează un octet pentru fiecare bancă, cu primul bit cel mai semnificativ. Fiecare patru biți se va potrivi cu setarea comutatorului conectat la pinii I / O potrivite. De exemplu, dacă solicităm date pentru ambele bănci IO și comutatoarele sunt setate la 1 2 3 4 - banca A va returna 0010 0001 și banca B va returna 0100 0011.

Folosim câteva operații de schimbare a biților pentru a separa fiecare patru biți într-o variabilă separată - ceea ce ne lasă valoarea fiecărei cifre. De exemplu, pentru a separa valoarea comutatorului patru, schimbăm biții din banca B >> 4. Aceasta împinge valoarea comutatorului trei afară, iar biții goi din stânga devin zero.

Pentru a separa valoarea pentru comutatorul trei, folosim un compus în sensul bitului & - care lasă valoarea comutatorului trei. Imaginea prezintă o defalcare a valorilor comutatorului binar - afișează valorile brute GPIOA și B, apoi valoarea binară a fiecărei cifre și valoarea zecimală.

Pasul 9:

Așadar, să vedem schița demonstrativă:

/ * Exemplul 40a - Citiți patru comutatoare BCD cu volană prin MCP23017, afișați pe SAA1064 / afișaj LED cu 4 segmente din 7 segmente * / // MCP23017 pinii 15 ~ 17 la GND, adresa magistralei I2C este 0x20 // SAA1064 Adresa magistralei I2C 0x38 # includeți „Wire.h” // pentru definițiile cifrelor LED int cifre [16] = {63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113 }; octet GPIOA, GPIOB, dig1, dig2, dig3, dig4; void initSAA1064 () {// setup 0x38 Wire.beginTransmission (0x38); Wire.write (0); Wire.write (B01000111); // ieșire 12mA, fără eliminarea cifrelor Wire.endTransmission (); } void setup () {Serial.begin (9600); Wire.begin (); // porniți autobuzul I2C initSAA1064 (); } void loop () {// citiți intrările băncii A Wire.beginTransmission (0x20); Wire.write (0x12); Wire.endTransmission (); Wire.requestFrom (0x20, 1); GPIOA = Wire.read (); // acest octet conține datele de comutare pentru cifrele 1 și 2 // citiți intrările băncii B Wire.beginTransmission (0x20); Wire.write (0x13); Wire.endTransmission (); Wire.requestFrom (0x20, 1); GPIOB = Wire.read (); // acest octet conține datele comutatorului pentru cifrele 3 și 4 // extrageți valoarea pentru fiecare comutator // dig1 LHS, dig4 RHS dig4 = GPIOB >> 4; dig3 = GPIOB & B00001111; dig2 = GPIOA >> 4; dig1 = GPIOA & B00001111; // trimiteți toate datele GPIO și de comutare individuale pe monitorul serial // pentru depanare și interesul Serial.print ("GPIOA ="); Serial.println (GPIOA, BIN); Serial.print ("GPIOB ="); Serial.println (GPIOB, BIN); Serial.println (); Serial.print ("cifra 1 ="); Serial.println (dig1, BIN); Serial.print ("cifra 2 ="); Serial.println (dig2, BIN); Serial.print ("cifra 3 ="); Serial.println (dig3, BIN); Serial.print ("cifra 4 ="); Serial.println (dig4, BIN); Serial.println (); Serial.print ("cifra 1 ="); Serial.println (dig1, DEC); Serial.print ("cifra 2 ="); Serial.println (dig2, DEC); Serial.print ("cifra 3 ="); Serial.println (dig3, DEC); Serial.print ("cifra 4 ="); Serial.println (dig4, DEC); Serial.println (); // trimite valoarea comutatorului la afișajul LED prin SAA1064 Wire.beginTransmission (0x38); Wire.write (1); Wire.write (cifre [dig4]); Wire.write (cifre [dig3]); Wire.write (cifre [dig2]); Wire.write (cifre [dig1]); Wire.endTransmission (); întârziere (10); întârziere (1000); }

Și pentru necredincioși … o demonstrație video.

Deci, iată-l. Patru cifre în loc de una și peste magistrala I2C conservând pinii I / O digitale Arduino. Folosind opt MCP23017, puteți citi 32 de cifre simultan. Distrează-te făcând asta!

Puteți comanda atât comutatoare BCD, cât și zecimale în diferite dimensiuni de la PMD Way, cu livrare gratuită în toată lumea.

Această postare ți-a fost adusă de pmdway.com - totul pentru producătorii și pasionații de electronice, cu livrare gratuită în toată lumea.

Recomandat: