Innehållsförteckning:

Arduino- och tumhjulströmställare: 9 steg
Arduino- och tumhjulströmställare: 9 steg

Video: Arduino- och tumhjulströmställare: 9 steg

Video: Arduino- och tumhjulströmställare: 9 steg
Video: Arduino och DLR3416 2024, Juli
Anonim
Arduino- och tumhjulströmställare
Arduino- och tumhjulströmställare

I den här artikeln undersöker vi användningen av knappar för hjul/tumhjul med våra Arduino-system. Här är några exempel från PMD Way.

Steg 1:

Bild
Bild

För de oinvigde är varje omkopplare ett vertikalt segment och de kan kopplas ihop för att bilda olika storlekar. Du kan använda knapparna för att välja mellan siffror noll till nio. Det finns alternativ som har ett hjul som du kan flytta med tummen istället för höjning/sänkningsknapparna.

Innan de fina användargränssnitten var dessa switchar ganska populära metoder för att ställa in numerisk datainmatning. Men de är fortfarande tillgängliga idag, så låt oss se hur de fungerar och hur vi kan använda dem. Omkopplarens värde görs tillgängligt via binärt kodad decimal eller rak decimal. Tänk på baksidan av strömbrytaren i BCD -form.

Steg 2:

Bild
Bild

Vi har gemensamt till vänster, sedan kontakter för 1, 2, 4 och 8. Om du använder en liten spänning (säg 5V) till gemensam, kan omkopplarens värde mätas genom att lägga till värdena för kontakterna som finns i HÖGT tillstånd. Om du till exempel väljer 3 - kommer kontakterna 1 och 2 att vara vid den gemensamma spänningen. Värdena mellan noll och nio kan representeras som sådana i tabellen.

Steg 3:

Bild
Bild

Vid det här laget bör du inse att det skulle vara lätt att läsa värdet på en switch - och du har rätt, det är det. Vi kan ansluta 5V till det vanliga, utgångarna till digitala ingångsstiften på våra Arduino -kort och sedan använda digitalRead () för att bestämma värdet på varje utgång. I skissen använder vi lite grundläggande matematik för att konvertera BCD -värdet till ett decimaltal. Så låt oss göra det nu.

Ur ett hårdvaruperspektiv måste vi ta hänsyn till en sak till-skjutreglaget fungerar elektriskt som fyra normalt öppna knappar. Det betyder att vi måste använda neddragningsmotstånd för att ha en tydlig skillnad mellan höga och låga tillstånd. Så schemat för en omkopplare är som visas ovan.

Steg 4:

Nu är det enkelt att ansluta utgångarna märkta 1, 2, 4 och 8 till (till exempel) digitala stift 8, 9, 10 och 11. Anslut 5V till omkopplaren 'C' och GND till … GND. Därefter måste vi ha en skiss som kan läsa ingångarna och konvertera BCD -utmatningen till decimal. Tänk på följande skiss:

/ * Använder SAA1064 numerisk displayskärm https://www.gravitech.us/7segmentshield.html Använder seriell bildskärm om du inte har SAA1064 -skölden */ #inkludera "Wire.h" #define q1 8 #define q2 9 # definiera q4 10 #define q8 11 void setup () {Serial.begin (9600); Wire.begin (); // anslut i2c -buss (adress valfri för master) fördröjning (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) // skickar heltal 'Count' till Gravitech SAA1064 -skärm {const int lookup [10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; int Tusentals, hundratals, tiotal, bas; Wire.beginTransmission (0x38); Wire.write (0); Wire.write (B01000111); Wire.endTransmission (); Wire.beginTransmission (0x38); Wire.write (1); Tusentals = räkna/1000; Hundratals = (Count- (Tusentals*1000))/100; Tiotal = (räkna-((tusentals*1000)+(hundratals*100))))/10; Base = Count-((Tusentals*1000)+(Hundratals*100)+(Tio*10)); Wire.write (sökning [Base]); Wire.write (sökning [tior]); Wire.write (sökning [hundratals]); Wire.write (sökning [tusentals]); Wire.endTransmission (); fördröjning (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; } totalt tillbaka; } void loop () {dispSAA1064 (readSwitch ()); // skickar switchvärde till displayskärm Serial.println (readSwitch ()); // skickar switchvärde till seriell monitorbox}

Funktionen readSwitch () är nyckeln. Den beräknar omkopplarens värde genom att lägga till den numeriska representationen för varje switchutgång och returnerar summan som dess resultat. I detta exempel använde vi en numerisk displayskärm som styrs av NXP SAA1064.

Steg 5:

Image
Image

Funktionen readSwitch () är nyckeln. Den beräknar omkopplarens värde genom att lägga till den numeriska representationen för varje switchutgång och returnerar summan som dess resultat. I detta exempel använde vi en numerisk displayskärm som styrs av NXP SAA1064.

Om du inte har en så är det ok - resultaten skickas också till den seriella bildskärmen. Låt oss nu se det i aktion i videon.

Steg 6:

Ok det ser inte ut som mycket, men om du behöver numerisk post sparar det mycket fysiskt utrymme och erbjuder en exakt inmatningsmetod.

Så där har du det. Skulle du verkligen använda dessa i ett projekt? För en siffra - ja. För fyra? Förmodligen inte-kanske skulle det vara lättare att använda en 12-siffrig knappsats. Det finns en idé …

Steg 7: Flera switchar

Bild
Bild

Nu ska vi undersöka hur man läser fyra siffror - och inte slösa bort alla de digitala stiften i processen. Istället kommer vi att använda Microchip MCP23017 16-bitars portexpander IC som kommunicerar via I2C-bussen. Den har sexton digitala in-/utgångsstiften som vi kan använda för att läsa status för varje switch.

Innan du går vidare, observera att vissa förutsatta kunskaper krävs för denna artikel - I2C -bussen (del ett och två) och MCP23017. Vi kommer först att beskriva hårdvaruanslutningarna och sedan Arduino -skissen. Återkalla schemat som används för exemplet med en switch.

När omkopplaren var direkt ansluten till Arduino läste vi status för varje stift för att bestämma värdet på omkopplaren. Vi kommer att göra detta igen, i större skala med hjälp av MCP23017. Tänk på pinout -diagrammet:

Steg 8:

Vi har 16 stift, vilket gör att fyra switchar kan anslutas. Allmänheten för varje switch är fortfarande ansluten till 5V, och varje switchkontakt har fortfarande ett 10k neddragningsmotstånd mot GND. Sedan ansluter vi 1, 2, 4, 8 stiften i siffra ett till GPBA0 ~ 3; siffran två, 1, 2, 4, 8 till GPA4 ~ 7; siffran tre, 1, 2, 4, 8 till GPB0 ~ 3 och siffran fyra, 1, 2, 4, 8 till GPB4 ~ 7.

Hur läser vi nu switcharna? Alla dessa ledningar kan få dig att tycka att det är svårt, men skissen är ganska enkel. När vi läser värdet av GPBA och B returneras en byte för varje bank, med den mest betydande biten först. Varje fyra bitar matchar inställningen för omkopplaren som är ansluten till de matchande I/O -stiften. Om vi till exempel begär data för både IO -banker och switcharna är inställda på 1 2 3 4 - bank A returnerar 0010 0001 och bank B returnerar 0100 0011.

Vi använder några bitshift -operationer för att separera varje fyra bitar till en separat variabel - vilket lämnar oss med värdet på varje siffra. Till exempel, för att separera värdet på switch fyra, flyttar vi bitarna från bank B >> 4. Detta skjuter ut värdet på switch tre och de tomma bitarna till vänster blir noll.

För att separera värdet för switch tre använder vi en förening bitvis & - som lämnar värdet på switch tre. Bilden visar en uppdelning av de binära switchvärdena - den visar de råa GPIOA- och B -bytevärdena, sedan varje siffras binära värde och decimalvärde.

Steg 9:

Så låt oss se demonstrationsskissen:

/ * Exempel 40a-Läs fyra tryckhjulets BCD-switchar via MCP23017, display på SAA1064/4-siffrig 7-segment LED-display */// MCP23017 stift 15 ~ 17 till GND, I2C-bussadress är 0x20 // SAA1064 I2C bussadress 0x38 # inkludera "Wire.h" // för LED -sifferdefinitioner int siffror [16] = {63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113 }; byte GPIOA, GPIOB, dig1, dig2, dig3, dig4; void initSAA1064 () {// setup 0x38 Wire.beginTransmission (0x38); Wire.write (0); Wire.write (B01000111); // 12mA -utgång, ingen siffra släckning Wire.endTransmission (); } void setup () {Serial.begin (9600); Wire.begin (); // starta I2C -buss initSAA1064 (); } void loop () {// läs ingångar från bank A Wire.beginTransmission (0x20); Wire.write (0x12); Wire.endTransmission (); Wire.requestFrom (0x20, 1); GPIOA = Wire.read (); // denna byte innehåller switchdata för siffrorna 1 och 2 // läs ingångarna för bank B Wire.beginTransmission (0x20); Wire.write (0x13); Wire.endTransmission (); Wire.requestFrom (0x20, 1); GPIOB = Wire.read (); // denna byte innehåller switchdata för siffrorna 3 och 4 // extraktvärdet för varje switch // dig1 LHS, dig4 RHS dig4 = GPIOB >> 4; dig3 = GPIOB & B00001111; dig2 = GPIOA >> 4; dig1 = GPIOA & B00001111; // skicka alla GPIO och individuella switchdata till seriell bildskärm // för felsökning och intressens skull Serial.print ("GPIOA ="); Serial.println (GPIOA, BIN); Serial.print ("GPIOB ="); Serial.println (GPIOB, BIN); Serial.println (); Serial.print ("siffra 1 ="); Serial.println (dig1, BIN); Serial.print ("siffra 2 ="); Serial.println (dig2, BIN); Serial.print ("siffra 3 ="); Serial.println (dig3, BIN); Serial.print ("siffra 4 ="); Serial.println (dig4, BIN); Serial.println (); Serial.print ("siffra 1 ="); Serial.println (dig1, DEC); Serial.print ("siffra 2 ="); Serial.println (dig2, DEC); Serial.print ("siffra 3 ="); Serial.println (dig3, DEC); Serial.print ("siffra 4 ="); Serial.println (dig4, DEC); Serial.println (); // skicka switchvärde till LED -display via SAA1064 Wire.beginTransmission (0x38); Wire.write (1); Wire.write (siffror [dig4]); Wire.write (siffror [dig3]); Wire.write (siffror [dig2]); Wire.write (siffror [dig1]); Wire.endTransmission (); fördröjning (10); fördröjning (1000); }

Och för de icke-troende … en videodemonstration.

Så där har du det. Fyra siffror istället för en, och över I2C -bussen som bevarar Arduino digitala I/O -stift. Med åtta MCP23017s kunde du läsa 32 siffror samtidigt. Ha kul med att göra det!

Du kan beställa både BCD- och decimalomkopplare i olika storlekar från PMD Way, med gratis leverans över hela världen.

Det här inlägget kommer till dig av pmdway.com - allt för tillverkare och elektronikentusiaster, med gratis leverans över hela världen.

Rekommenderad: