В сети подобных проектов никто не делал. На микроконтроллерах можно делать не только светодиодные мигалки и элементы умного дома, но и другие интересные штуки - например периферию для ПК. Рули, клавиатуры (в том числе беспроводные) я уже делал - пришло время сделать самодельный монитор.
Принципиальная электрическая схема:
Проект выполнен на базе микроконтроллера ESP32. Данные для видео-картинки передаются через виртуальный COM порт, который появляется в системе OS Windows после подключения USB-UART преобразователя на базе микросхемы PL230HX (скорость 5'000'000 бод/секунду). PL230HX сидит на 2-м аппаратном UART платформы ESP32. Принимаемые данные транслируются ESP32 в цветной TFT дисплей на контроллере ILI9341 подключенный через интерфейс SPI (320х240).
Прототип на макетной плате:
Прототип подключён к миникомпьютеру из Китая под управлением 32-х разрядных "форточек" от Микрософт. Про сам компьютер я писал в этой статье.
Как это все работает со стороны Arduino?
Для работы с дисплеем на гитхабе нашлась шикарная библиотека TFT_eSPI
Она поддерживает огромное количество контроллеров дисплеев:
Но! самое главное написана с учетом особенностей архитектуры ESP32. Единственный минус - очень слабая документация. Автор сам в этом признается, так как работает в крупной компании и на хобби у него практически не остается времени. Если для Вас Arduino до сих пор конструктор из кубиков для домохозяек, скорее всего воспользоваться этим мощным инструментом у Вас не выйдет - тут требуются как минимум базовые знания языка С
В отличии от других библиотек - все препроцессорные директивы вынесены в файл Setup, который лежит в папке с самой библиотекой - и он огромен. Все настройки по подключению дисплея выполняются именно через этот файл.
Покопавшись в исходниках, нашлась команда, которая делает именно то что нужно - отправляет массив размещенный в оперативной памяти в котором содержаться данные о цветах - формат 8 бит на пиксель (RGB323)
Код для ESP32 получился простой до безобразия:
В основном цикле loop() мы ждем пакет данных размером 76800 байт и как только все до одного их получим - отправляем картинку на дисплей. Время выполнения самой отправки данных на дисплей - команда:
myGLCD.pushImage(0, 0, 320, 240, disIMG);
занимает примерно 42ms. Алгоритм работы команды Serial2.readBytes() я разбирал в этой статье.
Как это работает со стороны Windows ?
1. На компьютере создается одна локальная учетная запись.
2. Для этой учетной записи создается пароль (для возможности подключения по RDP с другого компьютера). Для самой учетной записи делается разрешение на вход на ПК без пароля. Если компьютером пользуетесь только вы, есть хорошая статья на сайте как отключить окно приветствия и ввод пароля (команда netplwiz)
3. В планировщик заданий - (команда taskschd.msc) при событии вход в Windows помещается команда на запуск самодельной софтины написанной на языке С#
Софтина имеет свой собственный файл конфигурации
Номер COM порта на котором сидит переходник USB-UART и частота отправки кадров каждые ms (зависит от характеристик ПК и её можно выяснить с помощью кнопки test).
Если в файле написать вместо N - Y то при запуске программы:
- открывается COM порт указанный в файле;
- делается скриншот в оперативную память ПК;
- с помощью WinApi определяется положение и форма курсора;
- курсор копипаститься на файл скриншота;
- скриншот переводится в разрешение подключенного дисплея;
- данные из формата ARGB8888 конвертируются в формат RGB323 по схеме:
если совсем не понятно, о чем речь - советую прочитать эту статью
- сформированный из этих данных массив отправляется в ESP32
- через время указанное в файле, процесс повторяется.
Винда загрузилась, картинка появилась. Разбирать подробно код под Windows не вижу смысла - по статистике эти статьи все равно никто не читает. Если нужен подробный разбор кода - пишите в комментариях. Все исходники будут прикреплены к статье - кому нужно, сами посмотрите.
Демонстрацию работы дисплея смотрите в этом видео:
Код ТУТ:
Оглавление канала ТУТ
Всем удачи!