spi_control.py

# この作品はMITライセンスの下で提供されています。
# Copyright (c) 2013-2026 OpenMV LLC. 全著作権所有。
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# SPI制御
#
# この例では、SPIバスを使って、内蔵ディスプレイドライバを使わずに
# OpenMV AE3用のSSD1351 OLEDブレイクアウトボードを直接駆動する方法を示します。
# この例を実行するにはOLEDブレイクアウトボードが必要です。

import csi
import time
import struct
from machine import Pin, SPI

WIDTH = 128
HEIGHT = 128

# OpenMV AE3上でのOLEDブレイクアウトボードのピン配置。
cs = Pin("P3", Pin.OUT, value=1)
rs = Pin("P8", Pin.OUT, value=1)   # データ/コマンド選択
rst = Pin("P7", Pin.OUT, value=1)  # リセット

# OpenMV AE3 OLEDブレイクアウトボード用のハードウェアSPIバスはSPIバス0です。
spi = SPI(0, baudrate=WIDTH * HEIGHT * 60 * 16, polarity=0, phase=0)


def write_command(cmd, *args):
    rs.low()
    cs.low()
    spi.write(bytes([cmd]))
    cs.high()
    rs.high()
    if args:
        cs.low()
        spi.write(bytes(args))
        cs.high()


def write_image(img):
    # SSD1351が期待するビッグエンディアン順に合わせて、RGB565ピクセルのバイトを入れ替えます。
    pixels = struct.unpack("H" * (img.size() // 2), img)
    swapped = struct.pack(">" + "H" * len(pixels), *pixels)
    cs.low()
    spi.write(swapped)
    cs.high()


# LCDをリセットします。
rst.low()
time.sleep_ms(100)
rst.high()
time.sleep_ms(100)

# SSD1351の初期化シーケンス。
write_command(0xFD, 0x12)              # COMMAND_LOCK: ICのMCUインターフェースをアンロック
write_command(0xFD, 0xB1)              # COMMAND_LOCK: A2,B1,B3,BB,BE,C1をアンロック
write_command(0xB2, 0xA4, 0x00, 0x00)  # DISPLAY_ENHANCEMENT
write_command(0xB3, 0xF0)              # CLOCK_DIV
write_command(0xCA, 0x7F)              # MUX_RATIO
write_command(0xA0, 0x74)              # SET_REMAP
write_command(0xA2, 0x00)              # DISPLAY_OFFSET
write_command(0xB1, 0x32)              # PRECHARGE
write_command(0xBB, 0x1F)              # PRECHARGE_LEVEL
write_command(0xC7, 0x0A)              # CONTRAST_MASTER
write_command(0xC1, 0xFF, 0xFF, 0xFF)  # CONTRAST_ABC
write_command(0xB6, 0x01)              # PRECHARGE2
write_command(0xAF)                    # DISPLAY_ON

csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)
csi0.window((WIDTH, HEIGHT))

clock = time.clock()

while True:
    clock.tick()
    img = csi0.snapshot()

    write_command(0x5C)  # WRITE_RAM
    write_image(img)

    print(clock.fps())

results matching ""

    No results matching ""