Это видео недоступно.
Сожалеем об этом.

Cloning Windows desktop image to external display using stm32 microcontroller USBFS

Поделиться
HTML-код
  • Опубликовано: 17 авг 2024
  • We display the Windows desktop image on an external display using a microcontroller. USB CDC Virtual COM Port, jpeg encoder and decoder. Cloning a Windows desktop image on a display connected to a microcontroller. Virtual COM port. JPEG encoding and decoding. The project demonstrates working with a virtual COM port. Play streaming video (motion jpeg). The server (computer) constantly takes screenshots of the desktop, encodes them in jpeg and transmits them to the client (microcontroller) via USB (virtual COM port). The microcontroller decodes the image and displays it on the display.
    What you will need:
    Development board based on stm32 - blackpill stm32f401ccu6
    Display - st7789 or ili9341 (and compatible with them. The project is built for the st7789 display!).
    How to use:
    1. Connect the display to the development board according to the connection table:
    LCD_DC PA2
    LCD_RES PA3
    LCD_CS PA4
    LCD_SCL PA5
    LCD_BLK PA6
    LCD_SDA PA7
    2. Connect the firmware microcontroller board to the USB connector of the computer (Release folder, firmware file stm32f401ccu6_usb_virtual_com_port.hex Attention: Firmware for the ST7789 display. When using the ILI9341 display, you must rebuild the project, specifying the required display parameters when calling the LCD_DisplayAdd function in main).
    3. Run the server program from the Terminal\Release\Terminal.exe folder (this is a computer project).
    4. Select the com port to which the microcontroller is connected. You can find out the required COM port from the device manager. It will be labeled as “USB serial device (COM number such and such)” in the “Ports (COM and LPT)” section.
    If everything is done correctly, then on the display connected to the microcontroller you will see a copy of the same image that you can see on the computer monitor.
    Author:
    dzen.ru/vadrov
    / @vadrov
    t.me/vadrov_ch...
    github.com/vadrov
    Project source code:
    github.com/vad...
    jpeg encoder:
    jpeg-compressor
    Public Domain or Apache 2.0, Richard Geldreich richgel99@gmail.com
    github.com/ric...
    #stm32
    #programming
    #jpeg
    00:00 Greetings and Merry Christmas.
    00:24 What will be used in the project.
    00:43 Hello to the “guys” from the comments about the hook (from the ECU review). 😉
    01:08 About the desire to surprise the audience. RUclips viewers (and others) love the show.
    01:40 What will be implemented in this “weekend” project.
    02:30 STM32CubeIDE. About setting up the display connection (setting up spi and gpio control outputs).
    04:43 About the indication of data reception/transmission via USB.
    05:06 About setting up USB. CDC class (Virtual Port Com).
    06:44 About interrupt priorities.
    07:20 Setting up core and peripheral clocking. USB operating condition.
    09:12 Project setup. Libraries for configuring and working with peripherals. Limitations of the USB Device driver from STM.
    11:29 Interrupt handlers: systick, dma, usb.
    12:48 Declaration and initialization of global variables, including the buffer for receiving data. Libraries connected to the project.
    17:01 Organization of data reception via USB in double buffer mode. CDC_Receive_FS handler. Batch reception. Signs of the last data packet for the current transmission (message).
    24:23 About the possibilities of overclocking the core of the m/c stm32f401ccu6. Software implementation. Restrictions when using a USB Device.
    26:01 Generating a message from the client to the server about the resolution of the display connected to the device and the maximum file size.
    30:50 Reception, decoding and display of images received from the server. Double buffer switching. Permission to receive a new data packet.
    35:50 The microcontroller is “not controlled by wiring”... 😉
    38:06 Visual Studio 2022. Program for server (computer). Why do we encode the image into jpeg, and not transmit it as a simple stream “as is”.
    41:21 Screenshots using GDI, scaling and encoding images to jpeg.
    41:44 Interpretation by the server of a message received from a client with jpeg encoding settings. Regular expressions. "Internal standards" of the project: format, resolution and file size.
    45:56 jpeg encoder. Thanks to its author.
    48:29 "Endless loop" of the server. The server adjusts the quality of jpeg encoding in order not to exceed the maximum file size. Minimum encoding quality. Consequences for the client if the server exceeds the maximum file size.
    51:44 Connecting a microcontroller to a computer. Detection of a serial device by the operating system. View Device Manager. Launch the server program and select the port to which the microcontroller is connected.
    54:13 Displaying a small copy of the desktop. Demonstration of work.

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

  • @VadRov
    @VadRov  7 месяцев назад +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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Thank You VADROV

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

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

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

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

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

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

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

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

  • @Seriyv0lk
    @Seriyv0lk 10 дней назад

    Плюсик)))

  • @user-mi1fk7uc8p
    @user-mi1fk7uc8p 7 месяцев назад

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

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

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

  • @user-fc2mb6lt6f
    @user-fc2mb6lt6f 7 месяцев назад +3

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

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

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

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

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

  • @user-ci4fz9co3b
    @user-ci4fz9co3b 7 месяцев назад +2

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

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

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

  • @user-us4vm6bm9o
    @user-us4vm6bm9o 7 месяцев назад

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    +

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

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

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

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

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

    +++

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

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

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

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

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

    +++++

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

    +

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

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

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

    +

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

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

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

    +

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

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