Inhoudsopgave:

Arduino- en duimwielschakelaars: 9 stappen
Arduino- en duimwielschakelaars: 9 stappen

Video: Arduino- en duimwielschakelaars: 9 stappen

Video: Arduino- en duimwielschakelaars: 9 stappen
Video: Duimwielschakelaar testen | Hexadecimaal naar BCD duimwiel schakelfunctie 2024, November
Anonim
Arduino- en duimwielschakelaars
Arduino- en duimwielschakelaars

In dit artikel onderzoeken we het gebruik van push-wheel/thumbwheel-schakelaars met onze Arduino-systemen. Hier zijn enkele voorbeelden afkomstig van PMD Way.

Stap 1:

Afbeelding
Afbeelding

Voor niet-ingewijden is elke schakelaar één verticaal segment en kunnen ze met elkaar worden verbonden om verschillende maten te vormen. U kunt de knoppen gebruiken om te kiezen tussen de cijfers nul tot en met negen. Er zijn alternatieven beschikbaar die een wiel hebben dat u met uw duim kunt bewegen in plaats van de toename/afname-knoppen.

Vóór de dagen van fraaie gebruikersinterfaces waren deze schakelaars behoorlijk populaire methoden voor het instellen van numerieke gegevensinvoer. Ze zijn echter nog steeds beschikbaar, dus laten we eens kijken hoe ze werken en hoe we ze kunnen gebruiken. De waarde van de schakelaar wordt beschikbaar gesteld via binair gecodeerd decimaal of recht decimaal. Beschouw de achterkant van de schakelaar in BCD-vorm.

Stap 2:

Afbeelding
Afbeelding

We hebben common aan de linkerkant, dan contacten voor 1, 2, 4 en 8. Als je een kleine spanning (zeg 5V) toepast op common, kan de waarde van de schakelaar worden gemeten door de waarden van de contacten die in de HOGE staat. Als u bijvoorbeeld 3 selecteert, hebben contacten 1 en 2 dezelfde spanning. De waarden tussen nul en negen kunnen als zodanig in de tabel worden weergegeven.

Stap 3:

Afbeelding
Afbeelding

Inmiddels zou je je moeten realiseren dat het gemakkelijk zou zijn om de waarde van een schakelaar te lezen - en je hebt gelijk, dat is het ook. We kunnen 5V aansluiten op de common, de uitgangen op de digitale ingangspinnen van onze Arduino-kaarten, en dan digitalRead() gebruiken om de waarde van elke uitgang te bepalen. In de schets gebruiken we wat elementaire wiskunde om de BCD-waarde om te zetten in een decimaal getal. Dus laten we dat nu doen.

Vanuit hardwareperspectief moeten we nog met één ding rekening houden: de drukwielschakelaar gedraagt zich elektrisch als vier normaal open drukknoppen. Dit betekent dat we pull-down weerstanden moeten gebruiken om een duidelijk verschil te krijgen tussen hoge en lage toestanden. Dus het schema voor één schakelaar is zoals hierboven weergegeven.

Stap 4:

Nu is het eenvoudig om de uitgangen gelabeld 1, 2, 4 en 8 aan te sluiten op (bijvoorbeeld) digitale pinnen 8, 9, 10 en 11. Sluit 5V aan op het 'C'-punt van de schakelaar, en GND op … GND. Vervolgens hebben we een schets nodig die de invoer kan lezen en de BCD-uitvoer naar decimaal kan converteren. Beschouw de volgende schets:

/* Gebruikt SAA1064 numeriek scherm schild https://www.gravitech.us/7segmentshield.html Gebruikt seriële monitor als u het SAA1064 schild niet hebt */ #include "Wire.h" #define q1 8 #define q2 9 # definieer q4 10 #define q8 11 void setup() { Serial.begin(9600); Draad.begin(); // join i2c bus (adres optioneel voor master) delay (500); pinMode(q1, INGANG); // duimwiel '1' pinMode (q2, INPUT); // duimwiel '2' pinMode (q4, INPUT); // duimwiel '4' pinMode (q8, INPUT); // thumbwheel '8' } void dispSAA1064 (int Count) // stuurt integer 'Count' naar Gravitech SAA1064 shield { const int lookup [10] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F }; int Duizenden, Honderden, Tientallen, Basis; Wire.beginTransmission (0x38); Draad.schrijven(0); Wire.write (B01000111); Wire.endTransmission(); Wire.beginTransmission (0x38); Draad.schrijven(1); Duizenden = Telling/1000; Honderden = (Tellen-(Duizenden*1000))/100; Tientallen = (Tellen-((Duizenden*1000)+(Honderden*100)))/10; Basis = Telling-((Duizenden*1000)+(Honderden*100)+(Tientallen*10)); Wire.write (opzoeken [basis]); Wire.write (opzoeken [Tientallen]); Wire.write (opzoeken [Honderden]); Wire.write (opzoeken [Duizenden]); Wire.endTransmission(); vertraging(10); } int readSwitch() { int totaal=0; if (digitalRead(q1)==HIGH) {totaal+=1; } if (digitalRead(q2)==HOOG) {totaal+=2; } if (digitalRead(q4)==HIGH) {totaal+=4; } if (digitalRead(q8)==HIGH) {totaal+=8; } retourtotaal; } void loop() { dispSAA1064(readSwitch()); // verzendt schakelwaarde om schild Serial.println (readSwitch ()) weer te geven; // stuurt schakelwaarde naar seriële monitorbox}

De functie readSwitch() is de sleutel. Het berekent de waarde van de schakelaar door de numerieke weergave van elke schakelaaruitgang toe te voegen en geeft het totaal als resultaat. Voor dit voorbeeld hebben we een numeriek scherm gebruikt dat wordt bestuurd door de NXP SAA1064.

Stap 5:

Image
Image

De functie readSwitch() is de sleutel. Het berekent de waarde van de schakelaar door de numerieke weergave van elke schakelaaruitgang toe te voegen en geeft het totaal als resultaat. Voor dit voorbeeld hebben we een numeriek scherm gebruikt dat wordt bestuurd door de NXP SAA1064.

Als je er geen hebt, is dat oké - de resultaten worden ook naar de seriële monitor gestuurd. Laten we het nu in actie zien in de video.

Stap 6:

Oké, het lijkt niet veel, maar als je numerieke invoer nodig hebt, bespaart het veel fysieke ruimte en biedt het een nauwkeurige invoermethode.

Dus daar heb je het. Zou je deze daadwerkelijk in een project gebruiken? Voor één cijfer - ja. Voor vier? Waarschijnlijk niet - misschien zou het gemakkelijker zijn om een 12-cijferig toetsenbord te gebruiken. Er is een idee…

Stap 7: Meerdere schakelaars

Afbeelding
Afbeelding

Nu zullen we onderzoeken hoe we vier cijfers kunnen lezen - en daarbij niet al die digitale pinnen verspillen. In plaats daarvan gebruiken we de Microchip MCP23017 16-bits poortuitbreidings-IC die communiceert via de I2C-bus. Het heeft zestien digitale input/output-pinnen die we kunnen gebruiken om de status van elke schakelaar te lezen.

Voordat u verder gaat, moet u er rekening mee houden dat enige veronderstelde kennis vereist is voor dit artikel - de I2C-bus (deel één en twee) en de MCP23017. We zullen eerst de hardware-aansluitingen beschrijven en daarna de Arduino-schets. Denk aan het schema dat is gebruikt voor het voorbeeld van een enkele schakelaar.

Toen de schakelaar rechtstreeks op de Arduino was aangesloten, lezen we de status van elke pin om de waarde van de schakelaar te bepalen. We zullen dit opnieuw doen, op grotere schaal met behulp van de MCP23017. Overweeg het pinout-diagram:

Stap 8:

We hebben 16 pinnen, waarop vier schakelaars kunnen worden aangesloten. De commons voor elke schakelaar zijn nog steeds verbonden met 5V en elk schakelcontact heeft nog steeds een pull-down-weerstand van 10k naar GND. Vervolgens verbinden we de 1, 2, 4, 8 pinnen van cijfer één met GPBA0~3; cijfer twee's 1, 2, 4, 8 tot GPA4~7; cijfer drie 1, 2, 4, 8 tot GPB0~3 en cijfer vier, 1, 2, 4, 8 tot GPB4~7.

Hoe lezen we nu de schakelaars? Al die draden doen je misschien denken dat het moeilijk is, maar de schets is vrij eenvoudig. Wanneer we de waarde van GPBA en B lezen, wordt voor elke bank één byte geretourneerd, met het meest significante bit eerst. Elke vier bits komt overeen met de instelling van de schakelaar die is aangesloten op de overeenkomende I/O-pinnen. Als we bijvoorbeeld de gegevens voor beide IO-banken opvragen en de schakelaars zijn ingesteld op 1 2 3 4, geeft bank A 0010 0001 terug en bank B geeft 0100 0011 terug.

We gebruiken enkele bitshift-bewerkingen om elke vier bits in een afzonderlijke variabele te scheiden - waardoor we de waarde van elk cijfer behouden. Om bijvoorbeeld de waarde van schakelaar vier te scheiden, verschuiven we de bits van bank B >> 4. Dit duwt de waarde van schakelaar drie naar buiten en de lege bits aan de linkerkant worden nul.

Om de waarde voor schakelaar drie te scheiden, gebruiken we een samengestelde bitsgewijze & – die de waarde van schakelaar drie laat. De afbeelding toont een uitsplitsing van de binaire schakelwaarden - het toont de onbewerkte GPIOA- en B-bytewaarden, vervolgens de binaire waarde van elk cijfer en de decimale waarde.

Stap 9:

Laten we dus de demonstratieschets bekijken:

/* Voorbeeld 40a - Lees vier pushwheel BCD-schakelaars via MCP23017, weergave op SAA1064/4-cijferige 7-segments LED-display */ // MCP23017 pinnen 15~17 naar GND, I2C-busadres is 0x20 // SAA1064 I2C-busadres 0x38 # omvatten "Wire.h" // voor LED-cijferdefinities int digits [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); Draad.schrijven(0); Wire.write (B01000111); // 12mA-uitgang, geen onderdrukking van cijfers Wire.endTransmission(); } void setup() { Serial.begin(9600); Draad.begin(); // start I2C-bus initSAA1064 (); } void loop () {// lees de ingangen van bank A Wire.beginTransmission (0x20); Draad.schrijven (0x12); Wire.endTransmission(); Wire.requestFrom(0x20, 1); GPIOA=Draad.lezen(); // deze byte bevat de schakelgegevens voor de cijfers 1 en 2 // lees de ingangen van bank B Wire.beginTransmission (0x20); Draad.schrijven (0x13); Wire.endTransmission(); Wire.requestFrom(0x20, 1); GPIOB=Draad.lezen(); // deze byte bevat de schakelgegevens voor cijfers 3 en 4 // extraheer de waarde voor elke schakelaar // dig1 LHS, dig4 RHS dig4=GPIOB >> 4; dig3=GPIOB & B00001111; dig2=GPIOA >> 4; dig1=GPIOA & B00001111; // stuur alle GPIO- en individuele switchgegevens naar de seriële monitor // voor debuggen en omwille van de interesse Serial.print ("GPIOA = "); Serial.println (GPIOA, BIN); Serial.print("GPIOB = "); Serial.println (GPIOB, BIN); Serieel.println(); Serial.print("cijfer 1 = "); Serial.println(dig1, BIN); Serial.print("cijfer 2 = "); Serial.println(dig2, BIN); Serial.print("cijfer 3 = "); Serial.println(dig3, BIN); Serial.print("cijfer 4 = "); Serial.println(dig4, BIN); Serieel.println(); Serial.print("cijfer 1 = "); Serial.println(dig1, DEC); Serial.print("cijfer 2 = "); Serial.println(dig2, DEC); Serial.print("cijfer 3 = "); Serial.println(dig3, DEC); Serial.print("cijfer 4 = "); Serial.println(dig4, DEC); Serieel.println(); // stuur schakelwaarde naar LED-display via SAA1064 Wire.beginTransmission (0x38); Draad.schrijven(1); Wire.write (cijfers [dig4]); Wire.write(cijfers[dig3]); Wire.write(cijfers[dig2]); Wire.write(cijfers[dig1]); Wire.endTransmission(); vertraging(10); vertraging (1000); }

En voor de niet-gelovigen … een videodemonstratie.

Dus daar heb je het. Vier cijfers in plaats van één, en over de I2C-bus met behoud van Arduino digitale I/O-pinnen. Met acht MCP23017's kon je 32 cijfers tegelijk lezen. Veel plezier ermee!

U kunt bij PMD Way zowel BCD- als decimale schakelaars in verschillende maten bestellen, met gratis levering wereldwijd.

Dit bericht aangeboden door pmdway.com - alles voor makers en elektronica-enthousiastelingen, met gratis levering wereldwijd.

Aanbevolen: