class SPIDisplay – SPI 디스플레이 드라이버

SPIDisplay 클래스는 소형 SPI 연결 TFT 및 OLED 패널을 구동하며, 가장 흔하게는 OpenMV LCD Shield의 SSD1351 128x160 RGB OLED를 구동합니다. 드라이버는 SPI 버스와 GPIO 칩 선택 / DC 라인을 내부적으로 소유하므로, 호출자는 패널 기하 구조, 새로 고침 빈도 및 방향 플래그만 구성하면 됩니다. 패널별 초기화(레지스터 시퀀스, RAM 쓰기 프레이밍)는 controller 키워드 인수를 통해 제공됩니다. LCD Shield를 구동하려면 SSD1351 인스턴스를 전달하거나, 다른 패널을 위해 자체 컨트롤러 클래스를 구현하세요.

프레임은 image.Image 와 함께 write() 를 호출하여 표시됩니다. 드라이버는 소스를 RGB565로 변환하고 스케일링, ROI, 팔레트 및 방향 변환을 내부적으로 적용하므로, 호출자가 이미지 크기를 미리 맞출 필요가 없습니다. 백라이트 밝기는 단순한 켜짐/꺼짐 GPIO(기본값)로 둘 수도 있고, backlight 키워드 인수로 DACBacklight / PWMBacklight 중 하나를 전달하여 구동할 수도 있습니다.

예시 – 카메라를 OpenMV LCD Shield의 SSD1351 OLED에 미러링합니다:

import csi
import display

csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize((128, 160))        # matches the SSD1351 panel

lcd = display.SPIDisplay(controller=display.SSD1351())

while True:
    lcd.write(csi0.snapshot())

생성자

class display.SPIDisplay(width: int = 128, height: int = 160, refresh: int = 60, bgr: bool = False, byte_swap: bool = False, hmirror: bool = True, vflip: bool = True, triple_buffer: bool | None = None, *, controller: object | None = None, backlight: object | None = None)

width SPI LCD 너비(픽셀 단위, 1..32767).

height SPI LCD 높이(픽셀 단위, 1..32767).

refresh LCD 새로 고침 빈도(헤르츠 단위, 1..120). SPI 클록 속도를 제어합니다.

bgr 빨강과 파랑 채널을 서로 바꾸려면 True로 설정합니다.

byte_swap LCD로 보내는 RGB565 픽셀 바이트를 서로 바꾸려면 True로 설정합니다.

hmirror 디스플레이 출력을 가로로 미러링하려면 True로 설정합니다.

vflip 디스플레이 출력을 세로로 뒤집으려면 True로 설정합니다.

triple_buffer True이면 RAM에서 디스플레이 크기의 3배를 소비하는 대신 화면 업데이트를 논블로킹으로 만듭니다. 기본값은 보드에 따라 다릅니다(SDRAM이 있는 보드에서는 켜짐).

controller 키워드 전용. 컨트롤러 칩 클래스 인스턴스를 전달하여 디스플레이와 함께 초기화합니다. 제공되면 내장 명령 대신 컨트롤러의 init, display_on, display_off, ram_write 메서드(있는 경우)가 호출됩니다.

backlight 키워드 전용. 사용할 백라이트 컨트롤러 모듈을 전달합니다. 기본적으로 백라이트는 GPIO 핀을 통해 제어됩니다.

width() int

화면의 너비를 반환합니다.

height() int

화면의 높이를 반환합니다.

refresh() int

새로 고침 빈도를 반환합니다.

bgr() bool

빨강과 파랑 채널이 서로 바뀌었는지 여부를 반환합니다.

byte_swap() bool

RGB565 픽셀이 바이트 순서가 반전되어 전송되는지 여부를 반환합니다.

triple_buffer() bool

트리플 버퍼링이 활성화되었는지 여부를 반환합니다.

framesize() int

구성된 프레임 크기 식별자를 반환합니다.

write(image: image.Image, x: int = 0, y: int = 0, x_scale: float = 1.0, y_scale: float = 1.0, roi: Tuple[int, int, int, int] | None = None, rgb_channel: int = -1, alpha: int = 255, color_palette: int | image.Image | None = None, alpha_palette: image.Image | None = None, hint: int = 0) None

왼쪽 위 모서리가 (x, y) 에 위치하는 image 를 표시합니다. 이미지 대신 경로 문자열을 전달하여 한 단계로 불러와 그릴 수 있습니다.

x_scale x축 스케일 계수입니다. 음수 값은 가로로 뒤집습니다. y_scale 이 생략되면 종횡비를 유지하기 위해 x_scale 을 따릅니다.

y_scale y축 스케일 계수입니다. 음수 값은 세로로 뒤집습니다(triple_buffer=True 필요). x_scale 이 생략되면 y_scale 을 따릅니다.

roi 그릴 소스 이미지의 관심 영역(ROI) 사각형 (x, y, w, h) 입니다.

rgb_channel RGB565 소스 이미지에서 추출할 RGB 채널입니다(0=R, 1=G, 2=B, -1=전체). 범위: -1..2.

alpha 이미지의 불투명도입니다. 0은 완전히 투명(검은색), 255는 불투명입니다. 범위: 0..255.

color_palette 색상 팔레트 열거형(예: image.PALETTE_RAINBOW) 또는 소스의 그레이스케일 값에 대한 색상 조회 테이블로 사용되는 256픽셀 RGB565 이미지입니다. rgb_channel 추출 후에 적용됩니다.

alpha_palette 소스 그레이스케일 값을 기준으로 alpha 를 변조하는 픽셀별 알파 조회 테이블로 사용되는 256픽셀 그레이스케일 이미지입니다.

hint 다음 플래그들의 논리 OR입니다:

clear(display_off: bool = False) None

LCD 화면을 검은색으로 지웁니다.

display_off True이면 프레임버퍼를 지우는 대신 디스플레이 로직을 끕니다. 그 후 백라이트도 비활성화해야 합니다.

backlight(value: int | None = None) int | None

value 가 있으면 백라이트 강도를 설정합니다(0=꺼짐..100=최대). 인수가 없으면 현재 백라이트 값을 반환합니다.

DACBacklight 또는 PWMBacklight 컨트롤러가 생성 시 전달되지 않은 경우, 백라이트는 GPIO 핀으로 구동되며 0(꺼짐)에서 0이 아닌 값(켜짐)까지만 이동합니다.

bus_write(cmd: int, args: int | bytes | None = None, *, dcs: bool = False) None

SPI 버스를 통해 cmd 를 디스플레이로 전송하며, 선택적으로 그 뒤에 args (int 바이트 또는 바이트 버퍼)를 전송합니다. dcs 는 컨트롤러가 지원할 때 DCS 프레이밍을 선택합니다.

bus_read(cmd: int, len: int, args: int | bytes | None = None, *, dcs: bool = False) bytearray

SPI 버스를 통해 cmd 를 전송하고 len 바이트를 다시 읽어 bytearray 로 반환합니다. args 는 선택적으로 읽기 전에 기록됩니다(int 바이트 또는 바이트 버퍼). dcs 는 컨트롤러가 지원할 때 DCS 프레이밍을 선택합니다.

ioctl(cmd: int, arg: object | None = None) object

컨트롤러별 ioctl cmd 를 선택적 arg 와 함께 실행합니다. 기반 디스플레이가 ioctl을 지원하지 않으면 ValueError 를 발생시킵니다.