Начиная с версии Bluetooth 4.0, т.е. момента, когда вышла первая спецификация, включающая BLE (Bluetooth Low Energy), данная технология обосновалась в нашей жизни надолго. Число всевозможных BLE устройств стремительно растёт, повышая спрос на специалистов, обладающих знаниями в этой сфере. Однако, спецификация протокола Bluetooth сродни бойцу тяжеловесу, способна отправить в нокаут любого начинающего embedded программиста.
В публикации предпринята попытка познакомить читателя с полезной и перспективной технологией BLE без глубокого погружения в тему. Для этого мы возьмем готовое решение - модуль HM-10 и запустим BLE канал связи между смартфоном, модулем и ПК.
О модуле HM-10
Существуют различные версии протокола Bluetooth. Модуль HM-10 поддерживают протокол Bluetooth Low Energy 4.0, благодаря чему его можно подключить к смартфону на операционной системе Android или iOS. Производитель модуля - китайская компания Jinan Huamao Technology, любезно разработала модуль и прошивку для него. От пользователя скрыта BLE часть, а интерфейс общения организован посредством AT-команд через UART.
Благодаря такому подходу практически любой может создать собственное bluetooth устройство, общаясь с модулем, как с "черным ящиком". Возможности такого подхода, конечно, ограничены. Во-первых вам требуется дополнительный микроконтроллер для управления модулем, во-вторых на уровне BLE в распоряжении лишь одна характеристика для организации пользовательского протокола (понятия атрибутов и характеристик относятся к уровню BLE стека). В этом состоит обратная сторона медали.
Внешний вид модуля показан на рисунке 1. Модуль построен на базе микроконтроллера CC2541F256, во внутреннюю память которого записана управляющая программа. Используя команды через UART интерфейс (RX, TX) можно не только передавать/принимать данные через Bluetooth, но и управлять выводами как DI/DO, читать температуру в внешнего датчика, измерять аналоговый сигнал. На рисунке черным цветом указано наименование выводов модуля, а синим, наименование соответствующих им выводов микроконтроллера.

Модуль имеет следующие технические характеристики:
Напряжение питания модуля с переходной платой от 3.0 до 5.0 В, требуемый максимальный ток 50mA.
В активном состоянии ток потребления около 9 mA, и в состоянии сна 50 ... 200 uA.
Выходная мощность RF: -23 dbm, -6 dbm, 0 dbm, 6 dbm.
Версия bluetooth 4.0 BLE.
Скорость последовательного порта по умолчанию 9600 бод.
PIN по умолчанию 000000, имя по умолчанию HMSoft.
Модуль распаян на переходной плате, задача ко��орой понижать входное питающее напряжение и уровни сигналов RX, TX до 3,3 В, благодаря чему HM-10 можно безопасно подключать к Arduino. На плате установлен светодиод, который мигает при ожидании соединения с частотой 1 Гц и светится постоянно, когда соединение установлено. На выводе STATE повторяется сигнал светодиода – меандр с частотой 1 Гц при отсутствии соединения и логическая единица в случае, когда соединение установлено. Назначение выводов модуля представлено в таблице:
Сигнал | Описание |
BRK/EN | принудительный разрыв соединения (подтяжка к земле, работает не на всех модулях) |
VCC | внешнее питание 3,3…5 В |
GND | общая шина (земля) |
TX | передатчик USART модуля, подключается на RX управляющей платы |
RX | приёмник USART модуля, подключается на TX управляющей платы |
STATE | состояние соединения HIGH – подключено (светодиод постоянно светится) меандр или LOW – отключено (светодиод мигает один раз в секунду) |
В зависимости от ваших задач, модуль можно подключить к компьютеру, плате Arduino, мобильному телефону или настроить передачу данных между двумя модулями. Схема взаимодействия в общем виде показана на рисунке. Ведущее и ведомое устройство могут меняться исходя из задачи, модуль HM-10 лишь обеспечивает беспроводной канал связи.

Подключение к компьютеру
Для подключения модуля HM-10 к компьютеру потребуется преобразователь USB-UART, например на базе микросхемы FT232 (или любой аналогичной). Схема подключения показана на рисунке.

Преобразоват��ль USB-UART после установки драйверов отобразится в диспетчере устройств ПК как виртуальный COM-порт. Управление модулем осуществляется через набор AT-команд, полный перечень которых можно найти в документации от производителя модуля jnhuamao.cn. Для быстрой проверки модуля можно воспользоваться списком наиболее часто используемых команд.
Команда | Описание |
AT | Команда тестирования и команда разрыва соединения. Если модуль не подключен по радио к другому устройству, то он ответит "OK". Если у модуля в настоящий момент активно соединение по радио с другим устройством, то соединение будет закрыто. Если активна настройка оповещения, то модуль ответит "OK+LOST". |
AT+NAME? | Опрос имени устройства. Модуль вернет имя модуля, которое используется в вещании (такое как HMsoft). |
AT+NAMEnewname | Меняет имя модуля. Например, команда AT+NAMEmyBTmodule поменяет имя устройства на myBTmodule. Максимальная длина нового имени может быть 12 символов. |
AT+ADDR? | Опрашивает MAC-адрес модуля. Вернет адрес в виде 12 шестнадцатеричных символов, например "OK+ADDR:606405D138A3". |
AT+VERS? | Опрашивает номер версии firmware. Пример возвращенного номера версии: "HMSoft V710". |
AT+RESET | Перезапускает модуль. Модуль отв��тит "OK+RESET". Во время перезапуска активное соединение будет закрыто. |
AT+RENEW | Восстанавливает заводские настройки по умолчанию, быстрый и простой способ сбросить все настройки. |
AT+BAUD? | Запрашивает скорость обмена данными через UART. Эта скорость относится только к обмену данными с хостом, таким как Arduino, и не относится к скорости передачи данных по радио между модулями. В ответ на эту команду вернет значение от 0 до 8, например "OK+Get:0". Числа обозначают ряд скоростей: 0 – 9600, 1 – 19200, 2 – 38400, 3 – 57600, 4 – 115200, 5 – 4800, 6 – 2400, 7 – 1200, 8 – 230400. Настройка скорости по умолчанию 0 – 9600. Помните, что для обоих устройств, общающихся через UART (Arduino и HM-10) должна быть настроена одинаковая скорость обмена. Причиной мусорных символов часто бывает несоответствие настроек скорости. |
AT+BAUDx | Устанавливает скорость обмена данными через UART. Скорость задается числом x в диапазоне от 0 до 8 (см. команду AT+BAUD?). Максимальная скорость обмена для Arduino составляет 115200, так что если Вы установите 230400, то не сможете общаться с модулем. |
AT+NOTIx | Устанавливает состояние оповещения. Если оповещения включены, то HM-10 будет отвечать на команды сообщением подтверждения, или будет посылать сообщение при определенных событиях, например "OK" в ответ на команду AT и "OK+LOST" когда соединение разорвано. AT+NOTI0 выключает оповещения, AT+NOTI1 включает оповещения. |
AT+NOTI? | Опрашивает состояние оповещения. Возвратит 0 (оповещения выключены) или 1 (оповещения включены). |
AT+PIN? | Опрашивает номер PIN, использующийся для pairing. Возвратит номер из 6 цифр наподобие "OK+Get:123456". Вместо набора символов 123456 в этом примере может быть текущий установленный PIN. |
AT+ROLE? | Опрашивает текущую роль устройства, Master (главное устройство) или Slave (подчиненное устройство). Возвратит 0 (Slave или Peripheral) или 1 (Master или Central). Установка по умолчанию 0 (Slave). |
AT+ROLEx | Устанавливает роль устройства, x = 0 или 1. Используйте команду AT+ROLE0 для смены режима модуля на Slave/Peripheral, в ответ на эту команду модуль возвратит "OK+Set:0". Для смены режима на Master/Central используйте команду AT+ROLE1, модуль возвратит "OK+Set:1". В зависимости от версии firmware может потребоваться сброс, чтобы новая роль вступила в силу. |
AT+IMME? | Опрашивает режим запуска соединения. Возвратит 0 или 1. 0 означает соединяться немедленно (подразумевается, что ранее устанавливалось это соединение), 1 означает ждать команды, которая запускает соединение (AT+START, AT+CONN, AT+CONL). Установка по умолчанию 0 (соединяться при запуске модуля, т.е. при включении питания). |
AT+IMMEx | Устанавливает режим запуска соединения. AT+IMME0 устанавливает автоматическое соединение при старте(*), AT+IMME1 установит режим соединения вручную. Команда AT+IMMEx часто используется вместе с AT+ROLEx. AT+IMMEx может потребовать сброс, чтобы её установка вступила в силу. |
AT+RESET | Перезапускает (сбрасывает) модуль. |
AT+RENEW | Устанавливает у модуля заводские настройки по умолчанию. |
Примечание
Если не было предыдущих соединений, HM-10 автоматически подключится к любому другому доступному HM-10 (обычно к тому, у которого сигнал сильнее). HM-10 (по умолчанию) запоминает адрес последнего модуля, к которому он было подключен, и если он в эфире, то ранее сохраненное соединение имеет приоритет, когда HM-10 повторно пытается запустить автоматическое соединение.
Отправлять команды удобно при помощи терминальной программы HMComAssistant V1.5 от производителя, которую можно скачать по ссылке. После подключения к COM порту выбираем нужную команду в панели, расположенной справой стороны программы. В нижней части окна жмем кнопку «Send» и убеждаемся, что от модуля приходит ответ на запрос.

На рисунке показан ответ от модуля после отправки команды AT+VERS? В данном случае модуль имеет версию прошивки V710.
Подключение к смартфону
Для подключения к модулю со смартфона можно использовать такие приложения как LightBlue, nRF Connect, BLE Scanner. С другой стороны модуль необходимо подключить к ПК (см. предыдущий раздел) или Arduion (см. следующий раздел). Схема подключения в общем виде будет выглядеть так:

Продемонстрируем обмен данными со смартфоном при помощи приложения BLE Scanner. После скачивания и установки приложения на смартфон запускаем его и просматриваем обнаруженные Bluetooth устройства. Наименование модуля по умолчанию HM-Soft, выбираем его нажав кнопку «CONNECT».

В случае успешного подключения светодиод на модуле перестает мигать, а в приложении отобразится служба CUSTOM SERVICE, с помощью которой можно передавать и принимать данные. Дополнительно необходимо включить уведомления Bluetooth, нажав пиктограмму N.
Передадим данные со смартфона на модуль, в приложении BLE Scanner необходимо нажать пиктограмму W и ввести любой текст, например слово «Hello». После нажатия кнопки ОК данные будут переданы через Bluetooth и отобразятся в терминале.

Аналогично, в поле отправки терминала вводим произвольный текст, например «I hear you» и жмём кнопку Send. Отправленные данные должны отобразиться в приложении.
Подключение к Arduino
Подключая модуль HM-10 к Arduino или иной отладочной плате, появляется возможность создавать собственные сценарии и управлять ими со смартфона. Возможная схема подключения показана на рисунке.

Продемонстрируем работу схемы при помощи простого скетча. На плате Arduino UNO имеется светодиод, подключенный к выводу 13, будем управлять им при помощи команд «1» и «2». Подключим Arduion к ПК и загрузим следующий код.
#include <SoftwareSerial.h> SoftwareSerial HM10(2, 3); // RX = 2, TX = 3 char appData; String inData = ""; void setup() { Serial.begin(9600); Serial.println("HM10 serial started at 9600"); HM10.begin(9600); // set HM10 serial at 9600 baud rate pinMode(13, OUTPUT); // onboard LED digitalWrite(13, LOW); // выключаем светодиод } void loop() { HM10.listen(); // слушаем HM10 port while (HM10.available() > 0) { // если HM10 что то передает, то считываем данные appData = HM10.read(); inData = String(appData); // сохраняем данные в строковой переменной Serial.write(appData); } if (inData == "1") { Serial.println("LED ON"); digitalWrite(13, HIGH); // включаем светодиод } else if (inData == "2") { Serial.println("LED OFF"); digitalWrite(13, LOW); // выключаем светодиод } inData =""; delay(500); }
Далее при помощи смартфона подключаемся к модулю HM-10 через Bluetooth (см. предыдущий раздел) и убеждаемся, что при передаче цифры «1» светодиод включается, а при передаче цифры «2» - выключается.
Связь между модулями
Два модуля HM-10 можно связать друг с другом. При этом первый будет выступать в качестве ведущего (Central) устройства, а второй – ведомого (Peripheral). Возможная схема подключения показана на рисунке.

Так как один из модулей будет исполнять роль ведущего, его необходимо перенастроить. Также необходимо узнать MAC адрес ведомого, который будет использоваться для установления соединения. Общая последовательность действий представлена в таблице.
Действие | Пример | Состояние связи |
Запросить через UART у модуля №2 MAC адрес: AT+ADDR? | OK+ADDR:2CAB33DFFB93 | не подключен, мигает светодиод |
Перевести модуль №1 в роль ведущего (Central): AT+ROLE1 | OK+Set:1 | |
Настроить модуль №1 на режим ручного подключения: AT+IMME1 | OK+Set:1 | |
TX | передатчик USART модуля, подключается на RX управляющей платы | |
Установить соединение между модулями, выдав на модуль №1 команду: AT+CON2CAB33DFFB93 | OK+CONNA | соединение установлено, светодиод постоянно светится |
В случае успешного соединения,светодиоды на обоих модулях будут постоянно светится, а данные переданные с терминала первого ПК будут приняты териналом второго ПК.
Подключение к ноутбуку
Практически все современные ноутбуки имеют встроенный Bluetooth, используя который, можно упростить рассмотренную в предыдущем пункте схем подключения. Будем использовать ПК в связке с модулем HM-10 с одной стороны и ноутбук с другой. Схема соединения выглядит так.

К большому удивлению, оказалось непросто найти готовую утилиту для управления BLE с ноутбука под Windows. Вероятно, в публикации "BLE Console: абсолютно новый путь взаимодействия с BLE устройствами" @voicetranslator действительно прав, утверждая что таких инструментов мало (либо нет) в открытом доступе. Вероятно, упомянутая выше публикация написана несколько высокопарно, но утилита действительно интересная. ��ё исходники лежат на git, для компиляции понадобится MS Visual Studio.
После успешной сборки запускаем приложение и выполняем поиск BLE устройств.

Данные читаются и записываются при помощи сервиса SimpleKeyService. Чтобы считать информацию с модуля необходимо в терминале (подразумевается, что модуль подключён через UART) подписаться на уведомления от модуля командой sbus, а затем отправить данные из терминала. Информация появится в BLEConsole.
Заключение
Первое знакомство с BLE на примере модуля HM-10 позволяет сделать следующие выводы.
Есть "черный ящик" HM-10, который умеет общаться с другими устройствами через радиоканал. Данные в радиоканале кодируются неким хитрым образом, позволяя устройствам идентифицировать друг друга, передавать данные (write, read), настраивать уведомления (notification). Эта технология называется Bluetooth Low Energy.
Возможности управления HM-10 ограничены, так как нам предоставляется лишь один сервис с кастомной характеристикой на чтение и запись. Тем не менее, этого уже может оказаться достаточно для запуска небольших DIY проектов.
Ресурсы:
