Некоторые DIY-проекты включают в себя тот или иной вид дистанционного управления. Есть множество способов и протоколов для его реализации, и один из них – Bluetooth. В этой статье будет рассказано о подключении Bluetooth геймпада к Arduino.
Эту статью я решил разделить на две части, и, хотя задача будет одна и та же, способы ее реализации отличаются в зависимости от выбранной платформы.
Часть 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), однако я сомневаюсь, что плата станет популярной:
-
Цена. Доступных клонов нет, а оригинальная плата в плане цены совершенно неконкурентоспособная
-
Поддержка только 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
Способ, о котором пойдет речь далее в этой статье – это использование нескольких связанных компонентов:
-
Плата Arduino
-
USB Host Shield к этой плате
-
USB Bluetooth адаптер
-
Собственно Blutooth геймпад
Как вы могли заметить, USB Host Shield по масштабам соответствует плате Arduino Uno, а такой конструктор подойдет по размеру далеко не ко всем DIY-проектам. Для более компактных проектов существует Mini USB Host Shield, который по габаритам соответствует уже Arduino Pro Mini, этот набор и будем использовать далее.
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.
Функционально и по количеству пинов 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 чипа.
Сами процессоры семейства 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 не обозначены, правильную ориентацию платы можно определить по 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 устройств. В следующей части статьи я расскажу, как сделать все то же самое, но уже на более современной платформе.
Автор: pink0D