AE3 OLED Breakout¶
Das AE3 OLED Breakout kombiniert die OpenMV AE3 mit einem 128 × 128 RGB-OLED, einem 5‑Wege‑Joystick und einem 10‑poligen ARM-SWD-Header für eigenständige Vorschau, einfache Eingabe und JTAG/SWD-Debugging.
Vollständiges Datenblatt, Fotos und Bestellinformationen finden Sie auf der Produktseite des AE3 OLED Breakout.
Highlights¶
128 × 128 RGB-OLED, angesteuert von einem SSD1351-Controller über SPI.
AS90R 5‑Wege‑Joystick mit mittigem Druckknopf, herausgeführt auf den
P4/P5I²C-Bus.Reset-Taster und Recovery-Schalter für den UART-Zugriff auf die Secure Enclave.
OLED-Trennschalter, um das Panel elektrisch vom SPI-Bus zu trennen.
Zwei Qwiic-Anschlüsse am selben
P4/P5I²C-Bus.ARM 10‑poliger Cortex Debug-Header für SWD/JTAG-Debugging.
Vier Massehaken-Testpunkte.
Bemerkung
Vier M1.6-Befestigungsbohrungen an den Ecken ermöglichen es, das Breakout an einem Gehäuse oder einer Halterung festzuschrauben.
Pin-Referenz¶
Alle AE3-Signale am Breakout werden vom B2B-Header an der Unterseite der AE3 abgegriffen und auf zwei seitliche Stiftleisten herausgeführt — P0–P5 auf der einen Seite, P6–P9 auf der anderen — beide mit 3,3 V referenziert. Die vollständige Liste der Alternativfunktionen für jeden Pin finden Sie auf der Seite OpenMV AE3; das Breakout verwendet die Pins wie folgt:
Pin |
Referenz |
AE3-Funktionen |
Breakout-Nutzung |
|---|---|---|---|
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 |
frei |
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 |
Drücken Sie den integrierten RESET-Taster oder ziehen Sie auf GND, um die AE3 zurückzusetzen |
P6 |
3,3 V |
I2C1 SDA / UART3 CTS / TIM9 T0 |
frei |
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 (Registerauswahl) |
P9 |
3,3 V |
I3C SCL / UART3 TX / TIM5 T1 / ADC ch S11 |
Joystick IRQ (aktiv low bei Zustandsänderung) |
3,3-V-Schiene |
— |
— |
Versorgt das OLED, den Joystick-Expander und die Qwiic-Geräte |
GND-Schiene |
— |
— |
Gemeinsame Masse |
Bemerkung
Der Recovery-Schalter schaltet einen internen USB-Mux auf der AE3 um: Die eigenen USB-Pins der AE3 werden vom USB‑C-Port getrennt, und stattdessen wird ein USB-zu-Seriell-Wandler am UART der Secure Enclave mit dem Port verbunden. Bei aktiviertem Schalter können hostseitige Alif-Tools mit der Secure Enclave kommunizieren, um den Bootloader der AE3 neu zu programmieren. Lassen Sie den Schalter im Normalbetrieb deaktiviert, damit der USB‑C-Port als USB der AE3 fungiert.
Bemerkung
Der OLED-Aktivierungsschalter muss eingeschaltet sein, damit das OLED funktioniert — er steuert die Stromversorgung des Panels und verbindet die OLED-Steuerpins (P0, P2, P3, P7, P8) durch zu den GPIOs der AE3. Bei ausgeschaltetem Schalter bleiben nur P4, P5 und P9 durchverbunden. Der aktuelle Schalterzustand erscheint am Joystick-Expander als Bit 0x40 — der rohe Expander-Pin liest low, wenn der Schalter aktiviert ist.
Qwiic-Header¶
Zwei Qwiic 4‑polige JST-SH-Anschlüsse mit 1,0 mm Rastermaß sitzen auf dem Breakout und teilen sich denselben P4/P5 I²C-Bus wie der integrierte Joystick-Expander, sodass zusätzliche Qwiic-Geräte die Adresse des Joystick-Expanders (0x63) vermeiden müssen.
Pin |
Signal |
|---|---|
1 |
GND |
2 |
+3,3 V |
3 |
SDA ( |
4 |
SCL ( |
JTAG-Header¶
Der 10‑polige ARM Cortex Debug-Header mit 1,27 mm Rastermaß auf dem Breakout ist direkt mit den SWD/JTAG-Leitungen der AE3 verdrahtet. Alle Signale sind mit 1,8 V referenziert — verwenden Sie einen pegelumsetzenden Tastkopf oder einen, dessen Zielspannung VCC_REF (Pin 1) folgt.
Pin |
Signal |
|---|---|
1 |
VCC_REF (+1,8 V) |
2 |
TMS (SWDIO) |
3 |
+1,8 V |
4 |
TCK (SWCLK) |
5 |
GND |
6 |
TDO (SWO) |
7 |
Key (kein Pin) |
8 |
TDI |
9 |
GND |
10 |
DEBUG_RST_N (JTAG/Debug-Reset — getrennt vom System-NRST) |
Verwendung¶
Steuern Sie das OLED über display.SPIDisplay mit einer SSD1351-Controller-Instanz an. Streamen Sie Kamera-Einzelbilder auf das 128 × 128-Panel:
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())
Lesen Sie den 5‑Wege‑Joystick über den eingefrorenen pca9674a.PCA9674A-Treiber aus. Der Expander zieht P9 bei Zustandsänderungen an, verdrahten Sie also einen IRQ-Callback, der den neuen Tastenzustand zwischenspeichert. Die Tasten sind am Expander aktiv low; der Code unten verknüpft den gelesenen Wert per XOR mit 0xFF, sodass ein gesetztes Bit in state gedrückt bedeutet:
Bit |
Richtung |
|---|---|
|
Joystick rechts |
|
Joystick hoch |
|
Joystick links |
|
Joystick runter |
|
Joystick mittiger Druck |
|
OLED-Aktivierungsschalter (in |
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())