Электронная бумага: пишем драйвер методом научного тыка
В предыдущей статье я рассказывал, как я затарился электроннобумажными дисплеями и даже сделал для них блок питания.
Наконец, пришли заказанные для них печатные платы и теперь можно заняться программным обеспечением. То, что описано ниже, касается только ED060SC4(LF) или LB060S01-RD02. Отличие в названии на одну букву, даже ту, что в скобке — и работать ничего не будет. Когда я задумал это безнадежное занятие, мне казалось, что я нашел кучу информации и исходников, и запустить этот дисплей проблемой не будет, несмотря на очень убогие спецификации от производителей. Не тут-то было, в каких-то местах описание оказалось на дисплей, название которого отличалась на одну букву, а в других — алгоритм просто не работал. В наше время верить нельзя никому, даже самому себе. Мне — можно.
В целях природы обуздания,
В целях рассеять неученья
Тьму
Берём картину мироздания – да!
И тупо смотрим, что к чему…
Целых два дня я тупо перебирал очередность разных сигналов и задержки между ними, не зная, жив ли еще дисплей. Не было даже намеков на появившуюся точку. И в один прекрасный момент — вуаля! — получите целую линию мусора. Всё, больше ничего и не надо, все остальное, дело техники, теперь он никуда не денется.
Теперь расскажу, как все-таки удалось запустить это чудо. На истину в последней инстанции я не претендую, как заработало — так и опишу.
Для прорисовки экрана нужны следующие сигналы — сначала начало кадра, потом 600 строк, каждая имеет старт, потом данные и стоп. Завершается все концом кадра. За один пиксель отвечает два бита, комбинация 01 — черный цвет, 10 — белый, остальные — без изменения.
Таким образом, для одной строки из 800 пикселей нужно передать 200 байт.
Схема простая — источник питания, описанный в прошлой статье, STM32F103C8 для управления дисплеем и ESP32 на все про все, но пока его не используем.
Ардуним для начала — определяем макросы, которые будут управлять сигналами.
Извиняйте, если уж сильно тривиально все выглядит. Если бы мне все это кто-то рассказал до того, как я эту возню затеял…
Может, кому другому поможет.
А это то, что этот тест делает — рисует шахматную доску. Смотрим скорость обновления — получается более, чем достойно, судите сами:
За один цикл прорисовки черные точки получить не удастся, получаются серые. У меня для получения черного цвета нужно повторить передачу кадра раз 6 — для пущей надежности я передаю его 8 раз.
В реальном устройстве присутствует lookup table, где хранятся данные о длительностях сигналов в зависимости от температуры и интенсивности черного. Почему-то производители сделали большой секрет из этих данных, поэтому имеем то, что имеем. У реального контроллера дисплея куча памяти, где он хранит изображение и следующее формируется в зависимости от предыдущего — не нужно полностью стирать изображение и потом рисовать все по новой — обновление происходит с учетом текущего состояния, поэтому его можно выполнить быстрее. Но оперативной памяти нужно много — ведь у экрана 480 000 пикселей.
По схеме видно, что микроконтроллер у меня дохленький, у него всего 20К ОЗУ и 64К флеш.
Но я использую буфер длиной всего 200 байт, и каждую строку просчитываю перед выводом.
Что-то подобное я использовал много лет назад, когда делал полетный контроллер для игрушечного самолетика и выводил изображение поверх картинки с видеокамеры — там, если склероз не подводит, вообще у контроллера было 4К ОЗУ. И сделано было еще интереснее — пока контроллер прямого доступа выбрасывал одну строку, процессор просчитывал следующую. В итоге использовалось 4 буфера — два для белого и 2 для черного.
Это было небольшое отступление. В реальных дисплеях производители обычно используют 16 градаций серого, но у любителей получается и 32 использовать.
Но мне это не надо, двух уровней черного для моих целей достаточно и я легко это сделаю использованием количества перезаписываний кадра.
Алгоритм с многократной перезаписью кадра выглядит убого, если у кто знает, как сделать лучше — пожалуйста, напишите в комментариях. Моя благодарность не будет иметь границ (в разумных пределах).
Следующим шагом будет добыча погоды из интернета и формирование полного кадра, но для этого будет использоваться ESP32, а STM32 будет играть роль тупого драйвера. Печатную плату тоже планирую переделать — контрольные точки уже не нужны, зато надо добавить управление питанием, планируется использовать литиевый аккумулятор. Нужно добавить зарядку и позаботиться о уменьшении потребления энергии устройством.
А пока можно немного размяться и с STM32:
С ESP32 тоже не все так просто — при попытке выделить массив под кадр больше 96К, линкер отказывается работать, заявляя что все, памяти у него для вас больше нет. А где же ваши хваленые 320K Data RAM? При попытке выбросить SPI пакет, непрерывного потока не получается — после каждых 64 байта, кажется, идет разрыв несколько микросекунд. Но кому сейчас легко — будем бороться.
Небольшое скакание по исходникам показало, что посылка действительно разбивается, и это происходит в HAL — наверно, разработчики контроллера имели какую-то причину? Или они просто злобные Буратины, вся цель жизни которых — нагадить мне?
Библиотеку можно подправить, но при первом же обновлении мои правки накроются медным тазом. Пусть будет, как есть — не особо мешает.
Еще вариант — поставить дополнительную SPI RAM к дохленькому контоллеру. Где ее купить недорого — пока не нашел. А ставить мощный контроллер в качестве драйвера не особо хочется — у них и цена кусается, и слишком много ног, одни проблемы с пайкой.
RP2040 с его 264KB SRAM и программируемыми выводами выглядит хорошо, только там SRAM сегментирована по 64KB — опяь могут быть проблемы с буфером кадра. И кушать много изволит в спящем режиме. Что-то душа к нему не лежит. Короче, куда не кинь — везде клин, нет в жизни счастья :)
Гда брать погоду — еще одна проблема. Меньше всего ограничений у open-meteo.com, но они, как настоящие джентельмены, меняют правила по ходу игры. А поначалу смотрелось неплохо — регистрация не нужна, информацию можно брать по максимуму и безо всяких ограничений на запросы. Прогноз, надо сказать, не особо точный и еще и глюки имеются — как-то за окном шел дождь, а они на осадки на текущий день прогнозировали отрицательную величину. Интересно, это как?
Наверно, самый популярный сайт — это openweathermap.org, но они очень хотят денег и всячески затрудняют жизнь халявщиков. И необходимость регистрации и ограничение на запросы не радуют, хотя ограничения на запросы вполне разумные. Но информации open-meteo дает больше, хоть и неправильной.
Dark Sky куплена Apple, так что ловить там уже нечего.
Первые тесты выглядят так (прогноз с open-meteo):
Пока статья писалась — и новая схема поспела, можете покритиковать при желании, только не сильно:
Антенна оказалась рядом с металлом дисплея. Он весь покрыт металлом, а плата будет к нему приклеена.
Когда коту делать нечего — он платы разводит. Переделываем все так, чтобы антенна выступала из-за экрана:
Почему эта статья не на Хабре? Причин много — во-первых, там все рисуют какого-то бегемота в колпачке, а я даже не знаю, откуда он взялся, неудобно как-то (это про картинку слева, а про котенка с улицы Лизюкова я знаю).
Кроме того, там какие-то страшные джуны, мидлы и тимлиды проходят интервью и получают оферы. Может, это больно?
На английском, было дело, я наваял кучку сайтов, доверившись Гуглу и его репутации — через какое-то время их прихлопнули. Больше не хочется время терять.
А здесь хоть плюсик поставят :) — уже видно, что не зря старался.
В комментариях часто здравую идею подскажут — тоже польза.
Ну и писать на английском — это все-таки труд, а на русском — развлечение. Графоманы подтвердят.
Кстати, анонс — Марио таки ограбил банк, так что впереди много интересного.
Что это и с чем это едят — можно посмотреть здесь и здесь.
Марио таки ограбил банк, так что впереди много интересного.
Эти штуки вроде как по беспроводной связи могут «общаться», и если понять как то можно их по всему дому и не только расставить и выводить ту или иную информацию.
Об этом и речь будет — там zigbee, и народ заставил их общаться. Впрочем, на первой ссылке все это есть, только у немцев найти можно больше деталей и реализаций. И ящик этот, впрочем, тоже из Неметчины приехал, там это дешевая и популярная игрушка. К home assistant их тоже подцепили.
Сеньор Батон! Извините за тупость, я понажимал на все ссылки, а где сфера применения этой эл.бумаги. Если для ценников — то слишком дорого и уже не нужно. Эл.Бумага нужна там, где нет тока, в переносном сегменте. Я не прав?
Не обязательно. Если нет желания тянуть лишние провода — тот же ценник от батарейки работает много лет. Прогноз погоды на стенку, дисплеи умного дома. Вывеска где-то, например на комнате совещаний, которую могут использовать разные группы. Обновляться может через zigbee каким-то сервером резервирования. Гостевой бейджик. Игрушка для ребенка
Да не надо меня за эл. бумагу агитировать, это я и так знаю. Весь вопрос цены. А бейджик посетителю — ну да это круто, но надо ещё бы покрыть стразами от… ну чтоб для полной крутизны :-)
Лучше напишите конечный ценник на эти игрушки, вкл. все затраты и обслуживание и всё само собой прояснится!
Да, а сама статья про драйвера прекрасна — СПАСИБО ВАМ!
А смысл мне кого-то агитировать? И тем более цены считать — у меня это развлечение, а за него обычно сами платят. Бейджик — это просто реальное и кем-то реализованное применение, есть там стразы или нет — не в курсе :) Если он будет стоить порядка 5 евро — почему и нет? Насколько я в курсе, оптовая цена небольшого цифрового ценника 5...10 евро.
Статья про цифровые ценники лежит в черновиках, будет опубликована в начале следующего месяца. Там будет малая часть информации, в основном с чем я сам игрался.
А что со всем.этим делать — я и сам толком пока не знаю, там более, что у меня их больше полусотни. Бывшие в употреблении можно купить начиная с одного евро — правда, партия в 500 штук :)
Ну не цепляйтесь к словам! Я не с критикой вам писал. Ещё раз, СПАСИБО за ваш труд в деле популяризации эл. бумаги! Ну а про цены вААще круть — тем более 1 эуро за игрушку — это очень даже приемлемо для бейджика или ценника!!! Даже с учетом, что его могут с… ть, (тут синоним слова стащить!) :-)
Ждем статью про ценники!
Отличие в названии на одну букву, даже ту, что в скобке — и работать ничего не будет.
Помню, в начале нулевых устанавливал родственникам внутренний винмодем Acorp — вот там намудохался с драйверами, оказывается, у внешне одинаковых моделей с буквами PIM и PIN в конце длинного индекса, разные драйверы, несовместимые между собой. Плюс ко всему традиционная акорповская кривизна драйверов и сайтов и общее слабое ещё развитие онлайна в те времена.
С буквами тут дело такое. ED060SC4(LF) — экран 2 поколения (VizPlex) и у него я не помню «близнецов» с другими буквами. Было несколько моделей, начинающихся на «ED060SC», а дальше разные буквы и цифры, но они обычно механически несовместимые (шлейфы торчат в разные стороны и заканчиваются разными разъёмами). Одно исключение — ED060SC8(LF), который механически и электрически совместим с ED060SC4(LF), но принадлежит уже к следующему поколению (Pearl) с улучшенным контрастом…
там какие-то страшные джуны, мидлы и тимлиды проходят интервью и получают оферы
Был когда-то там завсегдатаем, но злобные олдфаги постоянно норовили слить карму за безобидные комментарии только потому, что придерживались иного мнения.
P.S.
Что это и с чем это едят — можно посмотреть здесь и здесь.
Для второй ссылки нужен VPN, хотя итак можно догадаться, что там.
Для прорисовки экрана нужны следующие сигналы — сначала начало кадра, потом 600 строк, каждая имеет старт, потом данные и стоп. Завершается все концом кадра. За один пиксель отвечает два бита, комбинация 01 — черный цвет, 10 — белый, остальные — без изменения.
Таким образом, для одной строки из 800 пикселей нужно передать 200 байт.
С ESP32 тоже не все так просто — при попытке выделить массив под кадр больше 96К, линкер отказывается работать, заявляя что все, памяти у него для вас больше нет. А где же ваши хваленые 320K Data RAM
Те кто подключают LCD дисплеи высокого разрешения используют модули с PSRAM
Интересно, ESP32S3 по параллельному интерфейсу будет работать с этим дисплеем?
Библиотеку можно подправить, но при первом же обновлении мои правки накроются медным тазом. Пусть будет, как есть — не особо мешает.
Идеально подружить это все с Adafruit GFX через Framebuffer. Там всего то нужно свою функцию обновления экрана из FB прикрутить. Тогда и с обновлениями будет полегче
Кроме того, там какие-то страшные джуны, мидлы и тимлиды проходят интервью и получают оферы. Может, это больно?
И получают кучу минусов )))
К счастью, там попадаются статьи вроде вашей (правда на 90% переводы), поэтому и есть пока еще что почитать
там SRAM сегментирована по 64KB — опяь могут быть проблемы с буфером кадра
Вот где-то тут и начинает хотеться плакать. Потому, что в каждом доме есть PC-совместимый компьютер, где всех этих ограничений с ОЗУ нет, и скорость процессора позволяет ни в чём себе не отказывать… Только вот во всех виндовсах запретили доступ к портам и прерываниям, начиная с WinXP :(((
А во времена WinME я баловался изучением алгоритма работы I2C шины монитора, которая в VGA/DVI кабеле. Через VESA функции BIOS видеокарты находил адреса всех I2C портов, а потом уже из Виндовса, запрещал прерывания и читал/писал в тот порт.
Программ, которые умеют крутить яркость/контрастность и прочее для ЭЛТ мониторов Samsung ещё не было. Была только сервисная программа Samsung, работавшая через специальную LPT-плату. А у меня то же самое через видеокарту получилось! Эх хорошие времена были для программирования.
посылка действительно разбивается, и это происходит в HAL — наверно, разработчики контроллера имели какую-то причину? Или они просто злобные Буратины, вся цель жизни которых — нагадить мне?
А DMA там можно использовать? Или не править ту библиотеку, а положить рядом свою?
только там SRAM сегментирована по 64KB
Разработчики времен MS-DOS читают с недоумением. У них тоже были сегменты по 64К, и жили — не тужили.
Ну не так уж и не тужили. Почти везде было ограничение на размер файлов в 64 кб. А те программы, что и умели работать с большими массивами данных, в 100% случаев были привязаны ко всяким emm386.exe и himem.sys. Сами не хотели работать с адресами ОЗУ выше 1 Мб. А это не только дополнительные заморочки с настройкой окружения, но и минус быстродействие.
Возможно чуть полегче жилось пользователям других расширителей памяти типа DOS4GW, но ни разу не видел, чтоб это использовалось в обычных программах (не играх).
А в WinME + Delphi7 можно было объявлять массивы хоть 10 Мб, и не парится насчёт того, как туда обращаться!
Так если у пользователя был emm386 и в верхней памяти что-то было, а вы сами с ней работать начнете — затрете же. А так, насколько я помню, надо было в защищенный режим уйти, создать сегмент на всю память, загрузить его, например, в ES, после чего вернуться обратно — и всё, адресуй сколько хочешь.
А в WinME + Delphi7 можно было объявлять массивы хоть 10 Мб, и не парится насчёт того, как туда обращаться!
Это 32-битная ось, тут у процесса 4 ГБ виртуального адресного пространства. Естественно, 10 МБ — не вопрос для неё, даже 256 МБ и 1 ГБ (при определенных условиях) можно было выделять непрерывным блоком.
А DMA там можно использовать? Или не править ту библиотеку, а положить рядом свою?
Она там и используется.
С ESP32 глубоко разбираться лениво, тем более, что там многое не описано, а доступно в виде библиотек. По крайней мере документации с точностью до каждого бита я не видел.
Да и не особо мешает — потеря скорости передачи процент-другой, а на изображение не влияет.
Затык по скорости получается у SPI приемника STM32 — он обрабатывает прерывания и формирует сигналы не так быстро, как хотелось бы. Вот там можно было увеличить скорость уже раза в 2.
Можно еще вспомнить обращение к видеопамяти SVGA через малюсенькое окошко (ЕМНИП, те же 64К, при размерах видеостраницы от пары сотен килобайт до примерно мегабайта). Увлекательное занятие.
Программ, которые умеют крутить яркость/контрастность и прочее для ЭЛТ мониторов Samsung ещё не было. Была только сервисная программа Samsung, работавшая через специальную LPT-плату. А у меня то же самое через видеокарту получилось! Эх хорошие времена были для программирования.
Так времена сейчас даже ещё веселее. Сейчас можно по этому I2C через обычный VGA порт обновить прошивку монитора или просто окирпичить.
Пару лет назад такую писал под Linux. Там, кстати, намного проще доступ до I2C. Даже прерывания отключать не надо.
Без запрета прерываний не получалось точные временные промежутки выдерживать (для измерения времени использовал счётчик тактов процессора, тогда ещё частота не плавала).
Чисто интересно: а примерно с какой частотой у вас получилось I2C передачу данных проводить, тем более с параллельно работающими чужими процессами?
Разве там частота критична? Это же не WS2801 со своим семейством.
DDC вроде как до 400 кГц должен тянуть, а 100 уж точно может. Да там это не так критично.
Без запрета прерываний не получалось точные временные промежутки выдерживать (для измерения времени использовал счётчик тактов процессора, тогда ещё частота не плавала).
I2C — протокол синхронный, тактовый сигнал передается отдельным проводом. Ему не нужны идеальные тайминги, главное, чтобы не короче возможностей приемника было. Еще, там есть технология clock stretching, позволяющая приемнику самому замедлять передатчик.
А то, что частота процов сейчас плавает, кстати, на rdtsc никак не влияет — поскольку её изначально абьюзили для измерения времени, производителям пришлось делать заплатку, чтобы TSC продолжал измерять время и на современных многоядерных процессорах с плавающей частотой.
Сам сейчас занимаюсь подключением дисплея (у меня TFT IPS) по даташиту, в котором куча ошибок и недоговорённостей. Очень хорошо понимаю эту боль.
Добавлю от себя тот самый плюс.
Шоб былО :)
А серьезно — нужно значительно больше ног, чем есть у ESP32. Народ в аналогичных случаях ставит несколько сдвиговых регистров. Меня больше второй процессор устраивает — гибче получается и при необходимости с минимальное переделкой программы можно использовать там, где не нужен WiFi.
Один процессор с WiFi и много ног дешево и доступно уже не получается.
Алгоритм с многократной перезаписью кадра выглядит убого, если у кто знает, как сделать лучше — пожалуйста, напишите в комментариях.
посмотрите в сторону алгоритма BCM, как раз то что вам нужно. Я как-то было дело работал над оптимизацией вот это либы — ESP32-HUB75-MatrixPanel-DMA.
Довольно интересный проект. Там принцип схожий, динамический диапазон яркости реализуется за счет преобразования веса разрядности цвета в количество повторов свечения пикселей в двоичном коде по степени двойки. У вас можно реализовать похожий алгоритм только наизнанку — взять 3-5 битный серый и чем больше «черноты», тем больше вес BCM.
Кадровый буфер при этом строится в виде связанного списка, что делает ненужным аллокацию больших сплошных блоков памяти и экономит на повторяющихся строках. Вывод там реализован через параллельный i2s dma, но, думаю, вполне можно адаптировать под SPI или RMT при желании. Вообще у есп32 есть неплохие возможности если не полениться покурить IDF. Ну и плат с PSRAM чипом на борту навалом.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
Лучше напишите конечный ценник на эти игрушки, вкл. все затраты и обслуживание и всё само собой прояснится!
Да, а сама статья про драйвера прекрасна — СПАСИБО ВАМ!
Статья про цифровые ценники лежит в черновиках, будет опубликована в начале следующего месяца. Там будет малая часть информации, в основном с чем я сам игрался.
А что со всем.этим делать — я и сам толком пока не знаю, там более, что у меня их больше полусотни. Бывшие в употреблении можно купить начиная с одного евро — правда, партия в 500 штук :)
Ждем статью про ценники!
С улицы им. генерала Александра Ильича Лизюкова в г. Воронеже же! ;)
Был когда-то там завсегдатаем, но злобные олдфаги постоянно норовили слить карму за безобидные комментарии только потому, что придерживались иного мнения.
P.S.
Для второй ссылки нужен VPN, хотя итак можно догадаться, что там.
Ссылку поменял на другую, вроде должна работать.
А платы вы в чем разводите?
И какой формат видео шел с камеры?
Те кто подключают LCD дисплеи высокого разрешения используют модули с PSRAM
Интересно, ESP32S3 по параллельному интерфейсу будет работать с этим дисплеем?
Идеально подружить это все с Adafruit GFX через Framebuffer. Там всего то нужно свою функцию обновления экрана из FB прикрутить. Тогда и с обновлениями будет полегче
И получают кучу минусов )))
К счастью, там попадаются статьи вроде вашей (правда на 90% переводы), поэтому и есть пока еще что почитать
А во времена WinME я баловался изучением алгоритма работы I2C шины монитора, которая в VGA/DVI кабеле. Через VESA функции BIOS видеокарты находил адреса всех I2C портов, а потом уже из Виндовса, запрещал прерывания и читал/писал в тот порт.
Программ, которые умеют крутить яркость/контрастность и прочее для ЭЛТ мониторов Samsung ещё не было. Была только сервисная программа Samsung, работавшая через специальную LPT-плату. А у меня то же самое через видеокарту получилось! Эх хорошие времена были для программирования.
Разработчики времен MS-DOS читают с недоумением. У них тоже были сегменты по 64К, и жили — не тужили.
Возможно чуть полегче жилось пользователям других расширителей памяти типа DOS4GW, но ни разу не видел, чтоб это использовалось в обычных программах (не играх).
А в WinME + Delphi7 можно было объявлять массивы хоть 10 Мб, и не парится насчёт того, как туда обращаться!
Это 32-битная ось, тут у процесса 4 ГБ виртуального адресного пространства. Естественно, 10 МБ — не вопрос для неё, даже 256 МБ и 1 ГБ (при определенных условиях) можно было выделять непрерывным блоком.
С ESP32 глубоко разбираться лениво, тем более, что там многое не описано, а доступно в виде библиотек. По крайней мере документации с точностью до каждого бита я не видел.
Да и не особо мешает — потеря скорости передачи процент-другой, а на изображение не влияет.
Затык по скорости получается у SPI приемника STM32 — он обрабатывает прерывания и формирует сигналы не так быстро, как хотелось бы. Вот там можно было увеличить скорость уже раза в 2.
я было начал писать статью но забил
Пару лет назад такую писал под Linux. Там, кстати, намного проще доступ до I2C. Даже прерывания отключать не надо.
Чисто интересно: а примерно с какой частотой у вас получилось I2C передачу данных проводить, тем более с параллельно работающими чужими процессами?
DDC вроде как до 400 кГц должен тянуть, а 100 уж точно может. Да там это не так критично.
А то, что частота процов сейчас плавает, кстати, на rdtsc никак не влияет — поскольку её изначально абьюзили для измерения времени, производителям пришлось делать заплатку, чтобы TSC продолжал измерять время и на современных многоядерных процессорах с плавающей частотой.
Добавлю от себя тот самый плюс.
А серьезно — нужно значительно больше ног, чем есть у ESP32. Народ в аналогичных случаях ставит несколько сдвиговых регистров. Меня больше второй процессор устраивает — гибче получается и при необходимости с минимальное переделкой программы можно использовать там, где не нужен WiFi.
Один процессор с WiFi и много ног дешево и доступно уже не получается.
Довольно интересный проект. Там принцип схожий, динамический диапазон яркости реализуется за счет преобразования веса разрядности цвета в количество повторов свечения пикселей в двоичном коде по степени двойки. У вас можно реализовать похожий алгоритм только наизнанку — взять 3-5 битный серый и чем больше «черноты», тем больше вес BCM.
Кадровый буфер при этом строится в виде связанного списка, что делает ненужным аллокацию больших сплошных блоков памяти и экономит на повторяющихся строках. Вывод там реализован через параллельный i2s dma, но, думаю, вполне можно адаптировать под SPI или RMT при желании. Вообще у есп32 есть неплохие возможности если не полениться покурить IDF. Ну и плат с PSRAM чипом на борту навалом.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.