Управление для DIY-проекта с помощью Bluetooth геймпада. Часть 1 (Arduino)

Некоторые DIY-проекты включают в себя тот или иной вид дистанционного управления. Есть множество способов и протоколов для его реализации, и один из них — Bluetooth. В этой статье будет рассказано о подключении Bluetooth геймпада к Arduino.

b618019749a5f62e77f3956bbae4f4b9.jpg

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

Часть 1 (Arduino) — вы сейчас здесь

Часть 2 (ESP32) — все то же самое будет сделано и на ESP32

Выбор железа с поддержкой Bluetooth

Классические Arduino (Nano, например) не содержат в себе никаких беспроводных средств коммуникации, и поэтому для использования Bluetooth понадобится дополнительный модуль.

Основная масса материалов, которые гуглятся по запросу Arduino + Bluetooth, предлагают готовые схемы и библиотеки для модулей HC-05 или HC-06. К сожалению, хотя эти модули и обеспечивают связь по Bluetooth, в них реализован только единственный профиль — Bluetooth Serial Port Profile (SPP), представляющий из себя, по сути, беспроводной COM-порт. Для управления через такие модули вам понадобится устройство, которое также поддерживает этот профиль и будет посылать команды через открытый порт — обычно это либо готовое Android-приложение, либо какая-то собственная разработка с несложным, но специализированным UI под конкретный сценарий управления.

Если вы планируете использовать для управления именно геймпад, то вам понадобится более продвинутый Bluetooth модуль для Arduino.

Следующим кандидатом является Arduino Nano 33 BLE — это готовая плата от Arduino сразу c Bluetooth чипом. Плата, в целом, заслуживала бы отдельной статьи, поскольку интересных отличий от классических Arduino и вообще функций там предостаточно (Bluetooth, новая процессорная архитектура, датчик движения, поддержка Python), однако я сомневаюсь, что плата станет популярной:

  1. Цена. Доступных клонов нет, а оригинальная плата в плане цены совершенно неконкурентоспособная

  2. Поддержка только BLE (Bluetooth Low Enegry). Этот вид Bluetooth модный и современный, разработан специально для небольших устройств и всяческих датчиков. За счет упрощения, чипы BLE и устройства на их основе должны получаться дешевле и доступнее (противоречия с предыдущим пунктом тут нет, цена оригинальных плат всегда высокая), да и в целом разработка с использованием BLE намного легче по сравнению с Bluetooth Classic. Обратная сторона медали — через BLE не получится подключить те устройства, которым нужен Bluetooth Classic

Единственный известный мне геймпад, который уже поддерживает BLE — это только последняя ревизия контроллера Xbox. А большинство геймпадов продолжают использовать как раз BT Classic (4.0, 5.0 и более поздние версии).

Впрочем, простой способ подключить устройства BT Classic к классическим Arduino все равно существует.

Arduino USB Host Shield

Способ, о котором пойдет речь далее в этой статье — это использование нескольких связанных компонентов:

  1. Плата Arduino

  2. USB Host Shield к этой плате

  3. USB Bluetooth адаптер

  4. Собственно Blutooth геймпад

USB Host Shield

USB Host Shield

Как вы могли заметить, USB Host Shield по масштабам соответствует плате Arduino Uno, а такой конструктор подойдет по размеру далеко не ко всем DIY-проектам. Для более компактных проектов существует Mini USB Host Shield, который по габаритам соответствует уже Arduino Pro Mini, этот набор и будем использовать далее.

Mini USB Host Shield

Mini USB Host Shield

Mini USB Host Shield бывает в двух вариантах — с питанием на 3.3В и на 5В (что тоже соответствует доступным вариантам Pro Mini). Так как плата все же старая, и, видимо, не пользующаяся спросом, в продаже на маркетплейсах сейчас остались только варианты на 3.3В. Были некоторые сомнения, хватит ли 3.3В для питания USB Bluetooth адаптера (который по стандарту все-таки 5В), но, забегая вперед, скажу что и 3.3В хватает для стабильной работы. Поэтому, если все же будете реализовывать описываемую в статье схему подключения BT устройств, то смело покупайте Mini USB Host Shield на 3.3В.

Что касается USB Bluetooth адаптера — готовая библиотека, которая будет далее использована, достаточно старая и редко обновляется (да и в ее обновлении по большому счету нет смысла уже), гарантированно поддерживаются только USB BT 4.0 адаптеры (полный список есть в документации на библиотеку, ссылка будет ниже). Для использования в подобном проекте можно купить что-то с названием, похожим на CSR 4.0, например.

Arduino Pro Mini

