AE3 OLED Breakout

Le AE3 OLED Breakout associe l”OpenMV AE3 à un écran OLED RGB 128 × 128, un joystick à 5 directions et un connecteur ARM SWD à 10 broches pour la prévisualisation autonome, la saisie simple et le débogage JTAG/SWD.

AE3 OLED Breakout

Pour la fiche technique complète, les photos et la commande, consultez la page produit AE3 OLED Breakout.

Points forts

  • OLED RGB 128 × 128 piloté par un contrôleur SSD1351 via SPI.

  • Joystick à 5 directions AS90R avec un bouton-poussoir central, exposé sur le bus I²C P4/P5.

  • Bouton de réinitialisation et interrupteur de récupération pour l’accès UART à l’enclave sécurisée.

  • Interrupteur de déconnexion de l’OLED pour retirer électriquement le panneau du bus SPI.

  • Deux connecteurs Qwiic sur le même bus I²C P4/P5.

  • Connecteur ARM Cortex Debug à 10 broches pour le débogage SWD/JTAG.

  • Quatre points de test de mise à la masse.

Note

Quatre trous de montage M1.6 aux coins vous permettent de fixer le breakout sur un boîtier ou un support.

Référence des broches

Tous les signaux AE3 du breakout proviennent du connecteur B2B situé sous l’AE3 et sont ramenés vers deux rangées de broches latérales — P0P5 d’un côté, P6P9 de l’autre — toutes deux référencées en 3,3 V. La liste complète des fonctions alternatives de chaque broche figure sur la page OpenMV AE3 ; le breakout utilise les broches de la manière suivante :

Broche

Référence

Fonctions AE3

Utilisation sur le 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

Appuyez sur le bouton RESET intégré ou tirez vers GND pour réinitialiser l’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 (sélection de registre)

P9

3,3 V

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

Joystick IRQ (actif bas lors d’un changement d’état)

Rail 3,3 V

Alimente l’OLED, l’expandeur du joystick et les périphériques Qwiic

Rail GND

Masse commune

Note

L”interrupteur de récupération bascule un multiplexeur USB interne de l’AE3 : les broches USB propres à l’AE3 sont déconnectées du port USB‑C, et un convertisseur USB‑série relié à l’UART de l’enclave sécurisée est connecté au port à leur place. Lorsque l’interrupteur est activé, les outils Alif côté hôte peuvent communiquer avec l’enclave sécurisée pour reprogrammer le programme d’amorçage de l’AE3. Laissez l’interrupteur désactivé en fonctionnement normal afin que le port USB‑C serve de port USB de l’AE3.

Note

L”interrupteur d’activation de l’OLED doit être activé pour que l’OLED fonctionne — il commande l’alimentation du panneau et relie les broches de contrôle de l’OLED (P0, P2, P3, P7, P8) aux GPIO de l’AE3. Lorsque l’interrupteur est désactivé, seules P4, P5 et P9 restent connectées. L’état actuel de l’interrupteur apparaît sur l’expandeur du joystick au bit 0x40 — la broche brute de l’expandeur lit bas lorsque l’interrupteur est activé.

Connecteurs Qwiic

Deux connecteurs Qwiic à 4 broches JST‑SH 1,0 mm sont présents sur le breakout et partagent le même bus I²C P4/P5 que l’expandeur du joystick intégré ; les périphériques Qwiic supplémentaires doivent donc éviter l’adresse de l’expandeur du joystick (0x63).

Broche

Signal

1

GND

2

+3,3 V

3

SDA (P5)

4

SCL (P4)

Connecteur JTAG

Le connecteur ARM Cortex Debug à 10 broches 1,27 mm du breakout est câblé directement sur les lignes SWD/JTAG de l’AE3. Tous les signaux sont référencés en 1,8 V — utilisez une sonde à décalage de niveau ou une sonde dont la tension cible suit VCC_REF (broche 1).

Broche

Signal

1

VCC_REF (+1,8 V)

2

TMS (SWDIO)

3

+1,8 V

4

TCK (SWCLK)

5

GND

6

TDO (SWO)

7

détrompeur (pas de broche)

8

TDI

9

GND

10

DEBUG_RST_N (réinitialisation JTAG/débogage — distincte du NRST système)

Utilisation

Pilotez l’OLED via display.SPIDisplay avec une instance de contrôleur SSD1351. Diffusez les trames de la caméra vers le panneau 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())

Lisez le joystick à 5 directions via le pilote intégré pca9674a.PCA9674A. L’expandeur active P9 lors d’un changement d’état ; câblez donc une fonction de rappel d’IRQ qui mémorise le nouvel état des boutons. Les boutons sont actifs bas sur l’expandeur ; le code ci‑dessous applique un XOR de la lecture avec 0xFF afin qu’un bit positionné dans state signifie appuyé :

Bit

Direction

0x01

Joystick droite

0x02

Joystick haut

0x04

Joystick gauche

0x08

Joystick bas

0x10

Appui central du joystick

0x40

Interrupteur d’activation de l’OLED (positionné dans state lorsque l’OLED est activé)

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