CAPSENSE

Lab 11: CAPSENSE Hardware (Direct I2C)

Part 1 - LVGL Basics + CAPSENSE Touch Controller

1. โครงสร้างภาพรวม (Overview)

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

การอ่าน Touch Sensor ผ่าน I2C โดยตรงจาก CM55 เป็นทักษะสำคัญสำหรับระบบ Embedded:

  • Direct I2C Access: CM55 อ่าน PSoC 4000T โดยตรง ไม่ผ่าน CM33 หรือ IPC

  • Shared Bus Management: จัดการ I2C bus ที่ใช้ร่วมกับ Display Touch Controller

  • Edge Detection: ตรวจจับเฉพาะเมื่อ state เปลี่ยน เพื่อประหยัด CPU

  • Error Handling: จัดการ I2C communication error อย่างถูกวิธี

  • Real Hardware: ต่อยอดจาก Ex10 (Mockup) มาเป็นข้อมูลจริงจาก Sensor

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

  1. I2C Bus Sharing: ปิด Display Touch ก่อนอ่าน CAPSENSE (shared SCB0)

  2. aic_capsense API: aic_capsense_init() + aic_capsense_read()

  3. Edge Detection Pattern: เปรียบเทียบ prev vs current state

  4. I2C Error Recovery: จัดการ 3 สถานะ (OK / Error / No Response)

  5. LED Hardware Control: BTN0 -> Red, BTN1 -> Green, Slider -> Blue PWM

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

  1. เรียก lv_port_indev_disable_touch() ปิด Display Touch (คืน I2C bus)

  2. Initialize GPIO + PWM + CAPSENSE

  3. สร้าง UI เหมือน Ex10 (Slider panel + Button panels)

  4. Timer poll 50ms อ่าน I2C + อัพเดท UI เฉพาะเมื่อ state เปลี่ยน


2. หลักการทำงาน (Technical Principles)

2.1 I2C Bus Sharing Problem

2.2 Data Flow Architecture

2.3 Edge Detection Pattern

2.4 I2C Error Status (Color Coding)

สถานะ
สี
เงื่อนไข

OK

Green (0x00FF00)

aic_capsense_read() return true

Error

Red (0xFF0000)

เคย connected แต่ตอนนี้ read fail

No Response

Yellow (0xFFFF00)

ไม่เคย connect สำเร็จเลย

2.5 UI Layout


3. ฟังก์ชันสำคัญ (API Reference)

3.1 CAPSENSE API

Function
Description
Return

aic_capsense_init()

Initialize I2C สำหรับ CAPSENSE

bool

aic_capsense_read(&data)

อ่านข้อมูลจาก PSoC 4000T

bool

aic_capsense_is_available()

ตรวจว่า CAPSENSE ตอบ I2C

bool

lv_port_indev_disable_touch()

ปิด Display Touch (คืน I2C bus)

void

3.2 CAPSENSE Data Structure

3.3 Hardware LED + LVGL Widget API

Function
Description

aic_gpio_led_set(led, state)

ควบคุม LED ON/OFF (Red, Green)

aic_gpio_pwm_set_brightness(AIC_LED_BLUE, val)

ตั้งความสว่าง Blue LED (0-100)

lv_slider_set_value(slider, val, anim)

ตั้งค่า Slider

lv_obj_remove_flag(slider, LV_OBJ_FLAG_CLICKABLE)

ทำให้ Slider read-only

lv_led_on(led) / lv_led_off(led)

เปิด/ปิด LED widget

lv_led_set_brightness(led, val)

ตั้งความสว่าง LED widget (0-255)


4. โค้ดตัวอย่าง (Code Examples)

4.1 Full CAPSENSE Hardware Code

4.2 Initialization Sequence


5. องค์ความรู้และเทคนิค (Patterns & Tips)

5.1 Pattern: Shared I2C Bus Resolution

5.2 Pattern: Edge Detection for Efficient Updates

5.3 Pattern: Read-Only Slider

5.4 สิ่งที่ต้องระวัง

หัวข้อ
รายละเอียด

Touch Disable

ต้องเรียก lv_port_indev_disable_touch() ก่อน aic_capsense_init()

Init Order

disable_touch -> gpio_init -> pwm_init -> capsense_init

Edge Detection

เปรียบเทียบ prev กับ current ก่อน update UI ทุกครั้ง

Format Specifier

ใช้ (unsigned int) cast กับ %u สำหรับ uint32_t

Read-Only Slider

ต้อง lv_obj_remove_flag(slider, LV_OBJ_FLAG_CLICKABLE)

I2C Address

PSoC 4000T ใช้ address 0x08

No CM33

Ex11 อ่าน I2C โดยตรงจาก CM55 ไม่ต้องใช้ IPC

5.5 Ex10 (Mockup) vs Ex11 (Hardware)

รายการ
Ex10 Mockup
Ex11 Hardware

Data Source

Auto-demo จำลอง

I2C จาก PSoC 4000T จริง

Touch Screen

ใช้ได้ (Manual mode)

ปิด (disable_touch)

Hardware LED

ไม่มี

BTN0->Red, BTN1->Green, Slider->Blue

Error Handling

ไม่จำเป็น

Green/Red/Yellow status

Use Case

พัฒนา UI ไม่มี board

ทดสอบ hardware จริง

5.6 Direct I2C (Ex11) vs IPC (Part 4 Ex9)

รายการ
Direct I2C (Ex11)
IPC (Part 4 Ex9)

Architecture

CM55 อ่าน I2C โดยตรง

CM33 อ่าน -> IPC -> CM55

Complexity

ง่าย (single core)

ซับซ้อน (dual core)

Touch Screen

ใช้ไม่ได้

ใช้ได้ (I2C คนละ bus)

Latency

ต่ำ (direct)

สูงกว่า (IPC overhead)

Scalability

จำกัด (bus sharing)

ดี (CM33 จัดการ I/O)


6. แบบฝึกหัด (Exercises)

แบบฝึกหัดที่ 1: Touch Counter

โจทย์: นับจำนวนครั้งที่กด CAPSENSE Button แต่ละปุ่ม

ข้อกำหนด:

  • นับ BTN0 touch count (rising edge: Released -> Touched)

  • นับ BTN1 touch count แยกกัน

  • แสดง "Count: 15" บน panel แต่ละปุ่ม

  • แสดง Total touches (BTN0 + BTN1) ที่ footer

Hints:

  • ใช้ static uint32_t btn0_count = 0;

  • Rising edge: if (btn0 != prev_btn0 && btn0) คือจังหวะกดใหม่

แบบฝึกหัดที่ 2: CAPSENSE Color Mixer

โจทย์: ใช้ Slider ผสมสี + Buttons เลือก channel R/G/B

ข้อกำหนด:

  • BTN0 กด: สลับ channel (Red -> Green -> Blue -> Red ...)

  • BTN1 กด: Reset channel ปัจจุบันเป็น 0

  • Slider: ปรับค่าสีของ channel ที่เลือก (0-100% -> 0-255)

  • แสดง Color preview panel: lv_color_make(r, g, b)

  • LED hardware แสดง channel ที่กำลังแก้ไข

Hints:

  • static uint8_t rgb[3] = {0, 0, 0}; static int ch = 0;

  • lv_obj_set_style_bg_color(preview, lv_color_make(rgb[0], rgb[1], rgb[2]), 0);

  • rgb[ch] = (uint8_t)(slider_pos * 255 / 100);

Last updated

Was this helpful?