บทเรียน 4.3 — ควบคุม RGB dot matrix ผ่าน I2C

ควบคุม RGB dot matrix ผ่าน I2C

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

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

เป้าหมาย

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

  1. ส่งคำสั่งไปยัง DFR0522 RGB matrix 8x16 ที่ address 0x10 บน bus 3.3 V
  2. ผสม input จาก potentiometer กับ output บน matrix และจอในงานเดียว
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ก่อนเริ่ม

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

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

แบบฝึกของ Developer Hub ที่เขียนไว้สำหรับบอร์ดฐาน QWA309 โดยตรง — เปิดบน Developer Hub แล้ว flash เฟิร์มแวร์สำเร็จรูปดูก่อนว่าหน้าจอเป็นอย่างไร

  • QWA309 — DFR0522 RGB Dot Matrix — ควบคุม DFRobot DFR0522 RGB matrix 8x16 (I2C 0x10) บน bus 3.3V ร่วมกับ display แสดง clear/fill/pixel/pattern ผ่าน LVGL UI
    README · โค้ด · Developer Hub
  • QWA309 — RGB Matrix FX — เอฟเฟกต์แอนิเมชันบน DFR0522 8x16 (color cycle / pixel sweep / row wipe) auto-cycle + สถานะบน LCD
    README · โค้ด · Developer Hub
  • QWA309 — Pot → RGB Mixer — 3 potentiometers เป็น R/G/B channel (>50% = เปิดสีนั้น) ผสมเป็น 1 ใน 8 สีของ DFR0522 matrix + แสดงบน LCD — รวม SAR pots + RGB I2C
    README · โค้ด · Developer Hub
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด — บอร์ดฐาน QWA309 มีอะไรให้ฝึก

ทั้งสามแบบฝึกควบคุมจอ RGB dot-matrix ตัวเดียวกัน (DFRobot DFR0522) ผ่านไดรเวอร์ I2C ร่วมกันใน rgb_panel.c

ต่างกันที่วิธีสั่งงาน: กดปุ่มสั่งตรง ๆ, แอนิเมชันอัตโนมัติ, และผสมสีจาก potentiometer

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

แนวคิด — DFR0522 คืออะไร คำสั่งมีอะไรบ้าง

จอ RGB dot-matrix 16×8 พิกเซล ที่ I2C address 0x10 รองรับ 8 สี (0–7)

เฟรมคำสั่ง: 0x02 (register) + function byte (clear/fill/pixel) + สี + x + y แพดเป็น RGB_PANEL_TX_SIZE = 51 ไบต์เสมอ

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

แนวคิด — เขียนไดรเวอร์ I2C ระดับไบต์เอง

Cy_SCB_I2C_MasterSendStart() → ลูป MasterWriteByte() ทีละไบต์ → MasterSendStop() เสมอไม่ว่าจะสำเร็จหรือไม่

ทั้งสามแบบฝึกเรียกไดรเวอร์เดียวกันผ่าน rgb_panel_clear/fill/pixel()

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

แนวคิด — ใช้บัสร่วมกับจอ/ทัช ไม่ใช่ sensor I2C

DISPLAY_I2C_CONTROLLER_HW + disp_touch_i2c_controller_context — บัสเดียวกับจอ/ทัชที่ 3.3 V

sensor I2C ของ master อยู่บน 1.8 V domain คนละบัส ต่อผิดอาจสื่อสารไม่ได้หรือขาเสียหาย

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

แนวคิด — ตรวจอุปกรณ์ก่อนเชื่อผล

ปุ่ม "Check 0x10" ส่งแค่ START+address+STOP ดู ACK/NACK

"ADDRESS NACK" = ไม่มีอุปกรณ์ตอบ (สาย/ไฟ/address) ต่างจาก error หลัง address ตอบแล้ว (คำสั่ง/timing)

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

แนวคิด — ผสม R/G/B ด้วยการแพ็กบิต (Pot → RGB Mixer)

raw ≥ MIX_THRESHOLD (2048) → เปิดบิตของช่องนั้น b0=R b1=G b2=B แล้ว cast ตรงเป็น rgb_panel_color_t

เขียนแผงเฉพาะตอนสีเปลี่ยน (color != s_last_color) เพื่อลดภาระบัส

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

แนวคิด — แอนิเมชันด้วย state machine (RGB Matrix FX)

s_frame นับ 0–23 ต่อเอฟเฟกต์ (FX_FRAMES_PER_EFFECT=24) แล้ว s_effect วนมอดุโล 3

Colour Cycle / Pixel Sweep / Row Wipe — ทุกเอฟเฟกต์เรียก rgb_panel ตัวเดียวกัน

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

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

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

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

ตัวอย่างสมบูรณ์ — ไดรเวอร์ I2C ระดับไบต์

rgb_panel.c — ทั้งสามแบบฝึกเรียกไดรเวอร์นี้ร่วมกัน:

status = Cy_SCB_I2C_MasterSendStart(base, RGB_PANEL_I2C_ADDRESS,
                    CY_SCB_I2C_WRITE_XFER,
                    RGB_PANEL_BYTE_TIMEOUT_MS, context);

if (status == CY_SCB_I2C_SUCCESS) {
    for (uint32_t i = 0U; i < RGB_PANEL_TX_SIZE; i++) {
        status = Cy_SCB_I2C_MasterWriteByte(base, tx_buffer[i],
                    RGB_PANEL_BYTE_TIMEOUT_MS, context);
        if (status != CY_SCB_I2C_SUCCESS) { break; }
    }
}

stop_status = Cy_SCB_I2C_MasterSendStop(base,
                RGB_PANEL_BYTE_TIMEOUT_MS, context);
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ตัวอย่างสมบูรณ์ — ผสมสีด้วยการแพ็กบิต

pot_rgb_mixer_ui.c

uint8_t bits = 0U;
for (uint8_t i = 0U; i < 3U; i++) {
    uint16_t raw = mix_read(s_ch[i].ch);
    if (raw >= MIX_THRESHOLD) { bits |= (uint8_t)(1U << i); }
}

rgb_panel_color_t color = (rgb_panel_color_t)bits;
if (color != s_last_color) {
    s_last_color = color;
    (void)rgb_panel_fill(DISPLAY_I2C_CONTROLLER_HW,
                         &disp_touch_i2c_controller_context, color);
}
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

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

  • ต่อ DFR0522 เข้า sensor I2C (1.8 V) แทนบัส 3.3 V ของจอ/ทัช — ต้องใช้ DISPLAY_I2C_CONTROLLER_HW เสมอ
  • สรุปว่า "ADDRESS NACK" กับ error หลังจากนั้นคือปัญหาเดียวกัน — คนละสาเหตุ (สาย/ไฟ vs คำสั่ง/timing)
  • เขียนแผงทุกรอบโพลโดยไม่เช็กว่าสีเปลี่ยนหรือไม่ — เปลืองบัสที่ใช้ร่วมกับทัช
  • ลืมว่า rgb_panel_fill/pixel() ตรวจขอบเขตพารามิเตอร์และคืน BAD_PARAM ก่อนส่งเสมอ
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

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

แบบฝึกชุด QWA309 ของ Developer Hub (อ้างอิงที่ commit e5c7722) รันบน TESAIoT Dev Kit เท่านั้น เพราะใช้อุปกรณ์บนบอร์ดฐาน

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

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

  • อุปกรณ์สองตัวบน I2C bus เดียวกันแยกกันด้วยอะไร
  • ถ้า matrix ไม่ตอบ ต้องตรวจอะไรก่อน (สาย ไฟ address)

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

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

ไปต่อ

  • ทบทวนเป้าหมายทั้ง 2 ข้อของบทเรียนนี้ก่อนไปต่อ
  • ถ้าตอบคำถามหน้าที่แล้วไม่ได้ครบ กลับไปอ่าน 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

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