Отправка и получение данных HM-10 через BLE Scanner

Примечание

Перевод статьи Send And Receive Data To The HM-10 Using A BLE Scanner App с сайта Martyn Currey.

Во введении к HM-10 я упоминал, что BLE целиком построен на сервисах и характеристиках, и HM-10 работает, устанавливая значение пользовательской характеристики в соответствии со значением передаваемых или получаемых данных. Это можно увидеть при использовании приложения BLE Scanner, Arduino и Arduino IDE.

Данное руководство предполагает, что вы используете HM-10 с прошивкой, использующей скорость 9600 бод. Если у вас 115200, обновите до V710. V710 возвращается к 9600.

Приложение BLE Scanner

Я использую BLE Scanner (Connect & Notify) от Bluepixel Technologies. Приложение включает встроенные покупки, но вам не нужно ничего покупать для использования основных функций.

BLE Scanner в Google Play

Вам не обязательно использовать именно это приложение. Подойдут аналогичные BLE-приложения, большинство из них работают одинаково :-)

Схема

Сначала соберём 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 Макетная плата с HM-10

HM-10 — устройство на 3.3 В. Плата-переходник преобразует +5 В VCC в 3.3 В для питания HM-10, но вывод RX по-прежнему 3.3 В. Поэтому нам нужно понизить 5 В вывод TX Arduino до 3.3 В. Простой способ сделать это — использовать делитель напряжения из двух резисторов. Я использую резистор 1 кОм и резистор 2 кОм.

Arduino воспринимает сигнал 3.3 В от вывода TX HM-10 как HIGH, поэтому мы можем подключить вывод TX HM-10 напрямую к выводу RX Arduino (D8).

Делитель напряжения

Я использую готовый делитель напряжения.

Я делаю много подобных схем на макетной плате и изготовил множество небольших модулей. Один из них — делитель напряжения.

Включите питание — светодиод на HM-10 должен мигать примерно раз в секунду.

Скетч для последовательного порта

После сборки схемы загрузите следующий скетч. Это простая программа ввода-вывода через последовательный порт. Всё, что Arduino получает от монитора порта, передаётся на HM-10. Всё, что получено от HM-10, копируется в монитор порта.

Я использую HM-10 с прошивкой V710. Она использует скорость 9600 бод и не зависит от наличия символов конца строки (\n\r). Если вы добавляете символы конца строки, HM-10 тоже их добавит; если нет — не будет.

Приведённый ниже скетч был написан для старых прошивок HM-10 и управляет окончаниями строк за меня: хотя я добавляю их в мониторе порта, они не отправляются на HM-10. Скетч выводит символы в монитор порта, но не отправляет их на HM-10. Это помогает сделать примеры более читаемыми.

/*
 *  sketch: SerialPassThrough_SoftwareSerial_NL
 *  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
 *
 *  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()

После загрузки скетча откройте монитор порта — вы должны увидеть что-то похожее на:

Монитор порта после открытия

Внизу монитора порта установите скорость 9600 и выберите Both NL & CR.

Настройки монитора порта

HM-10 требует команды в верхнем регистре и, в зависимости от версии прошивки, обычно без добавления символов конца строки.

Скетч сам обрабатывает символы конца строки — он не отправляет их на Bluetooth-модуль, но выводит при эхо-отображении команды в главном окне монитора порта. Это не строго обязательно, но означает, что команды будут на отдельных строках и их будет легче читать в следующих примерах. Обычно при работе с HM-10 всё выводится на одной строке.

Помните: при использовании других скетчей или USB-UART адаптера установите окончания строк на «No line ending» внизу монитора порта.

Загрузите скетч и откройте монитор порта.

Используйте команду AT для подтверждения работы связи. Если она работает, HM-10 ответит OK.

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

BLE Scanner

Откройте BLE Scanner.

Если приложение не сканирует автоматически, нажмите кнопку сканирования. Среди всех BLE-устройств должен быть HM-10.

BLE Scanner — поиск устройств

Подключитесь к HM-10, нажав кнопку CONNECT рядом с записью HM-10. Светодиод на HM-10 должен перестать мигать (должен гореть постоянно).

HM-10 в списке устройств

Приложение подключается к HM-10 и выводит список сервисов, которые использует HM-10.

HM-10 подключён — список сервисов

Откройте сервис GENERIC ACCESS, нажав на него. Нажмите маленькую кнопку R, чтобы прочитать (READ) имя устройства.

Чтение имени устройства Имя устройства прочитано

Далее попробуем отправить данные. Сначала от Arduino к приложению, а затем от приложения к Arduino.

Отправка данных в приложение

Закройте сервис GENERIC ACCESS, нажав на заголовок.

Закрытие Generic Access

Откройте CUSTOM SERVICE.

Открытие Custom Service

При отправке данных через UART-соединение данные передаются через пользовательский сервис (custom service).

Custom Service открыт

Чтобы увидеть это в действии, нажмите кнопку уведомлений N. Кнопка станет зелёной, показывая, что она активна.

Уведомления активированы

Вернитесь к монитору порта. Введите Hello и нажмите отправить.

Отправка Hello через монитор порта

В BLE Scanner, как по волшебству, должно появиться Hello.

Hello получено в BLE Scanner

Чтобы отправить текст из приложения в монитор порта, нажмите иконку записи W (Write) и введите что-нибудь в всплывающее текстовое поле.

Вы заметите, что значение пользовательской характеристики изменится на то, что вы ввели. Текст также должен появиться в мониторе порта.

Отправка данных из приложения — шаг 1 Отправка данных из приложения — шаг 2 Данные получены в мониторе порта

Вот и всё. Теперь вы можете отправлять и получать данные с помощью BLE-приложения.