กลับไปหน้ารวมไฟล์
tiny-ml-in-interactive-spaces-arduino-x-k-way-challenge-project-e3c116.md

เกี่ยวกับโปรเจคนี้

Arduino ผสม Tiny ML นี่มันเปิดโลกใหม่ให้กับงานศิลปะเลยนะน้อง มันทำให้เราสร้างพื้นที่เล่นดนตรี จัดโชว์ไฟ หรือแม้แต่ประติมากรรมอัจฉริยะที่ขยับตามเราได้เลย

Smart Sculptures หรือประติมากรรมอัจฉริยะเนี่ย มันคืองานศิลปะที่ผสมเทคโนโลยีเข้าไปเพื่อให้มันขยับและโต้ตอบกับเราได้ มันใช้มอเตอร์ เซนเซอร์ และชิ้นส่วนอิเล็กทรอนิกส์อื่นๆ มาทำให้ของที่เคยอยู่นิ่งๆ มีชีวิตขึ้นมา

ตัวอย่างง่ายๆ เลย ถ้าน้องติดบอร์ดที่มีโมเดล ML ไว้บนเสื้อแจ็คเก็ต เวลาน้องขยับตัว มันก็จะตรวจจับการเคลื่อนไหว แล้วตอบสนองด้วยการแสดงแสงสีพร้อมเสียงเพลง ประติมากรรมอัจฉริยะก็จะขยับไปตามจังหวะการเคลื่อนไหวนั้นเลย

สร้างด้วยอะไรบ้าง

สร้างด้วยความรักและแรงบันดาลใจอยากช่วยเหลือเพื่อนมนุษย์ (ฮา) ใช้:

  1. Arduino Nicla Sense ME
  2. Edge Impulse Studio
  3. เสื้อกันฝน K-way สุดคลาสสิค
  4. Edge Impulse CLI
  5. Arduino IDE
  6. Arduino Nano RP2040
  7. Arduino Opla IoT Kit
  8. Raspberry Pi 4 (เอาไว้ลง broker น่ะ)
  9. หุ่นยนต์ (อันนี้ผมใช้เลโก้ประกอบเอง)
  10. บัญชี Spotify
  11. โปรเจคเตอร์หรือจออะไรก็ได้ที่มีพอร์ต HDMI

ขั้นตอนการเซ็ตอัพ

ก่อนจะลงไลบรารีต่างๆ ใน Linux Machine (Debian) ต้องรันคำสั่งพวกนี้ในเทอร์มินัลก่อนนะ อย่าข้าม!

sudo apt update

sudo apt upgrade

อัพเดทเสร็จแล้ว มาลง Mosquitto Broker กันต่อ ด้วยคำสั่งนี้:

sudo apt install -y mosquitto mosquitto-clients

มันจะถามให้กด Y แล้ว Enter เพื่อยืนยันการติดตั้ง พอลงเสร็จแล้ว ต้องไปแก้ไขไฟล์ config นิดนึงเพื่อให้ broker ของเราเป็นแบบ public:

sudo nano /etc/mosquitto/mosquitto.conf

พอเปิดไฟล์ได้แล้ว ให้เลื่อนลงไปที่ท้ายไฟล์เลย (ห้ามไปยุ่งกับส่วนอื่นนะ!) แล้วเพิ่มสองบรรทัดนี้เข้าไป:

listener 1883

allow_anonymous true

เสร็จแล้วกด CTRL-X เพื่อออกและบันทึกไฟล์ กด Y แล้วตามด้วย Enter จากนั้นรีสตาร์ท Mosquitto เพื่อให้การเปลี่ยนแปลงมีผล:

sudo systemctl restart mosquitto

ถ้าอยากให้ Mosquitto เริ่มทำงานอัตโนมัติตอนเปิดเครื่อง ให้รัน:

sudo systemctl enable mosquitto.service

แล้วถ้าอยากเช็คว่า broker ทำงานปกติมั้ย ให้รัน:

mosquitto -v

ต่อไปนี้เวลาจะใช้ Mosquitto broker ในโปรเจคอื่นๆ น้องจะต้องรู้ IP Address ของเครื่อง Linux นะ หาได้โดยรันคำสั่งนี้ใน Terminal:

hostname -I

นอกจากนี้เรายังต้องลงไลบรารีสำหรับ Python เพื่อใช้ใน Thonny อีกตัวนึงคือแพ็คเกจ Paho มันทำให้สคริปต์ Python ของเราสามารถเชื่อมต่อกับ MQTT broker เพื่อส่งและรับข้อความได้ ในโปรเจคนี้ สคริปต์ Python จะส่งข้อความไปหา Arduino Nano และ Arduino WiFi MKR เพื่อสั่งเปิด-ปิด GPIO สำหรับควบคุมไฟและบัซเซอร์

ลง paho-mqtt ด้วยคำสั่งนี้:

sudo pip install paho-mqtt

แล้วอย่าลืมลงไลบรารีพวกนี้ด้วยนะ:

sudo pip3 install python-vlc

sudo pip3 install bluepy

sudo pip3 install buildhat

sudo pip3 install spotipy --upgrade

เซ็ตอัพ Arduino บน Windows

ผมใช้ Arduino IDE 1.8 นะ แล้วก็ลงไลบรารีพวกนี้เพิ่ม:

  1. PubSubClient library
  2. BHY2
  3. WiFi NiNa
  4. MKRIoTCarrier
  5. ArduinoBLE

เซ็ตอัพ Spotify

สำหรับการเซ็ตอัพควบคุม Spotify บน Linux ต้องทำตามขั้นตอนนี้ สร้างบัญชีในเว็บไซต์นักพัฒนา Spotify ก่อน แล้วสร้างโปรเจคใหม่ จากนั้นคลิก EDIT SETTINGS เพื่อทำการเปลี่ยนแปลง ในส่วน Redirect URIs ต้องเพิ่มบรรทัดต่อไปนี้เข้าไป (ซึ่งจะใช้บนเครื่อง Linux ของเรา):

http://localhost:8888/callback

http://localhost:8080

จากนั้นก็ไปที่ลิงก์ต่อไปนี้เลยจ้า:

หน้านี้จะทำให้เราได้ Device ID ที่ต้องใช้ในโค้ดเพื่อสั่งให้เล่นเพลงในอุปกรณ์ที่เราจะตั้งเป็นลำโพง (ไม่จำเป็นต้องเป็นเครื่อง Linux นะ อาจจะเป็นลำโพงที่เชื่อมต่อ Spotify ได้โดยตรงก็ได้) กดปุ่ม GET TOKEN เพื่อดูเมนูถัดไป เลือกตัวเลือกเดิม แล้วกด REQUEST TOKEN ตามรูปเลย

หลังจากนั้นให้กด **TRY IT** มันจะแสดงข้อมูลในช่องสี่เหลี่ยมสีแดง (ตามรูปด้านล่าง) ซึ่งก็คือ `Device ID` และชื่ออุปกรณ์ ให้เช็คให้ดีว่าเราเลือกอุปกรณ์ถูกตัวนะ เวลาทำขั้นตอนนี้ต้องเปิดเพลงในอุปกรณ์นั้นไว้ด้วย Spotify ถึงจะตรวจจับเจอ (รูปด้านล่างพี่เซ็นเซอร์ข้อมูลส่วนตัวออกแล้วนะ อย่าหาว่าไม่ให้ดู)

ต่อมา เราต้องรันสคริปต์ Python นี้ เพื่อล็อกอินด้วยข้อมูลของเราในเครื่อง Linux เพื่อให้สามารถควบคุมอุปกรณ์ปลายทาง (ของพี่คือมือถือ) ให้เล่นเพลงได้ทางไกล พอรันโค้ดแล้ว มันจะได้ลิงก์ออกมาให้เราเอาไปล็อกอินใน Spotify จากนั้นก็ให้คัดลอก URL ที่ได้หลังจากล็อกอินเสร็จ ไปวางในช่องว่างในเทอร์มินัลที่เราใช้รันโค้ดอยู่

ตั้งค่า Edge Impulse และเทรนโมเดล

สำหรับการสร้างโมเดล พี่ใช้โปรเจกต์ **Arduino x K-Way - Outdoor Activity Tracker** ในเว็บเอกสารของ Edge Impulse เป็นแนวทาง ทำตามขั้นตอนทั้งหมดเลย แค่ต้องระวังตอนบันทึกข้อมูลด้วยคำสั่ง `edge-impulse-data-forwarder` หลังจากติดตั้ง Edge Impulse CLI แล้ว มันจะถามชื่อตัวแปร ซึ่งต้องตรงกับโค้ด Arduino ที่ใช้ในเอกสารด้วยนะ รายชื่อตัวแปรมีดังนี้:

accX, accY, accZ, gyrX, gyrY, gyrZ, heading, pitch, roll, rotX, rotY, rotZ, rotW

รูปนี้คือความแม่นยำของโมเดลพี่บนแพลตฟอร์ม Edge Impulse ครับ

และนี่คือโมเดลของพี่บน Edge Impulse Studio ที่น้องต้องเอาไปเพิ่มเป็นไลบรารีใน Arduino IDE หรือจะดาวน์โหลดเป็นไฟล์ ZIP ก็ได้

อย่าลืมดาวน์โหลดมีเดียสำหรับโปรเจกเตอร์ที่ใช้ในโปรเจกต์นี้ด้วยนะ เอาไปใช้ได้เลย

รันสคริปต์ Interactive Spaces

เตรียมโค้ด

ก่อนรัน เราต้องแก้ไขโค้ดบางบรรทัดในไฟล์ **interactivespaces.py** ก่อน อันดับแรกให้เพิ่ม IP Address ของเครื่อง Linux ที่เราตั้ง Mosquitto broker ไว้:

broker_address="192.168.0.0" # ใส่ IP ของ Raspberry Pi ตรงนี้เลยจ้า

อีกอย่างนึงที่ต้องเช็คคือ directory ให้ดีๆ ว่าบรรทัดเล่นไฟล์วิดีโอในเครื่อง Linux ของน้องมันชี้ถูกที่รึเปล่า:

player= vlc.MediaPlayer('/home/pi/Desktop/model4/ink1.mp4')# เปลี่ยน path ให้ตรงกับเครื่องน้องนะ

และอย่าลืมเปลี่ยน MAC address ของบอร์ด Arduino ที่น้องใช้ในบรรทัดนี้ด้วย:

p = btle.Peripheral("1a:b4:c0:25:3a:aa")# ใช้ไฟล์ scanner.py เพื่อหา BLE address ของ NICLA เอานะ

สุดท้ายแล้ว อีกเรื่องที่ต้องบอกคือ เวลาจะอัปโหลดโค้ด น้องต้องติดตั้งและตั้งค่า PlatformIO บน Visual Studio Code ก่อน พอเสร็จแล้วค่อยอัปโหลดไฟล์ Arduino BLE_model ลงไปใน Nicla Sense ME

แล้วก็ตอนอัปโหลดโค้ด น้องต้องติดตั้งไลบรารี BHY2 เวอร์ชัน 1.0.4 ด้วย (เป็นเวอร์ชันที่พี่ใช้แล้วเวิร์ค) จากนั้นให้เข้าไปที่โฟลเดอร์ \libraries\Arduino_BHY2\src แล้วหาไฟล์ชื่อ BoschSensortec.h เปิดมันแล้วเปลี่ยนค่าตรงนี้:

#define WORK_BUFFER_SIZE 2048

เปลี่ยนเป็น:

#define WORK_BUFFER_SIZE    64

การเปลี่ยนค่านี้จะช่วยให้เราอัปโหลดโมเดลของเราไปพร้อมกับไลบรารี BLE บน PlatformIO ได้อย่างราบรื่นขึ้น

ภาพรวมการทำงาน (Workflow)

มาเข้าเรื่องกันดีกว่า ว่าทำงานยังไง เริ่มจากฝั่ง Bluetooth ก่อนนะ เริ่มจากเรามีบอร์ด Nicla ที่มีโมเดลอยู่ บอร์ดนี้จะเชื่อมต่อกับเครื่อง Linux ผ่านโค้ด Python เพื่อรับข้อมูลจาก Arduino ทุกๆ 2 วินาที Arduino จะรันตัว classifier เพื่อตรวจจับการเคลื่อนไหว แล้วอัปเดตผลออกมา สำหรับโปรเจกต์นี้พี่เทรนการเคลื่อนไหวไว้ 3 แบบคือ: กระโดด (Jump), วิ่ง (Run) และ เต้น (Side) ขึ้นอยู่กับที่ตรวจจับได้ มันจะส่งข้อความออกไป

ข้อความที่ว่านี้จะถูกรับเข้ามาเป็นอินพุต และโค้ด Python ตัวเดียวกันจะมีเงื่อนไขเพื่อส่งข้อความที่ต่างกันออกไป (ขึ้นอยู่กับท่าทาง) โดยใช้ MQTT broker จากเครื่อง Linux ออกไปยังเครือข่าย แต่ในสคริปต์เดียวกันนี้ ก็จะรัน video player ขึ้นมาบนเครื่องด้วย โดยเครื่องจะเชื่อมต่อกับโปรเจคเตอร์เพื่อเล่นอนิเมชันที่ตรงกับการเคลื่อนไหวนั้นๆ

ก่อนจะพูดถึง MQTT พี่ต้องบอกว่า บอร์ด Arduino พออัปโหลดโค้ดเสร็จและต่อกับแหล่งจ่ายไฟแล้ว มันจะเชื่อมต่อไปยัง broker โดยตรงและ subscribe ไปที่ channel เพื่อรับข้อความแบบไร้สาย ต่อไปมาดูฝั่ง MQTT กันต่อ พอ Python ส่งข้อความไปยัง broker ที่ channel "dance/lights" บอร์ด Arduino จะได้รับข้อความ "on" และเริ่มทำสิ่งที่โปรแกรมไว้ เช่น เปิดเสียงจาก buzzer หรือให้ไฟ LED กระพริบสีต่างๆ

พี่อยากจะเน้นหน่อยว่าโปรเจกต์นี้ทำขึ้นจากทรัพยากรที่มีในตอนนั้น แต่มันไม่ใช่ขีดจำกัดนะ ขอบคุณโปรโตคอล MQTT ที่ทำให้เราสามารถขยายระบบให้มีอุปกรณ์ได้มากเท่าที่ broker หรือเซอร์วิสที่ใช้จะรองรับได้

อีกอย่าง Arduino มีผลิตภัณฑ์ใหม่ๆ อีกเพียบที่เอามาใช้กับโปรเจกต์นี้ได้ อย่างเช่นชุดรดน้ำต้นไม้อัตโนมัติ ซึ่งเราสามารถเอามาจำลองเอฟเฟกต์แบบน้ำพุ Bellagio ที่ลาสเวกัส เพื่อเพิ่มลูกเล่นให้โปรเจกต์ได้เลย (พี่ไม่มีเวลาทำตอนนี้ แต่ไว้มีโอกาสจะลองแน่นอน)

และพี่ใช้หุ่นยนต์ Lego ในการทำโปรเจกต์นี้ แต่เราก็สามารถใช้ชุดมอเตอร์สำรองจาก Arduino ร่วมกับการพิมพ์ 3D เพื่อสร้างชิ้นส่วนที่ขยับได้หลากหลายขึ้นได้ และขอบคุณอะแดปเตอร์ขั้วต่อสกรูสำหรับ Arduino Nano ที่ทำให้เราควบคุมมอเตอร์หรือองค์ประกอบอื่นๆ ได้เป็นจำนวนมาก

ทีนี้มีอีกอย่างนึงที่ต้องบอกเพิ่มคือ งานทั้งหมดนี้สามารถแทนที่ด้วย Arduino Cloud ได้เลยจ้า แล้วก็เชื่อมต่อทุกอย่างผ่านเอกสารที่เค้ามีให้สำหรับการใช้คลาวด์ ปัญหาเดียวที่พี่เจอตอนลองทำคือการเชื่อม Nicla เข้ากับคลาวด์ เพราะบอร์ดตัวนี้มีแค่ Bluetooth แต่ก็ไม่ได้หมายความว่าทำไม่ได้นะ Arduino เค้ามีวิธีให้เราเชื่อมบอร์ดเข้ากับคลาวด์อยู่สองทาง ทางแรกคือใช้ Portenta H7 มาคุยกับ Nicla Sense ME ผ่านคอนเนคเตอร์ ESLOV ส่วนทางที่สองที่พี่ลองคือการเอา Arduino Nicla Sense ME ไปใช้เป็น MKR Shield ในเอกสารเดียวกันก็บอกไว้ว่าถ้าเราใช้ Nicla เป็น Shield แล้วปรับแต่งโค้ด ESLOV นิดหน่อย ก็จะสามารถเชื่อมต่อกับคลาวด์ได้เหมือนกัน ซึ่งมันเปิดโลกใหม่เลยนะตัวนี้ พอเชื่อมกับคลาวด์ได้แล้ว เราก็ควบคุมทุกอย่างจากที่ไหนก็ได้ สะดวกสุดๆ

มาเข้าเรื่องสคริปต์กันดีกว่า สคริปต์นี่แหละคือหัวใจของระบบ มันเป็นฐานสำหรับการโต้ตอบของผู้เล่น ทั้งเรื่องการแมปปิ้ง แสง เสียง และการเคลื่อนไหวของประติมากรรมอัจฉริยะระหว่างที่ผู้เล่นขยับตัว สคริปต์ตัวนี้พัฒนาด้วย Python ทั้งหมด โดยทำงานบนพื้นฐานของ VLC, MQTT และการเชื่อมต่อกับ Spotify เพื่อให้การโต้ตอบเป็นไปอย่างลื่นไหลและตรงเวลาพอดี สคริปต์ทำหน้าที่เป็นตัวเล่นแบบเรียลไทม์ การเปิดไฟ การเคลื่อนไหวของประติมากรรม และการเปิดเพลง จะถูกควบคุมผ่านโมเดลที่เราฝึกไว้แล้วและดีพลอยบน Arduino Nicla Sense ME ซึ่งจะส่งข้อมูลผ่านการเชื่อมต่อ Bluetooth ไปยัง Opla Kit และบอร์ด Nano RP2040 แบบไร้สาย โดยใช้ MQTT broker เป็นตัวกลาง

รายละเอียดเทคนิคแบบจัดเต็ม

โปรเจคนี้ที่พัฒนาขึ้นสำหรับ K-WAY interactive challenge เป็นการพิสูจน์แล้วว่าไมโครคอนโทรลเลอร์สมัยนี้ไม่ได้แค่เปิดปิดมอเตอร์อีกต่อไป มันสามารถใช้ Neural Network ที่ฝังอยู่ในตัวเพื่อมองเห็น ฟัง และเข้าใจการเคลื่อนไหวของมนุษย์ได้ โดยไม่ต้องส่งข้อมูลแม้แต่ไบต์เดียวไปยังเซิร์ฟเวอร์บนคลาวด์

หัวใจหลักของระบบคือ

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "1x Arduino IDE 1.8"
  - "1x Edge Impulse Studio"
  - "1x PlatformIO"
author: "fullmakeralchemist"
category: "Sensors & Environment"
components:
  - "1x Arduino Nano RP2040 Connect"
  - "1x Arduino Oplà IoT Kit"
  - "1x Nicla Sense ME"
