Хабрахабр

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

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

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

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

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

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

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

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

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

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

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

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

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

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть