Решил собрать дополнительное устройство ввода, чтобы задействовать в процессе управления ПК ноги. Под эту задачу были заказаны несколько педалей. Правда я взял вариант с кнопкой на переменку до 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
Для подтяжки входа
Отладочная плата Digispark1
Готовый вариант
МК AVR 8-битATtiny851
Для самостоятельной сборки
Резистор68 Ом2
Для самостоятельной сборки
Стабилитрон3.6 В2
Для самостоятельной сборки
Резистор10 кОм1
Для самостоятельной сборки
Резистор1.5 кОм1
Для самостоятельной сборки
Предохранитель0.1 А1
Можно исключить
Триггер ШмиттаSN74LVC1G141
Или аналог (74HC14AD)
Конденсатор100 нФ1
Резистор10 кОм1
Резистор47 Ом1
Добавить все
Скачать список элементов (PDF)
Прикрепленные файлы:
- usb_pedal.zip (227 Кб)