AE3 OLED Breakout

AE3 OLED Breakout는 OpenMV AE3와 128 × 128 RGB OLED, 5방향 조이스틱, 그리고 10핀 ARM SWD 헤더를 결합하여 독립형 미리보기, 간단한 입력, JTAG/SWD 디버그를 제공합니다.

AE3 OLED Breakout

전체 데이터시트, 사진, 주문 정보는 AE3 OLED Breakout 제품 페이지를 참조하세요.

주요 특징

  • SSD1351 컨트롤러를 통해 SPI로 구동되는 128 × 128 RGB OLED.

  • 중앙 푸시 버튼이 있는 AS90R 5방향 조이스틱으로, P4/P5 I²C 버스에 노출됩니다.

  • 보안 엔클레이브 UART 접근을 위한 리셋 버튼복구 스위치.

  • 패널을 SPI 버스에서 전기적으로 분리하는 OLED 분리 스위치.

  • 동일한 P4/P5 I²C 버스에 있는 두 개의 Qwiic 커넥터.

  • SWD/JTAG 디버깅을 위한 ARM 10핀 Cortex Debug 헤더.

  • 4개의 접지 후크 테스트 포인트.

참고

네 모서리의 M1.6 장착 구멍을 통해 Breakout을 인클로저나 고정구에 볼트로 고정할 수 있습니다.

핀 참조

Breakout의 모든 AE3 신호는 AE3 하단의 B2B 헤더에서 가져와 양쪽 측면 핀 헤더로 인출됩니다 — 한쪽은 P0P5, 다른 쪽은 P6P9이며, 둘 다 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 (P5)

4

SCL (P4)

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에서 설정된 비트는 눌림을 의미합니다:

비트

방향

0x01

조이스틱 오른쪽

0x02

조이스틱 위쪽

0x04

조이스틱 왼쪽

0x08

조이스틱 아래쪽

0x10

조이스틱 중앙 누름

0x40

OLED 활성화 스위치 (OLED가 활성화되면 state에 설정됨)

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())