AE3 OLED Breakout

Плата AE3 OLED Breakout объединяет OpenMV AE3 с RGB OLED-дисплеем 128 × 128, 5-позиционным джойстиком и 10-контактным разъёмом ARM SWD для автономного предпросмотра, простого ввода и отладки JTAG/SWD.

AE3 OLED Breakout

Полную спецификацию, фотографии и информацию для заказа смотрите на странице продукта AE3 OLED Breakout.

Основные особенности

  • RGB OLED 128 × 128, управляемый контроллером SSD1351 по шине SPI.

  • 5-позиционный джойстик AS90R с центральной кнопкой, выведенный на шину I²C P4/P5.

  • Кнопка сброса и переключатель восстановления для доступа к UART защищённого анклава.

  • Переключатель отключения OLED для электрического отсоединения панели от шины SPI.

  • Два разъёма Qwiic на той же шине I²C P4/P5.

  • Разъём ARM 10-pin Cortex Debug для отладки SWD/JTAG.

  • Четыре контрольные точки подключения к земле.

Примечание

Четыре угловых монтажных отверстия M1.6 позволяют прикрепить плату к корпусу или приспособлению.

Назначение выводов

Все сигналы AE3 на плате берутся с разъёма B2B на нижней стороне AE3 и выводятся на два боковых разъёма — P0P5 с одной стороны и P6P9 с другой — оба с опорным напряжением 3,3 В. Полный список альтернативных функций каждого вывода приведён на странице OpenMV AE3; на этой плате выводы используются следующим образом:

Вывод

Опора

Функции AE3

Использование на плате

P0

3,3 В

SPI0 MOSI / I2C2 SCL / UART4 TX / TIM0 T1 / PDM D3

OLED SPI MOSI

P1

3,3 В

SPI0 MISO / I2C2 SDA / UART4 RX / TIM0 T0

свободен

P2

3,3 В

SPI0 SCLK / LPI2C SDA / UART5 TX / TIM1 T1

OLED SPI SCLK

P3

3,3 В

SPI0 SS / LPI2C SCL / UART5 RX / TIM1 T0 / PDM C3

OLED SPI CS

P4

3,3 В

I2C1 SCL / UART1 TX / TIM2 T1 / PDM C0 / CAN TX

Джойстик / Qwiic I²C SCL

P5

3,3 В

I2C1 SDA / UART1 RX / TIM2 T0 / PDM D0 / CAN RX

Джойстик / Qwiic I²C SDA

RESET

3,3 В

NRST

Нажмите встроенную кнопку RESET или подтяните к GND для сброса AE3

P6

3,3 В

I2C1 SDA / UART3 CTS / TIM9 T0

свободен

P7

3,3 В

I2C1 SCL / UART3 RTS / TIM9 T1

OLED RESET

P8

3,3 В

I3C SDA / UART3 RX / TIM5 T0 / ADC ch S10

OLED DC (выбор регистра)

P9

3,3 В

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

Джойстик IRQ (активный низкий уровень при изменении состояния)

Шина 3,3 В

Питает OLED, расширитель джойстика и устройства Qwiic

Шина GND

Общая земля

Примечание

Переключатель восстановления переключает внутренний USB-мультиплексор на AE3: собственные USB-выводы AE3 отсоединяются от порта USB-C, и вместо них к порту подключается преобразователь USB-в-последовательный порт на UART защищённого анклава. При включённом переключателе инструменты Alif на стороне хоста могут взаимодействовать с защищённым анклавом для перепрошивки загрузчика AE3. Для нормальной работы оставьте переключатель выключенным, чтобы порт USB-C работал как USB AE3.

Примечание

Переключатель включения OLED должен быть включён для работы OLED — он подаёт питание на панель и подключает управляющие выводы OLED (P0, P2, P3, P7, P8) к GPIO AE3. При выключенном переключателе подключёнными остаются только P4, P5 и P9. Текущее состояние переключателя отображается на расширителе джойстика как бит 0x40 — необработанный вывод расширителя читается как низкий уровень, когда переключатель включён.

Разъёмы Qwiic

На плате расположены два разъёма Qwiic 4-pin JST-SH 1,0 мм, которые используют ту же шину I²C P4/P5, что и встроенный расширитель джойстика, поэтому дополнительные устройства Qwiic не должны использовать адрес расширителя джойстика (0x63).

Вывод

Сигнал

1

GND

2

+3,3 В

3

SDA (P5)

4

SCL (P4)

Разъём JTAG

10-контактный разъём ARM Cortex Debug 1,27 мм на плате подключён напрямую к линиям SWD/JTAG AE3. Все сигналы с опорным напряжением 1,8 В — используйте пробник с преобразованием уровней или такой, чьё целевое напряжение отслеживает VCC_REF (вывод 1).

Вывод

Сигнал

1

VCC_REF (+1,8 В)

2

TMS (SWDIO)

3

+1,8 В

4

TCK (SWCLK)

5

GND

6

TDO (SWO)

7

ключ (нет вывода)

8

TDI

9

GND

10

DEBUG_RST_N (сброс JTAG/отладки — отдельный от системного NRST)

Использование

Управляйте OLED через display.SPIDisplay с экземпляром контроллера SSD1351. Выводите кадры с камеры на панель 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())

Считывайте 5-позиционный джойстик через встроенный драйвер pca9674a.PCA9674A. Расширитель устанавливает P9 при изменениях состояния, поэтому подключите функцию обратного вызова IRQ, которая фиксирует новое состояние кнопок. Кнопки на расширителе активны при низком уровне; в коде ниже считанное значение подвергается операции XOR с 0xFF, поэтому установленный бит в state означает нажато:

Бит

Направление

0x01

Джойстик вправо

0x02

Джойстик вверх

0x04

Джойстик влево

0x08

Джойстик вниз

0x10

Нажатие центра джойстика

0x40

Переключатель включения OLED (устанавливается в state, когда OLED включён)

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