Программирование ARM E-Ink экран 2.9", 296x128 точек, с интерфейсом SPI Fri, December 13 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


E-Ink экран 2.9", 296x128 точек, с интерфейсом SPI Печать
Добавил(а) microsin   

Такие экраны можно купить на AliExpress и Ebay, хотя цены на сегодняшний день пока кусаются (200313, около $10). Удобнее всего работать с индикатором, который снабжен платой-переходником с гибкого шлейфа на стандартный коннектор с шагом штырьков 2.54 мм, иначе придется делать для него переходную плату.

Модуль дисплея E-Ink 2.9" (296x128 точек) снабжен встроенным контроллером, обменивающимся данными с внешним миром через интерфейс SPI, с поддержкой частичного обновления. Достоинства экрана очевидны для определенных областей использования - сверхнизкое энергопотребление, широкие углы обзора, сохранение картинки даже при полном отключении питания. Однако у этих индикаторов имеется существенное ограничение - медленное обновление изображения, особенно когда оно обновляется целиком (полное обновление картинки может занимать от 2 секунд и более).

• Нет подсветки, изображение сохраняется на экране длительное время, даже когда питание не поступает.
• Очень малое потребление энергии. Питание в основном необходимо только для обновления изображения.
• Интерфейс SPI для подключения к широкому спектру аппаратных устройств, таких как например Raspberry Pi, платы Arduino, Nucleo, Discavery, BBB и т. п.
• Встроенный транслятор логических уровней, совместимый 3.3V/5V MCU.
• Есть рабочие примеры кода и руководства по использованию (для Raspberry Pi, Jetson Nano, Arduino, STM32).

[Параметры]

• Напряжение питания: 3.3V/5V
• 3-проводный или 4-проводный SPI
• Внешние размеры: 89.5 x 38 мм
• Размер графической области экрана: 66.89 x 29.05 мм
• Размер точки: 0.138 x 0.138 мм
• Разрешающая способность: 296 x 128 точек
• Цвета экрана: черный и белый
• 2 уровня серого (монохром)
• Время частичного обновления изображения: 0.3 сек
• Время полного обновления экрана: 2 сек
• Потребление энергии 26.4 мВт (типовое значение)
• Потребление в режиме приостановки (standby) < 0.017 мВт
• Угол обзора > 170°

Waveshare e-Paper в основном поставляются в двух вариантах: с "сырым" коннектором на гибком кабеле (так называемая RAW panel), и с более удобным для подключения модулем адапера (Module/HAT version).

e Paper 2 9inch RAW e Paper 2 9inch HAT

На адаптере Module/HAT собрана схема драйвера, и этот вариант экрана сразу готов к подключению к микроконтроллеру.

Кроме монохромных вариантов экрана есть еще трехцветные (e-Paper (B) и e-Paper (C)), у которых очень большое время обновления (15 секунд!), и которые не поддерживают частичное обновлеие экрана (partial refresh). Трехцветные экранчики имеют довольно бледные цвета. Очевидно, что эти экраны пригодны в основном только для приложений типа статичных меток товара, которые редко обновляются.

Разновидности экранов e-Paper 2.9inch приведены в таблице ниже, показаны только их отличия.

Тип экрана Отображаемые цвета Время full refresh, сек Поддержка partial refresh
2.9inch e-Paper черный, белый 2 есть
2.9inch e-Paper (B) красный, черный, белый 15 -
2.9inch e-Paper (C) желтый, черный, белый 15 -
2.9inch e-Paper (D) черный, белый 2 есть

Остальные параметры всех этих вариантов индикаторов совпадают:

Параметр Значение
Градаций яркости 2
Разрешающая способность, точек 296 x 128
Размер изображения, мм 66.89 x 29.05
Внешний размер, мм 79.0 x 36.7
Интерфейс подключения SPI

Важные замечания по применению:

1. Не стоит чрезмерно увлекаться частичным обновлением экрана (partial refresh, занимает по времени 0.3 секунды) для тех вариантов экранов e-Paper, которые это поддерживают. Вы не можете применять partial refresh постоянно. После нескольких partial refresh обязательно надо делать полное обновление экрана (full refresh, занимает по времени 2 секунды), иначе e-Paper будет необратимо поврежден.

2. Экран e-Paper нельзя долго держать под питанием, Вы должны перевести индикатор в режим сна или выключить его, когда обновление не требуется. В противном случае, когда e-Paper работает с высоким напряжением длительное время, он повреждается, и исправить повреждение невозможно.

3. Рекомендуется обновлять изображение e-Paper один раз за 24 часа, или как минимум не реже одного раза за 10 дней (за более подробной информацией обращайтесь к даташиту). В противном случае старая картинка может "впечататься", и её нельзя будет очистить.

4. Экран e-Paper игнорирует данные, которые были отправлены ему в режиме сна, поэтому для правильного обновления картинки экран нужно инициализировать заново.

5. Можно подстроить цвет бордюра экрана через регистр 0x3C. В некоторых демонстрационных примерах можно настроить регистры Border Waveform Control или VCOM AND DATA INERTVAL SETTING.

6. e-Paper нельзя обновлять под прямым солнечным светом (на экране отсутствует фильтр, поглощающий ультрафиолет). Шаги по обновлению должны быть выполнены в помещении.

7. Диапазон рабочих температур 0 .. 50°C.

Размеры:

Имя сигнала Напр. Описание
VCC   Напряжение питания 3.3V/5V
GND   Земля, минус питания и общий провод всех сигналов
DIN I SPI MOSI, вход последовательных данных
CLK I SPI SCK, вход тактов
CS I Вход выборки SPI, активный уровень лог. 0
DC I Вход для выбора Data/Command (лог. 1 для данных, лог. 0 для команды)
RST I Внешний сброс, активный уровень лог. 0
BUSY O Выход состояния занятости контроллера, активный уровень лог. 1

Примечание: в столбце "Напр." указано направление работы сигнала у индикатора. I обозначает вход (Input), O выход (Output).

Интерфейс и протокол отличается от традиционного SPI только тем, что отсутствует обратный сигнал данных от контроллера (подчиненное устройство SPI, slave) к управляющему процессору (главное устройство SPI, master), поскольку от экрана требуется только отображение картинки (направление данных master -> slave).

Сигналы интерфейса в режиме 4-Wire SPI:

E Ink SPI signals

Последовательный интерфейс с индикатором e-Paper может работать в 2 режимах: 3-wire SPI и 4-wire SPI. Отличие между этими режимами в том, что в режиме 3-wire SPI сигнал DC (данные/команда) отсутствует, и данные передаются не 8-ю, а 9 битами. Старший бит D8 несет информацию о том, команда передается или данные. Подробнее см. даташит на индикатор (например, 2.9inch_e-Paper_Datasheet.pdf, он доступен на сайте waveshare.com, или см. архив [6]).

Обмен данных через SPI требует соблюдения определенных интервалов времени, с соответствующей комбинацией перехода уровней данных и тактов (фаза CPHA и полярность CPOL тактового сигнала).

CPOL определяет логический уровень сигнала тактов в неактивном состоянии. Когда CPOL = 0, неактивное состояние принимается за лог. 0.

CPHA определяет, когда slave-устройство считывает данные - на первом перепаде тактового сигнала, или на втором перепаде. Когда CPHA = 0, данные считываются на первом перепаде тактов.

Существуют 4 режима обмена данными по шине SPI. Обычно используется режим SPI0, когда CPHA = 0, CPOL = 0. Как можно увидеть на картинке выше, передача данных начинается на первом спаде уровня SCLK, и 8 бит данных передаются по каждому тактовому положительному перепаду (от 0 к 1) SCLK. С экраном также используется режим SPI0, и данные передаются бит за битом, старший бит (MSB) идет первым.

Имеются и другие экраны с разными размерами, разрешающей способностью, цветами и интерфейсами подключения (см. селектор на страничке [1]).

[Принцип работы]

Отображение картинки основано на технологии E-paper (Microencapsulated Electrophoretic Display, MED). Среди маленьких шариков в прозрачном масле подвешиваются заряженные цветные пигменты, и они перемещаются в зависимости от приложенного электрического заряда. Цветовые компоненты экрана E-paper хорошо отражают окружающий свет, и поэтому не требуется задняя подсветка.

Примечание: далее в описании и именах файлов часто используется сокращение EPD, что означает E-Paper Display.

[Примеры]

Компания waveshare.com предоставляет примеры работы с индикатором для различных популярных платформ: Arduino UNO, Jetson Nano, Raspberry Pi и STM32.

Пример работает с экраном Waveshare UNO PLUS (плата совместима с официальной Arduino UNO R3).

Подключение к Arduino UNO:

Индикатор e-Paper/e-Ink Arduino
VCC 5V
GND GND
DIN D11
CLK D13
CS D10
DC D9
RST D8
BUSY D7

Загрузите архив [2], распакуйте. Пример для Arduino находится в каталоге Arduino. Откройте тот проект, который соответствует типу экрана. Например, если это 1.54inch e-Paper Module, откройте и запустите проект epd1in54.ino из папки epd1in54. Выберите корректную плату (Board) и COM-порт подключения, затем скомпилируйте проект и загрузите его в плату Arduino UNO.

Из-за того, что у микроконтроллера Arduino малый объем RAM, функция рисования не поддерживается, можно только вывести картинку, данные которой находятся в памяти программ FLASH. Как альтернативу вместе с Arduino Вы можете использовать дополнительную RAM и слот Micro SD на специальной плате E-Paper Shield [3].

Если у Вас HAT-версия экрана, наподобие 2.13inch e-Paper HAT, то можно напрямую соединить его с 40PIN GPIO коннектором Raspberry Pi. Или можно подключить экран к Pi через кабель 8PIN.

Подключение к Raspberry Pi:

Индикатор e-Paper/e-Ink
Rasberry Pi
BCM2835 Плата
VCC 3.3V 3.3V
GND GND GND
DIN MOSI 19
CLK SCLK 23
CS CE0 24
DC 25 22
RST 17 11
BUSY 24 18

Процесс по шагам:

1. Откройте терминал, введите команду конфигурации:

sudo raspi-config

Выберите Interfacing Options -> SPI -> Yes, чтобы разрешить интерфейс SPI.

E Ink RasberryPI open SPI config

Перезагрузите Raspberry Pi:

sudo reboot

2. Установка библиотек BCM2835.

wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.60.tar.gz
tar zxvf bcm2835-1.60.tar.gz
cd bcm2835-1.60/
sudo ./configure
sudo makesudo make check
sudo make install

Для дополнительной информации см. [4].

3. Установка библиотек wiringPi.

sudo apt-get install wiringpi

Для Raspberry Pi 4 нужно выполнить обновление:

cd /tmp
wget https://project-downloads.drogon.net/wiringpi-latest.deb
sudo dpkg -i wiringpi-latest.deb
gpio -v

Если установка прошла успешно, то будет выведена информация по версии 2.52 gpio.

4. Установка библиотек Python.

# для python2:
sudo apt-get update
sudo apt-get install python-pip
sudo apt-get install python-pil
sudo apt-get install python-numpy
sudo pip install RPi.GPIO
sudo pip install spidev
 
# для python3:
sudo apt-get update
sudo apt-get install python3-pip
sudo apt-get install python3-pil
sudo apt-get install python3-numpy
sudo pip3 install RPi.GPIO
sudo pip3 install spidev

5. Загрузка примеров. Откройте терминал и выполните команду, чтобы загрузить демонстрационный код:

sudo git clone https://github.com/waveshare/e-Paper
cd e-Paper/RaspberryPi\&JetsonNano/

6. Запуск примеров.

Код C. Найдите файл main.c, раскомментируйте определение типов e-Paper, затем скомпилируйте и запустите код.

cd c
make clean
make
sudo ./epd

Код Python. Можно напрямую запустить код, xxx в примере запуска ниже заменяется названием дисплея e-Paper. Например, если надо запустить код для 1.54inch e-Paper Module, то xxx надо заменить на epd_1in54.

cd python/examples
 
# Для python2:
sudo python xxx.py
 
# Для python3:
sudo python3 xxx.py

Пример для Jetson Nano использует программную реализацию SPI, поэтому его скорость вывода картинки работает немного медленнее.

Подключение к Jetson Nano:

Индикатор e-Paper/e-Ink
Jetson Nano Developer Kit
BCM2835 Плата
VCC 3.3V 3.3V
GND GND GND
DIN 10 (SPI0_MOSI) 19
CLK 11 (SPI0_SCK) 23
CS 8 (SPI0_CS0) 24
DC 25 22
RST 17 11
BUSY 24 18

Процесс по шагам:

1. Установка библиотек GPIO. Введите в терминале следующие команды:

sudo apt-get update
sudo apt-get install python3-pip
sudo pip3 install Jetson.GPIO
sudo groupadd -f -r gpio
sudo usermod -a -G gpio your_user_name
sudo cp /opt/nvidia/jetson-gpio/etc/99-gpio.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && sudo udevadm trigger

Здесь your_user_name это имя пользователя в системе Jetson, например waveshare.

2. Установка библиотек I2C.

sudo apt-get install python-smbus

3. Установка библиотек PIL.

sudo apt-get install python3-pil
sudo apt-get install python3-numpy

4. Загрузка примеров.

sudo git clone https://github.com/waveshare/e-Paper
cd e-Paper/RaspberryPi\&JetsonNano/

5. Запуск примеров.

Код C. Найдите файл main.c, раскомментируйте используемый экран e-Paper, затем скомпилируйте и запустите код.

cd c
make clean
make
sudo ./epd

Код Python. Можно напрямую запустить код, xxx в примере запуска ниже заменяется названием дисплея e-Paper. Например, если надо запустить код для 1.54inch e-Paper Module, то xxx надо заменить на epd_1in54.

cd python/examples
 
# Для python2:
sudo python xxx.py
 
# Для python3:sudo python3 xxx.py

Примеры тестировались и проверялись на отладочной плате Wavshare Open103Z (процессор STM32F13ZET6). Для другой платы и процессора от Вас потребуются некоторые усилия для портирования кода.

Подключение к STM32F103ZET6:

Индикатор e-Paper/e-Ink STM32F103ZET6
VCC 3.3V
GND GND
DIN PA7
CLK PA5
CS PA3
DC PA2
RST PA1
BUSY PA3

Перейдите в каталог примеров STM32, откройте проект в среде разработки Keil5. Выберите плату и программатор, скомпилируйте и загрузите код.

[Описание кода]

Разработчики waveshare.com поддерживают 4 популярные аппаратные платформы: Arduino UNO, Jetson UNO, Raspberry Pi, and STM32. Здесь приведено общее описание для всех экранов e-Paper, однако описание некоторых функций может не подойти к Вашему экрану e-Paper.

Каждый проект делится на функции аппаратного интерфейса, драйвера EPD и код приложения. Используются языки программирования C, C++ и python:

• Arduino UNO:C++
• Jetson Nano: C и python
• Raspberry Pi: C и python
• STM32: C

Примечание: коды драйвера EPD для Jetson Nano, Raspberry Pi и STM32 совместимые. Таким образом, эта часть кода одинаковая для этих платформ, а коды интерфейса отличаются.

[Интерфейс аппаратуры]

Код интерфейса находится в файлах DEV_Config.c и DEV_Config.h.

Raspberry Pi и Jetson Nano. Код интерфейса находится в каталоге RaspberryPi&JetsonNano\c\lib\Config. Здесь используются 2 библиотеки: bcm2835 и wiringPi. По умолчанию используется WiringPi. Если необходимо использовать bcm2835, то надо просто модифицировать строку "USELIB_RPI =" файла RaspberryPi&JetsonNano\c\Makefile следующим образом:

...
USELIB_RPI = USE_BCM2835_LIB
# USELIB_RPI = USE_WIRINGPI_LIB
# USELIB_RPI = USE_DEV_LIB
...

STM32. Файлы драйвера интерфейса находятся в каталоге STM32\STM32-F103ZET6\User\Config.

Используемые типы данных:

#define UBYTE   uint8_t
#define UWORD   uint16_t
#define UDOUBLE uint32_t

Функции инициализации и деинициализации модуля экрана:

void DEV_Module_Init(void);
void DEV_Module_Exit(void);

Эти функции используются перед работой с экраном e-Paper (DEV_Module_Init) и после работы с ним (DEV_Module_Exit). Если на Вашей плате дисплея напечатана версия Rev2.1, модуль войдет в режим сверхнизкого потребления мощности (low-ultra mode) после вызова DEV_Module_Exit(). Тесты показали, что ток потребления в этом режиме практически нулевой.

Функции чтения/записи через GPIO (программная реализация SPI):

void DEV_Digital_Write(UWORD Pin, UBYTE Value);
UBYTE DEV_Digital_Read(UWORD Pin);

Функция записи через аппаратный SPI:

void DEV_SPI_WriteByte(UBYTE Value);

[Драйвер EPD]

Для Raspberry Pi и Jetson Nano драйвер epd сохранен в каталоге RaspberryPi&JetsonNano\c\lib\e-Paper. Для STM32 драйвер epd находится в каталоге STM32\STM32-F103ZET6\User\e-Paper.

EPD_1in02d.c
EPD_1in02d.h
EPD_1in54.c
EPD_1in54.h
EPD_1in54b.c
EPD_1in54b.h
EPD_1in54c.c
EPD_1in54c.h
EPD_1in54_V2.c
EPD_1in54_V2.h
EPD_2in13.c
EPD_2in13.h
EPD_2in13bc.c
EPD_2in13bc.h
EPD_2in13d.c
EPD_2in13d.h
EPD_2in13_V2.c
EPD_2in13_V2.h
EPD_2in7.c
EPD_2in7.h
EPD_2in7b.c
EPD_2in7b.h
EPD_2in9.c
EPD_2in9.h
EPD_2in9bc.c
EPD_2in9bc.h
EPD_2in9d.c
EPD_2in9d.h
EPD_4in2.c
EPD_4in2.h
EPD_4in2bc.c
EPD_4in2bc.h
EPD_5in83.c
EPD_5in83.h
EPD_5in83bc.c
EPD_5in83bc.h
EPD_7in5.c
EPD_7in5.h
EPD_7in5bc.c
EPD_7in5bc.h
EPD_7in5b_V2.c
EPD_7in5b_V2.h
EPD_7in5_V2.c
EPD_7in5_V2.h

Декларация функций находится в соответствующем (типу индикатора) файле заголовка (с расширением *.h). Буквы XXX в имени функции должны быть заменены на обозначение типа индикатора. Например, если это индикатор 4.2inch e-Paper, то XXX нужно заменить на 4IN2.

Инициализация. Эта функция должна использоваться для инициализации или вывода из режима сна экрана E-Paper.

// Инициализация индикаторов 1.54inch e-Paper, 1.54inch e-Paper V2,
// 2.13inch e-Paper, 2.13inch e-Paper  V2, 2.13inch e-Paper (D),
// 2.9inch e-Paper,2.9inch e-Paper (D).
// Параметр Mode выбирает тип обновления:
//    = 0 для инициализации полного обновления (full refresh)
//    = 1 для инициализации частичного обновления (partial refresh)
void EPD_xxx_Init(UBYTE Mode);
 
// Инициализация других типов экранов:
void EPD_xxx_Init(void);

Очистка. Эта функция используется для заполнения экрана белым цветом:

void EPD_xxx_Clear(void);

Передача образа экрана и отображение.

// Черно/белый экран e-Paper:
void EPD_xxx_Display(UBYTE *Image);
// Трехцветный экран e-Paper:
void EPD_xxx_Display(const UBYTE *blackimage, const UBYTE *ryimage);

Имеются следующие исключения:

// Частичное обновление 2.13inch e-paper (D), 2.9inch e-paper (D):
void EPD_2IN13D_DisplayPart(UBYTE *Image);
void EPD_2IN9D_DisplayPart(UBYTE *Image);
 
// Из-за того, что контроллеры 1.54inch e-Paper V2
// и 2.13inch e-Paper V2 были обновлены, нужно использовать
// EPD_xxx_DisplayPartBaseImage для отображения статической
// картинки, и затем использовать EPD_xxx_displayPart()
// для динамического отображения при частичном обновлении.
void EPD_1IN54_V2_DisplayPartBaseImage(UBYTE *Image);
void EPD_1IN54_V2_DisplayPart(UBYTE *Image);
void EPD_2IN13_V2_DisplayPart(UBYTE *Image);
void EPD_2IN13_V2_DisplayPartBaseImage(UBYTE *Image);
 
// Из-за того, что у микроконтроллера STM32103ZET5 недостаточно
// RAM для образа экрана, так что 7.5B, 7.5C, 5.83B, 5.83C могут
// отобразить только половину экрана.
void EPD_7IN5BC_DisplayHalfScreen (const UBYTE *blackimage, const UBYTE *ryimage);
void EPD_5IN83BC_DisplayHalfScreen (const UBYTE *blackimage, const UBYTE *ryimage);

Вход режим сна.

void EPD_xxx_Sleep(void);

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

[Функции приложения]

Рисование. Предоставляются базовые функции рисования, их можно найти в каталоге RaspberryPi&JetsonNano\c\lib\GUI (для Raspbian Pi & Jetson Nano) и в каталоге STM32\STM32-F103ZET6\User\GUI (для STM32):

GUI_BMPfile.c
GUI_BMPfile.h
GUI_Paint.c
GUI_Paint.h

Шрифты. Шрифты находятся в каталогах RaspberryPi&JetsonNano\c\lib\Fonts (для Raspbian Pi & Jetson Nano) и STM32\STM32-F103ZET6\User\Fonts (для STM32).

font12.c
font12CN.c
font16.c
font20.c
font24.c
font24CN.c
font8.c
fonts.h

[Как использовать]

1. Создание буфера картинки. Создайте новый буфер образа экрана (image buffer) с помощью функции Paint_NewImage. В параметрах функции указывается ширина, высота, поворот изображения и его цвет.

void Paint_NewImage(UBYTE *image, UWORD Width, UWORD Height, UWORD Rotate, UWORD Color);

image: указатель на место в памяти, где находится буфер.
Width: ширина экрана картинки.
Height: высота картинки.
Rotate: на сколько градусов повернуть изображение.
Color: первичный цвет картинки.

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

void Paint_SelectImage(UBYTE *image);

3. Поворот. Установите ориентацию дисплея функцией Paint_SetRotate.

void Paint_SetRotate(UWORD Rotate);

В параметре Rotate можно указать 4 варианта поворота картинки ROTATE_0, ROTATE_90, ROTATE_180, ROTATE_270, что соответствует 0, 90, 180 и 270 градусам. Обычно эта функция используется для изменения угла вывода изображения, после вызова Paint_SelectImage().

На картинке ниже демонстрируется начало координат X, Y и направление их увеличения для разных вариантов параметра Rotate.

E Ink Paint SetRotate variants

4. Зеркалирование. Зеркалирование вывода производится с помощью функции Paint_SetMirroring. В параметре mirror указывается 4 варианта зеркалирования MIRROR_NONE, MIRROR_HORIZONTAL, MIRROR_VERTICAL, MIRROR_ORIGIN.

void Paint_SetMirroring(UBYTE mirror);

5. Рисование точки. Точка в буфере рисуется с помощью функции Paint_DrawPoint.

void Paint_DrawPoint(UWORD Xpoint,
                     UWORD Ypoint,
                     UWORD Color,
                     DOT_PIXEL Dot_Pixel,
                     DOT_STYLE Dot_Style);

Параметрами Xpoint, Ypoint указывается координата точки, параметр Color задает цвет. Параметр Dot_Pixel задает размер точки, доступно 8 вариантов:

typedef enum
{
   DOT_PIXEL_1X1 = 1,   // 1 x 1
   DOT_PIXEL_2X2,       // 2 X 2
   DOT_PIXEL_3X3,       // 3 X 3
   DOT_PIXEL_4X4,       // 4 X 4
   DOT_PIXEL_5X5,       // 5 X 5
   DOT_PIXEL_6X6,       // 6 X 6
   DOT_PIXEL_7X7,       // 7 X 7
   DOT_PIXEL_8X8,       // 8 X 8
}DOT_PIXEL;

Параметр Dot_Style задает стиль точки:

typedef enum
{
   DOT_FILL_AROUND = 1,
   DOT_FILL_RIGHTUP,
}DOT_STYLE;

6. Рисование линии. Для этой цели используется функция Paint_DrawLine.

void Paint_DrawLine(UWORD Xstart,
                    UWORD Ystart,
                    UWORD Xend,
                    UWORD Yend,
                    UWORD Color,
                    DOT_PIXEL Line_width,
                    LINE_STYLE Line_Style);

Параметры Xstart, Ystart, Xend, Yend задают координаты начала и конца линии. Параметр Line_width задает ширину линии (один из 8 вариантов, см. описание функции Paint_DrawPoint). Параметр Line_Style задает тип линии:

typedef enum
{
   LINE_STYLE_SOLID = 0,
   LINE_STYLE_DOTTED,
}LINE_STYLE;

7. Прямоугольник.

void Paint_DrawRectangle(UWORD Xstart,
                         UWORD Ystart,
                         UWORD Xend,
                         UWORD Yend,
                         UWORD Color,
                         DOT_PIXEL Line_width,
                         DRAW_FILL Draw_Fill);

Параметры Xstart, Ystart, Xend, Yend задают координаты начала и конца линии, параметр Color задает цвет. Параметр Line_width задает ширину линии (один из 8 вариантов, см. описание функции Paint_DrawPoint). Параметр Draw_Fill задает заливку прямоугольника:

typedef enum
{
   DRAW_FILL_EMPTY = 0,
   DRAW_FILL_FULL,
}DRAW_FILL;

8. Окружность, круг.

void Paint_DrawCircle(UWORD X_Center,
                      UWORD Y_Center,
                      UWORD Radius,
                      UWORD Color,
                      DOT_PIXEL Line_width,
                      DRAW_FILL Draw_Fill);

Параметры X_Center, Y_Center задают координаты центра, параметр Radius задает радиус, параметр Color задает цвет. Параметр Line_width задает ширину линии (один из 8 вариантов, см. описание функции Paint_DrawPoint). Параметр Draw_Fill задает заливку прямоугольника, так же как в функции Paint_DrawRectangle.

9. Символ текста. Вывод одиночного символа текста в 8-битной кодировке ASCII выполняется функцией Paint_DrawChar.

void Paint_DrawChar(UWORD Xstart,
                    UWORD Ystart,
                    const char Ascii_Char,
                    sFONT* Font,
                    UWORD Color_Foreground,
                    UWORD Color_Background);

Параметры Xstart, Ystart задают положение верхнего левого угла выводимого символа. Параметр Ascii_Char задает код символа, параметр Font указывает на начало шрифта в памяти. Параметры Color_Foreground и Color_Background задают соответственно цвет чернил и цвет фона символа.

Всего в библиотеке есть 5 готовых шрифтов:

Имя Размер символа (x*y)
font8 5*8
font12 7*12
font16 11*16
font20 14*20
font24 17*24

10. Строка ASCII. Строка текста рисуется относительно левой верхней позиции (параметры Xstart, Ystart).

void Paint_DrawString_EN(UWORD Xstart,
                         UWORD Ystart,
                         const char* pString,
                         sFONT* Font,
                         UWORD Color_Foreground,
                         UWORD Color_Background);

Параметр pString указывает на строку текста. Остальные параметры такие же, как у функции Paint_DrawChar.

Строка китайского текста может быть выведена помощью функции Paint_DrawString_CN. Осуществляется вывод китайских символов, основанных на шрифтах ON GB2312 (есть 2 китайских шрифта: font12CN 11*21 ascii, 16*21 Chinese, font24CN:24*41 ascii, 32*41 Chinese).

11. Число.

void Paint_DrawNum(UWORD Xpoint,
                   UWORD Ypoint,
                   int32_t Number,
                   sFONT* Font,
                   UWORD Color_Foreground,
                   UWORD Color_Background);

В параметре Number указывается выводимое число. Остальные параметры те же самые, что и функции Paint_DrawString_EN.

12. Время.

void Paint_DrawTime(UWORD Xstart,
                    UWORD Ystart,
                    PAINT_TIME* pTime,
                    sFONT* Font,
                    UWORD Color_Background,
                    UWORD Color_Foreground);

В параметре pTime задается указатель на выводимое время. Остальные параметры те же самые, что и функции Paint_DrawString_EN.

13. Растровая картинка. В параметре image_buffer указывается начальный адрес буфера в памяти, где расположены данные выводимая картинка.

void Paint_DrawBitMap(const unsigned char* image_buffer);

14. Вывод файла BMP. Linux-платформы наподобие Jetson Nano и Raspberry Pi поддерживают непосредственную обработку и вывод картинок в файлах формата BMP.

UBYTE GUI_ReadBmp(const char *path, UWORD Xstart, UWORD Ystart);

В параметре path указывается полное имя файла картинки, параметры Xstart, Ystart задают положение верхнего левого угла отображаемой картинки.

[Тестирование функций]

Примеры кода, реализующего вывод на экран, можно найти в каталоге RaspberryPi&JetsonNano\c\examples. Следует модифицировать определения в модуле main.c, чтобы можно было работать с различными типами индикаторов e-Paper.

int main(void)
{
   // Обработка исключения: Ctrl + C
   signal(SIGINT, Handler);
   
   // EPD_1in02d_test();
   
   // EPD_1in54_test();
   // EPD_1in54_V2_test();
   // EPD_1in54b_test();
   // EPD_1in54c_test();
 
   // EPD_2in7_test();
   // EPD_2in7b_test();
 
   // EPD_2in9_test();
   // EPD_2in9bc_test();
   // EPD_2in9d_test();
 
   // EPD_2in13_test();
   // EPD_2in13_V2_test();
   // EPD_2in13bc_test();
   // EPD_2in13d_test();
 
   EPD_4in2_test();
   // EPD_4in2bc_test();
 
   // EPD_5in83_test();
   // EPD_5in83bc_test();
 
   // EPD_7in5_test();
   // EPD_7in5_V2_test();
   // EPD_7in5bc_test();
   // EPD_7in5bc_V2_test();
 
   return 0;
}

Например, если Вы хотите проверить вывод на индикатор 7.5inch E-paper, нужно раскомментировать строку:

EPD_7in5_test();

Затем скомпилируйте и запустите код:

make clean
make
sudo ./epd

Аналогичный пример кода для STM32 находится в каталоге STM32\STM32-F103ZET6\User\Examples. Откройте в Keil проект STM32\STM32-F103ZET6\MDK-ARM\epd-demo.uvprojx, измените определения в файле main.c для выбора нужно типа индикатора. Далее расскомментируйте нужную строку теста, скомпилируйте и запустите код.

Коды примеров работают на основе python2.7 и python3. Если интерпретатор Python правильно установлен, и разрешены все зависимости для используемых библиотек, то запускать проекты Python намного проще, чем код на C/C++.

Код функций находится в каталоге RaspberryPi&JetsonNano\python\lib\waveshare_epd:

epd1in02.py
epd1in54.py
epd1in54b.py
epd1in54c.py
epd1in54_V2.py
epd2in13.py
epd2in13bc.py
epd2in13d.py
epd2in13_V2.py
epd2in7.py
epd2in7b.py
epd2in9.py
epd2in9bc.py
epd2in9d.py
epd4in2.py
epd4in2bc.py
epd5in83.py
epd5in83bc.py
epd7in5.py
epd7in5bc.py
epd7in5bc_V2.py
epd7in5_V2.py
epdconfig.py
sysfs_gpio.so
sysfs_software_spi.so
__init__.py

[Функции epdconfig.py]

Инициализация. В epdconfig.py находятся функции инициализации и завершения:

def module_init();
def module_exit();

Эти функции используются перед работой с экраном e-Paper (module_init) и после работы с ним (module_exit). Если на Вашей плате дисплея напечатана версия Rev2.1, модуль войдет в режим сверхнизкого потребления мощности (low-ultra mode) после вызова DEV_Module_Exit(). Тесты показали, что ток потребления в этом режиме практически нулевой.

GPIO Read/Write. Программная реализация SPI находится в функциях:

def digital_write(pin, value);
def digital_read(pin);

SPI. Аппаратный SPI:

def spi_writebyte(data);

[Описание кода функций epdxxx.py]

В имени файла кода символами xxx обозначен тип используемого индикатора e-Paper.

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

# Для 1.54inch e-Paper, 1.54inch e-Paper V2, 2.13inch e-Paper,
# 2.13inch e-Paper V2, 2.13inch e-Paper (D), 2.9inch e-Paper,
# 2.9inch e-Paper (D):
def init(self, update);
 
# Другие типы:
def init(self);

Обновление может использовать низкоуровневые функции lut_full_update или lut_partial_update.

Очистка. Для очистки экрана (заполнения его цветом фона) используют функции:

def Clear(self);
 
# Некоторые типы индикаторов e-Paper для очистки экрана
# должны использовать следующую функцию:
def Clear(self, color);

Работа с буфером. Преобразование картинки в массив данных экрана:

def getbuffer(self, image);

Кадр. Передача одного кадра картинки и его отображение:

# Для монохромного e-paper:
def display(self, image);
# Для трехцветного e-Paper:
def display(self, blackimage, redimage);

Есть несколько исключений:

# Для гибкого 2.13inch e-paper (D), 2.9inch e-paper (D)
# частичное обновление должно использовать:
def DisplayPartial(self, image);
 
# Из-за того, что контроллеры 1.54inch e-paper V2, 2.13inch e-paper V2
# были обновлены, то при частичном обновлении они должны сначала
# использовать displayPartBaseImage(), чтобы отобразить статичный фон,
# затем для динамического обновления использовать displayPart():
def displayPartBaseImage(self, image);
def displayPart(self, image);

Сон. Вход в режим пониженного потребления осуществляется функцией:

def sleep(self);

[Тесты epd_xxx_test.py]

Код тестов находится в каталоге RaspberryPi&JetsonNano\python\examples.

epd_1in02_test.py
epd_1in54b_test.py
epd_1in54c_test.py
epd_1in54_test.py
epd_1in54_V2_test.py
epd_2in13bc_test.py
epd_2in13d_test.py
epd_2in13_test.py
epd_2in13_V2_test.py
epd_2in7b_test.py
epd_2in7_test.py
epd_2in9bc_test.py
epd_2in9d_test.py
epd_2in9_test.py
epd_4in2bc_test.py
epd_4in2_test.py
epd_5in83bc_test.py
epd_5in83_test.py
epd_7in5bc_test.py
epd_7in5b_V2_test.py
epd_7in5_test.py
epd_7in5_V2_test.py

Если на системе установлен python2, то запуск теста осуществляется командой наподобие:

sudo python epd_7in5_test.py

Если установлен python3, то команда должна выглядеть так:

sudo python3 epd_7in5_test.py

Примечание: для запуска теста на другом индикаторе замените имя файла epd_7inch5_test.py на другое.

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

blackimage = blackimage.transpose(Image.ROTATE_270);
redimage = redimage.transpose(Image.ROTATE_270);

Поддерживаются константы поворота ROTATE_90, ROTATE_180, ROTATE_270, соответствующие 90, 180 и 270 градусам.

Ниже на картинке показано начало координат X, Y и направление их роста в зависимости от выбранной ориентации вывода.

E Ink transpose Rotate variants

Поскольку у микроконтроллера Arduino слишком мало памяти RAM для отображения динамического изображения, то без добавления внешней памяти поддерживается только вывод статичной растровой картинки. В этом случае рекомендуется использовать специальную плату расширения памяти E-Paper Shield [3].

[Ссылки]

1. 296x128, 2.9inch E-Ink display module site:waveshare.com.
2. waveshare / e-Paper site:github.com.
3. E-Paper Shield site:waveshare.com.
4. C library for Broadcom BCM 2835 as used in Raspberry Pi site:airspayce.com.
5. Open103Z Standard, STM32F1 Development Board site:waveshare.com.
6200325E-Ink-waveshare.com-doc-and-examples.zip - документация, примеры кода.

 

Добавить комментарий


Защитный код
Обновить

Top of Page