Innholdsfortegnelse:

Brytere for Arduino og tommelhjul: 9 trinn
Brytere for Arduino og tommelhjul: 9 trinn

Video: Brytere for Arduino og tommelhjul: 9 trinn

Video: Brytere for Arduino og tommelhjul: 9 trinn
Video: Как управлять приводом с помощью Arduino - Robojax 2024, Juli
Anonim
Brytere for Arduino og tommelhjul
Brytere for Arduino og tommelhjul

I denne artikkelen undersøker vi bruken av push-wheel/thumbwheel-brytere med våre Arduino-systemer. Her er noen eksempler hentet fra PMD Way.

Trinn 1:

Bilde
Bilde

For de uinnvidde er hver bryter ett vertikalt segment, og de kan kobles sammen for å danne forskjellige størrelser. Du kan bruke knappene til å velge fra sifre null til ni. Det er alternativer tilgjengelig som har et hjul du kan flytte med tommelen i stedet for knappene for økning/reduksjon.

Før dagene med fancy brukergrensesnitt var disse bryterne ganske populære metoder for å angi numerisk dataregistrering. Imidlertid er de fortsatt tilgjengelige i dag, så la oss se hvordan de fungerer og hvordan vi kan bruke dem. Bryterens verdi gjøres tilgjengelig via binært kodet desimal eller rett desimal. Tenk på baksiden av bryteren i BCD -form.

Steg 2:

Bilde
Bilde

Vi har felles til venstre, deretter kontakter for 1, 2, 4 og 8. Hvis du bruker en liten spenning (si 5V) til felles, kan verdien av bryteren måles ved å legge til verdiene for kontaktene som er i HØY tilstand. For eksempel, hvis du velger 3 - vil kontaktene 1 og 2 være på felles spenning. Verdiene mellom null og ni kan representeres som sådan i tabellen.

Trinn 3:

Bilde
Bilde

Nå burde du innse at det ville være lett å lese verdien av en bryter - og du har rett, det er det. Vi kan koble 5V til felles, utgangene til digitale inngangspinner på våre Arduino -kort, og deretter bruke digitalRead () for å bestemme verdien av hver utgang. I skissen bruker vi noen grunnleggende matematikk for å konvertere BCD -verdien til et desimaltall. Så la oss gjøre det nå.

Fra et maskinvareperspektiv må vi ta en ting til i betraktning-skyvebryteren oppfører seg elektrisk som fire normalt åpne trykknapper. Dette betyr at vi må bruke nedtrekksmotstander for å ha en klar forskjell mellom høye og lave tilstander. Så skjematisk for en bryter er som vist ovenfor.

Trinn 4:

Nå er det enkelt å koble utgangene merket 1, 2, 4 og 8 til (for eksempel) digitale pinner 8, 9, 10 og 11. Koble 5V til bryteren ‘C’, og GND til … GND. Deretter må vi ha en skisse som kan lese inngangene og konvertere BCD -utgangen til desimal. Vurder følgende skisse:

/ * Bruker SAA1064 numerisk displayskjerm https://www.gravitech.us/7segmentshield.html Bruker seriell skjerm 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 (); // bli med i2c -buss (adresse valgfri for master) forsinkelse (500); pinMode (q1, INPUT); // thumbwheel '1' pinMode (q2, INPUT); // thumbwheel '2' pinMode (q4, INPUT); // tommelhjul '4' pinMode (q8, INPUT); // thumbwheel '8'} void dispSAA1064 (int Count) // sender heltall 'Count' til Gravitech SAA1064 -skjold {const int lookup [10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; int Tusenvis, hundrevis, tiere, base; Wire.beginTransmission (0x38); Wire.write (0); Wire.write (B01000111); Wire.endTransmission (); Wire.beginTransmission (0x38); Wire.write (1); Tusenvis = Count/1000; Hundre = (Count- (Tusen*1000))/100; Tenåringer = (Count-((Tusen*1000)+(Hundre*100))))/10; Base = Antall-((Tusen*1000)+(Hundre*100)+(Ti*10)); Wire.write (oppslag [Base]); Wire.write (oppslag [Tens]); Wire.write (oppslag [hundrevis]); Wire.write (oppslag [tusenvis]); Wire.endTransmission (); forsinkelse (10); } int readSwitch () {int total = 0; hvis (digitalRead (q1) == HIGH) {total+= 1; } if (digitalRead (q2) == HIGH) {total+= 2; } if (digitalRead (q4) == HIGH) {total+= 4; } if (digitalRead (q8) == HIGH) {total+= 8; } totalt tilbake; } void loop () {dispSAA1064 (readSwitch ()); // sender bryterverdi for å vise skjerm Serial.println (readSwitch ()); // sender bryterverdi til seriell skjermboks}

