Objective
โครงการนี้มีวัตถุประสงค์หลักเพื่อพัฒนาแอปพลิเคชันจำลองการฝึกทักษะดนตรีในรูปแบบ Mixed Reality (MR) บนอุปกรณ์ Meta Quest 2 โดยมุ่งเน้นการบูรณาการระบบซอฟต์แวร์เข้ากับฮาร์ดแวร์ไมโครคอนโทรลเลอร์ ESP32-S3 ที่ทำหน้าที่เป็น USB MIDI Host เพื่อรับส่งข้อมูลจากคีย์บอร์ดภายนอกมาแสดงผลร่วมกับวัตถุเสมือนผ่านระบบ Passthrough การเลือกใช้คีย์บอร์ดแยกอย่าง Yamaha MX61 มีเหตุผลสำคัญเพื่อลดข้อจำกัดด้านคุณภาพและประเภทของเสียงเครื่องดนตรี ช่วยให้ผู้ใช้งานสามารถปรับแต่งหรือนำชุดเสียงที่ต้องการจากเครื่องดนตรีจริงมาต่อพ่วงเพื่อใช้งานได้ทันทีตามความชอบส่วนบุคคล
System Scenario

Designed System Flow Chart

Programming Implementation
1. ส่วนของฮาร์ดแวร์และโปรแกรมควบคุม (ESP32-S3 Bridge) : ทำหน้าที่เป็น Gateway เชื่อมต่อโลกไร้สายเข้ากับเครื่องดนตรีจริงผ่านโปรโตคอล MIDI
ในส่วนนี้เป็นการพัฒนา Firmware บนบอร์ด ESP32-S3 เพื่อทำหน้าที่เป็น “ตัวกลาง” (Gateway) รับข้อมูลจากระบบไร้สายมาควบคุมเครื่องดนตรีจริง
โค้ดและการทำงาน:
void loop() {
usbMidi.update(); // รักษาการเชื่อมต่อกับ Yamaha MX61 ตลอดเวลา
int packetSize = udp.parsePacket(); // ตรวจสอบแพ็กเกจข้อมูลจาก Unity
if (packetSize) {
char buffer[255];
int len = udp.read(buffer, 255);
if (len > 0) {
buffer[len] = 0; // ปิดท้าย String
// แยกข้อความ "note,velocity" ด้วยตัวแบ่งเครื่องหมายจุลภาค (,)
char* ptr = strtok(buffer, ",");
if (ptr != NULL) {
int note = atoi(ptr); // แปลงข้อมูลหมายเลขโน้ต
ptr = strtok(NULL, ",");
if (ptr != NULL) {
int velocity = atoi(ptr); // แปลงข้อมูลน้ำหนักการกด
// ส่งคำสั่ง MIDI ไปยัง Yamaha MX61 ผ่านพอร์ต USB Host
if (velocity > 0) {
usbMidi.noteOn(0, note, velocity); // ส่งสัญญาณเริ่มเล่น
} else {
usbMidi.noteOff(0, note, 0); // ส่งสัญญาณหยุดเล่น
}
}
}
}
}
}
USB MIDI Host Service: ใช้คำสั่ง usbMidi.update() เพื่อประมวลผลคำสั่ง MIDI ที่ค้างอยู่ในคิวและคงสถานะการเชื่อมต่อกับคีย์บอร์ด
String Parsing (strtok): ระบบใช้ฟังก์ชัน strtok ในการ “ชำแหละ” ข้อความ String ที่ได้รับผ่าน WiFi ให้กลายเป็นข้อมูลตัวเลขที่เครื่องดนตรีเข้าใจ
Heartbeat System: มีการใช้คำสั่ง millis() ในการตรวจสอบสถานะการเชื่อมต่อ WiFi ทุก 10 วินาที เพื่อทำกระบวนการ Reconnect หากสัญญาณหลุดระหว่างใช้งาน
2. ส่วนซอฟต์แวร์จำลองและปฏิสัมพันธ์ (Unity Mixed Reality)
ในส่วนนี้เป็นการสร้างระบบตอบสนอง (Interaction) ในโลกเสมือนผสานโลกจริง โดยแบ่งเป็น 3 โมดูลหลัก
ก. ระบบจัดการข้อมูลเครือข่าย (MidiManager.cs)
public void SendMidi(int note, int velocity) {
string msg = $"{note},{velocity}"; // จัดรูปแบบข้อมูลให้ตรงกับที่ ESP32 รอรับ
byte[] data = Encoding.UTF8.GetBytes(msg);
udpClient.Send(data, data.Length, remoteEndPoint); // ส่งข้อมูลไร้สายแบบ UDP
}
UDP Protocol: เลือกใช้โปรโตคอล UDP เนื่องจากมีความเร็วสูงสุดในการรับส่งข้อมูล เหมาะสำหรับการใช้งานที่ต้องการการตอบสนองทันที
ข. ระบบปฏิสัมพันธ์กับผู้ใช้ (PianoKey.cs)
void Update() {
// ใช้ Slerp เพื่อให้คีย์เปียโนยุบตัวอย่างนุ่มนวล
Quaternion target = isPressed ? pressedRotation : restRotation;
keyVisualModel.localRotation = Quaternion.Slerp(keyVisualModel.localRotation, target, Time.deltaTime * speed);
}
public void TriggerKey() {
if (!isPressed) {
isPressed = true;
midiManager.SendMidi(midiNote, 100); // สั่งส่งข้อมูล MIDI เมื่อมีการสัมผัส
}
}
Physical Feedback Simulation: ระบบคำนวณการหมุน (localRotation) ของลิ่มนิ้วแบบ Real-time เพื่อจำลองน้ำหนักการกดเครื่องดนตรีจริง
Trigger Logic: ใช้ OnTriggerEnter ของ Unity ในการตรวจจับมือของผู้ใช้งานเมื่ออยู่ในโหมด Passthrough
ค. ระบบปรับแต่งมุมมอง (KeyboardBillboard.cs)
void LateUpdate() {
Vector3 direction = mainCameraTransform.position - transform.position;
if (direction != Vector3.zero) {
float angle = Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg;
// บังคับแกน X (-90) ให้ราบกับพื้น และหมุนแกน Z ตามผู้เล่น
Quaternion targetRotation = Quaternion.Euler(xFix, 0, angle + zOffset);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * rotationSpeed);
}
}
Axis Constraints: อัลกอริทึมนี้ถูกออกแบบมาเพื่อแก้ปัญหาวัตถุเสมือนเอียงผิดรูป โดยการล็อคแกนหมุนให้ขนานกับพื้นโลก และหมุนเฉพาะทิศทางที่เผชิญหน้ากับผู้ใช้งานเท่านั้น
3. System Integration Summary

