สารบัญ:

DIP Tune Selector โดยใช้ 1 พิน: 4 ขั้นตอน
DIP Tune Selector โดยใช้ 1 พิน: 4 ขั้นตอน

วีดีโอ: DIP Tune Selector โดยใช้ 1 พิน: 4 ขั้นตอน

วีดีโอ: DIP Tune Selector โดยใช้ 1 พิน: 4 ขั้นตอน
วีดีโอ: DMX Lighting Tutorial Part 3: Dip Switches | UniqueSquared.com 2024, พฤศจิกายน
Anonim
DIP Tune Selector โดยใช้ 1 Pin
DIP Tune Selector โดยใช้ 1 Pin

คราวที่แล้ว ฉันทำงานในโครงการ "กล่องดนตรี" ที่ต้องเลือกระหว่างตัวอย่างเพลงต่างๆ มากถึง 10 รายการ ตัวเลือกที่เป็นธรรมชาติสำหรับการเลือกจูนเฉพาะคือสวิตช์จุ่ม 4 พินเนื่องจากสวิตช์ 4 ตัวให้24=16 การตั้งค่าที่แตกต่างกัน อย่างไรก็ตาม การใช้กำลังเดรัจฉานสำหรับวิธีนี้ต้องใช้พินอุปกรณ์ 4 ตัว หนึ่งพินสำหรับสวิตช์แต่ละตัว เนื่องจากฉันวางแผนที่จะใช้ ATtiny85 เพื่อการพัฒนา การสูญเสียพิน 4 พินจึงมากเกินไปเล็กน้อย โชคดีที่ฉันพบบทความที่อธิบายวิธีที่แยบยลในการใช้พินอะนาล็อก 1 พินเพื่อจัดการอินพุตสวิตช์หลายตัว

เทคนิคมัลติสวิตช์ 1 อินพุตใช้วงจรตัวแบ่งแรงดันเพื่อให้ค่าจำนวนเต็มที่ไม่ซ้ำกันสำหรับชุดการตั้งค่าสวิตช์ที่เป็นไปได้แต่ละชุดจากทั้งหมด 16 ชุด จากนั้นจึงใช้ชุดตัวระบุจำนวนเต็ม 16 ชุดในแอปพลิเคชันโปรแกรมเพื่อเชื่อมโยงการดำเนินการกับการตั้งค่า

คำแนะนำนี้ใช้วิธีมัลติสวิตช์เพื่อใช้การเลือกปรับแต่งสำหรับแอปพลิเคชันกล่องดนตรี จากนั้นเมโลดี้ที่เลือกจะเล่นผ่านออดแบบเพียโซโดยใช้ฟังก์ชันโทนเสียง Arduino

ขั้นตอนที่ 1: ฮาร์ดแวร์ที่จำเป็น

ฮาร์ดแวร์ที่จำเป็น
ฮาร์ดแวร์ที่จำเป็น

การใช้ UNO เป็นแพลตฟอร์มการใช้งานช่วยลดจำนวนส่วนประกอบฮาร์ดแวร์ที่จำเป็น การนำวิธีการอินพุตแบบหลายสวิตช์ไปใช้นั้นต้องการเพียงสวิตช์จุ่ม 4 พิน ตัวต้านทาน 5 ตัวที่ใช้สำหรับตัวแบ่งแรงดันไฟฟ้า และสายเชื่อมต่อสำหรับการเชื่อมต่อ มีการเพิ่มออดแบบเพียโซในการกำหนดค่าสำหรับการใช้งานตัวเลือกจูนกล่องดนตรี หรือขึ้นอยู่กับประเภทของดิปสวิตช์ที่ใช้ เป็นประโยชน์ที่จะใช้ซ็อกเก็ต 2x4 8 พินเพื่อเชื่อมต่อดิปสวิตช์กับเขียงหั่นขนม เนื่องจากหมุดสวิตช์จุ่มมาตรฐานดูเหมือนจะทำขึ้นสำหรับการบัดกรีกับบอร์ดต่อที่ไม่ได้เสียบเข้ากับเขียงหั่นขนมโดยตรง ซ็อกเก็ตทำให้การเชื่อมต่อสวิตช์จุ่มมีความเสถียรและป้องกันไม่ให้ยกสวิตช์ได้ง่ายเมื่อตั้งค่าสวิตช์สลับ

