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

в 23:19, , рубрики: C#, stm32, веб-камера, Компьютерное железо, Работа с видео

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Автор: karpesh94

Источник


* - обязательные к заполнению поля