Auditory Arrays: Arduino Coffin Dance Theme
จัดไปวัยรุ่น! โปรเจกต์ Arduino Coffin Dance Theme นี้ กลไกการทำงานเหมือนกับโปรเจกต์ Home Alone ทุกประการ มันคือบทเรียนเริ่มต้นที่โคตรจะเหมาะสำหรับการจัดการความถี่แบบอัลกอริทึม เพราะเป็นเพลงที่ใครๆ ก็จำได้นั่นเอง งานของเราคือต้องแปลงเมโลดี้ EDM ที่เร็วและขาดเป็นห้วงๆ ให้กลายเป็นสัญญาณความถี่ (Hz) ทางกายภาพทั้งหมด ด้วยการจัดวาง delay() ให้เป๊ะเว่อร์
Step 1: อุปกรณ์ที่ต้องใช้
ฮาร์ดแวร์
- Arduino Uno / Nano / Leonardo
- เปียโซบัซเซอร์ (Passive Piezoelectric Buzzer) 5V หนึ่งตัว
- สายจัมเปอร์
- ตัวต้านทาน (Resistor) 100 โอห์ม
ซอฟต์แวร์
- Arduino IDE
- Arduino Tone Library
Step 2: วิธีการต่อวงจร
ต่อขาบวก (+) ของเปียโซบัซเซอร์เข้ากับขา D8 ของ Arduino Uno แนะนำให้ต่อตัวต้านทาน 100 โอห์มแบบอนุกรมกับบัซเซอร์ด้วยนะ เพื่อจำกัดกระแสและปกป้องขาของ Arduino ตัวโปรด ห้ามช็อตนะตัวนี้!
สรุปการต่อ: บัซเซอร์ (+) ---> D8 (ผ่านตัวต้านทาน) บัซเซอร์ (-) ---> GND
Step 3: โค้ดและรายละเอียดทางเทคนิค
ก่อนจะเล่นเสียงได้ ต้องติดตั้งไลบรารี Tone ของ Arduino ก่อน ถ้ายังไม่มี สามารถดาวน์โหลดได้จาก Github ถ้าน้องยังไม่รู้วิธีติดตั้งไลบรารีของบุคคลที่สามใน Arduino IDE เวอร์ชันที่ใช้อยู่ ลองไปศึกษาจากคู่มือทางการในเว็บไซต์ Arduino.cc ได้เลย
ด้านล่างนี้จะมีไฟล์ zip ที่บรรจุโค้ด Arduino สำหรับเล่นเพลง Coffin Theme ไว้ให้แล้ว ดาวน์โหลดมาแล้วแตกไฟล์ไว้ในคอมพิวเตอร์ จากนั้นเปิดไฟล์ Coffin_dance_arduino.ino ใน Arduino IDE แล้วอัปโหลดโค้ดลงบอร์ด Arduino ของน้องได้เลย สู้งานนะน้อง!
รายละเอียดเทคนิคเพิ่มเติม (แบบจัดเต็ม)
ฟิสิกส์ของเสียงสตัคคาโต
เพลง EDM แบบ Coffin Dance Theme นี่เล่นแบบเลกาโต (ต่อเนื่องเนียนๆ) ไม่ได้เลยนะ ถ้าโน้ตสองตัวทับกันละก็ เมโลดี้จะกลายเป็นเสียงหอนที่ต่อเนื่องยาวเหยียดแทน
- คำสั่ง
tone()ปกติจะเล่นเสียงต่อเรื่อยๆ จนกว่าเราจะสั่งหยุดด้วยnoTone() - ตรรกะการทำงาน: เราต้องคำนวณความยาวของโน้ตแต่ละตัว (เช่น 200 มิลลิวินาที) ให้แม่น แล้วบังคับให้ CPU หยุดพักอย่างตั้งใจก่อนจะเล่นโน้ตถัดไป!
int noteDuration = 1000 / noteLengths[i]; tone(buzzerPin, melodyHz[i]); delay(noteDuration); noTone(buzzerPin); int silenceGap = noteDuration * 0.3; // ช่องว่าง 30% ที่สำคัญมาก! delay(silenceGap); - ช่องว่าง 30% ระหว่างโน้ตนี่แหละที่สร้างเอฟเฟกต์ "เด้ง" หรือเสียงสตัคคาโตให้กับเพลงอิเล็กทรอนิกส์แดนซ์!
การจัดการหน่วยความจำด้วย PROGMEM
เพลงอิเล็กทรอนิกส์ที่ซับซ้อนนี่มีข้อมูลตัวเลขในอาร์เรย์เป็นพันๆ ตัวสำหรับโน้ตและความยาว
- ถ้าน้องประกาศ
int melody[] = { ... }ตรงๆ คอมไพเลอร์ของ Arduino จะเก็บเพลงทั้งหมดไว้ใน SRAM ขนาดจิ๋ว 2 กิโลไบต์ของ Uno ซึ่งมีโอกาสสูงที่ชิปจะค้างหรือรีสตาร์ท - ทางแก้คือใช้มาโคร
PROGMEM:const int melody[] PROGMEM = { ... }; - การนี้จะบังคับให้ระบบเก็บข้อมูลเพลงไว้ใน Flash Storage ขนาด 32 กิโลไบต์ (เหมือนฮาร์ดดิสก์)
- เวลาที่โค้ดวนลูปเพื่ออ่านข้อมูล ก็จะค่อยๆ ดึงออกมาใช้ทีละน้อยด้วย
pgm_read_word_near(&melody[i])ซึ่งป้องกันไม่ให้ SRAM เกินโหลด
โค้ดสุดท้ายของโปรเจกต์นี้จำเป็นต้องใช้ อาร์เรย์ C++ ที่ซับซ้อนและซ้อนกันหลายชั้น ซึ่งบรรจุข้อมูล MIDI ของเมโลดี้เพลง "Astronomia" (Coffin Dance) ที่ถูกแปลงโน้ตแล้วทั้งหมด โดยโครงสร้างถูกออกแบบมาให้ใช้กับ PROGMEM โดยเฉพาะ
ขั้นตอนที่ 4: ถึงเวลาเล่นเพลงแล้ววว!
เรียบร้อย! พอไฟเข้าแล้ว น้องควรจะได้ยินเสียงโน้ตที่ตรงกับปุ่มกดออกมาจากออด (Buzzer) แล้ว ถ้าเสียงมันเพี้ยนๆ ยังไม่ตรงเป๊ะ น้องสามารถปรับค่าโน้ตในโค้ด Arduino ได้เลย ว่าจะให้เสียงสูงต่ำแค่ไหน หรือจะเปลี่ยนไปเล่นสเกลอื่นก็ได้ โดยการเอาเครื่องหมายคอมเมนต์ออกจากสเกลที่เตรียมไว้ให้ หรือจะแต่งสเกลใหม่เองเลยก็จัดไป! ถ้าน้องทำเครื่องเล่นเพลงของตัวเองเสร็จแล้ว อย่าลืมคอมเมนต์แชร์รูปหรือวิดีโอมาให้พี่ๆ ดูบ้างน้า
ถ้าคลิปนี้ช่วยน้องได้จริงๆ อย่าลืมกดไลค์ให้พี่ด้วยนะ ส่วนใครชอบงานแนวนี้ ก็กดติดตามช่องไว้ เดี๋ยวมีโปรเจคเด็ดๆ มาให้เล่นอีกแน่นอน :)
ชอบก็แชร์ต่อได้เลยวัยรุ่น
ขอบคุณที่อ่านจนจบน้า! สู้งานนะน้อง