HID клавиатура на микроконтроллере

В этой статье рассмотрим разработку USB HID клавиатуры. Устройство будет работать точно так же как стандартная USB клавиатура для компьютера, при этом, как и в оригинале, установка драйверов не нужна, так как при данной технологии используются стандартные ресурсы Windows.

Для реализации устройства будет использоваться ранее рассмотренная отладочная плата для микроконтроллера AT90USB162. Логика выбора этого микроконтроллера для изготовления клавиатуры простая — главный и, пожалуй, единственный аспект – это аппаратный USB интерфейс. В остальном сам же по себе клавиатура это контроллер нажатия определенных кнопок. Однако, мало просто нажимать кнопки, важно также знать что именно нужно посылать персональному компьютеру, чтобы был эффект от нажатия этих самых кнопок, а именно нужно знать коды клавиш.

Так какую именно клавиатуру можно сделать? Да вообще любую, вплоть даже до своей оригинальной раскладки, вообще же как обычно во все упирается фантазия разработчика. Таким образом, немного поразмыслив на эту тему, вспомнилось, что у некоторых ноутбуков на раскладке клавиатуры не всегда присутствует цифровая панель или numpad. Поэтому было решено было сделать показательный проект цифровой панели клавиатуры. Для этой цели как раз хватает выводов микроконтроллера. К слову, максимальное количество линий ввода/вывода равно 22 у этого микроконтроллера. Соответственно максимум 22 кнопки можно сделать на клавиатуре и это с учетом задействованного вывода Reset. Однако можно сделать вариант и из матрицы клавиш, тогда из 22 лини ввода/вывода можно сделать 121 клавишу (11*11).

Для эталона numpad клавиатуры из поиска гугла была взята картинка таковой:

Помимо этих 18 клавиш от себя также добавил SHIFT, чтобы использовать другие функции клавиш такой клавиатуры.

С основными нюансами определились, теперь можно приступить к проектированию схемы клавиатуры на основе микроконтроллера AT90USB162:

Проект HID клавиатуры на микроконтроллере

Схема построена на микроконтроллере AT90USB162, питание которого берется от порта 5 вольт. Микроконтроллер внутри содержит стабилизатор на 3,3 вольта для питания линий USB (которые как раз и работают именно на таком напряжении). Конденсатор C6 выполняет функцию фильтра для этого внутреннего стабилизатора напряжения. Номинал можно увеличить. Резисторы R2, R3 необходимы для корректной работы по линиям данных USB порта. Кварц используется номиналом 16 МГц, так как микроконтроллер питается от 5 вольт, что позволяет поставить кварцевый резонатор на более высокую частоту. При питании 3,3 вольта, согласно даташиту, максимальная частота кварца для этого микроконтроллера составила бы 8 МГц. Резисторы R5 и R6 подтягивают 5 вольт к линиям микроконтроллера для правильной работы кнопок и исключения воздействия помех на этих линиях. Резисторы R1 и R4 ограничивают ток, протекающий через светодиоды, чтобы исключить их выход из строя

В этой схеме светодиод LED2 будет использоваться для индикации того, что клавиатура готова к использованию – пять раз моргнул, значит все загрузилось и можно жать кнопки. Вообще же функционал светодиода можно всегда подредактировать для других нужд.

Схема есть, теперь необходимо написать прошивку, чтобы клавиатура заработала. Здесь есть несколько путей. Можно использовать библиотеку LUFA для написания прошивки, а можно использовать встроенные библиотеки USB (USB HID) компилятора CodeVisionAVR.

Сам по себе я не программист, просто самоучка, но мне запомнилась фраза одного человека про программистов, что люди они все ленивые и приступая к работе сначала гуглят возможные решения задачи (мало ли кто-то до них уже все сделал), а уже потом делают работу. Так вот, следуя кодексу чести, для себя выбрал второй вариант реализации при помощи CodeVisionAVR. Почему? Все просто в этом компиляторе есть до безобразия простой генератор начального кода, то есть все инициализации можно организовать, расставив просто галочки.

Таким образом, за 10 секунд можно настроить аппаратный USB микроконтроллера, ну и плюс к этому линии ввода и прочее, что нам вдруг необходимо. Честно говоря, такая концепция меня зацепила, ведь даже не открыв даташит, можно настроить любой модуль микроконтроллера. С одной стороны это хорошо, но с другой перестаем читать документацию и разбираться в принципах работы. Так что расставленные галочки лучше закреплять даташитом. А для генерации начального кода в CodeVisionAVR необходимо открыть функцию CodeWizard, выбрать необходимый микроконтроллер и в меню как на скриншоте выбрать все, что нам необходимо.

Итак, по-быстрому настроив USB и линии ввода микроконтроллера для клавиш, пишем основной код прошивки, а именно по событию нажатия клавиш отправляем соответствующие коды на компьютер. Здесь все просто – реализация через конструкцию if. Исходный код предоставлен в конце статьи.

Формат отправки кодов клавиш следующий: используется функция

usb_keyboard_keypress(код нажатой клавиши, модификатор);

Код клавиши выбираем соответственно из таблиц выше. А что такое модификатор? Одна клавиша может выполнять 2 функции, происходит это при нажатии клавиши SHIFT и тогда, например, клавиша с цифрой 4 выполняет функцию стрелки влево. Так фот нажатая клавиша SHIFT и есть модификатор. Если модификатор отсутствует в функции эта переменная будет равна нулю, если модификатор присутствует, то эта переменная должна быть равна коду модификатора. Вот и все премудрости клавиатуры.

Эта функция описана во встроенных библиотеках USB (USB HID) компилятора CodeVisionAVR, название библиотеки «usb_hid.h». Ее можно выдернуть из папки установленного компилятора или просмотреть в процессе написания прошивки, она будет включена в проект. Причем в этой же библиотеке присутствует список кодов клавиш клавиатуры, а также модификаторов. Это можно брать от туда, либо просто прописывать код в функцию.

Пишем код, компилируем, получаем HEX файл прошивки для микроконтроллера. Прошивка заняла примерно 3 кбайта памяти. Простительно с учетом того, сколько времени было потрачено на генерацию начального кода. Прошивать будем программой Flip по USB. Процесс прошивки этой программой описан в статье Отладочная плата AT90USB162. При этом методе про фьюз биты не вспоминайте, их можно прошить только ISP программатором. Следуем инструкциям прошиваем, жмем Reset и в диспетчере устройств появится или просто клавиатура HID, или, как в моем случае, вторая клавиатура HID:

Все, устройство загружено и готово к использованию. Клавиатура работает полноценно.

Конечно, для изготовления этого устройства не хотелось отпиливать кусок от настоящей клавиатуры, поэтому было решено собрать все и проверить на макетной плате с применением отладочной платы для AT90USB162 и обычных тактовых кнопок:

Расстановка кнопок не как в оригинальных нумпадах, зато новый дизайн 🙂 У меня небольшие ассоциации с Франкенштейном. 

Для перепрошивки в случае чего необходимо активировать bootloader (жмем и удерживаем Reset, жмем и удерживаем HWB, отпускаем Reset, отпускаем HWB, пропадет клавиатура из диспетчера и появится сам микроконтроллер) и перепрошить.

USB – это просто.

К статье прилагается файл прошивки микроконтроллера AT90USB162, исходник в программе CodeVisionAVR version 3.12, печатная плата отладочной платы для микроконтроллера AT90USB162, небольшое видео работы клавиатуры.

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
IC1 МК AVR 8-бит AT90USB162 1
C1 Конденсатор 1 мкФ 2 1206
C2 Конденсатор 0.1 мкФ 1 1206
C3, C4 Конденсатор 22 пФ 2 1206
C5 Конденсатор 10 мкФ 1 1206
R1 Резистор 1.5 кОм 1 1206
R2, R3 Резистор 22 Ом 2 1206
R4 Резистор 1 кОм 1 1206
R5, R6 Резистор 10 кОм 2 1 — 0805, 1 — выводной
LED1 Светодиод Красный 1 1206
LED2 Светодиод Зеленый 1 1206
Z1 Кварцевый резонатор 16 МГц 1
Jmp1, Jmp2 Перемычка Джемпер 2
S1, S2 Тактовая кнопка IT-1127-5-160G-G 2 smd
S3-S21 Тактовая кнопка TC-A109 19
X1 Разъем miniUSB 1 smd