หน้าแรก ดูโปรเจกต์ทั้งหมด
Intermediate

โปรเจกต์ Machine Learning กับ Nano BLE 33 และ Raspberry Pi

ใน project นี้เราจะมาดูวิธีการทำให้ Arduino Nano 33 BLE เรียนรู้ gestures บางอย่าง และวิธีการนำไป integrate กับ game!

โปรเจกต์ Machine Learning กับ Nano BLE 33 และ Raspberry Pi

รายการอุปกรณ์และเครื่องมือ

1x Nano 33 BLE Sense
-
1x Micro-USB to USB Cable (Generic)
🛒 สั่งซื้อ
1x Raspberry Pi 3 Model B
-
}

รายละเอียดและวิธีทำ

ก่อนอื่น ผมขอขอบคุณทีมงาน Arduino สำหรับการจัดทำโครงสร้างพื้นฐาน (base framework) หากคุณยังไม่มีโอกาสได้ลองศึกษา ผมขอแนะนำให้คุณอ่านรายละเอียดให้ครบถ้วนก่อนที่จะดำเนินการต่อ

Link: https://blog.arduino.cc/2019/10/15/get-started-with-machine-learning-on-arduino/

ขั้นตอนแรกเราจะเริ่มจากการสร้าง Machine Learning Model โดยใช้ Google Colab จากนั้นเราจะนำ Model นั้นไปใส่ใน Arduino IDE เพื่อสร้างและ Upload Sketch ทั้งนี้ Colab เป็น Linux framework สำหรับสร้างไฟล์ Header ที่จำเป็น (model.h) เพื่อนำไปใช้งานร่วมกับ Code

Generating the Data for Machine Learning Model

อันดับแรกเราต้องมี Data เพื่อใช้ Train Model ของเรา ซึ่งจะอยู่ในรูปแบบไฟล์ csv ที่มีจุดข้อมูลต่างๆ อยู่ในคอลัมน์ คุณจำเป็นต้องมี N Dataset สำหรับ N Output

คุณจะพบโปรแกรมสำหรับสร้าง Dataset ได้จากลิงก์แรก ซึ่งก็คือไฟล์ IMU_Capture.ino ให้คุณ Import ไฟล์นี้เข้าสู่ Arduino IDE และ Upload ลงในอุปกรณ์ สำหรับโปรเจกต์นี้ผมเลือกใช้ 3 ท่าทาง ซึ่งหมายถึง 3 Dataset ที่แยกจากกัน

1. ท่าต่อย (Punching move): เคลื่อนที่อุปกรณ์ไปข้างหน้าตรงๆ อย่างระมัดระวังเพื่อให้ได้จุดข้อมูลหนึ่งชุด ซึ่งจะแสดงให้เห็นใน Serial Monitor ระวังอย่าให้อุปกรณ์กระตุกจนเกิดข้อมูลขยะ เพราะจะทำให้ Model ของคุณเสียได้!!!

ทำท่าทางให้สม่ำเสมอประมาณ 10 ถึง 12 Datapoint ทำซ้ำไปเรื่อยๆ จนกว่าจะได้ 10 ชุดที่แตกต่างกันหรือมากกว่านั้นตามที่คุณต้องการ

2. ท่าป้องกัน (Defend move): ใช้จินตนาการของคุณได้เลย แต่ต้องรักษาท่าทางให้สม่ำเสมอสำหรับ 10 ถึง 12 Datapoint และทำซ้ำไปเรื่อยๆ

3. การเคลื่อนที่เป็นวงกลม (Circular Motion)

โปรดจำไว้ว่าเรากำลังฝึกสอนท่าทาง (Gesture) 3 ท่าที่แยกจากกัน ซึ่งจะถูกนำไปใช้ในเกมของเราในภายหลัง หากคุณมีปัญหา คุณสามารถใช้ Dataset ที่ให้ไว้พร้อมกับโปรเจกต์นี้ได้!

Training the Model in Google Collab

โปรดทำตามขั้นตอนในลิงก์ด้านล่างเพื่อเริ่มสร้าง Model ของคุณ

https://colab.research.google.com/github/arduino/ArduinoTensorFlowLiteTutorials/blob/master/GestureToEmoji/arduino_tinyml_workshop.ipynb

เราจะทำไปพร้อมกันทีละขั้นตอน:

