Arduino Giga R1 WiFi¶
Arduino Giga R1 WiFi là bo mạch dạng Mega có kích thước 101 × 53 mm, được xây dựng xung quanh STMicroelectronics STM32H747XI — một SoC lõi kép kết hợp Cortex‑M7 ở 480 MHz với Cortex‑M4 ở 240 MHz. Firmware OpenMV chạy hoàn toàn trên lõi M7. Bo Giga bổ sung thêm đầu nối cáp mềm camera 22 chân Arducam, đầu nối MIPI‑DSI cho Arduino Giga Display Shield, và jack âm thanh stereo 3.5 mm vào bố cục header Arduino Mega tiêu chuẩn.
Để xem datasheet đầy đủ, ảnh chụp và kích thước, hãy truy cập trang sản phẩm Arduino Giga R1 WiFi.
Điểm nổi bật¶
STMicroelectronics STM32H747XI hai lõi Cortex‑M7 (480 MHz) + Cortex‑M4 (240 MHz). Firmware OpenMV chỉ chạy trên lõi M7; lõi M4 được hiển thị qua openamp cho Giao tiếp Liên vi xử lý.
8 MB SDRAM ngoài cùng với 2 MB flash nội và 16 MB flash QSPI ngoài.
Bộ mã hóa/giải mã JPEG phần cứng.
Đầu nối cáp mềm camera 22 chân tương thích Arducam (
J6) — hỗ trợ driver cho các module cảm biến OV5640 (5MP), OV7670, GC2145, HM01B0, và HM0360.Đầu nối màn hình MIPI‑DSI (
J5) cho Arduino Giga Display Shield (màn hình cảm ứng điện dung 480×800) cùng với bộ máy hiển thị RGB LTDC cho các bo carrier nâng cao.Jack âm thanh 3.5 mm với đầu ra line stereo và mic in.
Wi‑Fi b/g/n (2.4 GHz) + Bluetooth LE 5.1 thông qua module Murata 1DX (CYW4343W) — kết nối với anten đi kèm qua đầu nối U.FL trên bo mạch.
USB‑C (tốc độ đầy đủ) để cấp nguồn / kết nối serial / lập trình.
I/O người dùng trên các header kiểu Mega —
D0–D75(số),A0–A11(tương tự),DAC0/DAC1(đầu ra DAC),CAN_RX/CAN_TX(FDCAN2), và cặp I²CSDA1/SCL1ở hàng trong. Một header SPI1 6 chân riêng ở mặt trước bo mạch đưa raCIPO/COPI/SCK(D89/D90/D91).JTAG / SWD được đưa ra trên header debug phía trên để debug nâng cao.
Sơ đồ chân¶
Tham chiếu chân (pin)¶
Các header kiểu Arduino Mega hiển thị 76 chân số (D0–D75), 12 chân tương tự (A0–A11), hai đầu ra DAC (DAC0/DAC1), một cặp I²C phụ (SDA1/SCL1), và một cặp FDCAN2 (CAN_RX/CAN_TX). Một header SPI1 6 chân riêng ở mặt trước bo mạch đưa ra CIPO/COPI/SCK (D89/D90/D91).
Tên chân |
Tham chiếu |
Chức năng |
|---|---|---|
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 (bus điều khiển cảm biến / màn hình cảm ứng) |
SCL1 / D101 |
3.3 V |
I2C4 SCL (bus điều khiển cảm biến / màn hình cảm ứng) |
RESET |
3.3 V |
nhấn nút RESET trên bo mạch hoặc kéo xuống GND để đặt lại |
LED_RED |
3.3 V |
Kênh đỏ của LED RGB (mức thấp kích hoạt) |
LED_GREEN |
3.3 V |
Kênh xanh lá của LED RGB (mức thấp kích hoạt) |
LED_BLUE |
3.3 V |
Kênh xanh lam của LED RGB (mức thấp kích hoạt) |
Ghi chú
A8–A11 là các pad chỉ tương tự trên các chân _C của STM32H747 — chúng không có chức năng GPIO và chỉ có thể đọc qua ADC.
Chân nguồn¶
Chân trên header Mega:
VIN — đầu vào 6–32 V. Cấp nguồn cho bo mạch qua bộ điều chỉnh buck trên bo.
+5V — nguồn 5 V lấy từ USB qua diode hoặc bộ điều chỉnh buck trên bo.
+3V3 — nguồn 3.3 V chính.
IOREF — phản ánh điện áp I/O của bo mạch (3.3 V).
AREF — điện áp tham chiếu tương tự cho các chân ADC. Mặc định là 3.3 V; cung cấp từ bên ngoài để sử dụng tham chiếu khác.
OFF — kéo xuống GND để tắt nguồn +3.3 V và tắt hệ thống.
VRTC — đầu vào pin đồng xu 3.0 V (tối đa 3.3 V) giúp RTC trên chip tiếp tục hoạt động khi phần còn lại của bo đã tắt nguồn.
GND — đất chung.
Giga R1 có thể được cấp nguồn qua bất kỳ đường nào sau đây:
USB‑C — cung cấp 5 V cho bộ điều chỉnh buck trên bo.
Chân VIN — cấp nguồn điều chỉnh 6–32 V trực tiếp.
Mẹo
Sử dụng công cụ ước tính thời lượng pin để mô phỏng thời gian hoạt động của Giga R1 trên pin cho một chu kỳ hoạt động / ngủ sâu nhất định.
Chân khôi phục và debug¶
RESET — cả chân được đưa ra trên header nguồn lẫn công tắc tức thời ở mặt trên bo, được kết nối với đường NRST của SoC. Kéo xuống GND hoặc nhấn nút để đặt lại.
Giga R1 sử dụng double‑tap reset tiêu chuẩn của Arduino để vào bootloader của Arduino. Nhấn nút RESET nhanh hai lần — bo mạch sẽ liệt kê lại qua USB như một thiết bị DFU và OpenMV IDE có thể nạp firmware mới.
Nếu bootloader bị mất hoàn toàn, giữ nút BOOT0 trong khi nhấn RESET để buộc SoC vào chế độ bootloader ROM.
Các tín hiệu SWD của STM32 được đưa ra trên header Cortex Debug 10 chân bước 1.27 mm ở mặt trước bo mạch. Kết nối chúng qua SEGGER J‑Link, ST‑Link, hoặc bất kỳ đầu dò JTAG/SWD ARM tiêu chuẩn nào. Tất cả tín hiệu debug đều tham chiếu 3.3 V.
Ngoại vi trên bo¶
LED¶
Giga R1 có một LED RGB người dùng duy nhất, có thể điều khiển bằng phần mềm thông qua machine.LED
from machine import LED
LED("LED_RED").on()
LED("LED_GREEN").on()
LED("LED_BLUE").on()
Một LED nguồn riêng biệt trên bo sáng lên bất cứ khi nào nguồn +3.3 V hoạt động và không thể điều khiển bằng người dùng.
Đầu nối camera (J6)¶
J6 là đầu nối cáp mềm camera 22 chân tương thích Arducam. Cắm bất kỳ module cảm biến được hỗ trợ nào và firmware sẽ tự động dò tìm chúng thông qua module csi --- cảm biến camera
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()
Các cảm biến được hỗ trợ:
OV5640 — 5 MP màu, tối đa QSXGA (2592 × 1944).
OV7670 — 0.3 MP màu, tối đa VGA (640 × 480).
GC2145 — 2 MP màu, tối đa UXGA (1600 × 1200).
HM01B0 — 320 × 320 đơn sắc.
HM0360 — VGA (640 × 480) đơn sắc.
Cảnh báo
Trong khi camera đang được khởi tạo, các chân header Mega sau đây được firmware chiếm dụng và không thể sử dụng:
Chân |
Lý do |
|---|---|
|
Tín hiệu dữ liệu + đồng bộ DCMI trên đầu nối cáp mềm camera |
|
TIM1 CH3 — xung nhịp chính của camera |
|
GPIO reset camera |
|
GPIO tắt nguồn camera |
|
I²C 4 — dùng chung với camera; bus có thể sử dụng nhưng tránh địa chỉ I²C của cảm biến |
Học máy¶
ml --- Machine Learning chạy các mô hình (ML) TFLite đã lượng tử hóa trên Cortex‑M7 với nhân CMSIS‑NN — đủ nhanh cho các bộ phát hiện nhỏ gọn ở vài khung hình mỗi giây. Các mô hình (ML) trên hệ thống tệp chỉ đọc /rom tải trực tiếp từ flash mà không cần sao chép vào RAM. Đây là bộ phát hiện BlazeFace 128×128 phủ khuôn mặt được phát hiện và sáu điểm đặc trưng của nó trên mỗi khung hình:
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")
Lõi M4¶
Lõi Cortex‑M4 được hiển thị thông qua openamp cho giao tiếp liên vi xử lý. Firmware OpenMV chạy chỉ trên M7; lõi M4 không có runtime MicroPython riêng, vì vậy sử dụng nó có nghĩa là xây dựng firmware C riêng biệt và tải nó từ hệ thống tệp qua openamp.RemoteProc. Firmware ví dụ được dựng sẵn triển khai điểm cuối UART ảo có sẵn trong kho lưu trữ openamp_vuart — làm theo README để xây dựng 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)
Trên thực tế, hỗ trợ này nên được xem là minh chứng của giao diện openamp hơn là nền tảng lõi kép hoạt động được — lõi M4 không thể được đặt lại độc lập với M7, vì vậy dừng M4 buộc phải khởi động lại toàn bộ hệ thống.
Màn hình (J5)¶
J5 là đầu nối MIPI‑DSI cho Arduino Giga Display Shield — một màn hình cảm ứng điện dung 480 × 800 được xây dựng xung quanh driver panel ST7701 và bộ điều khiển cảm ứng GT911. Cả hai driver đều được đóng băng cùng với firmware. Sử dụng display --- trình điều khiển màn hình để đẩy bộ đệm khung hình và gt911.GT911 cho đầu vào cảm ứng.
Ví dụ dưới đây phản chiếu camera vào cửa sổ hiển thị 800 × 480 dạng dọc và phủ mỗi điểm chạm dưới dạng hình tròn có màu:
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())
Cảnh báo
Giga Display Shield sử dụng cùng bus I²C 4 (SDA1/SCL1) như camera, D74 cho bật đèn nền LCD, D70/D71 cho IRQ và reset cảm ứng GT911, và D68/D69 cho tín hiệu TE và RESET của panel DSI.
Microphone (Display Shield)¶
Arduino Giga Display Shield mang một microphone số được kết nối với ngoại vi DFSDM của STM32H747 (xung nhịp mic trên D75, dữ liệu mic trên D73). Microphone được thu âm thông qua audio --- Mô-đun Âm thanh. Mỗi bộ đệm đến dưới dạng bytearray PCM 16‑bit có dấu, sẵn sàng đưa vào ulab/numpy để xử lý tín hiệu số:
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 mang một IMU 6 trục Bosch BMI270 (gia tốc kế 3D + con quay hồi chuyển 3D) trên cùng bus I²C 4 tại địa chỉ 0x68. Sử dụng driver cộng đồng micropython_bmi270 để đọc nó:
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)
Bản đồ thanh ghi đầy đủ có trong datasheet BMI270.
LED RGB (Display Shield)¶
Arduino Giga Display Shield mang một LED RGB trên bo được điều khiển bởi driver LED 3 kênh ISSI IS31FL3197 trên cùng bus I²C 4. Chân AD của driver được nối xuống GND, nên nó ở địa chỉ I²C 0x50. Sử dụng driver cộng đồng IS31FL3197 để điều khiển LED:
from machine import I2C
from is31fl3197 import IS31FL3197
led = IS31FL3197(I2C(4, freq=400_000))
led.set_color(255, 0, 0) # full red
Bản đồ thanh ghi đầy đủ có trong datasheet IS31FL3197.
Wi‑Fi¶
Murata 1DX (CYW4343W) trên bo được hiển thị qua network --- cấu hình mạng như một giao diện trạm. Kết nối anten đi kèm vào đầu nối U.FL trên bo trước khi bật radio:
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 này cũng hiển thị Bluetooth LE 5.1. Sử dụng aioble --- Async BLE cho BLE thân thiện với asyncio — ví dụ, quảng bá như một ngoại vi và chờ một thiết bị trung tâm kết nối:
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())
Tham chiếu bus¶
GPIO¶
Sử dụng machine.Pin để đọc hoặc điều khiển bất kỳ chân nào được in ký hiệu. Đầu ra là 3.3 V CMOS và có thể thu/cấp nguồn tới 20 mA mỗi chân (140 mA tổng cộng trên toàn bộ header).
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())
Bất kỳ chân đầu vào nào cũng có thể kích hoạt ngắt khi có chuyển tiếp cạnh:
def handler(pin):
print("triggered:", pin)
Pin("D3", Pin.IN, Pin.PULL_UP).irq(
handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)
UART¶
Bus |
TX |
RX |
Tên 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¶
Bus |
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")
Bus 2 (D20/D21, tức SCL/SDA được in ký hiệu) là bus Arduino Wire mặc định. Bus 4 (SCL1/SDA1) dùng chung với camera và bộ điều khiển cảm ứng GT911 của Giga Display Shield — các thiết bị người dùng trên bus này phải tránh các địa chỉ sau (7‑bit):
0x3C— OV5640 / GC21450x24— HM01B0 / HM03600x21— OV76700x5D— Bộ điều khiển cảm ứng GT911 (Giga Display Shield)
Phần cứng tương tự cũng có thể sử dụng ở chế độ target (slave) thông qua machine.I2CTarget để hiển thị một vùng bộ nhớ cho bộ điều khiển I²C khác:
from machine import I2CTarget
buf = bytearray(32)
target = I2CTarget(2, addr=0x42, mem=buf)
SPI¶
Bus |
MOSI |
MISO |
SCK |
|---|---|---|---|
SPI1 |
D90 |
D89 |
D91 |
SPI5 |
D11 |
D12 |
D13 |
SPI1 được đưa ra trên header 6 chân riêng ở mặt trước bo mạch. SPI5 được đưa ra trên các nhãn COPI/CIPO/SCK in ký hiệu ở D11/D12/D13.
Ghi chú
Sơ đồ chân của header SPI1 6 chân mặt trước (J7):
Chân |
Tín hiệu |
|---|---|
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)¶
Bus |
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 hiển thị mười hai kênh ADC 12‑bit trên A0–A11, tất cả tham chiếu 3.3 V — read_u16 trả về 0–65535 trên khoảng 0–3.3 V tại chân. A8–A11 là các pad _C chỉ tương tự không có ngoại vi 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)
Ghi chú
A7 cũng được kết nối với đầu vào microphone trên jack âm thanh TRRS 3.5 mm — khi cắm tai nghe vào, ADC("A7") đọc tín hiệu mic tương tự trực tiếp.
DAC¶
Hai kênh DAC 12‑bit được hiển thị trên DAC0 và DAC1 thông qua pyb.DAC. Cả hai đều được kết nối với jack âm thanh TRRS 3.5 mm như các kênh line‑out trái và phải:
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¶
Chân |
Bộ định thời / kênh |
|---|---|
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 |
Điều khiển bất kỳ chân nào trong số chúng qua machine.PWM
from machine import Pin, PWM
pwm = PWM(Pin("D2"), freq=1_000, duty_u16=32768)
Cảnh báo
TIM1 được dành riêng cho xung nhịp chính camera khi camera được khởi tạo thông qua csi --- cảm biến camera. Các chân mà chức năng PWM duy nhất là trên TIM1 — D1, D10, D11, D12 — không thể điều khiển PWM khi camera đang hoạt động. Tất cả các chân khác trong danh sách đều có kênh thay thế không phải TIM1.
Ghi chú
Một số chân dùng chung kênh bộ định thời:
TIM2 CH4 nằm trên
D2vàD20.TIM2 CH1 nằm trên
D83/A7vàD85/A13.TIM3 CH1 nằm trên
D7,D56, vàD68.TIM3 CH2 nằm trên
D5vàD15.TIM4 CH2 nằm trên
D0vàD6.TIM5 CH1 nằm trên
D64vàD83/A7.TIM5 CH4 nằm trên
D2vàD69.TIM8 CH1 nằm trên
D4,D54, vàD68.TIM8 CH1N nằm trên
D5,D16,D57, vàD85/A13.TIM8 CH2 nằm trên
D11,D15,D37, vàD59.TIM8 CH2N nằm trên
D12,D38,D61, vàD78/A2.TIM8 CH3 nằm trên
D48vàD58.TIM8 CH3N nằm trên
D10,D46, vàD79/A3.TIM15 CH1 nằm trên
D3vàD51.TIM15 CH2 nằm trên
D2vàD40.
Chọn một thiết bị sử dụng cho mỗi kênh bộ định thời.
Bus bit‑bang bằng phần mềm¶
machine.SoftI2C và machine.SoftSPI hoạt động trên bất kỳ GPIO nào nếu bạn cần thêm bus.
Cảm biến nhiệt (ngoài bo)¶
Firmware bao gồm driver fir --- trình điều khiển cảm biến nhiệt (fir == hồng ngoại xa) cho các thiết bị ảnh nhiệt được kết nối bên ngoài:
MLX90621 — mảng IR 16 × 4
MLX90640 — mảng IR 32 × 24
MLX90641 — mảng IR 16 × 12
AMG8833 — mảng IR 8 × 8
Kết nối module với bus I²C của bo và đọc khung hình bằng 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())
Driver fir chỉ giao tiếp với cảm biến qua I²C 1 — kết nối module với D8 (SCL) và D9 (SDA).
Định thời¶
time¶
Module time bao gồm các hàm trì hoãn chặn, ticks đơn điệu và đo thời gian đã trôi qua:
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)
Bộ định thời ảo¶
machine.Timer lên lịch các hàm gọi lại định kỳ hoặc một lần mà không chiếm khe bộ định thời phần cứng. Truyền -1 làm id để sử dụng bộ định thời ảo (phần mềm):
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"))
Giá trị chu kỳ tính bằng mili giây. Gọi deinit() để dừng và giải phóng khe.
Đồng hồ thời gian thực¶
machine.RTC giữ thời gian thực qua các lần đặt lại — và qua cả lần tắt nguồn hoàn toàn khi có pin đồng xu kết nối với chân 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 đặt lại bo mạch nếu ứng dụng bị treo. Một khi đã khởi động, nó không thể dừng hay cấu hình lại — hãy nạp lại nó định kỳ bên trong vòng lặp chính:
from machine import WDT
wdt = WDT(timeout=5_000) # 5 second window
while True:
# ...do work...
wdt.feed()
Thông tin khởi động và runtime¶
Cập nhật firmware (DFU)¶
Giga R1 sử dụng double‑tap reset tiêu chuẩn của Arduino để vào bootloader của Arduino. Nhấn nút RESET nhanh hai lần — bo mạch sẽ liệt kê lại qua USB như một thiết bị DFU và OpenMV IDE có thể nạp firmware mới. Nếu bootloader bị mất hoàn toàn, giữ nút BOOT0 trong khi nhấn RESET để buộc SoC vào chế độ bootloader ROM.
Một tập lệnh đang chạy có thể vào lại bootloader theo yêu cầu bằng cách gọi machine.bootloader()
import machine
machine.bootloader()
Hệ thống tệp và thứ tự khởi động¶
Firmware Giga R1 gắn kết tối đa hai hệ thống tệp khi khởi động:
Flash nội — luôn được gắn kết tại
/flash. Chứamain.pyvàREADME.txttheo mặc định; được tạo trong lần khởi động đầu tiên.ROMFS — hệ thống tệp ánh xạ bộ nhớ chỉ đọc tại
/rom, được MicroPython tự động gắn kết khi khởi động.
Sau khi gắn kết, thư mục làm việc được đặt thành /flash. Trình thông dịch sau đó chạy các tập lệnh từ thư mục đó:
boot.pyđược thực thi mỗi lần mềm đặt lại (khởi động lạnh,Ctrl‑Dtừ REPL, hoặc bất cứ khi nào tập lệnh đang chạy kết thúc).main.pyđược thực thi chỉ khi khởi động lạnh, ngay sauboot.py. Các lần đặt lại mềm tiếp theo chạy lạiboot.pynhưng chuyển thẳng đến REPL — để chạy lạimain.pybạn phải đặt lại hoàn toàn bo mạch.
main.py mặc định được cài đặt trên bo mới nháy kênh xanh lam của LED RGB người dùng như nhịp tim (hai xung ngắn, khoảng nghỉ ngắn), giúp bạn biết firmware khởi động sạch mà không cần kết nối với máy chủ.
sys.path được mở rộng để bao gồm cả hai hệ thống tệp và các thư mục con lib/ của chúng, vì vậy các module có thể import được có thể nằm trong /flash/lib hoặc /rom/lib.
Khi kết nối qua USB, /flash cũng liệt kê như một ổ đĩa lưu trữ đại chúng USB trên máy chủ, cho phép bạn chỉnh sửa boot.py, main.py, và bất kỳ tệp nào khác trực tiếp. Eject ổ đĩa trước khi đặt lại bo mạch để máy chủ xả các ghi được lưu trong cache.
Ghi chú
Vì HĐH coi ổ đĩa như một thiết bị khối thụ động, các tệp được tạo hoặc sửa đổi bởi mã chạy trên camera sẽ không hiển thị cho đến khi máy chủ gắn lại ổ đĩa. Nếu cả HĐH và camera đều ghi vào cùng một hệ thống tệp đồng thời, HĐH sẽ thắng và ghi đè các thay đổi do camera thực hiện.
Ghi chú
Kênh đỏ của LED RGB người dùng có thể sáng lên thoáng qua khi máy chủ đang đọc từ hoặc ghi vào ổ đĩa lưu trữ đại chúng USB — đây là chỉ báo hoạt động do firmware điều khiển, không phải lỗi.
Kích thước bộ nhớ¶
Giga R1 được cài đặt sẵn:
/flash— hệ thống tệp FAT 11 MB, đọc/ghi./rom— ROMFS ánh xạ bộ nhớ chỉ đọc 4 MB, dùng để cài đặt các tập lệnh và mô hình (ML) được hưởng lợi từ truy cập mmap không sao chép.
Chỉ báo hard‑fault¶
Nếu LED RGB người dùng đang chạy nhanh qua tất cả các màu — nhanh đến mức có xu hướng trông như LED trắng nhấp nháy hơn là các màu riêng biệt — firmware đã gặp lỗi cứng không thể khôi phục. Nạp lại firmware để phục hồi; nếu việc nạp lại không giúp ích, bo mạch có thể bị hỏng về mặt vật lý.
Thư viện phần mềm¶
Xem chỉ mục thư viện để biết danh sách đầy đủ các module — bao gồm những module dành riêng cho bản dựng Giga R1.