class RGBDisplay – RGB 디스플레이 드라이버

RGBDisplay 클래스는 STM32 LTDC(LCD-TFT) 컨트롤러를 통해 24비트 병렬 RGB LCD를 구동합니다. LTDC는 선택한 픽셀 클록으로 SDRAM 기반 프레임버퍼에서 픽셀을 직접 스트리밍하므로, CPU 개입 없이 높은 새로 고침 빈도(최대 120Hz)를 구현할 수 있습니다.

OpenMV Cam Pure Thermal에서는 동일한 24비트 병렬 버스가 온보드 TFP410 HDMI 인코더에도 공급되므로, HDMI 출력 역시 이 클래스를 통해 구동됩니다. 인코더로 픽셀을 계속 보내면서 온보드 LCD를 끄려면 display_on=False 를 사용하세요.

패널 해상도는 display 모듈에 정의된 상수(QVGA, VGA, WVGA, HD, FHD, …)를 사용하여 framesize 로 선택합니다. 패널별 초기화 시퀀스는 controller 키워드 인수를 통해 연결합니다(예: ST7701 기반 패널의 경우 ST7701). 백라이트 밝기는 기본적으로 단순한 GPIO로 구동되거나, backlight 로 전달된 경우 DACBacklight / PWMBacklight 에 의해 구동됩니다.

프레임은 image.Image 와 함께 write() 를 호출하여 표시됩니다. 드라이버는 RGB 변환, 스케일링, ROI, 팔레트 및 방향 변환을 내부적으로 처리합니다.

예시 – 카메라를 480x272 패널에 60Hz로 미러링합니다:

import csi
import display
import image

csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)

lcd = display.RGBDisplay(framesize=display.FHVGA, refresh=60)

while True:
    lcd.write(csi0.snapshot(), hint=image.SCALE_ASPECT_KEEP)

생성자

class display.RGBDisplay(framesize: int = display.FWVGA, refresh: int = 60, display_on: bool = True, triple_buffer: bool = True, portrait: bool = False, controller: object | None = None, backlight: object | None = None)

framesize 표준 지원 해상도 중 하나입니다(display 모듈 상수 참조).

refresh 화면 새로 고침 빈도를 헤르츠 단위(30-120)로 설정합니다. 이는 RGB LCD 픽셀 클록을 제어합니다.

display_on 로컬 LCD 출력을 활성화합니다. OpenMV Cam Pure Thermal에서는 False 를 전달하세요. 이 보드의 24비트 병렬 버스는 온보드 LCD와 TFP410 HDMI 인코더를 모두 구동하므로, 이렇게 하면 HDMI 인코더에는 계속 공급하면서 온보드 LCD를 끈 상태로 유지합니다. 다른 OpenMV Cam에는 공유 출력 대상이 없으므로 기본값으로 두어도 됩니다.

triple_buffer True 이면 RAM에서 디스플레이 크기의 3배를 소비하는 대신 화면 업데이트를 논블로킹으로 만듭니다.

portrait 프레임 크기의 너비와 높이를 서로 바꿉니다.

controller 컨트롤러 칩 클래스 인스턴스를 전달하여 디스플레이와 함께 초기화합니다.

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

deinit() None

클래스가 사용한 I/O 핀과 RAM을 해제합니다. 소멸 시 자동으로 호출됩니다.

width() int

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

height() int

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

triple_buffer() bool

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

bgr() bool

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

byte_swap() bool

출력 시 RGB565 픽셀 바이트가 서로 바뀌었는지 여부를 반환합니다.

framesize() int

디스플레이가 구성된 프레임 크기 상수를 반환합니다.

refresh() int

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

clear(display_off: bool = False) None

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

display_off True 이면 프레임버퍼를 검은색으로 지우는 대신 디스플레이 로직을 끕니다. 많은 디스플레이가 백라이트만 켜져 있을 때 흰색으로 나타나므로, 화면이 확실히 검은색이 되도록 그 후 백라이트도 꺼야 합니다.

backlight(value: int | None = None) int

LCD 백라이트 밝기 조절 값을 0(꺼짐)에서 100(켜짐)까지 설정합니다. 인수 없이 호출하면 현재 백라이트 값을 가져옵니다.

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

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: 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 방향으로 얼마나 스케일되는지를 제어합니다. 이 값이 음수이면 이미지가 세로로 뒤집힙니다(트리플 버퍼링 필요). x_scale 이 지정되지 않으면 종횡비를 유지하기 위해 y_scale 과 일치하게 됩니다.

roi 는 표시할 이미지의 관심 영역(ROI) 사각형 튜플 (x, y, w, h) 입니다.

rgb_channel 은 RGB565 이미지에서 추출하여 그레이스케일로 렌더링할 RGB 채널(0=R, 1=G, 2=B)입니다. -1 은 채널 추출을 비활성화합니다.

alpha 이미지의 불투명도를 제어합니다. 0(완전히 투명 / 검은색)에서 255(불투명)까지입니다.

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

alpha_palette 입력 이미지의 그레이스케일 값에 대한 픽셀별 알파 조회 테이블로 사용되는 총 256픽셀의 GRAYSCALE 이미지입니다. rgb_channel 추출 후에 적용됩니다.

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