ชื่อ แหล่งที่เป็นไปได้ ใช้อย่างไร
สวิตช์จุ่ม 4 พิน ปรับแต่งการเลือก
ซ็อกเก็ตพิน 2x4 (อุปกรณ์เสริม) อเมซอน โพสต์บนสวิตช์จุ่มส่วนใหญ่ไม่ยึดสวิตช์ได้ดีในเขียงหั่นขนม ซ็อกเก็ตช่วยให้การเชื่อมต่อแน่นขึ้น อีกทางเลือกหนึ่งคือการหาสวิตช์แบบจุ่มที่ทำมาเพื่อการใช้งานเขียงหั่นขนมอย่างแท้จริงกับพิน IC ทั่วไป

ตัวต้านทาน:

  • 10K x2
  • 20K
  • 40K
  • 80K
ใช้ตัวแบ่งแรงดันไฟฟ้า
ออด Piezo แบบพาสซีฟ อเมซอน เล่นเมโลดี้ที่ขับเคลื่อนโดยแอพพลิเคชั่นผ่านฟังก์ชั่นโทนเสียง Arduino

ขั้นตอนที่ 2: คำอธิบายวิธีการหลายสวิตช์

คำอธิบายวิธีการหลายสวิตช์
คำอธิบายวิธีการหลายสวิตช์

ส่วนนี้อธิบายแนวคิดพื้นฐานสำหรับวิธีการแบบหลายสวิตช์และพัฒนาสมการที่จำเป็นสำหรับการคำนวณแบบสแตนด์อโลนของตัวระบุที่ไม่ซ้ำกันสำหรับการกำหนดค่าการตั้งค่าสวิตช์จุ่ม 16 แบบที่เป็นไปได้ ตัวระบุเหล่านี้สามารถใช้ในแอปพลิเคชันโปรแกรมเพื่อเชื่อมโยงการกำหนดค่าสวิตช์กับการดำเนินการ ตัวอย่างเช่น คุณอาจต้องการการตั้งค่า - เปิด 1, ปิด 2, ปิด 3, ปิด 4 (1, 0, 0, 0) - เพื่อเล่น Amazing Grace และ (0, 1, 0, 0) เพื่อเล่น สิงโตนอนคืนนี้ เพื่อความกระชับและรัดกุม ตัวระบุการกำหนดค่าจะเรียกว่าตัวเปรียบเทียบในส่วนที่เหลือของเอกสาร

ภาพ
ภาพ

แนวคิดพื้นฐานสำหรับวิธีมัลติสวิตช์คือวงจรตัวแบ่งแรงดันซึ่งประกอบด้วยตัวต้านทานแบบอนุกรม 2 ตัวที่เชื่อมต่อกับแรงดันไฟฟ้าขาเข้า ตะกั่วแรงดันเอาต์พุตเชื่อมต่อระหว่างตัวต้านทาน R1 และ R2ดังที่แสดงไว้ข้างต้น แรงดันเอาต์พุตตัวแบ่งคำนวณตามแรงดันไฟอินพุตคูณด้วยอัตราส่วนของตัวต้านทาน R2 เป็นผลรวมของ R1 และ R2 (สมการที่ 1) อัตราส่วนนี้จะน้อยกว่า 1 เสมอ ดังนั้นแรงดันเอาต์พุตจึงน้อยกว่าแรงดันอินพุตเสมอ

