Оглавление:

Пульт дистанционного управления ESP32 Bluetooth BLE: 8 шагов
Пульт дистанционного управления ESP32 Bluetooth BLE: 8 шагов

Видео: Пульт дистанционного управления ESP32 Bluetooth BLE: 8 шагов

Видео: Пульт дистанционного управления ESP32 Bluetooth BLE: 8 шагов
Видео: Управление GRBL ESP32. Варианты подключения. Первый прототип дистанционного пульта. 2024, Ноябрь
Anonim
Пульт дистанционного управления ESP32 Bluetooth BLE
Пульт дистанционного управления ESP32 Bluetooth BLE
Пульт дистанционного управления ESP32 Bluetooth BLE
Пульт дистанционного управления ESP32 Bluetooth BLE
Пульт дистанционного управления ESP32 Bluetooth BLE
Пульт дистанционного управления ESP32 Bluetooth BLE
Пульт дистанционного управления ESP32 Bluetooth BLE
Пульт дистанционного управления ESP32 Bluetooth BLE

Этот проект является примером того, как подключить недорогой Bluetooth-джойстик BLE к ESP32. Код был написан с использованием Arduino IDE Ver 1.8.5 с надстройкой ESP32. Используемый джойстик BLE представляет собой коммерческое устройство, которое вы можете приобрести в Интернете менее чем за 20 долларов США или в местном магазине FiveBELoW за 5 долларов США.

Джойстик, который я использовал в этом проекте, - это пульт дистанционного управления Spektrum VR Control Bluetooth. Он продается как работающий с планшетами Android и IOS в качестве джойстика / мыши для использования с гарнитурами VR.

Пульт дистанционного управления VR Control Bluetooth имеет один джойстик с осями X и Y, две кнопки запуска спереди и шесть кнопок на ручке. Две кнопки предназначены для включения / выключения и управления режимами. Остальные четыре кнопки можно использовать для чего угодно. Этот проект представляет собой каркас или структуру, которая обрабатывает все интерфейсы Bluetooth и декодирование кнопок и джойстика. Все, что вам нужно сделать, это добавить вызовы функций для обработки того, что вы хотите, чтобы кнопки и джойстик выполняли. Вам не нужно ничего знать о Bluetooth, чтобы использовать эту платформу.

Существует множество веб-сайтов с подробными инструкциями по установке Arduino IDE и надстройки ESP32. Я не собираюсь повторять здесь эту информацию. Погуглите и следуйте инструкциям.

Платформа представляет собой адаптацию примера клиента BLE, опубликованного IoT Sharing. Вы можете найти это здесь. Вы можете изучить этот код, чтобы понять, как работает BLE. Expressif имеет полный пример для клиента GATT BLE и подробно объясняет операцию (не написано для Arduino IDE). Вы можете получить его здесь.

Это не учебник по BLE. Я не буду подробно объяснять, как работает код. Я буду использовать терминологию BLE, чтобы описать некоторые особенности джойстика. Часть кода, которую вам нужно изменить для вашего проекта, будет подробно объяснена, чтобы помочь вам изменить ее. Объем ограничен, чтобы данное Руководство было кратким и сосредоточено на использовании джойстика.

Шаг 1. Немного о Bluetooth с низким энергопотреблением (BLE)

Это не предназначено для руководства по BLE. Когда я начинал этот проект, я не знал разницы между BLE и Classic Bluetooth. Я просто хотел посмотреть, смогу ли я заставить купленный мной джойстик работать с ESP32. В следующем тексте я использую терминологию BLE, чтобы дать упрощенный обзор того, как работает BLE.

BLE использует архитектуру клиент / сервер. Одно устройство - это сервер, предоставляющий услуги. Другое устройство - это клиент, который использует услуги. Чтобы снизить требования к мощности, BLE передает только небольшие пакеты информации, когда происходит изменение. В случае джойстика устройство джойстика является сервером. В качестве сервера он рекламирует себя и по запросу передает список предоставляемых услуг. Устройство-джойстик рекламирует пять услуг. Единственная услуга, которая нас интересует, - это услуга BLE HID (Human Interface Device). Служба BLE имеет так называемые характеристики, связанные с ней. Характеристика обычно является источником данных. HID сервис джойстика имеет десять характеристик. Некоторые характеристики дублируются и игнорируются. Нас интересуют только характеристики отчета BLE, которые имеют возможности чтения и уведомления. Три характеристики соответствуют этим требованиям и предоставляют данные о положении джойстика и состоянии кнопок. Когда уведомление включено, сервер будет отправлять пакеты данных при обнаружении изменения в соответствующей характеристике.

Платформа проверяет, что на найденном сервере есть служба BLE HID, а затем активирует уведомления для трех характеристик отчета, которые предоставляют информацию о состоянии джойстика и кнопки. Затем, когда кнопка нажата или отпущена, или джойстик перемещается, ESP32 получает пакет данных, сообщающий ему, каково новое положение джойстика и / или состояние некоторых кнопок.

Шаг 2: Индикаторы сканирования и подключения

Платформа определяет два светодиода, GREENLED и BLUELED, и назначает их двум контактам GPIO ESP32. ЗЕЛЕНЫЙ светится, когда ESP32 ищет джойстик BLE. Когда джойстик найден, ЗЕЛЕНЫЙ свет выключается, а СИНИЙ светится, показывая, что соединение установлено и вы готовы к работе. Если соединение потеряно, СИНИЙ выключается, ESP32 сбрасывается, ЗЕЛЕНЫЙ светится и сканирование начинается снова. Если джойстик не будет найден в течение тридцати секунд, сканирование остановится, а ЗЕЛЕНЫЙ индикатор погаснет. Через пять секунд сканирование начнется снова, и загорится ЗЕЛЕНЫЙ.

Конечным результатом является то, что ESP32 будет продолжать сканировать джойстик, пока не найдет его. После того, как соединение будет установлено, если оно будет потеряно, ESP32 перезагрузится и снова начнет сканирование. ESP32 сбрасывается, потому что нет функций ESP32 SDK для сброса стека Bluetooth для перезапуска сканирования.

Шаг 3: Расшифровка событий джойстика и кнопок

Одно событие обратного вызова на ESP32 получает от сервера три разных пакета данных для трех характеристик, которые были настроены для предоставления уведомлений. Один пакет имеет длину четыре байта. Три байта содержат положение оси X, положение оси Y и кнопки триггера, которые отображены в байте по битам. Два других пакета состоят из двух байтов каждый и имеют один байт, который имеет состояние кнопки с отображением битов. Полученные пакеты декодируются и копируются в массив байтов в памяти. Данные оси джойстика помещаются в байты данных X и Y, и каждый из трех битовых байтов кнопок направляется в соответствующий байт для этих кнопок.

Задача FreeRTOS создается для обработки данных, полученных в уведомлениях. Одна задача для джойстика и кнопок триггера, одна задача для кнопок A и B и одна задача для кнопок C и D. Каждая из этих задач имеет четко обозначенные области, куда вы должны добавить код, чтобы делать то, что вы хотите с событием. Найдите комментарий «// ===== добавьте сюда свой код =====» в теле задачи и добавьте свой код после него. Каждая задача имеет комментарий, указывающий, для чего она используется, и использует Serial.println () для печати сообщения о произошедшем событии.

Вот пример из задачи кнопки A / B;

void taskButtonAB (void * параметр) {uint8_t buttons;

// ===== если задача требует единовременной инициализации, поместите ее сюда =====

while (true) {// отказываемся от ЦП, ждем новых данных vTaskSuspend (NULL); // мы только что проснулись, доступны новые данные buttons = VrBoxData [VB_BTNAB]; Serial.printf («Кнопки A / B:% 02X / n», кнопки); if (buttons & VB_BUTTON_A) {// кнопка A нажата или удерживается Serial.println ("Button A"); // ===== добавьте сюда свой код =====}

если (кнопки и VB_BUTTON_B)

{// кнопка B нажата или удерживается Serial.println ("Button B");

// ===== добавьте сюда свой код =====

}} // for} // taskButtonAB

Шаг 4: Работа VR Box: джойстик

Если джойстик оставлен в центральном положении, уведомления от джойстика не отправляются. Как только джойстик перемещается из центра, уведомление с данными джойстика и данных кнопки запуска отправляется примерно каждые 15 мс. Когда джойстик перемещается обратно в центр, уведомление о его перемещении в центр не отправляется. Другими словами, он говорит вам, что джойстик сместился от центра, но не о том, что он переместился в центр. Конечным результатом является то, что вы получаете сообщения о том, что джойстик движется к центру, но не о том, что он достиг центра. Очень назойливый. Две триггерные кнопки включены в данные джойстика. Нажатие одной из кнопок триггера после возврата джойстика в центр обновит положение джойстика до нуля. В Framework есть встроенный таймер тайм-аута, который автоматически имитирует сообщение с уведомлением от джойстика через короткое время после того, как все сообщения с уведомлением от джойстика / кнопки триггера перестают поступать. Таймер устанавливает джойстик на ноль. Джойстик имеет диапазон примерно +/- 25 по каждой оси.

Шаг 5: Работа VR Box: кнопки-триггеры

Кнопки триггера отправят уведомление один раз при нажатии и еще раз при отпускании. В сообщении с уведомлением о нажатии будет указана кнопка, которая была нажата. Сообщение с уведомлением о выпуске указывает, что обе кнопки отпущены.

Удерживая нижнюю кнопку триггера, сервер не сможет определить, что была нажата верхняя кнопка триггера. Удерживание верхней кнопки триггера и нажатие нижней кнопки триггера приводит к тому, что сервер отправляет уведомление о том, что нижняя кнопка триггера нажата (верхняя кнопка триггера будет нулевой!). Если отпустить нижнюю кнопку триггера, сервер отправит уведомление о том, что верхняя кнопка триггера нажата, а нижняя кнопка отпущена.

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

Шаг 6: Работа VR-бокса: кнопки A / B

Кнопки A и B действуют как джойстик и непрерывно отправляют уведомления при нажатии и удерживании. Сообщения прекращаются, когда кнопка отпускается. Кнопки A и B работают аналогично кнопкам триггера в том, что кнопка A доминирует над кнопкой B, так же как нижняя кнопка триггера доминирует над верхней кнопкой триггера.

Шаг 7: Работа VR-бокса: кнопки C / D

Кнопки C и D отправляют уведомление один раз при нажатии и еще раз при отпускании. Если удерживать нажатой, дальнейшие сообщения не отправляются, пока они не будут выпущены. Удерживая нажатой одну из кнопок C или D, сервер не сможет определить активность другой кнопки.

Шаг 8: Заключение

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

Вы сами решаете, что должна делать каждая кнопка и что должно делать джойстик. Как вы будете справляться с различиями в триггере, кнопках A и B и C и D - решать вам.

Поищите в коде; taskJoyStick (), taskButtonAB (), taskButtonCD () и добавьте свой код после комментария «// ===== добавьте свой код сюда =====».

Вам потребуется до четырех функций для работы с джойстиком (вперед, назад, вправо и влево) и до шести функций для работы с различными кнопками. Реализуйте их все или только то, что вам нужно. Выбор остается за вами.

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

Если у вас есть вопросы о том, как это работает, или вам нужна помощь, чтобы заставить его работать, свяжитесь со мной.

Код доступен на GitHub здесь.

Наслаждаться.

Рекомендуемые: