Отправка и получение данных 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-приложения, большинство из них работают одинаково :-)
Схема
Сначала соберём 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 В. Простой способ сделать это — использовать делитель напряжения из двух резисторов. Я использую резистор 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.
BLE Scanner
Откройте BLE Scanner.
Если приложение не сканирует автоматически, нажмите кнопку сканирования. Среди всех BLE-устройств должен быть HM-10.
Подключитесь к HM-10, нажав кнопку CONNECT рядом с записью HM-10. Светодиод на HM-10 должен перестать мигать (должен гореть постоянно).
Приложение подключается к HM-10 и выводит список сервисов, которые использует HM-10.
Откройте сервис GENERIC ACCESS, нажав на него. Нажмите маленькую кнопку R, чтобы прочитать (READ) имя устройства.
Далее попробуем отправить данные. Сначала от Arduino к приложению, а затем от приложения к Arduino.
Отправка данных в приложение
Закройте сервис GENERIC ACCESS, нажав на заголовок.
Откройте CUSTOM SERVICE.
При отправке данных через UART-соединение данные передаются через пользовательский сервис (custom service).
Чтобы увидеть это в действии, нажмите кнопку уведомлений
. Кнопка станет зелёной, показывая, что она активна.
Вернитесь к монитору порта. Введите Hello и нажмите отправить.
В BLE Scanner, как по волшебству, должно появиться Hello.
Чтобы отправить текст из приложения в монитор порта, нажмите иконку записи
(Write) и введите что-нибудь в всплывающее текстовое поле.
Вы заметите, что значение пользовательской характеристики изменится на то, что вы ввели. Текст также должен появиться в мониторе порта.
Вот и всё. Теперь вы можете отправлять и получать данные с помощью BLE-приложения.