Все началось весьма забавно. У меня к компьютеру были подключены две веб-камеры от производителя 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, где зрители периодически подсказывали как по коду, так и по функционалу приложения. Это очень удобно. Коллективный разум.


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

Комментарии (5)


  1. Old_Joe
    14.08.2019 21:57

    Интересная разработка.

    Кнопки я бы сделал через АЦП, не ограничиваясь тремя штуками…


  1. Grarg
    17.08.2019 10:07

    Вопрос не по теме поста, но может добрые олды подскажут где трабла?
    Сразу оговорюсь, я нуб в STM32, но всеми силами пытаюсь этот недостаток исправить.
    По теме: Уже 3 недели ковыряю «народный» stm32f103c8, дро... мучаю регистры тактирования, но не могу увидеть заветные 72МГц. Писал в Keil, IAR, использовал разные библиотеки CMSIS… Тестовая задача такова: в цикле инкрементация переменной, при достижении необходимой задержки моргание светодиода (Хэлло, ворлд))) ). Методом тыка и секундомера вычислил что частота APB шины колеблется около 4МГц… И это с HSE и PLLx9-15
    Внимание вопрос — Инкрементация в 32 битном АРМ проходит за 1 такт? Потому что за неимением осциллографа приходится считать частоту на пальцах)).
    Второй вопрос, если по моим странным расчётам частота источника ~400 КГц, то куда копать? Сразу говорю, HSE и PLL запускаются и переключаются 100%.
    Заранее спасибо, если есть дельные мысли))


    1. walhi Автор
      17.08.2019 10:09

      Что мешает использовать CubeMX для генерации кода инициализации клокера? Плюс не забывайте, что на операции jmp и проверки тоже тратятся такты процессора. Ещё GPIO не в состоянии надергать 72мгц.


      1. Grarg
        17.08.2019 10:50

        Это я учитывал, так что если бы получил частоту ~в 2 раза ниже расчитанной не расстроился бы. По поводу GPIO не совсем правильно сказано. Все операции проводятся от шины APB в процесоре, на GPIO комманда выводится раз в секунду)).
        Сейчас от отчаяния задал точно такую задачу не менее народной ардунине)). Она, 8 битная, с более старой архитектурой, кодом загаженным встроенными «оптимизациями», на кварце 16 МГц показал результат лишь в 2 раза медленнее чем STM со всеми включенными ускорениями… А это доказывает, что что то тут не так…


        1. walhi Автор
          17.08.2019 11:39

          Не понял про CubeMX/CubeIDE. Клокер инициализируется ручками? Отсутствие осциллографа можно немного компенсировать второй STMкой. Таймер по DMA может в память класть значение счетчика по фронтам сигнала. Звуковушку не предлагаю, так как там всего 44 кгц частота дискретизации. ARMы штука сложная. Я вот пилю эмулятор флопаря для компьютера Apple2 на STM32F103Cx и не могу реализовать запись. Чтение дискеты уже давно работает, а вот захватить сигнал 250 килобит в секунду ну вообще не получается. Хотя у Японца на AVR тоже получилось.