สารบัญ:

การทำเพลงด้วย Arduino และ DC Motor: 6 ขั้นตอน
การทำเพลงด้วย Arduino และ DC Motor: 6 ขั้นตอน

วีดีโอ: การทำเพลงด้วย Arduino และ DC Motor: 6 ขั้นตอน

วีดีโอ: การทำเพลงด้วย Arduino และ DC Motor: 6 ขั้นตอน
วีดีโอ: Song played on the electromotor - arduino MUSIC project 2024, กรกฎาคม
Anonim
ทำเพลงด้วย Arduino และ DC Motor
ทำเพลงด้วย Arduino และ DC Motor

วันก่อน ขณะที่เลื่อนดูบทความเกี่ยวกับ Arduino ฉันพบโครงการที่น่าสนใจซึ่งใช้สเต็ปเปอร์มอเตอร์ที่ควบคุมโดย Arduino เพื่อสร้างท่วงทำนองสั้นๆ Arduino ใช้พิน PWM (Pulse Width Modulation) เพื่อรันสเต็ปเปอร์มอเตอร์ที่ความถี่เฉพาะ ซึ่งสอดคล้องกับโน้ตดนตรี โดยจังหวะที่ความถี่จะเล่นเมื่อใด จะได้ยินเสียงท่วงทำนองที่ชัดเจนจากสเต็ปเปอร์มอเตอร์

อย่างไรก็ตาม เมื่อฉันลองใช้งานด้วยตัวเอง ฉันพบว่าสเต็ปเปอร์มอเตอร์ที่ฉันมีอยู่ไม่สามารถหมุนเร็วพอที่จะสร้างโทนเสียงได้ แต่ฉันใช้มอเตอร์กระแสตรงซึ่งค่อนข้างง่ายต่อการตั้งโปรแกรมและเชื่อมต่อกับ Arduino สามารถใช้ L293D IC ทั่วไปเพื่อขับเคลื่อนมอเตอร์จากพิน Arduino PWM ได้อย่างง่ายดาย และฟังก์ชัน Native tone() ใน Arduino สามารถสร้างความถี่ที่จำเป็นได้ ด้วยความประหลาดใจของฉัน ฉันไม่พบตัวอย่างหรือโครงการใดๆ ที่ใช้มอเตอร์ DC ทางออนไลน์ ดังนั้นคำแนะนำนี้จึงเป็นคำตอบของฉันในการแก้ไขปัญหานั้น มาเริ่มกันเลย!

ป.ล. ฉันคิดว่าคุณมีประสบการณ์กับ Arduino แล้ว และคุ้นเคยกับภาษาการเขียนโปรแกรมและฮาร์ดแวร์ของมัน คุณควรรู้ว่าอาร์เรย์คืออะไร PWM คืออะไรและใช้งานอย่างไร แรงดันและกระแสไฟทำงานอย่างไร เพียงเพื่อบอกชื่อบางส่วน หากคุณไม่ได้อยู่ที่นั่นหรือเพิ่งเริ่มใช้งาน Arduino ไม่ต้องกังวล: ลองใช้หน้าเริ่มต้นใช้งานจากเว็บไซต์อย่างเป็นทางการของ Arduino และกลับมาทุกครั้งที่คุณพร้อม:)

เสบียง

  • Arduino (ฉันใช้ UNO แต่คุณสามารถใช้ Arduino อื่นได้หากต้องการ)
  • มอเตอร์ DC 5V มาตรฐาน ควรมีพัดลมติดไว้ (ดูภาพใน "การประกอบวงจร"
  • L293D IC
  • ปุ่มกดจำนวนมากเท่าโน้ตในเพลงที่คุณต้องการเล่น
  • เขียงหั่นขนม
  • สายจัมเปอร์

ขั้นตอนที่ 1: ภาพรวม

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

ขั้นตอนที่ 2: การประกอบวงจร

การประกอบวงจร
การประกอบวงจร
การประกอบวงจร
การประกอบวงจร

ในการประกอบวงจร ให้ทำตามแผนภาพ Fritzing ด้านบน

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

ขั้นตอนที่ 3: วงจรทำงานอย่างไร

วงจรทำงานอย่างไร
วงจรทำงานอย่างไร

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

ด้านบนเป็นแผนภาพพินเอาต์/การทำงานของ L293D จากแผ่นข้อมูล เนื่องจากเราขับมอเตอร์เพียง 1 ตัว (L293D สามารถขับ 2) เราจึงต้องการ IC เพียงด้านเดียวเท่านั้น พิน 8 คือพลังงาน พิน 4 และ 5 คือ GND พิน 1 คือเอาต์พุต PWM จาก Arduino และพิน 2 และ 7 ควบคุมทิศทางของมอเตอร์ เมื่อพิน 2 สูง และพิน 7 ต่ำ มอเตอร์จะหมุนไปทางเดียว และเมื่อพิน 2 ต่ำ และพิน 7 สูง มอเตอร์จะหมุนไปทางอื่น เนื่องจากเราไม่สนใจว่ามอเตอร์จะหมุนไปทางไหน ไม่สำคัญว่าพิน 2 และ 7 จะต่ำหรือสูง ตราบใดที่พวกมันต่างกัน พิน 3 และ 6 เชื่อมต่อกับมอเตอร์ คุณสามารถเชื่อมต่อทุกอย่างเข้ากับอีกด้านหนึ่งได้ (พิน 9-16) หากต้องการ แต่โปรดทราบว่าสวิตช์ไฟและพิน PWM จะสลับตำแหน่ง

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

ขั้นตอนที่ 4: โค้ดทำงานอย่างไร

เพื่อให้จัดการปุ่มทั้งหมดได้ง่ายขึ้น ฉันใช้ไลบรารีชื่อ “ปุ่ม” โดย madleech ฉันรวมห้องสมุดเป็นสิ่งแรก ต่อไป ในบรรทัดที่ 8-22 ฉันกำหนดความถี่สำหรับโน้ตที่จำเป็นในการเล่น Twinkle, Twinkle, Little Star (เพลงตัวอย่าง) พินที่จะใช้ขับ L293D และปุ่มต่างๆ

ในฟังก์ชันการตั้งค่า ฉันเริ่มต้น Serial, ปุ่มต่างๆ และตั้งค่าพินของไดรเวอร์สำหรับ L293D เป็นโหมดเอาต์พุต

ในที่สุด ในลูปหลัก ฉันตรวจสอบเพื่อดูว่ามีการกดปุ่มหรือไม่ หากมี Arduino จะเล่นโน้ตที่เกี่ยวข้องและพิมพ์ชื่อโน้ตไปที่ Serial Monitor (มีประโยชน์สำหรับการรู้ว่าโน้ตใดอยู่บนเขียงหั่นขนมของคุณ) หากมีการปล่อยโน้ต Arduino จะหยุดเสียงด้วย noTone()

ขออภัย เนื่องจากวิธีจัดโครงสร้างไลบรารี ฉันไม่สามารถหาวิธีตรวจสอบว่ามีการกดหรือปล่อยปุ่มด้วยวิธีที่ละเอียดน้อยกว่าการใช้ 2 เงื่อนไขต่อโน้ตหรือไม่ ข้อบกพร่องอีกประการหนึ่งของโค้ดนี้คือ หากคุณกดสองปุ่มพร้อมกันแล้วปล่อยปุ่มใดปุ่มหนึ่ง โน้ตทั้งสองจะหยุดทำงาน เนื่องจาก noTone() จะหยุดการสร้างโน้ตใดๆ โดยไม่คำนึงถึงว่าโน้ตตัวใดที่เรียกใช้งาน

ขั้นตอนที่ 5: การเขียนโปรแกรมเพลง

แทนที่จะใช้ปุ่มเพื่อเล่นโน้ต คุณยังสามารถตั้งโปรแกรม Arduino ให้เล่นเมโลดี้ให้คุณโดยอัตโนมัติได้อีกด้วย นี่คือเวอร์ชันดัดแปลงของสเก็ตช์แรกซึ่งเล่น Twinkle, Twinkle, Little Star บนมอเตอร์ ส่วนแรกของภาพร่างนั้นเหมือนกัน - กำหนดความถี่ของโน้ตและโทนพิน เราไปที่ส่วนใหม่ที่ bpm="100" ฉันตั้งค่าบีตต่อนาที (bpm) แล้วใช้คณิตศาสตร์หาจำนวนมิลลิวินาทีต่อบีตที่ bpm เท่ากัน ในการทำเช่นนี้ ฉันใช้เทคนิคที่เรียกว่าการวิเคราะห์เชิงมิติ (ไม่ต้องกังวล ไม่ยากอย่างที่คิด) หากคุณเคยเรียนวิชาเคมีระดับมัธยมศึกษาตอนปลาย คุณจะต้องใช้การวิเคราะห์เชิงมิติเพื่อแปลงหน่วยเป็นหน่วย floats() มีไว้เพื่อให้แน่ใจว่าไม่มีสิ่งใดในสมการถูกปัดเศษจนสุดเพื่อความถูกต้อง

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

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

ขั้นตอนที่ 6: คำติชม

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

แนะนำ: