AE3 OLED Breakout

AE3 OLED Breakout asociază OpenMV AE3 cu un ecran OLED RGB de 128 × 128, un joystick cu 5 direcții și un conector ARM SWD cu 10 pini, pentru previzualizare autonomă, intrare simplă și depanare JTAG/SWD.

AE3 OLED Breakout

Pentru fișa tehnică completă, fotografii și comenzi, consultați pagina produsului AE3 OLED Breakout.

Puncte importante

  • Ecran OLED RGB de 128 × 128 controlat de un controler SSD1351 prin SPI.

  • Joystick cu 5 direcții AS90R cu buton central de apăsare, expus pe magistrala I²C P4/P5.

  • Buton de resetare și comutator de recuperare pentru accesul UART la enclava securizată.

  • Comutator de deconectare a ecranului OLED pentru a izola electric panoul de pe magistrala SPI.

  • Doi conectori Qwiic pe aceeași magistrală I²C P4/P5.

  • Conector ARM Cortex Debug cu 10 pini pentru depanare SWD/JTAG.

  • Patru puncte de testare cu cârlig pentru masă.

Notă

Patru găuri de montare M1.6 în colțuri vă permit să fixați breakout-ul cu șuruburi pe o carcasă sau un suport.

Referință pini

Toate semnalele AE3 de pe breakout sunt preluate de la conectorul B2B de pe partea inferioară a AE3 și aduse la două conectoare de pini laterale — P0P5 pe o parte, P6P9 pe cealaltă — ambele referențiate la 3,3 V. Lista completă a funcțiilor alternative pentru fiecare pin se află pe pagina OpenMV AE3; breakout-ul folosește pinii după cum urmează:

Pin

Referință

Caracteristici AE3

Utilizare 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

liber

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

Apăsați butonul RESET de pe placă sau trageți la GND pentru a reseta AE3

P6

3,3 V

I2C1 SDA / UART3 CTS / TIM9 T0

liber

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 (selecție registru)

P9

3,3 V

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

Joystick IRQ (activ pe nivel jos la schimbarea stării)

linie de 3,3 V

Alimentează ecranul OLED, expanderul joystick-ului și dispozitivele Qwiic

linie GND

Masă comună

Notă

Comutatorul de recuperare comută un multiplexor USB intern de pe AE3: pinii USB proprii ai AE3 sunt deconectați de la portul USB-C, iar un convertor USB-serial de pe UART-ul enclavei securizate este conectat în locul lor la port. Cu comutatorul activat, instrumentele Alif de pe gazdă pot comunica cu enclava securizată pentru a reprograma bootloader-ul AE3. Lăsați comutatorul dezactivat pentru funcționarea normală, astfel încât portul USB-C să acționeze ca USB-ul AE3.

Notă

Comutatorul de activare OLED trebuie să fie pornit pentru ca ecranul OLED să funcționeze — el controlează alimentarea panoului și conectează pinii de control OLED (P0, P2, P3, P7, P8) la GPIO-ul AE3. Cu comutatorul oprit, doar P4, P5 și P9 rămân conectați. Starea curentă a comutatorului apare pe expanderul joystick-ului ca bitul 0x40 — pinul brut al expanderului citește nivel jos când comutatorul este activat.

Conectoare Qwiic

Pe breakout se află doi conectori Qwiic JST-SH de 1,0 mm cu 4 pini, care împart aceeași magistrală I²C P4/P5 cu expanderul joystick-ului de pe placă, așa că dispozitivele Qwiic suplimentare trebuie să evite adresa expanderului joystick-ului (0x63).

Pin

Semnal

1

GND

2

+3,3 V

3

SDA (P5)

4

SCL (P4)

Conector JTAG

Conectorul ARM Cortex Debug de 1,27 mm cu 10 pini de pe breakout este conectat direct la liniile SWD/JTAG ale AE3. Toate semnalele sunt referențiate la 1,8 V — folosiți o sondă cu deplasare de nivel sau una a cărei tensiune țintă urmărește VCC_REF (pinul 1).

Pin

Semnal

1

VCC_REF (+1,8 V)

2

TMS (SWDIO)

3

+1,8 V

4

TCK (SWCLK)

5

GND

6

TDO (SWO)

7

cheie (fără pin)

8

TDI

9

GND

10

DEBUG_RST_N (resetare JTAG/depanare — separată de NRST-ul sistemului)

Utilizare

Controlați ecranul OLED prin display.SPIDisplay cu o instanță de controler SSD1351. Transmiteți cadrele camerei către panoul 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())

Citiți joystick-ul cu 5 direcții prin driverul integrat pca9674a.PCA9674A. Expanderul activează P9 la schimbările de stare, așa că legați o funcție de retroapelare (callback) IRQ care reține noua stare a butoanelor. Butoanele sunt active pe nivel jos pe expander; codul de mai jos aplică XOR cu 0xFF asupra valorii citite, astfel încât un bit setat în state înseamnă apăsat:

Bit

Direcție

0x01

Joystick dreapta

0x02

Joystick sus

0x04

Joystick stânga

0x08

Joystick jos

0x10

Apăsare centrală joystick

0x40

Comutator de activare OLED (setat în state când ecranul OLED este activat)

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