Управляем фокусом или щепотка C# и STM32 для веб-камеры

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Все началось весьма забавно. У меня к компьютеру были подключены две веб-камеры от производителя Logitech (модель C525). Вполне неплохие камеры, но, как оказалось позже, с драйверами весьма сомнительного качества. На самом деле это проблема не только данного производителя. Их утилита настройки подменяет собой системную, но при этом даже и не подозревает, что у компьютера может быть более одной камеры этой модели. В результате, при вызове окна настроек для разных камер из OBS Studio фокус менялся всегда у одной. Непорядок.


В свое время много играл с захватом и трансляцией камер в VLC. Из его интерфейса узнал про DirectShow. Разрабатывать решил на C#, несмотря на отсутствие опыта (лабы в универе считать не будем). Буквально за вечер набросал TrackBar-ов для всех обнаруженных камер и счастью не было предела. Скинул утилитку паре знакомых видеоблогеров для использования на стримах.



Далее от них поступил запрос на расширение функционала. Добавить регулировку баланса белого. Тогда почему бы не дать пользователю самому выбирать те параметры, которые нужны именно ему? Для каждой камеры отдельно. С этого момента появились вкладки. Первая — общая, с избранными параметрами, и по вкладке на каждую обнаруженную веб-камеру.



Правда, далеко не все параметры поддерживаются камерой. Всего 3 состояния: недоступно, только ручная регулировка, ручная и автоматическая регулировка. Есть ещё и только автоматическая, но не помню, чтобы от какого-то устройства получал такое. Соответственно, некоторые строки оказываются выключенными. Для ноутбучных камер, например, половина списка, связанная с настройками захвата, недоступна. А вот коррекция уже есть.


Во время реализации «вкладочного интерфейса» пришла в голову мысль: приделать энкодер. В зеркальных камерах крутить кольцо фокуса то очень удобно. А вот в веб-камеры не завезли. Так к проекту подключились малютки STM32F070. Это самые маленькие чипы с поддержкой USB 2.0. На хабре уже есть неплохая статья про Custom HID, так что подробное описание этого пункта можно пропустить. Схема устройства крайне простая. Никакая обвязка для этого микроконтроллера не нужна. Только вот заводить встроенный генератор на PLL он не умеет, так что кварц обязателен. Из элементов контроля, кроме энкодера, имеются 4 кнопки. Одна из них встроена в энкодер. Такие сейчас очень распространены. О назначении каждой будет чуть позже.



Для отладки софта были спаяны два экземпляра HID устройства. Но собраны они практически на макетке. На самом деле это платки для Pinboard II. Зря я при их разводке сразу не добавил USB порт и линейный стабилизатор. Выглядело бы менее колхозно (нет). В готовом же устройстве планируется разместить платку в держатель камеры на штатив. Разумеется, напечатанный на 3D принтере. Чтобы к камере вел всего один провод можно там же разместить и USB хаб. Например, FE1.1s не намного больше STM32. Но честные 480 Мегабит. В общем, реализация железа — вопрос все ещё открытый.


Желающие повторить могут скачать исходники из репозитория. Стоимость железки по компонентам — условно 100 рублей, 55 из которых «съедает» микроконтроллер. В моем случае стоит кварц на 20 мегагерц, но это «что было в закромах». Меняйте номинал, но перенастройте систему тактирования, чтобы USB модуль все устраивало.



Теперь о назначении аппаратных кнопок. Встроенная в энкодер возвращает параметр в автоматический режим, если это возможно. Вращение же переводит в ручной. Так как пользователю доступна регулировка нескольких параметров, то между ними нужно переключаться. Кнопка S1 отвечает за циклический перебор параметров, а на S2 и S3 можно назначить определенные, чтобы не отвлекаться на окно программы, проверяя выбранный параметр.


Индикация служит для идентификации устройств. На вкладке камеры можно привязать HID устройство к конкретной камере. Светодиод загорается при выборе в выпадающем списке. На схеме предусмотрен светодиод с двумя кристаллами в одном корпусе, но все его возможности не используюся. Оставлен на будущее.


Каждое HID устройство имеет свой уникальный серийный номер, который отдается по USB. Именно он и отображается в списке. Уникальность номеров обеспечивается идентификатором самого микроконтроллера. Это дата производства и его место на пластине. Весьма забавный метод формирования. Хотя в INI файле сохраняется вовсе не серийный номер, а путь до устройства (содержит VID,PID и GUID). Все настройки вполне читаемы, так что файлик можно редактировать и блокнотом. Но зачем.


Отвал камеры — штука вообще неприятная. OBS Studio, например, оставляет последний кадр. Иногда сразу и не замечаешь поломки. Так что шлем уведомления. Вообще, обработка подключения новых и переподключения уже имеющихся устройств была самой сложной задачей. Как веб-камер, так и HID. В основном первое. Сказалось отсутствие опыта программирования на C#. Надо бы книжку какую нибудь почитать… Сколько же стримов прошло, пока оно все же заработало… Процесс транслировался на YouTube, где зрители периодически подсказывали как по коду, так и по функционалу приложения. Это очень удобно. Коллективный разум.


Вот так, из-за косых драйверов, появляются такие поделки. Разумеется, со временем будет допиливаться, отлаживаться, так что ссылка на репозиторий.

Источник: https://habr.com/ru/post/463595/


Интересные статьи

Интересные статьи

Как известно, старшие STM'ки имеют приличные частоты и объёмы ОЗУ. Ну а раз так, то почему бы не запустить 3D-графику на таких контроллерах? Да нет ничего проще! Читать дальше → ...
Что за бред, подумаете вы. Что за бессмысленный набор слов? Но, увы или ура — кому как, сегодня это уже не бред, а реальность. Речь в статье пойдет о написанной мной для Инстаграм игре, в котор...
В прошлый раз мы осваивали создание нового проекта при помощи STM CubeMX первую часть можно найти здесь. Для тех, кому лень перечитывать — закончилось все тем, что пустой проект успешно собрался...
В данной статье мы продолжаем рассказывать про работу с Windows Server Core 2019. В прошлых постах мы рассказали как готовим клиентские виртуальные машины на примере нашего нового тарифа VDS Ultr...
Компании растут и меняются. Если для небольшого бизнеса легко прогнозировать последствия любых изменений, то у крупного для такого предвидения — необходимо изучение деталей.