Однажды я узнал про существование микроконтроллеров ESP32, обладающих встроенными Bluetooth и Wi-Fi модулями. Тогда я начал всем рассказывать, какая крутая железка, пока мне ее наконец-то не подарили.
На момент создания материала, такой микроконтроллер можно купить в РФ с доставкой менее, чем за 1000 рублей. Ну не чудо ли?
Получив железку в руки, я начал думать, зачем же она мне. В первую очередь пришла мысль реализовать глушилку Bluetooth-колонки, но об этом как-нибудь позже.
Тут я вспомнил времена учебы в институте, где мы имитировали HID-устройство с помощью микроконтроллеров. Поэтому, задался вопросом, можно ли то же самое сделать для Bluetooth-клавиатуры. Оказывается, таких проектов довольно много, и я решил один из них повторить.
На GitHub существует прекрасная библиотека, позволяющая реализовать мою идею.
Итак, начнем.
Настройка окружения
Для написания кода можно использовать буквально что угодно, однако довольно каноничной и удобной средой разработки является Arduino IDE.
Скачиваем IDE и запускаем.
Здесь нам необходимо скачать пакет для поддержки плат ESP32:
Переходим в менеджер плат - нажимаем Ctrl+Shift+B
В открывшемся окне вводим ESP32
![](https://habrastorage.org/getpro/habr/upload_files/e32/197/7a5/e321977a52d571593f610e5b2e8fbae2.png)
Здесь нам необходимо скачать esp32 от Espressif. Замечу, что последняя версия не подходит для используемой библиотеки, и нам нужна версия 2.0.1 – на более поздних не компилируется.
Затем, создаем новый скетч нажатием Ctrl+N
Скачиваем библиотеку и подключаем ее через контекстное меню Скетч->Подключить библиотеку->добавить .ZIP библиотеку
IDE любезно говорит, что библиотека установлена:
![](https://habrastorage.org/getpro/habr/upload_files/070/ee6/ee6/070ee6ee62293248e1b8eabca45b917d.png)
Затем, подключаем микроконтроллер к ПК и идем в менеджер устройств – нажимаем WIN+R и вызываем devmgmt.msc
Переходим в Порты (COM и LPT), где видим наше устройство
![](https://habrastorage.org/getpro/habr/upload_files/caa/df0/b81/caadf0b813d83e911738c3a879a2eb1a.png)
Если у вас устройство не определяется, необходимо установить драйвер (гуглится по запросу “{Модель чипа} driver”)
Затем, возвращаемся в IDE и конфигурируем настройки платы:
В верхней части рабочего пространства открываем выпадающий список и выбираем пункт “Выберите другую плату и порт”
![](https://habrastorage.org/getpro/habr/upload_files/51c/750/f0a/51c750f0ab3f3090f7270d9eaaeac98f.png)
И настраиваем соответствие названия платы и COM-порта
![](https://habrastorage.org/getpro/habr/upload_files/a1f/e98/82e/a1fe9882e5ba850a74c0aafcb17df695.png)
На этом настройка окружения заканчивается.
Переходим к программированию
В качестве полезной нагрузки будем открывать RickRoll на Youtube.
Берем пример из библиотеки и реализуем следующие функции:
void setup() {
Serial.begin(115200);
Serial.println("Starting BLE work!");
bleKeyboard.begin();
}
void loop() {
if(bleKeyboard.isConnected()) {
delay(1000);
}
Serial.println("Waiting 5 seconds...");
delay(5000);
}
Далее реализуем открытие web-страницы.
Например, это можно сделать путем вызова powershell с параметрами “-c Start-Process http://example.com”
Напишем простой скрипт, который открывает страницу с видео.
Для этого будем вызывать WIN+R и вводить команду на исполнение.
В библиотеке реализованы следующие функции для ввода текста:
press, release, write, releaseAll, print, поэтому наша функция loop будет выглядеть следующим образом:
void loop() {
if(bleKeyboard.isConnected()) {
bleKeyboard.press(KEY_LEFT_GUI);
bleKeyboard.print("r");
delay(100);
bleKeyboard.releaseAll();
delay(100);
bleKeyboard.print("powershell.exe -с \"Start-Process https://www. youtube.com/watc h?v=dQw4w9WgXcQ\"");
delay(100);
bleKeyboard.write(KEY_RETURN);
}
Serial.println("Waiting 5 seconds...");
delay(5000);
}
Однако, по неизвестным мне причинам, ввод длинных строк периодически вызывал залипание клавиши, и вводимая строка превращалась во что-то вроде “powershelllllllllllllll”
Поэтому, путем ручного подбора длины команды, была выработана оптимальная длина, и итоговый скрипт выглядит следующим образом:
#include <BleKeyboard.h>
BleKeyboard bleKeyboard;
void setup() {
Serial.begin(115200);
Serial.println("Starting BLE work!");
bleKeyboard.begin();
}
void loop() {
if(bleKeyboard.isConnected()) {
bleKeyboard.press(KEY_LEFT_GUI);
bleKeyboard.print("r");
delay(100);
bleKeyboard.releaseAll();
delay(100);
bleKeyboard.print("powershell.exe");
delay(100);
bleKeyboard.print(" -c ");
delay(100);
bleKeyboard.print("\"Start-Process");
delay(100);
bleKeyboard.print(" https://www.");
delay(100);
bleKeyboard.print("youtube.com/watc");
delay(100);
bleKeyboard.print("h?v=dQw4w9WgXcQ\"");
delay(100);
bleKeyboard.write(KEY_RETURN);
delay(1000);
}
Serial.println("Waiting 5 seconds...");
delay(5000);
}
Результат
Загружаем скрипт на микроконтроллер путем нажатия на стрелку вверху рабочего пространства
![](https://habrastorage.org/getpro/habr/upload_files/4ac/ecc/867/4acecc867ce59ae04cb38829a24395de.png)
Немного ждем, пока скетч скомпилируется
![](https://habrastorage.org/getpro/habr/upload_files/508/41e/ed6/50841eed64c9fdbde811229860afadfa.png)
И в итоге получаем сообщение об успешной записи кода на плату
![](https://habrastorage.org/getpro/habr/upload_files/ea7/3da/a78/ea73daa7852a425db2e73240c9091d76.png)
Теперь наш микроконтроллер выступает в роли Bluetooth-клавиатуры
Подключаемся к устройству через Bluetooth
![](https://habrastorage.org/getpro/habr/upload_files/095/eb1/e23/095eb1e23c78d320ee9e7358c507d2ab.png)
И видим, что все работает
GIF
![](https://habrastorage.org/getpro/habr/upload_files/58e/98b/8e1/58e98b8e161a0a867fcf1f785ec6df68.gif)
Наверняка, можно использовать имитацию клавиатуры как-нибудь более весело, но как пример вполне сойдет.
Пишите в комментариях, что хотели бы увидеть в реализации на этой платформе. Мне очень интересно разобраться поглубже.
Подписывайтесь на наш telegram-канал AUTHORITY
Комментарии (16)
GennPen
25.08.2024 05:10+2Библиотека поддерживает смену названия BT-устройства. Почему вы этим не воспользовались?
Однако, по неизвестным мне причинам, ввод длинных строк периодически вызывал залипание клавиши, и вводимая строка превращалась во что-то вроде “powershelllllllllllllll”
Скорее всего вывод команд идет со слишком маленькой паузой. Интересней было бы изучение данной ошибки на низком уровне, т.к. имитаторов клавиатур на ардуине в интернете вагон и маленькая тележка.
FunnyWhale Автор
25.08.2024 05:10Библиотека поддерживает смену названия BT-устройства. Почему вы этим не воспользовались?
Да, я видел. На самом деле, можно еще и устанавливать vendor id и product id. Решил, что здесь это не нужно.
Библиотека поддерживает смену названия BT-устройства. Почему вы этим не воспользовались?
Сделаю. Спасибо)
riky
25.08.2024 05:103д мышь бы сделать на датчиках холла
Yuri0128
25.08.2024 05:10Ну, пробуйте!
А вообще-то, тяжко работать с магнитным полем Земли, - или вы к чему-то другому хотте привязаться?
riky
25.08.2024 05:10конечно относительно магнита(ов).
относительно земли это уже надо электронный компас/гироскоп. но смысла нет.NutsUnderline
25.08.2024 05:10еще бы понять - зачем.
был например манипулятор 3d space connexion - он типа 3d джойстика и похоже на датчиках холла. Хорошие джойстики для радиомоделей всяких тоже на холле, хотя и две оси.
а просто чтобы в воздухе махать - и с акселерометрами нормально работает и нинтенды и тв приставки
и с камерами тоже неплохо дело обстоит
хотя с магнитным полем тоже был девайс razer hydra - у него специальная катушка поле создавала, но про эту штуку уже мало кто помнит даже
riky
25.08.2024 05:10+1да, connexion и имел ввиду... зачем?
fun
самоделка
для любителей 3д печати и потенциально небольшого кол-ва моделирования в CAD, непонятно стоит ли тратить 170-400$ за эту игрушку. если бы ее можно было недорого и легко напечатать и попробовать - то почему нет? только наверное надо будет какой то драйвер писать свой который движения будет выполнять в программе правильные вращения/перемещения. и помимо драйвера еще и в программы моделирования какие то расширения наверное надо будет. вряд ли всё можно заменить просто горячими клавишами, хотя кто знает...
Yuri0128
25.08.2024 05:10Просто для "fun" - можно, сложновато правда и времени убьется много.
Как "самоделка" - та ну нафиг, неоправдано по затратам времени.
Драйвер однозначно придется писать (хотя - сложный вопрос, можно просто модификаторам обойтись), расширений для CAD не надо, - там во многих уже есть прстойная поддержка 3-мерных позиционеров (если что - пробовал сам, вполне достойно, но сами "мышки" ну очень дорогие, для профа их под себя подбирать надо (не всем заходят) а для любительства - так переучиваться надо и дорого (если хоть сколь-нибуть пристойный), что сразу делает их непрактичным для подавляющего большинства).
Ну и рука без опоры (для некоторых систем) устает (те же перчатки, шар с акселерометрами) а с опорой - так переучиваться надо. Работать ведь приходится не по 15 мнут в день и это не играть.
NutsUnderline
25.08.2024 05:10connexion работает через hid, нужен как бы не драйвер а именно что расширение под каждый софт отдельно
GennPen
25.08.2024 05:10Тогда уж гироскоп+акселерометр. Угловое положение и изменение в пространстве - гироскоп+акселерометр, линейное смещение в пространстве - акселерометр.
riky
25.08.2024 05:10точность низкая, все на датчиках холла сейчас делают - и модель не будет вращаться если эту "мышь" подвигать на столе.
GennPen
25.08.2024 05:10Если создавать локальное магнитное поле, то скорее всего да, точность выше будет.
Yuri0128
25.08.2024 05:10точность низкая,
это что имеется в ввиду? Разрешение - да 19200 dpi не получить а вот точность движения - ну вполне норм, с повторяемостью тоже есть небольше проблемы - уход нуля все-же есть.
На Холла делается потому, что проще математика и меньше уход 0. Но есть другие проблемы (+ калибровать надо или придумывать автокалбровку).
Попробуйте, - поделитесь результатом.
shushu
Я все же рекомендую освоить esp idf framework, а не Arduino
FunnyWhale Автор
Спасибо! А в чем явные преимущества?
NutsUnderline
это дает возможность понять как это работает, хотя для этого придется углубится в 33 уровня абстракции во всяких библиотеках и понять что там залипает. это позволит сделать например свою беспроводную клавиатуру. А не абстрактную штуковину которая будет печатать всякое, если ей дозволят (добавят) ;)