Решил собрать дополнительное устройство ввода, чтобы задействовать в процессе управления ПК ноги. Под эту задачу были заказаны несколько педалей. Правда я взял вариант с кнопкой на переменку до 10 ампер, хотя, как позже выяснилось, существуют варианты с оптопарой. В итоге покупкой остался доволен, так как кнопка имеет характерный щелчек.
Для устройства можно использовать любой микроконтроллер AVR, совместимый с библиотекой V-USB. Эта библиотека программно реализует USB 1.1, чего более чем достаточно для клавиатур, геймпадов, MIDI контроллеров и прочих низкоскоростных устройств. Я же решил не мучаться с изготовлением платы, а использовать Digispark (цена на AliExpress 1-2$). Это отладочная плата, построенная на микроконтроллере ATtiny85 с прошивкой через USB порт. Забегая вперед скажу, что код легко помещается и в ATTiny25, но вот под bootloader уже места не остается…
В корпусе достаточно много места занято тумблером, так что размеры платы сильно ограничены. Плюс в середине устанавливается пружина, которая вводит дополнительные ограничения. Digispark еле влезает. На всякий случай стоит обернуть его в термоусадку или наклеить изоленту, как в моем случае. Хоть пружина и надежно закреплена, коротыш никому не нужен.
Схема устройства получилась ну очень простой (к Digispark добавлены только кнопка и резистор)… У некоторых читателей наверное сразу возник вопрос про дребезг контактов, ведь кнопка силовая. Она и на старте эксплуатации будет дико дребезжать. В схеме же аппаратная защита отсутствует. Стандартное решение, которое я называю Arduino Style, предлагает ввести задержку. Однако тут вступает в игру программная реализация USB, которая отжирает очень много процессорного времени. Пока микроконтроллер посылает компьютеру сообщение, кнопка перестает дребезжать, что продемонстрировано на осциллограмме. На канале 1 висит сама кнопка, на канале 2 выход микроконтроллера, где логическая 1 устанавливается при детектировании изменения состояния кнопки, а логический 0 — готовность обрабатывать следующее срабатывание.
Сразу уточню про софт. Это альтернативное ПО для кучи вариантов железа. Называется Sigrok. Я же его использую в паре с Hantek 6022BL (причем как в Windows, так и в Linux).
Если вы решитесь на аппаратную защиту, то схема стандартная. Включает в себя пару резисторов, конденсатор и триггер Шмитта (74HC14AD). Чтобы все поместилось в корпусе педали, можно взять микросхему в миниатюрном корпусе SOT-23-5 со всего одним триггером (SN74LVC1G14).
Теперь про программное обеспечение. Сборка осуществляется командой make. Дополнительно в Makefile добавлена цель upload, которая вызывает утилиту micronucleus. Утилита заливает прошивку в микроконтроллер через bootloader, который заранее загружается в него через программатор. В официальном репозитории проекта имеется прошивка, фьюзы и сама утилита.
Для обновления ПО клавиатуры предусмотрена комбинация из пяти зажиганий индикатора CAPS LOCK подряд (нажатие на саму педаль сбрасывает счетчик), которая вызывает срабатывание watchdog, что и переводит устройство в bootloader.
Клавиатура передает компьютеру пакеты с состоянием клавиш. Состоит он из нескольких полей: модификатор (например SHIFT), зарезервированный байт и коды нажатых клавиш. Код 0 означает, что ничего не нажато. Файл usb_hid_keys.h содержит все возможные коды клавиш. В основном файле прошивки описаны две функции для формирования этих пакетов. Первая (buildReport) оперирует с сырыми данными. Полученные аргументы просто подставляются в свои места. Вторая (buildReportChar) чуть сложнее. Она работает с символами (правда только буквы), но имеет одно забавное свойство. Она передаст именно ту букву, которую хотели отправить. С учетом регистра. Если хотим передать символ ‘a’, то будет напечатан именно он вне зависимости от состояния CAPS LOCK. Если быть более точным, то функция при необходимости ещё «нажимает» клавишу SHIFT.
Отдельного пояснения требует следующий фрагмент кода.
usbDeviceDisconnect(); // enforce re-enumeration wdt_reset(); _delay_ms(500); usbDeviceConnect();
Данный код эмулирует физическое отключение устройства от порта USB. Компьютер определяет наличие устройство по подтяжке шин данных. Функции usbDeviceDisconnect и usbDeviceConnect прижимают данные выводы к логическому 0 и отпускают их. Если этого не сделать, то компьютер будет некорректно работать с устройством. Он будет думать, что у нему подключена плата в режиме bootloadera, но это уже не так. В результате невозможна ни перепрошивка, ни работа как клавиатуры.
Остальные же фрагменты кода либо понятны, либо в них лезть не стоит, чтобы ничего не поломать. В видеоролике, приложенном к статье, имеется более подробный разбор кода.
К статье приложен список компонентов. Он разбит на 4 группы. Общие компоненты, для сборки из готовых модулей, для ручной сборки и аппаратный антидребезг. Комплект для ручной сборки немного отличается от оригинальной схемы отладочной платы, так как стабилизатор питания и светодиоды не используются.
В приложенном проекте Eagle имеется печатная плата для самостоятельной сборки, нафаршированная по максимуму, если данное выражение уместно в данном контексте. По габаритам она должна влезать в корпус педали, но это не проверялось. В свою защиту скажу, что кусок схемы, отвечающий за антидребезг был проверен и используется в одном из экземпляров устройства.
Список радиоэлементов
Обозначение | Тип | Номинал | Количество | Примечание | Магазин | Мой блокнот | |
---|---|---|---|---|---|---|---|
Кнопка | 1 | В идеале, педаль | |||||
Резистор | 10 кОм | 1 | Для подтяжки входа | ||||
Отладочная плата Digispark | 1 | Готовый вариант | |||||
МК AVR 8-бит | ATtiny85 | 1 | Для самостоятельной сборки | ||||
Резистор | 68 Ом | 2 | Для самостоятельной сборки | ||||
Стабилитрон | 3.6 В | 2 | Для самостоятельной сборки | ||||
Резистор | 10 кОм | 1 | Для самостоятельной сборки | ||||
Резистор | 1.5 кОм | 1 | Для самостоятельной сборки | ||||
Предохранитель | 0.1 А | 1 | Можно исключить | ||||
Триггер Шмитта | SN74LVC1G14 | 1 | Или аналог (74HC14AD) | ||||
Конденсатор | 100 нФ | 1 | |||||
Резистор | 10 кОм | 1 | |||||
Резистор | 47 Ом | 1 | |||||