Wireless MR Piano

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 หน้าที่ โปรเเกรม