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 квітня, яка буде натискати клавіші через певні інтервали. Така річ доставить вашій цілі купу незабутніх емоцій. Тільки тсс, я цього не говорив.
Прикриплені файли:
- Guitar.rar (2 Кб)