E-Ink экран 2.9", 296x128 точек, с интерфейсом SPI |
![]() |
Добавил(а) microsin | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Такие экраны можно купить на AliExpress и Ebay, хотя цены на сегодняшний день пока кусаются (200313, около $10). Удобнее всего работать с индикатором, который снабжен платой-переходником с гибкого шлейфа на стандартный коннектор с шагом штырьков 2.54 мм, иначе придется делать для него переходную плату. Модуль дисплея E-Ink 2.9" (296x128 точек) снабжен встроенным контроллером, обменивающимся данными с внешним миром через интерфейс SPI, с поддержкой частичного обновления. Достоинства экрана очевидны для определенных областей использования - сверхнизкое энергопотребление, широкие углы обзора, сохранение картинки даже при полном отключении питания. Однако у этих индикаторов имеется существенное ограничение - медленное обновление изображения, особенно когда оно обновляется целиком (полное обновление картинки может занимать от 2 секунд и более). • Нет подсветки, изображение сохраняется на экране длительное время, даже когда питание не поступает. [Параметры] • Напряжение питания: 3.3V/5V Waveshare e-Paper в основном поставляются в двух вариантах: с "сырым" коннектором на гибком кабеле (так называемая RAW panel), и с более удобным для подключения модулем адапера (Module/HAT version).
На адаптере Module/HAT собрана схема драйвера, и этот вариант экрана сразу готов к подключению к микроконтроллеру. Кроме монохромных вариантов экрана есть еще трехцветные (e-Paper (B) и e-Paper (C)), у которых очень большое время обновления (15 секунд!), и которые не поддерживают частичное обновлеие экрана (partial refresh). Трехцветные экранчики имеют довольно бледные цвета. Очевидно, что эти экраны пригодны в основном только для приложений типа статичных меток товара, которые редко обновляются. Разновидности экранов e-Paper 2.9inch приведены в таблице ниже, показаны только их отличия.
Остальные параметры всех этих вариантов индикаторов совпадают:
Важные замечания по применению: 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. Размеры:
Примечание: в столбце "Напр." указано направление работы сигнала у индикатора. I обозначает вход (Input), O выход (Output). Интерфейс и протокол отличается от традиционного SPI только тем, что отсутствует обратный сигнал данных от контроллера (подчиненное устройство SPI, slave) к управляющему процессору (главное устройство SPI, master), поскольку от экрана требуется только отображение картинки (направление данных master -> slave). Сигналы интерфейса в режиме 4-Wire SPI: Последовательный интерфейс с индикатором 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:
Загрузите архив [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:
Процесс по шагам: 1. Откройте терминал, введите команду конфигурации: sudo raspi-config
Выберите Interfacing Options -> SPI -> Yes, чтобы разрешить интерфейс SPI. Перезагрузите 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:
Процесс по шагам: 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:
Перейдите в каталог примеров STM32, откройте проект в среде разработки Keil5. Выберите плату и программатор, скомпилируйте и загрузите код. [Описание кода] Разработчики waveshare.com поддерживают 4 популярные аппаратные платформы: Arduino UNO, Jetson UNO, Raspberry Pi, and STM32. Здесь приведено общее описание для всех экранов e-Paper, однако описание некоторых функций может не подойти к Вашему экрану e-Paper. Каждый проект делится на функции аппаратного интерфейса, драйвера EPD и код приложения. Используются языки программирования C, C++ и python: • Arduino UNO: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: указатель на место в памяти, где находится буфер. 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. 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 готовых шрифтов:
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 и направление их роста в зависимости от выбранной ориентации вывода. Поскольку у микроконтроллера Arduino слишком мало памяти RAM для отображения динамического изображения, то без добавления внешней памяти поддерживается только вывод статичной растровой картинки. В этом случае рекомендуется использовать специальную плату расширения памяти E-Paper Shield [3]. [Ссылки] 1. 296x128, 2.9inch E-Ink display module site:waveshare.com. |