Превратите ваш ProMicro в USB-клавиатуру / мышь

  1. Часть 1: простая HID клавиатура
  2. HID USB-клавиатура
  3. Часть 2: HID USB Mouse
  4. Часть 3: Модификаторы клавиатуры и не-ASCII символы
  5. Заключение

Уровень умения: Средний

от jimblom | 31 января 2012 | 39 комментариев

Как здорово было бы, если бы вы могли превратить любую кнопку, джойстик, сенсор или другое электронное устройство в USB-клавиатуру и / или мышь? Вы можете превратить практически любое устройство ввода в контроллер для своих компьютерных программ или игр. Что если бы вы могли сделать это с одной строкой кода внутри удобных границ Arduino? Заинтересовались? Ну, передай привет моему микро-другу: SparkFun Pro Micro !

Ну, передай привет моему микро-другу:   SparkFun Pro Micro

Pro Micro - это крошечный, Arduino-совместимый микроконтроллер, сосредоточенный вокруг ATmega32U4 - 8-битного AVR, очень похожего на ATmega328 с одной огромной оговоркой: 32U4 оснащен полноскоростным USB-трансивером . Так что теперь, когда вы подключаете Arduino к вашему компьютеру, они подключаются напрямую через шину USB (извините РАН ). Pro Micro можно запрограммировать на эмуляцию любого USB-устройства, которое вы только можете себе представить. Вы даже можете запрограммировать его так, чтобы он действовал так же, как мышь, клавиатура или другое USB-устройство класса HID.

Что такое HID вы можете спросить? Это один из многих определенных USB классы устройств , Каждому USB-устройству присваивается класс устройства , который определяет его основное назначение. Есть множество классов - принтеры, концентраторы, колонки и веб-камеры, чтобы упомянуть несколько - но этот учебник собирается специализироваться на HID : Устройство интерфейса человека. Возможно, вы сейчас держите устройство HID в одной руке, а другая рука находится над другой.

Таким образом, ATmega32U4 решает проблему с аппаратным USB-интерфейсом, но мы все еще должны устранить проблему с прошивкой. К счастью для нас, Arduino существует, и с выпуском 1.0 он поставляется со встроенной поддержкой ATmega32U4 и его ядра USB. Эта поддержка USB включает в себя функцию HID. К сожалению, этот скрытый материал несколько скрыт (или даже заперт) от нас. Цель этого руководства - объяснить, как использовать библиотеку Arduino HID, чтобы вы могли максимально использовать возможности Pro Micro. Так что давайте хлопать капюшоном!

Часть 1: простая HID клавиатура

Я подчеркиваю «просто» в заголовке этого раздела, потому что это так. И это отличная вещь! По сути, есть две функции, которые вам понадобятся, чтобы превратить ваш Pro Micro в клавиатуру USB:

  • Keyboard.write (char) - эта функция отправляет один символ через USB. Переданный символ может быть любым стандартным, печатаемым, определяемым ASCII символом: 0-9, az, AZ, пробел, символы и т. Д. Вот пример строки кода:
    • Keyboard.write ('z') - это отправит один символ 'z' на ваш компьютер. Обратите внимание, что это одинарные кавычки вокруг символа. Вы также можете заменить 'z' на предопределенную переменную char .
  • Keyboard.print (string) - если вам нужно выполнить серию Keyboard.write (), рассмотрите возможность использования только одного Keyboard.print (). Это работает аналогично Serial.print () - передайте ему строку символов, и он отправит этот поток символов через USB. Пример тому:
    • Keyboard.print («Привет, мир»); - "Привет, мир" из класса Arduino HID. Это отправит вашему компьютеру букву «H», затем «e», затем «l», а затем ... вы получите картинку. Вы также можете заменить «Hello, world» либо строковой переменной, либо массивом символов s.
  • Keyboard.println (string) - точно так же, как Keyboard.print (), за исключением того, что добавляет клавишу [Enter] в конец строки.
  • В выпуске Arduino 1.0.1 есть несколько более сложных методов клавиатуры: Keyboard.press (byte) и Keyboard.release (byte). Они делают именно то, что вы ожидаете. Один нажимает кнопку вниз, другой отпускает кнопку. Удостоверьтесь, что вы отпускаете все кнопки, которые нажимаете .
  • Вот и все. Вам не нужно включать какие-либо библиотеки или что-то еще, просто вытащите любую из этих функций.

    После того, как Pro Micro выполнит функцию Keyboard.write () или Keyboard.print () , ваш компьютер должен будет решить, что с ней делать. То, что ваш компьютер делает с этим символом, или строкой символов, полностью зависит от того, какая программа работает в данный момент. Если у вас есть открытый и активный текстовый редактор, он распечатает его там.

    Самый простой пример, который я могу придумать, это привязать одну кнопку к одному нажатию клавиши. Попробуйте этот пример (попробуйте скопировать / вставить снизу или скачать эскиз здесь ). Если у вас есть удобная кнопка, привяжите один конец к контакту 9, а другой - к земле. Или, если у вас нет кнопки, просто используйте провод для короткого контакта 9 с землей.

    int buttonPin = 9; // Установить кнопку на любой вывод void setup () {pinMode (buttonPin, INPUT); // Установить кнопку в качестве входа digitalWrite (buttonPin, HIGH); // Вытащить кнопку высоко} void loop () {if (digitalRead (buttonPin) == 0) // если кнопка опустится до уровня { Клавиатура . написать ('z'); // отправить 'z' на компьютер через задержку HID клавиатуры (1000); // задержка, чтобы не было kajillion z's}}

    Когда контакт 9 заземлен, ваш компьютер должен получить символ «z». Когда вы активируете нажатие клавиши, убедитесь, что у вас открыто приложение, которое сможет что-то сделать с «z». Если вы хотите, просто оставьте эскиз Arduino активным, и он должен набрать 'z' в редакторе эскизов.

    Я также хотел бы отметить, что задержка (1000) является важной частью этого эскиза. 1000 произвольно, но задержка () - нет. Попробуйте убрать задержку, и ваш компьютер попытается поймать несколько z (zzzzzzzzzzz). Само собой разумеется, вы должны следить за тем, что вы отправляете на компьютер, а также как быстро и как часто.

    HID USB-клавиатура

    Когда я использую свой ноутбук, я часто жалуюсь на отсутствие клавиатуры. Но с Pro Micro я мог бы сделать клавиатуру!

    Если вы соедините Pro Micro с нашими 12-кнопочная клавиатура Вы находитесь всего в нескольких проводах от вашей собственной DIY клавиатуры USB. Вот пример схемы для моей DIY USB-клавиатуры.

    Вот пример схемы для моей DIY USB-клавиатуры

    Не стесняйтесь подключать любые контакты клавиатуры к любому цифровому контакту Pro Micro. Для меня это был самый простой способ соединить все это на макете.

    Для меня это был самый простой способ соединить все это на макете

    Загрузите этот код клавиатуры HID (скопируйте вставку снизу или кликните сюда скачать его):

    / * keyPadHiduino Пример кода: Джим Линдблом дата: 5 января 2012 г. лицензия: лицензия MIT. Если вы находите этот код полезным, пожалуйста, не стесняйтесь использовать этот код, как хотите, коммерчески или иным образом. Просто держите эту лицензию там, что бы вы ни делали. Этот код реализует 12-клавишную клавиатуру USB. Вы можете ввести 0-9, * - это знак +, а клавиша # - ввод. Я использую 12-кнопочную клавиатуру SparkFun, ваши распиновки могут отличаться. Мультитач не поддерживается. Раскладка клавиатуры SparkFun: строки и столбцы связаны следующим образом: ------------- | 1 | 2 | 3 | - 3 | 4 | 5 | 6 | - 7 | 7 | 8 | 9 | - 6 | * | 0 | # | - 1 ------------- | | | 2 4 5 * / // Контакты 1-7 клавиатуры подключены к Arduino соответственно: int keypadPins [7] = {2, 3, 4, 5, 10, 16, 14}; int keypadStatus; // Используется для отслеживания нажатия кнопок. int timeout; // переменная тайм-аута, используемая в цикле void setup () {for (int i = 0; i <7; i ++) {pinMode (keypadPins [i], INPUT); // Установить все контакты клавиатуры как входы digitalWrite (keypadPins [i], HIGH); // высоко поднимаем все выводы клавиатуры}} void loop () {keypadStatus = getKeypadStatus (); // читаем, какие кнопки были нажаты if (keypadStatus! = 0) // Если кнопка нажата, перейдите сюда {sendKeyPress (keypadStatus); // отправить кнопку через USB timeout = 2000; // верхняя часть задержки повторения while ((getKeypadStatus () == keypadStatus) && (--timeout)) // Уменьшаем время ожидания и проверяем, удерживается ли клавиша delayMicroseconds (1); while (getKeypadStatus () == keypadStatus) // пока нажата та же кнопка {sendKeyPress (keypadStatus); // продолжаем посылать кнопку через USB delay (50); // частота повторения 50 мс}}} / * sendKeyPress (клавиша int): эта функция отправляет одну клавишу по USB. Требуется int, из которых используются 12 LSbs. Каждый бит в клавише представляет одну кнопку на клавиатуре. Эта функция отправляет нажатие клавиши только при нажатии одной кнопки * / void sendKeyPress (int key) {switch (key) {case 1: // 0x001 Keyboard . написать ('1'); // Посылает клавиатуру '1' break; case 2: // 0x002 Клавиатура . написать ('2'); перерыв ; case 4: // 0x004 Клавиатура . написать («3»); перерыв ; case 8: // 0x008 Клавиатура . написать ('4'); перерыв ; case 16: // 0x010 Клавиатура . написать ('5'); перерыв ; case 32: // 0x020 Клавиатура . написать («6»); перерыв ; case 64: // 0x040 Клавиатура . написать («7»); перерыв ; case 128: // 0x080 Клавиатура . написать ('8'); перерыв ; case 256: // 0x100 Клавиатура . написать («9»); перерыв ; case 512: // 0x200 Клавиатура . написать ('+'); перерыв ; case 1024: // 0x400 Клавиатура . написать ('0'); // Посылает клавиатуру '0' break; case 2048: // 0x800 Клавиатура . написать ('\ n'); // Посылаем клавишу ВВОД break; }} / * getKeypadStatus (): эта функция возвращает int, представляющий состояние 12-кнопочной клавиатуры. Только 12 LSb возвращаемого значения имеют какое-либо значение. Каждый бит представляет состояние одной клавиши на кнопочной панели. «1» - это бит 0, «2» - это бит 1, «3» - это бит 2, ..., «#» - это бит 11. Эта функция не работает для мультитача. * / int getKeypadStatus () {int rowPins [4] = {keypadPins [2], keypadPins [6], keypadPins [5], keypadPins [0]}; // выводы строки - 2, 7, 6 и 1 клавиатуры int columnPins [3] = {keypadPins [1], keypadPins [3], keypadPins [4]}; // выводы столбца - это выводы 2, 4 и 5 клавиатуры int keypadStatus = 0; // это будет то, что возвращено / * инициализировать все выводы, входы w / подтягивания * / for (int i = 0; i <7; i ++) {pinMode (keypadPins [i], INPUT); digitalWrite (keypadPins [i], HIGH); } for (int row = 0; row <4; row ++) {// инициализация цикла для проверки всех 4 строк pinMode (rowPins [row], OUTPUT); // установить вывод строки в качестве выходного digitalWrite (rowPins [row], LOW); // низкое количество выводов строки для (int col = 0; col <3; col ++) {// встроенный цикл для проверки всех 3 столбцов каждой строки if (! digitalRead (columnPins [col])) {keypadStatus | = 1 << ((строка + 1) * 3 + (столбец + 1) - 4); // установить бит состояния возвращаемого значения клавиатуры}} pinMode (rowPins [row], INPUT); // сбрасываем вывод строки как вход digitalWrite (rowPins [row], HIGH); // вытащить верхний вывод строки} return keypadStatus; }

    Теперь просто откройте калькулятор вашего компьютера и начните добавлять. Кнопка * настроена как знак «+», а кнопка # настроена как клавиша [Ввод].

    Здесь работают три функции. Функция getKeypadStatus () читает каждую кнопку клавиатуры и возвращает int. Используются только 12 битов значения, возвращаемого getKeypadStatus () , каждый из которых представляет состояние каждой клавиши - 1 для нажатой, 0 для не нажатой.

    Функция sendKeyPress (int) - это место, где происходит волшебство HID. Он будет интерпретировать значение, возвращаемое getKeypadStatus (), и отправит нажатие клавиши на компьютер на основе этого значения.

    В цикле () мы постоянно проверяем нажатие клавиш. Если обнаружено нажатие клавиши, мы отправляем соответствующий символ на компьютер. В loop () есть немного забавности, поскольку мы пытаемся эмулировать задержку повторения , а затем частоту повторения . Задержка повторения - это такая короткая однократная задержка, когда клавиша должна быть нажата, прежде чем она начнет бесконечно повторяться. Частота повторения - это небольшая задержка (50 мс) для замедления рассылки символов.

    Хотите получить некоторую пользу от Keyboard.print () ? Попробуйте заменить Keyboard.write ('1') в приведенном выше примере на Keyboard.println ("Password1234"). Теперь, когда я нажимаю 1 на клавиатуре, она печатает «Password1234 [ENTER]», и я могу войти в свой компьютер, нажав всего одну кнопку! Если вы так же плохо запоминаете пароли, как и я (особенно когда вы вынуждены менять его каждые несколько месяцев * глазами SparkFun IT *), возможно, вам может пригодиться этот типограф паролей. Это не так уж и безопасно, но это, вероятно, более безопасно, чем записывать его на листке бумаги, который вы прячете под клавиатуру. Не смотри под мою клавиатуру.

    Часть 2: HID USB Mouse

    Это охватывает примерно половину библиотеки USB HID. Как насчет того, чтобы добавить мышь к миксу сейчас? Внедрение USB HID-мыши требует еще нескольких функций, но все равно это очень просто. Класс HID Arduino предоставляет пять функций, которые можно использовать для реализации мыши:

    • Mouse.move (x, y, wheel) - эта функция указывает компьютеру перемещать мышь на определенное количество пикселей вдоль оси x , y и / или колеса . Каждая переменная может иметь любое значение в диапазоне от -128 до +127, причем отрицательные числа перемещают курсор вниз / влево, положительные числа перемещают вправо / вверх.
    • Mouse.press (b ) - эта функция отправляет нажатие на кнопку (кнопки) (одну или несколько) b . Кнопка (и) будет оставаться «нажатой», пока вы не вызовете Mouse.release (b) . Переменная b представляет собой один байт, каждый бит которого представляет отдельную кнопку. Вы можете установить его равным любому из следующих или ИЛИ их вместе, чтобы нажимать несколько кнопок одновременно:
      • MOUSE_LEFT - левая кнопка мыши
      • MOUSE_RIGHT - правая кнопка мыши
      • MOUSE_MIDDLE - средняя кнопка мыши
      • MOUSE_ALL - все три кнопки мыши
    • Mouse.release (b) - Подобно Mouse.press (b) , эта функция отправляет на компьютер сигнал «вверх», чтобы сообщить, что кнопка была отпущена.
    • Mouse.click (b) - эта функция отправляет щелчок вниз (нажатие), а затем сразу же щелчок вверх (отпускание) по кнопке (кнопкам) b .

    Вы когда-нибудь хотели управлять курсором вашего компьютера с помощью джойстика ? Ну, вы можете не захотеть после этого примера (это не совсем точно), но, по крайней мере, он покажет вам, как использовать класс Mouse. Для тех, кто играет вместе, я использую наш Большой палец джойстик , посаженный в его разразиться и подключен к Pro Micro.

    Джойстик питается от контактов VCC и GND Pro Micro. Горизонтальный аналоговый выход подключен к A0, вертикальный к A1, а переключатель выбора подключен к D9. Как всегда, не стесняйтесь подключать его по своему усмотрению, просто измените определения выводов в верхней части кода.

    Вот код:

    / * HID Joystick Mouse Пример: Jim Lindblom дата: 12.01.2012 лицензия: лицензия MIT - Не стесняйтесь использовать этот код для любых целей. Нет ограничений. Просто сохраните эту лицензию, если вы собираетесь использовать этот код в своих будущих начинаниях! Повторное использование и обмен. Это очень упрощенный код, который позволяет превратить джойстик SparkFun Thumb (http://www.sparkfun.com/products/9032) в HID-мышь. Кнопка выбора на джойстике устанавливается как щелчок левой кнопкой мыши. * / int horzPin = A0; // Аналоговый вывод горизонтального джойстика pin int vertPin = A1; // Аналоговый вывод вертикального джойстика pin int selPin = 9; // выбрать пин-код джойстика int vertZero, horzZero; // Сохраняет начальное значение каждой оси, обычно около 512 int vertValue, horzValue; // Сохраняет текущий аналоговый выход каждой оси const int чувствительность = 200; // Более высокое значение чувствительности = более медленная мышь, должно быть <= около 500 int mouseClickFlag = 0; void setup () {pinMode (horzPin, INPUT); // Установить оба аналоговых вывода в качестве входов pinMode (vertPin, INPUT); pinMode (selPin, INPUT); // установить кнопку выбора контакта в качестве входа digitalWrite (selPin, HIGH); // Потяните кнопку выбора пин с высокой задержкой (1000); // небольшая задержка для разрешения вывода результатов vertZero = analogRead (vertPin); // получить начальные значения horzZero = analogRead (horzPin); // Джойстик должен быть в нейтральном положении при чтении этих данных} void loop () {vertValue = analogRead (vertPin) - vertZero; // читать вертикальное смещение horzValue = analogRead (horzPin) - horzZero; // читать горизонтальное смещение, если (vertValue! = 0) Мышь . переместить (0, vertValue / чувствительность, 0); // перемещаем мышь по оси y, если (horzValue! = 0) Mouse . двигаться (horzValue / чувствительность, 0, 0); // перемещаем мышь по оси x if ((digitalRead (selPin) == 0) && (! mouseClickFlag)) // если нажата кнопка джойстика {mouseClickFlag = 1; Мышь .press (MOUSE_LEFT); // нажимаем левую кнопку вниз} else if ((digitalRead (selPin)) && (mouseClickFlag)) // если кнопка джойстика не нажата {mouseClickFlag = 0; Мышь выпуск (MOUSE_LEFT); // отпустить левую кнопку}}

    Цикл () этого кода непрерывно отслеживает горизонтальные и вертикальные аналоговые значения джойстика и отправляет команду Mouse.move () в зависимости от того, что он читает. Он будет перемещать мышь поэтапно, в зависимости от того, какая переменная чувствительности установлена. Если для чувствительности установлено значение 2, курсор будет перемещаться с шагом 1 или 2 пикселя.

    Важно отметить, что переменные, используемые Mouse.move () - vertValue и horzValue - могут быть как отрицательными, так и положительными; их знак определяет, движется ли мышь вверх / вниз или влево / вправо.

    Переключатель выбора на джойстике используется для управления левой кнопкой мыши. Обратите внимание, что этот код использует Mouse.press ( ) и Mouse.release () , а не просто вызывает один Mouse.click () . Это требует немного больше кодирования, но позволяет выполнять такие операции, как перетаскивание, двойной щелчок и т. Д.

    Часть 3: Модификаторы клавиатуры и не-ASCII символы

    Примечание (26 июня 2012 г.): С официальным выпуском Leonardo в Arduino 1.0.1 многое изменилось в лучшую сторону в основных файлах USB и HID. Теперь вы можете отправлять клавиатурные модификаторы и символы, не входящие в ASCII, с помощью функций-членов Keyboard Write , Press и Release, подробно описанных в части 1 выше. Следующие определения были добавлены в Arduino:

    #define KEY_LEFT_CTRL 0x80 #define KEY_LEFT_SHIFT 0x81 #define KEY_LEFT_ALT 0x82 #define KEY_LEFT_GUI 0x83 #define KEY_RIGHT_CTRL 0x84 #define KEY_RIGHT_SHIFT 0x85 #define KEY_RIGHT_ALT 0x86 #define KEY_RIGHT_GUI 0x87 #define KEY_UP_ARROW 0xDA #define KEY_DOWN_ARROW 0xD9 #define KEY_LEFT_ARROW 0xD8 #define #define KEY_RIGHT_ARROW 0xD7 Key_Backspace 0xB2 #define Key_Tab 0xB3 #define Key_Return 0xB0 #define KEY_ESC 0xB1 #define Key_Insert 0xD1 #define Key_Delete 0xD4 #define KEY_PAGE_UP 0xD3 #define KEY_PAGE_DOWN 0xD6 #define Key_Home 0xD2 #define Key_End 0xD5 #define KEY_CAPS_LOCK 0xC1 #define Key_F1 0xC2 #define Key_F2 0xC3 #define Key_F3 0xC4 #define Key_F4 0xC5 #define Key_F5 0xC6 #define Key_F6 0xC7 #define Key_F7 0xC8 #define Key_F8 0xC9 #define Key_F9 0xca #define Key_F10 0xCB #define Key_F11 0xCC #define Key_F12 0xCD

    Итак, если вы хотите быть злым и отправить ALT + F4, вы можете написать что-то вроде:

    if (buttonPress) { Клавиатура . нажмите (KEY_LEFT_ALT); Клавиатура написать (KEY_F4); Клавиатура выпуск (KEY_LEFT_ALT); }

    Помните, что запись отправляет прессу и релиз . Если вы используете только функцию пресса , убедитесь, что вы отпустите кнопку вскоре после этого (если зло не является вашей целью).

    И это стало так просто! Если вы еще не обновились до Arduino 1.0, приведенная ниже информация будет по-прежнему применяться. Так что я пока оставлю все как есть.

    Конечная записка (26 июня 2012 г.)

    Итак, это сумма того, что предусмотрено в библиотеке Arduino 1.0 HID. Достаточно подражать практически каждому действию мыши и клавиатуры. Однако, если вы похожи на меня, вам может потребоваться немного больше. Например, хотите ли вы отправлять на ваш компьютер нестандартные клавиши ASCII, такие как функциональные клавиши, клавиши со стрелками или даже такие модификаторы, как CTRL, ALT и SHIFT? Библиотека HID не поддерживает их по умолчанию, но мы можем это исправить ...

    Я предваряю этот раздел, говоря, что мы собираемся сделать небольшой взлом кода в основных библиотеках Arduino. Ничто не должно вызывать каких-либо проблем в вашей установке Arduino - на самом деле это всего лишь одно очень незначительное изменение - но вам нужно быть осторожным с тем, как вы используете код в этом разделе.

    Используя программный текстовый редактор , вам нужно открыть USBAPI.h в каталоге hardware \ arduino \ cores \ arduino вашей установки Arduino. Подойдет любой текстовый редактор, но лучше всего использовать редактор кода ( Notepad ++ или же Блокнот программиста хорошие).

    Подойдет любой текстовый редактор, но лучше всего использовать редактор кода (   Notepad ++   или же   Блокнот программиста   хорошие)

    Определение класса Keyboard начинается со строки 96 и должно выглядеть так:

    class Keyboard_: public Print {private: KeyMap * _keyMap; void sendReport (KeyReport * keys); void setKeyMap (KeyMap * keyMap); public: Keyboard_ (); виртуальная запись size_t (uint8_t); }; внешняя клавиатура_ клавиатура;

    Для отправки специальных символов и модификаторов нам нужно использовать функцию-член void sendReport (KeyReport) . К сожалению, эта функция в настоящее время перечислена под private: label, что означает, что мы не можем получить к ней доступ в нашем скриншоте Arduino. Чтобы сделать его пригодным для использования, все, что вам нужно сделать, это переместить его под public: label . Итак, вырежьте всю строку void sendReport (keyReport * keys) и вставьте ее прямо под строку public : . В конце ваш прототип класса Keyboard должен выглядеть примерно так:

    class Keyboard_: public Print {private: KeyMap * _keyMap; void setKeyMap (KeyMap * keyMap); public: void sendReport (KeyReport * keys); Keyboard_ (); виртуальная запись size_t (uint8_t); }; внешняя клавиатура_ клавиатура;

    Не забудьте сохранить файл заголовка и закрыть его. Вот и все, что нужно сделать для взлома кода!

    Чтобы использовать Keyboard.sendReport (), вам нужно дать ему KeyReport , который является структурой данных ( вот хорошее чтение для незнакомых) определено в USBAPI.h. Вот как это определяется:

    typedef struct {uint8_t modifiers; uint8_t зарезервировано; ключи uint8_t [6]; } KeyReport;

    KeyReport содержит информацию о том, какие клавиши были нажаты, и, если есть какие-либо клавиши (SHIFT, CTRL, ALT, GUI), их модифицирующие. Каждый KeyReport имеет три переменные-члены: ключи [6] , модификаторы и зарезервированы . Мы не будем использовать зарезервированные , но два других важны.

    Массив keys [6] может хранить до шести нажатий клавиш одновременно. По большей части первое значение массива, keys [0] , это все, что вам нужно. Фактическое значение, присвоенное этой переменной, не ASCII, а идентификатор использования HID . Стандарт USB назначает конкретные идентификаторы для каждой кнопки на клавиатуре; они все перечислены в этот официальный HID Таблица использования документ (таблица начинается на стр. 53). Нажмите на изображение ниже, чтобы увидеть ОГРОМНЫЙ список всех определенных назначений HID-клавиатуры (ваш браузер должен позволить вам увеличить изображение):

    Нажмите на изображение ниже, чтобы увидеть ОГРОМНЫЙ список всех определенных назначений HID-клавиатуры (ваш браузер должен позволить вам увеличить изображение):

    По сути, все это означает, что вы не можете задать ключам [0] символ «A», поскольку значение ASCII «A» (0x41) не совпадает со значением использования «A» (0x04).

    Переменная modifiers контролирует, какие модификаторы, если таковые имеются, действуют при нажатии клавиши. Вы можете установить модификаторы равными любому из следующих макросов:

    • Клавиши Shift: KEY_MODIFIER_LEFT_SHIFT, KEY_MODIFIER_RIGHT_SHIFT
    • Управляющие (CTRL) клавиши: KEY_MODIFIER_LEFT_CTRL, KEY_MODIFIER_RIGHT_CTRL
    • Клавиши ALT: KEY_MODIFIER_LEFT_ALT, KEY_MODIFIER_RIGHT_ALT
    • Клавиши GUI (Windows / Command): KEY_MODIFIER_LEFT_GUI, KEY_MODIFIER_RIGHT_GUI

    Вы также можете использовать OR (|) для любого из этих макросов одновременно, чтобы указать несколько модификаторов одновременно.

    Как только у нас есть все значения, которые нам нужно установить в keyReport , мы наконец можем отправить его в функцию sendReport (keyReport) , которая сообщит все ключи и модификаторы на компьютер.

    Ясно как грязь? Давайте просто перейдем к коду.

    / * keyPadHiduino Расширенный пример кода Автор: Jim Lindblom дата: 5 января 2012 г. лицензия: лицензия MIT - не стесняйтесь использовать этот код любым удобным для вас способом. Если вы собираетесь использовать его в другом проекте, пожалуйста, сохраните эту лицензию там. * / #define KEY_DELETE 0x4C void sendKey (ключ байта, модификаторы байта = 0); int buttonPin = 9; // Установить кнопку на цифровой вывод 9 void setup () {pinMode (buttonPin, INPUT); // Установить кнопку в качестве входа digitalWrite (buttonPin, HIGH); // Вытащить кнопку высоко} void loop () {if (digitalRead (buttonPin) == 0) // если кнопка опустится до низкого уровня {sendKey (KEY_DELETE, KEY_MODIFIER_LEFT_CTRL | KEY_MODIFIER_LEFT_ALT); // отправить CTRL + ALT + DEL на компьютер через HID delay (1000) клавиатуры; // Задержка, чтобы не спамить компьютер}} void sendKey (байтовый ключ, байтовые модификаторы) {KeyReport report = {0}; // Создать пустой KeyReport / * Сначала отправить отчет с нажатыми клавишами и модификаторами * / report.keys [0] = key; // установить KeyReport в key report.modifiers = modifiers; // устанавливаем модификаторы KeyReport report.reserved = 1; Клавиатура .sendReport (& report); // отправить KeyReport / * Теперь мы должны отправить отчет без нажатия * / for (int i = 0; i <6; i ++) report.keys [i] = 0; // очистим ключи report.modifiers = 0x00; // очистить modifires report.reserved = 0; Клавиатура .sendReport (& report); // отправить отчет о пустом ключе}

    Этот пример использует аппаратную настройку в самом первом бите кода - единственная кнопка, прикрепленная к контакту 9.

    На этот раз я добавил новую функцию - sendKey (байтовый ключ, байтовые модификаторы), - которую можно передавать как ключу (идентификатор использования HID), так и модификаторам. Он позаботится о настройке переменной KeyReport и отправке всех необходимых отчетов.

    Не нужно много времени, чтобы угадать, что передается функции sendKey () в этом примере. Это салют из трех пальцев , CTRL + ALT + DEL. Пользователи Windows должны быть знакомы с CTRL + ALT + DEL; для них заземляющий контакт 9 должен либо вызвать диспетчер задач, либо открыть диалоговое окно безопасности Windows.

    Люди Mac / Linux, я не уверен, что это что-нибудь сделает для вас. Если вы не хотите иметь клавишу CTRL + ALT + DEL, вы можете заменить параметры модификатора на KEY_MODIFIER_LEFT_CTRL (или KEY_MODIFIER_LEFT_GUI для Mac), а значение ключа - на 0x06 (идентификатор использования ключа [C]). Теперь у вас есть кнопка, предназначенная для копирования, и для добавления ключа вставки не потребуется больше времени.

    Посмотрите внимательно на функцию sendKey () . Обратите внимание, что мы должны отправить два разных отчета HID. Первый отчет отправляет наш ключ и любые модификаторы, которые могут быть включены. Второй отчет отправляет полностью отключенный KeyReport , который необходим, чтобы сообщить компьютеру, что ключ был выпущен. Возможно, именно поэтому Arduino сохранил sendReport ( ) как частную функцию, он имеет большой потенциал для создания беспорядка, если используется неправильно. Быть осторожен!

    Вы заметите, что KEY_DELETE определено как 0x4C, что соответствует значению «ID использования (шестнадцатеричное)» «Удаление клавиатуры вперед» в этом документе таблицы использования HID, который я связал выше. Используйте это в качестве примера для любых других ключей, которые вы хотели бы использовать. Там определены некоторые интригующие ключи ... F24 (0x73)? Кто знал, что это так высоко? Увеличение / уменьшение громкости (0x80, 0x81)? Контроллер медиаплеера? RightArrow , LeftArrow , DownArrow и UpArrow (0x4F-0x52) могут быть очень полезными!

    Если вы хотите потратить немного меньше времени на копание в этой таблице, не стесняйтесь адаптироваться этот пример кода , который также включает в себя заголовочный файл (HID_Keyboard_Advanced.h) со всеми определенными идентификаторами использования.

    h) со всеми определенными идентификаторами использования

    Теперь вы можете создать любой тип USB-устройства ввода, о котором вы когда-либо мечтали. Хотите использовать старый аркадный джойстик во время игры онлайн аркада игра? Сделай один! Вот код чтобы вы начали. Вы можете использовать аппаратную настройку джойстика из примера мыши выше. Этот код будет использовать расширенные нажатия клавиш, заменяя управление мышью нажатиями клавиш со стрелками вверх, вниз, влево и вправо.

    Заключение

    Ну, это был многословный урок, но эта тема меня очень взволновала; Я не могу не говорить об этом! Я думаю, что простота HID-классов Arduino открывает огромный мир физических вычислительных возможностей. Я рад видеть, какие сумасшедшие USB-устройства вы все придумали.

    Я надеюсь, что этот урок так же увлек вас, как и я, с Arduino USB HID. Если у вас есть какие-либо вопросы, или вам нужно что-то прояснить, пожалуйста, напишите в комментариях ниже.

    Спасибо, что нашли время, чтобы проверить этот учебник!

    Похожие

    LUX photo book - ваш эксклюзивный подарок для любимых!
    ... часть нашей жизни. Это также относится и к фотокнигам. На их карточках вы остановите самые важные для вас моменты, остановите время, которое так быстро бежит. ЛЮКС фотокнига является ответом на вопрос клиентов о фотопродукции, расположенной между классической фотокнигой, идеально подходящей для каждой фотографии, и эксклюзивным фотоальбомом «Премиум фото», часто предназначенным для крупных мероприятий. Фотокнига LUX - это качество известной
    Scareware: фальшивые приложения Minecraft напугать сотни тысяч в Google Play
    ESET обнаружил более 30 приложений-шпионских программ, доступных для загрузки в магазине Google Play. Приложения были установлены более чем 600 000 пользователей Android. ESET обнаружил более 30 КИБЕРБЕЗОПАСНОСТИ приложения доступны для скачивания из магазина Google Play. Вредоносные приложения, которые считались читами для популярной игры
    Как восстановить удаленные фотографии с iPhone? Прочтите это руководство, чтобы узнать 4 способа ве...
    Как восстановить удаленные фотографии с iPhone? Прочтите это руководство, чтобы узнать 4 способа вернуть удаленные фотографии с iPhone. Независимо от того, сделали ли вы резервную копию заранее, у вас есть шанс получить ее. iPhone XS (Max) и iPhone XR включены, а также работает для iOS 12. Прочитайте это руководство на других языках: Deutsch
    Обзор Huawei Mate S: Huawei выглядит выше
    Вскоре Huawei представит свой новый топ-лист для фаблетного рынка с Mate S. В этом обзоре мы увидим, насколько смартфон так же хорош, как Mate 7 прошлого года. Mate S идеально вписывается в стратегию, которую Huawei в настоящее время придерживается. Устройство просто не имеет высочайших технических характеристик и полностью привержено дизайну. При этом он мало отличается от Huawei P8, но Mate S немного больше и имеет сканер отпечатков пальцев. Поразительно, что смартфон только что сократился
    НЬЮ-ЙОРК ЗА 7 ДНЕЙ - как готовить, часть 2 - КУХНЯ TOMKA
    Нью-Йорк за семь дней - безумная идея. Этот город настолько огромен, что некоторым не достаточно его охватить. Здесь вы живете очень быстро, с большой скоростью, как в амоке. Сказать, что Нью-Йорк - это город, который никогда не спит, вероятно, самый точный термин для любого города в мире. Потому что Нью-Йорк никогда не спит. Итак, как вы обнимаете его за семь дней? Это можно сделать, хотя это будет нелегко. Перед отъездом самое главное: найти жилье, купить авиабилет, спланировать
    Учет бесплатно в инфакт
    ... часть бесплатной бухгалтерской программы Отвечая на потребности наших клиентов, мы подготовили специальный пакет для Бухгалтерской программы - Free Plan . В рамках бесплатного плана у вас есть доступ ко всем функциям Программы учета. Вы подготовите и отправите декларации по НДС в офис, рассчитаете подоходный налог и выполните формальности, связанные с новым обязательством - JPK . Больше информации
    Как установить MySQL Server с phpMyAdmin на FreeBSD 11
    MySQL - это бесплатная реляционная система управления с открытым исходным кодом. Хранит данные в табличном формате. Это самый популярный способ хранения данных в базе данных. phpMyAdmin также является бесплатным приложением с открытым исходным кодом, используемым для администрирования экземпляра сервера MySQL через богатый графический пользовательский интерфейс. phpMyAdmin написан на PHP. Для установки phpMyAdmin нам также потребуется установить веб-сервер с PHP на FreeBSD. В этом
    Как установить и использовать Webmin на CentOS 7
    Вступление Webmin это современная веб-панель управления для любого компьютера с Linux. Это позволяет вам администрировать ваш сервер через простой интерфейс. С Webmin вы можете изменить настройки для обычных пакетов на лету. В этом руководстве вы установите и настроите Webmin на своем сервере и обеспечите безопасный доступ к интерфейсу с помощью действующего сертификата, используя Давайте зашифруем
    Обзор интернет-безопасности Avast 2018
    В эти дни вы не можете быть слишком осторожны с настройкой безопасности вашего компьютера. Все больше и больше наших ежедневных транзакций происходит в Интернете, поэтому очень важно обеспечить защиту вашего компьютера от широкого спектра угроз, распространяющихся в Интернете. В этом Avast Internet Security В обзоре мы рассмотрим одну из самых популярных программ, разработанных для защиты вашего компьютера. Мы получаем
    Лучшее антивирусное программное обеспечение 2019 (Windows)
    Ранг 1 2 3 4 5 6 7 8 9 10 BullGuard Antivirus McAfee Antivirus Bitdefender Antivirus Norton Security Panda Dome Essential
    Lenovo Legion Y520 - полный обзор и тесты
    ... часть трекпада имеет длину 4,1 дюйма, а нижняя - 3,5 дюйма (что делает его трапециевидной), а высота - 2,2 дюйма. Во время навигации по Windows я часто сталкивался с пластиком и тихо ругался. Если вы не ударяете по бокам, это замечательно при распознавании жестов. аудио Колонки рядом с шарниром Легиона достаточно громкие, но вы не получаете всех деталей в своей музыке. Когда я слушал "Sing For Me" Йеллокарта, гитары и вокал были чистыми, но ударные были на тихой стороне,

    Комментарии

    3. Как развивался ваш блог с тех пор, как вы его начали?
    3. Как развивался ваш блог с тех пор, как вы его начали? Безусловно, я понял, что Hunter Style Style стал гораздо больше, чем блог, он стал платформой для сектора дизайна интерьера. Нынешняя настройка и дизайн блога не в состоянии обслуживать его новую аудиторию, поэтому в настоящее время мы занимаемся переработкой веб-сайта, чтобы реально вытолкнуть лодку и создать эту новую платформу. Помимо редакции, я также возглавляю маркетинговое агентство для дизайнеров интерьера, и мы получаем
    Мы хотим, чтобы ваш Обратная связь , Чего же ты ждешь?
    3. Как развивался ваш блог с тех пор, как вы его начали? Безусловно, я понял, что Hunter Style Style стал гораздо больше, чем блог, он стал платформой для сектора дизайна интерьера. Нынешняя настройка и дизайн блога не в состоянии обслуживать его новую аудиторию, поэтому в настоящее время мы занимаемся переработкой веб-сайта, чтобы реально вытолкнуть лодку и создать эту новую платформу. Помимо редакции, я также возглавляю маркетинговое агентство для дизайнеров интерьера, и мы получаем
    В общем, вы говорите, что парни из вашего местного автомеханика могут решить покрасить ваш автомобиль, достать радио и поставить разные колеса, верно?
    В общем, вы говорите, что парни из вашего местного автомеханика могут решить покрасить ваш автомобиль, достать радио и поставить разные колеса, верно? В конце концов ... вы позволяете им использовать ВАШЕ аппаратное обеспечение для выполнения ИХ работы ... поэтому им должно быть позволено делать с ним все, что они хотят, верно ??? Цитата: Если мы не можем сказать кому-либо, как включить java в браузере, без автоматического предположения, что это нарушает чей-то закон

    Что если бы вы могли сделать это с одной строкой кода внутри удобных границ Arduino?
    Заинтересовались?
    Как насчет того, чтобы добавить мышь к миксу сейчас?
    Ясно как грязь?
    Кто знал, что это так высоко?
    Контроллер медиаплеера?
    Хотите использовать старый аркадный джойстик во время игры онлайн аркада игра?
    Как восстановить удаленные фотографии с iPhone?
    Итак, как вы обнимаете его за семь дней?
    3. Как развивался ваш блог с тех пор, как вы его начали?

    Комментарии запрещены.