AE3 OLED Breakout

AE3 OLED Breakout は OpenMV AE3 に 128 × 128 の RGB OLED、5 方向ジョイスティック、10 ピンの ARM SWD ヘッダーを組み合わせたもので、スタンドアロンでのプレビュー、簡単な入力、JTAG/SWD デバッグを実現します。

AE3 OLED Breakout

完全なデータシート、写真、注文方法については AE3 OLED Breakout 製品ページ を参照してください。

主な特長

  • SSD1351 コントローラーで SPI 経由で駆動される 128 × 128 RGB OLED

  • 中央押しボタン付き AS90R 5 方向ジョイスティックP4/P5 の I²C バス上に引き出されています。

  • セキュアエンクレーブの UART アクセス用の リセットボタンリカバリースイッチ

  • パネルを SPI バスから電気的に切り離す OLED 切断スイッチ

  • 同じ P4/P5 の I²C バス上にある 2 つの Qwiic コネクタ。

  • SWD/JTAG デバッグ用の ARM 10 ピン Cortex Debug ヘッダー。

  • 4 つのグランドフックテストポイント。

注釈

四隅の 4 つの M1.6 取り付け穴により、Breakout を筐体や治具にボルト固定できます。

ピンリファレンス

Breakout 上の AE3 のすべての信号は AE3 底面の B2B ヘッダー から取り出され、両側のピンヘッダー(片側に P0P5、もう片側に P6P9)に引き出されています。いずれも 3.3 V 基準 です。各ピンの完全な代替機能一覧は OpenMV AE3 ページにあります。Breakout では以下のようにピンを使用します。

ピン

基準

AE3 の機能

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

未使用

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

ジョイスティック / Qwiic I²C SCL

P5

3.3 V

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

ジョイスティック / Qwiic I²C SDA

RESET

3.3 V

NRST

オンボードの RESET ボタンを押すか GND に引き下げて AE3 をリセットします

P6

3.3 V

I2C1 SDA / UART3 CTS / TIM9 T0

未使用

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(レジスタ選択)

P9

3.3 V

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

ジョイスティック IRQ(状態変化時にアクティブロー)

3.3V レール

OLED、ジョイスティックエキスパンダー、Qwiic デバイスに電源を供給します

GND レール

共通グランド

注釈

リカバリースイッチ は AE3 の内部 USB マルチプレクサを切り替えます。AE3 自身の USB ピンが USB-C ポートから切り離され、代わりにセキュアエンクレーブの UART 上の USB-シリアル変換器がポートに接続されます。スイッチを有効にすると、ホスト側の Alif ツールがセキュアエンクレーブと通信して AE3 のブートローダーを再プログラムできます。通常動作では USB-C ポートが AE3 の USB として機能するよう、スイッチは 無効 のままにしてください。

注釈

OLED を動作させるには OLED イネーブルスイッチ をオンにする必要があります。これはパネルへの電源を制御し、OLED 制御ピン(P0P2P3P7P8)を AE3 の GPIO に接続します。スイッチがオフのときは P4P5P9 のみが配線されたままになります。現在のスイッチ状態はジョイスティックエキスパンダー上にビット 0x40 として現れます。生のエキスパンダーピンは スイッチが有効のときロー を読み取ります。

Qwiic ヘッダー

Breakout 上には 2 つの Qwiic 4 ピン JST-SH 1.0 mm コネクタがあり、オンボードのジョイスティックエキスパンダーと同じ P4/P5 の I²C バスを共有しています。そのため、追加の Qwiic デバイスはジョイスティックエキスパンダーのアドレス(0x63)と重複しないようにする必要があります。

ピン

信号

1

GND

2

+3.3 V

3

SDA(P5

4

SCL(P4

JTAG ヘッダー

Breakout 上の 10 ピン 1.27 mm ARM Cortex Debug ヘッダーは AE3 の SWD/JTAG ラインに直接配線されています。すべての信号は 1.8 V 基準 です。レベルシフト対応のプローブ、またはターゲット電圧が VCC_REF(ピン 1)に追従するプローブを使用してください。

ピン

信号

1

VCC_REF(+1.8 V)

2

TMS(SWDIO)

3

+1.8 V

4

TCK(SWCLK)

5

GND

6

TDO(SWO)

7

キー(ピンなし)

8

TDI

9

GND

10

DEBUG_RST_N(JTAG/デバッグリセット — システムの NRST とは別)

使い方

OLED は SSD1351 コントローラーインスタンスとともに display.SPIDisplay を通して駆動します。カメラのフレームを 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 コールバックを配線してください。ボタンはエキスパンダー上でアクティブローです。以下のコードでは読み取り値を 0xFF と XOR するため、state でビットがセットされていると 押された ことを意味します。

ビット

方向

0x01

ジョイスティック右

0x02

ジョイスティック上

0x04

ジョイスティック左

0x08

ジョイスティック下

0x10

ジョイスティック中央押し

0x40

OLED イネーブルスイッチ(OLED が有効のとき state にセットされる)

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