AE3 OLED Breakout¶
AE3 OLED Breakout は OpenMV AE3 に 128 × 128 の RGB OLED、5 方向ジョイスティック、10 ピンの ARM SWD ヘッダーを組み合わせたもので、スタンドアロンでのプレビュー、簡単な入力、JTAG/SWD デバッグを実現します。
完全なデータシート、写真、注文方法については 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 ヘッダー から取り出され、両側のピンヘッダー(片側に P0~P5、もう片側に P6~P9)に引き出されています。いずれも 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 制御ピン(P0、P2、P3、P7、P8)を AE3 の GPIO に接続します。スイッチがオフのときは P4、P5、P9 のみが配線されたままになります。現在のスイッチ状態はジョイスティックエキスパンダー上にビット 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( |
4 |
SCL( |
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 でビットがセットされていると 押された ことを意味します。
ビット |
方向 |
|---|---|
|
ジョイスティック右 |
|
ジョイスティック上 |
|
ジョイスティック左 |
|
ジョイスティック下 |
|
ジョイスティック中央押し |
|
OLED イネーブルスイッチ(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())