Здесь приведен перевод руководства по использованию Bluetooth модулей HM-10 от Martyn Currey [1]. В описании использовались модули с версиями программного обеспечения 5.47 и 5.49.
Для firmware версии 5.49 есть 2 варианта, regular и long name. У версии regular нет обновленного readme, так что неизвестно, что в нем поменялось, если таковое было. Версия long name, как следует из названия, добавляет использование длинного имени, которое может иметь длину до 29 символов. В то же самое время удалены функции iBeacon и ANCS. Если Вам не нужно обязательно иметь длинные имена, то лучше оставаться на версии regular firmware.
Примечание переводчика: на момент перевода 181214 вышла версия 7.00 firmware HM-10.
2017-07-26 доступно Firmware 5.50.
2017-09.01 доступно Firmware 6.01 (исправлены ошибки, нет новых команд).
2017-10.xx доступно Firmware 6.03, расширена команда CO. Добавлена команда AT+MPIO (multi PIO control). Подробности см. в файле readme. В настоящее время (ноябрь 2017) руководство не было обновлено.
2018-03-24. Поддержка Jinan Huamao указала, что HM-10 (оригинальный, не копии) совместим с Android 8. На сайте они также добавили комментарий, что HM-10 работает с Android 8.
2018-03. Доступны модули HM-10 с версией firmware 6.05, но Jinan Huamao не сделал релиза этого firmware, v6.03 все еще остается самым последним firmware, доступным для загрузки. Все выглядит так, что Jinan Huamao избавляется от фейковых копий. Независимо от не выпуска последнего firmware последние HM-10 имеют надпись "HM-10", напечатанную шелкографией на PCB.
HM-10 это маленький модуль 3.3v SMD Bluetooth 4.0 BLE, основанный на Bluetooth SOC-чипе CC2540 или CC2541 от TI (Texas Instruments). HM-10 сделаны Jinan Huamao, и это один из многих Bluetooth-устройств, которые они производят, включая модуль HM-11, который работает так же, как HM-10, отличаясь тем, что у HM-11 печатная плата меньше и меньшее количество контактов.
Есть 2 версии HM-10: HM-10C и HM-10S.
HM-10C
HM-10S
У HM-10C нет контактов на нижнем торце платы (соединения с USB), и у него 26 контактов вместо 34, что делает его дешевле в производстве. Могут быть и другие отличия (такие как используемый тип кварца) из-за даты изготовления. По сути это одинаковые модули.
Основные параметры HM-10:
• Напряжение питания от +2.5v до +3.3v, требуемый максимальный ток 50mA. • В активном состоянии ток потребления около 9mA, и в состоянии сна 50 .. 200uA. • Выходная мощность RF: -23dbm, -6dbm, 0dbm, 6dbm. • Bluetooth version 4.0 BLE. • Скорость по умолчанию последовательного порта 9600 бод. • PIN по умолчанию 000000, имя по умолчанию HMSoft. • Основан на чипе CC2540 или CC2541.
Все последние HM-10 выпускаются на чипе CC2541. Это то же самое, что и CC2540 с тем лишь отличием, что меньше мощность и меньше радиус действия. CC254x основаны на ядре 8051 и работает на частоте 32 МГц.
HM-10 стал очень популярным модулем Bluetooth 4 BLE для использования вместе с Arduino. Из-за наличия стандартного соединения UART он легко стыкуется с Arduino. Уровень коммуникации UART это хорошо и плохо одновременно, потому что упрощает использование, и в то же время скрывает уровень BLE, так что Вы не получаете никакого контроля над реальными возможностями BLE. HM-10 имеет Bluetooth только версии 4.0. Это означает, что нельзя осуществить соединение с модулями Bluetooth 2/2.1, такими как HC-06 и HC-05.
HM-10 управляется AT-командами, которые отправляются через последовательное соединение UART. Существуют команды хоста, некоторые простые, некоторые более сложные, что будет рассмотрено позже.
[HM-10 на переходной плате]
HM-10 также доступен смонтированным на специальной плате (breakout board), которая выводит цепи питания и сигналы UART на штырьковый разъем (с шагом 2.54 мм), удобный для установки в плату макетирования и подключения к другим устройствам.
На breakout board установлен стабилизатор питания 3.3v, что делает модуль HM-10 совместимым с 5V, что идеально подходит для домашнего творчества. Однако следует помнить, что вывод RX все еще имеет рабочие уровни 3.3v, и когда HM-10 используется вместе со стандартным 5v Arduino, то следует преобразовать 5v уровень сигнала TX платы Arduino в уровень 3.3v для сигнала RX модуля HM-10.
Таблица с цоколевкой переходной платы:
№
Сигнал
I/O
Описание
1
BRK
Вход
Вывод для подачи сигнала разрыва соединения (Break). Если соединение активно, то перевод BRK в лог. 0 разорвет соединение.
2
VCC
Напряжение питания в диапазоне от 3.6V до 6V.
3
GND
Земля, общий провод для цепей питания и сигналов.
4
TXD
Выход
Передача TTL UART.
5
RXD
Вход
Прием TTL UART.
6
STATE
Выход
Состояние соединения. Лог. 0, если соединение не активно, лог. 1, если установлено соединение.
LED. На плате установлен светодиод (LED), который мигает при ожидании соединения с частотой 1 Гц (полсекунды выключен, полсекунды включен). LED светится постоянно, когда соединение установлено, и снова начинает мигать, когда соединение разрывается.
LED начинает светиться постоянно, когда осуществляется соединение (pairing). После pairing он возвращается к миганию. Это в основном устанавливает связь для соединения, и LED показывает его состояние. После завершения pairing соединение закрывается, и LED гаснет.
Поведение LED можно поменять командой PIO1.
AT+PIO10 – установка по умолчанию. Когда модуль не соединен, LED мерцает 500 мс включен, 500 мс выключен. Когда соединение есть, LED светится постоянно. AT+PIO11 – когда нет соединения, LED погашен. Когда соединение есть, LED постоянно светится.
STATE. Вывод STATE находится в лог. 0, когда нет соединения, и переходит в лог. 1, когда соединение установлено.
BRK. Вывод BRK позволяет отменить соединение. Когда соединение активно, перевод BRK в лог. 0 моментально разрывает его. Когда соединения нет, перевод BRK в лог. 1 или в лог. 0 не оказывает никакого эффекта. Хотя для этого нет жесткого требования, рекомендуется подтянуть вывод BRK к уровню лог. 1 для нормального использования, чтобы вход BRK не висел в воздухе.
Подделки. В Интернете есть много комментариев про поддельные HM-10, и даже Jinan Huamao добавили информацию об этом с даташиты. Автор [1] на рассматривает эти не-HM-10 устройства как фальшивки, а просто как устройства с другой версией ПО (firmware). Если бы они были фальшивками, то копировали бы firmware.
Скорее всего проблема в том, что не-HM-10 модули свободно продаются во многих местах, особенно на eBay и AliExpress. Вы будете часто видеть модули, проданные в качестве HM-10, однако они такими могут не быть. Раньше одним из самых легких способов определить не-HM-10 было отсутствие кварца, но к сожалению можно теперь купить настоящие HM-10 без кварца, так что путаница вероятно увеличится.
[Bluetooth 4 BLE]
BLE это не апгрейд классического Bluetooth, это другая система, она работает совершенно по-другому в сравнении с ранним Bluetooth. BLE разработан для приложений с малым потреблением энергии, что достигается использованием коротких, нечасто отправляемых пакетов данных. BLE не рассчитано для длительные непрерывные соединения с большими объемами передаваемых данных. Для таких целей Bluetooth Classic будет лучшим выбором. В сущности BLE достигает малого потребления тока из-за того, что не соединяется по радио очень часто, в отличие Bluetooth Classic, который держит постоянную радиосвязь.
Хотя Вы можете создать соединение в классическом стиле с помощью двух HM-10 (что будет показано в примерах ниже), HM-10 не были разработаны для этого, и если это все, что Вам нужно, то лучше подойдут модули Bluetooth Classic наподобие двух HC-05 или HC-05 и HC-06.
Есть два способа, как устройства BLE могут общаться друг с другом: Broadcaster + Observer и Central + Peripheral. HM-10 могут использовать оба этих метода.
• Broadcaster + Observer это нестандартное соединение. Broadcaster, обычно это какой-нибудь датчик, посылает периодические сигналы (рекламные пакеты) которые Observer прослушивает. Broadcaster обычно ничего не знает о том, прослушивает ли его кто-нибудь, или нет.
• Сценарий Central + Peripheral более похож на классическое соединение (однако оно не полностью такое же, как классическое). Когда устройство Central (главное устройство, master) находит устройство Peripheral (подчиненное устройство, slave), устройство Central хочет соединиться с Peripheral и инициирует соединение. В результате Central получает соединение и берет на себя роль управления соединением и его интервалами времени.
[Характеристики и службы HM-10]
Как и все устройства BLE, модули HM-10 имеет набор служб (service), и каждая служба имеет ряд связанных с ней характеристик. Характеристики это значения, некоторые из которых читаются (READ), некоторые записываются (WRITE), и некоторые могут и читаться и записываться.
Все службы HM-10 определены заранее, кроме одной. Это пользовательская служба (custom service), у которой есть одна пользовательская (custom) характеристика. С помощью предопределенных служб обслуживаются такие параметры, как UUID и имя устройства Bluetooth. Например, характеристика 0x2A00 это имя устройства, и когда у устройства есть эта характеристика, то она всегда должна быть именем устройства.
Полный список предопределенных служб можно найти по ссылке [2], и полный список характеристик по ссылке [3].
HM-10 использует custom-характеристику для отправки и приема данных через последовательный интерфейс UART. Это работает путем установки значения custom-характеристики в значение данных для передачи. Затем устройство отправляет оповещение другому дальнему устройству, что доступны новые данные.
Когда Вы говорите модулю HM-10 передать "HELLO", он сначала устанавливает значение custom-характеристики в "HELLO", и затем отправляет оповещение, говорящее дальнему устройству: "Эй, у меня есть новые данные, подключайся и получи их". Дальнее устройство сканирует оповещения, и когда получает его, то знает о появлении нового значения, читает его данные и затем отправляет обратно сообщение "Благодарю, все получил".
Custom-характеристика может содержать до 20 символов. Это означает, что для отправки строки длиннее 20 символов модуль HM-10 делит данные на сегменты по 20 символов и отправляет каждый по очереди, пока все сегменты не будут отправлены.
SERVICE 1
UUID: 00001800-0000-1000-8000-00805F9B34FB
GENERIC ACCESS
• UUID: 00002A00-0000-1000-8000-00805F9B34FB
• DEVICE NAME
• READ
Основная часть custom-службы UUID (FFE0) и основную часть custom-характеристики UUID (FFE1) можно поменять командами AT. Может быть также добавлена вторая характеристика.
Сначала попробуем использовать устройство Android, чтобы прочитать службы и характеристики из модуля HM-10. Подайте питание на HM-10, для этого можно использовать Arduino, однако достаточно просто подать +5V на ножку HM-10 VCC и общий провод (минус) соединить с ножкой GND HM-10 GND.
Если все сделано правильно, LED на HM-10 должен мигать. Когда соединение установлено, LED будет светиться постоянно.
Проверка HM-10 на устройстве Android. В зависимость от Вашего устройства Android и версии операционной системы Android на нем можно увидеть или не увидеть HM-10 среди устройств Bluetooth (Bluetooth devices) в настройках (Android Settings).
Samsung S7 на Android 6.0.1 – находит HM-10 и позволяет выполнить pairing. Sony Z3 Compact на Android 4.4.4 – находит HM-10 и позволяет выполнить pairing. Huawei honor pro 4 на Android 4.4.4 – не находит HM-10.
Samsung S7, Android 6.0.1
Sony Z3 Compact, Android 4.4.4
Huawei honor pro 4, Android 4.4.4
Устройства Samsung S7 и Sony Z3 Compact показывают HM-10 в своих настройках, а honor Pro 4 не показывает. Но при использовании приложения BLE все эти телефоны находят HM-10.
Совет: если Ваш Android не находит HM-10 в своих настройках Bluetooth, попробуйте использовать BLE Scanner app.
Модули могут пройти pairing с использованием pin по умолчанию 000000 (конечно, если Вы не поменяли его).
Чтобы подключиться к HM-10 и прочитать его службы и характеристики, нам понадобится приложение BLE. Автор использовал для этого BLE Scanner. Могут быть и другие подобные приложения, такие как B-BLE.
BLE Scanner, чтение характеристик HM-10. Запустите приложение BLE Scanner, и найдите HM-10. Ткните на кнопку CONNECT, чтобы приложение подключилось к HM-10 и начало считывать его свойства.
Кликая на маленькие стрелки вниз, можно раскрыть службы и отобразить их характеристики.
Тыкая на метки , программа будет считывать значения характеристики. Например, под Device Name, если ткнуть на , то будут прочитано и показано значение имени устройства.
Назначение меток:
R прочитать значение. W записать значение. I переключить индикации (on и off). N переключить оповещения (on и off).
Под Custom Service Вы можете увидеть службу по умолчанию HM-10 (default service) и значения характеристик. Вы можете также увидеть, что custom-характеристики HM-10 имеют атрибуты Read, Write и Notify.
Как и любое устройство BLE, работающее через все службы и характеристики, HM-10 работает через установку custom-характеристики для соответствия передаваемым данным (данные, принятые через последовательное соединение). Это можно увидеть при использовании приложения BLE Scanner.
Используя схему и скетч из раздела "Общение между Arduino и HM-10" (см ниже), подключите к Arduino модуль HM-10 и откройте Serial Monitor. Вы должны увидеть что-то наподобие того, что показано на скриншоте ниже. Используйте команду AT, что подтвердить работу соединения. Если соединение есть, HM-10 ответит OK.
Теперь в приложении BLE Scanner подключитесь к HM-10 тычком по кнопке CONNECT.
Теперь всякий раз, когда Вы что-то набираете на клавиатуре в Serial Monitor Arduino, это должно появляться как значение custom-характеристики в программе BLE Scanner.
Чтобы отправить текст из приложения в Serial Monitor, ткните на иконку записи , и введите что-нибудь в появившемся окне ввода текста. Вы заметите, что значение custom-характеристики меняется в соответствии с вводимым текстом. Этот текст также должен появляться в окне Serial Monitor.
[Общение между Arduino и HM-10]
Следующее, что мы проделаем, это подключим HM-10 к Arduino, и попробуем реализовать базовую последовательную коммуникацию и протестируем AT-команды.
Примечание: AT-команды работают только тогда, когда HM-10 не подключен по Bluetooth. После того, как соединение произошло, передаваемые через UART команды обрабатываются как данные. "AT" является исключением, команда "AT" разрывает соединение.
Схема. Выполните соединения следующим образом:
– Ножку TX модуля HM-10 подключите к Arduino D8. – Ножку RX HM-10 к делителю напряжения, и через него к Arduino D9(*). – HM-10 GND к GND Arduino. – HM-10 VCC к +5V Arduino.;
Примечание (*): сигналы HM-10 работают только с уровнями логики 3.3v. Официально никак не заявлено, что они "5v tolerant" (т. е. нет возможности напрямую подавать на них уровни логики 5V), поэтому используется делитель напряжения, чтобы привести уровни логики 5V к уровням 3.3V.
Автор [1] для общения с модулями использовал библиотеку AltSoftSerial. AltSoftSerial использует ножку D9 Arduino для передачи, и ножку D8 для приема. Вам понадобиться добавить библиотеку AltSoftSerial в Arduino IDE, чтобы можно было компилировать примеры скетчей, показанных далее.
Примечание: для связи с HM-10 использовалась программная реализация UART на библиотеке AltSoftSerial вместо стандартного аппаратного порта Arduino. Это было сделано для того, чтобы освободить стандартный порт Arduino для вывода отладочных сообщений.
Модуль HM-10 является 3.3v устройством. Breakout board преобразует напряжение +5v VCC к 3.3v для питания HM-10, но сигнал RX все еще остается с уровнями 3.3v. Поэтому нам нужно понизить уровень логики Arduino 5V TX до 3.3V. Самый простой способ - сделать делитель напряжения из двух резисторов. Можно использовать резисторы 1 кОм и 2 кОм. 1K+2K = 3K. 2K составляют две трети от 3K, что соответствует 3.3V, которые также составляют две трети от 5V.
Arduino увидит 3.3v сигнал на выводе HM-10 TX как лог. 1, поэтому можно напрямую соединить HM-10 TX и Arduino RX (D8).
Также можно подключить светодиод к выводу STATE, для чего нужен токоограничивающий резистор. На выходе STATE напряжение лог. 1, которое должно зажечь светодиод, составляет 3.3v, поэтому нужен резистор 100 Ом для ограничения тока на уровне приблизительно 10 мА. Подойдет любой другой резистор со значением 150 .. 470 Ом. Светодиод на выходе STATE будет загораться вместе со светодиодом на модуле HM-10.
Скетч Serial. После сборки схемы выгрузите следующий скетч. Это простая программа последовательного ввода и вывода. Все, что Arduino примет от Serial Monitor, будет зеркально послано в HM-10. Все, что передаст HM-10, отобразится в окне Serial Monitor.
Модулю HM-10 не нравятся символы конца строки(*) LF и CR (/n/r), не добавляете их к командам. Автор использовал символы конца строки при выводе в окно терминала, чтобы примеры было легче читать, и скетч выводит эти символы в Serial Monitor, но не отправляет их в HM-10.
Примечание (*): с версией 6.05 firmware добавлена возможность использовать произвольное окончание строк (с добавлением или без добавления /n/r).
Скетч использует библиотеку AltSoftSerial [5], поэтому она должна быть добавлена в Arduino IDE, или скопирована в папку library перед тем, как можно будет выполнить компиляцию.
// SerialIn_SerialOut_HM-10_01
//
// Используется аппаратный интерфейс serial для общения компьютера хоста
// и AltSoftSerial, чтобы осуществилась связь с модулем Bluetooth.
//
// Все, что было введено в окне Serial Monitor, отправляется в подключенное
// устройство HM-10. Все, что было получено подключенным устройством HM-10,
// отображается в окне Serial Monitor. В HM-10 не передаются специальные
voidsetup()
{
Serial.begin(9600);
Serial.print("Sketch: "); Serial.println(__FILE__);
Serial.print("Uploaded: "); Serial.println(__DATE__);
Serial.println(" ");
BTserial.begin(9600);
Serial.println("BTserial started at 9600");
}
voidloop()
{
// Чтение из модуля Bluetooth и отправка в Arduino Serial Monitor:if (BTserial.available())
{
c = BTserial.read();
Serial.write(c);
}
// Чтение из Serial Monitor и отправка в модуль Bluetooth:if (Serial.available())
{
c = Serial.read();
// Символы CR и LF (/r и /n) не отправляются к HM-10 в качестве// окончания строки:if (c!=10& c!=13 )
{
BTserial.write(c);
}
// Эхо пользовательского ввода в главное окно.// Если новая строка, то печатается символ ">".if (NL) { Serial.print("\r\n>"); NL =false; }
Serial.write(c);
if (c==10) { NL =true; }
}
}
Откройте Serial Monitor, включите питание модуля, и Вы должны увидеть что-то наподобие следующего:
HM-10 требует ввода команд в верхнем регистре, обычно без добавления символов конца строки. Показанный выше скетч использует символы завершения строки только для пользователя, чтобы строки удобно отображались в окне Serial Monitor, т. е. символы завершения строки не посылаются в модуль Bluetooth, и вместо этого печатаются, когда эхо команд отображается в окне Serial Monitor. Для работы необязательно добавлять символы конца строк в данные для Serial Monitor, но это упрощает чтения следующих примеров. Обычно при работе командами с HM-10 все вводится в одной строке.
Помните, что когда Вы используете другие скетчи или адаптер USB - serial UART, необходимо настроить окончание строк без символов CR и LF (установка line endings -> No line ending в нижней части окна Serial Monitor).
В нижней части окна Serial Monitor установите скорость обмена 9600 baud, и все наши скетчи могут использовать настройку с использованием символов окончания строки:
Чтобы проверить, правильно ли сделаны установки, мы используем команду "AT". Она используется для подтверждения работы канала команд, и должна вернуть ответ модуля "OK". Также "AT" можно использовать, чтобы разорвать активное соединение.
Введите "AT" (без кавычек) в поле ввода текста и кликните Send. Если все работает, то Вы должны увидеть "OK".
Чтобы проверить, какая версия firmware в HM-10, используйте AT+VERR?
Чтобы проверить имя модуля, используйтеAT+NAME?, или используйте устройство Android и в нем поиск устройств Bluetooth. Для HM-10 имя по умолчанию HMsoft.
Это работает только когда HM-10 в режиме Salve/Peripheral. Когда активен режим Master/Central, устройство не отправляет свое имя.
Чтобы получить адрес модуля, используйте AT+ADDR?
Имя можно поменять с помощью AT+NAME. Позже это будет использоваться для двух HM-10, чтобы помочь с их идентификацией - где какой. Как Вы увидите, имя было изменено на HMsoft-38A3. "38A3" здесь последние 4 цифры MAC-адреса устройства.
Чтобы получить характеристики модуля Bluetooth, используйте AT+CHAR? или программу BLE scanner.
Чтобы найти UUID используйте AT+UUID? Это возвратит "OK+Get:0xFFE0".
[Общие команды AT]
В таблице ниже дан список основных команд AT. Помните, что команды должны быть в верхнем регистре, и они не должны включать символы окончания строки (\r\n), если Вы не используете специальный скетч, который учитывает эту особенность модуля HM-10, удаляя эти символы.
Команда
Описание
AT
Команда тестирования и команда разрыва соединения. Если модуль не подключен по радио к другому устройству, то он ответит "OK". Если у модуля в настоящий момент активно соединение по радио с другим устройством, то соединение будет закрыто. Если активна настройка оповещения, то модуль ответит "OK+LOST".
AT+NAME?
Опрос имени устройства. Модуль вернет имя модуля, которое используется в вещании (такое как HMsoft).
AT+NAMEnewname
Меняет имя модуля. Например, команда AT+NAMEmyBTmodule поменяет имя устройства на myBTmodule. Максимальная длина нового имени может быть 12 символов.
AT+ADDR?
Опрашивает MAC-адрес модуля. Вернет адрес в виде 12 шестнадцатеричных символов, например "OK+ADDR:606405D138A3".
AT+VERS? AT+VERR?
Опрашивает номер версии firmware. Пример возвращенного номера версии: "HMSoft V540".
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+PIN
Устанавливает новый PIN/PASS. PIN должен быть длиной 6 символов. AT+PIN654321 задает новый PIN на значение 654321.
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 повторно пытается поднять автоматическое соединение.
Полный список команд см. в официальной документации (в архиве [7] см. файлы HM-DataSheet_V2017-07.pdf для версии 5.50 и HM-DataSheet_V5.45-2017-01.pdf для версии 5.45).
[Сканирование в поиске других модулей HM-10]
Автор использовал два модуля HM-10, один был подключен к Arduino, как было показано выше, на другой просто было подано питание.
Чтобы гарантировать, что используются заводские настройки по умолчанию, используется команда AT+RENEW:
По умолчанию HM-10 находится в режиме Slave или Peripheral, и для сканирования других устройств нам нужно перевести модуль в режим Central или Master. Для этого используется команда AT+ROLE.
AT+ROLE? опрашивает, в каком режиме находится устройство. AT+ROLE0 устанавливает модуль в режим Peripheral (подчиненное устройство). AT+ROLE1 устанавливает модуль в режим Central (главное устройство).
В старых версиях firmware команда AT+ROLE требовала сбросить HM-10 либо передергиванием питания, либо с помощью команды AT+RESET. В более новых версиях firmware модуль сбрасывает себя сам (это видно по сообщению приветствия "www.jnhuamao.cn"). Таким образом перед тем, как мы переключимся в режим Master/Central, нужно выключить auto connect командой AT+IMME. У команды AT+IMME есть две опции: AT+IMME0 и AT+IMME1.
AT+IMME0 настраивает модуль на auto connect при старте (включении питания). Это режим по умолчанию.
AT+IMME1 настраивает модуль на ожидание поступления одной из AT-команд управления соединением (AT+START, AT+CON и AT+CONNL) перед тем, как модуль попытается выполнить соединение.
Если модули настроены на auto-connect, то когда мы вводим AT+ROLE1, модули автоматически соединятся перед тем, как у нас есть шанс ввести команду AT+IMME1 (auto-connect осуществляется довольно быстро).
Используйте AT+IMME1 для остановки автоматического соединения HM-10.
Используйте AT+ROLE1, чтобы перевести HM-10 в режим Central (главное устройство).
Если Вы используете более старое firmware, то понадобится сбросить модуль либо передергиванием питания, либо командой AT+RESET. Если Вы забыли сбросить модуль, то команда AT+DISC не сработает.
Чтобы просканировать другие модули HM-10 используйте команду AT+DISC? (от слова Discover, т. е. "обнаружить").
В ответ будет выведен адрес (адреса) найденного модуля (модулей).
OK+DISCSOK+DIS0:A81B6AAE55E4OK+DISCE
Сообщение "OK+DISCE" показывает, что сканирование завершено.
Результаты сохранены в списке, этот список начинается с позиции 0, и может использоваться для запуска соединения командой AT+CONNx вместо ввода полного адреса. Здесь x это номер индекса или значение позиции в списке. Таким образом, если HM-10 найдет только один модуль, то результат будет сохранен по индексу 0 и AT+CONN0? можно использовать для подключения к этому модулю. Когда найдено больше одного модуля, адреса будут сохранены в списке в том порядке, как они были обнаружены.
После того, как соединение произошло, список очищается. Это означает, что если Вам нужно разорвать и повторно организовать соединение, то необходимо снова использовать команду AT+DISC?. Для экспериментов с AT командами вполне допустимо использовать AT+CONNx, но для реальной работы лучше запускать соединение с помощью полного адреса, это сделает скетч более надежным и легким для написания.
Имейте в виду, что AT+DISC? найдет только те модули HM-10, которые установлены в режим Peripheral. Вы не можете просканировать и найти модули, установленные в режим Central.
[Соединение Arduino-Arduino с помощью двух HM-10]
Можно довольно просто подключить друг к другу две платы Arduino с помощью двух модулей HM-10. Это работает как мост, и после установки соединения уровень UART HM-10 делает всю необходимую работу. Подразумевается, что при этом уровень UART не дает Вам никакого контроля над подробностями функционирования BLE. Чтобы сделать соединение, нам нужно перевести главный модуль в режим ручного соединения, установить режим Central, и затем использовать команду соединения AT+CON. После того, как HM-10 соединились, данные передаются путем установки значения custom-характеристики на передаваемые данные. Тогда принимающее устройство прочитает это значение.
На картинке ниже показаны соединения двух Arduino со своими модулями. Для каждого Arduino эти соединения одинаковые.
В тесте использовались две разные версии Arduino IDE: одна 1.82, другая 1.63. Это дало возможность запустить два окна Serial Monitor. Одна плата Arduino была подключена через COM6, и другая через COM9.
Запуск соединения HM-10 - HM-10 вручную. Чтобы осуществить соединение, сделайте следующее:
1. Установите второй (подчиненный) модуль в режим Peripheral (установка по умолчанию). 2. Установите первый (главный) модуль в режим запуска вручную с помощью AT+IMME1. 3. Установите первый (главный) модуль в режим Central с помощью AT+ROLE1. 4. Используйте AT+CON для соединения. Конечно, Вам нужно предварительно узнать адрес второго модуля, что можно найти командой AT+DISC?.
После того, как у нас есть полный адрес второго HM-10, можно установить соединение либо с помощью этого адреса, либо с помощью индекса в списке. Здесь использовался адрес, и команда получилась вида AT+CONA81B6AAE5221. Вам нужно поменять адрес на другой, соответствующий адресу модуля.
Если соединение прошло успешно, то мы получим сообщение OK+CONNA, светодиоды LED на обоих модулях HM-10 перестанут мигать и будут гореть постоянно.
Теперь с помощью Serial Monitor можно передавать данные от одной платы Arduino к другой.
Автоматическая установка соединения HM-10 - HM-10. HM-10 может автоматически установить соединение после подачи питания без использования команды соединения. Когда рядом находятся 2 или большее количество модулей, и один из них в режиме Central, то он будет искать и подключаться к другому модулю HM-10. Это осуществляется полностью автоматически, и нет никакого контроля за тем, к какому модулю произойдет соединение, хотя обычно соединение происходит с тем модулем, от которого сигнал сильнее. Конечно, если присутствуют только 2 модуля, то это не имеет значения. Если у Вас есть только 2 модуля, установите один из них в режим Peripheral, и другой в режим Central. После этого они соединятся автоматически, ничего больше не требуется.
Если ранее уже осуществлялось соединение, то оно запоминается в памяти устройства, и у него будет приоритет при установке соединения перед возможными соединениями с другими модулями. После того, как Вы сделали соединение вручную, разорвите соединение (передергиванием питания), затем введите "AT+IMME0" (это включит auto connect). Затем сбросьте модуль либо новым передергиванием питания, либо командой AT+RESET. После этого эти модули должны соединиться автоматически, даже когда в области действия находятся другие модули HM-10.
Команда AT+IMME1 останавливает запуск автоматического соединения. Помните, что Вы не можете использовать AT-команды, когда соединение активно, потому что вводимые команды обрабатываются как данные (исключение составляет команда "AT", которая разрывает соединение). Поэтому для ввода AT-команд нужно выключить Peripheral-модуль и сбросить модуль Central.
[Дистанционное управление светодиодом с помощью HM-10]
Это очень простой пример дистанционного управления, когда нажатие кнопки, подключенной к одной из плат Arduino, приводит к зажиганию светодиода, подключенного к другой плате. Соединены эти платы только по радиоканалу, с помощью двух модулей HM-10.
К Arduino #1 мы добавим кнопку на порт D2 и к Arduino #2 добавим LED на порт D4, см. рисунок ниже.
Сигнал от кнопки на Arduino #1 подтягивается к земле через резистор 10 кОм. Таким образом, нажатие кнопки подает на D2 Arduino уровень лог. 1 (когда кнопка не нажата, на D2 уровень лог. 0). LED на Arduino #2 подключен через токоограничивающий резистор 220 Ом (также хорошо подойдет любой резистор 330 .. 680 Ом).
Скетч главного Arduino использует три AT-команды для настройки режима Central модуля HM-10 и запуска соединения. Это те же самые команды, которые мы использовали в примере соединения вручную.
Это не лучшее решение, но оно работает, и помогает упростить для понимания код примера. Конечно, если HM-10 уже находится в режиме Central, то для ручного запуска соединения первые две команды не нужны. Задержки оставляют время для ответа модуля. При желании Вы могли бы проверить корректный ответ от модуля на каждую команду перед отправкой следующей команды. И конечно, поменяйте адрес, чтобы он соответствовал Вашему используемому модулю.
Если Вы используете более старое firmware, то нужно добавить команду AT+RESET после команды AT+ROLE1.
С помощью режима автоподключения можно избежать использования этих команд.
После этого скетч проверяет состояние порта кнопки, и если оно поменялось, то посылает одну из двух простых команд.
• Уровень поменялся от лог. 0 к лог. 1. Это означает, что кнопка нажата, и нужно передать команду на включение светодиода. Это осуществляется отправкой символа "1" дальнему модулю. • Уровень поменялся от лог. 1 к лог. 0. Это означает, что кнопка отпущена, и нужно передать команду на выключение светодиода. Это осуществляется отправкой символа "0" дальнему модулю.
Примечание: отправка символа ASCII "1" и "0" не то же самое, что отправка значения 1 и 0.
Вторая плата Arduino просто ждет поступления символов "1" или "0", и если это произошло, то соответственно либо включает светодиод, либо выключает.
voidloop()
{
// Чтение из модуля Bluetooth и проверка данных на наличие команды:if (BTSerial.available())
{
c = BTSerial.read();
// 49 соответствует ASCII-коду для "1"// 48 соответствует ASCII-коду для "0"if (c==49) { digitalWrite(LEDpin,HIGH); }
if (c==48) { digitalWrite(LEDpin,LOW); }
Serial.println(c);
}
}
Скетч HM-10_Example_01_simpleLED_Central, который залит в Adruino, управляющий главным модулем Bluetooth (опрос кнопки и передача команд подчиненному модулю Bluetooth):
// HM-10_Example_01_simpleLED_Central
//
// Простое дистанционное управление с помощью двух
// модулей HM-10: включение и выключение светодиода (LED).
//
// Используемые выводы:
// BT VCC - Arduino 5V
// BT GND - Arduino GND
// Arduino D8 (RX) - BT TX без делителя напряжения
// Arduino D9 (TX) - BT RX через делитель напряжения
Скетч HM-HM-10_Example_01_simpleLED_Peripheral, который залит в Adruino, управляемый по радио от главного модуля Bluetooth (включение и выключения светодиода):
// HM-10_Example_01_simpleLED_Peripheral
//
// Простое дистанционное управление с помощью двух
// модулей HM-10: включение и выключение светодиода (LED).
//
// Используемые выводы:
// BT VCC - Arduino 5V.
// BT GND - GND.
// Arduino D8 (RX) - BT TX без делителя напряжения
// Arduino D9 (TX) - BT RX через делитель напряжения
voidloop()
{
// Чтение данных из модуля Bluetooth и проверка этих// данных на наличие команды:if (BTSerial.available())
{
c = BTSerial.read();
// 49 это код ASCII символа "1"// 48 это код ASCII символа "0"if (c==49) { digitalWrite(LEDpin,HIGH); }
if (c==48) { digitalWrite(LEDpin,LOW); }
Serial.println(c);
}
}
Этот код хорошо работает, но что произойдет, когда Вы сбросите Arduino #1 при наличии активного соединения? Светодиод включится.
Когда Вы сбросите платы Arduino, но не модули HM-10, соединение останется активным, и AT-команды в функции setup() будут обработаны как данные. В результате чего любые символы "1" и "0" в этих данных будут просто переданы на дальний конец плате Arduino #2, и будут обработаны ей как команды для управления светодиодом. Есть несколько способов, как это предотвратить.
1. Перед отправкой настроечных AT-команд передайте сообщение приветствия на дальний конец, чтобы проверить активность соединения. Дальнее устройство ответило бы на это сообщение.
2. Проверка состояния вывода STATE модуля HM-10 перед отправкой AT-команд. Вывод STATE в лог. 1, когда соединение активно.
3. Предварительная настройка модулей на автоматическое соединение, чтобы опустить использование в скетчах AT-команд настройки и запуска соединения. Возможно это самое лучшее решение, выбор варианта реализации за Вами.
Позже мы рассмотрим, как управлять светодиодом просто с помощью HM-10, без второй платы Arduino.
[Программируемые порты HM-10]
У HM-10 есть 10 выводов, которыми может управлять пользователь (GPIO). Некоторые из них работают только как входы, другие могут быть или входами, или выходами. К сожалению, эти выводы не подключены к переходной плате (breakout board), так что к ним нужно подпаиваться напрямую (либо делать переходной разъем или дополнительную плату).
Функции выводов. Выводы, которые мы можем использовать, носят имена PIO-02 .. PIO-11 (или PIO2..PIOB в шестнадцатеричной нумерации).
Порт
Функция
PIO2
OUTPUT / PWM OUTPUT
PIO3
OUTPUT
PIO4
INPUT / ADC / OUTPUT
PIO5
INPUT / ADC / OUTPUT
PIO6
INPUT / ADC / OUTPUT
PIO7
INPUT / ADC / OUTPUT
PIO8
INPUT / ADC / OUTPUT
PIO9
INPUT / ADC / OUTPUT
PIOA (PIO10)
INPUT / ADC / OUTPUT
PIOB (PIO11)
INPUT / ADC / DS18B20/ DHT11 / OUTPUT
Примечание: PIO-02 и PIO-03 могут выдавать выходной ток до 20 mA. PIO-04 .. PIO-11 рассчитаны на выходной ток только 4 mA.
Ниже во врезках даны команды управления выводами HM-10.
Устанавливает выходной уровень вывода в HIGH или LOW. pin = номер вывода от 2 до B. 0/1 = 0 для LOW, 1 для HIGH. Например, чтобы установить вывод PIO-02 в HIGH нам нужно использовать команду AT+PIO21, и для установки в LOW команду AT+PIO20.
Читает текущее состояние вывода. pin = номер вывода в диапазоне от 2 до B. Чтобы прочитать состояние PIO2, используйте AT+PIO2?. Эта команда возвратит состояние в виде "OK+PIO2:0" или "OK+PIO2:1". 0 соответствует LOW, и 1 HIGH.
Обратите внимание, что в этой команде используется два знака вопроса. Команда опрашивает состояние выводов PIO4 .. PIOB. Вернет один байт в форме от "OK+Col:00" до "OK+Col:FF", где шестнадцатеричные цифры представляют состояние выводов PIO4 .. PIOB. Биты 7 .. 0 отображены на выводы POI4 .. PIOB.
Чтение состояния всех выводов PIO сразу. Вернет 2 байта в HEX-виде, от "OK+PIO?:0000" до "OK+PIO?:03FF". Последние 3 отображаются на ножки портов PIO0 .. PIOB; это означает, что 3FF == 001111111111, или все порты в состоянии HIGH. Выводы PIO0 и PIO1 (первые 2 бита) используются системой, и их состояние всегда возвращается как 0.
Выводы PIO4 .. PIOB можно использовать как аналоговые входы.
Читает напряжение на указанном выводе. pin обозначает вывод PIO от 4 до B. Вернет реальное напряжение на выводе в виде числа float из 3 цифр.
Для чтения напряжения на выводе PIOA (10) используйте AT+ADCA?, это вернет "OK+ADCA:2.80", когда на выводе напряжение 2.8v, и "OK+ADCA:0.00" когда на выводе уровень LOW, или когда напряжение на этот вывод не подано.
Устанавливает частоту, с которой обновляются регистры состояния выводов (внутри CC2541, опрос выводов в действительности опрашивает значение этих регистров, а не выводов). freq = частоте обновления в секундах, и это должно задаваться двумя цифрами от 00 до 99. Эта команда принимает только число из 2 цифр, например надо давать команду AT+CYC01 вместо AT+CYC1.
Обратите внимание, что в этой команде используется два вопросительных знака. Опрашивает текущую частоту. Вернет значение из 2 цифр в форме от "OK+Get:00" до "OK+Get:99". По умолчанию 10 секунд.
Состояние выводов HM-10 может быть также установлено для момента включения питания командой AT+BEFC, и также для момента установки соединения командой AT+AFTC.
Устанавливает состояние выводов PIO при включении питания / перед соединением. pinValues указывается в виде числа из 3 цифр, от 000 до 3FF, где отображается состояние выводов PIO0 .. PIOB. Помните, что PIO0 и PIO1 используются системой, и можно использовать только выводы PIO2 .. PIOB.
Для установки всех выводов (PIO2 .. PIOB) в HIGH передайте в команду BEFC значение 001111111111 в виде "3FF" (AT+BEFC3FF). Состояние выводов, которое было задано командой BEFC, может быть впоследствии изменено командой AT+PIOxv (x номер вывода, v уровень).
Устанавливает состояние выводов после того, как установится соединение. pinValues задается шестнадцатеричным числом из 3 цифр от 000 до 3FF, где биты этого числа отображаются на выводы PIO0 .. PIOB (точно так же, как и в команде AT+BECF). Помните, что PIO0 и PIO1 используются системой, и можно использовать только выводы PIO2 .. PIOB.
Например, чтобы установить PIO2 в HIGH, когда соединение установится, передайте в команду биты 001000000000 или "200" (AT+AFTC200).
Управление выводами модуля HM-10, когда он подключен к микроконтроллеру наподобие Arduino, в принципе не имеет особого смысла, потому что намного лучше использовать выводы самого Arduino. Полезнее управлять выводами HM-10, когда он используется сам по себе.
Управление выводами HM-10 по радио в режиме Peripheral. Выводами PIO можно управлять в режиме Peripheral через радиоканал. Это возможно, потому что HM-10 позволяет устройству Peripheral принимать AT-команды по радио, и выводами можно управлять AT-командами. Когда HM-10 управляется удаленно по радио, и команды AT приняты по радиоканалу, команды управления выводами работают немного по-другому. Здесь нам надо установить режим, MODE1 или MODE2.
PIO могут быть использованы как входы или выходы, в зависимости от режима по-разному:
Порт
MODE1
MODE2
PIO2
OUTPUT / PWM OUTPUT
OUTPUT / PWM OUTPUT
PIO3
OUTPUT
OUTPUT
PIO4
INPUT / ADC / OUTPUT
OUTPUT
PIO5
INPUT / ADC / OUTPUT
OUTPUT
PIO6
INPUT / ADC / OUTPUT
OUTPUT
PIO7
INPUT / ADC / OUTPUT
OUTPUT
PIO8
INPUT / ADC / OUTPUT
OUTPUT
PIO9
INPUT / ADC / OUTPUT
OUTPUT
PIOA (PIO10)
INPUT / ADC / OUTPUT
OUTPUT
PIOB (PIO11)
INPUT / ADC / DS18B20/ DHT11 / OUTPUT
OUTPUT
Примечание: PIO-02 и PIO-03 могут выдавать выходной ток до 20 mA. PIO-04 .. PIO-11 рассчитаны на выходной ток только 4 mA.
Чтобы указать HM-10, что мы хотим управлять выводами PIO по радио, используются команды AT+MODE1 и AT+MODE2.
Устанавливает режим управления выводами PIO, в котором PIO2 .. PIOB работают как входы.
Только в режиме MODE1 выводы PIO2 и PIO3 устанавливаются как выходы. Это означает, что команда AT+PIOxv работает только для этих двух выводов. Если Вы попытаетесь установить какой-нибудь другой вывод этой командой, то HM-10 не ответит, или в зависимости от версии firmware может разорвать и заново установить соединение.
[Пример автономного использования HM-10: управление светодиодом в MODE2]
В качестве простого примера будем включать и выключать светодиод по радио. Сначала попробуем сделать это вручную AT-командами через Serial Monitor. После того, как убедимся, что это работает, можно подключить к Arduino кнопку и написать скетч, который будет посылать такие же команды при нажатии и отпускании кнопки.
Главная управляющая система, Central HM-10:
Управляемая система, Peripheral HM-10:
После сборки скомпилируйте и загрузите в память платы Arduino следующий скетч. Этот скетч использует библиотеку AltSoftSerial [5], поэтому она должна быть предварительно установлена в среде Arduino IDE, иначе скетч не скомпилируется.
// SerialIn_SerialOut_HM-10_01
//
// Использует аппаратный UART для соединения с компьютером хоста
// и обмена данными с модулем Bluetooth HM-10. Для работы с UART
// применена библиотека AltSoftSerial.
//
// Все, что было введено в окне терминала Serial Monitor, отправляется
// на подключенное устройство HM-10, и все, что поступило от HM-10,
// копируется в окно Serial Monitor.
// В модуль HM-10 не отправляются символы окончания строки.
//
// Используемые выводы:
// BT VCC - Arduino 5V
// BT GND - Arduino GND
// Arduino D8 (RX) - BT TX без делителя напряжения
voidsetup()
{
Serial.begin(9600);
Serial.print("Sketch: "); Serial.println(__FILE__);
Serial.print("Uploaded: "); Serial.println(__DATE__);
Serial.println(" ");
BTserial.begin(9600);
Serial.println("BTserial started at 9600");
}
voidloop()
{
// Чтение данных из модуля Bluetooth и отправка в Arduino Serial Monitor:if (BTserial.available())
{
c = BTserial.read();
Serial.write(c);
}
// Чтение из Serial Monitor, и отправка в модуль Bluetooth:if (Serial.available())
{
c = Serial.read();
// Не нужно отправлять символы конца строки в HM-10:if (c!=10& c!=13 )
{
BTserial.write(c);
}
// Эхо пользовательского ввода в окно терминала.// Если здесь появляется новая строка, то печатается символ ">":if (NL) { Serial.print("\r\n>"); NL =false; }
Serial.write(c);
if (c==10) { NL =true; }
}
}
Затем нам нужно выполнить несколько действий в окне Serial Monitor.
1. Установить режим Peripheral модуля HM-10, к которому подключен управляемый светодиод, чтобы он принимал AT-команды по радио. 2. Установить "главный" модуль HM-10 в режим Central. 3. Установить соединение. 4. Использовать команды AT+PIO, чтобы по радио включать и выключать светодиод, подключенный к модулю HM-10 в режиме Peripheral.
Настойка режима Peripheral. Чтобы настроить устройство HM-10 в режим Peripheral, нам сначала надо настроить его для принятия AT-команд по радио. К сожалению, это нельзя сделать по радио, так что понадобится подключение через UART. Для этой цели можно использовать или адаптер usb-to-serial, или Arduino, в память которого загружен скетч serial.
Для настройки модуля через UART надо передать следующие команды:
AT AT+RENEW AT+ADDR? AT+MODE2
Первая команда нужна, чтобы убедиться в правильности подключения через UART, и что модуль корректно отвечает на команды. Команда AT+RENEW вернет настройки HM-10 в состояние по умолчанию, в этом состоянии HM-10 находится в режиме Peripheral.
Нужно получить адрес модуля, он будет использоваться позже для подключения к модулю по радио:
И в завершение нужно установить режим MODE2 для модуля HM-10. Это укажет HM-10 принимать и обратывать AT-команды по радиоканалу:
Модуль с адресом A81B6AAE5221 теперь установлен в режим Peripheral, и настроен для обработки AT-команд, поступающих к нему по радио. Теперь мы можем по радио посылать команды, чтобы управлять светодиодом, подключенным к PIO2.
Настройка режима Central. Другой модуль HM-10 будет "главным", и его надо настроить в режим Central. Это делается следующими командами:
AT AT+RENEW AT+IMME1 AT+ROLE1 AT+CON[ADDRESS]
Для управления светодиодом по радио будем использовать команды AT+PIO21 и AT+PIO20.
Команда AT позволяет сделать проверку соединения с модулем (что он отвечает на команды), и команда AT+RENEW сбрасывает модуль в состояние по умолчанию:
Команда AT+IMME1 настраивает соединение "вручную":
Команда AT+ROLE1 активизирует у модуля режим Central:
Если у Вас старое firmware HM-10, то следует обновить его. В случае старого firmware в этом месте нужно сбросить модуль, чтобы режим Central активизировался, и можно было продолжить.
Далее нам нужно осуществить соединение между модулем Central и Peripheral, для этого модулю Central надо дать команду AT+CON88C255122F9E. Если соединение произошло успешно, то HM-10 Central ответит "OK+CONNA", и на обоих модулях HM-10 перестанут мигать и начнут постоянно светиться LED, сигнализируя об активном соединении.
Теперь можно управлять светодиодом модуля Peripheral дистанционно, по радио, посылая AT-команды модулю Central. Чтобы зажечь светодиод, отправьте команду AT+PIO21:
Команда AT+PIO20 должна выключить светодиод:
Примечание: начальное состояние светодиода модуля Peripheral может зависеть от настроек портов для включения питания и начала соединения, из-за чего светодиод может зажечься сразу после включения питания или после установки соединения. Начальное состояние вывода PIO можно поменять командой AT+BEFC (перед соединением) и командой AT+AFTC (после соединения).
Автоматизация процесса. Поскольку дальнее автономное устройство Peripheral уже настроено должным образом, на нем ничего менять не нужно. На Central модуле HM-10 мы установим для него auto connect командой AT+IMM0.
Чтобы оборвать соединение модуля Central (это нужно, чтобы он начал отвечать на AT-команды), выключите питание модуля Peripheral. После этого на модуле Central нужно выполнить команды:
AT AT+RENEW AT+ROLE1
Команда AT+RENEW сбрасывает HM-10 в заводское состояние по умолчанию, и поскольку IMME0 это режим по умолчанию, то это настраивать не нужно.
Теперь после включения питания у обоих модулей одни должны соединяться друг с другом автоматически.
Для управления светодиодом подключите кнопку на вывод D2 платы Arduino, к которой подключен HM-10 Central.
После этого скомпилируйте и выгрузите в память Arduino следующий скетч:
// HM-10_Example_03_MODE2_LED
//
// Простое дистанционное управление с помощью двух Bluetooth HM-10:
// включение и выключение светодиода (LED).
// Первый модуль HM-10 в режиме Central подключен к Arduino.
// Второй модуль HM-10, без Arduino, управляет светодиодом,
// подключенным к PIO2.
//
// Используемые выводы:
// BT VCC - Arduino 5V.
// BT GND - Arduino GND.
// Arduino D8 (RX) - BT TX без делителя напряжения.
// Arduino D9 (TX) - BT RX через делитель напряжения.
voidsetup()
{
Serial.begin(9600);
Serial.print("Sketch: "); Serial.println(__FILE__);
Serial.print("Uploaded: "); Serial.println(__DATE__);
Serial.println(" ");
BTserial.begin(9600);
Serial.println("BTserial started at 9600");
Serial.println("");
pinMode(switchPin, INPUT);
}
voidloop()
{
// Очень простое подавление дребезга контактов.
boolean state1 = digitalRead(switchPin); delay(1);
boolean state2 = digitalRead(switchPin); delay(1);
boolean state3 = digitalRead(switchPin); delay(1);
if ((state1 == state2) && (state1==state3))
{
switch_State = state1;
if (switch_State != oldswitch_State)
{
if ( switch_State == HIGH) { BTserial.print("AT+PIO21" ); Serial.println("The LED is ON"); }
else { BTserial.print("AT+PIO20" ); Serial.println("The LED is OFF"); }
oldswitch_State = switch_State;
}
}
}
Этот скетч довольно простой. Когда кнопка нажата, дальнему модулю Peripheral по радиоканалу отправляется команда AT+PIO21. Когда кнопка отпускается, посылается команда AT+PIO20. AT+PIO21 команда переводит PIO2 в HIGH, тогда светодиод начнет светиться, и команда AT+PIO20 установит PIO-2 в LOW, тогда светодиод погаснет.
[Пример чтения по радио датчика освещенности]
В этом примере мы сделаем опрашиваемый по радио датчик освещенности, для чего будем использовать автономный модуль HM-10 в режиме Peripheral и подключенный к нему фоторезистор (Light Dependent Resistor, LDR). LDR подключим к выводу PIOB модуля Peripheral HM-10. Использование MODE1 позволит нам читать уровень напряжения на PIOB Peripheral HM-10 через модуль Central HM-10 и беспроводное соединение.
Настройки. Оба модуля HM-10 настроены на auto connect с помощью команды AT+IMME1, и модуль Peripheral HM-10 настроен в режим MODE1.
Схема. Central HM-10 ("главный" модуль) подключен к Arduino. К Peripheral HM-10 ("подчиненный" модуль) подключен LDR через порт PIOB. Peripheral HM-10 можно запитать от батарейки, однако нужно учесть, что на VCC переходной платы HM-10 надо подать +5v, и на LDR надо подать +3.3v.
Скетч. Программа Arduino очень простая, она отправляет AT+ADCB? и выводит ответ на неё. AT+ADCB? запрашивает чтение напряжения на выводе PIOB дальнего Peripheral HM-10.
// Sketch: HM-10_Example_04A_RemoteLightSensor
//
// Используемые выводы Master HM-10:
// BT VCC - Arduino 5V.
// BT GND - Arduino GND.
// Arduino D8 (RX) - BT TX без делителя напряжения.
// Arduino D9 (TX) - BT RX с делителем напряжения.
voidsetup()
{
Serial.begin(9600);
Serial.print("Sketch: "); Serial.println(__FILE__);
Serial.print("Uploaded: "); Serial.println(__DATE__);
Serial.println(" ");
Serial.println("The HM-10s should be set for auto connect");
Serial.println("The remote HM-10 should be set for MODE1");
BTSerial.begin(9600);
Serial.println("BTserial started at 9600");
Serial.println(" ");
}
В этом примере результаты чтения фотодатчика просто отображаются в окне Serial Monitor, но Вы можете реализовать в программе какие-то дополнительные действия, например начать мигать светодиодом на плате Arduino, когда свет включен (или когда выключен).
[HM-10: добавление второй Custom-характеристики]
По умолчанию HM-10 поставляется с одной пользовательской (custom) характеристикой custom-службы, а вторая custom-характеристика, предназначенная только для записи, может быть добавлена командой AT+FFE2. Эта команда была добавлена в firmware версии 5.45, и расширена в версии 5.50.
У второй custom-характеристики FFE2 есть только свойство WRITE, и нет свойства READ, и значение у этой характеристики, отправляемое в UART, будет такое же, как и у характеристики FFE1.
Хотя вторая custom-характеристика предназначена только для записи (WRITE only), Вы можете настроить, использовать или нет ответ для неё с помощью команды AT+RESP.
AT+RESP?
Опрашивает состояние ответа, вернет 0 или 1.
0 запись без ответа. 1 запись с ответом.
AT+RESP0 установит вторую custom-характеристику на работу без ответа.
AT+RESP1 установит вторую custom-характеристику на работу с ответом.
Скетч. Этот скетч добавляет символы конца строки в данные, передаваемые в Serial Monitor, чтобы было проще читать команды. Этот скетч также удаляет любые символы конца строки из данных команд перед отправкой их в HM-10. Это означает, что Serial Monitor можно настроить в режим вывода этих символов "Both NL & CR".
После соединения и выгрузки скетча с помощью команды AT проверьте, что HM-10 отвечает на команды. Затем используйте команду AT+RENEW для восстановления заводских настроек.
AT+FFE21 запустит в работу вторую custom-характеристику. Автор также настроил работу второй характеристики с ответом командой AT+RESP1.
Передерните питание или выполните команду сброса, чтобы изменения в HM-10 вступили в силу.
Вторая custom-характеристика работает только на запись (WRITE only). Это означает, что мы можем использовать её для отправки данных в HM-10, но не можем использовать для чтения данных. Все, что мы отправим в HM-10, будет выведено таким же, что в первой custom-характеристике.
Чтобы увидеть это в действии, можно использовать приложение BLE Scanner. Запустите его, найдите HM-10 и подключитесь к нему, раскройте custom service, и Вы должны увидеть две custom-характеристики:
На характеристике FFE2 кликните на кнопку W, и появится окно ввода текста. Введите "HELLO", и отправьте этот текст. Значение характеристики должно поменяться на "HELLO", и "HELLO" должно появиться в Serial Monitor:
[Использование HM-10 с другими модулями (не HM-10)]
Начиная с firmware 5.42, Jinan Huamao изменили, как HM-10 общаются с модулями не от Jinan Huamao. Версии до 5.42 HM-10 соединялись и обменивались данными очень хорошо.
При использовании свежих версий firmware, автор обнаружил, что стали ограничены возможности по подключению HM-10 с другими модулями UART BLE наподобие AT09 и BT05. HM-10 будет подключаться к другому модулю и передавать в него данные, но обратно данные HM-10 не принимает. Предполагалось, что функция самообучения AT+COMP1 должна сработать, но этого не случилось.
Функция iBeacon пока не доступна, она переписывается.
[Обновление firmware HM-10]
Важное замечание: обновление firmware нельзя откатить или отменить. Как только Вы выдали команду OK+SBLUP, больше нельзя вернуться к предыдущей версии firmware.
Программное обеспечение HM-10 довольно регулярно обновляется, и появляется для загрузки на сайте Jinan Huamao [6]. Там же можно найти руководство по обновлению новым firmware.
Как и платы Arduino, модуль HM-10 имеет на борту загрузчик (bootloader), который упрощает процедуру обновления firmware. Для этого понадобится Windows PC и адаптер преобразователя USB to serial UART (с уровнями сигналов 3.3V).
Получение файлов firmware. Со странички загрузки [6] загрузите zip-архив с последним HM-10 firmware, запишите его на диске в любую удобную папку, и распакуйте.
Замечание: firmware для чипов CC2540 и CC2541 разное, т. е. нельзя загрузить CC2540 firmware в чип CC251. Все модули, с которым работал автор, использовали чип CC2541, и на сайте Jinan Haumao выложены firmware для чипа CC2541, хотя это стоит еще раз проверить.
В zip-архиве firmware 5.47 содержалось 4, хотя для других версий это может поменяться. В последней версии версии 7.00 (на момент 181214) файл содержал 3 файла:
HMSoft.bin HMSoft.exe readme.txt
Для прошивки firmware нужны два файла HMSoft.exe и HMSoft.bin. HMSoft.exe это программа Windows, которая передает firmware в модуль, HMSoft.bin это само firmware. HMSoft.exe не требует инсталляции, и запускается простым двойным кликом.
Подключение HM-10 к компьютеру. Если Вы используете адаптер USB - TTL UART с уровнями сигнала 5V, то понадобится подключить делитель напряжения на его сигнал TX. Многие руководства из Интернет показывают соединение выводов 5V адаптера UART (и выводов Arduino с уровнями 5V) напрямую, но лучше так не делать. Модули HM-10 питаются от 3.3v, и используют логические уровни 3.3V, и сигнал RX модуля HM-10 не рассчитан на уровень 5V.
Вы можете заметить, что соединение между TX адаптера UART 5V до вывода RX HM-10 использует делитель, но другой сигнал между RX адаптера UART 5V до вывода TX HM-10 подключен напрямую. Так сделано потому, что уровни 3.3V устройства с уровнями 5V правильно интерпретируются как лог. 1.
На переходную плату HM-10 подано питание 5V от адаптера UART. Если Вы используете адаптер 3.3V UART, на выходе которого есть напряжение питания 3.3V, то потребуется отдельный источник питания для переходной платы HM-10, потому что минимальное напряжение, от которого работает стабилизатор напряжения переходной платы, составляет 3.6V.
После того, как все соединения сделаны, нужно проверить, работает ли связь HM-10 с компьютером. Можно использовать любую программу терминала (pytty, TerraTerm, SecureCRT), но можно также использовать Serial Monitor из Arduino IDE.
Замечание: следует помнить о том, что для HM-10 нужно вводить команды в верхнем регистре, и не нужно в них передавать символы окончания строки.
Чтобы воспользоваться Serial Monitor Arduino IDE, убедитесь, что правильно выбран номер порта для подключения. Номер порта, которому соответствует адаптер USB - UART, можно узнать в Диспетчере Устройств Windows. Предположим, что это порт COM6.
Откройте Serial Monitor, выберите скорость подключения "9600 baud" и настройку "No line ending". Введите и отправьте команду AT, и если все соединения были сделаны правильно, то получите ответ "OK".
Если нет ответа "OK":
– Проверьте, правильно ли установлена скорость подключения. По умолчанию скорость 9600. – Проверьте, что выбрана опция "No line ending" в нижней части окна Serial Monitor. – Проверьте, правильно ли разведены сигналы TX и RX. – Проверьте, не перепутали ли Вы номиналы резисторов делителя напряжения. - Проверьте напряжение питания модуля HM-10.
После получения подтверждения "OK" мы можем проверить версию текущего firmware в модуле HM-10 с помощью команды AT+VERR?.
В этом примере видно, что текущая версия 5.40.
Чтобы перевести в режим обновления, используйте команду AT+SBLUP. Вы должны получить ответ "OK+SBLUP", и LED на модуле HM-10 перестанет мигать.
Закройте Serial Monitor.
Процесс обновления. Откройте папку, куда Вы распаковали содержимое архива firmware, и запустите HMSoft.exe. Если Вы используете Windows 7 или более свежую версию Windows, то может понадобиться запустить эту программу с правами администратора.
Выберите файл firmware HMSoft.bin, введите правильный номер COM-порта, и кликните на кнопку Load Image.
Файл firmware будет записан и проверен. После завершения отобразится окно "Download completed successfully", и LED на HM-10 снова начнет мигать. Теперь можно закрыть программу обновления и снова запустить Serial Monitor, чтобы проверить версию нового firmware.
Проблемы при обновлении firmware. Если Вы запустили обновление, и ничего не происходит, то возможно что Вы оставили открытым Arduino IDE. Нужно из Arduino IDE, чтобы освободить COM-порт. Программа обновления HMSoft.exe не выдает сообщений об ошибке, если COM-порт недоступен.
Если выскочила ошибка таймаута (timeout error), то попробуйте снова запустить обновление. Если Вы постоянно получаете ошибку, то скорее всего виноват адаптер USB - UART. Некоторые адаптеры могут плохо работать на больших скоростях (возможно на которых стоят поддельные чипы FDTI), они могут быть причиной ошибок при передаче firmware и/или его проверке.
Если возникла проблема с загрузкой, то LED на модуле HM-10 будет продолжать светиться. Это означает, что он все еще в режиме передачи firmware (upload mode). Он останется в этом режиме даже после передергивания питания. Просто запустите заново обновление с помощью программы HMSoft.exe.
[Словарик]
BLE Bluetooth Low Energy, или Bluetooth LE, это беспроводная технология (иногда называемая Bluetooth Smart), разработанная и продвигаемая Bluetooth Special Interest Group (Bluetooth SIG), предназначенная для бытовой электроники, медицине, системах безопасности и индустрии домашних развлечений. BLE в сравнении с классическим Bluetooth был разработан для уменьшения энергопотребления и стоимости при сохранении почти такого же радиуса действия. Операционные системы для переносных устройств, включая iOS, Android, Windows Phone и BlackBerry, а также операционные системы macOS, Linux, Windows 8 и Windows 10 изначально имеют поддержку Bluetooth Low Energy (из Википедии).
[Ссылки]
1. HM-10 Bluetooth 4 BLE Modules site:martyncurrey.com. 2. GATT Services site:bluetooth.com. 3. GATT Characteristics site:bluetooth.com. 4. BLE Scanner site:play.google.com. 5. AltSoftSerial Library site:pjrc.com. 6. jnhuamao.cn Common Downloads. 7. 181213BLE-Bluetooth-HM-10.zip - скетчи, утилита обновления, документация. 8. Настройка App Inventor.
Подскажите пожалуйста, какая реальная скорость может быть достигнута при передаче через Bluetooth в этом модуле? Имеется в виду не скорость по UART, а скорость со всеми задержками.
microsin: вопрос по-настоящему сложный, не смогу на него ответить. Все зависит от конкретных рабочих условий, которые могут от вас даже не зависеть (т. е. от радиопомех, расстояния между модулями, наличия рядом других устройств Bluetooth). В идеальных условиях тоже не все однозначно - скорость может зависеть от режима работы, размера пакетов, дуплекс/симплекс, от скорости обработки данных в микроконтроллере хоста.
HC-05 одно время работали нормально. Подключаю девайс к телефону посредством модуля. Вышло обновление андроид 10 и прочие, и с весны 20 года перестали работать модули. 2-3 минуты подключаются, и обрыв подключения. Выяснили, что проблема не в модулях. Не знаю, как решить проблему...
Комментарии
microsin: вопрос по-настоящему сложный, не смогу на него ответить. Все зависит от конкретных рабочих условий, которые могут от вас даже не зависеть (т. е. от радиопомех, расстояния между модулями, наличия рядом других устройств Bluetooth). В идеальных условиях тоже не все однозначно - скорость может зависеть от режима работы, размера пакетов, дуплекс/симплекс, от скорости обработки данных в микроконтроллер е хоста.
RSS лента комментариев этой записи