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 к Arduino Макетная плата

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».

Команда AT Ответ OK

Чтобы проверить, какая прошивка установлена на HM-10, используйте AT+VERR? или AT+VERS?

Запрос версии прошивки Ответ с версией прошивки

Чтобы проверить имя модуля, используйте AT+NAME?, или используйте Android-устройство и найдите Bluetooth-устройства.

Имя по умолчанию — HMsoft.

Имя можно изменить той же командой. См. ниже.

Запрос имени Ответ с именем HM-10 в настройках Android

Подключите HM-10 к питанию и используйте мобильное устройство для поиска Bluetooth-устройств.

Это работает только когда HM-10 находится в режиме Slave/Peripheral. В режиме Master/Central он не транслирует своё имя.

Чтобы получить MAC-адрес модуля, используйте AT+ADDR?

Запрос MAC-адреса Ответ с MAC-адресом

Изменение имени с помощью 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.

Запрос UUID Ответ с UUID

Основные 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.