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.
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 — P0–P5 pe o parte, P6–P9 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 ( |
4 |
SCL ( |
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 |
|---|---|
|
Joystick dreapta |
|
Joystick sus |
|
Joystick stânga |
|
Joystick jos |
|
Apăsare centrală joystick |
|
Comutator de activare OLED (setat în |
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())