ในคลิปนี้พี่จะมาสอนวิธีใช้ Arduino ปล่อยเสียงเพลงด้วยลำโพงกับตัวต้านทาน (Resistor) ตัวเดียวจบ
เหมือนโปรเจกต์อื่นๆ ที่มันสร้างโน้ตเปียโนออกมา แต่ที่เจ๋งกว่าคือเราไม่ต้องใช้ตารางหา frequency แบบ lookup table เลย! เราจะใช้สูตรคำนวณแทน สูตรนี้รับเลข 1 ถึง 88 ซึ่งตรงกับคีย์บนเปียโน 88 คีย์เป๊ะๆ
Arduino library มีฟังก์ชัน tone() ไว้สร้างเสียงคลื่นสี่เหลี่ยม (square-wave) แต่มันดันสร้างเสียงต่ำกว่า 31Hz ไม่ได้! ในขณะที่เปียโน 88 คีย์มีโน้ตหลายตัวที่ความถี่ต่ำกว่านั้น ถ้าอยากได้เสียงครบทุกคีย์ เราต้องหาทางอื่น พี่จะสอนให้ใช้ delay ธรรมดาๆ สร้าง square-wave เองเลย
โปรเจกต์นี้ทำงานระดับไมโครวินาที (หนึ่งในล้านส่วนของวินาที) เราเลยใช้ฟังก์ชัน delayMicroseconds() เยอะมาก แต่ปัญหามันก็มี เพราะฟังก์ชันนี้ delay นานเกินพันไมโครวินาทีไม่ได้เสมอไป ในเมื่อโปรเจกต์เราต้องการ delay นานกว่านั้น พี่ก็จะสอนวิธีแก้ไขให้ด้วย
สุดท้ายแล้วโค้ดโปรเจกต์นี้มันสั้นมากกก จนเกือบแสดงหมดในหน้าจอเดียว (แล้วแต่เรซูเรชันจอของน้องนะ!) เอาเป็นว่าโค้ดเต็มพร้อมคอมเมนต์พี่แปะไว้ใน description ของคลิปแล้ว ไปดูกันได้
หวังว่าน้องๆ จะสนุกกับโปรเจกต์นี้นะ!
ลิงก์สอนติดตั้ง Arduino IDE บน Ubuntu
ถอดรหัสโน้ตเพลง: สร้างเสียงดนตรีด้วย Arduino
จะให้ Arduino ร้อง "ปี๊บ" สุ่มๆ เนี่ยง่ายจะตาย แต่ถ้าจะให้มันเล่นเพลง "Super Mario Bros." ที่ใครๆ ก็จำได้ล่ะก็ ต้องแปลงโน้ตดนตรีให้เป็นค่าคงที่ทางคณิตศาสตร์ซะก่อน How to make music with an Arduino คือคู่มือขั้นเทพที่จะแปลงแนวคิดจากโน้ตเปียโน (Quarter Notes, BPM, Octaves) ให้กลายเป็นอาร์เรย์ C++ ที่ทำงานได้แม่นยำเป๊ะเวอร์
มาตรฐานการแปลงโน้ตด้วย <pitches.h> ที่ต้องรู้
ห้ามพิมพ์ tone(8, 261) ด้วยมือเด็ดขาด! มันเสียเวลาและอ่านไม่รู้เรื่อง!
- ใน Arduino IDE มีไฟล์ลับชื่อ
pitches.hอยู่ มันคือดิกชันนารี#defineขนาดใหญ่ - มันแมปคำว่า
NOTE_C4ไว้กับเลข261ตายตัว - อาร์เรย์ทำนอง (Melody Array): เราแต่งเพลงด้วยการมองภาพ!
#include "pitches.h"
int melody[] = {
NOTE_E5, NOTE_E5, 0, NOTE_E5,
0, NOTE_C5, NOTE_E5, 0,
NOTE_G5, 0, 0, 0,
NOTE_G4, 0, 0, 0
};
// ใครอ่านโค้ด C++ นี้ก็รู้ทันทีว่าเป็นธีม Mario!
วงจรความเร็ว BPM แบบคณิตศาสตร์
ถ้าอยากให้อาร์เรย์เล่นเพลงได้ ต้องคำนวณให้เป๊ะว่า Quarter Note นึงยาวกี่มิลลิวินาที
- ประกาศอาร์เรย์ของ Note Types ไว้! (4 = Quarter, 8 = Eighth)
int noteDurations[] = { 8, 8, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4 }; - ลูป
forจะคำนวณความเร็วการทำงานแบบตายตัว:
for (int i = 0; i < 16; i++) {
int duration = 1000 / noteDurations[i]; // เช่น 1000ms / 4 = 250 มิลลิวินาที!
tone(8, melody[i], duration);
delay(duration * 1.30); // ดีเลย์พัก 30% สำคัญมาก ไม่งั้นโน้ตจะติดกันเป็นปลากระป๋อง!
}
- ตัวเลขยิ่งสูง (
1500 / noteDurations) เพลงยิ่งช้าลาก! ตัวเลขยิ่งต่ำ (800 / noteDurations) มาริโอจะกลายเป็นสปีดรันบั๊ก!
ส่วนประกอบหลักของซินธิไซเซอร์
- Arduino Uno/Nano (ทำงานมาตรฐาน)
- Passive Piezo Buzzer
- ตัวต้านทาน (Resistor) 100 โอห์ม ต่ออนุกรมไว้ป้องกันขา Digital
- ดาวน์โหลดไฟล์
pitches.hลงไปในโฟลเดอร์สเก็ตช์ Arduino โดยตรง (ไฟล์บังคับรัน! ห้ามขาด)