Indholdsfortegnelse:

Arduino- og tommelhjulskontakter: 9 trin
Arduino- og tommelhjulskontakter: 9 trin

Video: Arduino- og tommelhjulskontakter: 9 trin

Video: Arduino- og tommelhjulskontakter: 9 trin
Video: Энкодер + arduino - вращение с нажатием, нажатие, длинное нажатие и вращение без нажатия. 2024, November
Anonim
Arduino- og tommelhjulskontakter
Arduino- og tommelhjulskontakter

I denne artikel undersøger vi brugen af push-wheel/thumbwheel switches med vores Arduino-systemer. Her er nogle eksempler hentet fra PMD Way.

Trin 1:

Billede
Billede

For de uindviede er hver switch et lodret segment, og de kan forbindes sammen til forskellige størrelser. Du kan bruge knapperne til at vælge fra cifre nul til ni. Der er alternativer tilgængelige, der har et hjul, du kan flytte med tommelfingeren i stedet for knapperne forøg/sænk.

Før de smarte brugergrænseflader var disse switches ret populære metoder til indstilling af numerisk dataindtastning. De er dog stadig tilgængelige i dag, så lad os se, hvordan de fungerer, og hvordan vi kan bruge dem. Omskifterens værdi gøres tilgængelig via binært kodet decimal eller lige decimal. Overvej kontakten bag på kontakten i BCD -form.

Trin 2:

Billede
Billede

Vi har fælles til venstre, derefter kontakter til 1, 2, 4 og 8. Hvis du anvender en lille spænding (f.eks. 5V) til fælles, kan værdien af kontakten måles ved at tilføje værdierne for de kontakter, der er i HØJ tilstand. For eksempel, hvis du vælger 3 - kontakterne 1 og 2 vil være ved den fælles spænding. Værdierne mellem nul og ni kan repræsenteres som sådan i tabellen.

Trin 3:

Billede
Billede

Nu skulle du indse, at det ville være let at aflæse værdien af en switch - og du har ret, det er det. Vi kan tilslutte 5V til fælles, output til digitale input -pins på vores Arduino -kort og derefter bruge digitalRead () til at bestemme værdien af hver output. I skitsen bruger vi nogle grundlæggende matematik til at konvertere BCD -værdien til et decimaltal. Så lad os gøre det nu.

Fra et hardwareperspektiv er vi nødt til at tage endnu en ting i betragtning-skubbehjulskontakten opfører sig elektrisk som fire normalt åbne trykknapper. Det betyder, at vi skal bruge pull-down-modstande for at have en klar forskel mellem høje og lave tilstande. Så skematikken for en switch er som vist ovenfor.

Trin 4:

Nu er det en simpel sag at tilslutte udgangene mærket 1, 2, 4 og 8 til (f.eks.) Digitale ben 8, 9, 10 og 11. Tilslut 5V til kontakten ‘C’, og GND til … GND. Dernæst skal vi have en skitse, der kan læse input og konvertere BCD -output til decimal. Overvej følgende skitse:

/ * Bruger SAA1064 numerisk displayskærm https://www.gravitech.us/7segmentshield.html Bruger seriel skærm, hvis du ikke har SAA1064 -skjoldet */ #inkluderer "Wire.h" #define q1 8 #define q2 9 # definere q4 10 #define q8 11 void setup () {Serial.begin (9600); Wire.begin (); // slutte sig til i2c -bus (adresse valgfri til master) forsinkelse (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) // sender heltal 'Count' til Gravitech SAA1064 shield {const int lookup [10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; int Tusinder, hundredvis, tiere, base; Wire.beginTransmission (0x38); Wire.write (0); Wire.write (B01000111); Wire.endTransmission (); Wire.beginTransmission (0x38); Wire.write (1); Tusinder = tælle/1000; Hundreder = (Count- (Tusinder*1000))/100; Tens = (Count-((Tusinder*1000)+(Hundreder*100))))/10; Base = Count-((Tusinder*1000)+(Hundreder*100)+(Ti*10)); Wire.write (opslag [Base]); Wire.write (opslag [Tens]); Wire.write (opslag [Hundreder]); Wire.write (opslag [tusinder]); Wire.endTransmission (); forsinkelse (10); } int readSwitch () {int total = 0; hvis (digitalRead (q1) == HIGH) {total+= 1; } hvis (digitalRead (q2) == HIGH) {total+= 2; } hvis (digitalRead (q4) == HIGH) {total+= 4; } hvis (digitalRead (q8) == HIGH) {total+= 8; } total retur; } void loop () {dispSAA1064 (readSwitch ()); // sender switchværdi til at vise skjold Serial.println (readSwitch ()); // sender switchværdi til seriel monitorboks}

Funktionen readSwitch () er nøglen. Den beregner switchens værdi ved at tilføje den numeriske repræsentation for hver switchoutput og returnerer totalen som dens resultat. I dette eksempel brugte vi et numerisk displayskærm, der styres af NXP SAA1064.

Trin 5:

Image
Image

Funktionen readSwitch () er nøglen. Det beregner switchens værdi ved at tilføje den numeriske repræsentation for hver switchoutput og returnerer totalen som dens resultat. I dette eksempel brugte vi et numerisk displayskærm, der styres af NXP SAA1064.

Hvis du ikke har en, er det ok - resultaterne sendes også til den serielle skærm. Lad os nu se det i aktion i videoen.

Trin 6:

Ok det ligner ikke meget, men hvis du har brug for numerisk indtastning, sparer det meget fysisk plads og tilbyder en præcis metode til indtastning.

Så der har du det. Vil du faktisk bruge disse i et projekt? For et ciffer - ja. For fire? Sandsynligvis ikke-måske ville det være lettere at bruge et 12-cifret tastatur. Der er en idé…

