บทเรียน 3.4 — เข็มทิศดิจิทัลจาก BMM350 บน I3C พร้อม calibration

สร้างเข็มทิศดิจิทัลจากเซนเซอร์สนามแม่เหล็ก Bosch BMM350 บน I3C พร้อมฟีเจอร์ปรับแต่ง (hard-iron calibration)

TESAIoT Dev Kit · PSoC Edge E84 · ภาษา C · ModusToolbox

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

เป้าหมาย

เมื่อจบบทเรียนนี้ คุณจะ

  1. อ่านสนามแม่เหล็กจาก BMM350 บน I3C แล้วคำนวณทิศเป็นองศา
  2. ทำ hard-iron calibration และแสดงว่าทิศแม่นขึ้นหลังปรับ
  3. อธิบายว่าโลหะและกระแสไฟรอบบอร์ดรบกวนเข็มทิศอย่างไร
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ก่อนเริ่ม

  • ผ่านบทเรียนก่อนหน้ามาแล้ว: fw-stack.m03.l03
  • บอร์ด: TESAIoT Dev Kit
  • แพลตฟอร์ม: PSoC Edge E84 · ModusToolbox
  • เวลาโดยประมาณ: เนื้อหา 15 + ฝึกตาม 25 + แล็บ 20 + เช็กความเข้าใจ 5 = 65 นาที
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ดูของจริงก่อน

หน้าจอของ EP04 — BMM350 Compass บน TESAIoT Dev Kit

ก่อนอ่านโค้ด ให้ทายว่าหน้าจอนี้มี object อะไรบ้าง และอะไรเปลี่ยนเมื่อผู้ใช้แตะหรือเมื่อค่าเซนเซอร์เปลี่ยน

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด — BMM350 คืออะไร

Magnetometer 3 แกนล่าสุดของ Bosch (2023) — noise 1.4 µT RMS, ช่วง ±2000 µT (คลุมสนามโลก 25-65 µT สบาย)

ต่อผ่าน I3C ตัวแรกในซีรีส์ — เร็วกว่า I2C มี dynamic addressing + in-band interrupt

master เตรียม i3c_controller_init() ให้เหมือน I2C bus ของเซนเซอร์อื่น

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด — บั๊ก vendor ที่ทำให้จอดำค้าง ⚠️

BMM350_SensorAPI v1.10.0 มีบั๊กบน I3C: bmm350_init() ส่ง soft-reset ทำให้เซนเซอร์รีเซ็ตกลับ I2C mode

driver คุยต่อผ่าน I3C กับเซนเซอร์ที่ไม่ฟังแล้ว → บล็อกไม่จบ → LVGL ไม่เริ่ม → จอดำตั้งแต่ boot

เช็ค serial log: มี [BMM350] INIT_OK ตามหลัง [MASTER] I3C init OK ไหม — ถ้าไม่มีต้อง patch ก่อน build

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด — calibration ต้องผ่านสองเงื่อนไข

BMM350_CALIBRATION_SAMPLES = 140 ที่ 120 ms/ตัวอย่าง ≈ 16.8 วินาที (ไม่ใช่ "15 วินาที" กลม ๆ)

แต่ครบจำนวนยังไม่พอ — ต้องมี span ของ X และ Y ≥ BMM350_CALIBRATION_MIN_SPAN_UT = 20 µT ด้วย

วางนิ่งไม่หมุน → span แคบ → calibration ค้างไม่จบแม้ครบ 140 ตัวอย่างแล้ว

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด — ทำ soft-iron scale ด้วย ไม่ใช่แค่ offset

README ต้นทาง: "soft-iron จะไม่ทำ — ต้อง fit ellipsoid ซับซ้อน"

คอมเมนต์ในซอร์ส: "hard-iron + simple soft-iron scale"

โค้ดจริงคำนวณทั้ง offset (จุดกึ่งกลาง) และ scale ต่อแกนจาก span เฉลี่ย — ดึงวงรีให้กลมขึ้นแบบง่าย ๆ

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด — calibration อยู่ RAM เท่านั้น + heading ไม่ชดเชยเอียง

  • ค่า calibration เป็น static ใน RAM — bmm350_reader_init() เคลียร์ทุก boot ต้อง calibrate ใหม่เสมอ
  • atan2f(y, x) ไม่ใช้แกน Z หรือข้อมูลเอียงจาก accel — บอร์ดต้องราบขณะอ่านทิศ
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด — ทักษะที่ฝึกในบทเรียนนี้

บทเรียนนี้พัฒนาทักษะต่อไปนี้ (ตามระดับ 1–5 ของหลักสูตร)

  • sys.sensors-actuators (ระดับ 3)
  • sys.dsp (ระดับ 1)
  • proto.i2c (ระดับ 1)
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ตัวอย่างสมบูรณ์ — ค่าคงที่ calibration ตัวจริง

โค้ดจาก tesaiot/developer-hub (Apache-2.0) · commit 9a8e3ed · bmm350_config.h

/* Runtime heading calibration (hard-iron + simple
 * soft-iron scale). 140 samples @ 120 ms = ~16.8 s. */
#define BMM350_CALIBRATION_SAMPLES             (140U)
#define BMM350_CALIBRATION_MIN_SPAN_UT         (20.0f)

/* Heading axis mapping for board orientation tuning. */
#define BMM350_HEADING_SWAP_XY                 (0U)
#define BMM350_HEADING_X_SIGN                  (1)
#define BMM350_HEADING_Y_SIGN                  (1)
#define BMM350_HEADING_OFFSET_DEG              (0.0f)
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

จุดที่มักพลาด

  • จอดำค้างตั้งแต่ boot → ลืม patch บั๊ก I3C soft-reset ของ BMM350_SensorAPI
  • คิดว่า calibrate เสร็จเมื่อครบเวลา/จำนวน — ต้องหมุนให้ span ≥ 20 µT ด้วย
  • คิดว่า calibration อยู่หลัง reset บอร์ด — จริงอยู่ RAM เท่านั้น หายทุก boot
  • ลืมว่า heading ไม่ชดเชยความเอียง — บอร์ดต้องราบ
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ตัวอย่างสมบูรณ์ — build และ flash

# ในโฟลเดอร์ master template (ดูบทเรียน 1.1)
# 1) ลบไฟล์ของ episode เก่าใน proj_cm55/apps/
# 2) คัดลอกไฟล์ทั้งหมดของ episode นี้ลงใน proj_cm55/apps/
make build
make program     # flash ผ่าน KitProg3

หรือเปิด ตัวอย่างนี้บน Developer Hub แล้ว flash เฟิร์มแวร์สำเร็จรูป

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ฝึกเติม / แล็บ

  1. ทาย ก่อนแก้: เลือกค่าหนึ่งค่าที่ README ของตัวอย่างอธิบายไว้ในส่วน How แล้วเขียนว่าจะเห็นอะไรเปลี่ยนบนจอหรือใน log
  2. แก้และรัน build + flash แล้วเทียบกับที่ทายไว้ ถ้าไม่ตรง ให้หาว่าเข้าใจส่วนไหนผิด
  3. ทำเพิ่ม ต่อยอดหนึ่งอย่างที่ตัวอย่างยังไม่มี แล้วเก็บภาพหรือวิดีโอไว้ใน portfolio
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

เช็กความเข้าใจ

  • hard-iron error คืออะไร และแก้ด้วยวิธีใด
  • ทำไมต้องหมุนบอร์ดให้ครบทุกทิศตอน calibrate
  • I3C ต่างจาก I2C อย่างไรในมุมผู้ใช้งาน

คำตอบอยู่ใน README ของตัวอย่างและในโค้ด ถ้าตอบข้อใดไม่ได้ ให้กลับไปอ่านส่วน Why / What / How อีกครั้ง

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ไปต่อ

  • ทบทวนเป้าหมายทั้ง 3 ข้อของบทเรียนนี้ก่อนไปต่อ
  • ถ้าตอบคำถามหน้าที่แล้วไม่ได้ครบ กลับไปอ่าน README ของตัวอย่างส่วน Why / What / How อีกครั้ง
  • พร้อมแล้วไปเปิดบทเรียนถัดไปในโมดูลเดียวกัน
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แหล่งอ้างอิง

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

เครดิต

"TESAIoT Firmware Stack: เฟิร์มแวร์ภาษา C บน TESAIoT Dev Kit" จาก TESA Open Knowledge โดยสมาคมสมองกลฝังตัวไทย (Thai Embedded Systems Association: TESA) https://github.com/tesaiot/tesa-qualification-program สัญญาอนุญาต CC BY-NC 4.0

ตัวอย่างโค้ดเป็นผลงานของ TESAIoT Firmware Stack โดยสมาคมสมองกลฝังตัวไทย (TESA) ใน tesaiot/developer-hub รายละเอียดการให้เครดิตอยู่ที่ ATTRIBUTION.md

ภาพหน้าจอในสไลด์นี้มาจาก tesaiot/developer-hub (int_ep04_bmm350_compass) ที่ commit 9a8e3ed

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0