Overclockers.ru: Возрождение проекта ChiArdumeg - подключаем сенсорный модуль и готовим прошивку

by · Overclockers.ru

Однажды был начат экспериментальный проект ChiArdumeg, но вскоре был заброшен на неопределённое время после сборки промежуточного модуля дисплея... Конечно, модуль дисплея был собран не до конца, там не было части отвечающей за сенсор экрана, но недавно этот недостаток был устранён:

https://overclockers.ru/st/legacy/blog/373296/575106_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575107_O.jpg

После чего нужно было проверить сенсор на работоспособность, однако популярные библиотеки и готовые для использования "примеры" несовместимы с моим модулем дисплея, так что пришлось изрядно потанцевать с бубном в поисках рабочих библиотек...

Популярные библиотеки для работы с модулем дисплея ili9341 вроде Adafruit в лучшем случае выдавали месиво из артефактов, либо вообще ничего не показывали, это было проблемой, ведь без вывода изображения невозможно проверить работу сенсора.

В итоге я достал единственный рабочий вариант в виде библиотеки Ucglib, переписав код добавил библиотеку для работы с сенсором URTouch, и оно наконец заработало:

https://overclockers.ru/st/legacy/blog/373296/575108_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575109_O.jpg

Некоторое время было потрачено на эксперименты, доработку прошивки и настройку промежуточного модуля дисплея:

https://overclockers.ru/st/legacy/blog/373296/575113_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575114_O.jpg
https://overclockers.ru/st/legacy/blog/373296/575115_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575116_O.jpg

Зачем вообще был создан этот проект? На самом деле у проекта нет никакой цели, просто был модуль дисплея и кучка деталей с проводами, из этого всего мне захотелось что-то сделать используя Arduino:

https://overclockers.ru/st/legacy/blog/373296/575117_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575118_O.jpg
https://overclockers.ru/st/legacy/blog/373296/575119_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575120_O.jpg

Казалось бы, модуль уже работает, можно наконец встраивать всё в ПК, но увы, есть проблема с точностью сенсора, при нажатии резистивный сенсор улавливал нажатия где их не было, это приводило к сильному разбросу и "шуму".

Если в моменты нажатия проблему можно было решить просто добавив задержку обработки ввода относительно первого сигнала от сенсора, то разброс во время рисования и отвода стилуса от сенсора, как оказалось, решить гораздо сложнее, ведь просто добавить задержку уже не выйдет...

Потому пришлось программно выявлять слишком большие отклонения, и игнорировать их, так как я не программист, то и методы мои работают, мягко говоря, не идеально, в итоге удалось стабилизировать сенсор от сильного разброса.

Так же поработал над универсальностью прошивки, чтобы она подходила как к Arduino Mega2560, так и к Arduino UNO без изменений в подключении, всё равно мой модуль дисплея не работает через аппаратный SPI, только через программный, а значит можно сделать одинаковую разметку выходов для обеих платформ:

https://overclockers.ru/st/legacy/blog/373296/575121_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575122_O.jpg
https://overclockers.ru/st/legacy/blog/373296/575123_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575124_O.jpg

Да, моя прошивка теперь совместима с обеими версиями Arduino, и я без проблем могу использовать промежуточный модуль подключения дисплея не ковыряясь с каждым проводком в отдельности:

https://overclockers.ru/st/legacy/blog/373296/575127_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575128_O.jpg

Но была одна серьёзная проблема, так как мой модуль "слишком одарённый", то и библиотека Ucglib, единственная работающая с модулем, выполняла работу неправильно, по неведомой мне причине дисплей выводит цвета в формате BGR вместо RGB, подстраивать определённый для RGB код прошивки под BGR было не уместно, а потому пришлось немного подредактировать исходный код библиотеки отвечающей за работу с дисплеем, после чего цветность пришла в норму:

https://overclockers.ru/st/legacy/blog/373296/575143_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575142_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575144_O.jpg

Вполне возможно, что с нормальными дисплеями подредактированная библиотека снова выдаст BGR вместо RGB, но что поделать, у меня нет других дисплеев для проверки, так что работаю с тем что есть.

Продолжаю тестировать, настраивать и дорабатывать не только промежуточный модуль, но и прошивку:

https://overclockers.ru/st/legacy/blog/373296/575154_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575155_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575156_O.jpg

Далее взялся за функции отрисовки изображений, начал с малого, однако изначально было понимание, что с ограниченными ресурсами Arduino Mega 2560 не выйдет полноценно хранить в памяти цветные изображения, потому ограничился градациями серого, однако первый блин вышел комом:

https://overclockers.ru/st/legacy/blog/373296/575157_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575158_O.jpg

Второй блин тоже получился не очень, третий уже лучше, однако были проблемы с форматом хранения, у Mega 2560 было достаточно ОЗУ для хранения изображения, однако с Arduino UNO уже могли возникнуть проблемы, ведь там в 4 раза меньше ОЗУ, и этого не хватало:

https://overclockers.ru/st/legacy/blog/373296/575161_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575162_O.jpg

Следующий блин тоже вышел комом, ведь помещая массив в постоянную память вместо оперативной возникала проблема скорости, хоть Arduino и не отличается скоростью, а дисплей работал в программном режиме SPI, но скоростей ПЗУ было недостаточно для вывода массива, в итоге изображение рвалось...

Пришлось придумать некий аналог видеопамяти, в который загружались данные перед выводом на дисплей, это решило проблему порчи изображения, а так как я использую двухмерный массив для хранения данных о цветности, мне не пришлось изобретать сложные "велосипеды" для отрисовки:

https://overclockers.ru/st/legacy/blog/373296/575165_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575166_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575167_O.jpg

Конечно есть и ещё одна проблема, используемый формат хранения несовместим с уже существующими инструментами генерации массивов из картинок для Arduino, ведь у меня двухмерный массив, каждая ячейка которого имеет значение от 0 до 255.

Если существующие инструменты хранят в массиве биты пикселей, то я храню значение цветности для определённого размера изображения, это позволяет мне не только выводить изображение в градациях серого (при желании можно и цвета реализовать), но и отсекать вывод нулевых пикселей, тем самым ускоряя процесс отрисовки пропуская "прозрачность":

https://overclockers.ru/st/legacy/blog/373296/575170_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575171_O.jpg

Конечно, для полноценного смешивания прозрачности желательно добавить ещё один канал цвета, ведь пиксели, цвет которых отличен от нуля всё равно выводятся, даже если дисплей их не способен показать:

https://overclockers.ru/st/legacy/blog/373296/575173_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575174_O.jpg
https://overclockers.ru/st/legacy/blog/373296/575175_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575176_O.jpg

Но я не хочу заниматься дальнейшим совершенствованием вывода картинок, Arduino и так слишком слаба для таких вещей, лучше поработаю над аппаратной частью:

https://overclockers.ru/st/legacy/blog/373296/575177_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575178_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575179_O.jpg

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

Но сначала следует загрузить проект в репозиторий GitHub...

https://github.com/Shedou/ChiArdumeg

Уже заметили проблему? Нет? Забытая приставка Chi перед Ardumeg не проблема, это можно переименовать в любой момент, настоящая проблема состоит в отсутствии документации на проект.

У меня конечно есть наброски в блокноте на скорую руку, там даже забыл резисторы указать до сенсорного модуля экрана, но не помешало бы в цифровом виде оформить схему:

https://overclockers.ru/st/legacy/blog/373296/575452_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575453_O.jpg

Ну а чтобы не рисовать схему в обычном графическом редакторе, я вспомнил про KiCAD, однако есть проблема, я использую Linux вместо операционной системы здорового человека, и вариант "скачать адекватный установочный exe пакет" явно не мой, ведь линукс же:

Но когда я пошёл искать архивы с приложением под линукс... В общем это то ещё мракобесие, классика линуксов, а потом ещё всякие "эксперты" ноют, почему это никому в здравом уме и даром не нужны линуксы и линуксоидный софт:

https://overclockers.ru/st/legacy/blog/373296/575470_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575471_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575472_O.jpg

Я до последнего надеялся, что разработчики осилят хотя бы независимый архив с приложением, но нет, везде мракобесные репозитории линуксоидные:

https://overclockers.ru/st/legacy/blog/373296/575473_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575474_O.jpg

Единственный вариант без пердолинга установить KiCAD - использовать стандартные репозитории Debian 12, чтобы не ковыряться в конфигурациях и прочем мусоре характерном для линуксов, но увы, там уже давно протухшая версия 6.0.11, да и систему загадит кучей лишних зависимостей никому не нужных:

https://overclockers.ru/st/legacy/blog/373296/575480_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575479_O.jpg

Так что выбора нет, устанавливаю Windows версию KiCAD через встроенный в Chimbalix Wine-Proton, хотя значки и не появятся в меню "Пуск", ибо Wine-Proton поломан на такой функционал, но мне не сложно будет сделать вручную ярлык на установленное приложение, а потом что-нибудь может и придумаю, чтобы вручную не приходилось делать ярлыки:

Это тот момент, когда установить Windows приложение через Wine-Proton встроенный в Chimbalix гораздо проще, чем заниматься мракобесием с линуксоидными репозиториями разгребая ад зависимостей:

https://overclockers.ru/st/legacy/blog/373296/575483_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575484_O.jpg

Теперь можно и схему начать рисовать:

В итоге была нарисована схема в виде печатной платы, странно, бессмысленно, но оно ведь сработало:

https://overclockers.ru/st/legacy/blog/373296/575786_O.jpghttps://overclockers.ru/st/legacy/blog/373296/575787_O.jpg

Два контакта остались незадействованными, а ещё нумерация контактов дисплея не с той стороны начата, нужно будет переделать, и номиналы резисторов не указаны... Ну да ладно, и так сойдёт!

Что там дальше...

Пожалуй нужно достать два пакетика с SMD кнопками, и немного переделать верхнюю часть дисплея, где был переменный резистор для регулировки яркости подсветки:

https://overclockers.ru/st/legacy/blog/373296/576250_O.jpghttps://overclockers.ru/st/legacy/blog/373296/576251_O.jpg

Припаиваю наиболее удобные в использовании кнопки, наклеиваю скотч на стол, и заливаю горячим клеем собранную конструкцию, разумеется заранее проверив как оно работает:

https://overclockers.ru/st/legacy/blog/373296/576297_O.jpghttps://overclockers.ru/st/legacy/blog/373296/576298_O.jpghttps://overclockers.ru/st/legacy/blog/373296/576299_O.jpg

После застывания заливаю клеем обратную сторону, и при помощи скотча на столе выравниваю поверхность:

https://overclockers.ru/st/legacy/blog/373296/576300_O.jpghttps://overclockers.ru/st/legacy/blog/373296/576301_O.jpghttps://overclockers.ru/st/legacy/blog/373296/576302_O.jpg

Примеряю дисплей к своему ПК, и вижу проблему...

https://overclockers.ru/st/legacy/blog/373296/576305_O.jpghttps://overclockers.ru/st/legacy/blog/373296/576306_O.jpg

Нет, проблема не в воздуховоде охлаждения видеокарты, а с нижней частью дисплея, он ведь без корпуса, нужно как-то защитить от повреждений, будет очень неприятно, если случайно надавлю на угол и дисплей лопнет:

https://overclockers.ru/st/legacy/blog/373296/576307_O.jpghttps://overclockers.ru/st/legacy/blog/373296/576308_O.jpghttps://overclockers.ru/st/legacy/blog/373296/576309_O.jpg

На всякий случай проверяю дисплей, ведь недавно он имел контакт с горячим клеем:

https://overclockers.ru/st/legacy/blog/373296/576310_O.jpghttps://overclockers.ru/st/legacy/blog/373296/576311_O.jpg

Ну и конечно убираю лишний клей, придаю более строгую форму, а чтобы не повредить дисплей - защищаю его лезвием канцелярского ножа:

https://overclockers.ru/st/legacy/blog/373296/576312_O.jpghttps://overclockers.ru/st/legacy/blog/373296/576313_O.jpghttps://overclockers.ru/st/legacy/blog/373296/576314_O.jpg

Вроде с подготовкой закончил, можно клеить этот модуль к ПК, я даже не буду изолировать эти детали, ведь клейкая лента есть изолятор, да и про слой краски не стоит забывать на самом корпусе, так что лишняя изоляция лишь ухудшит сцепление и надёжность:

https://overclockers.ru/st/legacy/blog/373296/576315_O.jpghttps://overclockers.ru/st/legacy/blog/373296/576316_O.jpg

Итого дисплей был приклеен к крышке ПК вместо наклейки "AORUS":

https://overclockers.ru/st/legacy/blog/373296/576369_O.jpghttps://overclockers.ru/st/legacy/blog/373296/576370_O.jpghttps://overclockers.ru/st/legacy/blog/373296/576371_O.jpg

Но настоящая проблема возникла когда примерил Arduino к своему ПК, увы, но она практически не влазит, по крайней мере с дополнительным переходным модулем, упирается в довольно длинную, примерно 27 сантиметровую видеокарту...

С более компактной Arduino UNO ситуация не особо лучше:

https://overclockers.ru/st/legacy/blog/373296/576372_O.jpghttps://overclockers.ru/st/legacy/blog/373296/576373_O.jpg
https://overclockers.ru/st/legacy/blog/373296/576374_O.jpghttps://overclockers.ru/st/legacy/blog/373296/576375_O.jpg

Потому у меня появилась идея... Раз не могу разместить микроконтроллер внутри ПК, значит сделаю это снаружи! А чтобы всякие контакты не мешали - сточу их наждачной бумагой, даже не повредил шелкографию:

https://overclockers.ru/st/legacy/blog/373296/576401_O.jpghttps://overclockers.ru/st/legacy/blog/373296/576402_O.jpghttps://overclockers.ru/st/legacy/blog/373296/576403_O.jpg

Эх, похоже опять нужно снимать наклейку, ведь только в левой верхней части крышки есть место...

Приклеить к крышке корпуса Arduino Mega 2560 оказалось простой задачей:

https://overclockers.ru/st/legacy/blog/373296/576834_O.jpghttps://overclockers.ru/st/legacy/blog/373296/576835_O.jpg

Сложнее было с дополнительным модулем дисплея, тем не менее, оно приклеилось и работает:

https://overclockers.ru/st/legacy/blog/373296/576836_O.jpghttps://overclockers.ru/st/legacy/blog/373296/576837_O.jpghttps://overclockers.ru/st/legacy/blog/373296/576838_O.jpg

Теоретически, это всё можно было засунуть внутрь ПК, с большими сложностями конечно... Но если подумать про доступ к выводам Arduino, то приклеить контроллер снаружи ПК было явно более удачной идеей, ведь сейчас у меня есть полный доступ, тем более забыл развести кнопки дисплея на промежуточном модуле, так что придётся ещё дорабатывать немного:

https://overclockers.ru/st/legacy/blog/373296/576839_O.jpghttps://overclockers.ru/st/legacy/blog/373296/576840_O.jpg

Меня немного волновала толщина корпуса из-за новых устройств на крышке, но ничего страшного не вышло, всего 11 сантиметров получилось вместе с Arduino, мой системный блок в самодельном корпусе из ATX комплектующих до сих пор прекрасно влезет в коробку от 15 дюймового ноутбука, и ещё останется место:

Пожалуй на этом пока завершу работу с проектом, наконец удалось избавиться от контроллера валяющегося где попало, теперь он всегда рядом с компьютером, прямо на его крышке.

Что будет дальше? Без понятия, ведь у проекта нет конкретной цели.

Благодарю за внимание, больше интересных статей в блоге Hard-Workshop.