Trin 7: Flere kontakter

Billede
Billede

Nu vil vi undersøge, hvordan man læser fire cifre - og ikke spilde alle de digitale stifter i processen. I stedet vil vi bruge Microchip MCP23017 16-bit port expander IC, der kommunikerer via I2C-bussen. Den har seksten digitale input/output pins, som vi kan bruge til at læse status for hver switch.

Inden du går videre, skal du være opmærksom på, at der kræves en vis viden om denne artikel - I2C -bussen (del et og to) og MCP23017. Vi vil først beskrive hardwareforbindelserne og derefter Arduino -skitsen. Husk den skematiske, der blev brugt til eksemplet med enkelt switch.

Da kontakten var direkte forbundet til Arduino, læste vi status for hver pin for at bestemme switchens værdi. Vi vil gøre dette igen i større skala ved hjælp af MCP23017. Overvej pinout -diagrammet:

Trin 8:

Vi har 16 ben, som gør det muligt at tilslutte fire kontakter. Almuen for hver switch er stadig forbundet til 5V, og hver switchkontakt har stadig en 10k pull-down modstand til GND. Derefter forbinder vi 1, 2, 4, 8 ben af ciffer et til GPBA0 ~ 3; ciffer to’s 1, 2, 4, 8 til GPA4 ~ 7; ciffer tre’s 1, 2, 4, 8 til GPB0 ~ 3 og ciffer fire’s 1, 2, 4, 8 til GPB4 ~ 7.

Nu, hvordan læser vi switchene? Alle disse ledninger kan få dig til at synes, at det er svært, men skitsen er ganske enkel. Når vi læser værdien af GPBA og B, returneres en byte for hver bank, med den mest betydende bit først. Hver fire bit matcher indstillingen af kontakten tilsluttet de matchende I/O -ben. For eksempel, hvis vi anmoder om dataene for både IO -banker og switchene er sat til 1 2 3 4 - vil bank A returnere 0010 0001 og bank B returnere 0100 0011.

Vi bruger nogle bitshift -operationer til at adskille hver fire bit til en separat variabel - hvilket efterlader os med værdien af hvert ciffer. For eksempel for at adskille værdien af switch fire, flytter vi bitene fra bank B >> 4. Dette skubber værdien af switch tre ud, og de tomme bits til venstre bliver nul.

For at adskille værdien for switch tre bruger vi en forbindelse bitvis & - som efterlader værdien af switch tre. Billedet viser en opdeling af de binære switchværdier - det viser de rå GPIOA- og B -byteværdier, derefter hvert cifers binære værdi og decimalværdi.

Trin 9:

Så lad os se demonstrationsskitsen:

/ * Eksempel 40a-Læs fire push-hjul BCD-switches via MCP23017, display på SAA1064/4-cifret 7-segment LED display */// MCP23017 ben 15 ~ 17 til GND, I2C busadresse er 0x20 // SAA1064 I2C busadresse 0x38 # omfatte "Wire.h" // for definition af LED -cifre int cifre [16] = {63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113 }; byte GPIOA, GPIOB, dig1, dig2, dig3, dig4; ugyldig initSAA1064 () {// setup 0x38 Wire.beginTransmission (0x38); Wire.write (0); Wire.write (B01000111); // 12mA output, no digit blanking Wire.endTransmission (); } ugyldig opsætning () {Serial.begin (9600); Wire.begin (); // start I2C bus initSAA1064 (); } void loop () {// læs input fra bank A Wire.beginTransmission (0x20); Wire.write (0x12); Wire.endTransmission (); Wire.requestFrom (0x20, 1); GPIOA = Wire.read (); // denne byte indeholder switchdataene for cifrene 1 og 2 // læs input fra bank B Wire.beginTransmission (0x20); Wire.write (0x13); Wire.endTransmission (); Wire.requestFrom (0x20, 1); GPIOB = Wire.read (); // denne byte indeholder switchdata for cifrene 3 og 4 // ekstraktværdi for hver switch // dig1 LHS, dig4 RHS dig4 = GPIOB >> 4; dig3 = GPIOB & B00001111; dig2 = GPIOA >> 4; dig1 = GPIOA & B00001111; // sende alle GPIO og individuelle switchdata til seriel monitor // for fejlfinding og interessers skyld Serial.print ("GPIOA ="); Serial.println (GPIOA, BIN); Serial.print ("GPIOB ="); Serial.println (GPIOB, BIN); Serial.println (); Serial.print ("ciffer 1 ="); Serial.println (dig1, BIN); Serial.print ("ciffer 2 ="); Serial.println (dig2, BIN); Serial.print ("ciffer 3 ="); Serial.println (dig3, BIN); Serial.print ("ciffer 4 ="); Serial.println (dig4, BIN); Serial.println (); Serial.print ("ciffer 1 ="); Serial.println (dig1, DEC); Serial.print ("ciffer 2 ="); Serial.println (dig2, DEC); Serial.print ("ciffer 3 ="); Serial.println (dig3, DEC); Serial.print ("ciffer 4 ="); Serial.println (dig4, DEC); Serial.println (); // sende switchværdi til LED -display via 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 (); forsinkelse (10); forsinkelse (1000); }

Og for de ikke-troende … en videodemonstration.

Så der har du det. Fire cifre i stedet for et, og over I2C -bussen, der bevarer Arduino digitale I/O -ben. Ved hjælp af otte MCP23017s kunne du læse 32 cifre på én gang. God fornøjelse med at gøre det!

Du kan bestille både BCD og decimalafbrydere i forskellige størrelser fra PMD Way, med gratis levering over hele verden.

Dette indlæg blev bragt til dig af pmdway.com - alt for producenter og elektronikentusiaster, med gratis levering over hele verden.

Anbefalede: