Дисплей E-paper: принцип работы и подключение к Arduino

Сильные и слабые стороны электронной бумаги, устройство пикселя, выбор библиотеки для модуля 2,9 дюйма и вывод текста и картинок с Arduino.
Достоинства и ограничения
Электронная бумага (E-paper, прежнее название — E-ink) знакома по электронным книгам. Главное её свойство — она, как обычная бумага, только отражает падающий свет и ничего не излучает. Изображение не мерцает, отличается чёткостью и контрастом и меньше утомляет глаза, чем обычные мониторы.

Второе преимущество — очень низкое энергопотребление. Ток нужен только в момент смены картинки, после чего изображение держится без питания; аккумулятора книги хватает на несколько суток непрерывной работы. К тому же такой экран тонкий и лёгкий, из него проще сделать выпуклую или вогнутую поверхность.


Недостатки тоже существенны: картинка обновляется медленно, от полусекунды до десятков секунд, палитра ограничена (чаще всего чёрно-белая), оттенков мало. Технология развивается: появились двухцветные и семицветные версии, скорость растёт, с сенсорным слоем и подсветкой уже выпущен смартфон на таком экране. Однако для видео и динамичных игр электронная бумага по-прежнему подходит плохо.

Как устроен пиксель
Классическая двухцветная электронная бумага появилась на рынке в 1996 году. Пиксель — это микрокапсула с прозрачной жидкостью, в которой плавают белые и чёрные микрошарики с разным зарядом. Под действием поля одни притягиваются к основанию, другие отталкиваются, и верхняя стенка капсулы меняет цвет. Меняя площадь зарядов под капсулой, получают оттенки серого.
Перемещение шариков требует времени, отсюда медленная реакция. Часть шариков застревает, и на экране остаются «призраки» прежнего изображения; их убирают многократной сменой кадра, что ещё больше замедляет обновление.
Точное устройство цветных экранов производители не раскрывают. Предполагают, что в двухцветных используются шарики, окрашенные с одной стороны в чёрный, а с другой в красный или жёлтый цвет, и изображение формируется в два этапа. Для полноцветных одна из версий такова: пиксель состоит из трёх капсул под красным, зелёным и синим светофильтрами, то есть работает по принципу RGB.
Какие модули доступны для Arduino
Дисплеи различаются размером, цветностью и компоновкой. Самые доступные — чёрно-белые с диагональю около полутора дюймов; далее размеры растут, у части моделей добавляется красный или жёлтый цвет. Они годятся для редко меняющихся данных: времени, температуры, влажности, надписей, заранее подготовленных картинок. Продаются как отдельные экраны, так и модули с драйвером; модуль в сборе подключить проще и надёжнее.
В рассматриваемом примере используется трёхцветный (чёрно-бело-красный) модуль 2,9 дюйма с разрешением 296×128 и толщиной 7 мм без защитного стекла. На обратной стороне расположены разъёмы интерфейса и переключатель режима на 3 или 4 провода.
Выбор библиотеки
- Adafruit EPD — с этим модулем не заработала: дисплей не отвечал ни при каком варианте подключения.
- GxEPD2 — поддерживает десятки дисплеев и модуль запускает, но требует долгой настройки: нужно указать чип драйвера, цветность, размер и выводы. Тестовый пример занимает 80–95 % флеш-памяти контроллера, после чистки — 60–70 %.
- Набор примеров от производителя — отдельные проекты под каждый дисплей и три платформы (AVR, STM32, Raspberry) со шрифтами от 8 до 24 пунктов. Настроек минимум, а код занимает почти вдвое меньше памяти, чем GxEPD2.
Вывод текста и фигур
Переключатель BS1 ставят в положение L (4 провода) и загружают пример для своего дисплея, здесь это epd2in9bc. На практике полный кадр формируется около 15 секунд, изображение получается очень чётким. Цветная часть выводится после чёрной, поэтому в местах пересечения всегда остаётся цвет.
Функции рисования точек, линий, прямоугольников, кругов и текста лишь заполняют буфер. Строка paint.DrawStringAt(0, 0, "e-Paper Demo", &Font24, COLORED) готовит картинку с текстом, вызов epd.SetPartialWindowBlack(...) помещает её в память дисплея в заданное место чёрным цветом, а на экран всё выводит epd.DisplayFrame(). Ось X направлена вдоль короткой стороны, Y — вдоль длинной, начало координат находится в дальнем от шлейфа углу. Текст всегда рисуется на непрозрачной подложке цвета фона.
Растровая картинка
Изображение приводят к разрешению дисплея и разделяют на два чёрно-белых файла — для чёрного и для красного слоя. Каждый переводится в массив, где один пиксель равен одному биту: 296×128 = 37888 пикселей, или 4736 байт. Двух массивов набирается 9472 байта, поэтому их размещают во флеш-памяти с помощью PROGMEM. У Arduino UNO доступно 32256 байт, так что три картинки уже не оставят места программе.
Массивы получают онлайн-конвертером: в поле OUTPUT выбирают Arduino, ориентацию оставляют Horizontal. Полученными данными заменяют содержимое массивов IMAGE_BLACK и IMAGE_RED в файле imagedata.cpp, не трогая строки с именами. Вывод выполняется командой epd.DisplayFrame(IMAGE_BLACK, IMAGE_RED). Если картинка больше меняться не будет, в конце вызывают epd.Sleep(): дисплей перестаёт потреблять энергию, и его можно отключить от платы — изображение сохранится.
Где это применимо
Электронная бумага подходит для проектов, где данные меняются редко: мониторинг теплицы, часы без секунд, ценники и этикетки, устройства, которые включаются раз в сутки, обновляют экран и засыпают. Семицветный дисплей 600×448 требует 235200 байт на одну картинку, поэтому для него лучше выбирать STM32 или Raspberry. Хранить изображения на SD-карте теоретически можно, но реализовать это довольно сложно.