Но! Сначала зачем это вообще нужно? - так как это был самый популярный комментарии к прошлой статье про очередной повод выбросить ардуину на свалку.
Есть у меня вот такая штука:
А еще есть вот такой древний ЦО-компуктер под управлением Windows 10
И эти 2 штуки нужно как-то подружить (и вот только не предлагайте мне ESP шный блютуз - со скоростью у него еще хуже чем у ардуины - смотрите документацию прежде чем давать такие ценные советы). Пока единственное, что пришло в голову - написать программу которая будет читать видеопамять и слать данные в COM порт - если у Вас будут какие то другие идеи, пишите их в комментариях. Программа то собственно говоря почти готова (а ведь кто-то даже всерьез поверил, что Windows 10 может крутиться на Arduino )))
Для такого подключения обязательно потребуется некое Китайское гэ например USB-UART мост на PL2303
главное, чтобы на этом гэ стоял внешний кварц. CP210* - тот который например стоит в самой ESP32 в качестве USB-UART моста решительно не подойдет, так как он не умеет работать на таких высоких скоростях.
Для теста использовался 2-й аппаратный UART ESP32 настроенный на максимальную скорость (по документации 5Mbps)
Схема подключения стандартная:
UART0 используем для отладки/прошивки на скорости 115'200, UART2 для обмена данными с ПК на скорости 5'000'000.
Немножко занимательной математики - цветной дисплей с таким разрешением и на таких скоростях вряд-ли имеет смысл адресовать в формате 16bit на пиксель, цвет скорее всего придется порезать до 8bit. Итого:
1 Кадр 240*320 = 76800 байт - и это печалька-печальная, хотя в игры я на нем играть не собираюсь - для этого мини-ПК у меня есть другая бытовая задача.
Для отправки одного кадра расчетное время составит 154мс (если не понятно откуда цифры - рекомендую заглянуть в Википедию на счет протокола UART).
Но, это в теории - на практике же микроконтроллер в любом случае потратит какое то время на укладку этих данных в массив. (+ ядро для Arduino IDE предназначенное для домохозяек, чтобы они тоже могли мигать светодиодиками). С "форточками" попроще, там ресурсов много, всегда можно еще и в отдельный процесс какую-нибудь задачу запулить если долго выполняется, а вот не сложится ли пополам ESP32 от такого объема (да еще и в Arduino Wiring) - это вопрос, ради которого и писалась эта статья.
Тестовая программа написана на C# под дот нет. Содержит 2 батона. Нажатие на первый батон открывает COM порт. Клик по второму батону:
- заполняет массив размерностью 76800 байт случайными числами;
- для этого массива рассчитывается простая 8-ми битная контрольная сумма;
- массив отправляется в COM порт, к которому подключена ESP32 через Китайское гэ;
- рассчитанная контрольная сумма и время на которое винда потратила на отправку этого массива выводится в диалоговом окне.
В ESP32 данные сохраняются в оперативке (да, я знаю - не комильфо хранить такие размерности в куче - но у меня чип wroom, а PSRAM у него нетю). Отправив любой символ, в COM порт, через который плата прошивалась можно получить время выполнения и контрольную сумму сохраненных данных.
И оно работает однако. Время выполнения в и Windows и в ESP32 составляет 197ms, контрольные суммы совпадают (кнопку для проверки можно клацать сколько угодно - ведь массив каждый раз заполняется случайными значениями). Значение чуть больше расчетного, но это уже готовые данные которые можно использовать.
Весь код разбирать не буду - это же не так интересно как наматывание изоленты на лампочку,
но вот про то с чем просидел целый вечер - упомяну, так как про это вообще мало где пишут, а возможно Вам где-нибудь пригодится.
Такой объем данных не вычитать с помощью стандартной копипасты из Интернет вида:
Максимум сколько мне удавалась вытащить - примерно 490 байт, потом сбой. Сильно предполагаю, что не успевает метод Serial.read(); опустошать приемный буфер на таких высоких скоростях (даже если написать код так, что в этот момент программа ничем другим заниматься вообще не будет) - но это не точно.
Для шустрых задач с UART в Arduino Wiring есть более интересное решение:
Serial.readBytes();
Код который у меня заработал выглядит вот так:
Если поступили какие то данные - строка выделенная желтым цветом стопит программу и будет ждать все 76800 байт - пока полностью их не получит. Эта же строка и затолкает их в массив (inarr). Если же произойдет неведомая фигня и байт поступит меньше - функция отвалится по таймауту и программа продолжит работу дальше. Таймаут тоже можно настроить. Подробнее смотрите тут и тут. Короче штука полезная, сам ей часто пользуюсь - а в данном случае это вообще было единственное, что сработало.
Минус тоже очевиден - нельзя одновременно получать данные и сразу побайтно куда то их перенаправлять, но это не всегда бывает нужно, ну и таймаут нужно настраивать точно (он должен быть чуть больше, чем время за которое весь пакет данных гарантированно может быть принят).
Следующая статья будет посвящена работе с каким-нибудь TFT дисплеем (от использования готовой библиотеки в этом проекте скорее всего придется отказаться). Ну а потом как в том анекдоте:
— Дамы и господа, для того, чтобы помочь вам скоротать время полета, на борту нашего лайнера имеются библиотека, кинозал, три бара, ресторан, бассейн и два теннисных корта. А теперь я попрошу вас пристегнуть ремни безопасности, потому что сейчас вместе со всей этой фигней мы попытаемся взлететь!
Потянет ESP32 такой функционал или нет - мне пока не известно.
Не забывайте ставить лайки, а то скоро кажись на Дзен кроме наматывания изоленты на лампочки и другие части тела смотреть будет нечего.
Оглавление канала тут:
Всем удачи!