Самодельная автоматически обновляющаяся газета на E-Ink с использованием Rust и ChatGPT — как вам такой DIY?

В этом посте я опишу, как я сделал встроенный интерфейс и серверную часть для моей автоматической газеты на E-Ink. В проекте участвуют микроконтроллеры, RaspPi в качестве сервера, Rust в качестве варианта реализации и ChatGPT в качестве приглашённого гостя.
В основе этой сборки лежит плата микроконтроллера ESP32 с добавлением PSRAM объёмом 4 МБ для облегчения задач обработки изображений.
При оптимизации сборки для обеспечения низкого энергопотребления и максимального срока службы батареи я отказался от преобразователя напряжения и BMS на плате коммутации MCU и использовал разные детали (например, MT3608) между LiPo-элементом емкостью 1100 мАч и платой MCU.
ESP32 ежедневно включается с помощью часов реального времени RV-3028-C7, установленных на бесплатной плате разработчика от производителя Micro Crystal. Этот RTC имеет гораздо меньшее энергопотребление, чем модули DS*, распространённые в проектах DIY, и чрезвычайно точен благодаря встроенному осциллятору, позволяющему проводить заводскую калибровку.
Дополнительно к MCU подключена управляющая плата E-Ink с контроллером ITE IT8951 EPD. Поскольку дисплеи E-ink (подробнее о панели, выбранной ниже) являются бистабильными и не нуждаются в питании между обновлениями, плата управления подключена к реле 5В, чтобы избежать потребления энергии в режиме ожидания (например, от входящего в комплект светодиодного индикатора питания).
В целом, интерфейс проводит большую часть своего времени в глубоком сне. Ранним утром он просыпается и обновляется.


Дисплей, который вы видите ниже, это 13,3-дюймовая панель ED133UT2 от E Ink, которая имеет разрешение 1600x1200. Это дисплей из линейки продуктов Carta 1200, знакомый многим владельцам Kindle.


Заметили маленький DIP-переключатель на одной из фотографии? Он включает журналы последовательной отладки и сокращает интервал обновления с ежедневного примерно до одного раза в две минуты.
На выходе вы можете увидеть линейный поток программы. После пробуждения MCU подключается к Wi-Fi, извлекает новое газетное изображение из RasPi в моей домашней сети, затем снова засыпает. Очень глубоко засыпает — даже внутренняя RTC-память отключена для максимального срока автономной работы.
Поведение встроенного программного обеспечения оптимизировано для обеспечения надёжности и низкого уровня активного обслуживания — несколько повторных попыток с экспоненциальной выдержкой и т. д.
Особенно важно то, что я написал всё это, включая пользовательский драйвер для контроллера IT8951 EPD, на языке Rust. Попробовать Rust на микроконтроллере было одной из моих мотиваций для этого проекта (страница проекта)!

На фото выше — пробная версия макета. Кто-то наверняка заметит, что я вдохновлялся вёрсткой в стиле "The New York Times". Позже я ещё больше оптимизировал макет, внедрив знаменитые заголовки, расположенные в шахматном порядке. В этом мне помог ChatGPT.

Добавил даже прогноз погоды в стиле NYTimes, из API OpenWeatherMap.

"А что с бэкендом?", — спросите вы.

Серверная часть работает на RasPi в моей домашней сети. Бэкенд написан на Python и ежедневно запускается с помощью systemd. Он включает в себя сборщики статей на основе lxml для некоторых сайтов, которые нравятся мне и моей жене, а затем используется API ChatGPT, чтобы обрезать их по размеру, передать суть и сократить заголовки. Он также получает прогноз погоды из API OpenWeatherMap, который находится в правом верхнем углу страниц.
Удивительно, что всего несколькими неделями ранее этот проект было бы сложно реализовать. Эта система также выполняет несколько повторных попыток с экспоненциальной выдержкой на каждом шагу, чтобы мне не приходилось заниматься добавлением новостей вручную.
Собранный контент заносится в шаблон LaTeX (генерируется на базе Jinja2). Luatex создает PDF-файл из этого входного файла, который затем растрируется в PNG с помощью Ghostscript. ImageMagick используется для добавления характеристик бумаги и кофейного пятна в случайном месте, а также для создания необработанного растрового изображения для контроллера EPD, которое может идти непосредственно в память кадрового буфера IT8951.
Конечный файл передаётся по HTTP во встроенный интерфейс, используя встроенную в Python библиотеку HTTP-сервера, и когда утром моя электронная стенгазета проснётся, она получит его. Ошибки, а также вид газеты отправляются мне в Telegram для проверки.


Вышло хорошо, как мне кажется! Теперь буду смотреть, как долго он работает от 1100 мАч, прежде чем потребуется подзарядка.
Что ещё интересного есть в блоге Cloud4Y
→ Информационная безопасность и глупость: необычные примеры
→ Взлом Hyundai Tucson, часть 1, часть 2