Моя первая ардуинка: переключатель usb

Содержание

Элементная база

Моё первое представление, составленное со слов друга, сводилось к тому, что для решения моей задачи достаточно будет подключить к контроллеру один или несколько шилдов с достаточным количеством USB-разъёмов, кнопок и индикаторов, а потом запрограммировать контроллер так, чтобы обеспечить коммутацию пакетов USB. Это оказалось неверным по нескольким причинам.

  1. Шилды с мастер-разъёмами USB предназначены для того, чтобы контроллер мог сам опрашивать подключенную к ним периферию, выступая ведущим устройством на шине. При этом непосредственно в формировании и разборе пакетов Arduino не участвует — это делает сторонняя микросхема.

  2. Слэйв-разъёмы предназначены почти исключительно для прошивки и отладки контроллера, а за коммуникацию по ним отвечает не сам контроллер, а отдельная микросхема, обеспечивающая конвертацию серийных протоколов и определяющаяся как COM-порт. Заставить её вместо этого представиться USB-хабом и начать пропускать пакеты от других устройств невозможно.

  3. Сами контроллеры не применяются для коммутации пакетов, и я не уверен, что мне с моим нулевым опытом на этой платформе удалось бы решить эту задачу, равно как и что она вообще имеет решение.

В этот момент я понял, что придётся паять. Опыта самоделок такого уровня у меня не было — тем выше был соблазн попробовать.

Идея состояла в том, чтобы взять два обычных хаба USB 2.0 (в сборе либо в виде микросхем) и под управлением Arduino коммутировать связи между ними и внешними устройствами, добиваясь того же эффекта, как если бы я вручную перетыкал разъёмы. Прежде всего это касается пары сигнальных проводов, поскольку подачу питания можно организовать отдельно. Вооружившись каталогом одного из магазинов радиодеталей, я приступил к поискам подходящей элементной базы.

Найти контроллеры хабов USB в таком виде, чтобы их можно было распаять на плате, мне не удалось — возможно, потому, что я неправильно искал. Поэтому я просто зашёл в компьютерный магазин рядом с домом и купил два самых простых и дешёвых хаба. Дома я вскрыл корпуса, извлёк из них платы и удалил с них разъёмы. Остались небольшие (примерно 2 на 8 сантиметров) панели, которые можно спрятать в корпус устройства, соединив с остальными компонентами монтажным проводом.

С коммутирующими элементами мне повезло больше — на глаза попался переключатель шины FST3125. Он представляет собой четыре ключа, каждый из которых замыкает либо размыкает два вывода:

FST3125

Подключив через него мышь, я с удовольствием обнаружил, что всё работает.

Несложный подсчёт показывает, что одной такой микросхемы достаточно для переключения пары выводов D+ и D- одного устройства USB между двумя источниками. Стало быть, для управления одним каналом коммутации требуется два бита (или два вывода ардуинки):

Прямое управление ключами

Тем не менее, напрямую подавать управляющий сигнал от контроллера к коммутатору мне не хотелось. Дело в том, что, помимо трёх нужных мне состояний («отключено», «подключено к первому источнику», «подключено ко второму источнику»), такая схема подключения даёт возможность открыть все ключи одновременно (например, из-за ошибки в программе или во время загрузки, когда значения выходных сигналов ещё не выставлены), что приведёт к соединению шин данных сразу трёх устройств, два из которых являются ведущими. Чтобы избежать такого сценария, я вставил между ардуинкой и коммутатором аппаратную логику, исключающую возможность одновременного открытия всех ключей:

Подключение FST3125, исключающее одновременное открытие всех ключей

Инвертор перед нижним элементом ИЛИ позволяет сигналу «SIDE» выбирать группу ключей, которая будет открыта. В то же время, высокий сигнал на входе «ON» отключает все ключи сразу.

В качестве контроллера я взял Arduino Nano. Питание на него я подал через пин +5V, а вообще подачу питания организовал через пятивольтовые механические реле V23079A1001B301 (почему не через полупроводники — расскажу ниже). Светодиоды взял первые попавшиеся — убедившись, что через 220-омные резисторы ток и яркость получаются адекватными. Управление яркостью светодиодов взяли на себя встроенные ШИМы контроллера.

Поскольку ножек у Ардуинки не хватало, управление светодиодами (а также некоторой другой логикой на плате, см. ниже) я организовал через микросхемы серии AC32 (на макетке пробовал сначала DIP-исполнение, а потом перешёл на SOIC). Кроме того, в нескольких местах используются инверторы — модели LS04.

Есть третий вариант, самый сложный.

Когда у вас, допустим, компьютер, TV ресивер, игровая консоль или две, но потребляете вы контент с них иногда на мониторе, а иногда на телевизоре (или проекторе) и хотите чтобы любое из устройств вы могли выводить по своему желанию на любой из экранов по всей квартире (дому). К сожалению тут уже всё чуть дороже, но выбора тоже довольно много. HDMI коммутатор (2 входа — 4 выхода) или HDMI коммутатор (3 входа — 2 выхода) или вот ещё HDMI коммутатор (2 входа — 4 выхода).

Но есть помимо всего этого ещё и комбинации первой группы устройств (с USB портами) и второй группы устройств (с HDMI портами).

Называются эти устройства KVM свитчи (где K — кейборд, V — видео, M — моуз). Нужны они для полноценного переключение рабочего места (равно как и места отдыха) между разными системами.

KVM свитчи так же очень пригодятся профессиональным стримерам, у которых два компьютера — норма жизни. То есть на одном идёт игра, а на другом стоит карта видеозахвата, получающая картинку с игрового компьютера и второй компьютер занимается кодированием видеопотока стрима. И для всего этого нужно много мониторов, и два набора мышек и клавиатур. Схема подключения этого всего через KVM свитч довольна запутана, но при этом уменьшается количество требуемых мониторов на 1 штуку, и количество мышек и клавиатур для всего этого дела нужно по одной штуке (в два раза меньше, чем без KVM свитча).

В общем — для стримеров KVM свитч — это вообще Must Have устройство, которое и денег прилично сэкономит и места свободного на столе будет больше. Касаемо подключения — тут проще посмотреть на видео-версии этой статьи.

https://youtube.com/watch?v=SykttEZ_27Q

дальше сложнее

Теперь надо разобраться с видеовыходами и видеоустройствами.

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

Второй вариант, когда у вас много устройств, на подобии TV ресивера, консоли, пары компьютеров, но вы это всё потребляете с одного монитора, на котором нет нужного количества видеовходов. И для того чтобы подключить это всё к одному монитору нужен такой девайс. Стоят они тоже не дороже кабеля.

Видео на YouTube канале «Этот компьютер»

https://youtube.com/watch?v=4XP—tua7kI

Подписаться на канал

Пред.

1

33

Далее

Одно и двухканал памяти в современных процессорах

Как изменится мир, если NVIDIA купит ARM?

Intel Alder Lake (12 gen) | Две новые микроархитектуры на одно поколение.

InfoCAST #047 | Новости о 12-ом поколении Intel, 3D компоновка от AMD…

Инструменты техноблогинга. Чем делаются тесты? Бесплатное ПО от моего канала.

Как собрать свой первый компьютер? Подбор комплектующих, сборка ПК, установка Windows. Всё от А до Я

EK-QuantumX Delta TEC | Пельтье от EKWB и Intel | Обзор и модификация

DLSS против FSR | Качество изображения | Производительность

Linux, Wundows, x86, ARM… Всё смешалось | InfoCAST #046

FSR vs DLSS | Как работает | Графику сравниваю не я, а — ВЫ!

Настройки ниже минимальных при помощи настройки драйверов. Проверяем эффективность.

Как изменились комплектующие за 10 лет?

Пред.

1

33

Далее

Дизайн

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

Готовый USB-хаб (слева) и проект «умного» хаба (справа)

Работать такое устройство должно было следующим образом. Пять разъёмов USB-A, расположенных столбиком, по проекту были объединены в четыре группы и управлялись четырьмя кнопками (на рисунке — справа). Первая группа (два разъёма) предназначалась для клавиатуры и мыши, вторая (один разъём) — для звуковой карты, третья (один разъём) — для камеры, четвёртая (один разъём) была оставлена про запас.

Под крышкой находились те самые два хаба, подключенные к ведущим устройствам через три разъёма USB-B, расположенные в верхнем торце устройства. Правый разъём предназначен для подключения к компьютеру и всегда связан с «правым» хабом. К левому и среднему разъёмам подключались телефон и док-станция: когда телефон подключен, «левым» хабом владел он, в противном случае хаб доставался док-станции. Верхний ряд светодиодов отображал состояние «сторон»-хабов: зелёный — подключено к постоянному устройству, оранжевый — подключено к портативному устройству (телефону), красный — отключено.

Светодиоды с правой и левой стороны от каждого разъёма показывали, к какой стороне он сейчас подключен (а также к какой стороне он подключится при изменении внешних условий, например, возвращении питания на данную сторону). Первые две группы устройств (клавиатуру, мышь и звуковую карту) можно было подключать к любой из сторон и отключать. Камеру — подключать только к правой стороне или отключать. Последний разъём подключался к порту, оставшемуся свободным на левом хабе, и тоже мог отключаться.

Этот проект был затем пересмотрен по нескольким параметрам.

  1. Я решил, что все группы должны вести себя полностью одинаково — меньше будет путаницы. Это подразумевало, что камера сможет, как и прочие каналы, подключаться к каждой из сторон, а пятый разъём исчезнет.

  2. Иллюминация было урезана — остались по два светодиода на группу, загорающиеся при подключении её к правой и левой стороне, соответственно. Цвета этих диодов хватает, чтобы отслеживать также статус сторон.

  3. Поскольку вся схема с ардуинкой, реле, коммутаторами и деталями обвязки значительно превосходила по размерам старый хаб, я решил спрятать её под стол, оставив наверху лишь маленький пульт с кнопками и светодиодами.

  4. Я добавил два «аварийных» светодиода, тлеющих и иногда ярко вспыхивающих красным светом: первый напоминает, что камера в данный момент подключена, второй указывает, что звуковой карте может не хватать питания (об этом — ниже). Эти светодиоды органично вписались в соответствующие кнопки.

Фотографию пульта в работе, а также его относительного размера к основной плате я привожу ниже.

Пульт управления крупным планом и вместе с печатной платой в процессе распайки деталей

Кнопки работают наиболее очевидным способом: одиночные нажатия последовательно переключают соответствующий канал между состояниями «подключен к компьютеру», «подключен к телефону», «отключен». Длинные или множественные нажатия не используются.

Светодиоды расположены над каждой кнопкой попарно и отображают состояние данного канала. Левый светодиод горит, когда канал подключен к системному блоку, правый — когда он подключен к телефону. Зелёный сигнал означает, что устройство, к которому выполнено подключение, активно, красный — что напряжения на этом направлении нет.

Требования

До этого у меня на столе «жил» простой четырёхпортовый USB-хаб с клавишей отключения. К нему были подключены проводные клавиатура и мышь, а также Web-камера. Камеру я обычно физически отключал от хаба вне времени использования (паранойя), а клавиша отключения на хабе оказалась удобна тем, что позволяла с комфортом чистить клавиатуру и мышь, не выдёргивая разъёмы и не выключая компьютер. Кроме того, в хаб периодически включался аппаратный менеджер паролей. Звуковая карта и принтер были подключены напрямую к разъёмам на системном блоке, и этим набор USB-периферии ограничивается. Все перечисленные устройства работают по стандарту USB 2.0. На док-станции присутствуют два порта USB той же версии.

Заводить отдельную клавиатуру для телефона, конечно же, не хотелось. Кроме того, я очень привык к удобной мыши Logitech G600 с двенадцатью хорошо прощупываемыми дополнительными кнопками под большим пальцем, обладающими тем преимуществом, что назначенные на них комбинации работают под любой операционной системой и даже в BIOS без установки дополнительного ПО. Поэтому я решил использовать существующие клавиатуру и мышь, но делить их между устройствами. Кроме того, должен существовать способ отключить их совсем. Звуковая карта тоже должна переключаться между хостами и отключаться (чтоб не жрала энергию в отсутствие питания от сети). Отключение камеры решено было внести в ту же систему. Принтер остался в стороне, поскольку смартфон не захотел с ним работать.

Таким образом был сформирован следующий список требований к «умному» USB-переключателю:

Клавиатура и мышь должны совместно переключаться между телефоном и системным блоком, а также отключаться.
Звуковая карта должна переключаться между устройствами и отключаться независимо от клавиатуры и мыши.
Камера должна подключаться к системному блоку и отключаться независимо от других устройств

Факт того, что камера сейчас подключена (даже если на ней самой не горит лампочка), должен привлекать к себе внимание (например, миганием светодиода).
Переключения могут производиться вручную (кнопками) или автоматически (логикой хаба, например, при отключении или подключении устройств).
Монитор переключается независимо от остальных устройств. Поскольку видеокарта и док-станция включены на разные его входы, это делается кнопкой на самом мониторе.
Под рукой должен быть хаб или USB-разъём на гибком проводе для подключения менеджера паролей к системному блоку

Это может быть простой удлинитель, уходящий под стол.
Телефон может быть подключен к переключателю как через док-станцию с внешним питанием, так и напрямую (например, чтобы включать музыку во время мытья пола, когда на сетевом фильтре под столом и, соответственно, на док-станции нет питания). Желательно иметь для подключения через док-станцию и напрямую разные интерфейсы, чтобы не выдёргивать каждый раз разъём из док-станции. Вместо телефона может также быть подключен ноутбук (если HDMI-кабель с док-станции вручную переключить на него же, получится полноценное рабочее место, пока стационарный компьютер на обслуживании).
Питание на переключателе и на подключенных к нему подчинённых устройствах должно присутствовать, если включено хоть одно хост-устройство (системный блок, док-станция или телефон).
Должна присутствовать индикация, показывающая текущее состояние коммутации.
Вся конструкция должна занимать не слишком много места на столе.

Из имеющихся на рынке решений мне на глаза попались KVM-переключатели, а также специализированные переключатели USB вроде этого. Все встреченные мной модели работали по принципу «всё или ничего», коммутируя все подключенные к ним устройства совместно. Мне же хотелось иметь возможность, например, слушать музыку с телефона во время создания образа системного диска с использованием клавиатуры и мыши, а также отключать камеру независимо от остальных устройств. Кроме того, было желание поковыряться и попробовать собрать что-то самостоятельно. Друг посоветовал посмотреть в сторону Arduino, и я начал изучение.