Однажды я узнал про существование микроконтроллеров ESP32, обладающих встроенными Bluetooth и Wi-Fi модулями. Тогда я начал всем рассказывать, какая крутая железка, пока мне ее наконец-то не подарили.

На момент создания материала, такой микроконтроллер можно купить в РФ с доставкой менее, чем за 1000 рублей. Ну не чудо ли?

Получив железку в руки, я начал думать, зачем же она мне. В первую очередь пришла мысль реализовать глушилку Bluetooth-колонки, но об этом как-нибудь позже.

Тут я вспомнил времена учебы в институте, где мы имитировали HID-устройство с помощью микроконтроллеров. Поэтому, задался вопросом, можно ли то же самое сделать для Bluetooth-клавиатуры. Оказывается, таких проектов довольно много, и я решил один из них повторить.

На GitHub существует прекрасная библиотека, позволяющая реализовать мою идею.

Итак, начнем.

Настройка окружения

Для написания кода можно использовать буквально что угодно, однако довольно каноничной и удобной средой разработки является Arduino IDE.

Скачиваем IDE и запускаем.

Здесь нам необходимо скачать пакет для поддержки плат ESP32:

Переходим в менеджер плат - нажимаем Ctrl+Shift+B

В открывшемся окне вводим ESP32

Здесь нам необходимо скачать esp32 от Espressif. Замечу, что последняя версия не подходит для используемой библиотеки, и нам нужна версия 2.0.1 – на более поздних не компилируется.

Затем, создаем новый скетч нажатием Ctrl+N

Скачиваем библиотеку и подключаем ее через контекстное меню Скетч->Подключить библиотеку->добавить .ZIP библиотеку

IDE любезно говорит, что библиотека установлена:

Затем, подключаем микроконтроллер к ПК и идем в менеджер устройств – нажимаем WIN+R и вызываем devmgmt.msc

Переходим в Порты (COM и LPT), где видим наше устройство

Если у вас устройство не определяется, необходимо установить драйвер (гуглится по запросу “{Модель чипа} driver”)

Затем, возвращаемся в IDE и конфигурируем настройки платы:

В верхней части рабочего пространства открываем выпадающий список и выбираем пункт “Выберите другую плату и порт”

И настраиваем соответствие названия платы и COM-порта

На этом настройка окружения заканчивается.

Переходим к программированию

В качестве полезной нагрузки будем открывать 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);
}

Результат

Загружаем скрипт на микроконтроллер путем нажатия на стрелку вверху рабочего пространства

Немного ждем, пока скетч скомпилируется

И в итоге получаем сообщение об успешной записи кода на плату

Теперь наш микроконтроллер выступает в роли Bluetooth-клавиатуры

Подключаемся к устройству  через Bluetooth

И видим, что все работает

GIF

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

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

Подписывайтесь на наш telegram-канал AUTHORITY

Комментарии (16)


  1. shushu
    25.08.2024 05:10
    +1

    Я все же рекомендую освоить esp idf framework, а не Arduino


    1. FunnyWhale Автор
      25.08.2024 05:10

      Спасибо! А в чем явные преимущества?


      1. NutsUnderline
        25.08.2024 05:10
        +2

        это дает возможность понять как это работает, хотя для этого придется углубится в 33 уровня абстракции во всяких библиотеках и понять что там залипает. это позволит сделать например свою беспроводную клавиатуру. А не абстрактную штуковину которая будет печатать всякое, если ей дозволят (добавят) ;)


  1. GennPen
    25.08.2024 05:10
    +2

    Библиотека поддерживает смену названия BT-устройства. Почему вы этим не воспользовались?

    Однако, по неизвестным мне причинам, ввод длинных строк периодически вызывал залипание клавиши, и вводимая строка превращалась во что-то вроде “powershelllllllllllllll”

    Скорее всего вывод команд идет со слишком маленькой паузой. Интересней было бы изучение данной ошибки на низком уровне, т.к. имитаторов клавиатур на ардуине в интернете вагон и маленькая тележка.


    1. FunnyWhale Автор
      25.08.2024 05:10

      Библиотека поддерживает смену названия BT-устройства. Почему вы этим не воспользовались?

      Да, я видел. На самом деле, можно еще и устанавливать vendor id и product id. Решил, что здесь это не нужно.

      Библиотека поддерживает смену названия BT-устройства. Почему вы этим не воспользовались?

      Сделаю. Спасибо)


  1. riky
    25.08.2024 05:10

    3д мышь бы сделать на датчиках холла


    1. Yuri0128
      25.08.2024 05:10

      Ну, пробуйте!

      А вообще-то, тяжко работать с магнитным полем Земли, - или вы к чему-то другому хотте привязаться?


      1. riky
        25.08.2024 05:10

        конечно относительно магнита(ов).
        относительно земли это уже надо электронный компас/гироскоп. но смысла нет.


        1. NutsUnderline
          25.08.2024 05:10

          еще бы понять - зачем.

          был например манипулятор 3d space connexion - он типа 3d джойстика и похоже на датчиках холла. Хорошие джойстики для радиомоделей всяких тоже на холле, хотя и две оси.

          а просто чтобы в воздухе махать - и с акселерометрами нормально работает и нинтенды и тв приставки

          и с камерами тоже неплохо дело обстоит

          хотя с магнитным полем тоже был девайс razer hydra - у него специальная катушка поле создавала, но про эту штуку уже мало кто помнит даже


          1. riky
            25.08.2024 05:10
            +1

            да, connexion и имел ввиду... зачем?

            1. fun

            2. самоделка

            3. для любителей 3д печати и потенциально небольшого кол-ва моделирования в CAD, непонятно стоит ли тратить 170-400$ за эту игрушку. если бы ее можно было недорого и легко напечатать и попробовать - то почему нет? только наверное надо будет какой то драйвер писать свой который движения будет выполнять в программе правильные вращения/перемещения. и помимо драйвера еще и в программы моделирования какие то расширения наверное надо будет. вряд ли всё можно заменить просто горячими клавишами, хотя кто знает...


            1. Yuri0128
              25.08.2024 05:10

              Просто для "fun" - можно, сложновато правда и времени убьется много.

              Как "самоделка" - та ну нафиг, неоправдано по затратам времени.

              Драйвер однозначно придется писать (хотя - сложный вопрос, можно просто модификаторам обойтись), расширений для CAD не надо, - там во многих уже есть прстойная поддержка 3-мерных позиционеров (если что - пробовал сам, вполне достойно, но сами "мышки" ну очень дорогие, для профа их под себя подбирать надо (не всем заходят) а для любительства - так переучиваться надо и дорого (если хоть сколь-нибуть пристойный), что сразу делает их непрактичным для подавляющего большинства).

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


              1. NutsUnderline
                25.08.2024 05:10

                connexion работает через hid, нужен как бы не драйвер а именно что расширение под каждый софт отдельно


    1. GennPen
      25.08.2024 05:10

      Тогда уж гироскоп+акселерометр. Угловое положение и изменение в пространстве - гироскоп+акселерометр, линейное смещение в пространстве - акселерометр.


      1. riky
        25.08.2024 05:10

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


        1. GennPen
          25.08.2024 05:10

          Если создавать локальное магнитное поле, то скорее всего да, точность выше будет.


        1. Yuri0128
          25.08.2024 05:10

          точность низкая,

          это что имеется в ввиду? Разрешение - да 19200 dpi не получить а вот точность движения - ну вполне норм, с повторяемостью тоже есть небольше проблемы - уход нуля все-же есть.

          На Холла делается потому, что проще математика и меньше уход 0. Но есть другие проблемы (+ калибровать надо или придумывать автокалбровку).

          Попробуйте, - поделитесь результатом.