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.