สารบัญ:
- ขั้นตอนที่ 1: การกำหนดที่อยู่ลงทะเบียน
- ขั้นตอนที่ 2: อาร์เรย์และตัวแปรส่วนกลาง
- ขั้นตอนที่ 3: ฟังก์ชัน "serial.begin"
- ขั้นตอนที่ 4: ฟังก์ชัน "serial.available"
- ขั้นตอนที่ 5: ฟังก์ชัน "serial.read"
- ขั้นตอนที่ 6: ฟังก์ชัน "serial.write"
- ขั้นตอนที่ 7: ฟังก์ชันการตั้งค่า
- ขั้นตอนที่ 8: ฟังก์ชันลูปและ ISR
- ขั้นตอนที่ 9: การเดินสายไฟ
- ขั้นตอนที่ 10: รวมทุกอย่างเข้าด้วยกัน
วีดีโอ: Arduino Tone Generator ที่ไม่มีไลบรารี่หรือฟังก์ชั่นแบบอนุกรม (พร้อมอินเตอร์รัปต์): 10 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:07
นี่ไม่ใช่สิ่งที่ฉันมักจะสอนได้ ฉันชอบงานโลหะมากกว่า แต่เนื่องจากฉันเป็นนักศึกษาวิศวกรรมไฟฟ้าและต้องเรียนวิชาเกี่ยวกับไมโครคอนโทรลเลอร์ (การออกแบบระบบฝังตัว) ฉันคิดว่าฉันจะสอนได้ หนึ่งในโครงการของฉัน เมื่อตอนแรกฉันสร้างโปรเจ็กต์และอื่น ๆ สำหรับคลาสนี้ ฉันพบว่ามีบทช่วยสอนน้อยมากหรือไม่มีเลยที่ไม่ได้ใช้ฟังก์ชันไลบรารี Arduino หรือฟังก์ชันซีเรียล ซึ่งเป็นอีกเหตุผลที่ฉันคิดว่านี่จะเป็นบทเรียนที่ดี
รหัสนี้ออกแบบมาสำหรับไมโครคอนโทรลเลอร์ Atmega 2560 ดังนั้นหากคุณต้องการนำไปใช้กับบอร์ดอื่น คุณจะต้องเปลี่ยนการลงทะเบียนที่อยู่ในโค้ดตามคู่มือผู้ใช้คอนโทรลเลอร์ของคุณ แนวคิดพื้นฐานเบื้องหลังโค้ดคือเมื่อใดก็ตามที่คุณป้อนคีย์บนแป้นพิมพ์ลงในจอภาพแบบอนุกรม Arduino mega จะส่งสัญญาณความถี่ที่แน่นอนตามคีย์ที่คุณกด โดย "q" จะรีเซ็ตมัน ฉันสร้างมันขึ้นมาเพื่อให้ "a" ส่งออกความถี่ A แบบแบน และ "A" จะส่งความถี่ A แบบชาร์ป "b" ส่งออกค่า B แบบแบน "c" สำหรับ C แบบแบน "C" สำหรับ C แบบชาร์ป และอื่นๆ โค้ดเต็มจะถูกอัปโหลดในตอนท้าย แต่แต่ละขั้นตอนจะแบ่งโค้ดออกเป็นชิ้นๆ เพื่อให้อธิบายได้ง่ายขึ้น
ขั้นตอนที่ 1: การกำหนดที่อยู่ลงทะเบียน
ขั้นตอนนี้ง่าย ถ้าคุณใช้ atmega 2560 คุณเพียงแค่ต้องใช้ที่อยู่ที่ฉันใช้ แม้ว่าคุณจะใช้บอร์ดที่มีชิปตัวอื่น คุณจะต้องค้นหาที่อยู่สำหรับการลงทะเบียนแต่ละรายการเหล่านี้ใน คู่มือผู้ใช้ชิป คำจำกัดความที่ด้านบนเป็นเพียงค่าคงที่ที่จะใช้สำหรับฟังก์ชันของเราในภายหลัง เราระบุที่อยู่ว่าไม่ได้ลงนามเนื่องจากเราไม่ต้องการให้คอมไพเลอร์ยุ่งกับมัน
ขั้นตอนที่ 2: อาร์เรย์และตัวแปรส่วนกลาง
ที่นี่เราต้องการกำหนดอาร์เรย์ความถี่ซึ่งจะมีความถี่ทั้งหมดที่แต่ละคีย์ควรส่งออก ค่าเหล่านี้คำนวณจากความถี่ของโน้ตจริง และจริงๆ แล้วฉันลืมไปว่าได้มาอย่างไร แต่เป็นค่าที่ถูกต้องเมื่อฉันทดสอบมันบนออสซิลโลสโคปเพื่อให้แน่ใจ เรายังกำหนดอาร์เรย์บันทึกย่อซึ่งมีปุ่มทั้งหมดสำหรับกดสำหรับแต่ละโทน รวมถึงตัวแปรที่เราต้องใช้สำหรับฟังก์ชันในภายหลัง
ขั้นตอนที่ 3: ฟังก์ชัน "serial.begin"
เราจะเรียกฟังก์ชันแบบกำหนดเองของเราที่จำลองฟังก์ชัน "serial.begin" U0init() ใช้บอดเรตที่ต้องการเป็นอินพุตและเริ่มพอร์ตอนุกรมที่บอดเรตนั้น
ขั้นตอนที่ 4: ฟังก์ชัน "serial.available"
เราจะเรียกฟังก์ชันที่เลียนแบบ "serial.available" U0kbhit() ไม่รับอินพุต แต่จะตรวจพบว่ามีการเปลี่ยนแปลงบนแป้นพิมพ์โดยใช้บิตสถานะ RDA หรือไม่ และคืนค่าเป็น จริง เมื่อตรวจพบการเปลี่ยนแปลง
ขั้นตอนที่ 5: ฟังก์ชัน "serial.read"
เราจะเรียกฟังก์ชันที่เลียนแบบฟังก์ชัน "serial.read" U0getchar() ซึ่งไม่รับอินพุตและเอาต์พุตใดๆ ที่เปลี่ยนแปลงบนแป้นพิมพ์ ซึ่งเก็บไว้ในรีจิสเตอร์ UDR0
ขั้นตอนที่ 6: ฟังก์ชัน "serial.write"
เราจะเรียกใช้ฟังก์ชันที่เลียนแบบ "serial.write" U0putchar() ซึ่งรับข้อมูลจากการลงทะเบียน UDR0 ในขณะที่ตรวจพบและจัดเก็บการเปลี่ยนแปลง และเอาต์พุตที่เปลี่ยนกลับเป็นจอภาพแบบอนุกรม
ขั้นตอนที่ 7: ฟังก์ชันการตั้งค่า
นี่คือฟังก์ชันการตั้งค่าพื้นฐานที่จะใช้การเลียนแบบ "serial.begin" เพื่อเริ่มต้นพอร์ตอนุกรม และจะเริ่มต้นการตั้งค่าบิตของเราสำหรับการลงทะเบียนตัวจับเวลา และตั้งค่า PB6 ให้ส่งสัญญาณเสียงของเรา
ขั้นตอนที่ 8: ฟังก์ชันลูปและ ISR
วนรอบทำงานดังนี้: หากตรวจพบการเปลี่ยนแปลงด้วยฟังก์ชัน "serial.available" ฟังก์ชัน "serial.read" ของเราจะเก็บการเปลี่ยนแปลงนั้นไว้ และฟังก์ชัน "serial.write" ของเราจะใส่การเปลี่ยนแปลงนั้นลงในมอนิเตอร์แบบอนุกรม ตราบใดที่ตัวแปร i น้อยกว่าขนาดของอาร์เรย์ความถี่ มันจะตั้งค่าเอาต์พุตให้เป็นตำแหน่งของ i ในอาร์เรย์นั้น เอาต์พุตความถี่ที่ตำแหน่งนั้น ISR ทำหน้าที่เป็นการรีเซ็ต โดยหากตำแหน่งอาร์เรย์ความถี่ไม่เท่ากับ 0 (หรืออีกนัยหนึ่งถ้าไม่ได้กด "q") จะส่งเอาต์พุตความถี่ออก แต่เมื่อกด "q" ระบบจะรีเซ็ตโปรดทราบ: รหัสนี้ใช้การขัดจังหวะ แต่สามารถทำได้โดยปิดใช้งานการขัดจังหวะ ฉันจะโพสต์โค้ดโดยไม่ขัดจังหวะหากได้รับคำขอใดๆ ฉันคิดว่าเวอร์ชันอินเตอร์รัปต์สนุกกว่า
ขั้นตอนที่ 9: การเดินสายไฟ
การเดินสายสำหรับรหัสนี้ง่ายมาก เพียงใส่สายเอาต์พุตจาก PB6 ไปที่เขียงหั่นขนม ต่อออดหรือลำโพงแบบอนุกรมกับสิ่งนั้น แล้วเชื่อมต่อกลับเข้ากับกราวด์ หมายเหตุ: หากคุณใช้ลำโพง ให้ใส่ตัวต้านทานขนาดเล็กก่อนลำโพง หากคุณต้องการดูเอาต์พุตแต่ไม่ได้ยิน เพียงเชื่อมต่อ PB6 กับสายสีแดงของออสซิลโลสโคปและสายสีดำกับกราวด์
ขั้นตอนที่ 10: รวมทุกอย่างเข้าด้วยกัน
ฉันเพิ่มโค้ดแบบเต็มในขั้นตอนนี้ เนื่องจากฉันได้อธิบายส่วนต่างๆ ทั้งหมดในขั้นตอนก่อนหน้านี้แล้ว เพียงใช้อินพุตคีย์บอร์ดสำหรับความถี่ต่างๆ และเอาต์พุตความถี่นั้นไปที่ PB6 หวังว่าคุณจะสนุกกับการอ่านวิธีอื่นในการเขียนโค้ดด้วย IDE!
โปรดลงคะแนนให้สิ่งนี้ในการแข่งขันไมโครคอนโทรลเลอร์:D
แนะนำ:
วิธีสร้าง Tone Control LM358 สำหรับแอมพลิฟายเออร์ 2.1: 7 ขั้นตอน (พร้อมรูปภาพ)
วิธีสร้าง Tone Control LM358 สำหรับเครื่องขยายเสียง 2.1: ดังนั้นในช่อง Youtube ของฉัน หลายคนถามถึงวิธีการรวมแอมพลิฟายเออร์สองตัวเข้าด้วยกันเป็นหนึ่งเดียว แอมพลิฟายเออร์ตัวแรกใช้สำหรับลำโพงแซทเทิลไลท์และแอมพลิฟายเออร์ตัวที่สองใช้สำหรับลำโพงซับวูฟเฟอร์ การกำหนดค่าการติดตั้งแอมพลิฟายเออร์นี้สามารถเรียกได้ว่า Amp
Arduino Tone Melody อย่างง่าย: 3 ขั้นตอน
Simple Arduino Tone Melody: Simple Arduino Tone Melody เป็นวิธีการเริ่มต้นกับโครงการ Arduino เพราะคุณจะอัปโหลดโค้ดจากซอฟต์แวร์ Arduino โดยตรงเท่านั้นโดยไม่ต้องเขียนอะไรเลย
Simple Tone Generator: 7 ขั้นตอน (พร้อมรูปภาพ)
Simple Tone Generator: Arduino Tone Generator เป็นชุดสวิตช์ที่แชร์เทอร์มินัลทั่วไปกับ GND ในขณะที่พินที่เหลือเชื่อมต่อกับพินดิจิทัล Arduino 2, 3, 4, 5, 6, 7, 8 และ 9 พร้อมลำโพง ติดตั้งระหว่าง GND และพินดิจิตอล 11 จาก Arduino Uno
Arduino Hall Effect Sensor พร้อมอินเตอร์รัปต์: 4 ขั้นตอน
Arduino Hall Effect Sensor พร้อมอินเตอร์รัปต์: สวัสดีทุกคน วันนี้ผมจะแสดงให้คุณเห็นว่าคุณสามารถเชื่อมต่อเซนเซอร์ Hall Effect กับ Arduino และใช้งานได้อย่างไรด้วยการขัดจังหวะเครื่องมือและวัสดุที่ใช้ในวิดีโอ (ลิงก์พันธมิตร): Arduino Uno: http ://s.click.aliexpress.com/e/biNyW0zKHall เซนเซอร์เอฟเฟกต์: h
Arduino Synth / Tone Generator: 5 ขั้นตอน
Arduino Synth / Tone Generator: นี่คือ Synth / Tone Generator ที่ใช้คำสั่ง Tone ที่มีอยู่ใน Arduino มีคีย์เฉพาะ 12 ปุ่มที่สามารถตั้งค่าให้เล่นความถี่คลื่นสี่เหลี่ยมใดก็ได้ มันมีความสามารถในการขึ้นและลงอ็อกเทฟด้วยปุ่ม นอกจากนี้ยังมีส