INHOUDSOPGAWE:

Arduino en duimwiel skakelaars: 9 stappe
Arduino en duimwiel skakelaars: 9 stappe

Video: Arduino en duimwiel skakelaars: 9 stappe

Video: Arduino en duimwiel skakelaars: 9 stappe
Video: 🇳🇱 ARDUINO STOPWATCH - Arduino project 2024, Julie
Anonim
Arduino en duimwiel skakelaars
Arduino en duimwiel skakelaars

In hierdie artikel ondersoek ons die gebruik van drukknop-/duimwielskakelaars met ons Arduino-stelsels. Hier is 'n paar voorbeelde van PMD Way.

Stap 1:

Beeld
Beeld

Vir die oningewydes is elke skakelaar 'n vertikale segment en hulle kan aan mekaar gekoppel word om verskillende groottes te vorm. U kan die knoppies gebruik om van syfers nul tot nege te kies. Daar is alternatiewe beskikbaar met 'n wiel wat u met u duim kan beweeg in plaas van die knoppies verhoog/verlaag.

Voor die dae van deftige gebruikerskoppelvlakke was hierdie skakelaars baie gewilde metodes om numeriese data in te voer. Maar hulle is nog steeds beskikbaar, dus kom ons kyk hoe dit werk en hoe ons dit kan gebruik. Die waarde van die skakelaar word beskikbaar gemaak deur binêre-gekodeerde desimale of reguit desimale. Beskou die agterkant van die skakelaar in BCD -vorm.

Stap 2:

Beeld
Beeld

Ons het 'n gemeenskaplike aan die linkerkant, dan die kontakte vir 1, 2, 4 en 8. As u 'n klein spanning (sê 5V) op die gemeenskaplike toedien, kan die waarde van die skakelaar gemeet word deur die waardes van die kontakte in die HOË toestand. Byvoorbeeld, as u 3 kies, sal die kontakte 1 en 2 op die gemene spanning wees. Die waardes tussen nul en nege kan as sodanig in die tabel voorgestel word.

Stap 3:

Beeld
Beeld

Teen hierdie tyd moet u besef dat dit maklik sou wees om die waarde van 'n skakelaar te lees - en u het reg. Ons kan 5V koppel aan die gewone, die uitsette na die digitale invoerpenne van ons Arduino -borde, en gebruik dan digitalRead () om die waarde van elke uitset te bepaal. In die skets gebruik ons 'n paar basiese wiskunde om die BCD -waarde na 'n desimale getal om te skakel. So laat ons dit nou doen.

Vanuit 'n hardeware-oogpunt moet ons nog een ding in ag neem-die drukknopskakelaar gedra hom elektries soos vier normaalweg oop drukknoppies. Dit beteken dat ons aftrekweerstands moet gebruik om 'n duidelike verskil tussen hoë en lae toestande te hê. Die skema vir een skakelaar is dus soos hierbo getoon.

Stap 4:

Dit is nou eenvoudig om die uitsette met die etikette 1, 2, 4 en 8 aan te sluit op (byvoorbeeld) digitale penne 8, 9, 10 en 11. Koppel 5V aan die skakelaar 'C' -punt en GND aan … GND. Vervolgens moet ons 'n skets hê wat die insette kan lees en die BCD -uitset na desimale kan omskakel. Oorweeg die volgende skets:

/ * Gebruik SAA1064 numeriese skermskerm https://www.gravitech.us/7segmentshield.html Gebruik seriële monitor as u nie die SAA1064 -skerm het nie */ #sluit "Wire.h" in #define q1 8 #define q2 9 # definieer q4 10 #define q8 11 leemte -opstelling () {Serial.begin (9600); Wire.begin (); // sluit i2c -bus aan (adres opsioneel vir meester) vertraging (500); pinMode (q1, INVOER); // duimwiel '1' pinMode (q2, INPUT); // duimwiel '2' pinMode (q4, INPUT); // duimwiel '4' pinMode (q8, INPUT); // thumbwheel '8'} void dispSAA1064 (int Count) // stuur heelgetal 'Count' na Gravitech SAA1064 -skild {const int lookup [10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; int Duisende, honderde, tiene, basis; Wire.begin Transmissie (0x38); Wire.write (0); Wire.write (B01000111); Wire.endTransmission (); Wire.begin Transmissie (0x38); Draad.skryf (1); Duisende = Tel/1000; Honderde = (Count- (Thousands*1000))/100; Tiene = (Tel-((Duisende*1000)+(Honderde*100))))/10; Basis = telling-((duisende*1000)+(honderde*100)+(tiene*10)); Wire.write (opsoek [basis]); Wire.write (opsoek [tiene]); Wire.write (opsoek [honderde]); Wire.write (opsoek [Duisende]); Wire.endTransmission (); vertraging (10); } int readSwitch () {int totaal = 0; as (digitalRead (q1) == HOOG) {totaal+= 1; } if (digitalRead (q2) == HOOG) {totaal+= 2; } if (digitalRead (q4) == HOOG) {totaal+= 4; } if (digitalRead (q8) == HOOG) {totaal+= 8; } totale opbrengs; } leemte -lus () {dispSAA1064 (readSwitch ()); // stuur skakelaarwaarde na skerm Serial.println (readSwitch ()); // stuur skakelaarwaarde na seriële monitor boks}

Die funksie readSwitch () is die sleutel. Dit bereken die waarde van die skakelaar deur die numeriese voorstelling van elke skakelaaruitset by te voeg en gee die totaal as resultaat. Vir hierdie voorbeeld het ons 'n numeriese skermskerm gebruik wat deur die NXP SAA1064 beheer word.

Stap 5:

Image
Image

Die funksie readSwitch () is die sleutel. Dit bereken die waarde van die skakelaar deur die numeriese voorstelling van elke skakelaaruitset by te voeg en gee die totaal as resultaat. Vir hierdie voorbeeld het ons 'n numeriese skermskerm gebruik wat deur die NXP SAA1064 beheer word.

As u nie een het nie, is dit goed - die resultate word ook na die seriële monitor gestuur. Laat ons dit nou in aksie in die video sien.

Stap 6:

Ok, dit lyk nie veel nie, maar as u numeriese inskrywing benodig, bespaar dit baie fisiese ruimte en bied dit 'n presiese manier om in te skryf.

So daar het jy dit. Sou u dit werklik in 'n projek gebruik? Vir een syfer - ja. Vir vier? Waarskynlik nie-miskien is dit makliker om 'n 12-syfer-toetsbord te gebruik. Daar is 'n idee …

Stap 7: Meervoudige skakelaars

Beeld
Beeld

Nou sal ons ondersoek hoe om vier syfers te lees - en nie al die digitale penne in die proses mors nie. In plaas daarvan sal ons die Microchip MCP23017 16-bis poortuitbreider IC gebruik wat via die I2C-bus kommunikeer. Dit het sestien digitale in-/uitsetpenne wat ons kan gebruik om die status van elke skakelaar te lees.

Voordat u verder gaan, moet u kennis neem van hierdie artikel - die I2C -bus (dele een en twee) en die MCP23017. Ons sal eers die hardewareverbindings beskryf, en dan die Arduino -skets. Onthou die skematiese gebruik vir die enkele skakelaar -voorbeeld.

Toe die skakelaar direk aan die Arduino gekoppel is, lees ons die status van elke pen om die waarde van die skakelaar te bepaal. Ons sal dit weer op 'n groter skaal doen met behulp van die MCP23017. Oorweeg die pinout -diagram:

Stap 8:

Ons het 16 penne, waarmee vier skakelaars gekoppel kan word. Die commons vir elke skakelaar maak steeds verbinding met 5V, en elke skakelaarkontak het nog steeds 'n 10k aftrekweerstand teen GND. Dan verbind ons die 1, 2, 4, 8 penne van syfer een met GPBA0 ~ 3; syfer twee se 1, 2, 4, 8 tot GPA4 ~ 7; syfer drie se 1, 2, 4, 8 tot GPB0 ~ 3 en syfer vier se 1, 2, 4, 8 tot GPB4 ~ 7.

Hoe lees ons nou die skakelaars? Al die drade laat u dink dat dit moeilik is, maar die skets is redelik eenvoudig. As ons die waarde van GPBA en B lees, word een byte vir elke bank teruggegee, met die belangrikste bit eers. Elke vier bisse pas by die instelling van die skakelaar wat gekoppel is aan die ooreenstemmende I/O -penne. Byvoorbeeld, as ons die data vir beide IO -banke aanvra en die skakelaars op 1 2 3 4 gestel is - bank A sal 0010 0001 terugkeer en bank B sal 0000 0011 terugstuur.

Ons gebruik 'n paar bitshift -bewerkings om elke vier bisse in 'n aparte veranderlike te skei - wat ons die waarde van elke syfer laat. Byvoorbeeld, om die waarde van skakelaar vier te skei, skuif ons die bisse van bank B >> 4. Dit druk die waarde van skakelaar drie uit en die leë stukkies aan die linkerkant word nul.

Om die waarde vir skakelaar drie te skei, gebruik ons 'n verbinding bitwise & - wat die waarde van skakelaar drie verlaat. Die beeld toon 'n uiteensetting van die binêre skakelwaardes - dit toon die rou GPIOA- en B -greepwaardes, dan die binêre waarde van elke syfer en desimale waarde.

Stap 9:

Laat ons dus die demonstrasie -skets sien:

/ * Voorbeeld 40a-Lees vier BCD-skakelaars met stootwiele via MCP23017, vertoon op SAA1064/4-syfer-7-segment LED-skerm */// MCP23017 penne 15 ~ 17 tot GND, I2C-busadres is 0x20 // SAA1064 I2C-busadres 0x38 # sluit "Wire.h" // in vir LED -syfer definisies int syfers [16] = {63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113 }; byte GPIOA, GPIOB, dig1, dig2, dig3, dig4; ongeldig initSAA1064 () {// setup 0x38 Wire.beginTransmission (0x38); Wire.write (0); Wire.write (B01000111); // 12mA uitset, geen syfer blanking Wire.endTransmission (); } ongeldige opstelling () {Serial.begin (9600); Wire.begin (); // begin I2C -bus initSAA1064 (); } void lus () {// lees die insette van bank A Wire.beginTransmission (0x20); Draad.skryf (0x12); Wire.endTransmission (); Wire.requestFrom (0x20, 1); GPIOA = Wire.read (); // hierdie greep bevat die skakeldata vir syfers 1 en 2 // lees die insette van bank B Wire.beginTransmission (0x20); Wire.write (0x13); Wire.endTransmission (); Wire.requestFrom (0x20, 1); GPIOB = Wire.read (); // hierdie greep bevat die skakeldata vir syfers 3 en 4 // uittrekselwaarde vir elke skakelaar // dig1 LHS, dig4 RHS dig4 = GPIOB >> 4; dig3 = GPIOB & B00001111; dig2 = GPIOA >> 4; dig1 = GPIOA & B00001111; // stuur alle GPIO- en individuele skakeldata na die seriële monitor // ter wille van ontfouting en belangstelling Serial.print ("GPIOA ="); Serial.println (GPIOA, BIN); Serial.print ("GPIOB ="); Serial.println (GPIOB, BIN); Serial.println (); Serial.print ("syfer 1 ="); Serial.println (dig1, BIN); Serial.print ("syfer 2 ="); Serial.println (dig2, BIN); Serial.print ("syfer 3 ="); Serial.println (dig3, BIN); Serial.print ("syfer 4 ="); Serial.println (dig4, BIN); Serial.println (); Serial.print ("syfer 1 ="); Serial.println (dig1, DEC); Serial.print ("syfer 2 ="); Serial.println (dig2, DEC); Serial.print ("syfer 3 ="); Serial.println (dig3, DEC); Serial.print ("syfer 4 ="); Serial.println (dig4, DEC); Serial.println (); // stuur skakelaarwaarde na LED -skerm via SAA1064 Wire.beginTransmission (0x38); Draad.skryf (1); Wire.write (syfers [dig4]); Wire.write (syfers [dig3]); Wire.write (syfers [dig2]); Wire.write (syfers [dig1]); Wire.endTransmission (); vertraging (10); vertraging (1000); }

En vir die ongelowiges … 'n videodemonstrasie.

So daar het jy dit. Vier syfers in plaas van een, en oor die I2C -bus wat Arduino digitale I/O -penne bewaar. Deur agt MCP23017s te gebruik, kan u 32 syfers tegelyk lees. Geniet dit!

U kan beide BCD- en desimale skakelaars in verskillende groottes by PMD Way bestel, met gratis aflewering wêreldwyd.

Hierdie pos word deur pmdway.com aan u gebring - alles vir vervaardigers en elektronika -entoesiaste, met gratis aflewering wêreldwyd.

Aanbeveel: