ขั้นสูง
สร้างตัวจำแนกการเคลื่อนไหว TinyML
เซ็นเซอร์
สอนให้คอนโทรลเลอร์จดจำท่าทางทางกายภาพที่เฉพาะเจาะจง เช่น การเขย่า การแตะ การพลิก ทั้งหมดนี้มาจากข้อมูลการเคลื่อนไหว โดยใช้โมเดลที่ได้รับการฝึกฝนอย่างแท้จริงบนฮาร์ดแวร์ที่มีอยู่ในแคตตาล็อกแล้ว
รวมชิ้นส่วนจริง 2 รายการ
ราคารวมชุดนี้: 885.00 ฿
ยังไม่รวมส่วนลดคำสั่งซื้อที่คุณอาจได้รับตอนชำระเงิน
สิ่งที่คุณต้องใช้
เป้าหมายของโครงการ
โครงการนี้สอนให้ตัวควบคุมรู้จักท่าทางทางกายภาพที่เฉพาะเจาะจงจากข้อมูลการเคลื่อนไหวแบบดิบ ได้แก่ การเขย่า การแตะ การพลิก โดยใช้แบบจำลองการจัดหมวดหมู่ที่ผ่านการฝึกฝนจริงซึ่งทำงานในเครื่องบนเซ็นเซอร์ IMU เดียวกันกับที่ใช้ในการสร้างจอแสดงผลแบบเอียงที่ง่ายกว่าในแคตตาล็อกนี้ เป็นจุดเริ่มต้นที่ชัดเจนและประหยัดที่สุดสำหรับการเข้าสู่ TinyML ในแคตตาล็อกทั้งหมด เนื่องจากไม่ต้องใช้อุปกรณ์ฮาร์ดแวร์ใหม่เลย
ตัวควบคุมทำอะไร
มันจะรวบรวมข้อมูลการเคลื่อนไหวแบบหมุนเวียนสั้นๆ อย่างต่อเนื่อง เรียกใช้แบบจำลองการจัดหมวดหมู่ที่ผ่านการฝึกฝนกับหน้าต่างนั้น และตรวจสอบว่าผลลัพธ์ตรงกับท่าทางที่รู้จักอย่างใกล้ชิดพอที่จะกระตุ้นการทำงานหรือไม่
IMU ทำอะไร
มันจะรายงานค่าการเร่งความเร็วและการหมุนแบบดิบอย่างต่อเนื่อง ซึ่งเป็นข้อมูลเซ็นเซอร์เดียวกับที่ใช้สำหรับการสร้างจอแสดงผลแบบเอียงที่ง่ายกว่า เพียงแค่ป้อนข้อมูลเข้าสู่แบบจำลองที่ผ่านการฝึกฝนที่นี่แทนการคำนวณมุมโดยตรง
แนวคิดซอฟต์แวร์และไลบรารี
สิ่งนี้มีความเกี่ยวข้องมากกว่าการอ่านค่าเซ็นเซอร์โดยตรงอย่างมีนัยสำคัญ: การรวบรวมบันทึกการเคลื่อนไหวตัวอย่างที่มีป้ายกำกับของแต่ละท่าทาง การฝึกแบบจำลองการจัดหมวดหมู่ขนาดเล็กบนข้อมูลนั้น และการแปลงให้อยู่ในรูปแบบที่กะทัดรัดซึ่งทำงานบนตัวควบคุม เริ่มต้นด้วยตัวอย่างสองท่าทางง่ายๆ คือ การเขย่าเทียบกับความนิ่ง ก่อนที่จะลองทำสิ่งที่ซับซ้อนมากขึ้น
การทดสอบและการแก้ไขปัญหา
- แบบจำลองสับสนกับท่าทางที่คล้ายกัน ให้รวบรวมตัวอย่างการฝึกที่ติดป้ายกำกับเพิ่มเติมของแต่ละท่า โดยเฉพาะอย่างยิ่งท่าทางที่มีโปรไฟล์การเคลื่อนไหวที่คล้ายกันอย่างแท้จริง แทนที่จะสันนิษฐานว่าสถาปัตยกรรมของแบบจำลองนั้นเป็นปัญหา
- การจดจำทำงานระหว่างการฝึกแต่ไม่ทำงานในการใช้งานจริง ตรวจสอบให้แน่ใจว่าหน้าต่างการรวบรวมข้อมูลสดตรงกับความยาวและอัตราการสุ่มตัวอย่างเดียวกันกับที่ใช้เมื่อบันทึกข้อมูลการฝึก
- ไม่มีการอ่านค่าเซ็นเซอร์เลย นี่คือ IMU เดียวกันกับที่ใช้ในการสร้างเข็มทิศดิจิทัลและจอแสดงผลแบบเอียง การเดินสายและขั้นตอนการแก้ไขปัญหาเดียวกันสามารถนำไปใช้ได้
การอัปเกรดเสริม
เพิ่มออดจากกล่องอะไหล่เพื่อให้มีการยืนยันด้วยเสียงทุกครั้งที่จดจำท่าทางได้อย่างถูกต้อง เป็นข้อเสนอแนะที่แท้จริงที่ช่วยปิดวงจรสำหรับผู้ใช้งาน
การเดินสาย
- MPU6050 VCC → ESP32-C3 SuperMini 3V3
- MPU6050 GND → ESP32-C3 SuperMini GND
- MPU6050 SDA → ESP32-C3 SuperMini GPIO8 — Arduino-ESP32 I2C SDA เริ่มต้น
- MPU6050 SCL → ESP32-C3 SuperMini GPIO9 — Arduino-ESP32 I2C SCL เริ่มต้น
MPU6050 เป็นเซ็นเซอร์ accelerometer/gyroscope I2C ของแท้ที่ได้รับการสนับสนุนเป็นอย่างดี มีที่อยู่เริ่มต้น 0x68 และ `Adafruit_MPU6050` + `Adafruit_Sensor` เป็นไลบรารี Arduino มาตรฐานและของจริงสำหรับเซ็นเซอร์นี้
ความซื่อสัตย์เกี่ยวกับขอบเขต: ตัวจัดประเภทการเคลื่อนไหว TinyML ที่แท้จริงต้องใช้แบบจำลองที่ผ่านการฝึกฝน — ไม่มีวิธีที่ถูกต้องตามกฎหมายในการ "จัดประเภท" การเคลื่อนไหว (เช่น การเขย่าเทียบกับ การแตะเทียบกับ ความนิ่ง) โดยไม่ได้รับการฝึกฝนจากข้อมูลตัวอย่างที่มีป้ายกำกับก่อน ดังนั้นรหัสเริ่มต้นนี้จึงทำขั้นตอนแรกที่ซื่อสัตย์และถูกต้อง: มันจับตัวอย่าง accelerometer + gyroscope ในอัตราคงที่และพิมพ์ลงบน Serial ในรูปแบบที่คั่นด้วยเครื่องหมายจุลภาคซึ่งเหมาะสำหรับการป้อนเข้าสู่ Data Forwarder ของ Edge Impulse (เครื่องมือมาตรฐานและของจริงในไปป์ไลน์การนำเข้าของ Edge Impulse ที่อ่านสตรีม CSV-over-serial อัตราคงที่ประเภทนี้) ขั้นตอนต่อไปตามธรรมชาติ — การติดป้ายกำกับตัวอย่างการเคลื่อนไหวใน Edge Impulse's Studio การฝึกตัวจัดประเภท และการปรับใช้ไลบรารีการอนุมานที่ได้กลับไปยังบอร์ดนี้ — เป็นเส้นทางที่แท้จริงสู่ตัวจัดประเภทที่แท้จริง; โครงร่างนี้ไม่ได้แกล้งทำเป็นการเรียก `predict()`/inference
แผนภาพการต่อสาย
โค้ดเริ่มต้น
#include <Wire.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#define I2C_SDA_PIN 8
#define I2C_SCL_PIN 9
#define SAMPLE_RATE_HZ 100 // steady rate suitable for Edge Impulse's Data Forwarder
Adafruit_MPU6050 mpu;
void setup() {
Serial.begin(115200);
Wire.begin(I2C_SDA_PIN, I2C_SCL_PIN);
if (!mpu.begin()) {
Serial.println("MPU6050 not found — check wiring/I2C address");
while (1) delay(1000);
}
mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
mpu.setGyroRange(MPU6050_RANGE_500_DEG);
mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
}
void loop() {
static unsigned long lastSample = 0;
unsigned long intervalMs = 1000 / SAMPLE_RATE_HZ;
if (millis() - lastSample >= intervalMs) {
lastSample = millis();
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
// CSV line: accX,accY,accZ,gyroX,gyroY,gyroZ
// Feed this stream into Edge Impulse's Data Forwarder to collect labeled
// training data, then train/deploy an actual classifier — this sketch
// only captures data, it does not classify motions.
Serial.print(a.acceleration.x); Serial.print(",");
Serial.print(a.acceleration.y); Serial.print(",");
Serial.print(a.acceleration.z); Serial.print(",");
Serial.print(g.gyro.x); Serial.print(",");
Serial.print(g.gyro.y); Serial.print(",");
Serial.println(g.gyro.z);
}
}
ไม่แน่ใจขั้นตอนไหน?
ถามเรา