AE3 OLED Breakout

O AE3 OLED Breakout combina a OpenMV AE3 com um OLED RGB de 128 × 128, um joystick de 5 direções e um conector ARM SWD de 10 pinos para pré-visualização autónoma, entrada simples e depuração JTAG/SWD.

AE3 OLED Breakout

Para datasheet completo, fotografias e encomendas consulte a página do produto AE3 OLED Breakout.

Destaques

  • OLED RGB 128 × 128 controlado por um controlador SSD1351 via SPI.

  • Joystick de 5 direções AS90R com botão de pressão central, exposto no barramento I²C P4/P5.

  • Botão de reset e interruptor de recuperação para acesso UART ao secure enclave.

  • Interruptor de desligamento do OLED para remover eletricamente o painel do barramento SPI.

  • Dois conectores Qwiic no mesmo barramento I²C P4/P5.

  • Conector ARM 10-pin Cortex Debug para depuração SWD/JTAG.

  • Quatro pontos de teste com ganchos para massa.

Nota

Quatro furos de montagem M1.6 nos cantos permitem fixar o breakout a uma caixa ou suporte.

Referência de pinos

Todos os sinais da AE3 no breakout são provenientes do conector B2B na parte inferior da AE3 e disponibilizados em dois conectores laterais — P0P5 de um lado, P6P9 do outro — ambos com referência a 3,3 V. A lista completa de funções alternativas de cada pino está na página da OpenMV AE3; o breakout utiliza os pinos da seguinte forma:

Pino

Referência

Características da AE3

Uso no 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

livre

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

Joystick / Qwiic I²C SCL

P5

3.3 V

I2C1 SDA / UART1 RX / TIM2 T0 / PDM D0 / CAN RX

Joystick / Qwiic I²C SDA

RESET

3.3 V

NRST

Pressione o botão RESET integrado ou ligue a GND para reiniciar a AE3

P6

3.3 V

I2C1 SDA / UART3 CTS / TIM9 T0

livre

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 (seleção de registo)

P9

3.3 V

I3C SCL / UART3 TX / TIM5 T1 / ADC ch S11

Joystick IRQ (ativo baixo em caso de mudança de estado)

Rail 3.3V

Alimenta o OLED, o expansor do joystick e os dispositivos Qwiic

Rail GND

Massa comum

Nota

O interruptor de recuperação comuta um mux USB interno na AE3: os pinos USB próprios da AE3 são desligados da porta USB-C, e um conversor USB-série no UART do secure enclave é ligado à porta em seu lugar. Com o interruptor ativado, as ferramentas Alif do lado do computador podem comunicar com o secure enclave para reprogramar o bootloader da AE3. Deixe o interruptor desativado para funcionamento normal, de modo a que a porta USB-C funcione como USB da AE3.

Nota

O interruptor de ativação do OLED tem de estar ligado para o OLED funcionar — controla a alimentação do painel e liga os pinos de controlo do OLED (P0, P2, P3, P7, P8) aos GPIO da AE3. Com o interruptor desligado, apenas P4, P5 e P9 permanecem ligados. O estado atual do interruptor aparece no expansor do joystick como bit 0x40 — o pino bruto do expansor lê baixo quando o interruptor está ativado.

Conectores Qwiic

Dois conectores Qwiic JST-SH de 4 pinos e 1,0 mm estão presentes no breakout e partilham o mesmo barramento I²C P4/P5 que o expansor do joystick integrado, pelo que dispositivos Qwiic adicionais devem evitar o endereço do expansor do joystick (0x63).

Pino

Sinal

1

GND

2

+3.3 V

3

SDA (P5)

4

SCL (P4)

Conector JTAG

O conector ARM Cortex Debug de 10 pinos e 1,27 mm no breakout está ligado diretamente às linhas SWD/JTAG da AE3. Todos os sinais têm referência a 1,8 V — utilize uma sonda com conversão de nível ou uma cujo tensão alvo siga VCC_REF (pino 1).

Pino

Sinal

1

VCC_REF (+1.8 V)

2

TMS (SWDIO)

3

+1.8 V

4

TCK (SWCLK)

5

GND

6

TDO (SWO)

7

chave (sem pino)

8

TDI

9

GND

10

DEBUG_RST_N (reset JTAG/depuração — separado do NRST do sistema)

Utilização

Controle o OLED através de display.SPIDisplay com uma instância do controlador SSD1351. Transmita fotogramas da câmara para o painel de 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())

Leia o joystick de 5 direções através do driver congelado pca9674a.PCA9674A. O expansor asserta P9 em caso de mudança de estado, pelo que deve ser configurado um callback de IRQ que capture o novo estado dos botões. Os botões estão ativos-baixo no expansor; o código abaixo efetua XOR da leitura com 0xFF de modo a que um bit definido em state signifique pressionado:

Bit

Direção

0x01

Joystick direita

0x02

Joystick cima

0x04

Joystick esquerda

0x08

Joystick baixo

0x10

Joystick pressão central

0x40

Interruptor de ativação do OLED (definido em state quando o OLED está ativo)

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