Arduino Giga R1 WiFi¶
Arduino Giga R1 WiFi เป็นบอร์ดรูปแบบ Mega ขนาด 101 × 53 มม. ที่สร้างขึ้นบน STMicroelectronics STM32H747XI ซึ่งเป็น SoC แบบ dual-core ที่รวม Cortex-M7 ที่ 480 MHz กับ Cortex-M4 ที่ 240 MHz เฟิร์มแวร์ OpenMV ทำงานบนคอร์ M7 ทั้งหมด บอร์ด Giga เพิ่มขั้วต่อสายแพกล้อง Arducam แบบ 22 พิน, ขั้วต่อ MIPI-DSI สำหรับ Arduino Giga Display Shield, และแจ็คสเตอริโอ 3.5 มม. เข้ากับเลย์เอาต์ส่วนหัวมาตรฐาน Arduino Mega
สำหรับข้อมูลจำเพาะเต็มรูปแบบ รูปถ่าย และขนาด โปรดดูที่ หน้าผลิตภัณฑ์ Arduino Giga R1 WiFi
คุณสมบัติหลัก¶
STMicroelectronics STM32H747XI dual Cortex-M7 (480 MHz) + Cortex-M4 (240 MHz) เฟิร์มแวร์ OpenMV ทำงานบนคอร์ M7 เท่านั้น คอร์ M4 เปิดเผยผ่าน openamp สำหรับการสื่อสารระหว่างโปรเซสเซอร์
SDRAM ภายนอก 8 MB พร้อมกับ แฟลชภายใน 2 MB และ แฟลช QSPI ภายนอก 16 MB
ตัวเข้ารหัส/ถอดรหัส JPEG ฮาร์ดแวร์
ขั้วต่อสายแพกล้อง Arducam แบบ 22 พินที่เข้ากันได้ (
J6) — รองรับไดรเวอร์สำหรับโมดูลเซนเซอร์ OV5640 (5MP), OV7670, GC2145, HM01B0 และ HM0360ขั้วต่อจอแสดงผล MIPI-DSI (
J5) สำหรับ Arduino Giga Display Shield (แผงสัมผัสแบบ capacitive 480×800) พร้อมเอนจิน LTDC RGB สำหรับตัวรองรับขั้นสูงแจ็คสัญญาณเสียง 3.5 มม. พร้อมสเตอริโอไลน์เอาต์และไมค์อิน
Wi-Fi b/g/n (2.4 GHz) + Bluetooth LE 5.1 ผ่านโมดูล Murata 1DX (CYW4343W) — เชื่อมต่อกับเสาอากาศที่ให้มาผ่าน ขั้วต่อ U.FL บนบอร์ด
USB-C (full-speed) สำหรับจ่ายไฟ / serial / การเขียนโปรแกรม
I/O ของผู้ใช้ บนส่วนหัวสไตล์ Mega —
D0–D75(ดิจิตอล),A0–A11(แอนะล็อก),DAC0/DAC1(เอาต์พุต DAC),CAN_RX/CAN_TX(FDCAN2) และคู่ I²C แถวในSDA1/SCL1ส่วนหัว SPI1 แบบ 6 พินแยกต่างหากที่ด้านหน้าของบอร์ดแยกออกCIPO/COPI/SCK(D89/D90/D91)JTAG / SWD เปิดเผยบนส่วนหัวดีบักด้านบนสำหรับการดีบักขั้นสูง
ผังพิน¶
อ้างอิงพิน¶
ส่วนหัวสไตล์ Arduino Mega เปิดเผยพินดิจิตอล 76 พิน (D0–D75), พินแอนะล็อก 12 พิน (A0–A11), เอาต์พุต DAC สอง (DAC0/DAC1), คู่ I²C รอง (SDA1/SCL1) และคู่ FDCAN2 (CAN_RX/CAN_TX) ส่วนหัว SPI1 แบบ 6 พินแยกต่างหากที่ด้านหน้าของบอร์ดแยกออก CIPO/COPI/SCK (D89/D90/D91)
ชื่อพิน |
อ้างอิง |
ฟังก์ชัน |
|---|---|---|
D0 |
3.3 V |
USART1 RX (Serial1) / TIM4 CH2 |
D1 |
3.3 V |
USART1 TX (Serial1) / TIM1 CH2 |
D2 |
3.3 V |
TIM2 CH4 / TIM5 CH4 / USART2 RX |
D3 |
3.3 V |
TIM2 CH3 / TIM5 CH3 / USART2 TX |
D4 |
3.3 V |
TIM8 CH1 / UART8 TX |
D5 |
3.3 V |
TIM3 CH2 / SPI1 MOSI / SPI6 MOSI |
D6 |
3.3 V |
TIM4 CH2 |
D7 |
3.3 V |
TIM3 CH1 / SPI1 MISO / SPI3 MISO / SPI6 MISO |
D8 |
3.3 V |
TIM4 CH3 / I2C1 SCL / I2C4 SCL / UART4 RX |
D9 |
3.3 V |
TIM4 CH4 / I2C1 SDA / I2C4 SDA / UART4 TX |
D10 |
3.3 V |
TIM1 CH1 / TIM8 CH3N |
D11 |
3.3 V |
TIM8 CH2 / SPI5 MOSI |
D12 |
3.3 V |
TIM8 CH2N / SPI5 MISO |
D13 |
3.3 V |
TIM12 CH1 / SPI5 SCK |
D14 |
3.3 V |
USART6 TX (Serial2) / SPI6 MOSI |
D15 |
3.3 V |
USART6 RX (Serial2) / TIM3 CH2 / TIM8 CH2 |
D16 |
3.3 V |
UART4 TX (Serial3) / TIM8 CH1N |
D17 |
3.3 V |
UART4 RX (Serial3) |
D18 |
3.3 V |
USART2 TX (Serial4) |
D19 |
3.3 V |
USART2 RX (Serial4) / SPI3 MOSI |
D20 |
3.3 V |
I2C2 SDA / TIM2 CH4 / USART3 RX |
D21 |
3.3 V |
I2C2 SCL |
D22 |
3.3 V |
GPIO |
D23 |
3.3 V |
GPIO / SPI6 SCK |
D24 |
3.3 V |
GPIO / SPI6 MISO |
D25 |
3.3 V |
GPIO |
D26 |
3.3 V |
GPIO |
D27 |
3.3 V |
GPIO |
D28 |
3.3 V |
GPIO |
D29 |
3.3 V |
GPIO |
D30 |
3.3 V |
GPIO |
D31 |
3.3 V |
GPIO |
D32 |
3.3 V |
GPIO |
D33 |
3.3 V |
GPIO |
D34 |
3.3 V |
GPIO |
D35 |
3.3 V |
GPIO |
D36 |
3.3 V |
GPIO |
D37 |
3.3 V |
TIM8 CH2 |
D38 |
3.3 V |
TIM8 CH2N |
D39 |
3.3 V |
GPIO |
D40 |
3.3 V |
TIM15 CH2 / SPI4 MOSI |
D41 |
3.3 V |
GPIO |
D42 |
3.3 V |
GPIO |
D43 |
3.3 V |
GPIO |
D44 |
3.3 V |
GPIO |
D45 |
3.3 V |
GPIO |
D46 |
3.3 V |
TIM8 CH3N |
D47 |
3.3 V |
SPI3 MOSI |
D48 |
3.3 V |
TIM8 CH3 / SPI5 SCK |
D49 |
3.3 V |
GPIO |
D50 |
3.3 V |
GPIO |
D51 |
3.3 V |
TIM15 CH1 / SPI4 MISO |
D52 |
3.3 V |
GPIO |
D53 |
3.3 V |
GPIO |
D54 |
3.3 V |
TIM8 CH1 (camera DCMI VSYNC) |
D55 |
3.3 V |
I2C3 SDA (camera DCMI HSYNC) |
D56 |
3.3 V |
TIM3 CH1 / TIM13 CH1 (camera DCMI PXCLK) |
D57 |
3.3 V |
TIM8 CH1N / UART8 RX (camera master clock — TIM1 CH3) |
D58 |
3.3 V |
TIM8 CH3 (camera DCMI D7) |
D59 |
3.3 V |
TIM8 CH2 (camera DCMI D6) |
D60 |
3.3 V |
GPIO (camera DCMI D5) |
D61 |
3.3 V |
TIM8 CH2N / UART4 RX (camera DCMI D4) |
D62 |
3.3 V |
SPI1 SCK (camera DCMI D3) |
D63 |
3.3 V |
TIM5 CH2 / I2C4 SCL (display I²C) |
D64 |
3.3 V |
TIM5 CH1 (camera DCMI D1) |
D65 |
3.3 V |
TIM12 CH2 (camera DCMI D0) |
D66 |
3.3 V |
GPIO (camera reset — claimed when camera is active) |
D67 |
3.3 V |
GPIO (camera power-down — claimed when camera is active) |
D68 |
3.3 V |
TIM3 CH1 / TIM8 CH1 / USART6 TX (Display Shield DSI RESET) |
D69 |
3.3 V |
TIM5 CH4 (Display Shield DSI TE) |
D70 |
3.3 V |
SPI2 SCK |
D71 |
3.3 V |
TIM8 CH4 / SPI2 MISO |
D72 |
3.3 V |
SPI2 MOSI |
D73 |
3.3 V |
ADC123 IN11 (Display Shield DFSDM mic data) |
D74 |
3.3 V |
GPIO (display backlight — claimed by the Giga Display Shield) |
D75 |
3.3 V |
SPI2 SCK (Display Shield DFSDM mic clock) |
A0 / D76 |
3.3 V |
ADC12 IN4 |
A1 / D77 |
3.3 V |
ADC12 IN8 |
A2 / D78 |
3.3 V |
ADC12 IN9 / TIM3 CH3 / TIM8 CH2N |
A3 / D79 |
3.3 V |
ADC12 IN5 / TIM3 CH4 / TIM8 CH3N |
A4 / D80 |
3.3 V |
ADC12 IN13 / SPI2 MOSI |
A5 / D81 |
3.3 V |
ADC123 IN12 / SPI2 MISO |
A6 / D82 |
3.3 V |
ADC123 IN10 |
A7 / D83 |
3.3 V |
ADC1 IN16 / TIM2 CH1 / TIM5 CH1 (audio jack mic input) |
A8 |
3.3 V |
ADC3 IN0 (analog only) |
A9 |
3.3 V |
ADC3 IN1 (analog only) |
A10 |
3.3 V |
ADC12 IN1 (analog only) |
A11 |
3.3 V |
ADC12 IN0 (analog only) |
DAC0 / A12 / D84 |
3.3 V |
DAC1 OUT1 / ADC12 IN18 (audio jack line-out L) |
DAC1 / A13 / D85 |
3.3 V |
DAC1 OUT2 / TIM2 CH1 / SPI1 SCK / ADC12 IN19 (audio jack line-out R) |
D89 |
3.3 V |
SPI1 MISO ( |
D90 |
3.3 V |
SPI1 MOSI ( |
D91 |
3.3 V |
SPI1 SCK ( |
CAN_RX / D93 |
3.3 V |
FDCAN2 RX / TIM3 CH2 / UART5 RX |
CAN_TX / D94 |
3.3 V |
FDCAN2 TX / SPI2 SCK / UART5 TX |
SDA1 / D102 |
3.3 V |
I2C4 SDA (display touch / camera control bus) |
SCL1 / D101 |
3.3 V |
I2C4 SCL (display touch / camera control bus) |
RESET |
3.3 V |
กดปุ่ม RESET บนบอร์ดหรือดึงลง GND เพื่อรีเซ็ต |
LED_RED |
3.3 V |
ช่องสีแดงของ RGB LED (active low) |
LED_GREEN |
3.3 V |
ช่องสีเขียวของ RGB LED (active low) |
LED_BLUE |
3.3 V |
ช่องสีน้ำเงินของ RGB LED (active low) |
Note
A8–A11 เป็นแพดแบบ analog-only บนพิน _C ของ STM32H747 — ไม่มีฟังก์ชัน GPIO และสามารถอ่านได้ผ่าน ADC เท่านั้น
พินไฟฟ้า¶
พินส่วนหัว Mega:
VIN — อินพุต 6–32 V ป้อนไฟให้บอร์ดผ่านตัวควบคุมแบบบัคบนบอร์ด
+5V — ราง 5 V ป้อนมาจาก USB ผ่านไดโอดหรือตัวควบคุมแบบบัคบนบอร์ด
+3V3 — ราง 3.3 V หลัก
IOREF — สะท้อนแรงดัน I/O ของบอร์ด (3.3 V)
AREF — แรงดันอ้างอิงแอนะล็อกสำหรับพิน ADC ค่าเริ่มต้นคือ 3.3 V; ต่อจากภายนอกเพื่อใช้แรงดันอ้างอิงอื่น
OFF — ดึงลง GND เพื่อปิดราง +3.3 V และปิดระบบ
VRTC — อินพุตเซลล์เหรียญ 3.0 V (สูงสุด 3.3 V) ที่ทำให้ RTC บนชิปทำงานขณะที่บอร์ดส่วนที่เหลือปิดอยู่
GND — กราวด์ร่วม
Giga R1 สามารถรับไฟผ่านเส้นทางใดเส้นทางหนึ่งเหล่านี้:
USB-C — จ่าย 5 V ให้กับตัวควบคุมแบบบัคบนบอร์ด
พิน VIN — ต่อแหล่งจ่ายไฟที่ควบคุมแล้ว 6–32 V โดยตรง
Tip
ใช้ เครื่องประมาณอายุแบตเตอรี่ เพื่อคาดการณ์ว่า Giga R1 จะทำงานได้นานแค่ไหนบนแบตเตอรี่สำหรับรอบการทำงานแอ็คทีฟ/ดีพสลีปที่กำหนด
พินการกู้คืนและดีบัก¶
RESET — ทั้งพินที่เปิดเผยบนส่วนหัวไฟฟ้าและสวิตช์กดชั่วคราวบนด้านบนของบอร์ด เชื่อมต่อกับสาย NRST ของ SoC ดึงลง GND หรือกดปุ่มเพื่อรีเซ็ต
Giga R1 ใช้ การรีเซ็ตแบบดับเบิลแท็ป มาตรฐานของ Arduino เพื่อเข้าสู่บูตโหลดเดอร์ของ Arduino กดปุ่ม RESET สองครั้งอย่างรวดเร็ว — บอร์ดจะ re-enumerate ผ่าน USB เป็นอุปกรณ์ DFU และ OpenMV IDE สามารถแฟลชอิมเมจเฟิร์มแวร์ใหม่ได้
หากบูตโหลดเดอร์หายไปทั้งหมด ให้กดปุ่ม BOOT0 ค้างไว้ขณะกด RESET เพื่อบังคับให้ SoC เข้าสู่โหมดบูตโหลดเดอร์ ROM
สัญญาณ STM32 SWD เปิดเผยบน ส่วนหัว Cortex Debug ขนาด 1.27 มม. 10 พิน ที่ด้านหน้าของบอร์ด เชื่อมต่อผ่าน SEGGER J-Link, ST-Link หรือโพรบ ARM JTAG/SWD มาตรฐานใดก็ได้ สัญญาณดีบักทั้งหมดอ้างอิง 3.3 V
อุปกรณ์ต่อพ่วงบนบอร์ด¶
LED¶
Giga R1 มี RGB LED ของผู้ใช้หนึ่งดวง ควบคุมได้ด้วยซอฟต์แวร์ผ่าน machine.LED
from machine import LED
LED("LED_RED").on()
LED("LED_GREEN").on()
LED("LED_BLUE").on()
LED ไฟฟ้า แยกต่างหากบนบอร์ดจะติดเมื่อราง +3.3 V ทำงาน และไม่สามารถควบคุมได้โดยผู้ใช้
ขั้วต่อกล้อง (J6)¶
J6 คือขั้วต่อสายแพกล้อง Arducam แบบ 22 พิน เสียบโมดูลเซนเซอร์ที่รองรับใดก็ได้และเฟิร์มแวร์จะตรวจสอบโดยอัตโนมัติผ่านโมดูล csi --- เซ็นเซอร์กล้อง
import csi
cam = csi.CSI()
cam.reset()
cam.pixformat(csi.RGB565)
cam.framesize(csi.QVGA)
cam.snapshot(time=2000) # let auto‑exposure settle
while True:
img = cam.snapshot()
เซนเซอร์ที่รองรับ:
OV5640 — สี 5 MP สูงสุด QSXGA (2592 × 1944)
OV7670 — สี 0.3 MP สูงสุด VGA (640 × 480)
GC2145 — สี 2 MP สูงสุด UXGA (1600 × 1200)
HM01B0 — ขาวดำ 320 × 320
HM0360 — ขาวดำ VGA (640 × 480)
Warning
ขณะที่กล้องเริ่มต้น พินส่วนหัว Mega ต่อไปนี้จะถูกใช้งานโดยเฟิร์มแวร์และไม่สามารถใช้งานได้:
พิน |
เหตุผล |
|---|---|
|
ข้อมูล DCMI + สัญญาณ sync บนขั้วต่อสายแพกล้อง |
|
TIM1 CH3 — clock หลักของกล้อง |
|
GPIO reset ของกล้อง |
|
GPIO power-down ของกล้อง |
|
I²C 4 — ใช้ร่วมกับกล้อง; บัสสามารถใช้งานได้แต่ต้องหลีกเลี่ยงที่อยู่ I²C ของเซนเซอร์ |
การเรียนรู้ของเครื่อง¶
ml --- Machine Learning รันโมเดล TFLite แบบ quantised บน Cortex-M7 ด้วยเคอร์เนล CMSIS-NN — เร็วพอสำหรับตัวตรวจจับขนาดเล็กที่หลายเฟรมต่อวินาที โมเดลบนระบบไฟล์ /rom แบบอ่านอย่างเดียวโหลดโดยตรงจากแฟลชโดยไม่ต้องคัดลอกไปยัง RAM นี่คือตัวตรวจจับ BlazeFace ขนาด 128×128 ที่ซ้อนทับใบหน้าที่ตรวจจับได้และจุดสำคัญหกจุดบนทุกเฟรม:
import csi
import time
import ml
from ml.postprocessing.mediapipe import BlazeFace
# Initialize the sensor.
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)
csi0.window((400, 400))
# Load built-in face detection model
model = ml.Model("/rom/blazeface_front_128.tflite", postprocess=BlazeFace(threshold=0.4))
print(model)
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
for r, score, keypoints in model.predict([img]):
ml.utils.draw_predictions(img, [r], ("face",), ((0, 0, 255),), format=None)
ml.utils.draw_keypoints(img, keypoints, color=(255, 0, 0))
print(clock.fps(), "fps")
คอร์ M4¶
คอร์ Cortex-M4 เปิดเผยผ่าน openamp สำหรับการสื่อสารระหว่างโปรเซสเซอร์ เฟิร์มแวร์ OpenMV ทำงานบน M7 เท่านั้น M4 ไม่มี MicroPython runtime เป็นของตัวเอง ดังนั้นการใช้งานหมายถึงการสร้างอิมเมจเฟิร์มแวร์ C แยกต่างหากและโหลดจากระบบไฟล์ผ่าน openamp.RemoteProc เฟิร์มแวร์ตัวอย่างที่สร้างไว้ล่วงหน้าซึ่งใช้งาน virtual UART endpoint มีอยู่ในที่เก็บ openamp_vuart — ทำตาม README เพื่อสร้าง vuart.elf
import openamp
import time
def ept_recv_callback(src_addr, data):
print("Received:", data.decode())
ept = openamp.Endpoint("vuart-channel", callback=ept_recv_callback)
rproc = openamp.RemoteProc("vuart.elf")
rproc.start()
count = 0
while True:
if ept.is_ready():
ept.send("Hello World %d!" % count, timeout=1000)
count += 1
time.sleep_ms(1000)
ในทางปฏิบัติ การรองรับนี้ควรถือเป็นการสาธิต openamp interface มากกว่าแพลตฟอร์ม dual-core ที่ใช้งานได้จริง — M4 ไม่สามารถรีเซ็ตได้อิสระจาก M7 ดังนั้นการหยุด M4 จะบังคับให้ระบบรีบูตทั้งหมด
จอแสดงผล (J5)¶
J5 คือขั้วต่อ MIPI-DSI สำหรับ Arduino Giga Display Shield — แผงสัมผัสแบบ capacitive 480 × 800 ที่สร้างขึ้นบนไดรเวอร์แผงจอ ST7701 และตัวควบคุมสัมผัส GT911 ไดรเวอร์ทั้งสองส่งมาพร้อมกับเฟิร์มแวร์ ใช้ display --- ไดรเวอร์ดิสเพลย์ เพื่อส่งบัฟเฟอร์เฟรมและ gt911.GT911 สำหรับอินพุตสัมผัส
ตัวอย่างด้านล่างนี้สะท้อนกล้องไปยังหน้าต่างจอแสดงผลแนวตั้ง 800 × 480 และซ้อนทับแต่ละจุดสัมผัสเป็นวงกลมสี:
import csi
import time
import image
import display
from gt911 import GT911
from machine import I2C
IMG_OFFSET = 80
touch_detected = False
points_colors = ((255, 0, 0), (0, 255, 0), (0, 0, 255),
(0, 255, 255), (255, 255, 0))
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)
lcd = display.DSIDisplay(
framesize=display.FWVGA,
portrait=True,
refresh=60,
controller=display.ST7701(),
)
# Pass pin names (not Pin objects) so the driver can flip
# the reset pin's direction during start-up.
touch = GT911(
I2C(4, freq=400_000),
reset_pin="D71",
irq_pin="D70",
touch_points=5,
refresh_rate=240,
reverse_x=True,
touch_callback=lambda pin: globals().update(touch_detected=True),
)
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
if touch_detected:
n, points = touch.read_points()
for i in range(n):
img.draw_circle(
(points[i][0] - IMG_OFFSET,
points[i][1],
points[i][2] * 3),
color=points_colors[points[i][3]],
thickness=2,
)
touch_detected = False
lcd.write(img, y=IMG_OFFSET, hint=image.TRANSPOSE | image.VFLIP)
print(clock.fps())
Warning
Giga Display Shield ใช้ I²C 4 bus (SDA1/SCL1) เดียวกับกล้อง, D74 สำหรับเปิดไฟแบ็คไลต์ LCD, D70/D71 สำหรับ GT911 touch IRQ และ reset และ D68/D69 สำหรับสัญญาณ TE และ RESET ของแผงจอ DSI
ไมโครโฟน (Display Shield)¶
Arduino Giga Display Shield มีไมโครโฟนดิจิตอลที่เชื่อมต่อกับอุปกรณ์ต่อพ่วง DFSDM ของ STM32H747 (clock ไมค์บน D75, ข้อมูลไมค์บน D73) ไมโครโฟนถูกบันทึกผ่าน audio --- โมดูล Audio แต่ละบัฟเฟอร์มาเป็น bytearray PCM แบบ signed-16-bit พร้อมป้อนเข้า ulab/numpy สำหรับ DSP:
import audio
from ulab import numpy as np
def loudness(pcmbuf):
samples = np.array(np.frombuffer(pcmbuf, dtype=np.int16), dtype=np.float)
rms = np.sqrt(np.mean(samples ** 2))
if rms > 10000:
print("Loud!", int(rms))
audio.init(channels=1, frequency=16000, gain_db=24)
audio.start_streaming(loudness)
while True:
pass
IMU (Display Shield)¶
Arduino Giga Display Shield มี Bosch BMI270 6-axis IMU (accelerometer 3D + gyroscope 3D) บน I²C 4 bus เดียวกันที่แอดเดรส 0x68 ใช้ไดรเวอร์ชุมชน micropython_bmi270 เพื่ออ่านข้อมูล:
import time
from machine import I2C
from micropython_bmi270 import bmi270
sensor = bmi270.BMI270(I2C(4, freq=400_000))
sensor.load_config_file()
while True:
ax, ay, az = sensor.acceleration # m/s²
gx, gy, gz = sensor.gyro
print(ax, ay, az, gx, gy, gz)
time.sleep_ms(100)
แผนที่รีจิสเตอร์เต็มอยู่ใน BMI270 datasheet
RGB LED (Display Shield)¶
Arduino Giga Display Shield มี RGB LED บนบอร์ดที่ขับเคลื่อนโดยไดรเวอร์ LED 3 ช่อง ISSI IS31FL3197 บน I²C 4 bus เดียวกัน พิน AD ของไดรเวอร์ถูกต่อกับ GND ดังนั้นจึงอยู่ที่แอดเดรส I²C 0x50 ใช้ไดรเวอร์ชุมชน IS31FL3197 เพื่อควบคุม LED:
from machine import I2C
from is31fl3197 import IS31FL3197
led = IS31FL3197(I2C(4, freq=400_000))
led.set_color(255, 0, 0) # full red
แผนที่รีจิสเตอร์เต็มอยู่ใน IS31FL3197 datasheet
Wi-Fi¶
Murata 1DX (CYW4343W) บนบอร์ดเปิดเผยผ่าน network --- การกำหนดค่าเครือข่าย เป็นอินเทอร์เฟซสถานี เชื่อมต่อเสาอากาศที่ให้มากับ ขั้วต่อ U.FL บนบอร์ดก่อนเปิดใช้งานวิทยุ:
import network, time
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("ssid", "password")
while not wlan.isconnected():
time.sleep(1)
print("Wi‑Fi IP:", wlan.ipconfig("addr4")[0])
Bluetooth¶
Murata 1DX ตัวเดียวกันยังเปิดเผย Bluetooth LE 5.1 ด้วย ใช้ aioble --- Async BLE สำหรับ BLE แบบ asyncio-friendly — ตัวอย่างเช่น advertise เป็น peripheral และรอให้ central เชื่อมต่อ:
import asyncio
import aioble
async def run():
while True:
conn = await aioble.advertise(250_000, name="Giga-R1")
print("Connected:", conn.device)
await conn.disconnected()
asyncio.run(run())
อ้างอิงบัส¶
GPIO¶
ใช้ machine.Pin เพื่ออ่านหรือขับพินที่มีสัญลักษณ์บนบอร์ด เอาต์พุตเป็น 3.3 V CMOS และสามารถ sink/source ได้ถึง 20 mA ต่อพิน (140 mA รวมทั่วทั้งส่วนหัว)
from machine import Pin
out = Pin("D2", Pin.OUT)
out.on()
out.off()
out.value(1)
inp = Pin("D3", Pin.IN, Pin.PULL_UP)
print(inp.value())
พินอินพุตใดก็สามารถทำงานเป็นอินเทอร์รัปต์บน edge transitions ได้:
def handler(pin):
print("triggered:", pin)
Pin("D3", Pin.IN, Pin.PULL_UP).irq(
handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)
UART¶
บัส |
TX |
RX |
ชื่อ Arduino |
|---|---|---|---|
UART1 |
D1 |
D0 |
Serial1 |
UART6 |
D14 |
D15 |
Serial2 |
UART4 |
D16 |
D17 |
Serial3 |
UART2 |
D18 |
D19 |
Serial4 |
from machine import UART
uart = UART(1, baudrate=115200)
uart.write("hello")
uart.read(5)
I²C¶
บัส |
SCL |
SDA |
|---|---|---|
I2C2 |
D21 |
D20 |
I2C1 |
D8 |
D9 |
I2C4 |
SCL1 |
SDA1 |
from machine import I2C
i2c = I2C(2, freq=400_000)
i2c.scan()
i2c.writeto(0x76, b"hi")
บัส 2 (D20/D21 ซึ่งเป็นสัญลักษณ์ SCL/SDA) คือ Wire bus มาตรฐานของ Arduino บัส 4 (SCL1/SDA1) ใช้ร่วมกับกล้องและตัวควบคุมสัมผัส GT911 ของ Giga Display Shield — อุปกรณ์ของผู้ใช้บนบัสนี้ต้องหลีกเลี่ยงแอดเดรสต่อไปนี้ (7-bit):
0x3C— OV5640 / GC21450x24— HM01B0 / HM03600x21— OV76700x5D— ตัวควบคุมสัมผัส GT911 (Giga Display Shield)
ฮาร์ดแวร์เดียวกันสามารถใช้ในโหมด target (slave) ผ่าน machine.I2CTarget เพื่อเปิดเผยบริเวณหน่วยความจำให้กับ I²C controller อื่น:
from machine import I2CTarget
buf = bytearray(32)
target = I2CTarget(2, addr=0x42, mem=buf)
SPI¶
บัส |
MOSI |
MISO |
SCK |
|---|---|---|---|
SPI1 |
D90 |
D89 |
D91 |
SPI5 |
D11 |
D12 |
D13 |
SPI1 เปิดเผยบนส่วนหัว 6 พินแยกต่างหากที่ด้านหน้าของบอร์ด SPI5 เปิดเผยบนสัญลักษณ์ COPI/CIPO/SCK บน D11/D12/D13
Note
ผังพินของ SPI1 ส่วนหัว 6 พินด้านหน้า (J7):
พิน |
สัญญาณ |
|---|---|
1 |
|
2 |
+5V |
3 |
|
4 |
|
5 |
NRST |
6 |
GND |
from machine import SPI
from machine import Pin
spi = SPI(5, baudrate=10_000_000)
cs = Pin("D10", Pin.OUT, value=1) # CS is not driven by the SPI peripheral
cs.value(0)
spi.write(b"hello")
cs.value(1)
CAN (FDCAN)¶
บัส |
TX |
RX |
|---|---|---|
FDCAN2 |
D94 |
D93 |
from machine import CAN
can = CAN(2, 500_000)
can.set_filters(None)
can.send(0x123, b"\xDE\xAD\xBE\xEF")
print(can.recv())
ADC¶
Giga R1 เปิดเผยช่อง ADC 12 บิต 12 ช่องบน A0–A11 ทั้งหมด อ้างอิง 3.3 V — read_u16 คืนค่า 0–65535 สำหรับ 0–3.3 V ที่พิน A8–A11 เป็นแพด _C แบบ analog-only ที่ไม่มีอุปกรณ์ต่อพ่วง GPIO:
from machine import ADC
import time
adc = ADC("A0")
while True:
voltage = adc.read_u16() * 3.3 / 65535
print(voltage)
time.sleep_ms(100)
Note
A7 ยังเชื่อมต่อกับ อินพุตไมโครโฟน บนแจ็คสัญญาณเสียง TRRS 3.5 มม. — เมื่อเชื่อมต่อหูฟัง ADC("A7") จะอ่านสัญญาณไมค์แอนะล็อกโดยตรง
DAC¶
ช่อง DAC 12 บิต 2 ช่องเปิดเผยบน DAC0 และ DAC1 ผ่าน pyb.DAC ทั้งคู่เชื่อมต่อกับแจ็คสัญญาณเสียง TRRS 3.5 มม. เป็นช่อง line-out ซ้ายและขวา:
from pyb import DAC
left = DAC("DAC0")
right = DAC("DAC1")
left.write(int(0.5 * 255)) # 8‑bit, ~1.65 V
right.write(int(0.5 * 255))
PWM¶
พิน |
ตัวจับเวลา / ช่อง |
|---|---|
D0 |
TIM4 CH2 / TIM17 CH1N |
D1 |
TIM1 CH2 |
D2 |
TIM2 CH4 / TIM5 CH4 / TIM15 CH2 |
D3 |
TIM2 CH3 / TIM5 CH3 / TIM15 CH1 |
D4 |
TIM1 CH3N / TIM8 CH1 |
D5 |
TIM1 CH1N / TIM3 CH2 / TIM8 CH1N / TIM14 CH1 |
D6 |
TIM4 CH2 |
D7 |
TIM3 CH1 |
D8 |
TIM4 CH3 / TIM16 CH1 |
D9 |
TIM4 CH4 / TIM17 CH1 |
D10 |
TIM1 CH1 / TIM8 CH3N |
D11 |
TIM1 CH2N / TIM8 CH2 |
D12 |
TIM1 CH2 / TIM8 CH2N |
D13 |
TIM12 CH1 |
D15 |
TIM3 CH2 / TIM8 CH2 |
D16 |
TIM8 CH1N |
D20 |
TIM2 CH4 |
D37 |
TIM8 CH2 |
D38 |
TIM8 CH2N |
D40 |
TIM15 CH2 |
D46 |
TIM8 CH3N |
D48 |
TIM1 CH1N / TIM8 CH3 |
D51 |
TIM15 CH1 |
D54 |
TIM8 CH1 |
D56 |
TIM3 CH1 / TIM13 CH1 |
D57 |
TIM1 CH3 / TIM8 CH1N |
D58 |
TIM8 CH3 |
D59 |
TIM8 CH2 |
D61 |
TIM8 CH2N |
D63 |
TIM5 CH2 |
D64 |
TIM5 CH1 |
D65 |
TIM12 CH2 |
D68 |
TIM3 CH1 / TIM8 CH1 |
D69 |
TIM5 CH4 |
D71 |
TIM8 CH4 |
D78 / A2 |
TIM1 CH2N / TIM3 CH3 / TIM8 CH2N |
D79 / A3 |
TIM1 CH3N / TIM3 CH4 / TIM8 CH3N |
D83 / A7 |
TIM2 CH1 / TIM5 CH1 |
D85 / A13 |
TIM2 CH1 / TIM8 CH1N |
ขับเคลื่อนพินใดก็ได้ผ่าน machine.PWM
from machine import Pin, PWM
pwm = PWM(Pin("D2"), freq=1_000, duty_u16=32768)
Warning
TIM1 สงวนไว้สำหรับ clock หลักของกล้อง เมื่อกล้องเริ่มต้นผ่าน csi --- เซ็นเซอร์กล้อง พินที่มีฟังก์ชัน PWM เฉพาะบน TIM1 — D1, D10, D11, D12 — ไม่สามารถขับด้วย PWM ขณะที่กล้องกำลังทำงาน พินอื่นๆ ที่แสดงไว้ล้วนมีทางเลือก non-TIM1
Note
พินหลายพินใช้ช่อง timer ร่วมกัน:
TIM2 CH4 อยู่บน
D2และD20TIM2 CH1 อยู่บน
D83/A7และD85/A13TIM3 CH1 อยู่บน
D7,D56และD68TIM3 CH2 อยู่บน
D5และD15TIM4 CH2 อยู่บน
D0และD6TIM5 CH1 อยู่บน
D64และD83/A7TIM5 CH4 อยู่บน
D2และD69TIM8 CH1 อยู่บน
D4,D54และD68TIM8 CH1N อยู่บน
D5,D16,D57และD85/A13TIM8 CH2 อยู่บน
D11,D15,D37และD59TIM8 CH2N อยู่บน
D12,D38,D61และD78/A2TIM8 CH3 อยู่บน
D48และD58TIM8 CH3N อยู่บน
D10,D46และD79/A3TIM15 CH1 อยู่บน
D3และD51TIM15 CH2 อยู่บน
D2และD40
เลือก consumer หนึ่งรายต่อช่อง timer
บัสแบบ Software bit-banged¶
machine.SoftI2C และ machine.SoftSPI ทำงานบน GPIO ใดก็ได้หากคุณต้องการบัสเพิ่มเติม
เซนเซอร์ความร้อน (นอกบอร์ด)¶
เฟิร์มแวร์รวมไดรเวอร์ fir --- ไดรเวอร์เซนเซอร์ความร้อน (fir == far infrared) สำหรับกล้องถ่ายภาพความร้อนที่ต่อสายภายนอก:
MLX90621 — อาร์เรย์ IR 16 × 4
MLX90640 — อาร์เรย์ IR 32 × 24
MLX90641 — อาร์เรย์ IR 16 × 12
AMG8833 — อาร์เรย์ IR 8 × 8
ต่อสายโมดูลกับ I²C bus ของบอร์ดและอ่านเฟรมด้วย fir.init() + fir.snapshot()
import time
import image
import fir
fir.init() # auto‑detects the sensor
clock = time.clock()
while True:
clock.tick()
try:
img = fir.snapshot(x_scale=5, y_scale=5,
color_palette=image.PALETTE_IRONBOW,
hint=image.BICUBIC,
copy_to_fb=True)
except OSError:
continue
print(clock.fps())
ไดรเวอร์ fir สื่อสารกับเซนเซอร์ผ่าน I²C 1 เท่านั้น — ต่อสายโมดูลกับ D8 (SCL) และ D9 (SDA)
การจับเวลา¶
time¶
โมดูล time ครอบคลุมการหน่วงแบบ blocking, monotonic ticks และการวัดเวลาที่ผ่านไป:
import time
time.sleep(1) # seconds
time.sleep_ms(500)
time.sleep_us(10)
start = time.ticks_ms()
# ...do work...
elapsed = time.ticks_diff(time.ticks_ms(), start)
ตัวจับเวลาเสมือน¶
machine.Timer กำหนดเวลาคอลแบ็กแบบ periodic หรือ one-shot โดยไม่ใช้ slot ตัวจับเวลาฮาร์ดแวร์ ส่ง -1 เป็น id เพื่อใช้ตัวจับเวลาเสมือน (software):
from machine import Timer
one_shot = Timer(-1)
one_shot.init(period=5_000, mode=Timer.ONE_SHOT,
callback=lambda t: print("once"))
periodic = Timer(-1)
periodic.init(period=2_000, mode=Timer.PERIODIC,
callback=lambda t: print("tick"))
ค่า period เป็นมิลลิวินาที เรียก deinit() เพื่อหยุดและปล่อย slot
นาฬิกาเวลาจริง¶
machine.RTC เก็บเวลานาฬิกาผนังผ่านการรีเซ็ต — และผ่านการปิดไฟเต็มรูปแบบเมื่อเชื่อมต่อเซลล์เหรียญกับพิน VRTC
from machine import RTC
rtc = RTC()
rtc.datetime((2026, 4, 30, 4, 12, 0, 0, 0)) # Y, M, D, weekday, h, m, s, subsec
print(rtc.datetime())
Watchdog¶
machine.WDT รีเซ็ตบอร์ดหากแอปพลิเคชันค้าง เมื่อเริ่มต้นแล้วไม่สามารถหยุดหรือกำหนดค่าใหม่ได้ — ป้อนอย่างสม่ำเสมอภายใน main loop:
from machine import WDT
wdt = WDT(timeout=5_000) # 5 second window
while True:
# ...do work...
wdt.feed()
ข้อมูลการบูตและ runtime¶
การอัปเดตเฟิร์มแวร์ (DFU)¶
Giga R1 ใช้ การรีเซ็ตแบบดับเบิลแท็ป มาตรฐานของ Arduino เพื่อเข้าสู่บูตโหลดเดอร์ของ Arduino กดปุ่ม RESET สองครั้งอย่างรวดเร็ว — บอร์ดจะ re-enumerate ผ่าน USB เป็นอุปกรณ์ DFU และ OpenMV IDE สามารถแฟลชอิมเมจเฟิร์มแวร์ใหม่ได้ หากบูตโหลดเดอร์หายไปทั้งหมด ให้กดปุ่ม BOOT0 ค้างไว้ขณะกด RESET เพื่อบังคับให้ SoC เข้าสู่โหมดบูตโหลดเดอร์ ROM
สคริปต์ที่กำลังทำงานสามารถกลับเข้าสู่บูตโหลดเดอร์ได้ตามต้องการโดยเรียก machine.bootloader()
import machine
machine.bootloader()
ระบบไฟล์และลำดับการบูต¶
เฟิร์มแวร์ Giga R1 เมาต์ระบบไฟล์ได้ถึงสองระบบเมื่อบูต:
แฟลชภายใน — เมาต์เสมอที่
/flashเก็บmain.pyและREADME.txtโดยค่าเริ่มต้น สร้างขึ้นเมื่อบูตครั้งแรกROMFS — ระบบไฟล์แบบอ่านอย่างเดียวที่แมปหน่วยความจำที่
/romเมาต์โดยอัตโนมัติโดย MicroPython เมื่อเริ่มต้น
หลังจากเมาต์แล้ว ไดเรกทอรีทำงานจะถูกตั้งค่าเป็น /flash จากนั้น interpreter จะรันสคริปต์จากไดเรกทอรีนั้น:
boot.pyถูกรันบน ทุก soft reset (cold boot,Ctrl‑Dจาก REPL หรือเมื่อสคริปต์ที่กำลังทำงานส่งคืน)main.pyถูกรัน เฉพาะเมื่อ cold boot ทันทีหลังจากboot.pysoft reset ครั้งต่อไปจะรันboot.pyซ้ำแต่จะข้ามไปยัง REPL โดยตรง — เพื่อรันmain.pyซ้ำคุณต้องรีเซ็ตบอร์ดอย่างสมบูรณ์
main.py เริ่มต้นที่จัดส่งบนบอร์ดที่แฟลชใหม่เพิ่งกระพริบช่อง สีน้ำเงิน ของ RGB LED ของผู้ใช้เป็นสัญญาณ heartbeat (สองพัลส์สั้น ช่องว่างสั้น) เพื่อบอกว่าเฟิร์มแวร์บูตสำเร็จโดยไม่มีโฮสต์เชื่อมต่ออยู่
sys.path ขยายเพื่อรวมทั้งสองระบบไฟล์และซับไดเรกทอรี lib/ ดังนั้น modules ที่ import ได้สามารถอยู่ใน /flash/lib หรือ /rom/lib
เมื่อเชื่อมต่อผ่าน USB, /flash ยังระบุตัวเองเป็น USB mass-storage drive บนโฮสต์ด้วย ช่วยให้คุณแก้ไข boot.py, main.py และไฟล์อื่นๆ ได้โดยตรง ꈊeject drive ก่อนรีเซ็ตบอร์ด เพื่อให้โฮสต์ flush การเขียนที่แคชไว้
Note
เนื่องจาก OS ถือว่า drive เป็น block device แบบ passive ไฟล์ที่สร้างหรือแก้ไขโดยโค้ดที่ทำงานบนกล้องจะไม่แสดงจนกว่าโฮสต์จะ re-mount drive หาก OS และกล้องเขียนระบบไฟล์เดียวกันพร้อมกัน OS จะชนะและเขียนทับการเปลี่ยนแปลงที่กล้องทำ
Note
ช่อง สีแดง ของ RGB LED ของผู้ใช้อาจติดขึ้นชั่วคราวขณะที่โฮสต์กำลังอ่านจากหรือเขียนไปยัง USB mass-storage drive — นี่คือตัวบ่งชี้กิจกรรมที่ขับเคลื่อนโดยเฟิร์มแวร์ ไม่ใช่ข้อผิดพลาด
ขนาดที่เก็บข้อมูล¶
Giga R1 จัดส่งมาพร้อมกับ:
/flash— ระบบไฟล์ FAT 11 MB อ่าน/เขียน/rom— ROMFS แบบอ่านอย่างเดียวที่แมปหน่วยความจำ 4 MB ใช้สำหรับจัดส่งสคริปต์และโมเดล ML ที่ได้ประโยชน์จากการเข้าถึง mmap แบบ zero-copy
ตัวบ่งชี้ hard fault¶
หาก RGB LED ของผู้ใช้วนซ้ำสีอย่างรวดเร็วทุกสี — เร็วพอที่มักดูเหมือน LED สีขาวกระพริบ มากกว่าสีที่ชัดเจน — เฟิร์มแวร์พบ hard fault ที่ไม่สามารถกู้คืนได้ Reflash เฟิร์มแวร์เพื่อกู้คืน หากการ reflash ไม่ช่วย บอร์ดอาจเสียหายทางกายภาพ
ไลบรารีซอฟต์แวร์¶
ดู ดัชนีไลบรารี สำหรับรายการโมดูลทั้งหมด — รวมถึงโมดูลที่มีเฉพาะใน Giga R1 build