Обновить

Качественная анимация на микроконтроллере с оптимизацией, через мои костыли:

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели13K
Всего голосов 16: ↑15 и ↓1+18
Комментарии11

Комментарии 11

UPD: Добавил ещё кириллический шрифт в файлы, может пригодится, чтобы так же не изворачиваться

Первое, что вам необходимо узнать, — это какой контроллер установлен в вашем дисплее.

Затем нужно узнать, какая у него частота обработки одного бита, передаваемого через протокол. Из опыта: самое простое и эффективное — передавать данные через протокол SPI.

Дальше нужно узнать частоту шины микроконтроллера, через которую вы будете передавать данные на пины.

Затем составьте минимальный набор команд для обновления одного пикселя, с лёгкостью подсчитайте, сколько времени будут выполняться эти команды, и далее посчитайте, сколько пикселей вам нужно обновить для смены одного кадра. И умножьте на желаемую частоту анимаций.

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

К слову у вас ST7789  который довольно плохо, самый лучший это NV3030B для TFT дисплея (Банально открываете документацию и смотрите на скорости обработки данных по SPI)

Раз DMA, то и двойная буферизация.

Спасибо что обратили внимание. Если честно статья ориентирована на новичков (коим я и являюсь), потому по техническим деталям отделался одним предложением.

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

DMA конечно используется, инициализация шины идет через spi_bus_initialize(…, SPI_DMA_CH_AUTO), а сам драйвер esp_lcd работает на асинхронном DMA с прерыванием on_color_trans_done.

Поэтому два буфера есть и живут в PSRAM (а не внутренней sram), я уменьшил trans_queue_depth (до 4) и max_transfer_sz (до 40 строк). В итоге пиковое потребление DMA-памяти упало с ~380 КБ до ~77 КБ, что критично для параллельной работы остальных модулей

да тут очень бы интересен пример кода без использования lvgl. esp_idf на lvgl ориентировано, я не видел альтернативных вариантов, только под ardiuno

UPD: Добавил в файлы display.cpp / display.h. Это чистая работа с драйвером (esp_lcd, SPI, DMA, PSRAM, double buffering) без моей анимации.

Есть момент: функция swap_gb565() — это компенсация конкретной BGR-раскладки моей панели. Сейчас она работает на лету . Если у вас RGB — она не нужна. В будущем планирую запечь её в LUT , но пока оставил так для калибровки

я бы сказал тут вообще ни слова ни строки кода про это.

впрочем esp_idf а равно и arduino имеет это "аппаратное ускорение" нескольких видов дисплейных интерфейсов "из коробки", да и поддержку  ST7789  официальную, он может не только spi, просто это размазано по 4 слоям hal.

постановка вопроса тут странная: контроллер выбирает изготовитель дисплейного модуля в зависимости от матрицы, поэтому обычно имеем "что дают". я вообще не видел модулей с этим самым NV3030B

Если что, все эти контроллеры спокойно работают с подобной матрицей; просто новых-то особо не делают, вот и остаётся мусор, а хороший контроллер всё труднее найти.

Ну, в будущем вообще ничего такого не будет: старое поколение вымрет, а новому оно не надо — скажут: «Ты чё, дед, это прошлый век», — и полезут в ИИ )

Уже сейчас среди людей до 30 лет трудно найти таких, которые не просто интересовались бы подобным, а имели бы понимание того, как всё это работает

про драйвер я уже писал выше — ST7789 мне подошёл именно из-за скруглённых краёв матрицы и пропорций, которые позволяют уместить и лицо, и текст, приятный визуал относительно других модулей и корпуса. А узкое место тут — память и CPU, которые нужны для остальных модулей (FSM, моторы, парсеры, сеть, память и т.д.)

Насчёт «поколения не то» — инженерия это слои. Есть те, кто проектирует матрицы и драйверы. А есть те, кто использует эти решения в прикладных проектах. Мне нужно было нарисовать лицо, а не написать драйвер. ESP-IDF даёт esp_lcd из коробки — я им и воспользовался. кто-то копает вглубь, кто-то строит вширь, и то и то важно

Именно! Мне просто подошёл дисплей по дизайну и пропорциям под проект. Хотя в целом мне нужны были большие разделённые пиксели OLED монохром, но найти именно такой, в нужном цвете пикселей не удалось — потому решал эти дизайн-задачи программно, а не железом.

А драйвер... ну, ST7789. Он работает, есть в ESP-IDF из коробки (esp_lcd_new_panel_st7789), и с ним всё получилось. Если бы попался другой — разницы бы не было, главное, чтобы SPI и DMA тянули.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации