class SPIDisplay – драйвер SPI-дисплея

Класс SPIDisplay управляет небольшими TFT- и OLED-панелями, подключаемыми по SPI – чаще всего SSD1351 128x160 RGB OLED на OpenMV LCD Shield. Драйвер внутренне владеет шиной SPI и линиями выбора кристалла (chip-select) / DC GPIO, поэтому вызывающему коду нужно лишь настроить геометрию панели, частоту обновления и любые флаги ориентации. Инициализация, специфичная для панели (последовательности регистров, кадрирование записи в ОЗУ), задаётся через именованный аргумент controller – передайте экземпляр SSD1351 для управления LCD Shield или реализуйте собственный класс контроллера для других панелей.

Кадры выводятся вызовом write() с объектом image.Image. Драйвер преобразует источник в RGB565 и внутренне применяет масштабирование, ROI, палитру и преобразования ориентации, поэтому вызывающему коду не требуется заранее задавать размер изображения. Яркость подсветки можно оставить как простой GPIO включения/выключения (по умолчанию) либо управлять ею через DACBacklight / PWMBacklight, передав один из них в именованном аргументе backlight.

Пример – зеркалирование изображения с камеры на OLED SSD1351 OpenMV LCD Shield:

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 ЖК-дисплея в пикселях (1..32767).

height Высота SPI ЖК-дисплея в пикселях (1..32767).

refresh Частота обновления ЖК-дисплея в герцах (1..120). Управляет тактовой частотой SPI.

bgr установите в True, чтобы поменять местами красный и синий каналы.

byte_swap установите в True, чтобы поменять местами байты пикселей RGB565, отправляемые на ЖК-дисплей.

hmirror установите в True, чтобы зеркально отразить вывод дисплея по горизонтали.

vflip установите в True, чтобы отразить вывод дисплея по вертикали.

triple_buffer если True, делает обновления экрана неблокирующими ценой утроенного размера дисплея в ОЗУ. Значение по умолчанию зависит от платы (включено для плат с 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

Возвращает настроенный идентификатор framesize.

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

Отображает image с левым верхним углом в позиции (x, y). Вместо изображения можно передать строку пути, чтобы загрузить и нарисовать его за один шаг.

x_scale коэффициент масштабирования по оси x. Отрицательные значения отражают по горизонтали. Если y_scale опущен, он следует за x_scale для сохранения соотношения сторон.

y_scale коэффициент масштабирования по оси y. Отрицательные значения отражают по вертикали (требует triple_buffer=True). Если x_scale опущен, он следует за y_scale.

roi прямоугольник области интереса (x, y, w, h) исходного изображения для рисования.

rgb_channel RGB-канал для извлечения из исходного изображения RGB565 (0=R, 1=G, 2=B, -1=все). Диапазон: -1..2.

alpha непрозрачность изображения. 0 – полностью прозрачное (чёрное), 255 – непрозрачное. Диапазон: 0..255.

color_palette перечисление цветовой палитры (например, image.PALETTE_RAINBOW) или изображение RGB565 размером 256 пикселей, используемое как таблица соответствия цветов для значения оттенков серого источника. Применяется после извлечения rgb_channel.

alpha_palette изображение в оттенках серого размером 256 пикселей, используемое как попиксельная таблица соответствия альфа-канала, модулирующая alpha на основе значения оттенков серого источника.

hint логическое ИЛИ флагов:

  • image.AREA: Использовать масштабирование по площади при уменьшении.

  • image.BILINEAR: Использовать билинейное масштабирование.

  • image.BICUBIC: Использовать бикубическое масштабирование.

  • image.CENTER: Центрировать изображение на дисплее (после масштабирования).

  • image.HMIRROR: Зеркально отразить изображение по горизонтали.

  • image.VFLIP: Отразить изображение по вертикали.

  • image.TRANSPOSE: Транспонировать изображение (поменять местами x/y).

  • image.EXTRACT_RGB_CHANNEL_FIRST: Применить извлечение rgb_channel до масштабирования.

  • image.APPLY_COLOR_PALETTE_FIRST: Применить color_palette до масштабирования.

  • image.SCALE_ASPECT_KEEP: Масштабировать так, чтобы поместиться внутри дисплея.

  • image.SCALE_ASPECT_EXPAND: Масштабировать так, чтобы заполнить дисплей (с обрезкой).

  • image.SCALE_ASPECT_IGNORE: Масштабировать так, чтобы заполнить дисплей (с растяжением).

  • image.ROTATE_90: Повернуть на 90 градусов (VFLIP | TRANSPOSE).

  • image.ROTATE_180: Повернуть на 180 градусов (HMIRROR | VFLIP).

  • image.ROTATE_270: Повернуть на 270 градусов (HMIRROR | TRANSPOSE).

clear(display_off: bool = False) None

Очищает экран ЖК-дисплея в чёрный цвет.

display_off если True, отключает логику дисплея вместо очистки буфера кадра. После этого следует также отключить подсветку.

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

С аргументом value задаёт интенсивность подсветки (0=выключено..100=максимум). Без аргументов возвращает текущее значение подсветки.

Если при создании не передан контроллер DACBacklight или PWMBacklight, подсветка управляется как вывод GPIO и может принимать только значения 0 (выключено) или ненулевое (включено).

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

Отправляет cmd на дисплей по шине SPI, опционально с последующими args (целочисленный байт или буфер байтов). dcs выбирает кадрирование DCS, когда оно поддерживается контроллером.

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

Отправляет cmd по шине SPI и считывает обратно len байтов, возвращая их как bytearray. args опционально записывается перед чтением (целочисленный байт или буфер байтов). dcs выбирает кадрирование DCS, когда оно поддерживается контроллером.

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

Выполняет специфичный для контроллера ioctl cmd с опциональным arg. Вызывает ValueError, если нижележащий дисплей не поддерживает ioctl.