[Перевод] Стенгазета на Rust с E-Ink и ChatGPT
Самодельная автоматически обновляющаяся газета на 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 RTC имеет гораздо меньшее энергопотребление, чем модули DS*, распространённые в проектах DIY, и чрезвычайно точен благодаря встроенному осциллятору, позволяющему проводить заводскую калибровку.
Дополнительно к MCU подключена управляющая плата E-Ink с контроллером ITE IT8951 EPD. Поскольку дисплеи E-ink (подробнее о панели, выбранной ниже) являются бистабильными и не нуждаются в питании между обновлениями, плата управления подключена к реле 5В, чтобы избежать потребления энергии в режиме ожидания (например, от входящего в комплект светодиодного индикатора питания).
В целом, интерфейс проводит большую часть своего времени в глубоком сне. Ранним утром он просыпается и обновляется.
Дисплей, который вы видите ниже, это 13,3-дюймовая панель ED133UT2 от E Ink, которая имеет разрешение 1600×1200. Это дисплей из линейки продуктов 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
→ Информационная безопасность и глупость: необычные примеры
→ NAS за шапку сухарей
→ Взлом Hyundai Tucson, часть 1, часть 2
→ Столетний язык программирования — какой он
→ 50 самых интересных клавиатур из частной коллекции