AE3 OLED Breakout

El AE3 OLED Breakout combina la OpenMV AE3 con una OLED RGB de 128 × 128, un joystick de 5 direcciones y un conector ARM SWD de 10 pines para vista previa autónoma, entrada sencilla y depuración JTAG/SWD.

AE3 OLED Breakout

Para ver la hoja de datos completa, fotos e información de compra, consulta la página de producto del AE3 OLED Breakout.

Aspectos destacados

  • OLED RGB de 128 × 128 controlada por un controlador SSD1351 a través de SPI.

  • Joystick de 5 direcciones AS90R con botón central pulsable, expuesto en el bus I²C P4/P5.

  • Botón de reinicio e interruptor de recuperación para el acceso UART al enclave seguro.

  • Interruptor de desconexión de la OLED para retirar eléctricamente el panel del bus SPI.

  • Dos conectores Qwiic en el mismo bus I²C P4/P5.

  • Conector ARM Cortex Debug de 10 pines para depuración SWD/JTAG.

  • Cuatro puntos de prueba de gancho a tierra.

Nota

Cuatro orificios de montaje M1.6 en las esquinas que permiten atornillar el breakout a una carcasa o soporte.

Referencia de pines

Todas las señales del AE3 en el breakout se toman del conector B2B de la parte inferior del AE3 y se llevan a dos hileras de pines laterales — P0P5 en un lado, P6P9 en el otro — ambas referenciadas a 3,3 V. La lista completa de funciones alternativas de cada pin se encuentra en la página de la OpenMV AE3; el breakout utiliza los pines de la siguiente manera:

Pin

Referencia

Características del AE3

Uso en el 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

libre

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

Pulsa el botón RESET de la placa o conecta a GND para reiniciar el AE3

P6

3,3 V

I2C1 SDA / UART3 CTS / TIM9 T0

libre

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 (selección de registro)

P9

3,3 V

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

Joystick IRQ (activo en bajo al cambiar de estado)

Riel de 3,3 V

Alimenta la OLED, el expansor del joystick y los dispositivos Qwiic

Riel GND

Tierra común

Nota

El interruptor de recuperación conmuta un mux USB interno del AE3: los propios pines USB del AE3 se desconectan del puerto USB-C, y en su lugar se conecta al puerto un conversor USB a serie sobre la UART del enclave seguro. Con el interruptor activado, las herramientas Alif del lado del host pueden comunicarse con el enclave seguro para reprogramar el bootloader del AE3. Deja el interruptor desactivado para el funcionamiento normal, de modo que el puerto USB-C actúe como el USB del AE3.

Nota

El interruptor de activación de la OLED debe estar encendido para que la OLED funcione — controla la alimentación del panel y conecta los pines de control de la OLED (P0, P2, P3, P7, P8) hasta los GPIO del AE3. Con el interruptor apagado, solo P4, P5 y P9 permanecen conectados. El estado actual del interruptor aparece en el expansor del joystick como el bit 0x40 — el pin sin procesar del expansor lee bajo cuando el interruptor está activado.

Conectores Qwiic

El breakout dispone de dos conectores Qwiic JST-SH de 4 pines y 1,0 mm que comparten el mismo bus I²C P4/P5 que el expansor del joystick de la placa, por lo que los dispositivos Qwiic adicionales deben evitar la dirección del expansor del joystick (0x63).

Pin

Señal

1

GND

2

+3,3 V

3

SDA (P5)

4

SCL (P4)

Conector JTAG

El conector ARM Cortex Debug de 10 pines y 1,27 mm del breakout está cableado directamente a las líneas SWD/JTAG del AE3. Todas las señales están referenciadas a 1,8 V — usa una sonda con cambio de nivel o una cuyo voltaje objetivo siga a VCC_REF (pin 1).

Pin

Señal

1

VCC_REF (+1,8 V)

2

TMS (SWDIO)

3

+1,8 V

4

TCK (SWCLK)

5

GND

6

TDO (SWO)

7

guía (sin pin)

8

TDI

9

GND

10

DEBUG_RST_N (reinicio de JTAG/depuración — independiente del NRST del sistema)

Uso

Controla la OLED mediante display.SPIDisplay con una instancia del controlador SSD1351. Transmite fotogramas de la cámara al panel 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())

Lee el joystick de 5 direcciones mediante el controlador integrado pca9674a.PCA9674A. El expansor activa P9 cuando cambia el estado, así que conecta una función de retorno (callback) de IRQ que registre el nuevo estado del botón. Los botones son activos en bajo en el expansor; el código siguiente aplica un XOR a la lectura con 0xFF para que un bit activado en state signifique pulsado:

Bit

Dirección

0x01

Joystick a la derecha

0x02

Joystick arriba

0x04

Joystick a la izquierda

0x08

Joystick abajo

0x10

Pulsación central del joystick

0x40

Interruptor de activación de la OLED (se activa en state cuando la OLED está habilitada)

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