arduino-bluetooth/

Ранее в заметке Мой первый радиоуправляемый робот на Arduino мы управляли гусеничным роботом при помощи пары устройств NRF24L01 . Если помните, для этого приходилось использовать дополнительную Arduino с Joystick Shield. Притом вся эта конструкция получалась довольно громоздкой и неудобной, особенно если учитывать, что джойстику нужно от чего-то питаться, а также тот факт, что NRF24L01 для работы нужен дополнительный переходник со стабилизатором напряжения. Поэтому сегодня мы рассмотрим альтернативный подход, заключающийся в использовании Bluetooth-модуля HC-05.

Примечание: Существует похожий модуль HC-06. В отличие от HC-05, который может быть как ведущим (мастером), так и ведомым устройством, HC-06 может быть только ведомым. В остальном HC-05 и HC-06 практически не отличаются. Также существуют модули HC-07, HC-08 и HC-09. Прочитать про различия между ними можно здесь .

HC-05 имеет шесть пинов, но из них нам понадобится только четыре: VCC, GND, RX и TX. Кроме того, мы временно припаяем дополнительный провод к пину 34 непосредственно используемого в HC-05 Bluetooth-модуля EGBT-045MS, чтобы сменить имя, под которым будет видно устройство. Если вас устраивает имя по умолчанию, «HC-05», то можете ничего и не припаивать. Итак, VCC и GND пины подключаем к пинам 5V и GND Ардуины, TX пин HC-05 — к пину 2, а RX пин — к пину 3, и, наконец, пин 34 EGBT-045MS — к пину 4 Ардуины.

Получившаяся конструкция:

Общаемся с Arduino по протоколу Bluetooth при помощи модуля HC-05

Ответ на вопрос где искать этот 34-ый пин у EGBT-045MS, содержится в EGBT-045MS / EGBT-046S Bluetooth Module Manual [PDF] :

Bluetooth-модуль EGBT-045MS

Пример кода прошивки:

#include <Arduino.h>
#include <SoftwareSerial.h>

/* Connect HC-05 TX to Arduino RX and HC-05 RX to Arduino TX */
SoftwareSerial Bluetooth ( 2 , 3 ) ; /* RX, TX */

const int pin34 = 4 ;
bool newline_printed = false ;

void setup ( )
{
Serial. begin ( 9600 ) ;
Serial. println ( «Arduino is ready» ) ;

Bluetooth. begin ( 9600 ) ;
Serial. println ( «Bluetooth is ready» ) ;

pinMode ( pin34, OUTPUT ) ;
digitalWrite ( pin34, HIGH ) ;
Bluetooth. println ( «AT+NAME=ARDUINO-BLUETOOTH» ) ;
digitalWrite ( pin34, LOW ) ;
}

void loop ( )
{
if ( Bluetooth. available ( ) )
{
char c = Bluetooth. read ( ) ;
if ( c == ‘#’ )
{
if ( ! newline_printed )
{
Serial. println ( «» ) ;
newline_printed = true ;
}
}
else
{
Serial. print ( c ) ;
newline_printed = false ;
}
}

if ( Serial. available ( ) )
{
char c = Serial. read ( ) ;
Serial. write ( c ) ;
Bluetooth. write ( c ) ;
}
}

Взаимодействие с модулем происходит по UART. Так как мы не хотим потерять возможность обмена данными с компьютером, используется класс SoftwareSerial. Он работает точно так же, как уже знакомый нам Serial, но, в отличие от него, может использовать произвольные пины Arduino.

Подавая высокое напряжение на 34-ый пин EGBT-045MS, мы переводим его в режим выполнения AT-команд. Полный список доступных команд можно найти в уже упомянутом EGBT-045MS / EGBT-046S Bluetooth Module Manual [PDF] . В приведенном примере просто меняется имя модуля. Сменив его один раз, лишний провод можно смело отпаивать, так как модуль запомнить свое новое имя в энергонезависимой памяти.

Можно найти великое множество готовых Android-приложений, подходящих для передачи команд модулю HC-05. Мне, к примеру, очень понравилось приложение Arduino BT Joystick. У него есть как платная , так и бесплатная версия с рекламой . Интерфейс приложения выглядит как-то так:

Интерфейс приложения Arduino BT Joystick

Жмем Connect, находим в списке наше устройство, вводим пин 1234, и можно отправлять команды при помощи кнопок, а также встроенного в телефон акселерометра. Другими словами, приложение позволяет, помимо прочего, управлять Arduino, просто вращая телефон в руках.

Важно! Насколько я смог выяснить, устройства от Apple вообще не работают с HC-05 / HC-06 . Для решения этой проблемы предлагается использовать BLE модули, например HM-10 или HM-11 . Судя по видео на YouTube, HC-08 тоже подойдет. Опыта использования данных модулей на момент написания этих строк у меня, к сожалению, нет. В России их довольно сложно достать, видел только в одном интернет-магазине. А так нужно ждать доставки из Китая.

Разные приложения посылают данные в разных форматах. В случае Arduino BT Joystick используется формат вроде:

##b=0##b=0##b=1##…

… где ## — это разделитель, b= указывает на то, что далее содержится код кнопки, 0 , 1 и так далее — это коды кнопок. Учтите, что если пользователь ничего не нажимает, то приложение непрерывно шлет ##b=0##b=0##... . Если в приложении вы разрешили использование акселерометра, то помимо значений b также будут передаваться значения x , y и z .

Преимущество использования Bluetooth заключается в том, что не нужно делать отдельный джойстик. Подойдет любой смартфон или планшет под управлением Android. Кроме того, EGBT-045MS производит впечатление модуля, который легко выпаять из HC-05 и затем использовать в самодельный платах .

Полную версию исходников к этой заметке вы найдете на GitHub .

EnglishRussianUkrainian