AE3 OLED Breakout

De AE3 OLED Breakout combineert de OpenMV AE3 met een 128 × 128 RGB OLED, een 5‑weg joystick en een 10‑pins ARM SWD‑header voor zelfstandige preview, eenvoudige invoer en JTAG/SWD‑debugging.

AE3 OLED Breakout

Voor de volledige datasheet, foto’s en bestelinformatie zie de AE3 OLED Breakout productpagina.

Hoogtepunten

  • 128 × 128 RGB OLED aangestuurd door een SSD1351-controller via SPI.

  • AS90R 5‑weg joystick met een middelste drukknop, beschikbaar op de P4/P5 I²C-bus.

  • Resetknop en recovery-schakelaar voor UART-toegang tot de secure enclave.

  • OLED-uitschakelaar om het paneel elektrisch los te koppelen van de SPI-bus.

  • Twee Qwiic-connectoren op dezelfde P4/P5 I²C-bus.

  • ARM 10‑pins Cortex Debug-header voor SWD/JTAG-debugging.

  • Vier ground-haaktestpunten.

Notitie

Met vier M1.6-bevestigingsgaten in de hoeken kun je de breakout vastschroeven aan een behuizing of montagestuk.

Pinreferentie

Alle AE3-signalen op de breakout komen van de B2B-header aan de onderkant van de AE3 en worden naar twee zijdelingse pinheaders gebracht — P0P5 aan de ene kant, P6P9 aan de andere — beide gerefereerd aan 3,3 V. De volledige lijst met alternatieve functies voor elke pin staat op de OpenMV AE3-pagina; de breakout gebruikt de pins als volgt:

Pin

Referentie

AE3-functies

Gebruik op 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

vrij

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

Druk op de RESET-knop op de print of trek naar GND om de AE3 te resetten

P6

3,3 V

I2C1 SDA / UART3 CTS / TIM9 T0

vrij

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

P9

3,3 V

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

Joystick IRQ (actief laag bij statuswijziging)

3,3V-rail

Voedt de OLED, joystick-expander en Qwiic-apparaten

GND-rail

Gemeenschappelijke ground

Notitie

De recovery-schakelaar schakelt een interne USB-mux op de AE3 om: de eigen USB-pins van de AE3 worden losgekoppeld van de USB‑C-poort, en in plaats daarvan wordt een USB-naar-serieel-omzetter op de UART van de secure enclave met de poort verbonden. Met de schakelaar ingeschakeld kunnen Alif-tools aan de hostzijde met de secure enclave communiceren om de bootloader van de AE3 opnieuw te programmeren. Laat de schakelaar uitgeschakeld voor normaal gebruik, zodat de USB‑C-poort als de USB van de AE3 fungeert.

Notitie

De OLED-inschakelaar moet aan staan om de OLED te laten werken — hij regelt de voeding naar het paneel en verbindt de OLED-besturingspins (P0, P2, P3, P7, P8) door naar de GPIO van de AE3. Met de schakelaar uit blijven alleen P4, P5 en P9 doorverbonden. De huidige stand van de schakelaar verschijnt op de joystick-expander als bit 0x40 — de ruwe expander-pin leest laag wanneer de schakelaar is ingeschakeld.

Qwiic-headers

Twee Qwiic 4‑pins JST‑SH 1,0 mm-connectoren bevinden zich op de breakout en delen dezelfde P4/P5 I²C-bus als de joystick-expander op de print, dus extra Qwiic-apparaten moeten het adres van de joystick-expander (0x63) vermijden.

Pin

Signaal

1

GND

2

+3,3 V

3

SDA (P5)

4

SCL (P4)

JTAG-header

De 10‑pins 1,27 mm ARM Cortex Debug-header op de breakout is rechtstreeks bedraad naar de SWD/JTAG-lijnen van de AE3. Alle signalen zijn gerefereerd aan 1,8 V — gebruik een level-shifting-probe of een probe waarvan de doelspanning VCC_REF (pin 1) volgt.

Pin

Signaal

1

VCC_REF (+1,8 V)

2

TMS (SWDIO)

3

+1,8 V

4

TCK (SWCLK)

5

GND

6

TDO (SWO)

7

sleutel (geen pin)

8

TDI

9

GND

10

DEBUG_RST_N (JTAG/debug-reset — los van de systeem-NRST)

Gebruik

Stuur de OLED aan via display.SPIDisplay met een SSD1351-controllerinstantie. Stream camerabeelden naar het 128 × 128-paneel:

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

Lees de 5‑weg joystick uit via de bevroren pca9674a.PCA9674A-driver. De expander activeert P9 bij statuswijzigingen, dus koppel een IRQ-callback die de nieuwe knopstatus vastlegt. De knoppen zijn actief laag op de expander; de onderstaande code XORt de uitlezing met 0xFF zodat een gezet bit in state betekent ingedrukt:

Bit

Richting

0x01

Joystick rechts

0x02

Joystick omhoog

0x04

Joystick links

0x08

Joystick omlaag

0x10

Joystick middendruk

0x40

OLED-inschakelaar (gezet in state wanneer de OLED is ingeschakeld)

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