description: "An intelligent device to track moves with responses during an interactive space with mapping, backlight, music and smart sculptures. This project makes use of a machine learning algorithm capable of tracking and detecting moves to identify associated gesture recognition through a microcontroller. Smart sculptures, lighting, music and video projection to trigger with each assigned gesture, creating a powerful AV experience highlighting the incredible potential of TinyML for the performing arts. This allows the corresponding media set Tiny ML in interactive to play when the right move was made because all these elements interact to create a new experience. This allows us to create Interactive installations, these sculptures use a combination of motors, sensors, and other electronics to create an immersive and interactive experience for the viewer. They may include projections, sound, and other sensory elements to create a complete experience."
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles:
  - "https://github.com/fullmakeralchemist/k_way_challenge_repo/blob/master/codes/pythoncodes/interactivespaces.py"
  - "https://github.com/fullmakeralchemist/k_way_challenge_repo/tree/master/codes/mqttopla"
  - "https://github.com/fullmakeralchemist/k_way_challenge_repo/blob/master/codes/BLE_model/BLE_model.ino"
  - "https://github.com/fullmakeralchemist/k_way_challenge_repo/tree/master/codes"
  - "https://github.com/fullmakeralchemist/k_way_challenge_repo/tree/master/codes/mqtt_nanorp2040"
encryptedPayload: "U2FsdGVkX1/PMB56Pq9WB4My4Gm1WjMo/ITmHU/ksooSLQTpgrpHdKaGuIGPAmieQ0eiRYiaMX7vP36vcnAOE32jEZbwy9w5VXdz4dJ68dBTlVeK4/zwH/gpELyBUbbAz9FkdbrczxVln2b85sa/0LwOXFvhg7ySb2hVcrfQOPoQhC/o2llkMuqCkAGQr1sEVl6PgwfmgQTNUn7sWM7HjDhHa1x75Ou5GRz3ATu5ZRF19fakUBm/eVtUvjVIS7M80sh7n+hYY1T8zb3CplaZhP1sjw96rmJvclSdhAIRn4WfO9ZnsiDzOZukJlRVjf0NtosSMRTARSJbxs8Xoon4La1YxaUQSP/KigD4TwwSnz0FnhcS8894VmfVYzjj68DoLj7URhdjAmYu9wGAP23jlJzF6xhMdiXctOrJwQN+A4jAn6KDiPMsdvdzuou8V+5KYNEo9EImMKeocq4K5TrBiC+CjPG1ZXOQgM7dcQs/G9l9P2Jt1/DfkXC2T3nRXc4sBQoL8Z4itnmKTXg7fxxhFrVGE1fkoY/59+dFs+saqvkFVQAm47vs4KRK8u7Gad53OXIBHrH52Y/JyxI7EHBwm2HpBzSzoi+i9tuabvG/46ia0S3poLmqYVRuGCU3tKauLNAaumIpmH4mrdWIG04dne7eyD1S6iDDRSIktM+xVxbFDm8x+xisT+pV3qELL7I/"
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/tiny-ml-in-interactive-spaces-arduino-x-k-way-challenge-project-e3c116_cover.jpg"
lang: "en"
likes: 3
passwordHash: "587c358234b9fd128190e91e3d5942ea9513e7ab6053ec8d96bbdb4dbad9563d"
price: 299
seoDescription: "Arduino TinyML project using gesture recognition to control smart sculptures and AV in interactive spaces for immersive art experiences."
tags:
  - "Internet Of Things"
  - "Lights"
  - "Music"
  - "Smart appliances"
  - "Wearables"
title: "โปรเจคท้าทาย Arduino X K-WAY: ปลุกจินตนาการด้วย Tiny ML ในโลก Interactive"
tools: []
videoLinks:
  - "https://youtu.be/EDIvJbRfL4I"
  - "https://youtu.be/eCWWFo-Z5EI"
views: 7033