TinyML motion classifier with ESP32-C3 SuperMini and MPU6050 sensor strapped to a wrist, showing motion classification

ขั้นสูง

สร้างตัวจำแนกการเคลื่อนไหว 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

แผนภาพการต่อสาย

VCC → 3V3 GND SDA → GPIO8 SCL → GPIO9 ESP32-C3 SuperMini MPU6050

โค้ดเริ่มต้น

#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);
  }
}

ไม่แน่ใจขั้นตอนไหน? ถามเรา