Cloning Windows desktop image to external display using stm32 microcontroller USBFS

Поделиться
HTML-код
  • Опубликовано: 15 дек 2024

Комментарии • 59

  • @VadRov
    @VadRov  11 месяцев назад +4

    Таймкоды:
    00:00 Приветствие и поздравление с Рождеством.
    00:24 Что будет использоваться в проекте.
    00:43 Привет "пацанам" из комментариев про крючок (из обзора ЭБУ). 😉
    01:08 Про желание удивить зрителей. Зрители RUclips (и не только) любят "шоу".
    01:40 Что будет реализовано в этом проекте "выходного дня".
    02:30 STM32CubeIDE. Про настройку подключения дисплея (настройка spi и управляющих выходов gpio).
    04:43 Про индикацию приема/передачи данных по USB.
    05:06 Про настройку USB. Класс CDC (Virtual Port Com).
    06:44 Про приоритеты прерываний.
    07:20 Настройка тактирования ядра и периферии. Условие работы USB.
    09:12 Настройка проекта. Библиотеки для настройки и работы с периферией. Ограничения драйвера USB Device от STM.
    11:29 Обработчики прерываний: systick, dma, usb.
    12:48 Объявление и инициализация глобальных переменных, в том числе, буфера для приема данных. Подключаемые к проекту библиотеки.
    17:01 Организация приема данных по USB в режиме двойного буфера. Обработчик CDC_Receive_FS. Пакетный прием. Признаки последнего пакета данных для текущей передачи (сообщения).
    24:23 О возможностях разгона ядра м/к stm32f401ccu6. Программная реализация. Ограничения в случае использования USB Device.
    26:01 Формирование сообщения от клиента серверу о разрешении дисплея, подключенного к м/к, и максимальном размере файла.
    30:50 Прием, декодирование и вывод на дисплей изображений, полученных от сервера. Переключение двойного буфера. Разрешение на прием нового пакета данных.
    35:50 Микроконтроллер "не управляется по проводкам"... 😉
    38:06 Visual Studio 2022. Программа для сервера (компьютера). Почему кодируем изображение в jpeg, а не передаем простым потоком "как есть".
    41:21 Скриншоты с использованием GDI, масштабирование и кодирование изображений в jpeg.
    41:44 Интерпретация сервером сообщения, полученного от клиента, с настройками jpeg кодирования. Регулярные выражения. "Внутренние стандарты" проекта: формат, разрешение и размер файла.
    45:56 Кодер jpeg. Спасибо его автору.
    48:29 "Бесконечный цикл" сервера. Подстройка сервером качества кодирования jpeg в целях не превышения максимального размера файла. Минимальное качество кодирования. Последствия для клиента при превышении сервером максимального размера файла.
    51:44 Подключение микроконтроллера к компьютеру. Обнаружение операционной системой устройства с последовательным интерфейсом. Просмотр диспетчера устройств. Запуск серверной программы и выбор порта, к которому подключен микроконтроллер.
    54:13 Вывод на дисплей уменьшенной копии рабочего стола. Демонстрация работы.
    Выводим изображение рабочего стола Windows на внешний дисплей с помощью микроконтроллера. USB CDC Virtual COM Port, кодер и декодер jpeg. Клонирование изображения рабочего стола Windows на дисплее, подключенном к микроконтроллеру. Виртуальный COM порт. JPEG кодирование и декодирование. Проект демонстрирует работу с виртуальным COM портом. Воспроизведение потокового видео (motion jpeg). Сервер (компьютер) постоянно делает скриншоты рабочего стола, кодирует их в jpeg и передает клиенту (микроконтроллеру) через USB (виртуальный COM порт). Микроконтроллер декодирует изображение и отображает его на дисплее.
    Что потребуется:
    Отладочная плата на базе stm32 - blackpill stm32f401ccu6
    Дисплей - st7789 или ili9341 (и совместимые с ними. Проект собран для дисплея st7789!).
    Как использовать:
    1. Подключите дисплей к отладочной плате согласно таблице подключений:
    LCD_DC PA2
    LCD_RES PA3
    LCD_CS PA4
    LCD_SCL PA5
    LCD_BLK PA6
    LCD_SDA PA7
    2. Подключите прошитую плату микроконтроллера к USB разъему компьютера (папка Release, файл для прошивки stm32f401ccu6_usb_virtual_com_port.hex Внимание. Прошивка для дисплея ST7789. При использовании дисплея ILI9341 необходимо пересобрать проект, указав требуемые параметры дисплея при вызове функции LCD_DisplayAdd в main).
    3. Запустите серверную программу из папки Terminal\Release\Terminal.exe (это проект для компьютера).
    4. Выберите com-порт, к которому подключен микроконтроллер. Узнать требуемый COM порт можно из диспетчера устройств. Он будет подписан, как "Устройство с последовательным интерфейсом USB (COM номер такой-то)" в разделе "Порты (COM и LPT)".
    Если все сделано правильно, то на дисплее, подключенном к микроконтроллеру, вы увидите копию того же изображения, что можете наблюдать на мониторе компьютера.
    Автор:
    dzen.ru/vadrov
    www.youtube.com/@VadRov
    t.me/vadrov_channel
    github.com/vadrov
    Исходный код проекта:
    github.com/vadrov/stm32f401ccu6-usb-vcp-clone-windows-desktop-to-display
    Кодер jpeg:
    jpeg-compressor
    Public Domain or Apache 2.0, Richard Geldreich
    github.com/richgel999/jpeg-compressor

  • @vsosacordeev
    @vsosacordeev 11 месяцев назад

    Молодец, очень даже здорово! Хотялось бы по просьбам трудяшихся, попросить запилить видосы по asm на stm32. Ибо сил читать нет, от слово вообще.

    • @VadRov
      @VadRov  11 месяцев назад

      Спасибо. Я хотел запилить видосы по asm на stm. Даже материал в прошлом году набрасывал, ужимал и т.п. Шпаргалку готовил в форме презентации... Но материала там надо приложить море... На несколько часов. Статистика же просмотров и комментарии показывают (намекают), что asm практически никого не заинтересует. Вообще люди не любят смотреть такие видео. А видео, подобные этому, смотрят. Грубо говоря, я отниму от жизни некоторое значительное количество времени на видео по asm, а оно никому не надо, от слова "совсем". При этом видео по ASMу, по нормальному - это несколько часов тягомотины. Не зайдет оно. По ASMу чтива в форме PDF-ок в инете много. От просмотра видео точно легче не станет. В универе по ASMу целый курс. Тут в несколько видео не уложить. Тут сериал нужен...

    • @vsosacordeev
      @vsosacordeev 11 месяцев назад

      Ну если гнаться за просмотрами, тогда нужно посадить тёлку в топике, каторая через каждые пять секунд крандашь раняет, а потом нагибается, что бы поднять. На вычислительную тематику, простой народ загнать не особо получится. разве что копи пастеров. Конечно мотериала много в тексте, и на англиском, однако читать, время займёт не мало. Да и расписовать особо не нужно команды, главное структуру обозреть, имена регистров адресациию, основные вызовы. Потом может самому пригодится. z80 - тоже есть почитать в инете, но видео всё же запилил. @@VadRov

    • @vsosacordeev
      @vsosacordeev 11 месяцев назад

      нужно пороботать над картинками, без компресии каторые[bmp], что бы авто подгон делать под дисплей!@@VadRov

    • @VadRov
      @VadRov  11 месяцев назад

      @@vsosacordeev , дело-то вовсе не в просмотрах, а в их качестве. Видео на полтора часа смотрят со средним временем просмотра не более 3 - 4 минут. Поэтому длинные видео снимать вообще смысла нет. В короткое не уложишься. Что касается того, что для себя пригодится, то у меня есть всегда "шпаргалка" под рукой и доки от ARMa. Если выкрою время, то попробую ролик заснять обзорный минут на 30. Может, кого и мотивирует изучать ASM. 🙂 Хотя, мне вчера писали, что ASM - путь для отсталых от цивилизации (типа того) 🙂 C z80 смысла сравнивать нет, как и с 8051. Материал по ARMу на порядки больше. Да, и архитектура с системой команд не чета вышеуказанным.

    • @vsosacordeev
      @vsosacordeev 11 месяцев назад

      Спорить не буду! мне ещё лет 20 назад говарили тоже самое про асм, мол это путь в никуда. Это конечно меня смешило до не немогу, да и теперь, радует не мение. @@VadRov

  • @ebjikkolu4757
    @ebjikkolu4757 11 месяцев назад +2

    Емае , нормально ты так в своем познании преисполнился ,выглядит очень серьезно )). Если бы дисплей с тачем был , ты бы еще и курсором управлял небось...)) Очень мотивирует ,пойду "Hello World" в printf напишу .Спасибо

    • @VadRov
      @VadRov  11 месяцев назад

      По секрету скажу, что давно поуправлял. С обратной связью, так сказать 😉

    • @volodyabesfamilnyy5428
      @volodyabesfamilnyy5428 11 месяцев назад

      А я светодиодом по мигаю.

    • @VadRov
      @VadRov  11 месяцев назад

      @@volodyabesfamilnyy5428 , кстати, светодиодом тоже можно по-разному помигать.

  • @Drex_Andrey
    @Drex_Andrey 11 месяцев назад

    Ну что сказать, круто, однозначно зачетная работа!

    • @VadRov
      @VadRov  11 месяцев назад +1

      Да, знатная безделушка для разминки мозга😉

  • @ivanivanov6559
    @ivanivanov6559 4 дня назад

    огромный плюс😊

  • @openFrimeTv
    @openFrimeTv 11 месяцев назад

    очень интересно)
    я думал что вы противник хал и лл) помню до этого писали только на регистрах.

    • @VadRov
      @VadRov  11 месяцев назад

      Всему свое время. 🙂Ярым/отчаянным противником не был, тем более, LL. LL я наоборот, можно сказать, популяризирую у себя на канале. HAL, кстати, идеален для проектов "выходного дня", когда надо что-то быстро сделать и также быстро забыть. 🙂 Также HAL хорош в плане знакомства с исходным кодом, чтобы посмотреть как надо сделать и сделать по-своему. Писать драйвер на CMSIS/регистрах для USB F4 ради этой безделушки... Нет уж, увольте 😉А той скорости, что предоставляет стандартный драйвер, как я сказал в видео, вполне достаточно.

    • @openFrimeTv
      @openFrimeTv 11 месяцев назад

      @@VadRov понял, я почему то думал что тру программисты противники хала)

    • @VadRov
      @VadRov  11 месяцев назад

      @@openFrimeTv , все равно все стараются писать свои библиотеки, вынося "регистры" в отдельные функции, чтобы минимум переделок делать (и знать, где их быстро делать) при переходах от серии к серии и от м/к к м/к. При этом все равно часто пишут вспомогательные прослойки/переадресации типа структура-регистр-данные и т.п. Вы удивитесь, но ряд компаний (причем, достаточно крупных), нанимая embedded разработчиков на первое место в требования ставят "хорошие знания HAL". При этом Вы там никого не удивите, если на собеседовании скажете, что можете "прогать на регах и асме". 😒

  • @yuriykandiba213
    @yuriykandiba213 11 месяцев назад

    Круто !!!спасибо за работу !!!!

  • @zheigurov
    @zheigurov 11 месяцев назад +2

    Реально удивил 😊

    • @VadRov
      @VadRov  11 месяцев назад +2

      Да, я и сам до сих пор отойти не могу. ☺

  • @sergatmel8242
    @sergatmel8242 11 месяцев назад

    Интересный проект, Спасибо !
    Надо будет поковыряться.

    • @VadRov
      @VadRov  11 месяцев назад

      Пацаны сказали, не очень 😂

  • @yl923
    @yl923 11 месяцев назад +1

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

    • @VadRov
      @VadRov  11 месяцев назад +3

      Товарищи, зафиксирован первый случай реального применения проекта! А то писали, мол, бесполезная ерунда (типа того). А тараканы они же жильцы-соседи и им положены все удобства. Там можно для них кинозал организовать, если дисплей в банку положить 😂Придется выпускать версию со звуком.

  • @АдмиралХиппер
    @АдмиралХиппер 11 месяцев назад

    Это просто вау!

    • @VadRov
      @VadRov  11 месяцев назад +2

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

  • @nobodyfreeman6505
    @nobodyfreeman6505 11 месяцев назад

    + если сделать драйвер для линукса то можно с помощью одноплатников делать мини ноутбуки ( вариантов где нужен маленький компьютер и маленький ПК очень много)

    • @VadRov
      @VadRov  11 месяцев назад

      Слишком ресурсоемкий вариант, да, и все-таки кодек с потерями, а не lossless.Для таких-целей проще написать на м/к с дисплеем программу терминал. Я делал давным-давно что-то подобное, сейчас уже и исходников не найду.

  • @ismailalhajji
    @ismailalhajji 10 месяцев назад

    Thank You VADROV

  • @sharphurt8753
    @sharphurt8753 11 месяцев назад +1

    Ожидал какой-то "магии", какого-то нестандартного решения вместо софта, который через ком-порт байты пересылает. Чего-то вроде драйвера на уровне, близком к ядру системы и очень оптимизированным и устройства, которое как-то читает буфер видеоядра и декодирует, чего-то такого. Бесконечный цикл в коде постоянно нагружает процессор, плюс тяжелые операции с изображением - существенный недостаток такого подхода

    • @VadRov
      @VadRov  11 месяцев назад +4

      А смысл? Проект "выходного дня" того заслуживает, чтобы превратиться в проект "выходного месяца"? Можно было бы делать те же скриншоты, например, применяя DireсtX. Можно было бы написать поточное приложение под Windows. Можно было бы драйвер USB для м/к с нуля написать на CMSIS/регистрах. Можно было бы... и т.д. и т.п. А кому это надо? 99% код смотреть не будут, а посмотрят 1 минуту видео в конце, где будет тот же результат, что и без всего этого, что я перечислил, но с тем, что имеется по факту. Достаточно того, что был оптимизирован jpeg декодер. А теперь Вам главный вопрос. Вот все Вы правильно написали о своих ожиданиях. Внимание. Скорость передачи теоретическая для USB FS, если тупо гнать поток и не обрабатывать его (т.е. на стороне клиента вообще никаких задержек - он просто принимает и все) 12 Мбит/с. Разрешение нашего дисплея 240х240 пикселей по 2 байта на пиксель, итого 115200 байт в одном только кадре. Сколько кадров можно уложить в 12 Мбит/с, если не применять "тяжелых операций с изображением" (понятно, что мы даже вывести не успеем изображение на дисплей)? Как можно обойтись без "тяжелых операций с изображением" на стороне сервера/компьютера, если изображение надо масштабировать/уменьшать и применять специальные алгоритмы расчета цвета в каждой точке, чтобы изображение было внятным при таком значительном уменьшении? Так ли сильно нагружает бесконечный цикл процессор при передаче данных в порт в синхронном режиме? Асинхронный режим нагрузит меньше? И предлагаю Вам реализовать свои ожидания. С удовольствием посмотрел бы на реализацию. 🙂

  • @WWolf_13
    @WWolf_13 11 месяцев назад

    хорош! лайк и подписка :)

    • @VadRov
      @VadRov  11 месяцев назад +1

      Вот спасибо! 👍

  • @Полундрааа
    @Полундрааа 11 месяцев назад +3

    Блин, прикольно, но зачем?) Вот честно, именно в f401, с таким экранчиком применения смысла нет, если же тупо не выводить по usb какую-нибудь информацию, которая, скорее всего, никому не нужна, ибо usb лишний раз занимает. С каким-нибудь H7 мк еще понимаю, там хоть интерфейсы есть нормальные для вывода на экран, и то, там этого мк на нормальное разрешение не хватит. А так, если тупо поставить в какой-нибудь умный дом по приколу выключать компьютер малым.... Но есть и другие методы решения подобных задач... Короче, прикольное сотрясание воздуха)))

    • @VadRov
      @VadRov  11 месяцев назад +3

      Правильно. Поэтому было сказано, что "шоу" (1:33). С таким дисплеем можно только внешний "эффектный" системный монитор сделать. Но я не фанат. 🙂

  • @АлександрДаскаль-е6т
    @АлександрДаскаль-е6т 11 месяцев назад +2

    Шустро блин JPG декодируется, камень то слабенький. Помню как-то библиотеку от Чана запускал на 407-м, как-то заметно экранчик 320-480 отрисовывался, а там 168 МГц. Хороший проект выходного дня надо покопаться, познавательно.

    • @VadRov
      @VadRov  11 месяцев назад +3

      Покопайтесь. Там я "немного" постарался, переписывая/оптимизируя код. Оттенки серого вообще летают 😉Ассемблер, DMA и двойная буферизация творят чудеса. Можете проект видеоплеера на этом камне посмотреть. Так, там еще и mp3 из avi до кучи к видео декодируется, плюс отрисовывается (самописным построчным рендером) OSD меню.

  • @cogito-ai
    @cogito-ai 11 месяцев назад

    Куда написать с вопросом о разработке?

    • @VadRov
      @VadRov  11 месяцев назад

      Это смотря, что за вопрос. Тут есть ссылка на почту или VK www.youtube.com/@VadRov/community

  • @ИванИванов-п2ю6г
    @ИванИванов-п2ю6г 11 месяцев назад

    Интересная работа. Можно ли её реализовать на ESP32 под Arduino IDE?

    • @VadRov
      @VadRov  11 месяцев назад

      На Arduino, наверное, строчек 20-30 кода + подключение библиотек.

  • @Seriyv0lk
    @Seriyv0lk 4 месяца назад

    Плюсик)))

  • @DiFroll
    @DiFroll 9 месяцев назад

    Было бы классно, на регистрах показать как юзб настроить. Особенно таблица интересует.
    Просто осваиваю сейчас risc-v, и там затык у меня. А они на 103 очень похожи... Ну или от короткой чайной лекции я бы не отказался. Нагло, знаю

  • @volodyabesfamilnyy5428
    @volodyabesfamilnyy5428 11 месяцев назад

    Я даже досматривать не стал. Я расстроился.

  • @DjSasMaster
    @DjSasMaster 11 месяцев назад +1

    ++++++++++++++++++++++

    • @VadRov
      @VadRov  11 месяцев назад

      Вижу, вижу 👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍 Сколько смог 🙂

  • @marsikovsergey
    @marsikovsergey 11 месяцев назад

    +++

  • @vsosacordeev
    @vsosacordeev 11 месяцев назад

    +++++

  • @ibnhohan
    @ibnhohan 11 месяцев назад

    +

    • @VadRov
      @VadRov  11 месяцев назад

      Спасибо, что дошли до "маркера" 🙂

  • @sergeykhirya4157
    @sergeykhirya4157 11 месяцев назад

    +

    • @VadRov
      @VadRov  11 месяцев назад

      Вижу, вижу кто смотрел.👌

  • @rassuljenaliyev3021
    @rassuljenaliyev3021 11 месяцев назад

    +

    • @VadRov
      @VadRov  11 месяцев назад

      Всех вижу, кто смотрит 😉

  • @deniskaigorodov3539
    @deniskaigorodov3539 11 месяцев назад +1

    +

    • @VadRov
      @VadRov  11 месяцев назад

      Всех "возьму на карандаш", кто "+" не поставил 🙂