ตามที่ระบุไว้ในไดอะแกรมการออกแบบด้านบนมัลติสวิตช์ถูกกำหนดค่าเป็นตัวแบ่งแรงดันไฟฟ้าด้วย R2 คงที่และR1 เท่ากับความต้านทานคอมโพสิต/เทียบเท่าสำหรับตัวต้านทานสวิตช์จุ่ม 4 ตัว ค่าของ R1 ขึ้นอยู่กับสวิตช์จุ่มที่เปิดอยู่และทำให้เกิดความต้านทานคอมโพสิต เนื่องจากตัวต้านทานสวิตช์จุ่มเป็นแบบขนาน สมการการคำนวณความต้านทานที่เท่ากันจึงถูกระบุในรูปของส่วนกลับของตัวต้านทานส่วนประกอบ สำหรับการกำหนดค่าของเราและกรณีที่สวิตช์ทั้งหมดเปิดอยู่ สมการจะกลายเป็น

1/R1 = 1/80000 + 1/40000 + 1/20000 + 1/10000

ให้ R1 = 5333.33 โวลต์ เพื่อพิจารณาว่าการตั้งค่าส่วนใหญ่ปิดสวิตช์ไว้อย่างน้อยหนึ่งตัว สถานะสวิตช์จะถูกใช้เป็นตัวคูณ:

1/R1 = ส1*1/80000 + วินาที2*1/40000 + วินาที3*1/20000 + s4*1/10000 (2)

โดยที่ตัวคูณสถานะ sผมเท่ากับ 1 หากสวิตช์เปิดอยู่ และเท่ากับ 0 หากปิดสวิตช์ NS1 สามารถใช้คำนวณอัตราส่วนความต้านทานที่ต้องการในสมการที่ 1 ได้ โดยใช้กรณีที่สวิตช์ทั้งหมดเปิดอยู่ดังตัวอย่างอีกครั้ง

อัตราส่วน = R2/(NS1+ร2) = 10000/(5333.33+10000) =.6522

ขั้นตอนสุดท้ายในการคำนวณค่าตัวเปรียบเทียบที่คาดการณ์ไว้คือการคูณ RATIO ด้วย 1023 เพื่อจำลองผลกระทบของฟังก์ชัน analogRead ตัวระบุสำหรับกรณีที่สวิตช์ทั้งหมดเปิดอยู่นั้น

เครื่องเปรียบเทียบ15 = 1023*.6522 = 667

ขณะนี้ สมการทั้งหมดพร้อมสำหรับการคำนวณตัวระบุสำหรับการตั้งค่าสวิตช์ที่เป็นไปได้ 16 แบบ เพื่อสรุป:

  1. NS1 คำนวณโดยใช้สมการ 2
  2. NS1 และ R2 ใช้ในการคำนวณ RATIO แนวต้านที่เกี่ยวข้อง
  3. RATIO คูณด้วย 1023 เพื่อให้ได้ค่าตัวเปรียบเทียบ
  4. นอกจากนี้ ยังสามารถคำนวณแรงดันเอาต์พุตที่คาดการณ์ไว้เป็น RATIO*Vin

ชุดของตัวเปรียบเทียบขึ้นอยู่กับค่าตัวต้านทานที่ใช้สำหรับตัวแบ่งแรงดันไฟฟ้าเท่านั้นและเป็นลายเซ็นเฉพาะสำหรับการกำหนดค่า เนื่องจากแรงดันเอาต์พุตของตัวแบ่งจะผันผวนจากการรันไปยังรัน (และอ่านเพื่ออ่าน) เฉพาะในบริบทนี้หมายความว่าในขณะที่ตัวระบุสองชุดอาจไม่เหมือนกันทุกประการ แต่ก็ใกล้เคียงพอที่ความแตกต่างของตัวเปรียบเทียบส่วนประกอบจะอยู่ภายในช่วงก่อน ช่วงเวลาที่กำหนด ต้องเลือกพารามิเตอร์ขนาดช่วงให้ใหญ่พอที่จะพิจารณาความผันผวนที่คาดหวัง แต่มีขนาดเล็กพอที่การตั้งค่าสวิตช์ต่างๆ จะไม่ทับซ้อนกัน โดยปกติ 7 จะทำงานได้ดีสำหรับช่วงครึ่งความกว้าง

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

โปรแกรมสาธิตต่อไปนี้แสดงให้เห็นถึงการใช้เครื่องเปรียบเทียบเพื่อระบุการตั้งค่าสวิตช์จุ่มปัจจุบัน ในแต่ละรอบของโปรแกรม จะมีการดำเนินการ analogRead เพื่อรับตัวระบุสำหรับการกำหนดค่าปัจจุบัน ตัวระบุนี้จะถูกเปรียบเทียบระหว่างรายการตัวเปรียบเทียบจนกว่าจะพบรายการที่ตรงกันหรือรายการหมด หากพบการจับคู่จะมีข้อความเอาต์พุตสำหรับการตรวจสอบ หากไม่พบจะมีการออกคำเตือน มีการแทรกการหน่วงเวลา 3 วินาทีในลูปเพื่อไม่ให้หน้าต่างเอาต์พุตแบบอนุกรมเต็มไปด้วยข้อความ และเพื่อให้เวลาในการรีเซ็ตการกำหนดค่าสวิตช์จุ่ม

//-------------------------------------------------------------------------------------

// โปรแกรมสาธิตเพื่ออ่านเอาต์พุตตัวแบ่งแรงดันและใช้เพื่อระบุ // การกำหนดค่าสวิตช์จุ่มปัจจุบันโดยค้นหาค่าเอาต์พุตในอาร์เรย์ของ // ค่าเปรียบเทียบสำหรับการตั้งค่าที่เป็นไปได้แต่ละรายการ ค่าในอาร์เรย์การค้นหาสามารถ // หาได้จากการรันครั้งก่อนสำหรับการกำหนดค่าหรือผ่านการคำนวณ // ตามสมการพื้นฐาน //------------------------------------------------ -------------------------------------- ตัวเปรียบเทียบ int [16] = {0, 111, 203, 276, 339, 393, 434, 478, 510, 542, 567, 590, 614, 632, 651, 667}; // กำหนดตัวแปรการประมวลผล int dipPin = A0; // พินอะนาล็อกสำหรับอินพุตตัวแบ่งแรงดัน int dipIn = 0; // ถือเอาท์พุตแรงดันแบ่งที่แปลโดย analogRead int count = 0; // ตัวนับลูป int epsilon = 7; // การเปรียบเทียบช่วงครึ่งความกว้าง bool dipFound = false; // จริงหากพบเอาต์พุตตัวแบ่งแรงดันปัจจุบันในการค้นหาการตั้งค่าโมฆะตาราง () { pinMode (dipPin, INPUT); // กำหนดค่าพินตัวแบ่งแรงดันเป็น INPUT Serial.begin(9600); // เปิดใช้งานการสื่อสารแบบอนุกรม } วงเป็นโมฆะ () { ล่าช้า (3000); // ป้องกันเอาต์พุตจากการเลื่อนเร็วเกินไป // เริ่มต้นพารามิเตอร์การค้นหานับ = 0; dipFound = เท็จ; // อ่านและบันทึกแรงดันเอาต์พุตปัจจุบัน dipIn = analogRead (dipPin); Serial.print("ตัวแบ่งเอาต์พุต"); Serial.print(dipIn); // ค้นหารายการเปรียบเทียบสำหรับค่าปัจจุบันในขณะที่ ((นับ < 16) && (!dipFound)) { if(abs (dipIn - comparator [count]) <= epsilon) { // พบว่า dipFound = true; Serial.print(" พบที่รายการ "); Serial.print(นับ); Serial.println("value" + String(ตัวเปรียบเทียบ[นับ])); หยุดพัก; } นับ++; } if(!dipFound) {// ค่าไม่อยู่ในตาราง; ไม่ควรเกิดขึ้น Serial.println(" OOPS! Not found; เรียก Ghost Busters ดีกว่า"); } }

ขั้นตอนที่ 3: สเปรดชีตเปรียบเทียบ

ภาพ
ภาพ

การคำนวณค่าเปรียบเทียบ 16 ค่ามีอยู่ในสเปรดชีตที่แสดงด้านบน สามารถดาวน์โหลดไฟล์ excel ที่แนบมาได้ที่ด้านล่างของส่วนนี้

คอลัมน์สเปรดชีต A-D บันทึกค่าตัวต้านทานสวิตช์จุ่มและการตั้งค่าสวิตช์ที่เป็นไปได้ 16 แบบ โปรดทราบว่าสวิตช์ DIP ของฮาร์ดแวร์ที่แสดงในไดอะแกรมการออกแบบ fritzing นั้นจริง ๆ แล้วมีหมายเลขจากซ้ายไปขวาแทนที่จะเป็นหมายเลขจากขวาไปซ้ายที่แสดงในสเปรดชีต ฉันพบว่าสิ่งนี้ค่อนข้างสับสน แต่ทางเลือกอื่นไม่ได้ใส่การกำหนดค่า "1" (0, 0, 0, 1) ที่รายการแรก คอลัมน์ E ใช้สูตร 2 ของส่วนก่อนหน้าในการคำนวณความต้านทานเทียบเท่าตัวแบ่งแรงดันR1 สำหรับการตั้งค่า คอลัมน์ F ใช้ผลลัพธ์นี้ในการคำนวณ RATIO ความต้านทานที่เกี่ยวข้อง และสุดท้ายคอลัมน์ G จะคูณ RATIO ด้วยค่า analogRead max (1023) เพื่อให้ได้ค่าตัวเปรียบเทียบที่คาดการณ์ไว้ 2 คอลัมน์สุดท้ายประกอบด้วยค่าจริงจากการรันโปรแกรมสาธิตพร้อมกับความแตกต่างระหว่างค่าที่คาดการณ์และค่าจริง

ส่วนก่อนหน้านี้กล่าวถึงสามวิธีในการรับชุดของค่าตัวเปรียบเทียบรวมถึงส่วนขยายของสเปรดชีตนี้ หากค่าตัวต้านทานมีการเปลี่ยนแปลงอย่างมีนัยสำคัญหรือมีการเพิ่มสวิตช์เพิ่มเติม ดูเหมือนว่าความแตกต่างเล็กน้อยในค่าตัวต้านทานจะไม่ส่งผลกระทบอย่างมีนัยสำคัญต่อผลลัพธ์สุดท้าย (ซึ่งเป็นสิ่งที่ดีเนื่องจากข้อกำหนดของตัวต้านทานให้ค่าความคลาดเคลื่อน กล่าวคือ 5% และตัวต้านทานแทบจะไม่เท่ากับค่าที่ระบุจริง)

ขั้นตอนที่ 4: เล่น Tune

เล่น Tune
เล่น Tune

เพื่อแสดงวิธีการใช้เทคนิคมัลติสวิตช์ในแอปพลิเคชัน โปรแกรมสาธิตการเปรียบเทียบจากส่วน " คำอธิบายเมธอด " ได้รับการแก้ไขเพื่อใช้การประมวลผลการเลือกปรับแต่งสำหรับโปรแกรมกล่องดนตรี การกำหนดค่าแอปพลิเคชันที่อัปเดตแสดงไว้ด้านบน การเพิ่มเพียงอย่างเดียวของฮาร์ดแวร์คือออดแบบเพียโซแบบพาสซีฟเพื่อเล่นเพลงที่เลือก การเปลี่ยนแปลงพื้นฐานของซอฟต์แวร์คือการเพิ่มรูทีนเพื่อเล่นเพลง เมื่อระบุแล้ว โดยใช้ออดและโทนเสียง Arduino

ตัวอย่างการปรับแต่งที่มีอยู่จะอยู่ในไฟล์ส่วนหัว Tunes.h พร้อมกับคำจำกัดความของโครงสร้างการสนับสนุนที่จำเป็น แต่ละท่วงทำนองถูกกำหนดให้เป็นอาร์เรย์ของโครงสร้างที่เกี่ยวข้องกับโน้ตที่มีความถี่และระยะเวลาของโน้ต ความถี่ของโน้ตมีอยู่ในไฟล์ส่วนหัวที่แยกต่างหากคือ Pitches.h ไฟล์โปรแกรมและส่วนหัวสามารถดาวน์โหลดได้ที่ส่วนท้ายของส่วนนี้ ทั้งสามไฟล์ควรอยู่ในไดเร็กทอรีเดียวกัน

การคัดเลือกและการระบุดำเนินการดังนี้:

  1. "ผู้ใช้" ตั้งค่าสวิตช์จุ่มในการกำหนดค่าที่เกี่ยวข้องกับการปรับแต่งที่ต้องการ
  2. ทุกโปรแกรมวนรอบตัวระบุสำหรับการตั้งค่าสวิตช์จุ่มปัจจุบันจะได้รับผ่าน analogRead
  3. ตัวระบุการกำหนดค่าขั้นตอนที่ 2 จะถูกเปรียบเทียบกับตัวเปรียบเทียบแต่ละตัวในรายการปรับแต่งที่มีอยู่
  4. หากพบการแข่งขัน รูทีน playTune จะถูกเรียกพร้อมข้อมูลที่จำเป็นในการเข้าถึงรายการโน้ตเพลง

    การใช้ฟังก์ชันโทนเสียง Arduino แต่ละโน้ตจะเล่นผ่านเสียงกริ่ง

  5. หากไม่พบรายการที่ตรงกัน จะไม่มีการดำเนินการใดๆ
  6. ทำซ้ำ 1-5

การตั้งค่าสวิตช์ DIP สำหรับเพลงที่มีจะแสดงในตารางด้านล่าง โดยที่ 1 หมายถึงเปิดสวิตช์อยู่ 0 ปิด จำได้ว่าวิธีที่สวิตช์จุ่มวางตำแหน่งสวิตช์ 1 ในตำแหน่งซ้ายสุด (อันที่เกี่ยวข้องกับตัวต้านทาน 80K)

ชื่อ สวิตช์ 1 สวิตช์2 สวิตช์ 3 สวิตช์ 4
แดนนี่ บอย 1 0 0 0
หมีน้อย 0 1 0 0
สิงโตนอนคืนนี้ 1 1 0 0
ไม่มีใครรู้ปัญหา 0 0 1 0
พระคุณอันน่าอัศจรรย์ 0 0 0 1
ที่ว่าง 1 0 0 1
ม็อกกิ้งเบิร์ดฮิลล์ 1 0 1 1

คุณภาพเสียงจาก Piezo Buzzer นั้นไม่ดีนัก แต่อย่างน้อยก็เป็นที่รู้จัก ในความเป็นจริง หากวัดโทนเสียง พวกมันจะใกล้เคียงกับความถี่ที่แน่นอนของโน้ตมาก เทคนิคหนึ่งที่น่าสนใจที่ใช้ในโปรแกรมคือการจัดเก็บข้อมูลการปรับแต่งในส่วนหน่วยความจำแฟลช/โปรแกรมแทนส่วนหน่วยความจำข้อมูลเริ่มต้นโดยใช้คำสั่ง PROGMEM ส่วนข้อมูลเก็บตัวแปรการประมวลผลโปรแกรมและมีขนาดเล็กกว่ามาก ประมาณ 512 ไบต์สำหรับไมโครคอนโทรลเลอร์ ATtiny บางตัว

แนะนำ: