Возрождение проекта ChiArdumeg - подключаем сенсорный модуль и готовим прошивку
Однажды был начат экспериментальный проект ChiArdumeg, но вскоре был заброшен на неопределённое время после сборки промежуточного модуля дисплея... Конечно, модуль дисплея был собран не до конца, там не было части отвечающей за сенсор экрана, но недавно этот недостаток был устранён:
реклама
После чего нужно было проверить сенсор на работоспособность, однако популярные библиотеки и готовые для использования "примеры" несовместимы с моим модулем дисплея, так что пришлось изрядно потанцевать с бубном в поисках рабочих библиотек...
Популярные библиотеки для работы с модулем дисплея ili9341 вроде Adafruit в лучшем случае выдавали месиво из артефактов, либо вообще ничего не показывали, это было проблемой, ведь без вывода изображения невозможно проверить работу сенсора.
В итоге я достал единственный рабочий вариант в виде библиотеки Ucglib, переписав код добавил библиотеку для работы с сенсором URTouch, и оно наконец заработало:
реклама
Некоторое время было потрачено на эксперименты, доработку прошивки и настройку промежуточного модуля дисплея:
Зачем вообще был создан этот проект? На самом деле у проекта нет никакой цели, просто был модуль дисплея и кучка деталей с проводами, из этого всего мне захотелось что-то сделать используя Arduino:
Казалось бы, модуль уже работает, можно наконец встраивать всё в ПК, но увы, есть проблема с точностью сенсора, при нажатии резистивный сенсор улавливал нажатия где их не было, это приводило к сильному разбросу и "шуму".
Если в моменты нажатия проблему можно было решить просто добавив задержку обработки ввода относительно первого сигнала от сенсора, то разброс во время рисования и отвода стилуса от сенсора, как оказалось, решить гораздо сложнее, ведь просто добавить задержку уже не выйдет...
реклама
Потому пришлось программно выявлять слишком большие отклонения, и игнорировать их, так как я не программист, то и методы мои работают, мягко говоря, не идеально, в итоге удалось стабилизировать сенсор от сильного разброса.
Так же поработал над универсальностью прошивки, чтобы она подходила как к Arduino Mega2560, так и к Arduino UNO без изменений в подключении, всё равно мой модуль дисплея не работает через аппаратный SPI, только через программный, а значит можно сделать одинаковую разметку выходов для обеих платформ:
Да, моя прошивка теперь совместима с обеими версиями Arduino, и я без проблем могу использовать промежуточный модуль подключения дисплея не ковыряясь с каждым проводком в отдельности:
Но была одна серьёзная проблема, так как мой модуль "слишком одарённый", то и библиотека Ucglib, единственная работающая с модулем, выполняла работу неправильно, по неведомой мне причине дисплей выводит цвета в формате BGR вместо RGB, подстраивать определённый для RGB код прошивки под BGR было не уместно, а потому пришлось немного подредактировать исходный код библиотеки отвечающей за работу с дисплеем, после чего цветность пришла в норму:
реклама
Вполне возможно, что с нормальными дисплеями подредактированная библиотека снова выдаст BGR вместо RGB, но что поделать, у меня нет других дисплеев для проверки, так что работаю с тем что есть.
Продолжаю тестировать, настраивать и дорабатывать не только промежуточный модуль, но и прошивку:
Далее взялся за функции отрисовки изображений, начал с малого, однако изначально было понимание, что с ограниченными ресурсами Arduino Mega 2560 не выйдет полноценно хранить в памяти цветные изображения, потому ограничился градациями серого, однако первый блин вышел комом:
Второй блин тоже получился не очень, третий уже лучше, однако были проблемы с форматом хранения, у Mega 2560 было достаточно ОЗУ для хранения изображения, однако с Arduino UNO уже могли возникнуть проблемы, ведь там в 4 раза меньше ОЗУ, и этого не хватало:
Следующий блин тоже вышел комом, ведь помещая массив в постоянную память вместо оперативной возникала проблема скорости, хоть Arduino и не отличается скоростью, а дисплей работал в программном режиме SPI, но скоростей ПЗУ было недостаточно для вывода массива, в итоге изображение рвалось...
Пришлось придумать некий аналог видеопамяти, в который загружались данные перед выводом на дисплей, это решило проблему порчи изображения, а так как я использую двухмерный массив для хранения данных о цветности, мне не пришлось изобретать сложные "велосипеды" для отрисовки:
Конечно есть и ещё одна проблема, используемый формат хранения несовместим с уже существующими инструментами генерации массивов из картинок для Arduino, ведь у меня двухмерный массив, каждая ячейка которого имеет значение от 0 до 255.
Если существующие инструменты хранят в массиве биты пикселей, то я храню значение цветности для определённого размера изображения, это позволяет мне не только выводить изображение в градациях серого (при желании можно и цвета реализовать), но и отсекать вывод нулевых пикселей, тем самым ускоряя процесс отрисовки пропуская "прозрачность":
Конечно, для полноценного смешивания прозрачности желательно добавить ещё один канал цвета, ведь пиксели, цвет которых отличен от нуля всё равно выводятся, даже если дисплей их не способен показать:
Но я не хочу заниматься дальнейшим совершенствованием вывода картинок, Arduino и так слишком слаба для таких вещей, лучше поработаю над аппаратной частью:
У меня тут висят в воздухе три незадействованных провода, и знаете, они идеально подходят для подключения трёх кнопок, на которые можно будет закрепить некоторые функции, чтобы не зависеть полностью от сенсора дисплея:
Но сначала следует загрузить проект в репозиторий GitHub...
https://github.com/Shedou/ChiArdumeg
Уже заметили проблему? Нет? Забытая приставка Chi перед Ardumeg не проблема, это можно переименовать в любой момент, настоящая проблема состоит в отсутствии документации на проект.
У меня конечно есть наброски в блокноте на скорую руку, там даже забыл резисторы указать до сенсорного модуля экрана, но не помешало бы в цифровом виде оформить схему:
Ну а чтобы не рисовать схему в обычном графическом редакторе, я вспомнил про KiCAD, однако есть проблема, я использую Linux вместо операционной системы здорового человека, и вариант "скачать адекватный установочный exe пакет" явно не мой, ведь линукс же:
Но когда я пошёл искать архивы с приложением под линукс... В общем это то ещё мракобесие, классика линуксов, а потом ещё всякие "эксперты" ноют, почему это никому в здравом уме и даром не нужны линуксы и линуксоидный софт:
Я до последнего надеялся, что разработчики осилят хотя бы независимый архив с приложением, но нет, везде мракобесные репозитории линуксоидные:
Единственный вариант без пердолинга установить KiCAD - использовать стандартные репозитории Debian 12, чтобы не ковыряться в конфигурациях и прочем мусоре характерном для линуксов, но увы, там уже давно протухшая версия 6.0.11, да и систему загадит кучей лишних зависимостей никому не нужных:
Так что выбора нет, устанавливаю Windows версию KiCAD через встроенный в Chimbalix Wine-Proton, хотя значки и не появятся в меню "Пуск", ибо Wine-Proton поломан на такой функционал, но мне не сложно будет сделать вручную ярлык на установленное приложение, а потом что-нибудь может и придумаю, чтобы вручную не приходилось делать ярлыки:
Это тот момент, когда установить Windows приложение через Wine-Proton встроенный в Chimbalix гораздо проще, чем заниматься мракобесием с линуксоидными репозиториями разгребая ад зависимостей:
Теперь можно и схему начать рисовать:
В итоге была нарисована схема в виде печатной платы, странно, бессмысленно, но оно ведь сработало:
Два контакта остались незадействованными, а ещё нумерация контактов дисплея не с той стороны начата, нужно будет переделать, и номиналы резисторов не указаны... Ну да ладно, и так сойдёт!
Что там дальше...
Пожалуй нужно достать два пакетика с SMD кнопками, и немного переделать верхнюю часть дисплея, где был переменный резистор для регулировки яркости подсветки:
Припаиваю наиболее удобные в использовании кнопки, наклеиваю скотч на стол, и заливаю горячим клеем собранную конструкцию, разумеется заранее проверив как оно работает:
После застывания заливаю клеем обратную сторону, и при помощи скотча на столе выравниваю поверхность:
Примеряю дисплей к своему ПК, и вижу проблему...
Нет, проблема не в воздуховоде охлаждения видеокарты, а с нижней частью дисплея, он ведь без корпуса, нужно как-то защитить от повреждений, будет очень неприятно, если случайно надавлю на угол и дисплей лопнет:
На всякий случай проверяю дисплей, ведь недавно он имел контакт с горячим клеем:
Ну и конечно убираю лишний клей, придаю более строгую форму, а чтобы не повредить дисплей - защищаю его лезвием канцелярского ножа:
Вроде с подготовкой закончил, можно клеить этот модуль к ПК, я даже не буду изолировать эти детали, ведь клейкая лента есть изолятор, да и про слой краски не стоит забывать на самом корпусе, так что лишняя изоляция лишь ухудшит сцепление и надёжность:
Итого дисплей был приклеен к крышке ПК вместо наклейки "AORUS":
Но настоящая проблема возникла когда примерил Arduino к своему ПК, увы, но она практически не влазит, по крайней мере с дополнительным переходным модулем, упирается в довольно длинную, примерно 27 сантиметровую видеокарту...
С более компактной Arduino UNO ситуация не особо лучше:
Потому у меня появилась идея... Раз не могу разместить микроконтроллер внутри ПК, значит сделаю это снаружи! А чтобы всякие контакты не мешали - сточу их наждачной бумагой, даже не повредил шелкографию:
Эх, похоже опять нужно снимать наклейку, ведь только в левой верхней части крышки есть место...
Приклеить к крышке корпуса Arduino Mega 2560 оказалось простой задачей:
Сложнее было с дополнительным модулем дисплея, тем не менее, оно приклеилось и работает:
Теоретически, это всё можно было засунуть внутрь ПК, с большими сложностями конечно... Но если подумать про доступ к выводам Arduino, то приклеить контроллер снаружи ПК было явно более удачной идеей, ведь сейчас у меня есть полный доступ, тем более забыл развести кнопки дисплея на промежуточном модуле, так что придётся ещё дорабатывать немного:
Меня немного волновала толщина корпуса из-за новых устройств на крышке, но ничего страшного не вышло, всего 11 сантиметров получилось вместе с Arduino, мой системный блок в самодельном корпусе из ATX комплектующих до сих пор прекрасно влезет в коробку от 15 дюймового ноутбука, и ещё останется место:
Пожалуй на этом пока завершу работу с проектом, наконец удалось избавиться от контроллера валяющегося где попало, теперь он всегда рядом с компьютером, прямо на его крышке.
Что будет дальше? Без понятия, ведь у проекта нет конкретной цели.
Благодарю за внимание, больше интересных статей в блоге Hard-Workshop.
Лента материалов
Соблюдение Правил конференции строго обязательно!
Флуд, флейм и оффтоп преследуются по всей строгости закона!
Комментарии, содержащие оскорбления, нецензурные выражения (в т.ч. замаскированный мат), экстремистские высказывания, рекламу и спам, удаляются независимо от содержимого, а к их авторам могут применяться меры вплоть до запрета написания комментариев и, в случае написания комментария через социальные сети, жалобы в администрацию данной сети.
Комментарии Правила