AE3 OLED Breakout¶
AE3 OLED Breakout는 OpenMV AE3와 128 × 128 RGB OLED, 5방향 조이스틱, 그리고 10핀 ARM SWD 헤더를 결합하여 독립형 미리보기, 간단한 입력, JTAG/SWD 디버그를 제공합니다.
전체 데이터시트, 사진, 주문 정보는 AE3 OLED Breakout 제품 페이지를 참조하세요.
주요 특징¶
SSD1351 컨트롤러를 통해 SPI로 구동되는 128 × 128 RGB OLED.
중앙 푸시 버튼이 있는 AS90R 5방향 조이스틱으로,
P4/P5I²C 버스에 노출됩니다.보안 엔클레이브 UART 접근을 위한 리셋 버튼과 복구 스위치.
패널을 SPI 버스에서 전기적으로 분리하는 OLED 분리 스위치.
동일한
P4/P5I²C 버스에 있는 두 개의 Qwiic 커넥터.SWD/JTAG 디버깅을 위한 ARM 10핀 Cortex Debug 헤더.
4개의 접지 후크 테스트 포인트.
참고
네 모서리의 M1.6 장착 구멍을 통해 Breakout을 인클로저나 고정구에 볼트로 고정할 수 있습니다.
핀 참조¶
Breakout의 모든 AE3 신호는 AE3 하단의 B2B 헤더에서 가져와 양쪽 측면 핀 헤더로 인출됩니다 — 한쪽은 P0–P5, 다른 쪽은 P6–P9이며, 둘 다 3.3 V 기준입니다. 각 핀의 전체 대체 기능 목록은 OpenMV AE3 페이지에 있으며, Breakout은 다음과 같이 핀을 사용합니다:
핀 |
기준 |
AE3 기능 |
Breakout 용도 |
|---|---|---|---|
P0 |
3.3 V |
SPI0 MOSI / I2C2 SCL / UART4 TX / TIM0 T1 / PDM D3 |
OLED SPI MOSI |
P1 |
3.3 V |
SPI0 MISO / I2C2 SDA / UART4 RX / TIM0 T0 |
사용 안 함 |
P2 |
3.3 V |
SPI0 SCLK / LPI2C SDA / UART5 TX / TIM1 T1 |
OLED SPI SCLK |
P3 |
3.3 V |
SPI0 SS / LPI2C SCL / UART5 RX / TIM1 T0 / PDM C3 |
OLED SPI CS |
P4 |
3.3 V |
I2C1 SCL / UART1 TX / TIM2 T1 / PDM C0 / CAN TX |
조이스틱 / Qwiic I²C SCL |
P5 |
3.3 V |
I2C1 SDA / UART1 RX / TIM2 T0 / PDM D0 / CAN RX |
조이스틱 / Qwiic I²C SDA |
RESET |
3.3 V |
NRST |
온보드 RESET 버튼을 누르거나 GND로 당겨 AE3를 리셋합니다 |
P6 |
3.3 V |
I2C1 SDA / UART3 CTS / TIM9 T0 |
사용 안 함 |
P7 |
3.3 V |
I2C1 SCL / UART3 RTS / TIM9 T1 |
OLED RESET |
P8 |
3.3 V |
I3C SDA / UART3 RX / TIM5 T0 / ADC ch S10 |
OLED DC (레지스터 선택) |
P9 |
3.3 V |
I3C SCL / UART3 TX / TIM5 T1 / ADC ch S11 |
조이스틱 IRQ (상태 변경 시 액티브 로우) |
3.3V 레일 |
— |
— |
OLED, 조이스틱 익스팬더, Qwiic 장치에 전원을 공급합니다 |
GND 레일 |
— |
— |
공통 접지 |
참고
복구 스위치는 AE3의 내부 USB 먹스를 전환합니다: AE3 자체 USB 핀이 USB-C 포트에서 분리되고, 대신 보안 엔클레이브 UART의 USB-시리얼 변환기가 포트에 연결됩니다. 스위치가 작동되면 호스트 측 Alif 도구가 보안 엔클레이브와 통신하여 AE3의 부트로더를 재프로그래밍할 수 있습니다. 정상 동작 시에는 USB-C 포트가 AE3의 USB로 작동하도록 스위치를 비활성화 상태로 두세요.
참고
OLED 활성화 스위치는 OLED가 동작하려면 켜져 있어야 합니다 — 이 스위치는 패널로의 전원을 제어하고 OLED 제어 핀(P0, P2, P3, P7, P8)을 AE3의 GPIO로 연결합니다. 스위치가 꺼지면 P4, P5, P9만 연결된 상태로 유지됩니다. 현재 스위치 상태는 조이스틱 익스팬더에서 비트 0x40으로 나타납니다 — 익스팬더의 원시 핀은 스위치가 활성화되면 로우로 읽힙니다.
Qwiic 헤더¶
Breakout에는 두 개의 Qwiic 4핀 JST-SH 1.0 mm 커넥터가 있으며, 온보드 조이스틱 익스팬더와 동일한 P4/P5 I²C 버스를 공유하므로, 추가 Qwiic 장치는 조이스틱 익스팬더의 주소(0x63)를 피해야 합니다.
핀 |
신호 |
|---|---|
1 |
GND |
2 |
+3.3 V |
3 |
SDA ( |
4 |
SCL ( |
JTAG 헤더¶
브레이크아웃의 10핀 1.27 mm ARM Cortex Debug 헤더는 AE3의 SWD/JTAG 라인에 직접 연결되어 있습니다. 모든 신호는 1.8 V 기준입니다 — 레벨 시프팅 프로브를 사용하거나 타겟 전압이 VCC_REF(1번 핀)를 따라가는 프로브를 사용하세요.
핀 |
신호 |
|---|---|
1 |
VCC_REF (+1.8 V) |
2 |
TMS (SWDIO) |
3 |
+1.8 V |
4 |
TCK (SWCLK) |
5 |
GND |
6 |
TDO (SWO) |
7 |
키 (핀 없음) |
8 |
TDI |
9 |
GND |
10 |
DEBUG_RST_N (JTAG/디버그 리셋 — 시스템 NRST와 별개) |
사용법¶
SSD1351 컨트롤러 인스턴스와 함께 display.SPIDisplay를 통해 OLED를 구동합니다. 카메라 프레임을 128 × 128 패널로 스트리밍합니다:
import csi
import time
import display
import image
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)
csi0.window((400, 400))
lcd = display.SPIDisplay(width=128, height=128,
controller=display.SSD1351())
clock = time.clock()
while True:
clock.tick()
lcd.write(csi0.snapshot(),
hint=image.CENTER | image.SCALE_ASPECT_KEEP)
print(clock.fps())
고정된 pca9674a.PCA9674A 드라이버를 통해 5방향 조이스틱을 읽습니다. 익스팬더는 상태 변경 시 P9를 어서트하므로, 새 버튼 상태를 래치하는 IRQ 콜백을 연결하세요. 버튼은 익스팬더에서 액티브 로우입니다. 아래 코드는 읽은 값을 0xFF로 XOR하므로 state에서 설정된 비트는 눌림을 의미합니다:
비트 |
방향 |
|---|---|
|
조이스틱 오른쪽 |
|
조이스틱 위쪽 |
|
조이스틱 왼쪽 |
|
조이스틱 아래쪽 |
|
조이스틱 중앙 누름 |
|
OLED 활성화 스위치 (OLED가 활성화되면 |
import csi
import time
import display
from pca9674a import PCA9674A
from machine import I2C
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)
csi0.window((400, 400))
lcd = display.SPIDisplay(width=128, height=128,
controller=display.SSD1351())
clock = time.clock()
state = 0
cursor_x = 0
cursor_y = 0
def read_expander(pin):
global exp, state
# Buttons are active‑low on the expander; XOR for active‑high bits.
state = exp.read() ^ 0xFF
exp = PCA9674A(I2C(1), irq_pin="P9", callback=read_expander)
def update_cursor():
global cursor_x, cursor_y
if state & 0x01: cursor_x += 2 # Right
if state & 0x02: cursor_y -= 2 # Up
if state & 0x04: cursor_x -= 2 # Left
if state & 0x08: cursor_y += 2 # Down
if state & 0x10: # Centre
cursor_x = 0
cursor_y = 0
while True:
clock.tick()
update_cursor()
lcd.write(csi0.snapshot(), x=cursor_x, y=cursor_y,
x_scale=128 / 400, y_scale=128 / 400)
print(clock.fps())