จากการทดลองใช้งานจริง ระบบสามารถรับส่งข้อมูลแบบไร้สายจาก Unity ไปยัง ESP32-S3 ได้อย่างแม่นยำ โดยผู้ใช้สามารถสั่งการ Yamaha MX61 ผ่านลิ่มนิ้วเสมือนในโลก MR ได้ทันที ความสำเร็จของโครงงานนี้อยู่ที่การจัดการการรับส่งข้อมูล String ที่มีความหน่วงต่ำและการคำนวณตำแหน่งวัตถุเสมือนให้เสถียรตลอดการเคลื่อนที่ของผู้ใช้งาน
System Implementation Demo
User Evaluation
จากการทดสอบระบบจำลองการเล่นคีย์บอร์ดในรูปแบบ Mixed Reality ร่วมกับกลุ่มผู้ทดสอบที่มีประสบการณ์หลากหลาย ตั้งแต่มือใหม่ไปจนถึงนักดนตรีและนักพัฒนา สามารถสรุปประเด็นสำคัญได้ดังนี้ครับ
1. Technical Performance
ระบบ Billboard & Rotation: ได้รับคะแนนสูงสุดผู้ทดสอบทุกคนเห็นตรงกันว่าคีย์บอร์ดหันหน้าเข้าหาผู้ใช้ได้อย่างถูกต้องและนุ่มนวล
Latency: ทำได้ดีเยี่ยม (เฉลี่ย 4.6/5) การตอบสนองระหว่างการกดในโลกเสมือนและเสียงที่ออกจากเครื่องดนตรีจริงมีความรวดเร็วและลื่นไหล
ความแม่นยำของการกดลิ่ม : อยู่ในเกณฑ์ปานกลาง (เฉลี่ย 3.6/5) แต่เป็นจุดที่ต้องพัฒนาต่อ เนื่องจากผู้ทดสอบยังพบปัญหาเรื่องการกดไม่ค่อยติด
2. ประสบการณ์ผู้ใช้งาน (User Experience)
ความสะดวกในการใช้งาน: ระบบถูกออกแบบมาให้ใช้งานง่ายมาก (เฉลี่ย 5/5) แม้ผู้ที่ไม่เคยใช้ VR มาก่อนก็สามารถเข้าใจและเริ่มใช้งานได้ทันที
ความรู้สึกสมจริง: อยู่ในระดับปานกลาง (เฉลี่ย 2.6/5) เนื่องจากข้อจำกัดด้านภาพของ Passthrough และโมเดลที่ยังดูเป็นวัตถุจำลองลอยอยู่
3. วิเคราะห์ปัญหาที่พบ
ความแม่นยำในการกด: ผู้ทดสอบพบปัญหา “กดไม่โดนคีย์ที่ต้องการ” หรือตำแหน่งการกดไม่ตรงกับลิ่มนิ้วในบางจังหวะ
ความเสถียรของวัตถุ: พบปัญหาโมเดลคีย์บอร์ด “ปลิว” หรือหลุดจากตำแหน่งเดิมเมื่อผู้ใช้มีการก้มมากเกินไปหรือถอดแว่นออก ทำให้ต้องคอย Reset ตำแหน่งใหม่
4. แนวทางการพัฒนาในอนาคต
Internal Audio Synthesis: พัฒนาระบบให้สามารถกำเนิดเสียงได้ในตัวแอปพลิเคชันเอง เพื่อเพิ่มทางเลือกให้ผู้ใช้ที่ต้องการความคล่องตัวโดยไม่ต้องพกพาคีย์บอร์ดจริง
Environment Design: เพิ่มการออกแบบฉากหลัง ให้มีความสวยงามและน่าดึงดูดมากขึ้น เพื่อเพิ่มความรู้สึกสมจริง
Calibration System: ปรับปรุงระบบการล็อคตำแหน่งวัตถุให้มีความเสถียรมากขึ้น เพื่อป้องกันปัญหาโมเดลเคลื่อนที่ผิดตำแหน่งขณะใช้งาน
Acurracy Playing: ปรับปรุงความเม่นยำของการกดลิ่มคีย์บอร์ด ให้ผู้ใช้กดได้เเม่นยำมากขึ้น
ผู้จัดทำ : ศุภสกร วรอุไร 66340500056 หน้าที่ โปรเเกรม

