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.
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 — P0–P5 d’un côté, P6–P9 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 ( |
4 |
SCL ( |
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 |
|---|---|
|
Joystick droite |
|
Joystick haut |
|
Joystick gauche |
|
Joystick bas |
|
Appui central du joystick |
|
Interrupteur d’activation de l’OLED (positionné dans |
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())