Funksjonen readSwitch () er nøkkelen. Den beregner verdien av bryteren ved å legge til den numeriske representasjonen for hver bryterutgang og returnerer totalen som resultat. I dette eksemplet brukte vi et numerisk skjermskjerm som styres av NXP SAA1064.

Trinn 5:

Image
Image

Funksjonen readSwitch () er nøkkelen. Den beregner verdien av bryteren ved å legge til den numeriske representasjonen for hver bryterutgang og returnerer totalen som resultat. I dette eksemplet brukte vi et numerisk displayskjerm som styres av NXP SAA1064.

Hvis du ikke har en, er det ok - resultatene sendes også til den serielle skjermen. La oss se det i aksjon i videoen.

Trinn 6:

Ok, det ser ikke ut som mye, men hvis du trenger numerisk oppføring, sparer det mye fysisk plass og tilbyr en presis oppføringsmetode.

Så der har du det. Ville du virkelig brukt disse i et prosjekt? For ett siffer - ja. For fire? Sannsynligvis ikke-kanskje det ville være lettere å bruke et 12-sifret tastatur. Det er en idé …

Trinn 7: Flere brytere

Bilde
Bilde

Nå skal vi undersøke hvordan du leser fire sifre - og ikke kaste bort alle de digitale pinnene i prosessen. I stedet vil vi bruke Microchip MCP23017 16-biters portutvidelse IC som kommuniserer via I2C-bussen. Den har seksten digitale inngangs-/utgangspinner som vi kan bruke til å lese statusen til hver bryter.

Vær oppmerksom på at noen antatt kunnskap er nødvendig for denne artikkelen - I2C -bussen (del ett og to) og MCP23017 før du går videre. Vi vil først beskrive maskinvareforbindelsene, og deretter Arduino -skissen. Husk skjemaet som ble brukt for enkeltbrytereksemplet.

Da bryteren var direkte koblet til Arduino, leste vi statusen til hver pinne for å bestemme verdien av bryteren. Vi vil gjøre dette igjen, i større skala ved hjelp av MCP23017. Vurder pinout -diagrammet:

Trinn 8:

Vi har 16 pinner, som gjør at fire brytere kan kobles til. Allmenningen for hver bryter er fortsatt koblet til 5V, og hver bryterkontakt har fortsatt en 10k nedtrekksmotstand mot GND. Deretter kobler vi 1, 2, 4, 8 pinnene i siffer en til GPBA0 ~ 3; siffer to er 1, 2, 4, 8 til GPA4 ~ 7; siffer tre 1, 2, 4, 8 til GPB0 ~ 3 og siffer fire 1, 2, 4, 8 til GPB4 ~ 7.

Nå, hvordan leser vi bryterne? Alle disse ledningene kan få deg til å synes det er vanskelig, men skissen er ganske enkel. Når vi leser verdien av GPBA og B, returneres en byte for hver bank, med den mest signifikante biten først. Hver fire bits vil matche innstillingen til bryteren som er koblet til de matchende I/O -pinnene. For eksempel, hvis vi ber om dataene for både IO -banker og bryterne er satt til 1 2 3 4 - vil bank A returnere 0010 0001 og bank B returnere 0100 0011.

