IMU Display

Lab 7: Real IMU Display

Part 2 - Sensor Visualization

1. โครงสร้างภาพรวมของ Lab

Why? - ทำไมต้องเรียนรู้เรื่องนี้

  • Real Data: เปลี่ยนจาก simulation เป็นข้อมูลจาก sensor จริง (BMI270 Accelerometer)

  • IPC Architecture: เข้าใจการส่งข้อมูลระหว่าง CM33 (sensor core) กับ CM55 (display core)

  • API Transition: เรียนรู้วิธีแก้โค้ดจาก simulation เป็น hardware โดยแก้ไขน้อยที่สุด

  • Error Handling: จัดการกรณี sensor ยังไม่พร้อมอ่านค่า

What? - จะได้เรียนรู้อะไร

  1. Sensor API: ใช้ imu_shared_read_accel() อ่านค่า accelerometer ผ่าน shared memory

  2. Hardware Init: เรียก aic_sensors_init() ก่อนใช้ sensor API

  3. IPC Architecture: CM33 อ่าน BMI270 ผ่าน I2C → เขียน Shared Memory → CM55 อ่านแสดงผล

  4. Error Handling: ตรวจสอบ return value ก่อนใช้ข้อมูล

  5. Debug Throttling: พิมพ์ debug message แบบ throttled ไม่ให้ console ท่วม

How? - จะทำอย่างไร

  1. เพิ่ม aic_sensors_init() ก่อนสร้าง UI

  2. ใน timer callback เปลี่ยนจาก simulate_imu_accel() เป็น imu_shared_read_accel()

  3. เพิ่ม error check: ถ้า return false ให้ skip update

  4. UI code เหมือนกับที่ทำบน PC Simulator (Lab 3)

  5. เพิ่ม debug print แบบ throttled


2. หลักการทำงาน

2.1 CM33-CM55 IPC Architecture

PSoC Edge E84 มี 2 cores ทำงานร่วมกัน: CM33 จัดการ hardware (sensor, GPIO, WiFi) และ CM55 จัดการ display (LVGL). การส่งข้อมูลระหว่าง core ใช้ Shared Memory.

2.2 Simulation vs Hardware - ความแตกต่าง

2.3 UI Layout


3. ฟังก์ชันสำคัญ

3.1 Sensor API Functions

Function
Description
Return

aic_sensors_init()

Initialize sensor subsystem (เรียกครั้งเดียว)

void

imu_shared_read_accel(&ax, &ay, &az)

อ่าน accelerometer ผ่าน shared memory

bool (true=valid)

imu_shared_read_gyro(&gx, &gy, &gz)

อ่าน gyroscope ผ่าน shared memory

bool (true=valid)

3.2 API Signature

3.3 Key Differences: Sim vs HW

รายการ
PC Simulator
Hardware (PSoC Edge)

Init

ไม่ต้อง

aic_sensors_init()

Read

simulate_imu_accel()

imu_shared_read_accel()

Error

Always returns (ค่าจำลอง)

อาจ return false

Data Range

Predictable (sin/cos)

Real noise + gravity

Z-axis

~9.81 constant

~9.81 + noise

Build

CMake + GCC (PC)

ModusToolbox + GCC_ARM

3.4 Include Files


4. โค้ดตัวอย่าง

4.1 Global Variables

4.2 Timer Callback - อ่านค่า IMU จริง

4.3 Main Function


5. องค์ความรู้และเทคนิค

5.1 Error Handling Pattern - ต้องตรวจสอบเสมอ

5.2 Debug Print Throttling

5.3 Shared Memory Debug

5.4 Polling Rate Considerations

5.5 Chart Range for Real IMU Data


6. แบบฝึกหัด

Exercise 1: Tilt Angle Display (Arc Gauge)

โจทย์: คำนวณมุมเอียง (Tilt Angle) จากข้อมูล accelerometer และแสดงเป็น Arc gauge

หลักการ:

Requirements:

  • เพิ่ม Arc gauge 2 วง: Roll และ Pitch

  • Range: -90 ถึง +90 องศา (map เป็น 0-180 สำหรับ arc)

  • แสดงค่ามุมเป็นตัวเลขใต้ arc

  • สี: Roll = แดง, Pitch = น้ำเงิน

การประยุกต์ใช้งานจริง:

  • ระบบ Anti-Tipping ของรถ Forklift ในโรงงาน

  • ระบบเตือนเมื่อโครงสร้างอาคารเอียงเกินกำหนด

  • Drone flight controller แสดงมุมบิน

Hint:

  • ใช้ atan2f() จาก <math.h>

  • M_PI อาจไม่มีใน embedded → ใช้ 3.14159265f

  • Arc range: lv_arc_set_range(arc, 0, 180) → ค่ากลาง 90 = ระดับ


Exercise 2: Motion Detection Alarm

โจทย์: สร้างระบบตรวจจับการสั่นสะเทือน (Vibration Detection) พร้อมระบบเตือน:

Requirements:

  • คำนวณ magnitude: mag = sqrt(ax^2 + ay^2 + az^2)

  • ตั้ง threshold 3 ระดับ:

    • Normal: mag = 9.5-10.1 (สีเขียว)

    • Warning: mag < 9.5 หรือ mag > 10.1 (สีเหลือง)

    • Alarm: mag < 8.0 หรือ mag > 12.0 (สีแดง กระพริบ)

  • แสดง LED indicator บนหน้าจอที่เปลี่ยนสีตามระดับ

  • เก็บจำนวน alarm events แสดงเป็นตัวเลข

  • แสดง magnitude ปัจจุบันและค่า peak

การประยุกต์ใช้งานจริง:

  • ระบบ Vibration Monitoring ของเครื่องจักรในโรงงาน (Predictive Maintenance)

  • ระบบเตือนแผ่นดินไหวพื้นฐาน (Seismic Alert)

  • ตรวจสอบความสมบูรณ์ของโครงสร้าง (Structural Health Monitoring)

Hint:

  • sqrtf() จาก <math.h>

  • LED กระพริบ: ใช้ lv_led_toggle() เมื่อ alarm

  • Peak tracking: if(mag > peak) peak = mag;


7. References


Last updated

Was this helpful?