Სარჩევი:

Arduino და Thumbwheel კონცენტრატორები: 9 ნაბიჯი
Arduino და Thumbwheel კონცენტრატორები: 9 ნაბიჯი

ვიდეო: Arduino და Thumbwheel კონცენტრატორები: 9 ნაბიჯი

ვიდეო: Arduino და Thumbwheel კონცენტრატორები: 9 ნაბიჯი
ვიდეო: One Arduino 10 Thumbwheels binary escape room - Code and Diagram In Link Below 2024, ივლისი
Anonim
Arduino და Thumbwheel კონცენტრატორები
Arduino და Thumbwheel კონცენტრატორები

ამ სტატიაში ჩვენ განვიხილავთ ბიძგიანი/ცერა თვლების გადამრთველების გამოყენებას ჩვენს არდუინოს სისტემებთან. აქ არის რამოდენიმე მაგალითი, რომელიც ამოღებულია PMD Way– დან.

Ნაბიჯი 1:

გამოსახულება
გამოსახულება

უცნობი ადამიანებისთვის, თითოეული გადამრთველი არის ერთი ვერტიკალური სეგმენტი და მათი ერთმანეთთან დაკავშირება შესაძლებელია სხვადასხვა ზომის შესაქმნელად. თქვენ შეგიძლიათ გამოიყენოთ ღილაკები ნულიდან ცხრაამდე ციფრების ასარჩევად. არსებობს ალტერნატივები, რომლებსაც აქვთ ბორბალი, რომლის გადაადგილება/შემცირების ღილაკების ნაცვლად შეგიძლიათ ცერა თითით გადაადგილება.

მშვენიერი მომხმარებლის ინტერფეისის დღეებამდე ეს გადამრთველები საკმაოდ პოპულარული მეთოდები იყო რიცხვითი მონაცემების შეყვანის დასადგენად. თუმცა ისინი დღესაც ხელმისაწვდომია, ასე რომ ვნახოთ როგორ მუშაობენ და როგორ შეგვიძლია გამოვიყენოთ ისინი. გადართვის მნიშვნელობა ხელმისაწვდომია ორობითი კოდირებული ათწილადის ან სწორი ათწილადის საშუალებით. განვიხილოთ გადართვის უკანა ნაწილი BCD ფორმით.

ნაბიჯი 2:

გამოსახულება
გამოსახულება

ჩვენ გვაქვს საერთო მარცხნივ, შემდეგ კონტაქტები 1, 2, 4 და 8. თუ თქვენ იყენებთ მცირე ძაბვას (ვთქვათ 5V) საერთოზე, გადამრთველის ღირებულება შეიძლება შეფასდეს კონტაქტების მნიშვნელობების დამატებით მაღალი მდგომარეობა. მაგალითად, თუ აირჩევთ 3 - კონტაქტები 1 და 2 იქნება საერთო ძაბვის დროს. ნულოვანი და ცხრა ღირებულებები შეიძლება წარმოდგენილი იყოს ცხრილში.

ნაბიჯი 3:

გამოსახულება
გამოსახულება

ახლა თქვენ უნდა გააცნობიეროთ, რომ ადვილი იქნება გადართვის მნიშვნელობის წაკითხვა - და მართალი ხართ, ასეა. ჩვენ შეგვიძლია დავუკავშიროთ 5V საერთო, გამოსავალი ჩვენი Arduino დაფების ციფრული შესასვლელთან, შემდეგ გამოვიყენოთ digitalRead () თითოეული გამომავალი ღირებულების დასადგენად. ესკიზში ჩვენ ვიყენებთ ძირითად მათემატიკას BCD მნიშვნელობის ათწილად რიცხვად გადასაყვანად. მოდით გავაკეთოთ ახლა.

ტექნიკის თვალსაზრისით, ჩვენ უნდა გავითვალისწინოთ კიდევ ერთი რამ-ბიძგიანი გადამრთველი ელექტრულად იქცევა, როგორც ოთხი ჩვეულებრივ გახსნილი ღილაკი. ეს ნიშნავს, რომ ჩვენ უნდა გამოვიყენოთ დასაშლელი რეზისტორები, რათა გვქონდეს მკაფიო განსხვავება მაღალ და დაბალ მდგომარეობებს შორის. ასე რომ, ერთი გადართვის სქემატური სქემა მოცემულია ზემოთ.

ნაბიჯი 4:

ახლა უკვე მარტივი საკითხია 1, 2, 4 და 8 ეტიკეტით გამოყვანილი მონაცემების დაკავშირება (მაგალითად) ციფრულ ქინძისთავებთან 8, 9, 10 და 11. შეაერთეთ 5V გადამრთველ ‘C’ წერტილთან, ხოლო GND… GND. შემდეგი, ჩვენ გვჭირდება ესკიზი, რომელსაც შეუძლია წაიკითხოს შეყვანის მონაცემები და გადააკეთოს BCD გამომავალი ათწილადში. განვიხილოთ შემდეგი ესკიზი:

/ * იყენებს SAA1064 ციფრული ჩვენების ფარს https://www.gravitech.us/7segmentshield.html იყენებს სერიულ მონიტორს, თუ არ გაქვთ SAA1064 ფარი */ #მოიცავს "Wire.h" #განსაზღვრეთ q1 8 #განსაზღვრეთ q2 9 # განსაზღვრეთ q4 10 #განსაზღვრეთ q8 11 void setup () {Serial.begin (9600); Wire.begin (); // შეუერთდეს i2c ავტობუსს (მისამართი არჩევითია სამაგისტროდ) დაგვიანებით (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) // აგზავნის მთელ რიცხვს 'Count' Gravitech SAA1064 ფარს {const int lookup [10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; int ათასობით, ასობით, ათეული, ბაზა; Wire.beginTransmission (0x38); Wire.write (0); Wire.write (B01000111); Wire.endTransmission (); Wire.beginTransmission (0x38); Wire.write (1); ათასი = დათვლა/1000; ასობით = (რაოდენობა- (ათასი*1000))/100; ათეული = (რაოდენობა-((ათასობით*1000)+(ასობით*100)))/10; ბაზა = რაოდენობა-((ათასობით*1000)+(ასობით*100)+(ათეული*10)); Wire.write (საძიებელი [ბაზა]); Wire.write (საძიებელი [ათეული]); Wire.write (საძიებელი [ასობით]); Wire.write (საძიებელი [ათასობით]); Wire.endTransmission (); დაგვიანება (10); } int readSwitch () {int სულ = 0; if (digitalRead (q1) == HIGH) {სულ+= 1; } if (digitalRead (q2) == HIGH) {სულ+= 2; } if (digitalRead (q4) == HIGH) {სულ+= 4; } if (digitalRead (q8) == HIGH) {სულ+= 8; } მთლიანი დაბრუნება; } void loop () {dispSAA1064 (readSwitch ()); // აგზავნის გადართვის მნიშვნელობას ეკრანზე shiard Serial.println (readSwitch ()); // აგზავნის გადართვის მნიშვნელობას სერიული მონიტორის ყუთში}

ფუნქცია readSwitch () არის გასაღები. იგი ითვლის გადამრთველის მნიშვნელობას თითოეული ამომრთველის გამომავალი რიცხვითი გამოსახულების დამატებით და აბრუნებს ჯამს, როგორც შედეგი. ამ მაგალითისთვის ჩვენ გამოვიყენეთ რიცხვითი ჩვენების ფარი, რომელსაც აკონტროლებს NXP SAA1064.

ნაბიჯი 5:

Image
Image

ფუნქცია readSwitch () არის გასაღები. იგი ითვლის გადამრთველის მნიშვნელობას თითოეული ამომრთველის გამომავალი რიცხვითი გამოსახულების დამატებით და აბრუნებს ჯამს, როგორც შედეგი. ამ მაგალითისთვის ჩვენ გამოვიყენეთ რიცხვითი ჩვენების ფარი, რომელსაც აკონტროლებს NXP SAA1064.

თუ თქვენ არ გაქვთ ერთი, ეს ნორმალურია - შედეგები ასევე იგზავნება სერიულ მონიტორზე. ახლა, ვნახოთ ის მოქმედებაში ვიდეოში.

ნაბიჯი 6:

კარგი, ის გარეგნულად არ გამოიყურება, მაგრამ თუ გჭირდებათ რიცხვითი ჩანაწერი, ეს ზოგავს უამრავ ფიზიკურ სივრცეს და გთავაზობთ შესვლის ზუსტ მეთოდს.

ასე რომ თქვენ გაქვთ ეს. თქვენ ნამდვილად გამოიყენებთ მათ პროექტში? ერთი ციფრი - დიახ. Ოთხისთვის? ალბათ არა-ალბათ უფრო ადვილი იქნებოდა 12-ნიშნა კლავიატურის გამოყენება. არსებობს იდეა…

ნაბიჯი 7: მრავალჯერადი გადამრთველი

გამოსახულება
გამოსახულება

ახლა ჩვენ განვიხილავთ, თუ როგორ უნდა წავიკითხოთ ოთხი ციფრი - და არ დავკარგოთ ყველა ის ციფრული ქინძისთავი პროცესში. ამის ნაცვლად, ჩვენ გამოვიყენებთ Microchip MCP23017 16-ბიტიანი პორტის გაფართოების IC- ს, რომელიც ურთიერთობს I2C ავტობუსის საშუალებით. მას აქვს თექვსმეტი ციფრული შეყვანის/გამომავალი ქინძისთავი, რომელიც შეგვიძლია გამოვიყენოთ თითოეული გადამრთველის სტატუსის წასაკითხად.

სანამ წინ მიიწევთ, გთხოვთ გაითვალისწინოთ, რომ ამ სტატიისთვის საჭიროა გარკვეული ცოდნა - I2C ავტობუსი (ნაწილები ერთი და მეორე) და MCP23017. ჩვენ ჯერ აღვწერთ აპარატურულ კავშირებს, შემდეგ კი არდუინოს ესკიზს. გავიხსენოთ სქემატური სქემა, რომელიც გამოიყენება ერთი გადართვის მაგალითისთვის.

როდესაც გადამრთველი პირდაპირ იყო დაკავშირებული არდუინოსთან, ჩვენ ვკითხულობდით თითოეული პინის სტატუსს გადართვის მნიშვნელობის დასადგენად. ჩვენ ამას კიდევ ერთხელ გავაკეთებთ, უფრო მასშტაბურად MCP23017 გამოყენებით. განვიხილოთ pinout დიაგრამა:

ნაბიჯი 8:

ჩვენ გვაქვს 16 ქინძისთავები, რაც საშუალებას იძლევა ოთხი გადამრთველი იყოს დაკავშირებული. საერთო თითოეული გადართვისთვის კვლავ უკავშირდება 5V- ს, ხოლო თითოეულ გადამრთველ კონტაქტს კვლავ აქვს 10k გამყვანი რეზისტორი GND- თან. შემდეგ ჩვენ ვუკავშირდებით ციფრის 1, 2, 4, 8 ქინძისთავებს GPBA0 ~ 3; ციფრი ორი 1, 2, 4, 8 GPA4 ~ 7 -მდე; ციფრი სამი არის 1, 2, 4, 8 GPB0 ~ 3 და ციფრი ოთხი 1, 2, 4, 8 GPB4 ~ 7.

ახლა როგორ ვკითხულობთ გადამრთველებს? ყველა იმ მავთულმა შეიძლება დაგაფიქრებინოთ, რომ რთულია, მაგრამ ესკიზი საკმაოდ მარტივია. როდესაც ვკითხულობთ GPBA და B ღირებულებებს, თითოეული ბანკისთვის ბაიტი ბრუნდება, პირველი ყველაზე მნიშვნელოვანი ბიტი. თითოეული ოთხი ბიტი ემთხვევა გადამრთველის პარამეტრს, რომელიც დაკავშირებულია შესატყვისი I/O ქინძისთავებთან. მაგალითად, თუ ჩვენ ვითხოვთ მონაცემებს ორივე IO ბანკისთვის და გადამრთველები დაყენებულია 1 2 3 4 - ბანკი A დაუბრუნებს 0010 0001 -ს და B ბანკი დაუბრუნებს 0100 0011 -ს.

ჩვენ ვიყენებთ bitshift ოპერაციებს თითოეული ოთხი ბიტის ცალკე ცვლადად გამოყოფისთვის - რაც გვაძლევს თითოეული ციფრის მნიშვნელობას. მაგალითად, გადართვის ოთხი მნიშვნელობის გამოსაყოფად, ჩვენ ბიტს გადავიტანთ ბანკიდან B >> 4. ეს უბიძგებს სამი გადამრთველის მნიშვნელობას გარეთ, ხოლო ცარიელი ბიტი მარცხნივ ხდება ნული.

სამი გადართვის მნიშვნელობის გამოსაყოფად, ჩვენ ვიყენებთ ნაერთს bitwise & - რომელიც ტოვებს გადამრთველის სამი მნიშვნელობას. სურათი გვიჩვენებს ორობითი გადართვის მნიშვნელობების დაშლას - ის გვიჩვენებს ნედლი GPIOA და B ბაიტის მნიშვნელობებს, შემდეგ თითოეული ციფრის ორობითი მნიშვნელობას და ათობითი მნიშვნელობას.

ნაბიჯი 9:

მოდით ვნახოთ სადემონსტრაციო ესკიზი:

/ * მაგალითი 40 ა-წაიკითხეთ ოთხი ბიძგიანი BCD გადამრთველი MCP23017- ის საშუალებით, აჩვენეთ SAA1064/ოთხნიშნა 7-სეგმენტიანი LED ეკრანი */// MCP23017 ქინძისთავები 15 ~ 17 GND– მდე, I2C ავტობუსის მისამართია 0x20 // SAA1064 I2C ავტობუსის მისამართი 0x38 # მოიცავს "Wire.h" // LED ციფრების განმარტებისთვის int ციფრები [16] = {63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113 }; ბაიტი GPIOA, GPIOB, dig1, dig2, dig3, dig4; void initSAA1064 () {// კონფიგურაცია 0x38 Wire.beginTransmission (0x38); Wire.write (0); Wire.write (B01000111); // 12mA გამომავალი, ციფრების ჩამკეტი არ არის Wire.endTransmission (); } void setup () {Serial.begin (9600); Wire.begin (); // გაუშვით I2C ავტობუსი initSAA1064 (); } void loop () {// წაიკითხეთ ბანკი A Wire.beginTransmission (0x20); Wire.write (0x12); Wire.endTransmission (); მავთული. მოთხოვნა (0x20, 1); GPIOA = Wire.read (); // ეს ბაიტი შეიცავს ციფრების გადართვის მონაცემებს 1 და 2 // წაიკითხეთ ბანკი B Wire.beginTransmission (0x20); Wire.write (0x13); Wire.endTransmission (); მავთული. მოთხოვნა (0x20, 1); GPIOB = Wire.read (); // ეს ბაიტი შეიცავს გადართვის მონაცემებს ციფრების 3 და 4 // ამონაწერი მნიშვნელობა თითოეული გადამრთველისთვის // dig1 LHS, dig4 RHS dig4 = GPIOB >> 4; dig3 = GPIOB & B00001111; dig2 = GPIOA >> 4; dig1 = GPIOA & B00001111; // გაგზავნეთ ყველა GPIO და ინდივიდუალური გადართვის მონაცემები სერიულ მონიტორზე // გამართვისა და ინტერესის გამო Serial.print ("GPIOA ="); Serial.println (GPIOA, BIN); Serial.print ("GPIOB ="); Serial.println (GPIOB, BIN); Serial.println (); Serial.print ("ციფრი 1 ="); Serial.println (dig1, BIN); Serial.print ("ციფრი 2 ="); Serial.println (dig2, BIN); Serial.print ("ციფრი 3 ="); Serial.println (dig3, BIN); Serial.print ("ციფრი 4 ="); Serial.println (dig4, BIN); Serial.println (); Serial.print ("ციფრი 1 ="); Serial.println (dig1, DEC); Serial.print ("ციფრი 2 ="); Serial.println (dig2, DEC); Serial.print ("ციფრი 3 ="); Serial.println (dig3, DEC); Serial.print ("ციფრი 4 ="); Serial.println (dig4, DEC); Serial.println (); // გადამრთველის მნიშვნელობის გაგზავნა LED ეკრანზე SAA1064 Wire.beginTransmission (0x38) მეშვეობით; Wire.write (1); Wire.write (ციფრები [dig4]); Wire.write (ციფრები [dig3]); Wire.write (ციფრები [dig2]); Wire.write (ციფრები [dig1]); Wire.endTransmission (); დაგვიანება (10); დაგვიანება (1000); }

და არა მორწმუნეებისთვის … ვიდეო დემონსტრაცია.

ასე რომ თქვენ გაქვთ ეს. ოთხი ციფრი ერთის ნაცვლად და I2C ავტობუსით, რომელიც ინარჩუნებს Arduino ციფრულ I/O პინებს. რვა MCP23017- ის გამოყენებით შეგიძლიათ ერთდროულად წაიკითხოთ 32 ციფრი. გაერთეთ ამით!

თქვენ შეგიძლიათ შეუკვეთოთ BCD და ათწილადი კონცენტრატორები სხვადასხვა ზომის PMD Way– დან, უფასო მიწოდებით მთელს მსოფლიოში.

ეს პოსტი მოგიტანათ pmdway.com– ით - ყველაფერი მწარმოებლებისთვის და ელექტრონიკის მოყვარულთათვის, უფასო მიწოდებით მთელს მსოფლიოში.

გირჩევთ: