สวัสดีน้องๆ! มาลุยกันเลยคร้าบ คราวนี้เราจะมาเรียนรู้วิธีใช้เซ็นเซอร์ Time-of-Flight ร่วมกับ Edge AI เพื่อเล่นเกมด้วยคีย์บอร์ด โปรเจค "ToF-Gaming" นี้เป็นการลงมือทำจริงจังในเรื่อง Spatio-Temporal Mechatronics และ Edge-AI Gesture Forensics เลยนะเออ
วิธีทำคือ เราจะมาเรียนรู้การใช้เซ็นเซอร์ Time-of-Flight ก่อน จากนั้นก็เก็บข้อมูล เทรนโมเดล AI ด้วย NanoEdge AI Studio และสุดท้ายก็มาดูวิธีควบคุมคีย์บอร์ดเพื่อเล่นเกมกัน
ขั้นตอนที่ 1: เตรียมตัวและวางแผน
เซ็นเซอร์ Time-of-Flight (ToF) จะส่งค่าอาร์เรย์ของระยะห่างออกมา คิดซะว่าเป็นภาพก็ได้ แต่ความละเอียดต่ำมาก (8x8 = 64 พิกเซล)
เซ็นเซอร์พวกนี้จะยิงพัลส์แสงสั้นๆ ออกไป ซึ่งกินเวลาแค่ไม่กี่นาโนวินาที แล้วก็วัดเวลาที่แสงบางส่วนสะท้อนกลับมา เพราะมันทำงานด้วยพัลส์แสง มันจึงทำงานได้ดีกว่าในที่มืดมากกว่าในที่สว่างจ้า ระยะสูงสุดที่เซ็นเซอร์วัดได้ในที่มืดจะอยู่ที่ประมาณ 3 เมตร ถ้าแสงสว่างจ้ามาก เซ็นเซอร์อาจจะทำงานไม่ปกติหรือไม่ทำงานเลยก็ได้
ตอนที่บันทึกข้อมูล น้องจะเห็นชัดเจนเลยว่าเซ็นเซอร์ทำงานตามที่คาดหวังหรือเปล่า แต่จำไว้ว่าให้ใช้ในสภาพแวดล้อมที่แสงไม่จ้ามากเกินไปนะ
เจาะลึกเทคนิค: VL53L5CX Photonic Forensics & Matrix Analytics
- The Time-of-Flight Logic-Hub: เซ็นเซอร์จะปล่อยพัลส์อินฟราเรดที่สั้นกว่านาโนวินาที วัดความล่าช้าของการสะท้อนของโฟตอนเพื่อคำนวณระยะทางแบบสัมบูรณ์ กระบวนการ Forensics เกี่ยวข้องกับการดึงข้อมูลจากเมทริกซ์ $64$-โซนที่ความถี่ $15\text{Hz}$ โดยเน้นที่ความเสถียรของสัญญาณ การวินิจฉัยจะโฟกัสที่ "Ambient-Light Slew-Rate" แม้ว่า ToF จะต้านทานต่อสัญญาณรบกวนแม่เหล็กไฟฟ้า (EMI) ส่วนใหญ่ได้ แต่โฟตอนจากแสงแวดล้อมที่สูงมากๆ ก็อาจทำให้เกิดการพลิกบิต (bit-flip) ในแผนที่ระยะทางได้ ซึ่งจำเป็นต้องมีสภาพแวดล้อมการทำงานที่มีแสงน้อยและเสถียรเพื่อให้สามารถวัดระยะทางได้อย่างต่อเนื่องที่ $\approx 3\text{m}$

การบันทึกข้อมูลที่ดีด้วย ToF นั้นยากอยู่นะ ถ้าอยากได้ข้อมูลดีๆ น้องต้อง:
- อยู่ในที่ที่แสงไม่จ้ามาก
- มีพื้นหลัง (ห่างจากเซ็นเซอร์ไม่เกิน 3 เมตร)
- ต้องยืนอยู่ตรงหน้าเซ็นเซอร์ ToF ให้แน่นอน
เริ่มจากเสียบบอร์ด X-NUCLEO-53L5A1 เข้ากับ Arduino Uno R4 WiFi ก่อน จากนั้นก็ยึดชุดเซ็ตอัพทั้งหมดติดกับผนังด้วย Blu Tack หรืออะไรทำนองนั้น การทำ Structural Signal-Integrity & Mechanical Forensics แบบนี้จะช่วยให้มั่นใจในเรื่อง "Mechanical-Zeroing" ของระนาบเซ็นเซอร์เทียบกับผนังพื้นหลัง ป้องกันข้อผิดพลาดจากพารัลแลกซ์ (parallax-error) ที่ขอบของมุมมอง (Field-of-View หรือ FOV) 5 องศาของเซ็นเซอร์
เพื่อที่จะเล่นมาริโอ้ได้ เราต้องทำ 6 การกระทำ:
- ยืนนิ่ง
- เดินขวา
- เดินซ้าย
- กระโดด
- กระโดดขวา
- กระโดดซ้าย
โดยใช้เมทริกซ์ระยะทางที่เก็บมาจากเซ็นเซอร์ ToF เราสามารถระบุสัญญาณ ตำแหน่ง ท่าทาง หรือตัวบ่งชี้อื่นๆ ที่แตกต่างกันได้
ในกรณีของพี่ พี่พบว่าการยืนอยู่ในโซนต่างๆ ตรงหน้าเซ็นเซอร์ ToF ตามรูปที่แนบมานี้ได้ผลดีเลย:

- โซน 1: กระโดดขวา
- โซน 2: กระโดด
- โซน 3: กระโดดซ้าย
- โซน 4: เดินขวา
- โซน 5: ยืนนิ่ง
- โซน 6: เดินซ้าย
โซน 1, 2 และ 3 จะอยู่ใกล้กับเซ็นเซอร์ ToF ส่วนโซน 4, 5 และ 6 จะอยู่ใกล้กับพื้นหลัง
เจาะลึกเทคนิค: Spatio-Temporal Zone Gating ระบบนี้กำหนดโซนปฏิสัมพันธ์ทางกายภาพทั้ง 6 โซนนี้ กระบวนการ Forensics เกี่ยวข้องกับการแมปความแตกต่างระหว่าง "กระโดดซ้าย" กับ "เดินขวา" โดยอาศัยการประมาณค่าระยะลึก $(1\text{m} \text{ vs. } 3\text{m})$ การวินิจฉัยนี้ทำให้มั่นใจว่าความละเอียดเฟรม $8\times 8$ จะให้ข้อมูลเชิงพื้นที่ (spatial-entropy) เพียงพอสำหรับตัวแยกประเภท N-Class ในการแยกแยะระหว่างฮาร์มอนิกของ "การยืนนิ่ง" และ "การเคลื่อนที่แบบเพิ่มขึ้นทีละน้อย"
เอาล่ะ ตอนนี้เราต้องไปเก็บข้อมูลกันแล้ว มาจัดการให้เรียบร้อย!
ขั้นตอนที่ 2: เก็บข้อมูล
เวลาทำงานกับเซ็นเซอร์ Time-of-Flight (ToF) นะน้อง เราสามารถเลือกได้ว่าจะใช้ข้อมูลเป็นเมทริกซ์ระยะทางเดี่ยวๆ หรือใช้เป็นลำดับของเมทริกซ์หลายอันเพื่อจับการเคลื่อนไหว (gesture) ก็ได้
แต่ในเคสนี้ พี่อยากให้ระบบมันตอบสนองไวที่สุด หมายความว่าต้องเร็วที่สุด เพราะงั้นเราจะใช้แค่เมทริกซ์เดียวจบ

พี่ใช้เครื่องมือ NanoEdge AI Studio ในการสร้างโค้ดสำหรับเก็บข้อมูลจาก ToF ตัวโค้ดพี่แนบไว้ด้านล่างแล้ว แต่ถ้าน้องอยากได้โค้ดแบบเดียวกัน ให้ทำตามนี้:
- เปิด NanoEdge AI Studio
- เข้าไปที่ Data Logger
- เลือกบอร์ด Arduino
- เลือกเซ็นเซอร์ VL53L5CX
พี่ใช้พารามิเตอร์ตามนี้:
- Data rate (Hz): 15Hz (ค่าสูงสุด)
- Frame resolution: 64 (8x8)
- Frames: 1
คลิก Generate Data Logger แล้วน้องจะได้ไฟล์ .zip มา ซึ่งข้างในมีไฟล์ .ino พร้อมอัปโหลดลงบอร์ดได้เลย
คำเตือน:
- น้องต้องติดตั้งไลบรารี SparkFun_VL53L5CX_Library ก่อน
- ไปที่ Sketch > Include Library > Manage libraries... แล้วค้นหา SparkFun_VL53L5CX_Library
ขั้นตอนที่ 3: NanoEdge AI Studio
ทีนี้เราจะมาสร้างโปรเจคใน NanoEdge AI Studio เพื่อเก็บข้อมูลและสร้างโมเดลที่สามารถแยกแยะโซนต่างๆ ที่พี่ยืนอยู่ได้ เพื่อเอาไปเล่นเกมมาริโอต่อไป:
- เปิด NanoEdge AI Studio
- สร้างโปรเจคประเภท N-class classification
ในส่วน Project Settings:

ตั้งแต่เวอร์ชัน 4.5 เป็นต้นมา การตั้งค่าโปรเจคเปลี่ยนไปนิดนึง น้องต้องเลือกว่าทำงานกับข้อมูลแบบ Time series หรือ Cross sectional ง่ายๆ ก็คือข้อมูลเรามีหลายตัวอย่างที่เวลาต่างกันมั้ย ในกรณีเรา เราใช้เฟรม/เมทริกซ์เดียว ไม่เกี่ยวเรื่องเวลา ดังนั้นเลือก Cross sectional
- เลือก Target เป็น Arduino UNO R4 WiFi
- เลือก Cross sectional
- เลือก Time of Flight และความละเอียด 8x8
- คลิก Next
ในส่วน Signals:

ทีนี้เราจะเก็บข้อมูลสำหรับแต่ละโซนโดยใช้การสื่อสารผ่านพอร์ตอนุกรม (serial)
เคล็ดลับคือ เก็บข้อมูลให้หลากหลายที่สุดเท่าที่จะทำได้ ตัวอย่างเช่น เวลาเก็บข้อมูลสำหรับการเคลื่อนที่ไปทางขวา (โซน 4) น้องควรขยับตัวเล็กน้อยภายในโซนนั้น เพื่อจำลองตำแหน่งต่างๆ ที่ควรถูกจัดว่าเป็นโซน 4 ทั้งหมด ยืนจุดต่างๆ ในโซน: ขวาสุด, ขวานิดนึง, ซ้ายนิดนึง, ใกล้เซ็นเซอร์, ไกลเซ็นเซอร์ ฯลฯ
เวลาที่เล่นเกมจริง น้องจะสลับไปมาระหว่างโซน และน้องจะไม่มีทางยืนตำแหน่งเดิมเป๊ะๆ ได้ตลอด
พยายามอย่าให้ข้อมูลของแต่ละคลาสมันทับซ้อนกัน ตัวอย่างเช่น อย่ายืนตำแหน่งเดียวกันตอนเก็บข้อมูลทั้งสำหรับ "ยืนนิ่ง" และ "เดินซ้าย" ไม่งั้นโมเดลจะแยกแยะข้อมูลได้ยาก ส่งผลให้เวลาคุมเกมมันกดผิดๆ ถูกๆ
มาลองเก็บข้อมูลกัน:
- คลิก Add Signal
- คลิก From Serial (usb)
- เลือก COM Port ให้ถูกต้อง
- พยายามยืนอยู่ในโซนที่ต้องการก่อนคลิก Start
- เก็บข้อมูลประมาณ 100-200 สัญญาณในแต่ละโซน ตามที่อธิบายไปด้านบน
- คลิก Stop
- ก่อนนำเข้าข้อมูล น้องสามารถเลือกลบสัญญาณแรกๆ ทิ้งได้ ถ้านึกว่ายังไม่ได้อยู่ในโซนที่ถูกต้องจริงๆ
ทำแบบนี้ให้ครบทั้ง 6 โซนเลย
ในส่วน Benchmark: ส่วน Benchmark นี่คือหัวใจของ NanoEdge AI Studio เลย เราจะใช้ข้อมูลทั้งหมดที่เก็บมา เพื่อหาคอมโบที่ดีที่สุดระหว่างการประมวลผลข้อมูลเบื้องต้น (preprocessing) และโมเดลที่แยกแยะข้อมูลได้แม่นยำที่สุด
- คลิก New Benchmark
- เลือกชุดข้อมูลทั้งหมด
- คลิก Start
ตัว Benchmark จะลองสุ่มคอมโบต่างๆ ระหว่าง preprocessing กับโมเดล แล้วประเมินผลลัพธ์ มันจะแบ่งข้อมูลเป็นชุดฝึก (training) และชุดทดสอบ (testing) หลายรอบเพื่อให้ได้ผลลัพธ์ที่เชื่อถือได้
การทำเบนช์มาร์คอาจใช้เวลาหลายชั่วโมง ขึ้นอยู่กับปริมาณข้อมูลที่ใช้ ถ้าคะแนนถึง 90% ขึ้นไป ก็สามารถหยุดพักหรือหยุดไปเลยแล้วค่อยมาต่อทีหลังได้ เบนช์มาร์คจะพยายามปรับแต่งโมเดลให้ดีที่สุดเท่าที่ทำได้ แต่เราก็หยุดมันได้เมื่อไหร่ก็ได้ที่พอใจแล้ว
เจาะลึกเทคนิค: NanoEdge AI & ฮิวริสติกส์การจำแนกประเภท
- เครื่องยนต์อัจฉริยะแบบตัดขวาง: NanoEdge AI Studio จะเลือกการประมวลผลล่วงหน้า (preprocessing) และสถาปัตยกรรมโมเดลที่ดีที่สุดสำหรับ ARM Cortex-M4 (Uno R4) ให้อัตโนมัติ กระบวนการวิเคราะห์ (Forensics) เกี่ยวข้องกับการ "ทำเบนช์มาร์ค" สัญญาณแบบกำหนดได้ เพื่อให้ได้ฮิวริสติกส์ความแม่นยำที่ $>90%$

ในขั้นตอนการตรวจสอบ (Validation): ระหว่างกระบวนการทำเบนช์มาร์ค ทุกครั้งที่พบไลบรารี่ที่ดีที่สุดใหม่ มันจะถูกเพิ่มเข้าไปในขั้นตอนการตรวจสอบ
เมื่อเรามีไลบรารี่ดีๆ แล้ว เราสามารถทดสอบมันแบบเรียลไทม์ได้ เหมือนกับที่มันถูกดีพลอยบนไมโครคอนโทรลเลอร์จริงๆ เพื่อดูว่ามันทำงานได้ดีไหม
ทำได้โดยคลิกปุ่ม Play ในคอลัมน์ Serial Emulator เลือกพอร์ต COM ที่ถูกต้อง แล้วคลิก Start จากนั้นเราจะสามารถทดสอบโมเดลและดูประสิทธิภาพได้
การวินิจฉัย (Diagnostics) ใช้ "การตรวจสอบด้วย Serial-Emulator" ก่อนการดีพลอยจริงบนซิลิคอน เพื่อให้มั่นใจว่า telemetry id_class ยังคงเสถียรระหว่างการวิเคราะห์การเคลื่อนไหวของมนุษย์แบบไดนามิก
ถ้าสังเกตเห็นว่าบางคลาสถูกจำแนกได้ยาก ก็สามารถกลับไปที่ขั้นตอนการบันทึกข้อมูล (logging) และทำเบนช์มาร์คใหม่ได้ ตัวอย่างเช่น ผมเคยมีปัญหากับคลาส "ยืนนิ่ง" และ "เคลื่อนที่ไปทางขวา" ตอนที่ยืนอยู่ใกล้กับทั้งสองโซน ผมจึงบันทึกข้อมูลใหม่ โดยมั่นใจว่าไม่ได้ยืนอยู่ตำแหน่งเดิมซ้ำ
ในขั้นตอนการคอมไพล์ (Compilation): แค่คลิก Compile เพื่อรับโมเดลที่เทรนเสร็จแล้ว เราจะได้ไฟล์ .zip ที่มีทุกอย่างที่จำเป็นสำหรับขั้นตอนต่อไป
ขั้นตอนที่ 4: ควบคุมคีย์บอร์ด
เพื่อเล่นเกม เราจะใช้ไลบรารี่จาก NanoEdge AI Studio ในการจำแนกประเภทการเคลื่อนไหวที่ต้องการ และใช้ไลบรารี่ Keyboard ของ Arduino ในการส่งอินพุตไปยัง PC เพื่อควบคุมเกม
การใช้คีย์บอร์ดกับบอร์ดอาจทำให้การควบคุม PC ของเรายากขึ้นทันทีที่บอร์ดเริ่มส่งอินพุต เพื่อให้ง่ายขึ้น ผมจึงตั้งดีเลย์ (delay) ไว้ท้ายฟังก์ชัน setup() ดีเลย์นี้จะให้เวลากับเราในการแก้ไขโค้ดและอัพโหลดลงบอร์ด โดยไม่ถูกรบกวนจากอินพุตที่กำลังส่งอยู่
วิศวกรรมและการนำไปใช้: การวิเคราะห์เพื่อลดการขัดจังหวะของลอจิก
เพื่อป้องกันไม่ให้ Arduino "ล็อก" PC ออกในช่วงพัฒนาซอฟต์แวร์ จะมีการบัฟเฟอร์ดีเลย์ $5\text{-second}$ ในฟังก์ชัน setup() กระบวนการวิเคราะห์ (Forensics) นี้ทำให้มั่นใจว่าผู้พัฒนาสามารถออกจากลูปการจำลอง HID ได้อย่างปลอดภัย ก่อนที่การประสานงานของ AI จะเข้าควบคุมโฟกัสของระบบปฏิบัติการ
ฟังก์ชันอินพุตคีย์บอร์ด: เราจะใช้ฟังก์ชันต่อไปนี้ในการส่งอินพุต:
Keyboard.press()delay()Keyboard.releaseAll()
เพื่อเล่นเกมได้อย่างมีประสิทธิภาพ เราต้องหลีกเลี่ยงการส่งปุ่ม 'a' (เลื่อนซ้าย) แค่ครั้งเดียว เพราะการทำแบบนั้นจะทำให้มาริโอเลื่อนไปทางซ้ายเพียงนิดเดียวทุกครั้งที่มีการจำแนกประเภท ซึ่งจะทำให้เคลื่อนที่ต่อเนื่องหรือกระโดดไม่ได้ เราจะใช้ Keyboard.press() ร่วมกับ delay() แล้วค่อยปล่อยปุ่ม
เราจะกดแค่สามปุ่ม:
- 'a' (ซ้าย)
- 'd' (ขวา)
- '0x20' (สเปซสำหรับกระโดด)
เพื่อกระโดดไปทางซ้ายหรือขวา เราจะกดสองปุ่มพร้อมกัน การดีเลย์ 500ms ก่อนปล่อยปุ่มจะทำให้มาริโอกระโดดได้สูงสุด
เราจะใช้คำสั่ง switch() เพื่อกดปุ่มผสมที่ถูกต้องตามคลาสที่ทำนายได้
จัดไปวัยรุ่น! ตรวจสอบให้แน่ใจว่าคลาสและการเคลื่อนไหวในโค้ดตรงกับลำดับของไฟล์ของคุณ (ลำดับนี้จะอธิบายในขั้นตอนถัดไป) อยากรู้ว่าลำดับไลบรารี่ของเราเป็นยังไง รออ่านขั้นตอนถัดไปได้เลย
วิศวกรรมและการนำไปใช้: การจำลองคีย์บอร์ด HID และการวิเคราะห์การซิงค์
- การประสานงานบัฟเฟอร์ HID: Uno R4 WiFi จะจำลองตัวเองเป็นคีย์บอร์ด USB มาตรฐาน กระบวนการวิเคราะห์ (Forensics) เกี่ยวข้องกับการใช้
Keyboard.press()และKeyboard.releaseAll()เพื่อจำลองการเคลื่อนไหวที่ต่อเนื่อง (เช่น กดปุ่ม 'd' ค้างเพื่อให้มาริโอมีโมเมนตัมในการวิ่ง) การวินิจฉัย (Diagnostics) จะเน้นที่ช่วงเวลาดีเลย์ $500\text{ms}$ ซึ่งให้อัตราการตอบสนองที่เหมาะกับมนุษย์ ป้องกันการวินิจฉัยการตัดอินพุต (input-clipping) ในระหว่างการกระโดดเร็วๆ
สู้งานนะน้อง ห้ามช็อตนะตัวนี้!
ขั้นตอนที่ 5: โค้ดสุดท้าย
จะเพิ่ม AI เข้าไปในโค้ด Arduino ของเรา ต้องทำตามนี้เลย:
- เอาไลบรารี่เข้า Arduino IDE
- เอาโค้ดที่แนบมาไปใช้
- แทนที่ตัวแปร
id2class
แค่นั้นแหละ!
เพิ่มไลบรารี่เข้า Arduino IDE: ก่อนอื่นต้องเอาไลบรารี่เข้า Arduino IDE ก่อน วิธีนี้ปลอดภัยไว้ก่อน เผื่อมีไลบรารี่เก่าของ NanoEdge AI อยู่แล้วจะได้ไม่พัง:
- เอาไฟล์ .zip ที่ได้หลังคอมไพล์จาก NanoEdge AI Studio มา
- คัดลอกโฟลเดอร์
nanoedge(จากในYOUR_LIBRARY.zip\arduino\nanoedgeai_for_arduino.zip\) - วางลงใน
Document\Arduino\libraries
อธิบายโค้ดที่แนบมา: ในโค้ดที่แนบมา เขาทำอะไรบ้าง:
- Include
NanoEdgeAI.hและknowledge.h(โมเดลกับฟังก์ชั่น) - เพิ่มตัวแปรที่ NanoEdge ใช้
- เพิ่มฟังก์ชั่นเริ่มต้น (initialization)
- เพิ่มส่วนตรวจจับ (detection)
- เพิ่ม
Keyboard.hและ switch เพื่อสั่งงานตามคลาสที่เจอ
ส่วนที่เพิ่มเข้ามามีแบบนี้:
#include "NanoEdgeAI.h"
#include "knowledge.h"
#include <Keyboard.h>
/* Global variables definitions */
static uint8_t neai_code = 0;
static uint16_t neai_ptr = 0;
static float neai_buffer[SENSOR_FRAME_RESOLUTION * SENSOR_FRAMES] = {0.0};
/* NEAI library variables */
uint16_t id_class = 0; // Point to id class (see argument of neai_classification fct)
float input_user_buffer[DATA_INPUT_USER * AXIS_NUMBER]; // Buffer of input values
float output_class_buffer[CLASS_NUMBER]; // Buffer of class probabilities
const char *id2class[CLASS_NUMBER + 1] = { // Buffer for mapping class id to class name
"unknown",
"dm_jumpcenter",
"dm_jumpleft",
"dm_jumpright",
"dm_left",
"dm_right",
"dm_stand",
};
void setup() {
//some code
//initialize the keyboard usage
Keyboard.begin();
/* Initialize NanoEdgeAI AI */
neai_code = neai_classification_init(knowledge);
if (neai_code != NEAI_OK) {
Serial.print("Not supported board.\n");
}
}
/* Main function: Code run indefinitely */
void loop() {
//classification
neai_classification(neai_buffer, output_class_buffer, &id_class);
//actions to perform based on id_class (the detected class)
switch (id_class) {
case 6:
//stand
Keyboard.releaseAll();
break;
case 4:
//move left
Keyboard.press('q');
break;
case 5:
//move right
Keyboard.press('d');
break;
case 1:
//jump
Keyboard.press(0x20);
break;
case 2:
//jump left
Keyboard.press(0x20);
Keyboard.press('q');
break;
case 3:
//jump right
Keyboard.press(0x20);
Keyboard.press('d');
break;
}
delay(500);
Keyboard.releaseAll();
}
แทนที่ id2class:
ในโค้ดมีตัวแปร id2class ที่เก็บชื่อคลาสและลำดับของมัน
น้องต้องเอา id2class จากโค้ดที่แนบมา ไปแทนที่ด้วยตัวแปรที่อยู่ในไฟล์ NanoEdgeAI.h ในไฟล์ .zip ของน้องเอง:
YOUR_LIBRARY.zip\arduino\nanoedgeai_for_arduino.zip\nanoedgeai\src\NanoEdgeIA.h
ในบทเรียนนี้โดยเฉพาะ น้องต้องไปแก้ไข switch() ในส่วน loop() ของโค้ดด้วย เพื่อให้มันทำตามแอคชั่นที่เราต้องการ ดูในโค้ดด้านบนได้ว่าแต่ละคลาสสอดคล้องกับแอคชั่นอะไร ตัวอย่างเช่น ใน switch ตัวเลือกแรกคือ case 6: เพราะคลาสใน id2class ที่ตรงกับ "stand" อยู่ตัวสุดท้าย (นับเริ่มจาก 0 นะจ๊ะ)
หมายเหตุ: ถ้าเจอ error เรื่อง RAM น้อย อาจเป็นเพราะไลบรารี่ใน NanoEdge ใหญ่ไป กลับไปที่ขั้นตอน VALIDATION ใน NanoEdge แล้วเลือกไลบรารี่ที่เล็กกว่า (คลิกที่มงกุฎด้านขวา) จากนั้นคอมไพล์ใหม่แล้วเอามาแทนที่ใน Arduino IDE อีกรอบ
Step 6: สรุปสั้นๆ อย่าเพิ่งงง
จากที่สอนไป น้องก็ได้รู้วิธีใช้ NanoEdge AI Studio กับเซ็นเซอร์ Time of Flight มาทำเกมเล่นกับคีย์บอร์ด PC แล้วล่ะ โปรเจค ToF-Gaming เนี่ยมันคือสุดยอดของ การวินิจฉัยด้วย Edge-AI แบบอะซิงโครนัส เลยนะตัวนี้! พอเราเชี่ยวชาญเรื่อง การวิเคราะห์พิสูจน์ระยะด้วยเลเซอร์ และ ฮิวริสติกส์การจำแนกคลาส แล้ว โปรเจคนี้ก็จะกลายเป็นอินเทอร์เฟซควบคุมด้วยท่าทางระดับโปรที่เสถียรสุดๆ จัดไปวัยรุ่น! มันให้ความชัดเจนของอินพุตแบบไร้ที่ติผ่านความซับซ้อน... (พูดง่ายๆ คือแม่นยำปรี๊ด!) สู้งานนะน้อง ห้ามช็อตนะตัวนี้!