Arduino Pro Mini — самая компактная из классических плат Arduino.

Arduino Pro Mini

Arduino Pro Mini

Функционально и по количеству пинов Pro Mini соответствует плате Nano, с одним важным отличием: уменьшение размеров достигнуто за счет удаления с платы USB-UART конвертера. Для подключения к компьютеру и заливки скетчей вам понадобится специальный кабель (о нем чуть ниже). При этом на плате все равно сохранен регулятор напряжения, позволяющий подключить питание от нерегулируемого источника 5–12В. Так как Mini USB Host Shield доступен в 3.3В исполнении, Pro Mini будет тоже на 3.3В (а еще Pro Mini бывает в 5В варианте).

USB-UART адаптер

Этот раздел можете пропустить, если вам уже знаком процесс заливки скетчей в Arduino платы без встроенного USB-UART чипа.

USB-UART адаптер

USB-UART адаптер

Сами процессоры семейства megaAVR, на которых основаны классические Arduino, не имеют встроенного USB интерфейса. На полноразмерных платах Arduino есть дополнительный чип USB-UART, и поэтому такие платы можно подключать к компьютеру обычным USB кабелем.

В случае с Pro Mini, на плате вместо привычного разъема USB расположены только выводы пинов GND/VCC/TX/RX/DTR. Для подключения такой платы к компьютеру необходим внешний USB-UART адаптер. Обычно адаптер представляет из себя кабель, с одной стороны у которого USB-male разъем, с другой стороны шлейф для подключения к пинам Arduino, а в середине плата с чипом USB-UART (и, возможно, с джампером 3.3/5В — обратите на него внимание, выходное напряжение должно соответствовать плате Arduino).

Очень часто такие кабели встречаются на маркетплейсах под названием FTDI-кабель, покупать такие варианты я не советую: скорее всего, с таким названием продается неоригинальный клон, и после одной истории для использования FTDI-клона придется скачивать модифицированный драйвер с какого-то неизвестного сайта.

Более надежный вариант — это USB-UART адаптеры на чипах CH340 или CP2102, драйверы для которых доступны на сайтах известных производителей компонентов (https://learn.sparkfun.com/tutorials/how-to-install-ch340-drivers/all или https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers). При покупке также стоит обратить внимание на наличие провода для подключения к пину DTR (и отсутствие негативных отзывов — бывает DTR есть, а работает криво). Корректно работающий DTR сильно упрощает процесс заливки скетчей из Arduino IDE. Также на адаптерах бывает перепутана маркировка пинов TX/RX, поэтому если адаптер определяется, система видит COM порт, но скетчи не загружаются — попробуйте поменять местами подключения TX/RX, а также поднять настройку скорости порта до 115200.

Подключение Mini USB Host Shield к Arduino Pro Mini

Поскольку Mini USB Host Shield — это плата-шилд, то для подключения к контроллеру нужно соединить соответствующие пины на платах. На самом деле, будет достаточно вот этих соединений: питание, RST, и SPI-пины.

Минимальная схема соединения Mini USB Host Shield и Arduino Pro Mini

Минимальная схема соединения Mini USB Host Shield и Arduino Pro Mini

Пины на Mini USB Host Shield не обозначены, правильную ориентацию платы можно определить по USB разъему и чипу — на приведенной схеме они с верхней стороны платы.

Сборку можно сделать, например, в таком виде:

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

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

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

Когда же будет код?

Кода в этой статье не будет вообще — для Arduino есть превосходная библиотека USB Host Shield 2.0. В ней есть готовая поддержка множества USB устройств, в основном проводных, но, главное, есть поддержка USB Bluetooth адаптера, через который уже подключается геймпад.

После того, как вы собрали железную часть, остается только адаптировать для своего DIY-проекта готовый код. Например, для контроллера от PlayStation 4 в библиотеке есть вот такой пример.

Своим примером я тоже поделюсь: видео на YouTube плюс исходники.

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

Что дальше?

То, что в итоге получилось у меня — конечно работает, но занимает места больше, чем хотелось бы. Плюс я уже упоминал о том, что и сам Mini USB Host Shield становится трудно найти в продаже, и USB адаптер нужен именно версии BT 4.0, и библиотека USB Host Shield 2.0 сама по себе достаточно старая (хотя все еще поддерживается и подключение геймпада от PlayStation 5 туда тоже добавили).

Тут самое время вспомнить, что существует ESP32, который объединяет в компактном виде сразу все необходимые компоненты для подключения Bluetooth устройств. В следующей части статьи я расскажу, как сделать все то же самое, но уже на более современной платформе.

© Habrahabr.ru