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

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

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

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

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

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

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

Схема построена на микроконтроллере 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-битAT90USB1621
C1
Конденсатор1 мкФ2
1206C2
Конденсатор0.1 мкФ1
1206C3, C4
Конденсатор22 пФ2
1206C5
Конденсатор10 мкФ1
1206R1
Резистор1.5 кОм1
1206R2, R3
Резистор22 Ом2
1206R4
Резистор1 кОм1
1206R5, R6
Резистор10 кОм2
1 — 0805, 1 — выводнойLED1
СветодиодКрасный1
1206LED2
СветодиодЗеленый1
1206Z1
Кварцевый резонатор16 МГц1
Jmp1, Jmp2
ПеремычкаДжемпер2
S1, S2
Тактовая кнопкаIT-1127-5-160G-G2
smdS3-S21
Тактовая кнопкаTC-A10919
X1
РазъемminiUSB1
smdДобавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

Добавить комментарий

Ваш адрес email не будет опубликован.