Arduino как HID устройство

До сих пор мы работали только с Arduino UNO. Да вот только то, что я сегодня покажу не работает с Arduino UNO.  На самом деле можно, конечно, но в таком случае нужно кое-чего подшаманить, а это кое-чего не так-то и просто. Что же тогда делать? А вот что.

Кроме Arduino UNO существует множество других версий Arduino. Это и Arduino Nano или Mini, когда размер имеет значение, и Arduino Mega, когда пинов и ресурсов на UNO уже не хватает, а еще нужно подключить килограмм датчиков. А если форм-фактор UNO уж больно нравится, а аналоговых пинов не хватает, то на помощь придет Leonardo.

На Leonardo мы сегодня и остановимся. Отличие Leonardo от UNO не только в дополнительных аналоговых пинах, но и в архитектуре. На Leonardo доступен виртуальный Serial port. Что это нам дает? Как минимум то, что 1 и 0 пины, которые отвечают за соединение с компьютером на UNO остаются свободными, а при открытии Serial соединения плата не перезагружается. Примите это во внимание. И главный козырь – компьютер считает Leonardo за HID устройство (Human interface device), а это говорит о том, что Leonardo может притвориться клавиатурой или мышью. Это свойство то мы и будем использовать.

Предыстория

Я люблю играть на электрогитаре. Часто играю в программе Guitar rig. Эта программа является виртуальным гитарным процессором, то есть обрабатывает звук с гитары. К чему все это. При игре нужно переключаться между пресетами, а руки то заняты. Есть решение – приобрести контроллер для этой программы, вот только он больше не выпускается, да и стоит прилично. А что если соорудить педаль самому? Вот что из этого получилось.

Нам понадобятся

Arduino Leonardo или его аналоги

Главное – чтобы плата определялась как HID устройство

 

Кнопка

Тут уж по вашему вкусу

Соединительные провода

Корпус

Тут есть где разгуляться дизайнерской мысли. Я решил не заморачиваться особо и соорудил подобие педали из двух фанерок, обильно смазанных термоклеем. Побаловаться – в самый раз.

Пол царства за термоклей.

Свой среди HID

Как я уже и говорил, Leonardo может притворяться клавиатурой или мышью. Это осуществляется с помощью встроенной библиотеки. Ниже приведен пример кода. Попробуйте запустить его у себя на компьютере. Должна произойти странная вещь.

 // Подключаем библиотеку для управления клавиатурой #include "Keyboard.h"  void setup() {   // Стартуем    Keyboard.begin();   delay(3000);    // Выделяем весь документ   Keyboard.press(KEY_LEFT_CTRL);   Keyboard.press('a');   delay(500);   Keyboard.releaseAll();    // Стираем текст   Keyboard.write(KEY_BACKSPACE);   delay(500);    // Пишем сообщение   Keyboard.println("Te he.I am controlling your keyboard");   delay(1000);    // Выделяем весь документ   Keyboard.press(KEY_LEFT_CTRL);   Keyboard.press('a');   delay(500);   Keyboard.releaseAll();    // Пишем сообщение   Keyboard.println("Goodbye!");   delay(1000);   // Выделяем весь документ   Keyboard.press(KEY_LEFT_CTRL);   Keyboard.press('a');   delay(500);   Keyboard.releaseAll();    // Стираем текст   Keyboard.write(KEY_BACKSPACE);   delay(500);   Keyboard.releaseAll();    // Сохраняем документ   Keyboard.press(KEY_LEFT_CTRL);   Keyboard.press('s');   delay(500);   Keyboard.releaseAll();    // Чтобы откатить все назад, нажмите ctrl + z несколько раз }  void loop()  { }

Не спешите бежать и рассказывать о восстании машин. Так и было задумано. Теперь разберемся как это работает.

Keyboard.press(button) – эта команда говорит Leonardo о том, что нужно нажать кнопку на клавиатуре. Аргументом принимает букву или специальное обозначение клавиши. KEY_LEFT_CTRL – это левый Ctrl, например. Все обозначения можно посмотреть тут.

Можно нажимать комбинации клавиш. Для этого пропишите несколько строк кода с нужными клавишами. Например, чтобы сохранить текст есть комбинация Ctrl + s, Leonardo тоже сможет сохранить текст если выполнить такой код:

 Keyboard.press(“s”); Keyboard.press(KEY_LEFT_CTRL);

Keyboard.releaseAll() – команда говорит Leonardo отпустить клавиши. Заметьте, что предыдущая команда говорит Leonardo только о нажатии клавиши. Если не прописать Keyboard.releaseAll(), то клавиша будет зажата и дальше. Прямо как в реальности. Попробуйте открыть текстовый редактор и зажать клавишу.

Keyboard.println(«Some text«) – эта команда отвечает за печать текста. Тут все предельно ясно. Работает как Serial.println.

Там есть и другие функции, но эти – самые основные. Их нам хватит, чтобы сделать педаль для гитары. Если кому интересно, что еще есть в этой библиотеке или в похожей для мыши, то можно открыть примеры/USB и почитать тут. Переходим к сборке педали.

Схема

С конструкцией можно подумать, а схема устройства крайне проста. Ниже приведена схема на макетке.

Код

 // Подключаем библиотеку для работы с Leonardo как с клавиатурой #include "Keyboard.h"  // Определяем пин кнопки #define BUTTON_PIN  A0 // Создаем переменную для считывания показаний с кнопки bool button = 0;  void setup()  {   // Открываем соединение с COM портом   Serial.begin(9600);   // Определяем кнопку как вход с подтягивающим резистором   // Что такое подтягивающий резистор и для чего он нужен можно прочитать здесь:   // http://cxem.net/arduino/arduino185.php   pinMode(BUTTON_PIN, INPUT_PULLUP); }  void loop()  {   // Считываем показания с кнопки   button = digitalRead(BUTTON_PIN);    // Помним, что в отпущеном состоянии значение на кнопке равно 1    if(!button)   {     // Отправляем клавишу в Serial. Я решил отправлять n     // Для некоторых клавиш есть специальные обозначения.     // Например, чтобы отправить левый Shift, вы должны написать такую команду - Keyboard.press(KEY_LEFT_SHIFT );     // Коды для других клавиш приведены здесь      // https://www.arduino.cc/en/Reference/KeyboardModifiers       Keyboard.press('n');     // Ждем немного     delay(10);   }   else   {     // Когда кнопка отпущена - отправляем команду остановить все нажатия     Keyboard.releaseAll();   } }

Видео

На видео показан тест устройства в Microsoft Word и использование в качестве педали для переключения пресетов в guitar Rig 5. Для этого я создал новый контроллер, запомнил клавишу и задал действие.

Итог

Оказывается, существуют и другие Arduino, не менее полезные, а где-то и более полезные чем UNO.

Используя Leonardo в качестве клавиатуры или мыши можно создавать интересные вещи. Например, флешку-розыгрыш на 1 апреля, которая будет нажимать клавиши через определенные интервалы. Такая штучка доставит вашей цели кучу незабываемых эмоций. Только тсс, я этого не говорил.