Arduino Leonardo и USB Host Shield
Самое дешёвое устройство ввода: как шилд садится на плату, почему его линии SPI нужно перекинуть на ICSP-разъём, загрузка скетча и ограничения, с которыми придётся смириться.
Коротко
Arduino Leonardo с USB Host Shield — самый дешёвый рабочий проброс мыши: MAX3421E на шилде читает вашу мышь, а ATmega32u4 представляет её компьютеру. Это же и самый муторный вариант: большинство шилдов рассчитаны на распиновку Uno, и SPI приходится перекидывать перемычками на ICSP-разъём.
На странице9
Почему нужен Leonardo, а не Uno
Всё дело в микроконтроллере. В Leonardo стоит ATmega32u4 со встроенным в чип USB, поэтому плата может сама представляться компьютеру клавиатурой, мышью или serial-портом. Uno так не умеет: его USB-разъём подключён к отдельному чипу-мосту, единственная задача которого — serial, так что выдать себя за мышь он не сможет никогда. Это единственное отличие и есть вся причина, по которой в этой сборке указан именно Leonardo. По этой же причине Uno, который у вас уже есть, не заработает, как ни пиши код. Платы на том же чипе 32u4, например Pro Micro, работают по тому же принципу.
Какие детали нужны
Для сборки нужны две платы и два кабеля. В этой простоте вся привлекательность, и это действительно самый дешёвый путь к работающему курсору.
- Arduino Leonardo
- ATmega32u4 с родным USB. Отдаёт игровому ПК интерфейс мыши, и через него же идёт serial-канал
- USB Host Shield 2.0
- На нём стоит USB-хост-контроллер MAX3421E, с которым плата общается по SPI. Это та половина, в которую подключается ваша настоящая мышь
- Библиотека
- USB Host Shield Library 2.0 — она отвечает за работу с HID-мышью на стороне хоста
- Кабель к игровому ПК
- Собственный разъём micro-USB на Leonardo. Это HID-сторона
- Кабель ко второму ПК
- В сборке с одним кабелем — тоже USB-разъём Leonardo, а если хотите физически разделить каналы — отдельный USB-serial адаптер на UART
- Паяльник
- На практике обязателен. Подробности в следующем блоке
Внимание
Как подключить линии SPI шилда
Именно из-за этого шага у сборки такая репутация. Большинство USB Host Shield проектировались под Uno, где SPI выведен на цифровые пины 11, 12 и 13. На Leonardo эти пины вообще не SPI: SPI доступен только на 6-пиновом разъёме ICSP. Если поставить шилд с распиновкой Uno на Leonardo, всё будет выглядеть правильно, но плата так и не сможет связаться с MAX3421E.
- Проверьте, есть ли на нижней стороне шилда гнездо ICSP. Шилды с таким гнездом ставятся на Leonardo и просто работают
- Если его нет, придётся ставить перемычки. Найдите, куда на разъёме Uno приходятся пины SPI шилда (тактовый сигнал SCK и линии данных MISO и MOSI)
- Откусите, отогните или ещё как-то изолируйте эти три пина, чтобы они больше не соединялись с цифровыми пинами 11, 12 и 13 Leonardo
- Проведите три провода от изолированных пинов шилда к соответствующим пинам разъёма ICSP на Leonardo
- Линию выбора чипа (chip select), обычно пин 10, оставьте как есть: chip select — обычный цифровой пин, и его распиновка уже правильная
- Прежде чем подавать питание на сборку, убедитесь, что шилд получает 5 В и землю с разъёма
- Включите питание и запустите пример диагностики платы из библиотеки. Он сообщает, отвечает ли MAX3421E вообще, — и больше на этом шаге выяснять ничего не нужно
Как загрузить скетч
Когда разводка правильная, загрузка проста, но прежде чем писать или прошивать что-то сложнее, убедитесь, что сторона хоста работает.
- Установите Arduino IDE и добавьте USB Host Shield Library 2.0 через менеджер библиотек
- Выберите Tools, затем Board, затем Arduino Leonardo и укажите порт, на котором появилась плата
- Загрузите из библиотеки пример диагностики USB host board и откройте монитор порта: он должен сообщить, что контроллер найден и инициализирован
- Загрузите из библиотеки пример HID-мыши, подключите к шилду проводную мышь и убедитесь, что движение и клики выводятся в монитор порта
- Только после этого загружайте passthrough-прошивку, которую ожидает ваш чит, не меняя плату и порт
- Запишите скорость, с которой скетч открывает serial-канал: то же значение нужно будет ввести в чите
- После финальной загрузки передёрните питание сборки, а не полагайтесь на программный сброс
Почему номер COM-порта всё время меняется
У Leonardo serial-порт — часть USB-гаджета самой платы, а не отдельный чип-мост. Поэтому номер COM может меняться при сбросе платы и меняется снова, когда во время загрузки плата входит в загрузчик. Для сборки, которую вы то и дело перепрошиваете, это нормально. Когда определитесь с финальной прошивкой, найдите порт в диспетчере устройств и принудительно назначьте ему маленький однозначный номер в Port Settings → Advanced («Параметры порта» → «Дополнительно»). Затем введите этот номер в чите. Если хотите полностью отделить канал управления от игрового ПК, возьмите его с аппаратного UART через USB-serial адаптер. Тогда игровой ПК видит просто мышь и ничего больше.
Чем вы расплачиваетесь за низкую цену
Ни один из этих компромиссов не смертелен, но каждый из них — то, чего более дорогое устройство от вас не требует.
| Аспект | Leonardo + шилд | Почему это важно |
|---|---|---|
| Сборка | Обычно нужна пайка или перемычки | Главная причина сборок, которые так и не заработали, и без мультиметра её труднее всего диагностировать |
| Пропускная способность хоста | MAX3421E — хост-контроллер Full Speed | Для мышей хватает. Но если нужно пробросить High Speed-устройство, эта плата не для вас |
| Запас производительности | 8-битный микроконтроллер на 16 МГц | Хватает, чтобы пересылать отчёты. На сглаживание или формирование движения на самом устройстве почти ничего не остаётся |
| Частота отчётов | Ограничена интерфейсом Full Speed-устройства | Действует нижняя граница интервала в 1 мс, как у любого Full Speed USB. High Speed device-порт Teensy 4.1 так не ограничен |
| Контроль дескриптора | Есть, но инструменты грубее | Изменить то, что видит игровой ПК, можно. Но здесь это больше работы, чем на Teensy, и намного больше, чем на прошивке, которая клонирует дескрипторы за вас |
| Поддержка | Только сообщество | Когда что-то ломается, производителя нет. Зато каждая часть кем-нибудь да задокументирована |
Совет
Кому стоит его собирать
Эта сборка подходит тем, у кого уже есть паяльник, кому нравится сам процесс и кто относится к устройству как к проекту, а не к покупке. Если это про вас, получится хороший проект на выходные, и в слое ввода вы будете разбираться лучше любого, кто купил готовую коробку. Если нет — купите MAKCU: тратить три вечера на шилд ради разницы в цене — плохая сделка. К тому же наполовину работающее устройство ввода хуже, чем никакого: оно даёт сбои, которые выглядят как баги чита.
Что проверить, прежде чем решить, что оно сломано
- Плата — Leonardo или другая плата на ATmega32u4, а не Uno
- Линии SPI шилда доходят до разъёма ICSP — через гнездо или через провода
- Диагностика платы из библиотеки сообщает, что MAX3421E найден
- Простая проводная мышь выводит движение в примере HID-мыши
- Игровой ПК показывает устройство мыши, когда к нему подключён Leonardo
- Номер COM в чите совпадает с номером в диспетчере устройств и состоит из одной цифры
- Скорость в чите совпадает со значением в скетче
Частые вопросы об Arduino
Можно ли вместо этого взять Uno с host-шилдом?
Нет: Uno не может представиться USB-мышью, потому что его USB-разъём подключён к serial-мосту, а не к основному микроконтроллеру. Нужна плата, у которой USB встроен в сам основной чип, например одна из плат на 32u4.
Паять точно придётся?
Нет, если на нижней стороне шилда есть гнездо ICSP: тогда он просто ставится на плату и работает. У большинства дешёвых шилдов его нет, и в этом случае придётся изолировать три пина и проложить три провода.
Такое устройство проще обнаружить, чем KMBox?
Необнаружимого здесь нет ничего, а реальная разница меньше, чем принято думать. В обоих случаях движение приходит как настоящий USB HID-трафик. Дешёвая DIY-сборка, оставленная в стоке, обычно слабее по USB-идентичности, которую она отдаёт, но это вопрос настройки, а не следствие цены.
Заработает ли донгл беспроводной мыши в шилде?
Часто да: хост-контроллер видит его как USB HID-устройство. Обычное исключение — донглы с дополнительными вендорскими интерфейсами, а фирменный софт для настройки мыши через любой проброс, как правило, перестаёт работать.
Почему COM-порт всё время меняется?
Потому что serial-интерфейс — часть USB-гаджета платы, а во время загрузки скетча плата сбрасывается. Когда прошивка окончательная, принудительно назначьте в диспетчере устройств маленький фиксированный номер.
Источники
В проверенном нами списке источников нет ничего о Leonardo, host-шилде или MAX3421E, поэтому шаги с перемычками и загрузкой основаны на нашем опыте сборки такого устройства.
Читать дальше
Не получилось? Откройте тикет в Discord
Все гайды