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

Клас SPIDisplay керує невеликими TFT і OLED панелями, підключеними через SPI – найчастіше SSD1351 128x160 RGB OLED на OpenMV LCD Shield. Драйвер внутрішньо керує SPI-шиною та лінією GPIO вибору мікросхеми / DC, тому користувачу потрібно налаштувати лише геометрію панелі, частоту оновлення та прапори орієнтації. Специфічна для панелі ініціалізація (послідовності регістрів, оформлення RAM-запису) надається через аргумент ключового слова 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.