HM-10: Используем Arduino для общения с HM-10
Примечание
Перевод статьи HM-10: Use An Arduino To Talk To A HM-10 с сайта Martyn Currey.
У вас есть HM-10 и хотите пообщаться с ним? Нужно знать, что сказать и как сказать. Давайте попробуем поговорить с HM-10, используя наиболее распространённые AT-команды.
Примечание
AT-команды работают только тогда, когда HM-10 не подключён к другому беспроводному устройству. После установления соединения команды воспринимаются как данные. AT является исключением — AT разрывает соединение.
Данное руководство предполагает, что у вас HM-10 с прошивкой, использующей скорость 9600 бод.
В этом руководстве используется Arduino с программным последовательным портом (Software Serial) для связи с HM-10. Software Serial очень ограничен в поддерживаемых скоростях и имеет рабочий максимум около 34800 бод на Arduino с частотой 16 МГц, таких как Nano, который я использую, и даже тогда он надёжен только если Arduino не делает много другого.
HM-10 использует разные скорости по умолчанию в зависимости от прошивки:
Прошивка до V699 — 9600
Прошивка V700–V709 — 115200
Прошивка V710 — снова 9600
Для HM-10 с прошивкой V700–V709 вам потребуется USB-UART адаптер или более быстрый Arduino. Arduino на 16 МГц с Software Serial не справится.
Схема
Сначала соберём Arduino и HM-10.
Arduino D2 (программный serial RX) к выводу TX HM-10
Arduino D3 (программный serial TX) к выводу RX HM-10 через делитель напряжения
GND к GND
+5V к VCC HM-10
*Выводы на самом HM-10 (маленькая дочерняя плата) работают только на 3.3 В. Они официально не толерантны к 5 В, поэтому используйте делитель напряжения или другой способ для снижения напряжения до 3.3 В.
HM-10 — устройство на 3.3 В. Плата-переходник преобразует +5 В VCC в 3.3 В для питания HM-10, но вывод RX по-прежнему 3.3 В. Поэтому нам нужно понизить 5 В TX Arduino до 3.3 В. Простой способ — использовать делитель напряжения из 2 резисторов. Я использую резистор 1 кОм и резистор 2 кОм.
Arduino воспринимает сигнал 3.3 В от вывода TX HM-10 как HIGH, поэтому мы можем подключить вывод TX HM-10 напрямую к выводу RX Arduino (D8).
Я использую готовый делитель напряжения.
Я делаю много подобных схем и изготовил множество небольших модулей для макетной платы. Один из них — делитель напряжения.
Скетч для последовательного порта
После сборки схемы загрузите следующий скетч. Это простая программа последовательного ввода-вывода. Всё, что Arduino получает от монитора порта, передаётся на HM-10. Всё, что получено от HM-10, копируется в монитор порта.
Я использую HM-10 с прошивкой V710 — скорость 9600 бод, не важно, добавляете ли вы символы конца строки (\n\r) или нет.
Приведённый ниже скетч написан для старых прошивок HM-10 и управляет окончаниями строк за меня: хотя я добавляю их в мониторе порта, они не отправляются на HM-10. Скетч выводит символы в монитор порта, но не отправляет их на HM-10. Это делает примеры более читаемыми.
/*
* sketch: SerialPassThrough_SoftwareSerial_NL
* www.martyncurrey.com
*
* Use software serial to talk to serial/UART connected device
* What ever is entered in the serial monitor is sent to the connected device
* Anything received from the connected device is copied to the serial monitor
* User input is echo'd to the serial monitor
*
* Pins
* BT VCC to Arduino 5V out.
* BT GND to GND
* Arduino D2 (Arduino RX)
* Arduino D3 (Arduino TX)
*
* Assumes a 5V Arduino is being used
* If the connected device is 3.3v add a voltage divider (5v to 3.3v) between Arduino TX and device RX
* Arduino RX to device TX does not need a voltage divider. The Arduino will see 3.3v as high
*
*/
#include <SoftwareSerial.h>
SoftwareSerial softSerial(2, 3); // RX, TX
char c=' ';
boolean NL = true;
void setup()
{
Serial.begin(9600);
Serial.print("Sketch: "); Serial.println(__FILE__);
Serial.print("Uploaded: "); Serial.println(__DATE__);
softSerial.begin(9600);
Serial.println("softSerial started at 9600");
Serial.println("Set line endings to 'Both NL & CR'");
}
void loop()
{
// Read from the UART module and send to the Serial Monitor
if (softSerial.available())
{
c = softSerial.read();
Serial.write(c);
}
// Read from the Serial Monitor and send to the UART module
if (Serial.available())
{
c = Serial.read();
// do not send line end characters to the HM-10
if (c!=10 & c!=13 ) { softSerial.write(c); }
// Echo the user input to the main window.
// If there is a new line print the ">" character.
if (NL) { Serial.print("\r\n>"); NL = false; }
Serial.write(c);
if (c==10) { NL = true; }
}
} // void loop()
Загрузите скетч и откройте монитор порта — вы должны увидеть что-то похожее на:
HM-10 требует команды в верхнем регистре и, в зависимости от версии прошивки, обычно без символов конца строки.
Здесь скетч обрабатывает символы конца строки за нас. Он не отправляет их на Bluetooth-модуль, но выводит их при эхо-отображении команды. Это не обязательно, но означает, что команды будут на отдельных строках и их будет легче читать. Обычно при работе с HM-10 всё выводится на одной строке.
Помните: при использовании других скетчей или USB-UART адаптера установите окончания строк на «No line ending» внизу монитора порта.
Внизу монитора порта установите скорость на 9600 или 115200* и, используя приведённый выше скетч, мы можем иметь выбранные символы конца строки:
* 115200 не будет работать с 16 МГц Arduino на Software Serial.
Прошивка до V700 использует 9600
Прошивка V700–V709 использует 115200
Прошивка V710 — похоже, снова 9600
Чтобы проверить правильность подключения, используем команду «AT».
Команда «AT» используется для подтверждения работы связи — она просто возвращает «OK».
«AT» также можно использовать для разрыва активного соединения.
Введите «AT» (без кавычек) в текстовое поле и нажмите Send. Если всё работает, вы должны увидеть «OK».
Чтобы проверить, какая прошивка установлена на HM-10, используйте AT+VERR? или AT+VERS?
Чтобы проверить имя модуля, используйте AT+NAME?, или используйте Android-устройство и найдите Bluetooth-устройства.
Имя по умолчанию — HMsoft.
Имя можно изменить той же командой. См. ниже.
Подключите HM-10 к питанию и используйте мобильное устройство для поиска Bluetooth-устройств.
Это работает только когда HM-10 находится в режиме Slave/Peripheral. В режиме Master/Central он не транслирует своё имя.
Чтобы получить MAC-адрес модуля, используйте AT+ADDR?
Изменение имени с помощью AT+NAME.
Позже я буду использовать 2 HM-10, и изменение имён поможет определить, какой из них какой. Как вы можете видеть ниже, я изменил имя на HM10-5221. «5221» — это последние 4 цифры MAC-адреса.
Измените имя с помощью AT+NAMEHM10-5221.
Если вы используете AT+NAME? для проверки, HM-10 покажет новое имя, однако он не изменит транслируемое имя до перезагрузки или циклирования питания.
Чтобы получить Bluetooth-характеристику модуля, используйте AT+CHAR? или приложение BLE Scanner.
Для получения дополнительной информации о сервисах и характеристиках HM-10 перейдите к введению в HM-10.
Чтобы найти UUID, используйте AT+UUID? Это вернёт OK+Get:0xFFE0.
Основные AT-команды
Вот список основных AT-команд. Помните, что команды должны быть в верхнем регистре. Окончания строк зависят от прошивки HM-10.
Команда |
Описание |
Подробности |
|---|---|---|
AT |
Тестовая команда или команда отключения |
Если модуль не подключён к удалённому устройству, он ответит «OK». Если есть соединение, оно будет разорвано. При включённых уведомлениях модуль ответит «OK+LOST». |
AT+NAME? |
Запрос имени |
Возвращает имя, транслируемое модулем, например HMsoft. |
AT+NAMEnewname |
Изменение имени модуля |
Изменяет имя, транслируемое модулем. Например, AT+NAMEmyBTmodule изменяет имя на myBTmodule. Максимальная длина нового имени — 12 символов. |
AT+ADDR? |
Запрос MAC-адреса HM-10 |
Возвращает адрес в виде 12-значного шестнадцатеричного числа, например OK+ADDR:606405D138A3. |
AT+VERS? / AT+VERR? |
Запрос версии прошивки |
Например: HMSoft V540. |
AT+RESET |
Перезапуск модуля |
Возвращает OK+RESET. Закроет активное соединение при перезапуске. |
AT+RENEW |
Восстановление заводских настроек |
Быстрый и простой способ сбросить все настройки. |
AT+BAUD? |
Запрос скорости UART |
Возвращает значение 0–8. 0 — 9600, 1 — 19200, 2 — 38400, 3 — 57600, 4 — 115200, 5 — 4800, 6 — 2400, 7 — 1200, 8 — 230400. По умолчанию: 0 (9600). |
AT+BAUDx |
Установка скорости UART |
x — значение от 0 до 8. Будьте осторожны при использовании с Arduino — максимальная скорость монитора порта 115200. |
AT+NOTI |
Настройка уведомлений |
Если уведомления включены, HM-10 будет отвечать подтверждениями. AT+NOTI0 — выкл., AT+NOTI1 — вкл. |
AT+NOTI0 — выключить уведомления
AT+NOTI1 — включить уведомления
AT+NOTI? — запрос статуса уведомлений. Возвращает 0 или 1.
AT+PASS? — запрос пароля для сопряжения. Отвечает 6-значным числом, например «OK+Get:123456».
AT+PASS — установка нового пароля. Пароль должен содержать 6 символов. AT+PASS123456 устанавливает пароль 123456.
AT+ROLE? — запрос текущей роли: Master или Slave. Возвращает 0 или 1:
0 = Slave или Peripheral
1 = Master или Central
Настройка по умолчанию: 0 (Slave).
AT+ROLEx — установка роли устройства. x — 0 или 1:
AT+ROLE0 — режим Slave/Peripheral. Возвращает OK+Set:0
AT+ROLE1 — режим Master/Central. Возвращает OK+Set:1
AT+ROLEx может потребовать перезагрузку (зависит от версии прошивки) до вступления изменений в силу.
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 (по умолчанию) запоминает адрес последнего модуля, к которому был подключён, и при наличии сохранённого подключения оно будет приоритетным при повторном подключении.
Полный список AT-команд см. в даташите V610/V707 2020-02.