AE3 OLED Breakout

AE3 OLED Breakout łączy OpenMV AE3 z wyświetlaczem OLED RGB 128 × 128, 5‑kierunkowym joystickiem oraz 10‑pinowym złączem ARM SWD, zapewniając samodzielny podgląd, prostą obsługę wejścia oraz debugowanie JTAG/SWD.

AE3 OLED Breakout

Pełną dokumentację, zdjęcia i informacje o zamawianiu znajdziesz na stronie produktu AE3 OLED Breakout.

Najważniejsze cechy

  • Wyświetlacz OLED RGB 128 × 128 sterowany kontrolerem SSD1351 przez SPI.

  • 5‑kierunkowy joystick AS90R z centralnym przyciskiem, wyprowadzony na magistralę I²C P4/P5.

  • Przycisk reset oraz przełącznik recovery do dostępu UART do secure enclave.

  • Przełącznik odłączający OLED, elektrycznie odłączający panel od magistrali SPI.

  • Dwa złącza Qwiic na tej samej magistrali I²C P4/P5.

  • Złącze ARM 10‑pin Cortex Debug do debugowania SWD/JTAG.

  • Cztery punkty testowe (test point) masy.

Informacja

Cztery narożne otwory montażowe M1.6 umożliwiają przykręcenie breakoutu do obudowy lub uchwytu.

Opis pinów

Wszystkie sygnały AE3 na breakoucie pochodzą ze złącza B2B na spodzie AE3 i są wyprowadzone na dwa boczne złącza szpilkowe — P0P5 po jednej stronie i P6P9 po drugiej — oba w odniesieniu do 3.3 V. Pełna lista funkcji alternatywnych dla każdego pinu znajduje się na stronie OpenMV AE3; breakout wykorzystuje piny w następujący sposób:

Pin

Odniesienie

Funkcje AE3

Zastosowanie na breakoucie

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

wolny

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

Naciśnij wbudowany przycisk RESET lub zewrzyj do GND, aby zresetować AE3

P6

3.3 V

I2C1 SDA / UART3 CTS / TIM9 T0

wolny

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 (wybór rejestru)

P9

3.3 V

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

Joystick IRQ (aktywny stanem niskim przy zmianie stanu)

szyna 3.3V

Zasila OLED, ekspander joysticka oraz urządzenia Qwiic

szyna GND

Wspólna masa

Informacja

Przełącznik recovery przełącza wewnętrzny multiplekser USB w AE3: własne piny USB AE3 zostają odłączone od portu USB‑C, a w ich miejsce do portu podłączany jest konwerter USB‑szeregowy na UART secure enclave. Przy włączonym przełączniku narzędzia Alif po stronie hosta mogą komunikować się z secure enclave w celu przeprogramowania bootloadera AE3. Do normalnej pracy pozostaw przełącznik wyłączony, aby port USB‑C działał jako USB AE3.

Informacja

Przełącznik włączający OLED musi być włączony, aby OLED działał — steruje on zasilaniem panelu i łączy piny sterujące OLED (P0, P2, P3, P7, P8) z GPIO AE3. Przy wyłączonym przełączniku podłączone pozostają jedynie P4, P5 i P9. Aktualny stan przełącznika jest widoczny na ekspanderze joysticka jako bit 0x40 — surowy pin ekspandera odczytuje stan niski, gdy przełącznik jest włączony.

Złącza Qwiic

Na breakoucie znajdują się dwa 4‑pinowe złącza Qwiic JST‑SH 1.0 mm, które współdzielą tę samą magistralę I²C P4/P5 co wbudowany ekspander joysticka, dlatego dodatkowe urządzenia Qwiic muszą unikać adresu ekspandera joysticka (0x63).

Pin

Sygnał

1

GND

2

+3.3 V

3

SDA (P5)

4

SCL (P4)

Złącze JTAG

10‑pinowe złącze 1.27 mm ARM Cortex Debug na breakoucie jest połączone bezpośrednio z liniami SWD/JTAG AE3. Wszystkie sygnały są w odniesieniu do 1.8 V — użyj sondy z konwersją poziomów lub takiej, której napięcie docelowe podąża za VCC_REF (pin 1).

Pin

Sygnał

1

VCC_REF (+1.8 V)

2

TMS (SWDIO)

3

+1.8 V

4

TCK (SWCLK)

5

GND

6

TDO (SWO)

7

klucz (brak pinu)

8

TDI

9

GND

10

DEBUG_RST_N (reset JTAG/debug — odrębny od systemowego NRST)

Użycie

Steruj wyświetlaczem OLED za pomocą display.SPIDisplay z instancją kontrolera SSD1351. Strumieniuj ramki z kamery na panel 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())

Odczytuj 5‑kierunkowy joystick za pomocą wbudowanego sterownika pca9674a.PCA9674A. Ekspander wystawia P9 przy zmianach stanu, więc podłącz wywołanie zwrotne IRQ, które zatrzaśnie nowy stan przycisków. Przyciski na ekspanderze są aktywne stanem niskim; poniższy kod wykonuje XOR odczytu z 0xFF, dzięki czemu ustawiony bit w state oznacza naciśnięty:

Bit

Kierunek

0x01

Joystick w prawo

0x02

Joystick w górę

0x04

Joystick w lewo

0x08

Joystick w dół

0x10

Naciśnięcie środka joysticka

0x40

Przełącznik włączający OLED (ustawiony w state, gdy OLED jest włączony)

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