ขั้นแรกเราจะรันคำสั่งสองคำสั่งนี้:

!apt-get -qq install xxd

!pip install pandas numpy matplotlib

นี่เป็นการตั้งค่า Linux engine และโหลด Package ที่จำเป็น

จากนั้นเราต้อง Train Neural Network แต่ก่อนหน้านั้นเราจำเป็นต้องแก้ไขข้อมูลและจัดรูปแบบใหม่เพื่อให้ TensorFlow เข้าใจ

Loading Data Set

ตอนนี้ให้โหลดทั้ง 3 Dataset เข้าไปใน Colab และรัน Code ตามลำดับ โค้ดส่วนแรกและส่วนที่สองจะทำการจัดเรียงข้อมูลใหม่ และส่วนที่สามคือขั้นตอนสำคัญที่ Model จะถูก Train (กด Ctrl+Enter เพื่อรัน Code)

Just use your imagination

หากคุณดูที่ Code การ Train คุณจะพบคำสั่งดังต่อไปนี้:

model.add(tf.keras.layers.Dense(15, activation='relu'))

model.add(tf.keras.layers.Dense(NUM_GESTURES, activation='softmax'))

คุณไม่สามารถแก้ไขบรรทัดล่างสุดได้ เนื่องจากจำนวน Output จะต้องตรงกับจำนวน Cell ในเลเยอร์นอกสุด (Output Layer) อย่างไรก็ตาม คุณสามารถเพิ่ม Cell ในเลเยอร์ชั้นใน (Inner Layer) ได้มากเท่าที่ต้องการ เพียงแค่ Copy Paste คำสั่งที่สอง มันจะถูกเพิ่มเข้าไปตามลำดับเป็น Hidden Layer ถัดไป อย่างมากที่สุดการลองผิดลองถูกของคุณอาจทำให้ค่าไม่ลู่เข้า (loss of convergence) ในบางกรณี แต่มันก็น่าสนุกที่จะลอง!

สำหรับตัวอย่างนี้ เราจะใช้ Model มาตรฐาน แต่ไม่ต้องกังวลที่จะลองทำอะไรใหม่ๆ!!!

ในที่สุด เมื่อเรา Train Model เราจะได้ค่า Error ต่ำกว่า 10^(-10) ซึ่งถือว่าดีมาก

จากนั้นให้ทำตามขั้นตอนในอีกสองบล็อกที่เหลือแล้วดาวน์โหลดไฟล์ model.h ของคุณ

Creating the Sketch

ตอนนี้ให้ดาวน์โหลด model.h และ Import เข้าสู่ Arduino IDE

จุดที่มีการเปลี่ยนแปลงคือ ให้ Upload mymodelclassifier และ model2.h หรือ model.h ของคุณ (อย่าลืมเปลี่ยนการประกาศ Header ในไฟล์ที่แนบมากับโปรเจกต์นี้)

Gesture ID Returned

หากคุณดูที่ Code ส่วนหนึ่ง เรากำลังตรวจสอบค่า Output วนไปเรื่อยๆ หากค่ามากกว่า 0.7 จะถือว่าเป็นการตรวจพบท่าทาง และ ID ที่เกี่ยวข้อง (1: Punch, 2: Defend, 3: Summon) จะถูกส่งกลับมา ข้อมูลนี้จะถูกนำไปใช้โดย Raspberry Pi ผ่าน Pyserial เพื่อสั่งการให้เกิด Action ในเกม!

ตอนนี้ถ้าคุณเปิด Serial Terminal คุณจะเห็นตัวเลขที่ตรงกับ

Serial Output

ตอนนี้ถ้าเราเปิด Serial Monitor เราจะเห็น Output สำหรับท่าทางที่เกี่ยวข้อง โปรดทราบว่าจะมีการส่งค่าศูนย์กลับมาหากตรวจไม่พบท่าทางใดเลยที่อยู่ในรายการที่ Train ไว้

อย่าเพิ่งคาดหวังความแม่นยำระดับโลกด้วยข้อมูลเพียง 10 ถึง 12 Datapoint บ่อยครั้งที่ข้อมูลอาจต้องมีเป็นร้อยจุดจากผู้ใช้หลายคนในท่าทางเดียวกัน แต่มันก็น่าจะเพียงพอสำหรับวัตถุประสงค์ของเรา

Game on Raspberry Pi

ต่อไปเราจะสลับมาที่ Raspberry Pi คุณสามารถใช้เกมอะไรก็ได้ จริงๆ แล้วผมแนะนำให้คุณสร้างเกมเองโดยใช้ Pygame เพื่อให้ใช้งาน Model ที่เรา Train มาได้อย่างเต็มที่

อย่างไรก็ตาม สำหรับบทเรียนนี้เราจะใช้เกมต่อไปนี้:

https://www.pygame.org/project-Street+pyghter-1860-3264.html

เครดิตทั้งหมดมอบให้แก่เจ้าของเกมนี้...

สิ่งแรกที่สำคัญที่สุดคือการเชื่อมต่อ Raspberry Pi เข้ากับ Nano BLE ของเราด้วย USB จากนั้นรันคำสั่งต่อไปนี้ใน Terminal เพื่อตรวจสอบหมายเลข COM Port หรือชื่อพอร์ตในระบบ Linux

dmesg | grep -i tty

สำหรับผมคือ ttyAMC0 โปรดเปลี่ยนส่วนนี้ใน Code ตาม COM Port ของคุณ

จากนั้นเราจะเปิด Serial Port และอ่านข้อมูลโดยตั้งค่า Timeout ไว้สั้นๆ เราจะได้รับ String ว่าง 99% ของเวลาทั้งหมด เพื่อให้แน่ใจว่าเกมจะไม่ค้าง เพราะถ้าคุณไปหน่วงขั้นตอนการ Update ข้อมูลทุกอย่างก็จะไม่มีประโยชน์

คุณสามารถไล่ดู Code ได้ เราจะเปิด Serial Port ตามคำสั่งที่แสดงด้านล่าง:

ser.port = "/dev/ttyACM0"

ser.baudrate = 9600

ser.timeout = 0.01 # ปรับให้ต่ำลงหากต้องการ Framerate ที่ลื่นไหลขึ้น

ผมอยากจะบอกให้ชัดเจนว่ามีเทคนิคที่ล้ำสมัยกว่านี้มากเพื่อให้ได้ผลลัพธ์แบบเดียวกัน แต่วิธีที่แสดงที่นี่เป็นวิธีที่ง่ายที่สุดในบรรดาแนวทางทั้งหมด

จากนั้นเราจะเพิ่ม Code เพื่อให้ปุ่มทำงานตามค่าที่ได้รับจาก Serial Port แทนการใช้คีย์บอร์ด โปรดตรวจสอบ Code ใน Round.py

Button to Serial Fooling

เรากำลังเปลี่ยนเกมให้คิดว่ามีการกดปุ่มเกิดขึ้น ทั้งที่จริงๆ แล้วเป็นค่าที่ได้รับมาจาก Serial Port

ดาวน์โหลดเกมจากลิงก์ที่ให้ไว้และแทนที่ Round.py ด้วย Code ของผม (แนบมากับโปรเจกต์นี้)

โปรดลองทำตามและ Compile เกมด้วย Model ของคุณ มาดูกันว่า Nano ของคุณติดตามท่าทางได้ดีแค่ไหน

ข้อผิดพลาดที่พบบ่อย:

1. การวางแนวในทุกท่าทาง: คุณต้องวางแนว Board ให้เหมือนกันขณะทำท่าทางทั้งหมด ไม่เช่นนั้นคุณอาจได้ข้อมูลที่ผิดพลาด ให้ด้านบนของ Board หันไปในทิศทางเดิมเสมอ

2. โปรด Include ไฟล์ Header ที่ถูกต้องและระบุ Serial COM Port ของคุณ มิฉะนั้น Code ของคุณจะไม่สามารถ Compile ได้ หรือที่แย่กว่านั้นคือเกิด Runtime Error

3. ค่าไม่ลู่เข้า (No convergence): ไม่มีคำตอบที่ง่ายสำหรับเรื่องนี้ แต่ Model ต้นฉบับนั้นลู่เข้าได้ค่อนข้างดี!

Code

🔒 ปลดล็อก Code

สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้

รหัสอ้างอิงโปรเจกต์: machine-learning-with-nano-ble-33-raspberry-pi-eb2269
2450 บาท
PromptPay QR Code