10-кнопочная USB HID клавиатура на микроконтроллере PIC. Часть 1 – Схема и конструкция
В статье мы рассмотрим простую конструкцию на микроконтроллере, реализующую 10-кнопочную USB HID (Human Interface Device) клавиатуру, которая является Plug-and-Play устройством и не требует установки драйверов.
Изначально устройство предназначалось для быстрого доступа к часто используемым сочетаниям клавиш в операционной системе Windows, например Alt+F4 (закрыть программу), Windows+D (свернуть все окна), Ctrl+Alt+Del и др.
Однако пользователи могут приспособить устройство и для других целей, например, для сбора и накопления данных.
Основой конструкции является микроконтроллер Microchip PIC18F14K50, помимо него используется несколько резисторов, конденсаторов и коннекторы. Устройство не требует отдельного источника питания, т.к. подключается к порту USB компьютера (USB Host) и получает питание от него.
Аппаратная часть базируется на примере от компании Microchip “USB Device HID Keyboard”, который предоставляется в отладочном наборе DM164127 – Low Pin Count USB Development Kit. Сочетания клавиш задаются в программе микроконтроллера, назначение сочетания клавиш мы рассмотрим во второй части статьи.
Коды сочетаний клавиш предназначены для операционной системы Windows, однако возможно их переназначение для использования в других ОС.
Основные характеристики устройства:
- 10 входных каналов (кнопки);
- все кнопки имеют подтягивающие резисторы к «+» питания;
- активное состояние кнопок – низкий логический уровень;
- подключение к порту USB;
- питание от USB;
- Plug-and-Play устройство, не требуется установка драйверов.
Основные характеристики микроконтроллера PIC18F14K50:
- Flash-микроконтроллер со встроенным USB 2.0 интерфейсом;
- рабочая частота до 48 МГц;
- 16 КБайт Flash-память программ, 768 Байт SRAM, 256 Байт EEPROM;
- один 8-битный таймер, три 16-битных таймера, 1 канал ШИМ;
- коммуникационные интерфейсы: USB, SPI, I2C, UART;
- встроенный 9-канальный 10-битный АЦП;
- два аналоговых компаратора;
- до 15 линий ввода/вывода общего назначения;
- корпус: 20-выводный DIP, SOIC, SSOP.
Для сборки устройства нам понадобятся:
- микроконтроллер PIC18F14K50;
- кварцевый резонатор 12 МГц;
- один конденсатор 0.1 мкФ;
- один конденсатор 220 нФ;
- 2 сборки из 5 резисторов номиналом 10 кОм;
- один резистор номиналом 1.5 кОм;
- панелька (сокет) для установки 20-выводного микроконтроллера;
- коннектор USB Type B;
- кабель USB Type B – Type A;
- 10 кнопок;
- 4-выводные и 6 выводные коннекторы (либо аналогичные).
Принципиальная схема устройства
Кликните для увеличения
Вид печатной платы
Печатная плата односторонняя, пользователи могут самостоятельно разработать печатную плату с применением smd компонентов с целью миниатюризации устройства.
Расположение элементов на печатной плате
Кнопки установлены на отдельной плате и подключаются к плате с микроконтроллером при помощи коннекторов (обозначены на плате HEADER1-4 и HEADER5-10).
Назначение отдельных компонентов и основные замечания по установке на печатную плату
Наборы 10 кОм резисторов – данные элементы содержат в себе 5 резисторов номиналом 10 кОм каждый, включенных параллельно с одним общим выводом. Этот вывод обозначается точкой на корпусе элемента.
Кварцевый резонатор должен быть расположен максимально близко к микроконтроллеру. Возможно, потребуется подключение двух конденсаторов емкостью 22 пФ к кварцевому резонатору. Конденсатор С2 (220 нФ) подключается между выводом микроконтроллера VUSB и V+.
Резистор R1 (1.5 кОм) подтягивает линию Data+ к напряжению питания, что сигнализирует для Host устройства, на какой скорости работает USB Device (клавиатура).
Джамеперы, указанные на печатной плате (J1 и J2, P1-P2-P3, G1 и G2, Rx и Tx), используются в связи с односторонней разводкой печатной платы, а также для возможности расширения функций:
- J1 соединен с J2;
- P1 подключен к P2, который подключен к P3;
- точки G1 и G2 остаются свободными (подключены к «–» питания);
- точки Rx и Tx подключены к линиям Rx и Tx микроконтроллера (на схеме не показано) для расширения функций.
Кнопки подключаются при помощи коннекторов к плате с микроконтроллером согласно схемы.
В следующей части статьи мы рассмотрим основные моменты в ПО микроконтроллера, как назначать сочетания клавиш и использование клавиатуры.
Источник: https://www.rlocman.ru/shem/schematics.html?di=108428
AVR271: демонстрационный проект клавиатуры на AVR с аппаратным USB
Источник: http://microsin.net/programming/avr-working-with-usb/avr271-usb-keyboard-demonstration.html
Резистивная клавиатура на Arduino
Резистивную клавиатуру на Arduino можно применить для расширения функций основной клавиатуры на компьютере, так и для управления с клавиатуры практический любым Android устройством имеющим OTG интерфейс.
1. Аппаратная часть
Для реализации данного проекта нам понадобится любой контроллер Arduino на чипе ATmega32u4. Этот микроконтроллер позволяет делать HID устройства.
Вариант для домашнего использования как с планшетом или телефоном так и с компьютером
Подойдёт и более компактный вариант от RobotClass, подходящий для встраиваемой установки. Например, в автомобиль — для управления планшетом.
Так же будет нужен набор резисторов различного номинала (к примеру 10 кОм)
и набор кнопок
Количество кнопок и резисторов зависит от того, сколько требуется сделать кнопок.
2. Программа и схема
Для начала соберем простенькую схему. Сама клавиатура будет подключена к аналоговому входу A0, что не особо принципиально. Можно использовать любой другой.
После сборки схемы получаем
После подключаем контроллер к компьютеру и загружаем в плату следующий скетч
byte key(){ int val = analogRead(0); // считываем значение с аналогового входа и записываем в переменную val if (val < 50) return 1; // сверяем переменную, если val меньше 50 возвращаем 1 (первая кнопка) else if (val < 150) return 2; // если val меньше 150 вторая кнопка else if (val < 350) return 5; // если val меньше 350 третья кнопка else if (val < 500) return 4; // если val меньше 500 четвертая кнопка else return 0; } void setup() { Serial.begin(9600); } void loop() { int sensorValue = analogRead(A0); //считываем кнопку Serial.print(key()); // выводим номер кнопки в serial Serial.print(" "); Serial.println(sensorValue); delay(1); }
После того, как загрузили скетч, открываем «Монитор порта» и нажимая на кнопки видим их значения в мониторе порта .
3. Программа для управления Android устройством на Ардуино
Теперь попробуем сделать клавиатуру для управления планшетом или телефоном на базе Android. Схема устройства остается та же, что и была. Но теперь контроллер будет распознаваться устройством как USB HID, в нашем случае клавиатурой.
Загружаем следующий скетч:
int analogPin=0; int data; void setup(){ Keyboard.begin(); Serial.begin(9600); } void loop(){ data=analogRead(analogPin); //чтение нажатой кнопки Serial.println(data); // вывод кода нажатой кнопки в монитор порта if (data==614) Keyboard.write(176); //ENTER код 614 if (data==122) Keyboard.write(216); //стрелка влево if (data==165) Keyboard.write(215); //стрелка вправо if (data==216) Keyboard.write(218); //стрелка вверх if (data==276) Keyboard.write(217); //стрелка вниз delay(100); }
Теперь Android устройство распознает нашу клавиатуру, и мы можем управлять, например, медиаплеером
4. Заключение
Данный пример клавиатуры можно реализовать для управления компьютером, установленным в автомобиль, или добавить внешнее устройство к своему смартфону.
Изменено: 25 Апр, 2018 17:41
Источник: http://robotclass.ru/articles/arduino-resistive-keyboard/
Создаем свой хардварный USB-троян – «Хакер»
У современных ОС есть интересная особенность — они полностью доверяют устройствам вроде клавиатуры или мыши. Соответственно, если собрать девайс, который будет эмулировать нужный ввод, и подключить его к компьютеру, то можно творить все что угодно. Этим и пользуются злоумышленники.
Информация представлена исключительно в образовательных целях. Любое ее использование в неправомерных целях может караться по всей строгости закона РФ (статьи 272 и 273 Уголовного кодекса). Ни автор, ни редакция в этом случае ответственности не несут. Думай головой.
Маленький пример
Начну с небольшой демонстрации. Представь: специалист по безопасности проводит внутренний пентест в некоторой компании и видит, что один из сотрудников часто оставляет станцию незалоченной. Очевидный путь — подойти и выполнить несколько «злобных» команд, пока этого никто не видит.
Однако есть серьезный риск быть пойманным за чужим рабочим местом да еще набирающим что-то непонятное в черном окне консоли :).
А если бы у исследователя было устройство, которое при подключении само бы набирало заранее запрограммированные команды? Подойти и незаметно вставить такой девайс — уже не слишком большая проблема. Или другой пример. Пусть это будет уже злоумышленник, у которого нет физического доступа к компьютерам.
Если замаскировать девайс под видом мышки, флешки или 3G-модема, то есть шанс, что его без лишней помощи вставит кто-то из самих же сотрудников. Известны случаи, когда такие «протрояненные» девайсы отправлялись просто по почте в качестве сувенирки.
Процент пользователей, которые, не подозревая о подвохе, подключают устройство к компьютеру, достаточно высок. При этом ни система, ни, к примеру, антивирус не замечают подвоха — для них это обычная клавиатура. Почему так происходит?
HID-устройства
Для начала надо разобраться с понятием Human Interface Device, или HID. В Википедии говорится, что HID — тип компьютерного устройства, которое взаимодействует напрямую с человеком, наиболее часто принимает входные данные от человека и предоставляет ему выходные данные.
Самые распространенные типы HID-устройств — это клавиатуры, мыши и джойстики. С точки зрения компьютерной системы HID-устройства являются полностью доверенными и в основном рассматриваются как простой интерфейс между пользователем и машиной.
Когда ты вставляешь в компьютер новую клавиатуру и мышь, никто у тебя не спрашивает разрешения на их установку, а драйверы чаще всего устанавливаются автоматически. Такое безграничное доверие может выйти боком для пользователя и давно замечено специалистами по информационной безопасности.
Еще в 2010 году на хакерской конференции DEFCON небезызвестные Irongeek и Dave ReL1k подробно рассказывали об использовании HID-устройств для проверки безопасности систем. С тех пор в плане защиты не изменилось ровным счетом ничего.
И собрать девайс, который под видом клавиатуры будет выполнять запрограммированные действия, ничто не мешает и сейчас, в чем я убедился в рамках моего исследования.
Плата Teensy
За основу такого USB-девайса была выбрана плата Teensy++ 2.0. Это программируемый микроконтроллер, который изначально идет вместе с полноценным USB-портом.
Среди примеров использования Teensy, в огромном количестве собранных на официальном сайте, — LED-футболка, которая с помощью диодов выводит различные изображения, станок для рисования маркером, наносящим нужный рисунок на любую ровную поверхность, считыватель RFID-карточек, детектор движения и еще десятки полезного и не очень «самопала».
Ты наверняка слышал о платах Arduino и ее аналогах, так вот Teensy — очень похожий проект. Но что важно для моей задачи: на Teensy чрезвычайно просто реализовать HID-устройство, которое будет определяться системой как клавиатура или, к примеру, мышь.
Поскольку плата изначально снабжена USB-портом, то мне даже не пришлось брать в руки паяльник и выполнять какие-либо хардкорные вмешательства. Все, что было нужно, — написать правильную программу. Замечу, что у платы есть несколько версий, но я выбрал самую навороченную и дорогую — Teensy++ 2.0. Ее можно заказать на официальном сайте проекта pjrc.com всего за 24 доллара.
Есть один нюанс, который сильно усложняет Teensy жизнь. Поскольку мы используем эмуляцию HID-устройства, то мы можем говорить с системой, но не можем ее услышать. Это основное ограничение при написании пэйлоадов для Teensy, которое делает пэйлоады менее чувствительными к состоянию системы.
Разработчику боевых нагрузок придется заранее определить все возможные ситуации и реакцию системы, потому что во время выполнения прочитать ответ системы будет невозможно. Единственная вещь, которую Teensy может считать, когда используется в качестве клавиатуры, — это состояние кнопок CAPS, NUM и SCROLL.
Еще одним ограничением является маленький размер памяти устройства, но с этим можно жить, особенно если подключить к Teensy дополнительный носитель данных, например SD-карту.
Hello world для железки
Teensy, как и платы Arduino, использует похожий процессор Atmel AVR, поэтому можно взять ту же среду разработки — Arduino Development Environment (arduino.cc), ее также называют ADE.
Последняя бесплатно доступна для всех популярных ОС (Windows, Linux, Mac OS X) и, помимо редактирования кода, позволяет залить программу в микроконтроллер.
Чтобы полноценно использовать ее для работы с Teensy, необходимо также установить дополнительный аддон Teensyduino (pjrc.com/teensy/teensyduino.html).
Надстройка, в частности, сразу предоставляет возможность перевести Teensy в режим эмуляции клавиатуры: это делается в ADE через меню «Tools —> Boards —> USB Keyboard». Если вставить девайс в компьютер, то он сразу определится как клава. Однако происходить ничего не будет — пока ничего не запрограммировано.
Среда разработки Arduino Development Environment с установленным плагином для совместимости с Teensy
Что представляет собой программа или, как ее называют в здешней терминологии, скетч для Teensy? Разработка осуществляется с помощью С-подобного синтаксиса. Программисту доступны переменные, методы, условные операторы, указатели — короче говоря, все, что нужно для счастья.
Любой скетч должен содержать функции setup() и loop(): первая вызывается один раз во время запуска, а вторая в цикле выполняет написанный внутри нее код. Функции могут быть даже пустыми, однако присутствовать должны — иначе компиляция будет завершаться неудачей.
Приведу пример простейшего кода:
Источник: https://xakep.ru/2013/01/28/60017/
Урок 5. USB. Сторона контроллера
ВНИМАНИЕ!!! ЭТО УСТАРЕВШАЯ СТАТЬЯ. НОВАЯ ЗДЕСЬ
Все, теперь добрались мы до чего-то интересного. Протокол USB.
Наша схема будет аналогична приведенной в уроке 3 про бутлоадер. Только еще пару ножек контроллера мы будем использовать, как датчики, чтобы проверить, правда ли все у нас работает.
Нам понадобится пакет Microchip Libraries for applications ссылка Зеркало(на данный момент актуальная версия v2013-06-15) Качаем этот файл и устанавливаем. Для компиляции проекта нам понадобятся эти библиотеки.
Мы будем собирать пример HID – custom demos лежит он в папке с установленной программой: microchip_solutions_v2013-06-15USBDevice – HID – Custom Demos Внутри в папке firmware – прошивка для контроллера. В остальных – программы для компьютера.
Дело в том, что в Microchip libraries каждый проект создан для десятка разных контроллеров, и учиться на этом коде довольно проблематично. Он очень громоздкий и не последовательный. Страница кода одна и та же, но в зависимости от того, какой проект вы откроете, для такого контроллера и будет создаваться прошивка.
Изначально из наших контроллеров там присутствует только pic18f4550 и для этого нужно открыть файл проекта USB Device – HID – Simple Custom Demo – C18 – PICDEM FSUSB.mcp Это по идее для такой учебной платы picdem fsusb. Она как раз работает на контроллере pic18f4550.
Я для удобства восприятия удалил “лишний” код, необходимый для настройки других контроллеров и чуть изменил программу, чтобы она корректно работала под pic18f2550 ссылка. Для того, чтобы программа работала, архив нужно распаковать в
microchip_solutions_v2013-06-15USBDevice – HID – Custom Demosлюбойкаталог , поскольку пути к библиотекам прописаны относительно к текущему каталогу. Не дурно бы было почитать документацию к USB библиотеке. Но почему-то microchip уже давно не выпускает новый нормальный user guide. Придется воспользоваться старым. Тем не менее он даст нам идею, как работает библиотека.
лежит он по адресу ссылка зеркало
Этот файл за 2007 год! Так что уже многие функции библиотеки даже называются по-другому. Примерно философия работы следующая: Контроллер наш, поскольку имеет аппаратную поддержку протокола USB имеет в своей памяти определенные места, в которые нужно записать настройки usb. это первый главный момент. В основном все это находится в файле usb_descriptors.c.
Вы можете открыть этот файл и посмотреть комментарии или даже отредактировать. Потом, важно грамотно настроить биты конфигурации. И в теле программы мы будем вызывать функцию USBDeviceTasks(), которая выполняет в общем-то всю работу по обмену информации через USB.
Плюс, нужно определить некоторые стандартные функции, которые вызываются при получении нашим устройством различных команд, в момент подключения к хосту например. без них, устройство так и не сможет обнаружиться. Эти команды находятся в самом низу файла main.
c и особенно здесь не рассматриваются, так как они осуществляют рутинную стандартную работу и вы будете вряд ли их менять. На данный момент библиотека работает следующим образом: Для того, чтобы поддерживать работу USB, когда хост обращается к устройству с сообщением, в течение определенного времени устройство должно дать ответ.
В случае, если это не происходит, хост может просто отключить наше устройство, посчитав его сломанным. Чтобы обработать usb сообщение и выслать ответ, нужно вызвать функцию этой библиотеки: USBDeviceTasks(); ну и чтобы отправилось правильное сообщение надо подготовить буферы вывода и прочее. В нашем примере мы просто циклически будем вызывать эту функцию.
Есть и другой выбор: для того, чтобы вовремя давать ответ хосту, можно использовать прерывания, но я опишу это потом, если будет время. Если мы просто периодически вызываем функцию USBDeviceTasks(), то обычно ее надо вызывать не реже, чем 1.8мс. Иногда бывают исключения из этого правила. Смотри комментарии usb_device.
c для тог, чтобы узнать, что это за исключения. Обычно вызвать USBDeviceTask() не требует много времени. Около 100 тактов процессора. Для корректной работы нашего устройства нужно будет задать USB дескрипторы. В общем-то это описание нашего устройства.
Они содерждат класс устройства, в нашем случае это – HID (Human Interface Device, которым могут быть мышки, клавиатуры, или вообще любое устройство) и имя устройства. Все эти параметры заданы в файле usb_descriptors.c, который уже добавлен в проект.
Перед началом работы хост с устройством обмениваются дескрипторами, это дает понять, каким образом будет осуществляться взаимодействие устройств.
Файл hardware profile содержит информацию о том, какой контроллер или плату мы используем. Плюсо к нему microchip обычно добавляет файл конкретного контроллера. Например HardwareProfile – PICDEM FSUSB.h.
В этом файле хранятся различные функции и адреса, связанные с аппаратной частью контроллера. Например, функция инициализации АЦП. В ней непосредственно указано, какое значение должно быть присвоено регистрам АЦП и на какую ножку будет подаваться напряжение.
Все основные комментарии приведены мной в коде в файле main.c. Здесь лишь пара слов. Когда мы открываем проект, перед нами будет следующий набор файлов:
lkr файл – файл линковщика. Он говорит о том, как и которую память можно использовать.
Плюс некоторые настройки usb протокола задаются в файле usb_config.h
На мой взгляд это дерево файлов и логика – далеко не идеальные, но это то, что предлагает microchip.
Далее логика работы программы сохранена, чтобы разобравшись с этой программой вам было легче понять другой похожий пример от microchip.
Основные функции программы:
void YourHighPriorityISRCode() – прерывание высокого уровня
void YourLowPriorityISRCode() – прерывание низкого уровня
void main(void) – главная функция
static void InitializeSystem(void) – инициализация контроллера (задание настроек)
void UserInit(void) – то же самое
void ProcessIO(void) – тело программы, где происходит вся обработка и расчеты
WORD_VAL ReadPOT(void) – функция вызова Аналого Цифрового Преобразователя
Далее будем рассматривать файл main.c, в котором находится наш исполняемый код. это сделано в самом файле в комментариях.
проект для контроллеров pic18f4550 и pic18f2550 ссылка
Здесь для поддержки USB интерфейса используются прерывания.
Так же выкладываю проект, где еще больше кода удалено, чтобы дать идею, как программа работает. Здесь прерывания не используются, а просто периодически вызывается функция поддержки usb интерфейса.
Уменьшенный вариант: ссылка
Проект обязательно нужно распаковать в папку
microchip_solutions_v2013-06-15USBDevice – HID – Custom Demosлюбойкаталог
потому что там довольно жестко задаются пути к библиотекам
Этот проект работает с обоими контроллерами (только что проверил) с бутлоадером и без него.
Для того, чтобы проверить, работает ли наш пример, запускаем утилитку
microchip_solutions_v2013-06-15USBDevice – HID – Custom DemosHID PnP Demo.exe
она должна найти ваш контроллер.
В следующем уроке мы будем рассматривать как раз эту программу для компьютера, которая пересылает информацию контроллеру. То есть USB интерфейс на стороне компьютера.
Источник: http://jasuramme.blogspot.com/2013/08/5-usb.html
Adblockdetector