Vi bruker noen bitshift -operasjoner for å skille hver fire bit til en egen variabel - som etterlater oss verdien av hvert siffer. For eksempel, for å skille verdien av bryter fire, flytter vi bitene fra bank B >> 4. Dette skyver verdien av bryteren tre ut, og de tomme bitene til venstre blir null.

For å skille verdien for bryter tre, bruker vi en sammensatt bitvis & - som etterlater verdien av bryter tre. Bildet viser en sammenbrudd av de binære bryterverdiene - det viser de rå GPIOA- og B -byteverdiene, deretter hvert siffer sin binære verdi og desimalverdi.

Trinn 9:

Så la oss se demonstrasjonsskissen:

/ * Eksempel 40a-Les fire push-wheel BCD-brytere via MCP23017, display på SAA1064/4-sifret 7-segment LED-display */// MCP23017 pins 15 ~ 17 til GND, I2C bussadresse er 0x20 // SAA1064 I2C bussadresse 0x38 # inkludere "Wire.h" // for definisjoner av LED -siffer int sifre [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 utgang, ingen siffer blanking Wire.endTransmission (); } ugyldig oppsett () {Serial.begin (9600); Wire.begin (); // starte opp I2C buss initSAA1064 (); } void loop () {// les inngangene til bank A Wire.beginTransmission (0x20); Wire.write (0x12); Wire.endTransmission (); Wire.requestFrom (0x20, 1); GPIOA = Wire.read (); // denne byten inneholder bryterdataene for sifrene 1 og 2 // les inngangene til bank B Wire.beginTransmission (0x20); Wire.write (0x13); Wire.endTransmission (); Wire.requestFrom (0x20, 1); GPIOB = Wire.read (); // denne byten inneholder bryterdataene for siffer 3 og 4 // ekstraktverdi for hver bryter // dig1 LHS, dig4 RHS dig4 = GPIOB >> 4; dig3 = GPIOB & B00001111; dig2 = GPIOA >> 4; dig1 = GPIOA & B00001111; // sende alle GPIO og individuelle switchdata til seriell skjerm // for feilsøking og interessers skyld Serial.print ("GPIOA ="); Serial.println (GPIOA, BIN); Serial.print ("GPIOB ="); Serial.println (GPIOB, BIN); Serial.println (); Serial.print ("siffer 1 ="); Serial.println (dig1, BIN); Serial.print ("siffer 2 ="); Serial.println (dig2, BIN); Serial.print ("siffer 3 ="); Serial.println (dig3, BIN); Serial.print ("siffer 4 ="); Serial.println (dig4, BIN); Serial.println (); Serial.print ("siffer 1 ="); Serial.println (dig1, DEC); Serial.print ("siffer 2 ="); Serial.println (dig2, DEC); Serial.print ("siffer 3 ="); Serial.println (dig3, DEC); Serial.print ("siffer 4 ="); Serial.println (dig4, DEC); Serial.println (); // send bryterverdi til LED -skjerm via SAA1064 Wire.beginTransmission (0x38); Wire.write (1); Wire.write (sifre [dig4]); Wire.write (sifre [dig3]); Wire.write (sifre [dig2]); Wire.write (sifre [dig1]); Wire.endTransmission (); forsinkelse (10); forsinkelse (1000); }

Og for de ikke-troende … en videodemonstrasjon.

Så der har du det. Fire sifre i stedet for en, og over I2C -bussen som bevarer Arduino digitale I/O -pinner. Ved å bruke åtte MCP23017s kunne du lese 32 sifre samtidig. Ha det gøy med å gjøre det!

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

Dette innlegget ble brakt til deg av pmdway.com - alt for produsenter og elektronikkentusiaster, med gratis levering over hele verden.

Anbefalt: