Интеллектуальный USB-хаб-переключатель на Arduino: возможно ли?
- Войдите на сайт для отправки комментариев
Всем привет.
Я полный ноль в Arduino (весь "опыт" - несколько часов чтения интернета), и на данный момент пытаюсь понять, можно ли на этой платформе решить мою текущую задачу. Опыт программирования есть (я - C++-программист), базовые понятия об электротехнике - тоже (физфак), опыта работы с контроллерами или электроникой нет (не считая программирования Lego-роботов на ev3dev).
Суть проблемы. Есть такая категория устройств, как USB-переключатели - это что-то вроде хаба на несколько USB-хост-портов, который сам подключается не к одному USB-хост-порту, а к нескольким, и позволяет нажатием кнопки выбирать, какое из двух хост-устройств (компьютеров) в данный момент видит хаб и всё, что к нему подключено. Мне на глаза попалось, например, вот такое устройство.
Я хочу собрать нечто подобное под свои нужды. Конкретно, нужна поддержка трёх хост-устройств (компьютер, телефон с USB Type C через док-станцию и отдельно, иногда вместо телефона может подключаться ноутбук), между которыми могут переключаться несколько (2-4) групп ведомых портов (1 группа из двух портов на клавиатуру и мышь - они всегда подключены к общему хосту, 1 группа из одного порта для звуковой карты, и ещё пару групп по одному порту хотелось бы иметь про запас). Стандарт USB - 2.0. Хост-устройства работают на Windows 7 и Android, возможно редкое подключние Windows 8/10 и Linux-устройств. Хотелось бы, чтобы каждый из хостов видел данный коммутатор как хаб, к которому подключаются и отключаются устройства, физически подключенные к коммутатору. Кроме того, хотелось бы иметь гибкую логику переключений по группам (например, если из хостов остаётся одно устройство, клавиатура и мышь переключаются на него, но при появлении напряжения на предыдущем хосте возвращаются назад, в то время как звуковая карта переходит от устройства к устройству исключительно в ручном режиме). На корпусе устройства должны быть кнопки (для переключения между хостами) и светодиоды (для отображения текущего состояния).
Насколько я понимаю, коммутация портов возможна либо физическая (перещёлкиванием релешек, на которые сведены все проводки от USB), либо логическая (перенаправление пакетов, фактически - программная эмуляция хаба). Вариант с релешками мне не слишком нравится, ибо, во-первых, механика (с постепенным выходом из строя в результате частых переключений), во-вторых - затратно по питанию (одно реле на две группы контактов потребляет, условно говоря, 20 мА, которые будут высасывать батарею телефона, когда он остаётся единственным устройством, подключенным к концентратору, а групп контактов далеко не две).
Вопрос в следующем. Возможно ли на Arduino собрать такую схему (3 slave-порта, 5 host-портов) и осуществлять коммутацию пакетов таким образом, чтобы все ведущие устройства воспринимали её как обычный хаб (в т. ч. из-под Android и из BIOS, без установки дополнительных драйверов)? Я находил USB Host Shield в различных вариациях, но ничего для увеличения количества slave-портов.
Самое близкое, что я находил, было здесь, но там в конечном счёте всё упёрлось в релешки (хотя собрать логику управления ими на Arduino, безусловно, было бы интересно и удобно). Здесь и здесь прямо говорится, что эмуляция хаба на Arduino невозможна, но обе темы старые (8 лет и 2 года). Здесь тоже ни к чему полезному не пришли.
Я, было, думал, что формат последовательного порта - это единственный способ взаимодействия Arduino с компьютером, но наткнулся на информацию о том, что с его помощью можно посылать в систему события мыши и клавиатуры. Подскажите, пожалуйста, делается ли это через отдельно устанавливаемый драйвер, или же любая ОС (в т. ч. Андроид) видит Arduino как композитное устройство, в котором, помимо последовательного порта, присутствуют клавиатура и мышь? Вариант с пробросом событий с реальной клавиатуры (и мыши), впрочем, всё равно неудобен, т. к. я использую устройства с дополнительными клавишами и специальной обработкой со стороны драйверов Logitech (программирование кнопок мыши и т. п.), от чего не хотелось бы отказываться.
Я правильно понимаю, что единственный вариант на Arduino - это использовать его в качестве контроллера для массива релешек?1
Заранее спасибо за ответы.
P. S. Читал про интегральные аналоговые переключатели, но те кажутся малопригодными из-за высокого (десятки, сотни ом) собственного импеданса в открытом состоянии и вероятности того, что сами будут шуметь.
Сделал на базе двух готовых хабов и переключателя шин FST3125. Подробно схему описал на https://habr.com/ru/post/546752/
Я, как электрик, реализовал бы это всё малогабаритны кулачковым переключателем или тумблером + реле, так было бы в 100 раз проще. Зачем всё усложнять?
Если совсем удалить всю логику, включая хабы, придётся тянуть 4 кабеля к компьютеру и 3 к док-станции, но на той всего 2 разъёма. Кроме того, практика показала, что на стыке двух кабелей USB будут отражения, и высокоскоростные устройства (камера, звуковая карта) будут работать нестабильно - нужно искать в точности такой же кабель, какой подключен к камере. Ну, а если собирать в каком-то корпусе хабы и реле, разводить питание и т. п., то повышение сложности от добавления Ардуинки будет далеко не в 100 раз - зато появятся приятные бонусы вроде светодиодной индикации, программного переключения по внешним событиям и т. д.
Я, как электрик, реализовал бы это всё малогабаритны кулачковым переключателем или тумблером + реле, так было бы в 100 раз проще. Зачем всё усложнять?
Затем, что ВЧ сигналы это не электрика, и синей изолентой результатов не добиться.