Загрузка 0
ПОДЕЛИТЬСЯ

Мой блог

Листай вниз

Как запустить видео 20 fps на E-Ink дисплее с помощью ESP32-S3

Как запустить видео 20 fps на E-Ink дисплее с помощью ESP32-S3

Подробности изложены в материале первоисточника. Мне удалось запустить полноценное чёрно-белое видео на стоковой плате ESP32-S3 с экраном на электронных чернилах: никакой ПЛИС и никакого ПК — панель управляется напрямую по параллельной шине. В статье я подробно расскажу, как работает этот драйвер для параллельных E-Ink дисплеев.

Если коротко, то в нём задействован векторный блок для обработки по 64 пикселя за раз, управляющие сигналы хранятся прямо в регистрах вместо громоздких таблиц, а дельта-движок вычисляет изменения. При этом точность всей системы я тщательно контролировал при помощи обычного планшетного сканера.

Техническая схема конвейера обработки
Распределение задач между буферами памяти микроконтроллера.
График производительности драйвера
Итоговые показатели затрат времени на обработку одного кадра.
Пример кода для управления матрицей
Пример реализации функций преобразования пикселей в коде проекта.
Разъем подключения шлейфа панели
Параллельная шина подключения E-Ink матрицы к плате.
Компоненты отладочной платы
Внутренние компоненты аппаратного модуля.
Тестирование режимов обновления экрана
Тесты быстрого режима обновления матрицы.
Оптическая калибровка серого цвета
Сопоставление уровней серого с паттернами дизеринга.
Финальный этап сборки проекта
Финальный вариант устройства в собранном виде.

Особенности аппаратной платформы

Для работы с параллельными матрицами без встроенного контроллера, аналогичными тем, что устанавливаются в устройства Kindle, на базе чипа ESP32-S3 применяется открытая библиотека EPD_Painter. На текущий момент программное обеспечение поддерживает аппаратные платы LilyGo T5 и M5PaperS3.

Реклама
Стоп-кадр E-Ink панели после сканирования
Результат сканирования дисплея на планшетном сканере с разрешением 300 dpi.

Подобные компоненты представляют собой фактически голое стекло без встроенных буферов кадров и стандартных интерфейсов. Здесь присутствуют лишь драйверы столбцов и строк. Потактовая загрузка управляющих данных для 960 пикселей в сдвиговый регистр, отправка импульса защёлки и переход к следующей строке повторяются 540 раз за один проход.

Реклама

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

Архитектура конвейера обработки

Чтобы задействовать ресурсы микроконтроллера максимально эффективно, я распределил задачи между тремя специализированными буферами в разных областях памяти устройства.

Результат двойного защёлкивания строк на экране
Артефакты и блёклые контуры при попытке двойного защёлкивания строки.

Приложения могут рисовать интерфейсы через стандартные библиотеки вроде Adafruit GFX или LVGL на общем 8-битном холсте. Специальный видеоплеер обходит этот холст и передает кадры, упакованные по два бита на пиксель, которые предварительно сгенерированы скриптом на Python.

Процесс тестирования и измерений на сканере
Тестируемое устройство экраном вниз на стекле сканера во время измерений.

Все последующие операции опираются на минимизацию считываний каждого отдельного байта. Драйвер держит в памяти зеркальную копию того, что физически выводится на экран, что позволяет мгновенно отсекать неизменившиеся области.

Оптимизация через SIMD и регистры

В основе обработки данных лежит векторный сопроцессор PIE со 128-битными регистрами, позволяющий выполнять операции со строками байтов за один такт процессора. Выбранный формат в два бита на пиксель обеспечивает идеальное выравнивание: ровно 64 пикселя заполняют один векторный регистр.

Результат сканирования тестового шаблона
Тестовый шаблон с линиями, отсканированный для калибровки сигналов управления.

Сигналы управления обрабатываются как состояния, а не как статические данные. Колонка сигналов для конкретного прохода дублируется в регистры в начале вызова функции, благодаря чему отпадает необходимость в постоянных обращениях к таблицам в оперативной памяти.

Эксперименты с физикой чернил

На определенном этапе разработки я столкнулся со сценарием, когда движущийся контур требовал одновременного затемнения и осветления пикселей в рамках одного блока. Ранние попытки реализовать двойную активацию строки за один проход привели к появлению блёклых контуров.

Стоп-кадр воспроизведения видео на E-Ink
Стоп-кадр движущегося силуэта во время проигрывания видеоролика.

Для точной диагностики проблемы я задействовал планшетный сканер в качестве фотометра. Сканирование тестовых шаблонов наглядно показало, что при двойном защёлкивании вся энергия уходит на последний слой, тогда как первому достается лишь мизерный импульс длительностью около тридцати микросекунд.

Итоговые результаты и калибровка

Понимание физики удержания заряда позволило объединить оба направления в единую передачу данных без потери производительности. Калибровка градаций серого выполнялась оптическим методом через сопоставление с узорами дизеринга на сканере.

Дополнительный стоп-кадр видео на E-Ink дисплее
Еще один пример качественного воспроизведения динамичных сцен.

В результате слаженной работы всех компонентов мне удалось добиться стабильного воспроизведения видеопотока с частотой ровно 20 кадров в секунду на доступном железе.

01.