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.
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 — P0–P5 en un lado, P6–P9 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 ( |
4 |
SCL ( |
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 |
|---|---|
|
Joystick a la derecha |
|
Joystick arriba |
|
Joystick a la izquierda |
|
Joystick abajo |
|
Pulsación central del joystick |
|
Interruptor de activación de la OLED (se activa en |
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())