Это видео недоступно.
Сожалеем об этом.
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.
Таймкоды:
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
Что бы тараканчики на кухне не скучали включил им на ночь, пусть развлекаются😂
Товарищи, зафиксирован первый случай реального применения проекта! А то писали, мол, бесполезная ерунда (типа того). А тараканы они же жильцы-соседи и им положены все удобства. Там можно для них кинозал организовать, если дисплей в банку положить 😂Придется выпускать версию со звуком.
Емае , нормально ты так в своем познании преисполнился ,выглядит очень серьезно )). Если бы дисплей с тачем был , ты бы еще и курсором управлял небось...)) Очень мотивирует ,пойду "Hello World" в printf напишу .Спасибо
По секрету скажу, что давно поуправлял. С обратной связью, так сказать 😉
А я светодиодом по мигаю.
@@volodyabesfamilnyy5428 , кстати, светодиодом тоже можно по-разному помигать.
Молодец, очень даже здорово! Хотялось бы по просьбам трудяшихся, попросить запилить видосы по asm на stm32. Ибо сил читать нет, от слово вообще.
Спасибо. Я хотел запилить видосы по asm на stm. Даже материал в прошлом году набрасывал, ужимал и т.п. Шпаргалку готовил в форме презентации... Но материала там надо приложить море... На несколько часов. Статистика же просмотров и комментарии показывают (намекают), что asm практически никого не заинтересует. Вообще люди не любят смотреть такие видео. А видео, подобные этому, смотрят. Грубо говоря, я отниму от жизни некоторое значительное количество времени на видео по asm, а оно никому не надо, от слова "совсем". При этом видео по ASMу, по нормальному - это несколько часов тягомотины. Не зайдет оно. По ASMу чтива в форме PDF-ок в инете много. От просмотра видео точно легче не станет. В универе по ASMу целый курс. Тут в несколько видео не уложить. Тут сериал нужен...
Ну если гнаться за просмотрами, тогда нужно посадить тёлку в топике, каторая через каждые пять секунд крандашь раняет, а потом нагибается, что бы поднять. На вычислительную тематику, простой народ загнать не особо получится. разве что копи пастеров. Конечно мотериала много в тексте, и на англиском, однако читать, время займёт не мало. Да и расписовать особо не нужно команды, главное структуру обозреть, имена регистров адресациию, основные вызовы. Потом может самому пригодится. z80 - тоже есть почитать в инете, но видео всё же запилил. @@VadRov
нужно пороботать над картинками, без компресии каторые[bmp], что бы авто подгон делать под дисплей!@@VadRov
@@vsosacordeev , дело-то вовсе не в просмотрах, а в их качестве. Видео на полтора часа смотрят со средним временем просмотра не более 3 - 4 минут. Поэтому длинные видео снимать вообще смысла нет. В короткое не уложишься. Что касается того, что для себя пригодится, то у меня есть всегда "шпаргалка" под рукой и доки от ARMa. Если выкрою время, то попробую ролик заснять обзорный минут на 30. Может, кого и мотивирует изучать ASM. 🙂 Хотя, мне вчера писали, что ASM - путь для отсталых от цивилизации (типа того) 🙂 C z80 смысла сравнивать нет, как и с 8051. Материал по ARMу на порядки больше. Да, и архитектура с системой команд не чета вышеуказанным.
Спорить не буду! мне ещё лет 20 назад говарили тоже самое про асм, мол это путь в никуда. Это конечно меня смешило до не немогу, да и теперь, радует не мение. @@VadRov
Ну что сказать, круто, однозначно зачетная работа!
Да, знатная безделушка для разминки мозга😉
Реально удивил 😊
Да, я и сам до сих пор отойти не могу. ☺
очень интересно)
я думал что вы противник хал и лл) помню до этого писали только на регистрах.
Всему свое время. 🙂Ярым/отчаянным противником не был, тем более, LL. LL я наоборот, можно сказать, популяризирую у себя на канале. HAL, кстати, идеален для проектов "выходного дня", когда надо что-то быстро сделать и также быстро забыть. 🙂 Также HAL хорош в плане знакомства с исходным кодом, чтобы посмотреть как надо сделать и сделать по-своему. Писать драйвер на CMSIS/регистрах для USB F4 ради этой безделушки... Нет уж, увольте 😉А той скорости, что предоставляет стандартный драйвер, как я сказал в видео, вполне достаточно.
@@VadRov понял, я почему то думал что тру программисты противники хала)
@@openFrimeTv , все равно все стараются писать свои библиотеки, вынося "регистры" в отдельные функции, чтобы минимум переделок делать (и знать, где их быстро делать) при переходах от серии к серии и от м/к к м/к. При этом все равно часто пишут вспомогательные прослойки/переадресации типа структура-регистр-данные и т.п. Вы удивитесь, но ряд компаний (причем, достаточно крупных), нанимая embedded разработчиков на первое место в требования ставят "хорошие знания HAL". При этом Вы там никого не удивите, если на собеседовании скажете, что можете "прогать на регах и асме". 😒
Ожидал какой-то "магии", какого-то нестандартного решения вместо софта, который через ком-порт байты пересылает. Чего-то вроде драйвера на уровне, близком к ядру системы и очень оптимизированным и устройства, которое как-то читает буфер видеоядра и декодирует, чего-то такого. Бесконечный цикл в коде постоянно нагружает процессор, плюс тяжелые операции с изображением - существенный недостаток такого подхода
А смысл? Проект "выходного дня" того заслуживает, чтобы превратиться в проект "выходного месяца"? Можно было бы делать те же скриншоты, например, применяя DireсtX. Можно было бы написать поточное приложение под Windows. Можно было бы драйвер USB для м/к с нуля написать на CMSIS/регистрах. Можно было бы... и т.д. и т.п. А кому это надо? 99% код смотреть не будут, а посмотрят 1 минуту видео в конце, где будет тот же результат, что и без всего этого, что я перечислил, но с тем, что имеется по факту. Достаточно того, что был оптимизирован jpeg декодер. А теперь Вам главный вопрос. Вот все Вы правильно написали о своих ожиданиях. Внимание. Скорость передачи теоретическая для USB FS, если тупо гнать поток и не обрабатывать его (т.е. на стороне клиента вообще никаких задержек - он просто принимает и все) 12 Мбит/с. Разрешение нашего дисплея 240х240 пикселей по 2 байта на пиксель, итого 115200 байт в одном только кадре. Сколько кадров можно уложить в 12 Мбит/с, если не применять "тяжелых операций с изображением" (понятно, что мы даже вывести не успеем изображение на дисплей)? Как можно обойтись без "тяжелых операций с изображением" на стороне сервера/компьютера, если изображение надо масштабировать/уменьшать и применять специальные алгоритмы расчета цвета в каждой точке, чтобы изображение было внятным при таком значительном уменьшении? Так ли сильно нагружает бесконечный цикл процессор при передаче данных в порт в синхронном режиме? Асинхронный режим нагрузит меньше? И предлагаю Вам реализовать свои ожидания. С удовольствием посмотрел бы на реализацию. 🙂
Thank You VADROV
Интересный проект, Спасибо !
Надо будет поковыряться.
Пацаны сказали, не очень 😂
+ если сделать драйвер для линукса то можно с помощью одноплатников делать мини ноутбуки ( вариантов где нужен маленький компьютер и маленький ПК очень много)
Слишком ресурсоемкий вариант, да, и все-таки кодек с потерями, а не lossless.Для таких-целей проще написать на м/к с дисплеем программу терминал. Я делал давным-давно что-то подобное, сейчас уже и исходников не найду.
Плюсик)))
Это просто вау!
Ну, да, мы тут, в комментариях, уже договорились, что будем делать кинозал для тараканов на кухне. Так что, наверное, придется версию со звуком выпускать. 😂
Блин, прикольно, но зачем?) Вот честно, именно в f401, с таким экранчиком применения смысла нет, если же тупо не выводить по usb какую-нибудь информацию, которая, скорее всего, никому не нужна, ибо usb лишний раз занимает. С каким-нибудь H7 мк еще понимаю, там хоть интерфейсы есть нормальные для вывода на экран, и то, там этого мк на нормальное разрешение не хватит. А так, если тупо поставить в какой-нибудь умный дом по приколу выключать компьютер малым.... Но есть и другие методы решения подобных задач... Короче, прикольное сотрясание воздуха)))
Правильно. Поэтому было сказано, что "шоу" (1:33). С таким дисплеем можно только внешний "эффектный" системный монитор сделать. Но я не фанат. 🙂
Круто !!!спасибо за работу !!!!
Шустро блин JPG декодируется, камень то слабенький. Помню как-то библиотеку от Чана запускал на 407-м, как-то заметно экранчик 320-480 отрисовывался, а там 168 МГц. Хороший проект выходного дня надо покопаться, познавательно.
Покопайтесь. Там я "немного" постарался, переписывая/оптимизируя код. Оттенки серого вообще летают 😉Ассемблер, DMA и двойная буферизация творят чудеса. Можете проект видеоплеера на этом камне посмотреть. Так, там еще и mp3 из avi до кучи к видео декодируется, плюс отрисовывается (самописным построчным рендером) OSD меню.
Интересная работа. Можно ли её реализовать на ESP32 под Arduino IDE?
На Arduino, наверное, строчек 20-30 кода + подключение библиотек.
хорош! лайк и подписка :)
Вот спасибо! 👍
Было бы классно, на регистрах показать как юзб настроить. Особенно таблица интересует.
Просто осваиваю сейчас risc-v, и там затык у меня. А они на 103 очень похожи... Ну или от короткой чайной лекции я бы не отказался. Нагло, знаю
Куда написать с вопросом о разработке?
Это смотря, что за вопрос. Тут есть ссылка на почту или VK www.youtube.com/@VadRov/community
+
Всех "возьму на карандаш", кто "+" не поставил 🙂
Я даже досматривать не стал. Я расстроился.
+++
++++++++++++++++++++++
Вижу, вижу 👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍 Сколько смог 🙂
+++++
+
Всех вижу, кто смотрит 😉
+
Вижу, вижу кто смотрел.👌
+
Спасибо, что дошли до "маркера" 🙂