ชื่อโปรเจกต์: มาทำเครื่องเล่นเสียงด้วย Arduino MKRzero กันดีกว่าวัยรุ่น
เมื่อวันก่อนพี่ไปเดินเล่นร้านขายของแต่งบ้านหรูๆ มา เจอไอ้กล่องไม้ตัวหนึ่งพอมันเห็นเราเดินผ่านมันก็ส่งเสียงนกหลงทางร้องจิ๊บๆ ฟังแล้วผ่อนคลายดีนะ แต่พอดูราคาโอ้โห 90 ยูโร (ตั้งสามพันกว่าบาท!)
พี่เลยคิดในใจว่า "ของแค่นี้ทำเองก็ได้เปล่าวะ?" ถึงพี่จะไม่ค่อยได้จับ Arduino มาก่อน แต่ของมันต้องลอง ผลลัพธ์ก็ออกมาหล่อเท่อย่างที่เห็นในรูปนี่แหละ
พี่เริ่มจากหาข้อมูลในเน็ตว่าบอร์ด Arduino ตัวไหนใช้ง่ายและเหมาะกับงานนี้ที่สุด จนไปเจอรีวิวการใช้ Arduino MKRzero เลยตัดสินใจจัดตัวนี้มาลงสนาม
พี่สั่ง Ultrasonic Sensor มาจาก Amazon พร้อมกับลำโพง 5W 4 ohm และ Module ขยายเสียง LM386 มาเตรียมรอไว้เลย
การต่อวงจร (Wiring)
จัดไปวัยรุ่น ต่อสาย Arduino MKRzero เข้ากับ Ultrasonic Sensor ตามนี้เลย:

VCC คือไฟเลี้ยงตัว HC-SR04 ต่อเข้ากับไฟ 5V จาก Arduino ได้เลย
Trig (Trigger) Pin เอาไว้สั่งยิงคลื่นเสียงอัลตร้าโซนิค แค่เราสั่งให้ Pin นี้เป็น HIGH นาน 10µs เซนเซอร์มันก็จะเริ่มทำงานละ
Echo Pin จะเป็น HIGH ตอนเริ่มส่งคลื่น และจะกลับเป็น LOW เมื่อได้รับเสียงสะท้อนกลับมา เราก็แค่วัดเวลาที่มันเป็น HIGH นี่แหละเอามาคำนวณหาระยะทาง
GND คือกราวด์ ต่อเข้าช่อง GND ของ Arduino ห้ามลืมเด็ดขาดนะน้อง
หลังจากนั้นก็ต่อ Module ขยายเสียง LM386 เข้ากับบอร์ด Arduino:

VCC จ่ายไฟให้ Module LM386 ต่อเข้า 5V ของ Arduino
IN Pin อันนี้สำคัญ ต่อเข้ากับช่อง DAC0 ของ Arduino เพื่อส่งสัญญาณเสียงออกไป
GND กราวด์เหมือนเดิม ต่อรวมกันให้หมด
สุดท้ายก็ต่อลำโพง 5W เข้ากับ Module LM386 เป็นอันเสร็จพิธี
SD Card และไฟล์เสียง
ไฟล์เสียงเราจะเก็บไว้ใน SD Card นะวัยรุ่น โดยต้องเป็นฟอร์แมต .wav ที่มีความละเอียด 88200 Hz, 8-bit unsigned PCM mono เท่านั้นนะ ไม่งั้นเสียงไม่มา พี่เตือนแล้วนะ! เราใช้โปรแกรม Audacity แปลงเอาง่ายๆ
พี่ไปอัดเสียงนกในสวนหลังบ้านมา 10 นาที แล้วมาตัดต่อใน Audacity นิดหน่อยก่อนเอาลง Micro SD Card
การเขียน Code
#include <SD.h>
#include <SPI.h>
#include <AudioZero.h>
#include "NewPing.h"
นี่คือการ Include Library ที่จำเป็น:
- SD ไว้จัดการเรื่องอ่านไฟล์จาก SD Card
- Audio Zero ไว้ใช้เล่นเสียง
- NewPing ไว้จัดการ Ultrasonic Sensor (อันนี้ต้องลงเพิ่มเองใน Arduino IDE นะน้อง)
ต่อไปเราจะกำหนดค่า Constant ต่างๆ และตั้งค่า NewPing ให้เริ่มทำงานที่ระยะ 10 ซม. :
// ต่อ HC-SR04 ขา Trig เข้า Pin 7, Echo เข้า Pin 6
#define TRIGGER_PIN 7
#define ECHO_PIN 6
// ระยะสูงสุดที่จะตรวจจับ (หน่วยเป็นเซนติเมตร)
#define MAX_DISTANCE_IN_CM 100
#define TRIGGER_DISTANCE_IN_CM 10
// เซ็ตอัพ NewPing เรื่องขาและระยะทางสูงสุด
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE_IN_CM);
ในส่วนของ Setup เราจะเปิด Serial Port ไว้ดู Debug และเช็คความพร้อมของ SD Card:
void setup() {
// เปิด Serial และรอให้มันเชื่อมต่อ
Serial.begin(SERIAL_PORT);
initSDCard();
}
void initSDCard() {
Serial.println("Initializing SD card...");
// เช็คดูว่าใส่ Card หรือยัง และมันใช้งานได้ไหม
while (!SD.begin(SDCARD_SS_PIN)) {
Serial.println("Card failed, or not present");
delay(2000);
}
Serial.println("card initialized.");
}
แล้วก็มาถึง Loop หลักของเรา:
void loop() {
bool isTriggered = ping();
if(isTriggered){
play("1-birds.wav");
}
delay(500);
}
ฟังก์ชัน ping() จะถูกเรียกในทุกรอบเพื่อเช็คว่ามีคนเดินผ่านหน้าเซนเซอร์ไหม ถ้ามี (isTriggered = true) เราก็จะสั่งเล่นไฟล์เสียง .wav จาก SD Card ทันที:
void play(String filename) {
// เปิดไฟล์จาก SD Card (ย้ำอีกรอบ: 8bit, mono, 88.2 kHz นะน้อง)
File myFile = SD.open(filename);
if (!myFile) {
// ถ้าเปิดไม่ได้ก็โชว์ Error แล้วหยุดเลย
Serial.println("error opening: " + filename);
while (true);
}
AudioZero.begin(SOUND_RATE_HZ);
Serial.println("Playing");
// เล่นไปจนกว่าจะจบไฟล์
AudioZero.play(myFile);
Serial.println("End of file. Thank you for listening!");
AudioZero.end();
}
สรุปและแนวทางพัฒนาต่อ
โดยรวมพี่ถือว่าโปรเจกต์นี้ผ่านนะ หล่อเท่เลยแหละ แต่ถ้าจะให้เนี๊ยบกว่านี้ยังมีจุดที่ต้องแก้อยู่ เช่น:
- แก้เสียง "ป๊อป" ตอนเริ่มและจบไฟล์เสียง
- ลดเสียงฮัมตอนที่ไม่ได้เล่นเพลง
- เพิ่มเสียงนกหลายๆ แบบแล้วสั่งให้มันเล่นสุ่ม (Shuffle)
- ทำกล่องไม้สวยๆ ใส่ซะ จะได้ดูแพงเหมือนตัวละสามพัน!
ข้อมูลทางเทคนิคแบบเจาะลึก
การเล่นเสียงคุณภาพสูงผ่าน I2S
ด้วยพลังของชิป 32-bit ARM Cortex-M0+ บน Arduino MKRZero โปรเจกต์นี้เลยทำงานเหมือนเป็นเครื่องเล่นเสียงดิจิทัลระดับโปรเลยนะ
- Native SD-to-I2S Pipeline: บอร์ด MKRZero มีช่อง SD Card ในตัว และมี Interface I2S (Inter-IC Sound) มาให้ด้วย บอร์ดจะอ่านไฟล์ .WAV หรือ .MP3 แล้วส่งข้อมูลดิจิทัลตรงไปยัง I2S DAC (เช่น MAX98357A) ได้เลย
- DMA-Backed Audio Buffer: เราไม่ได้สั่งให้มันส่งข้อมูลทีละบิตด้วยมือนะ (Bit-banging) แต่มันใช้ระบบ Direct Memory Access (DMA) ทำให้เพลงเล่นลื่นปรื๊ดอยู่ข้างหลัง ในขณะที่ CPU หลักก็ไปทำงานอย่างอื่นได้ เช่น คุมไฟ LED หรือรอรับค่าจากปุ่ม
ไอเดียเอาไปต่อยอด
- Portable Soundboard: สร้างคลังเสียงเอฟเฟกต์แล้วกดปุ่มเล่น เหมาะมากสำหรับทำของเล่นคัสตอม, อุปกรณ์ประกอบฉาก Escape Room หรือพวกงานศิลปะ Interactive เจ๋งๆ จัดไปอย่าให้เสียนะน้อง!