Talaan ng mga Nilalaman:

Mga switch ng Arduino at Thumbwheel: 9 Mga Hakbang
Mga switch ng Arduino at Thumbwheel: 9 Mga Hakbang

Video: Mga switch ng Arduino at Thumbwheel: 9 Mga Hakbang

Video: Mga switch ng Arduino at Thumbwheel: 9 Mga Hakbang
Video: {638} Hexadecimal to BCD Thumbwheel Switch Function & Testing 2024, Nobyembre
Anonim
Mga switch ng Arduino at Thumbwheel
Mga switch ng Arduino at Thumbwheel

Sa artikulong ito sinusuri namin ang paggamit ng mga switch ng push-wheel / thumbwheel sa aming mga system ng Arduino. Narito ang ilang mga halimbawa na nagmula sa PMD Way.

Hakbang 1:

Larawan
Larawan

Para sa hindi nakakaalam, ang bawat switch ay isang patayong segment at maaari silang maiugnay nang magkasama upang bumuo ng iba't ibang laki. Maaari mong gamitin ang mga pindutan upang pumili mula sa mga digit na zero hanggang siyam. Mayroong mga kahalili na magagamit na mayroong isang gulong maaari mong ilipat sa iyong hinlalaki sa halip na ang mga pindutan ng pagtaas / pagbaba.

Bago ang mga araw ng magarbong mga interface ng gumagamit ang mga switch na ito ay medyo popular na pamamaraan para sa pagtatakda ng bilang ng data entry. Gayunpaman magagamit pa rin sila ngayon, kaya't tingnan natin kung paano ito gumagana at kung paano natin magagamit ang mga ito. Ang halaga ng switch ay ginawang magagamit sa pamamagitan ng binary-code na decimal o tuwid na decimal. Isaalang-alang ang likuran ng switch sa form na BCD.

Hakbang 2:

Larawan
Larawan

Mayroon kaming karaniwan sa kaliwa, pagkatapos ay ang mga contact para sa 1, 2, 4 at 8. Kung mag-apply ka ng isang maliit na boltahe (sabihin na 5V) sa karaniwan, ang halaga ng switch ay maaaring masukat sa pamamagitan ng pagdaragdag ng mga halaga ng mga contact na nasa TAAS na estado. Halimbawa, kung pipiliin mo ang 3 - ang mga contact na 1 at 2 ay nasa boltahe na katulad. Ang mga halaga sa pagitan ng zero at siyam ay maaaring kinatawan tulad ng sa talahanayan.

Hakbang 3:

Larawan
Larawan

Sa ngayon dapat mong mapagtanto na madali na basahin ang halaga ng isang switch - at tama ka, totoo. Maaari naming ikonekta ang 5V sa karaniwan, ang mga output sa digital input pin ng aming Arduino boards, pagkatapos ay gamitin ang digitalRead () upang matukoy ang halaga ng bawat output. Sa sketch ay gumagamit kami ng ilang pangunahing matematika upang i-convert ang halaga ng BCD sa isang decimal number. Kaya't gawin natin ito ngayon.

Mula sa isang pananaw sa hardware, kailangan nating isaalang-alang ang isa pang bagay - ang switch ng push-wheel ay kumikilos electrically tulad ng apat na normal na bukas na mga pindutan ng push. Nangangahulugan ito na kailangan naming gumamit ng mga pull-down resistor upang magkaroon ng isang malinaw na pagkakaiba sa pagitan ng mataas at mababang estado. Kaya ang eskematiko para sa isang switch ay tulad ng ipinakita sa itaas.

Hakbang 4:

Ngayon ito ay isang simpleng bagay upang ikonekta ang mga output na may label na 1, 2, 4, at 8 sa (halimbawa) mga digital na pin na 8, 9, 10 at 11. Ikonekta ang 5V sa switch na 'C' point, at GND sa… GND. Susunod, kailangan nating magkaroon ng isang sketch na maaaring basahin ang mga input at i-convert ang output ng BCD sa decimal. Isaalang-alang ang sumusunod na sketch:

/ * Gumagamit ng SAA1064 na numerong display shield https://www.gravitech.us/7segmentshield.html Gumagamit ng serial monitor kung wala kang SAA1064 na kalasag * / # isama ang "Wire.h" #define q1 8 # tukuyin ang q2 9 # tukuyin ang q4 10 #define q8 11 void setup () {Serial.begin (9600); Wire.begin (); // sumali sa i2c bus (opsyonal sa address para sa master) pagkaantala (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) // nagpapadala ng integer na 'Count' sa Gravitech SAA1064 kalasag {const int lookup [10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; Int Libu-libo, Daan-daang, Sampu, Base; Wire.beginTransmission (0x38); Wire.write (0); Wire.write (B01000111); Wire.endTransmission (); Wire.beginTransmission (0x38); Wire.write (1); Libu-libo = Bilang / 1000; Daan-daang = (Bilang- (Libu-libo * 1000)) / 100; Sampu = (Bilang - ((Libu-libo * 1000) + (Daan-daang * 100))) / 10; Base = Bilang - ((Libu-libo * 1000) + (Daan-daang * 100) + (Sampu * 10)); Wire.write (lookup [Base]); Wire.write (lookup [Sampu]; Wire.write (lookup [Daan-daang]); Wire.write (lookup [Libu-libo]); Wire.endTransmission (); antala (10); } int readSwitch () {int total = 0; kung (digitalRead (q1) == TAAS) {total + = 1; } kung (digitalRead (q2) == TAAS) {total + = 2; } kung (digitalRead (q4) == TAAS) {total + = 4; } kung (digitalRead (q8) == TAAS) {total + = 8; } kabuuang pagbalik; } void loop () {dispSAA1064 (readSwitch ()); // nagpapadala ng halaga ng paglipat upang ipakita ang kalasag Serial.println (readSwitch ()); // nagpapadala ng halaga ng switch sa serial monitor box}

Ang pagpapaandar na readSwitch () ay ang susi. Kinakalkula nito ang halaga ng switch sa pamamagitan ng pagdaragdag ng bilang na representasyon ng bawat output ng switch at ibabalik ang kabuuan bilang resulta nito. Para sa halimbawang ito, gumamit kami ng isang numerong display na kalasag na kinokontrol ng NXP SAA1064.

Hakbang 5:

Image
Image

Ang pagpapaandar na readSwitch () ay ang susi. Kinakalkula nito ang halaga ng switch sa pamamagitan ng pagdaragdag ng bilang na representasyon ng bawat output ng switch at ibabalik ang kabuuan bilang resulta nito. Para sa halimbawang ito, gumamit kami ng isang numerong display na kalasag na kinokontrol ng NXP SAA1064.

Kung wala ka, ok lang iyon - ipinapadala din ang mga resulta sa serial monitor. Ngayon, tingnan natin ito sa pagkilos sa video.

Hakbang 6:

Ok hindi ito maganda, ngunit kung kailangan mo ng numerong pagpasok ay nakakatipid ito ng maraming pisikal na puwang at nag-aalok ng isang tumpak na paraan ng pagpasok.

Kaya ayan mayroon ka nito. Gagamitin mo ba talaga ang mga ito sa isang proyekto? Para sa isang digit - oo. Para sa apat? Marahil ay hindi - marahil ay mas madali itong gumamit ng isang 12-digit na keypad. Mayroong isang ideya …

Hakbang 7: Maramihang Mga switch

Larawan
Larawan

Ngayon ay susuriin namin kung paano basahin ang apat na digit - at hindi sayangin ang lahat ng mga digital na pin sa proseso. Sa halip, gagamitin namin ang Microchip MCP23017 16-bit port expander IC na nakikipag-usap sa pamamagitan ng I2C bus. Mayroon itong labing-anim na digital input / output pin na maaari naming magamit upang mabasa ang katayuan ng bawat switch.

Bago sumulong, mangyaring tandaan na ang ilang ipinapalagay na kaalaman ay kinakailangan para sa artikulong ito - ang I2C bus (mga bahagi isa at dalawa) at ang MCP23017. Una naming ilalarawan ang mga koneksyon sa hardware, at pagkatapos ay ang Arduino sketch. Alalahanin ang iskematikong ginamit para sa iisang halimbawa ng paglipat.

Kapag ang switch ay direktang konektado sa Arduino, binasa namin ang katayuan ng bawat pin upang matukoy ang halaga ng switch. Gagawin namin itong muli, sa isang mas malaking sukat gamit ang MCP23017. Isaalang-alang ang diagram ng pinout:

Hakbang 8:

Mayroon kaming 16 na mga pin, na nagpapahintulot sa apat na mga switch na maiugnay. Ang mga commons para sa bawat switch ay kumonekta pa rin sa 5V, at ang bawat contact sa switch ay mayroon pa ring 10k pull-down na risistor sa GND. Pagkatapos ay ikonekta namin ang 1, 2, 4, 8 na mga pin ng digit na isa sa GPBA0 ~ 3; digit two ng 1, 2, 4, 8 sa GPA4 ~ 7; digit three ng 1, 2, 4, 8 hanggang GPB0 ~ 3 at digit na apat na 1, 2, 4, 8 hanggang GPB4 ~ 7.

Ngayon paano natin babasahin ang mga switch? Ang lahat ng mga wires na iyon ay maaaring mag-isip sa iyo na mahirap ito, ngunit ang sketch ay medyo simple. Kapag nabasa namin ang halaga ng GPBA at B, isang byte ang naibalik para sa bawat bangko, na may pinakamahalagang bit muna. Ang bawat apat na piraso ay tutugma sa setting ng switch na konektado sa pagtutugma ng mga pin na I / O. Halimbawa, kung hihilingin namin ang data para sa parehong mga bangko ng IO at ang mga switch ay nakatakda sa 1 2 3 4 - ang bank A ay babalik 0010 0001 at ang bank B ay babalik sa 0100 0011.

Gumagamit kami ng ilang mga pagpapatakbo ng bitshift upang paghiwalayin ang bawat apat na piraso sa isang hiwalay na variable - na nag-iiwan sa amin ng halaga ng bawat digit. Halimbawa, upang paghiwalayin ang halaga ng paglipat ng apat, inililipat namin ang mga piraso mula sa bangko B >> 4. Itinutulak nito ang halaga ng paglipat ng tatlong palabas, at ang mga blangko na bit sa kaliwa ay naging zero.

Upang paghiwalayin ang halaga para sa paglipat ng tatlo, gumagamit kami ng isang tambalang paunti at - na nag-iiwan ng halaga ng paglipat ng tatlo. Ipinapakita ng imahe ang isang pagkasira ng mga halaga ng binary switch - ipinapakita nito ang hilaw na halaga ng GPIOA at B byte, pagkatapos ay ang halagang binary ng bawat digit, at ang decimal na halaga.

Hakbang 9:

Tingnan natin ang sketch ng demonstrasyon:

/ * Halimbawa 40a - Basahin ang apat na switch ng pushwheel BCD sa pamamagitan ng MCP23017, ipakita sa SAA1064 / 4-digit na 7-segment LED display * / // MCP23017 pin 15 ~ 17 hanggang GND, ang address ng bus ng I2C ay 0x20 // SAA1064 I2C bus address 0x38 # isama ang "Wire.h" // para sa mga LED digit na kahulugan ng int digit [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 output, walang digit na blanking Wire.endTransmission (); } void setup () {Serial.begin (9600); Wire.begin (); // start up I2C bus initSAA1064 (); } void loop () {// basahin ang mga input ng bank A Wire.beginTransmission (0x20); Wire.write (0x12); Wire.endTransmission (); Wire.requestFrom (0x20, 1); GPIOA = Wire.read (); // ang byte na ito ay naglalaman ng data ng paglipat para sa mga digit na 1 at 2 // basahin ang mga input ng bank B Wire.beginTransmission (0x20); Wire.write (0x13); Wire.endTransmission (); Wire.requestFrom (0x20, 1); GPIOB = Wire.read (); // ang byte na ito ay naglalaman ng data ng paglipat para sa mga digit na 3 at 4 // halaga ng pagkuha para sa bawat switch // dig1 LHS, dig4 RHS dig4 = GPIOB >> 4; dig3 = GPIOB & B00001111; dig2 = GPIOA >> 4; dig1 = GPIOA & B00001111; // send all GPIO and individual switch data to serial monitor // for debug and interest's sake Serial.print ("GPIOA ="); Serial.println (GPIOA, BIN); Serial.print ("GPIOB ="); Serial.println (GPIOB, BIN); Serial.println (); Serial.print ("digit 1 ="); Serial.println (dig1, BIN); Serial.print ("digit 2 ="); Serial.println (dig2, BIN); Serial.print ("digit 3 ="); Serial.println (dig3, BIN); Serial.print ("digit 4 ="); Serial.println (dig4, BIN); Serial.println (); Serial.print ("digit 1 ="); Serial.println (dig1, DEC); Serial.print ("digit 2 ="); Serial.println (dig2, DEC); Serial.print ("digit 3 ="); Serial.println (dig3, DEC); Serial.print ("digit 4 ="); Serial.println (dig4, DEC); Serial.println (); // magpadala ng halaga ng switch sa LED display sa pamamagitan ng SAA1064 Wire.beginTransmission (0x38); Wire.write (1); Wire.write (mga digit [dig4]); Wire.write (mga digit [dig3]); Wire.write (mga digit [dig2]); Wire.write (mga digit [dig1]); Wire.endTransmission (); antala (10); pagkaantala (1000); }

At para sa mga hindi naniniwala … isang pagpapakita ng video.

Kaya ayan mayroon ka nito. Apat na mga digit sa halip na isa, at higit sa I2C bus na pinapanatili ang Arduino digital I / O na mga pin. Gamit ang walong MCP23017s maaari mong mabasa ang 32 na beses nang sabay-sabay. Magsaya sa paggawa nito!

Maaari kang mag-order ng parehong mga switch ng BCD at decimal sa iba't ibang laki mula sa PMD Way, na may libreng paghahatid sa buong mundo.

Ang post na ito ay dinala sa iyo ng pmdway.com - lahat para sa mga tagagawa ng tagahanga at electronics, na may libreng paghahatid sa buong mundo.

Inirerekumendang: