สารบัญ:

Arduino และสวิตช์ Thumbwheel: 9 ขั้นตอน
Arduino และสวิตช์ Thumbwheel: 9 ขั้นตอน

วีดีโอ: Arduino และสวิตช์ Thumbwheel: 9 ขั้นตอน

วีดีโอ: Arduino และสวิตช์ Thumbwheel: 9 ขั้นตอน
วีดีโอ: สวิตซ์กด เพิ่มค่า ลดค่า คำสั่ง Arduino ☯ RiD Finity 2024, พฤศจิกายน
Anonim
Arduino และสวิตช์ Thumbwheel
Arduino และสวิตช์ Thumbwheel

ในบทความนี้ เราจะตรวจสอบการใช้สวิตช์ล้อเลื่อน/ล้อเลื่อนกับระบบ Arduino ของเรา นี่คือตัวอย่างบางส่วนที่มาจาก 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" #define q1 8 #define q2 9 # กำหนด q4 10 #define q8 11 ตั้งค่าเป็นโมฆะ () { Serial.begin (9600); Wire.begin(); // เข้าร่วมบัส i2c (เลือกที่อยู่สำหรับมาสเตอร์) ล่าช้า (500); โหมดพิน (q1, INPUT); // thumbwheel '1' pinMode (q2, INPUT); // thumbwheel '2' โหมดพิน (q4, INPUT); // thumbwheel '4' โหมดพิน (q8, INPUT); // thumbwheel '8' } void dispSAA1064 (int Count) // ส่งจำนวนเต็ม 'Count' ไปยัง Gravitech SAA1064 shield { const int lookup [10] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F }; int หลักพัน หลักร้อย หลักสิบ ฐาน; Wire.beginการส่ง(0x38); Wire.write(0); Wire.write(B01000111); Wire.endTransmission(); Wire.beginการส่ง(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 () { รวมทั้งหมด = 0; ถ้า (digitalRead(q1)==HIGH) { รวม+=1; } if (digitalRead(q2)==HIGH) { รวม+=2; } if (digitalRead(q4)==HIGH) { รวม+=4; } if (digitalRead(q8)==HIGH) { รวม+=8; } ผลตอบแทนรวม; } วงเป็นโมฆะ () { dispSAA1064 (readSwitch ()); // ส่งค่าสวิตช์เพื่อแสดงโล่ Serial.println(readSwitch()); // ส่งค่าสวิตช์ไปที่กล่องมอนิเตอร์แบบอนุกรม }

ฟังก์ชั่น readSwitch() เป็นกุญแจสำคัญ โดยจะคำนวณค่าของสวิตช์โดยเพิ่มการแสดงตัวเลขของเอาต์พุตสวิตช์แต่ละรายการและคืนค่าผลรวมเป็นผลลัพธ์ สำหรับตัวอย่างนี้ เราใช้แผงแสดงผลตัวเลขที่ควบคุมโดย NXP SAA1064

ขั้นตอนที่ 5:

Image
Image

ฟังก์ชั่น readSwitch() เป็นกุญแจสำคัญ โดยจะคำนวณค่าของสวิตช์โดยเพิ่มการแสดงตัวเลขของเอาต์พุตสวิตช์แต่ละรายการและคืนค่าผลรวมเป็นผลลัพธ์ สำหรับตัวอย่างนี้ เราใช้แผงแสดงผลตัวเลขที่ควบคุมโดย NXP SAA1064

หากคุณไม่มี ไม่เป็นไร ผลลัพธ์จะถูกส่งไปยังจอภาพแบบอนุกรมด้วย ทีนี้มาดูการใช้งานจริงในวิดีโอกัน

ขั้นตอนที่ 6:

โอเค มันดูไม่เหมือนมาก แต่ถ้าคุณต้องการการป้อนตัวเลข มันช่วยประหยัดพื้นที่ทางกายภาพได้มาก และเสนอวิธีการป้อนที่แม่นยำ

ดังนั้นคุณมีมัน คุณจะใช้สิ่งเหล่านี้ในโครงการจริงหรือ สำหรับหนึ่งหลัก - ใช่ สำหรับสี่? อาจจะไม่ – บางทีมันอาจจะง่ายกว่าถ้าใช้ปุ่มกด 12 หลัก มีไอเดีย…

ขั้นตอนที่ 7: สวิตช์หลายตัว

ภาพ
ภาพ

ตอนนี้เราจะตรวจสอบวิธีการอ่านตัวเลขสี่หลัก – และไม่ต้องเสียหมุดดิจิทัลทั้งหมดในกระบวนการ แต่เราจะใช้ IC ตัวขยายพอร์ต 16 บิตของ Microchip MCP23017 ที่สื่อสารผ่านบัส I2C แทน มีพินอินพุต/เอาท์พุตดิจิตอลสิบหกอันที่เราสามารถใช้อ่านสถานะของสวิตช์แต่ละตัวได้

ก่อนดำเนินการต่อ โปรดทราบว่าจำเป็นต้องมีความรู้ที่สันนิษฐานไว้สำหรับบทความนี้ – บัส I2C (ส่วนที่หนึ่งและสอง) และ MCP23017 ก่อนอื่นเราจะอธิบายการเชื่อมต่อฮาร์ดแวร์ และจากนั้นเป็นภาพร่าง Arduino เรียกคืนแผนผังที่ใช้สำหรับตัวอย่างสวิตช์เดี่ยว

เมื่อสวิตช์เชื่อมต่อโดยตรงกับ Arduino เราอ่านสถานะของแต่ละพินเพื่อกำหนดค่าของสวิตช์ เราจะทำสิ่งนี้อีกครั้งในขนาดที่ใหญ่ขึ้นโดยใช้ MCP23017 พิจารณาแผนภาพพินเอาต์:

ขั้นตอนที่ 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

เราใช้การดำเนินการบิตชิฟต์เพื่อแยกแต่ละสี่บิตออกเป็นตัวแปรแยกกัน ซึ่งทำให้เรามีค่าของแต่ละหลัก ตัวอย่างเช่น หากต้องการแยกค่าของสวิตช์สี่ เราเปลี่ยนบิตจากธนาคาร B >> 4 ซึ่งจะผลักค่าของสวิตช์ออก 3 ค่า และบิตว่างทางด้านซ้ายจะกลายเป็นศูนย์

ในการแยกค่าของสวิตช์สาม เราใช้การรวมระดับบิต & – ซึ่งเหลือค่าของสวิตช์สามไว้ รูปภาพแสดงรายละเอียดของค่าสวิตช์ไบนารี โดยจะแสดงค่าดิบ GPIOA และ B ไบต์ จากนั้นค่าไบนารีของแต่ละหลัก และค่าทศนิยม

ขั้นตอนที่ 9:

มาดูภาพร่างการสาธิตกัน:

/* ตัวอย่าง 40a - อ่านสวิตช์ BCD แบบล้อเลื่อนสี่ล้อผ่าน MCP23017 แสดงบนจอแสดงผล LED 7 ส่วน SAA1064/4 หลัก */ // 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; เป็นโมฆะ initSAA1064 () {// ตั้งค่า 0x38 Wire.beginTransmission (0x38); Wire.write(0); Wire.write(B01000111); // เอาต์พุต 12mA ไม่มีช่องว่างหลัก Wire.endTransmission(); } การตั้งค่าเป็นโมฆะ () { Serial.begin (9600); Wire.begin(); // เริ่มต้นบัส I2C initSAA1064(); } void loop() { // อ่านอินพุตของธนาคาร A Wire.beginTransmission(0x20); Wire.write(0x12); Wire.endTransmission(); Wire.requestFrom(0x20, 1); GPIOA=Wire.read(); // ไบต์นี้มีข้อมูลสวิตช์สำหรับตัวเลข 1 และ 2 // อ่านอินพุตของธนาคาร B Wire.beginTransmission(0x20); Wire.write(0x13); Wire.endTransmission(); Wire.requestFrom(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, ธ.ค.); Serial.print("หลัก 2 = "); Serial.println (dig2, ธ.ค.); Serial.print("หลัก 3 = "); Serial.println (dig3, ธ.ค.); Serial.print("หลัก 4 = "); Serial.println (dig4, ธ.ค.); 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 ที่ช่วยรักษาพิน I/O ดิจิทัลของ Arduino เมื่อใช้ MCP23017 แปดตัว คุณสามารถอ่านตัวเลข 32 หลักพร้อมกันได้ ขอให้สนุกกับการทำอย่างนั้น!

สั่งซื้อได้ทั้ง BCD และสวิตช์ทศนิยมในขนาดต่างๆ จาก PMD Way พร้อมจัดส่งฟรีทั่วโลก

โพสต์นี้มาถึงคุณโดย pmdway.com – ทุกอย่างสำหรับผู้ผลิตและผู้ที่ชื่นชอบอุปกรณ์อิเล็กทรอนิกส์ พร้อมบริการจัดส่งฟรีทั่วโลก

แนะนำ: