AE3 OLED Breakout

OpenMV AE3 kartını 128 × 128 RGB OLED, 5 yönlü bir joystick ve 10 pinli bir ARM SWD başlığıyla birleştiren AE3 OLED Breakout; bağımsız önizleme, basit girdi ve JTAG/SWD hata ayıklaması sağlar.

AE3 OLED Breakout

Tam veri sayfası, fotoğraflar ve sipariş için AE3 OLED Breakout ürün sayfasına bakın.

Öne çıkanlar

  • SPI üzerinden bir SSD1351 denetleyicisiyle sürülen 128 × 128 RGB OLED.

  • P4/P5 I²C veri yolu üzerinde açığa çıkarılan, ortada bir bas-tıkla düğmesi bulunan AS90R 5 yönlü joystick.

  • Güvenli enklav UART erişimi için sıfırlama düğmesi ve kurtarma anahtarı.

  • Paneli SPI veri yolundan elektriksel olarak ayırmak için bir OLED bağlantı kesme anahtarı.

  • Aynı P4/P5 I²C veri yolu üzerinde iki Qwiic konektörü.

  • SWD/JTAG hata ayıklaması için ARM 10 pinli Cortex Debug başlığı.

  • Dört adet topraklama kancası test noktası.

Not

Dört köşedeki M1.6 montaj delikleri, breakout’u bir muhafazaya veya tertibata cıvatalamanıza olanak tanır.

Pin referansı

Breakout üzerindeki tüm AE3 sinyalleri, AE3’ün altındaki B2B başlığından alınır ve iki yan pin başlığına getirilir — bir tarafta P0P5, diğer tarafta P6P9 — her ikisi de 3,3 V referanslı. Her pinin tam alternatif fonksiyon listesi OpenMV AE3 sayfasında bulunur; breakout pinleri şu şekilde kullanır:

Pin

Referans

AE3 özellikleri

Breakout kullanımı

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

boş

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

AE3’ü sıfırlamak için kart üzerindeki RESET düğmesine basın veya GND’ye çekin

P6

3,3 V

I2C1 SDA / UART3 CTS / TIM9 T0

boş

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 (yazmaç seçimi)

P9

3,3 V

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

Joystick IRQ (durum değişiminde aktif düşük)

3,3V hattı

OLED’i, joystick genişleticisini ve Qwiic cihazlarını besler

GND hattı

Ortak toprak

Not

Kurtarma anahtarı, AE3 üzerindeki dahili bir USB mux’unu çevirir: AE3’ün kendi USB pinleri USB-C bağlantı noktasından ayrılır ve yerlerine güvenli enklav UART’ı üzerindeki bir USB-seri dönüştürücü bağlantı noktasına bağlanır. Anahtar devredeyken, ana bilgisayar tarafındaki Alif araçları AE3’ün önyükleyicisini (bootloader) yeniden programlamak için güvenli enklavla iletişim kurabilir. Normal çalışma için anahtarı devre dışı bırakın; böylece USB-C bağlantı noktası AE3’ün USB’si olarak işlev görür.

Not

OLED etkinleştirme anahtarının OLED’in çalışması için açık olması gerekir — panele giden gücü denetler ve OLED kontrol pinlerini (P0, P2, P3, P7, P8) AE3’ün GPIO’suna bağlar. Anahtar kapalıyken yalnızca P4, P5 ve P9 bağlı kalır. Geçerli anahtar durumu joystick genişleticisinde 0x40 biti olarak görünür — ham genişletici pini anahtar etkinleştirildiğinde düşük okunur.

Qwiic başlıkları

Breakout üzerinde, kart üzerindeki joystick genişleticisiyle aynı P4/P5 I²C veri yolunu paylaşan iki Qwiic 4 pinli JST-SH 1,0 mm konektör bulunur; bu nedenle ek Qwiic cihazları joystick genişleticisinin adresinden (0x63) kaçınmalıdır.

Pin

Sinyal

1

GND

2

+3,3 V

3

SDA (P5)

4

SCL (P4)

JTAG başlığı

Breakout üzerindeki 10 pinli 1,27 mm ARM Cortex Debug başlığı, doğrudan AE3’ün SWD/JTAG hatlarına bağlıdır. Tüm sinyaller 1,8 V referanslıdır — seviye kaydırmalı bir prob veya hedef voltajı VCC_REF (pin 1) ile aynı olan bir prob kullanın.

Pin

Sinyal

1

VCC_REF (+1,8 V)

2

TMS (SWDIO)

3

+1,8 V

4

TCK (SWCLK)

5

GND

6

TDO (SWO)

7

anahtar (pin yok)

8

TDI

9

GND

10

DEBUG_RST_N (JTAG/hata ayıklama sıfırlaması — sistem NRST’sinden ayrı)

Kullanım

OLED’i, bir SSD1351 denetleyici örneğiyle display.SPIDisplay üzerinden sürün. Kamera çerçevelerini 128 × 128 panele aktarın:

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

5 yönlü joystick’i dondurulmuş pca9674a.PCA9674A sürücüsü üzerinden okuyun. Genişletici, durum değişimlerinde P9‘u etkinleştirir; bu nedenle yeni düğme durumunu yakalayan bir IRQ geri çağırması (callback) bağlayın. Düğmeler genişleticide aktif düşüktür; aşağıdaki kod okumayı 0xFF ile XOR’lar, böylece state içinde ayarlanmış bir bit basıldı anlamına gelir:

Bit

Yön

0x01

Joystick sağ

0x02

Joystick yukarı

0x04

Joystick sol

0x08

Joystick aşağı

0x10

Joystick ortaya bas

0x40

OLED etkinleştirme anahtarı (OLED etkinleştirildiğinde state içinde ayarlanır)

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