|
SDK สำหรับ TESAIoT Dev Kit
คู่มืออ้างอิง API และ Tutorial (MTB & µPython)
|
ตารางฝั่ง C บนหน้านี้ใช้ได้กับแพ็กเกจทั้ง 2 ตัว ส่วนตารางของ MicroPython มีการกำกับไว้และแสดงเฉพาะในชุดของ mtb-mpy เพราะแพ็กเกจ mtb-only ไม่มีไฟล์ binding mod*.c มาให้เลยแม้แต่ไฟล์เดียว — ดู ตารางเทียบ variant
หน้าสำหรับเปิดหาส่วนที่เรียกใช้ได้ของอุปกรณ์ต่อพ่วง: ทุกการเรียก ค่าที่คืนมา และ flag BSP_HAS_* ที่ตัดสินว่าสิ่งนั้นมีอยู่หรือไม่ Tutorial ต่าง ๆ อธิบาย เหตุผล ส่วนหน้านี้มีไว้เพื่อไม่ต้องกลับไปอ่านบทเหล่านั้นซ้ำอีกรอบ
มีข้อเท็จจริงเรื่องขอบเขต 2 ข้อที่กำกับทุกอย่างด้านล่างนี้ และควรระบุไว้ก่อนตารางแรก
bsps/TARGET_KIT_PSE84_AI/bsp_features.mk เป็นไฟล์ของบอร์ดไฟล์เดียวในแพ็กเกจ flag ที่ไม่ได้ตั้งค่าจะมีค่าเริ่มต้นเป็น 0 ใน bento_libs/claw/common/shared/include/bsp_feature_flags.h
| Flag | ค่าบนบอร์ดนี้ | บรรทัด | ควบคุมอะไร |
|---|---|---|---|
| BSP_HAS_BMI270 | 1 | :12 | ไดรเวอร์ IMU และโมดูลย่อย bmi270 |
| BSP_HAS_BMM350 | 1 | :13 | แมกนีโตมิเตอร์ และ bmm350_diag / bmm350_debug |
| BSP_HAS_DPS368 | 1 | :16 | บารอมิเตอร์ |
| BSP_HAS_SHT40 | 1 | :17 | ความชื้นและอุณหภูมิ |
| BSP_HAS_RADAR | 1 | :18 | การเรียกของเรดาร์ 3 ตัว (task BGT60TR13C บน CM55) |
| BSP_HAS_QWA309_BASEBOARD | 1 | :25 | pots, buttons, rgbmatrix, header, can, shield |
| BSP_HAS_CAPSENSE | 1 | :32 | CapSense 4000T ผ่าน I2C |
| BSP_HAS_POTENTIOMETER | 1 | :34 | เส้นทางของโพเทนชิออมิเตอร์ผ่าน SAR |
| BSP_HAS_ARDUINO_HEADER | 1 | :58 | คอนเนกเตอร์ขยายของ QWA309 |
| ENABLE_PAGE_GPIO_RGB | 1 | :76 | หน้า GPIO และ RGB matrix บนหน้าจอ |
| ENABLE_PAGE_MOTOR_CTRL | 0 | :77 | หน้า Motor Shield v2 — ปิดไว้ตามค่าเริ่มต้น |
ทุกอย่างบนบัสของเซนเซอร์อยู่บน SCB0 I2C ที่ P8.0 SCL / P8.1 SDA (sensor_i2c.c:99-100) SCB0 ใช้ร่วมกับ PAL ของ OPTIGA Trust M ซึ่งเป็นเหตุให้ lock ใน J1 — บัสของเซนเซอร์และ lock ของมัน ไม่ใช่สิ่งที่เลือกได้
| อุปกรณ์ | แอดเดรส | บัส | เจ้าของ | Header |
|---|---|---|---|---|
| BMI270 IMU | 0x68 | SCB0 I2C | CM33_NS | sensor_bmi270.h:16 |
| แมกนีโตมิเตอร์ BMM350 | 0x15 | I3C (CYBSP_I3C_SCL/SDA) | CM33_NS | sensor_bmm350.h:20 |
| บารอมิเตอร์ DPS368 | 0x77 | SCB0 I2C | CM33_NS | sensor_dps368.h:16 |
| SHT40 วัดความชื้น | 0x44 | SCB0 I2C | CM33_NS | sensor_sht40.h:17 |
| CapSense 4000T | 0x08 | บัสจอแสดงผล/การสัมผัสบนบอร์ด QWA309 | CM55 | sensor_capsense.h:20 |
| DFR0522 RGB matrix | 0x10 | บัสของคอนเนกเตอร์ header | CM55 | mod_rgbmatrix.c:6-13 |
| เรดาร์ BGT60TR13C | — | SPI | CM55 | tesaiot-radar/radar_task.h |
ช่องสัญญาณของบอร์ดที่ไม่ได้อยู่บนบัส
| สัญญาณ | ขา | หมายเหตุ |
|---|---|---|
| RGB LED สีแดง / น้ำเงิน / เขียว | P20.6 / P20.5 / P20.4 | TCPWM0 กลุ่ม 1 line 265 / 264 / 263 (modgpio.c:159-166) |
| LED1, LED2 | CYBSP_USER_LED1/2 | ไม่มีเส้นทาง TCPWM — ขับด้วย bit-bang เท่านั้น |
| ปุ่ม USER | CYBSP_USER_BTN1 | รายงานชื่อเป็น "SW2" (modgpio.c:53-58) |
| QWA309 SW4 / SW5 | P17.5 / P17.7 | active-low ใช้ pull-up ของ MCU (mod_qwa309_buttons.c:67-68) |
| โพเทนชิออมิเตอร์ตัวเดียว (sensors.pot) | P15[1] | SAR GPIO ช่อง 0 ผ่าน MTB HAL ปรับสเกลเทียบกับ 3.3 V (sensor_potentiometer.c:6-19) |
| QWA309 VR1..VR4 (pots) | P15.4..P15.7 | AutAnalog SAR GPIO ช่อง 4..7 — ไม่ได้ เรียงตามลำดับปุ่มหมุน |
| GPIO ของคอนเนกเตอร์ QWA309 | P13.0, P13.3, P13.4, P13.5, P13.6, P13.7 | ดัชนีเชิงตรรกะ 0..5 |
| PWM ของคอนเนกเตอร์ QWA309 | P13.3 (P13.4 = สัญญาณกลับขั้ว) | TCPWM0 counter 5 |
| UART ของคอนเนกเตอร์ QWA309 | P15.0 RX / P15.1 TX | SCB9, 115200 8N1 |
ชื่อเหล่านี้คือชื่อที่นักพัฒนาฝั่ง mtb-only เรียกโดยตรง และเป็นชื่อที่ binding ของ MicroPython เรียกอยู่ข้างใต้บน mtb-mpy
| ตระกูล | จุดเข้า | ไฟล์ |
|---|---|---|
| บัส | sensor_i2c_init :88, sensor_i2c_lock(ms) :168, sensor_i2c_unlock :175, sensor_i2c_is_init :181, sensor_i2c_write_reg :215, sensor_i2c_read_reg :240, sensor_i2c_scan :317 | sensor_i2c.c |
| BMI270 | bmi270_read_chip_id :65, bmi270_init :195, bmi270_read_accel :218, bmi270_read_gyro :235, bmi270_read_temperature :252 | sensor_bmi270.c |
| BMM350 | bmm350_init :391, bmm350_reinit :539, bmm350_debug_read :559, bmm350_read_xyz :703, bmm350_cal_update :739, bmm350_cal_reset :766, bmm350_heading_from_xy :791, bmm350_read_heading :829, bmm350_diagnose :863 | sensor_bmm350.c |
| DPS368 | dps368_read_product_id :97, dps368_init :101, dps368_read_temperature :228, dps368_read_pressure :246, dps368_read_both :273 | sensor_dps368.c |
| SHT40 | sht40_init :40, sht40_read_temperature :107, sht40_read_humidity :111, sht40_read_both :116, sht40_read_serial :120 | sensor_sht40.c |
| โพเทนชิออมิเตอร์ | potentiometer_init :26, potentiometer_read_raw :61, potentiometer_read_percent :72, potentiometer_read_voltage :82 | sensor_potentiometer.c |
| CapSense | API เดียว สอง backend — ดู ทางแยกของ CapSense: หนึ่ง API สอง backend | sensor_capsense.h |
| การส่งอัตโนมัติ (auto-push) | sensor_auto_get_bmi270 :1498, sensor_auto_task_create :1513, sensor_auto_start :1583, sensor_auto_stop :1591, sensor_auto_is_running :1601, sensor_auto_set_rate :1605, sensor_auto_get_rate :1611, sensor_auto_set_mask :1615, sensor_auto_get_mask :1619, sensor_auto_enable :1623, sensor_auto_disable :1627, sensor_auto_get_push_count :1631 | sensor_auto_task.c |
| การวนถามบน CM55 | cm55_sensor_poll_init :34, cm55_sensor_poll_tick :37, cm55_capsense_tick :46, cm55_sensor_poll_status :49, cm55_pot_read_all :54, cm55_sensor_poll_diag :57 | cm55_sensor_poll.h |
| เรดาร์ (CM55) | tesaiot_radar_task :96, tesaiot_radar_recover_stats :114, tesaiot_radar_loop_stats :129, radar_ai_frame_next :147; สถานะ tesaiot_radar_presence_detected :72, tesaiot_radar_current_energy :77, tesaiot_radar_initialized :82 | radar_task.h |
ซอร์สของเซนเซอร์อยู่ที่ bento_libs/claw/common/mpy/ ส่วน cm55_sensor_poll.h อยู่ใต้ proj_cm55/modules/cm55_sensor_poll/ และซอร์สของเรดาร์อยู่ใต้ bento_libs/claw/kit-pse84-ai/libraries/tesaiot-radar/
ลงทะเบียนที่ modsensors.c:1372 การอ่านทุกครั้ง binding จะครอบด้วย sensor_i2c_lock(100) / sensor_i2c_unlock() ให้เอง จึงไม่ต้องจับ lock เองจากฝั่ง Python เลย
| การเรียก | คืนค่า | ตัวการทำงาน | gate |
|---|---|---|---|
| sensors.init() | bool — True เมื่อไดรเวอร์ย่อยขึ้นครบทุกตัว และ OSError หากตัวบัสเองล้มเหลว | modsensors.c:523 | เสมอ |
| sensors.scan() | list[int] ของแอดเดรส 7 บิตที่ตอบกลับมา | modsensors.c:782 | เสมอ |
| sensors.read_all() | dict — เซนเซอร์ที่ไม่มีจะไม่มีคีย์ ไม่ใช่ค่า None | modsensors.c:807 | เสมอ |
| sensors.push() | bool — True หากมีข้อมูลส่งไปยัง CM55 | modsensors.c:911 | เสมอ |
| sensors.live_push(interval_ms=200) | ไม่คืนค่ากลับมาเลย และเกิด KeyboardInterrupt เมื่อกด Ctrl-C จำกัดช่วงไว้ที่ 50..5000 ms | modsensors.c:1060 | เสมอ |
| sensors.auto() | True — บอกว่า task กำลังทำงานอยู่หรือไม่ | modsensors.c:1173 | เสมอ |
| sensors.auto(bool) | None — เริ่ม / หยุด | modsensors.c:1173 | เสมอ |
| sensors.auto(name, bool) | None และเกิด ValueError เมื่อชื่อไม่รู้จัก | modsensors.c:1214-1224 | เสมอ |
| sensors.auto_rate(ms) | None จำกัดช่วงไว้ที่ 20..5000 ms | modsensors.c:1234 | เสมอ |
| sensors.auto_status() | dict ที่มี running, rate_ms, push_count, mask | modsensors.c:1246 | เสมอ |
| sensors.bmm350_diag() | dict 12 คีย์: step, init, att, s_init, s_en, pres, forced, wr_st, wr_ev, rd_st, rd_ev, id | modsensors.c:1269 | BSP_HAS_BMM350 |
| sensors.bmm350_debug() | None — พิมพ์ค่าใน register ออกมาทั้งชุด | modsensors.c:1315 | BSP_HAS_BMM350 |
| sensors.radar() | dict ที่มี initialized, presence, energy | modsensors.c:306 | BSP_HAS_RADAR |
| sensors.radar_range() | dict ที่มี distance_m, peak_db, resolution_m, target, seq | modsensors.c:410 | BSP_HAS_RADAR |
| sensors.radar_config(threshold_db) | None ค่า 0.0 จะเก็บค่าฐานใหม่ นอกนั้นรับ 0.1..60.0 มิฉะนั้นเกิด ValueError | modsensors.c:444 | BSP_HAS_RADAR |
ชื่อที่ sensors.auto(name, bool) รับได้: bmi270, dps368, sht40, bmm350, capsense, pot (modsensors.c:1218-1223)
ผูกเข้าไปใน dict ของ sensors ที่ modsensors.c:1341-1362
| การเรียก | คืนค่า | ตัวการทำงาน | gate |
|---|---|---|---|
| sensors.bmi270.acceleration() | tuple 3 ค่าเป็น float หน่วย m/s² | modsensors.c:159 | เสมอ |
| sensors.bmi270.gyroscope() | tuple 3 ค่าเป็น float หน่วย deg/s | modsensors.c:182 | เสมอ |
| sensors.bmi270.temperature() | float °C — อุณหภูมิของตัวชิป (die) ไม่ใช่อุณหภูมิห้อง | modsensors.c:205 | เสมอ |
| sensors.bmi270.motion() | tuple 6 ค่าภายใต้ lock ครั้งเดียว — เป็น snapshot ที่สอดคล้องกัน | modsensors.c:230 | เสมอ |
| sensors.bmi270.chip_id() | int โดยค่า 0x24 คือปกติ | modsensors.c:254 | เสมอ |
| sensors.dps368.pressure() | float หน่วย hPa | modsensors_dps368.c:34 | BSP_HAS_DPS368 |
| sensors.dps368.temperature() | float °C | modsensors_dps368.c:47 | BSP_HAS_DPS368 |
| sensors.dps368.altitude() | float หน่วย m | modsensors_dps368.c:60 | BSP_HAS_DPS368 |
| sensors.dps368.pressure_temperature() | tuple 2 ค่า | modsensors_dps368.c:77 | BSP_HAS_DPS368 |
| sensors.sht40.temperature() | float °C | modsensors_sht40.c:21 | BSP_HAS_SHT40 |
| sensors.sht40.humidity() | float หน่วย RH | modsensors_sht40.c:31 | BSP_HAS_SHT40 |
| sensors.sht40.temperature_humidity() | tuple 2 ค่า | modsensors_sht40.c:41 | BSP_HAS_SHT40 |
| sensors.bmm350.magnetic() | tuple 3 ค่า หน่วย µT | modsensors_bmm350.c:20 | BSP_HAS_BMM350 |
| sensors.bmm350.heading() | float 0..360 โดย 0 = ทิศเหนือ | modsensors_bmm350.c:33 | BSP_HAS_BMM350 |
| sensors.bmm350.chip_id() | int | modsensors_bmm350.c:43 | BSP_HAS_BMM350 |
| sensors.bmm350.cal_reset() | None | modsensors_bmm350.c:54 | BSP_HAS_BMM350 |
| sensors.bmm350.cal_status() | dict 3 คีย์ | modsensors_bmm350.c:62 | BSP_HAS_BMM350 |
| sensors.capsense.read() | dict ที่มี btn0, btn1, slider | modsensors_capsense.c:37 | BSP_HAS_CAPSENSE |
| sensors.capsense.buttons() | tuple 2 ค่าเป็น bool | modsensors_capsense.c:65 | BSP_HAS_CAPSENSE |
| sensors.capsense.slider() | int 0..100 | modsensors_capsense.c:85 | BSP_HAS_CAPSENSE |
| sensors.pot.read() | int 0..65535 | modsensors_potentiometer.c:42 | BSP_HAS_POTENTIOMETER |
| sensors.pot.percent() | float 0..100 | modsensors_potentiometer.c:56 | BSP_HAS_POTENTIOMETER |
| sensors.pot.voltage() | float 0..3.3 | modsensors_potentiometer.c:72 | BSP_HAS_POTENTIOMETER |
ลงทะเบียนที่ modgpio.c:678
| การเรียก | คืนค่า | ตัวการทำงาน |
|---|---|---|
| gpio.led(n) | gpio.LED และเกิด ValueError เมื่อค่าอยู่นอกช่วง | modgpio.c:587 |
| gpio.button(n) | gpio.Button และเกิด ValueError เมื่อค่าอยู่นอกช่วง | modgpio.c:600 |
| gpio.num_leds() | int | modgpio.c:613 |
| gpio.num_buttons() | int | modgpio.c:619 |
| gpio.board_info() | dict ที่มี name, leds, buttons, led_names, btn_names | modgpio.c:625 |
| gpio.LED / gpio.Button | ตัวชนิดข้อมูล สำหรับใช้กับ isinstance | modgpio.c:668-669 |
| led.on() / .off() / .toggle() | None — แต่ละตัวปล่อย PWM ที่ค้างอยู่ก่อน แล้วจึงขับขา แล้วจึงแจ้ง CM55 | modgpio.c:288 / :299 / :310 |
| led.value() / led.value(v) | อ่านค่ากลับเป็น int / None | modgpio.c:320 |
| led.name() | str | modgpio.c:344 |
| led.brightness(pct) | None — ใช้ TCPWM ของฮาร์ดแวร์บนขาที่มีเส้นทางรองรับ ถ้าไม่มีจะเป็นพัลส์แบบบล็อก 12 ms | modgpio.c:375 |
| led.hold(pct, ms=500) | None — ส่งพัลส์ซ้ำเป็นเวลา ms โดยยังกด Ctrl-C ได้ | modgpio.c:444 |
| led.duty() | int — เปอร์เซ็นต์ล่าสุดที่ร้องขอไว้ | modgpio.c:485 |
| btn.is_pressed() | bool แบบ active-low | modgpio.c:520 |
| btn.value() | int | modgpio.c:529 |
| btn.name() | str | modgpio.c:536 |
ดัชนีของ LED มาจาก led_table[] (modgpio.c:38-50): 0 LED1, 1 LED2, 2 RGB_RED, 3 RGB_BLUE, 4 RGB_GREEN มีปุ่มอยู่หนึ่งปุ่ม ดัชนี 0 ชื่อ "SW2" (modgpio.c:53-58) ส่วน gpio.board_info()['name'] คือ "PSoC Edge AI Dev Kit" (modgpio.c:61-65)
ทั้ง 5 โมดูลอยู่ภายใน #if BSP_HAS_QWA309_BASEBOARD ซึ่งบอร์ดนี้ตั้งเป็น 1
| การเรียก | คืนค่า | ตัวการทำงาน |
|---|---|---|
| pots.read(n) | int 0..4095 และเกิด ValueError เมื่ออยู่นอกช่วง 0..3 | mod_qwa309_pots.c:103 |
| pots.read_all() | tuple 4 ค่าเป็น int | mod_qwa309_pots.c:110 |
| pots.norm(n) | float 0.0..1.0 | mod_qwa309_pots.c:121 |
| pots.ready() | bool — ทุกช่องให้ผลลัพธ์ในการสแกนรอบล่าสุด | mod_qwa309_pots.c:129 |
| pots.count() | 4 | mod_qwa309_pots.c:137 |
| buttons.read() | tuple 2 ค่าเป็น bool | mod_qwa309_buttons.c:105 |
| buttons.pressed(n) | bool | mod_qwa309_buttons.c:117 |
| buttons.name(n) | str — "SW4" หรือ "SW5" | mod_qwa309_buttons.c:131 |
| buttons.count() | 2 | mod_qwa309_buttons.c:144 |
| rgbmatrix.clear() | None | mod_rgbmatrix.c:116 |
| rgbmatrix.fill(color) | None | mod_rgbmatrix.c:124 |
| rgbmatrix.pixel(x, y, color) | None โดย x 0..15, y 0..7 | mod_rgbmatrix.c:137 |
| rgbmatrix.blit(buf) | None เฟรมขนาด 64 ไบต์ แบบ 4bpp | mod_rgbmatrix.c:166 |
| rgbmatrix.score(value, color=RED) | None รับ 0..9999 | mod_rgbmatrix.c:185 |
| rgbmatrix.bar(value, max=5, color=GREEN) | None | mod_rgbmatrix.c:205 |
| rgbmatrix.scroll(text, color=WHITE, ms=80) | None สตริงว่างจะหยุดข้อความเลื่อน | mod_rgbmatrix.c:232 |
| header.gpio_out(idx, v) | None | mod_qwa309_header.c:129 |
| header.gpio_in(idx) | int | mod_qwa309_header.c:146 |
| header.name(idx) | str | mod_qwa309_header.c:162 |
| header.pwm(pin, duty_pct, freq_hz) | None | mod_qwa309_header.c:278 |
| header.uart_write(bytes) | None | mod_qwa309_header.c:408 |
| header.uart_any() | int | mod_qwa309_header.c:424 |
| header.uart_read(n) | bytes | mod_qwa309_header.c:435 |
ค่าคงที่สีของ rgbmatrix ตั้งแต่ OFF ถึง WHITE = 0..7 (mod_rgbmatrix.c:275-282): OFF, RED, GREEN, YELLOW, BLUE, PURPLE, CYAN, WHITE
ยังมีอีก 2 โมดูลที่ส่งมอบมาภายใต้ flag เดียวกัน และอยู่ข้างเคียงอุปกรณ์ต่อพ่วงมากกว่าจะเป็นอุปกรณ์ต่อพ่วงเอง ได้แก่ can (modcan.c:479 — init, send, recv, deinit, stats) และ shield.motor_v2 (mod_shield_motor_v2.c:313 — speed, run, stop_all, stepper_attach, stepper_detach, stepper_rpm, stepper_step, stepper_stop, stepper_release) ส่วนหน้า Motor Shield ที่คู่กับ 2 โมดูลนี้ปิดไว้ตามค่าเริ่มต้น (bsp_features.mk:77) ดู J5 — บอร์ดฐาน QWA309: pot ปุ่ม RGB matrix และ header
| mtb-mpy | mtb-only | |
|---|---|---|
| bento_libs/claw/common/mpy/ | 53 ไฟล์ — mod*.c ทุกไฟล์ พร้อมไดรเวอร์ | 19 ไฟล์ — เฉพาะไดรเวอร์ sensor_*.c/.h |
| bento_libs/claw/kit-tesaiot-pse84-ai/mpy/ | โมดูลของชุดคิททั้ง 6 ตัว | ไม่มีไดเรกทอรีนี้ |
| โมดูล sensors, gpio | มี | ไม่มี — ไม่ได้คอมไพล์ชั้น binding เข้ามา |
| pots, buttons, rgbmatrix, header, can, shield | มี | ไม่มี |
| ไดรเวอร์เซนเซอร์ (sensor_i2c, BMI270, BMM350, DPS368, SHT40, pot) | มี เรียกโดย binding | มี เรียกโดยโค้ดที่เขียนเอง |
| sensor_auto_task | มี | มี — และรับผิดชอบขั้นตอนตอนบูตเพิ่มอีกหนึ่งขั้น ดู J3 — task ดันข้อมูลอัตโนมัติกับ sensor hub |
| การวนถามบน CM55 และ task ของเรดาร์ | มี | มี |
| Tutorial | J1 — บัสของเซนเซอร์และ lock ของมัน, J2, J3 — task ดันข้อมูลอัตโนมัติกับ sensor hub, J4, J5, J6 — เรดาร์ | J1 — บัสของเซนเซอร์และ lock ของมัน, J3 — task ดันข้อมูลอัตโนมัติกับ sensor hub, J6 — เรดาร์ |