Проект 12: Bluetooth-модуль HM-10

Модуль Bluetooth HM-10 (BLE 4.0)

Введение

Что мы будем делать?

В этом проекте мы научимся принимать команды со смартфона через Bluetooth! Модуль HM-10 превратит Arduino в беспроводное устройство, которым можно управлять прямо из браузера на телефоне или компьютере!

Bluetooth-модуль позволит нам:

  • Отправлять команды роботу без проводов и пультов (только браузер!)

  • Управлять роботом на расстоянии до 100 метров (в прямой видимости!)

  • Получать данные с датчиков прямо на экран телефона

  • Работать и с Android, и с Desktop — универсальная совместимость!

  • Создавать собственное приложение для управления (в будущем)

Что такое HM-10?

HM-10 — это современный Bluetooth-модуль стандарта BLE 4.0 (Bluetooth Low Energy). В отличие от старых модулей (HC-05, HC-06), HM-10 поддерживает:

  • Android (Chrome, Edge, Opera)

  • Desktop (Windows, macOS, Linux в Chrome/Edge/Opera)

  • Низкое энергопотребление (~8-15 мА против 30-40 мА у HC-05)

  • 📡 Большая дальность (до 100 м в прямой видимости)

  • 🌐 Web Bluetooth API — управление прямо из браузера!

Где это используется?

  • 🤖 Роботы: управление движением, режимами работы, калибровкой

  • 🏠 Умный дом: выключатели света, термостаты, замки

  • 🎮 Игрушки: радиоуправляемые машинки, дроны, роботы

  • 📊 Мониторинг: датчики температуры, влажности, давления

  • 💪 Фитнес-трекеры: пульсометры, шагомеры, умные часы

HM-10 подключён к роботу (см. Проект 1): D10 (RX), D11 (TX), VCC, GND.

Необходимо: Смартфон Android или компьютер с браузером Chrome/Edge/Opera.

Теория: как работает Bluetooth

Основной принцип

Bluetooth — это технология беспроводной передачи данных на короткие расстояния.

HM-10 использует Bluetooth 4.0 Low Energy (BLE) — современный энергоэффективный стандарт.

Ключевые характеристики HM-10:

  • Частота: 2.4 ГГц (как Wi-Fi, но другой протокол)

  • Дальность: до 100 метров (в прямой видимости!)

  • Скорость: до 48 Кбит/с (достаточно для управления роботом)

  • Энергопотребление: ~8-15 мА в режиме передачи, ~400 мкА в режиме ожидания

Что такое BLE (Bluetooth Low Energy)?

BLE — это НЕ просто улучшенная версия обычного Bluetooth. Это другой протокол, оптимизированный для:

  • Низкого энергопотребления (в 5-10 раз меньше, чем Bluetooth Classic)

  • 📱 Работы через Web Bluetooth API (управление из браузера!)

  • 📡 Большой дальности (до 100 м)

Режимы работы HM-10:

  1. Режим передачи данных — обычный режим, передаёт данные между Arduino и телефоном

  2. Режим AT-команд — режим настройки (имя, пароль, скорость)

Мы будем использовать режим передачи данных (по умолчанию при включении).

Протокол UART через BLE

HM-10 использует UART через BLE — имитация обычного COM-порта через Bluetooth Low Energy.

Как это работает:

  1. Arduino отправляет данные в SoftwareSerialHM-10 TX

  2. HM-10 преобразует в BLE-пакеты и передаёт по воздуху

  3. Браузер принимает пакеты через Web Bluetooth API и отображает в приложении

  4. Обратно: браузер → HM-10 RX → SoftwareSerial → Arduino

Arduino          HM-10           🌐 BLE Controller (браузер)
-------          -----           ---------------------------
Serial.print  →  TXD  )))  →  Web Bluetooth API (Terminal)
Serial.read   ←  RXD  (((  ←  Send: "hello"

Для Arduino это выглядит как обычный Serial.print() и Serial.read()!

Примечание

Почему SoftwareSerial, а не Serial?

  • Serial (D0/D1) нужен для Serial Monitor (отладка)

  • SoftwareSerial (D10/D11) создаёт виртуальный COM-порт программно

  • Так мы можем одновременно общаться с телефоном и видеть отладочные сообщения!

Индикация HM-10

HM-10 имеет встроенный светодиод:

  • Мигает — не подключён к телефону (ожидание)

  • Постоянно горит — подключён к телефону (активная связь)

Состояния светодиода HM-10

Примечание

Подключение HM-10: см. Проект 1. Используем пины D10 (RX) и D11 (TX) для SoftwareSerial.

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

Для работы с HM-10 мы будем использовать BLE Controller — веб-приложение от Alash Electronics.

Что это такое?

BLE Controller — это универсальное веб-приложение для управления Bluetooth-устройствами прямо из браузера.

Ключевые преимущества:

Не требует установки — работает прямо в браузере Chrome/Edge/Opera

Кроссплатформенность — Android и Desktop (Windows, macOS, Linux)

Без рекламы — ничто не отвлекает от работы

Мультиязычность — русский, казахский, английский

Open Source — код доступен на GitHub

4 режима работы — Terminal, RC Car, Joystick, Smart Home

Ссылка: https://alash-electronics.github.io/bluetoothWebApp/

Режимы работы

BLE Controller имеет 4 режима работы:

Режим

Описание

Применение

Terminal 💻

Последовательный терминал с макросами

Проект 12 (этот урок)

RC Car 🚗

Геймпад с D-pad и кнопками

Проекты 13-14 (управление роботом)

Joystick 🎮

Двойной джойстик PS4-стиль

Альтернативное управление

Smart Home 🏠

Управление устройствами

Не для робототехники

В этом проекте мы будем использовать режим Terminal для изучения основ Bluetooth.

В следующих проектах (13-14) мы переключимся на режим RC Car для управления роботом Фобо.

Главный экран BLE Controller с выбором режимов

Terminal Mode (Терминал)

Возможности Terminal Mode:

  • 📨 Отправка любых команд через текстовое поле

  • 📥 Приём данных от Arduino в реальном времени

  • 🔧 6 настраиваемых макро-кнопок (M1-M6) для быстрых команд

  • 📜 История сообщений с временными метками

  • 🗑️ Очистка лога одной кнопкой

  • 🔄 Автопрокрутка (можно отключить)

  • 📋 Цветовая индикация: входящие (синие), исходящие (зелёные)

Протокол:

  • Приложение отправляет текст + \n (символ новой строки)

  • Arduino читает через bluetooth.readStringUntil('\n')

  • Arduino отправляет через bluetooth.println()

Макро-кнопки:

6 кнопок (M1-M6), каждая отправляет настраиваемую команду. По умолчанию: M1, M2, M3, M4, M5, M6.

Поддерживаемые платформы

Платформа

Статус

Браузер

Android

✅ Полная поддержка

Chrome, Edge, Opera

Desktop (Windows)

✅ Полная поддержка

Chrome, Edge, Opera

Desktop (macOS)

✅ Полная поддержка

Chrome, Edge, Opera

Desktop (Linux)

✅ Полная поддержка

Chrome, Edge, Opera

iOS (iPhone/iPad)

⚠️ Ограниченная

Bluefy Browser (бесплатно)

Любой Firefox

❌ Не работает

Web Bluetooth не поддерживается

Safari (Mac/iOS)

❌ Не работает

Web Bluetooth не поддерживается

Предупреждение

Для iOS пользователей:

Safari не поддерживает Web Bluetooth API. Если у вас iPhone/iPad:

  1. Вариант 1: Установите Bluefy Browser (бесплатно) из App Store — это браузер с поддержкой Web Bluetooth

  2. Вариант 2: Используйте другие BLE Terminal приложения (LightBlue, BLE Terminal HM-10)

  3. Вариант 3: Используйте Android-устройство или компьютер

Bluefy Browser в App Store

Открытие приложения

Шаг 1: Откройте браузер

  • Android: Chrome, Edge или Opera

  • Desktop: Chrome, Edge или Opera

  • iOS: Bluefy Browser (если установлен)

Шаг 2: Перейдите по ссылке

Введите в адресной строке или откройте ссылку:

https://alash-electronics.github.io/bluetoothWebApp/

Шаг 3: Дождитесь загрузки

Приложение загрузится за 1-2 секунды. Вы увидите экран выбора режима с 4 карточками.

Шаг 4: Выберите режим Terminal

Нажмите на карточку Terminal (💻 Терминал).

Выбор режима Terminal в BLE Controller

Подключение к HM-10

Шаг 1: Включите робота Phobo

  • Включите питание (выключатель на батарейном отсеке)

  • Светодиод HM-10 должен мигать (режим ожидания подключения)

Шаг 2: Нажмите на кнопку Bluetooth

В приложении нажмите на красную точку (статус Bluetooth) в центре заголовка.

Появится диалог выбора устройства.

Интерфейс Terminal Mode с красной точкой Bluetooth

Шаг 3: Выберите устройство

В списке найдите устройство BT05 (или HMSoft, HM-10) и нажмите на него.

Диалог выбора Bluetooth устройства

Примечание

Имя модуля: По умолчанию HM-10 называется BT05 или HMSoft. Это имя можно изменить через AT-команды (см. раздел «Расширенная информация»).

Шаг 4: Дождитесь подключения

  • Статус изменится с красной точки (отключен) на зелёную точку (подключен)

  • Светодиод HM-10 на роботе перестанет мигать и будет постоянно гореть

  • В окне терминала появится сообщение «Connected to BT05»

Terminal Mode после успешного подключения

Готово! Теперь можно отправлять команды роботу.

Что вы увидите

Интерфейс Terminal Mode:

  • Верхняя часть: Статус подключения (зелёная точка), кнопка Settings (⚙️)

  • Центральная часть: История сообщений - Синие сообщения — полученные от Arduino - Зелёные сообщения — отправленные с телефона - Временные метки у каждого сообщения

  • Нижняя часть: - Текстовое поле для ввода команд - Кнопка Send для отправки - 6 макро-кнопок (M1-M6) - Кнопка Clear для очистки истории

Terminal Mode с историей сообщений

В Arduino IDE Serial Monitor вы также увидите все полученные команды — это полезно для отладки и проверки корректности передачи данных:

Serial Monitor Arduino IDE показывает полученные команды от Bluetooth

Код программы

Эксперимент 1: Приём текста со смартфона

Цель: Научиться принимать текстовые команды с телефона и выводить их в Serial Monitor.

Скопируйте этот код в Arduino IDE:

 1/*
 2 * Проект 12: Bluetooth-модуль HM-10
 3 * Эксперимент 1: Приём текста со смартфона
 4 *
 5 * Что делает программа:
 6 * - Принимает текст с телефона через Bluetooth
 7 * - Выводит полученный текст в Serial Monitor
 8 * - Отправляет подтверждение обратно на телефон
 9 *
10 * Подключение:
11 * HM-10 VCC → +5V, GND → GND (Sensor Shield)
12 * HM-10 TXD → D10 (RX Arduino), HM-10 RXD → D11 (TX Arduino)
13 */
14
15#include <SoftwareSerial.h>              // Библиотека для программного UART
16
17// НАСТРОЙКИ BLUETOOTH
18const uint8_t BT_RX = 10;                // Пин RX для Bluetooth (к TX HM-10)
19const uint8_t BT_TX = 11;                // Пин TX для Bluetooth (к RX HM-10)
20
21SoftwareSerial bluetooth(BT_RX, BT_TX);  // Создаём программный Serial
22
23void setup() {
24  Serial.begin(9600);                    // Serial Monitor (отладка)
25  bluetooth.begin(9600);                 // Bluetooth (связь с телефоном)
26
27  Serial.println("========================================");
28  Serial.println("  Проект 12: Bluetooth HM-10");
29  Serial.println("  Эксперимент 1: Приём текста");
30  Serial.println("========================================");
31  Serial.println();
32  Serial.println("Подключитесь к HM-10 из браузера.");
33  Serial.println("Откройте: https://alash-electronics.github.io/bluetoothWebApp/");
34  Serial.println("Выберите режим Terminal и отправьте сообщение!");
35  Serial.println();
36
37  // Приветствие на телефоне
38  bluetooth.println("Arduino готова к приёму!");
39  bluetooth.println("Отправьте мне сообщение :)");
40}
41
42void loop() {
43  // Проверяем, есть ли данные от телефона
44  if (bluetooth.available()) {
45    String message = bluetooth.readStringUntil('\n');  // Читаем до Enter
46    message.trim();                                    // Убираем пробелы
47
48    // Игнорируем служебные сообщения HM-10 (мусор до подключения)
49    if (message.length() == 0 || message.indexOf("ERROR") >= 0) {
50      return;  // Пропускаем пустые сообщения и служебные
51    }
52
53    // Выводим в Serial Monitor
54    Serial.print("📱 Получено: ");
55    Serial.println(message);
56
57    // Отправляем подтверждение на телефон
58    bluetooth.print("✓ Получено: ");
59    bluetooth.println(message);
60  }
61
62  // Бонус: отправка с Serial Monitor на телефон
63  if (Serial.available()) {
64    String response = Serial.readStringUntil('\n');
65    response.trim();
66    bluetooth.println(response);
67    Serial.print("→ Отправлено на телефон: ");
68    Serial.println(response);
69  }
70}

Как работает код:

  1. Строка 15: Подключаем библиотеку SoftwareSerial для создания виртуального COM-порта

  2. Строки 18-19: Определяем пины RX=10 (принимает от HM-10), TX=11 (передаёт в HM-10)

  3. Строка 21: Создаём объект bluetooth типа SoftwareSerial

  4. Строка 24: Инициализируем Serial Monitor (9600 бод)

  5. Строка 25: Инициализируем Bluetooth (9600 бод — стандартная скорость HM-10)

  6. Строки 38-39: Отправляем приветствие на телефон

  7. Строка 45: bluetooth.available() — проверяет, есть ли данные от телефона

  8. Строка 46: readStringUntil('\n') — читает до символа новой строки (Enter)

  9. Строка 47: trim() — убирает пробелы и переводы строк по краям

  10. Строки 49-51: Фильтрация служебных сообщений — HM-10 отправляет «мусор» до подключения (ERROR, �횘), игнорируем их

  11. Строки 58-59: Отправляем подтверждение обратно на телефон

Примечание

Фильтрация мусорных данных:

До подключения телефона HM-10 может отправлять служебные сообщения (ERROR, крякозябры). Строки 49-51 фильтруют эти сообщения — проверяем, что сообщение не пустое и не содержит слово «ERROR».

Примечание

Два Serial одновременно:

  • Serial (D0/D1) — для Serial Monitor (отладка)

  • bluetooth (D10/D11) — для связи с телефоном

Можно одновременно видеть отладочные сообщения и общаться с телефоном!

Загрузка и тестирование

Примечание

Процесс загрузки кода: см. подробную инструкцию в Уроке 1. Откройте Serial Monitor (9600 baud) после загрузки.

Что вы увидите в Serial Monitor

После загрузки программы:

========================================
  Проект 12: Bluetooth HM-10
  Эксперимент 1: Приём текста
========================================

Подключитесь к HM-10 из браузера.
Откройте: https://alash-electronics.github.io/bluetoothWebApp/
Выберите режим Terminal и отправьте сообщение!

Теперь откройте BLE Controller в браузере и подключитесь к HM-10.

В терминале приложения появится:

Arduino готова к приёму!
Отправьте мне сообщение :)

Отправьте с телефона: Hello, Arduino!

На экране телефона (в терминале):

[12:34:56] ✓ Получено: Hello, Arduino!

В Serial Monitor Arduino:

📱 Получено: Hello, Arduino!
Serial Monitor с выводом полученных команд

Бонус: Введите текст в Serial Monitor и нажмите Enter — он отправится на телефон!

Эксперимент 2: Управление светодиодом

Цель: Управлять встроенным светодиодом Arduino (D13) с телефона.

Команды:

  • ON или 1 → включить светодиод

  • OFF или 0 → выключить светодиод

  • STATUS → узнать текущее состояние

 1/*
 2 * Проект 12: Bluetooth-модуль HM-10
 3 * Эксперимент 2: Управление светодиодом
 4 *
 5 * Команды (отправить через BLE Controller Terminal):
 6 * ON / 1     - включить светодиод
 7 * OFF / 0    - выключить светодиод
 8 * STATUS     - узнать состояние
 9 */
10
11#include <SoftwareSerial.h>
12
13const uint8_t BT_RX = 10;
14const uint8_t BT_TX = 11;
15const uint8_t LED_PIN = 13;              // Встроенный светодиод
16
17SoftwareSerial bluetooth(BT_RX, BT_TX);
18
19bool ledState = false;                   // Текущее состояние светодиода
20
21void setup() {
22  Serial.begin(9600);
23  bluetooth.begin(9600);
24  pinMode(LED_PIN, OUTPUT);
25
26  Serial.println("========================================");
27  Serial.println("  Проект 12: Эксперимент 2");
28  Serial.println("  Управление светодиодом через BT");
29  Serial.println("========================================");
30  Serial.println();
31
32  bluetooth.println("=== Управление светодиодом ===");
33  bluetooth.println("Команды:");
34  bluetooth.println("  ON / 1     - включить");
35  bluetooth.println("  OFF / 0    - выключить");
36  bluetooth.println("  STATUS     - состояние");
37}
38
39void loop() {
40  if (bluetooth.available()) {
41    String cmd = bluetooth.readStringUntil('\n');
42    cmd.trim();
43    cmd.toUpperCase();                   // Преобразуем в заглавные буквы
44
45    // Игнорируем служебные сообщения HM-10
46    if (cmd.length() == 0 || cmd.indexOf("ERROR") >= 0) {
47      return;
48    }
49
50    // Обрабатываем команды
51    if (cmd == "ON" || cmd == "1") {
52      ledState = true;
53      digitalWrite(LED_PIN, HIGH);
54      bluetooth.println("✓ Светодиод ВКЛЮЧЕН");
55      Serial.println("LED: ON");
56
57    } else if (cmd == "OFF" || cmd == "0") {
58      ledState = false;
59      digitalWrite(LED_PIN, LOW);
60      bluetooth.println("✓ Светодиод ВЫКЛЮЧЕН");
61      Serial.println("LED: OFF");
62
63    } else if (cmd == "STATUS") {
64      bluetooth.print("Состояние: ");
65      bluetooth.println(ledState ? "ВКЛЮЧЕН" : "ВЫКЛЮЧЕН");
66      Serial.print("LED status: ");
67      Serial.println(ledState ? "ON" : "OFF");
68
69    } else {
70      bluetooth.println("❌ Неизвестная команда!");
71      bluetooth.println("Доступные: ON, OFF, STATUS");
72      Serial.print("Unknown command: ");
73      Serial.println(cmd);
74    }
75  }
76}

Что нового:

  1. Строка 15: Используем встроенный светодиод на пине 13

  2. Строка 19: Переменная ledState хранит текущее состояние (вкл/выкл)

  3. Строка 43: toUpperCase() — преобразует команду в заглавные буквы (чтобы on = ON)

  4. Строки 46-67: Обработка трёх команд: ON, OFF, STATUS

  5. Строки 64-67: Если команда неизвестна → выводим список доступных команд

Пример работы:

Вы: ON
Arduino: ✓ Светодиод ВКЛЮЧЕН

Вы: STATUS
Arduino: Состояние: ВКЛЮЧЕН

Вы: OFF
Arduino: ✓ Светодиод ВЫКЛЮЧЕН

Вы: HELLO
Arduino: ❌ Неизвестная команда!
Arduino: Доступные: ON, OFF, STATUS
Управление светодиодом через Bluetooth

Эксперимент 3: Интерактивное меню

Цель: Создать полноценное меню управления с реальными датчиками робота Фобо.

Функции:

  • 1 или DIST → Прочитать расстояние (ультразвуковой датчик RCWL-9610A)

  • 2 или LINE → Прочитать датчики линии (3 IR-сенсора)

  • 3 или SERVO → Повернуть серво (сканирование 0°-180°)

  • 4 или LED → Переключить светодиод

  • HELP → Показать справку

  1/*
  2 * Проект 12: Bluetooth-модуль HM-10
  3 * Эксперимент 3: Интерактивное меню с реальными датчиками
  4 *
  5 * Меню команд:
  6 * 1 (DIST)  - прочитать расстояние (ультразвуковой датчик)
  7 * 2 (LINE)  - прочитать датчики линии (3 сенсора)
  8 * 3 (SERVO) - повернуть серво (сканирование 0-180°)
  9 * 4 (LED)   - переключить светодиод D13
 10 * HELP      - показать справку
 11 */
 12
 13#include <SoftwareSerial.h>
 14#include <AlashUltrasonic.h>              // Для RCWL-9610A
 15#include <Servo.h>                         // Для сервопривода
 16
 17// ==================== PINS ====================
 18const uint8_t BT_RX = 10;                  // Bluetooth RX
 19const uint8_t BT_TX = 11;                  // Bluetooth TX
 20const uint8_t LED_PIN = 13;                // Встроенный светодиод
 21
 22const uint8_t TRIG_PIN = 3;                // Ультразвуковой датчик Trig
 23const uint8_t ECHO_PIN = 7;                // Ультразвуковой датчик Echo
 24
 25const uint8_t LINE_LEFT = A0;              // Левый датчик линии
 26const uint8_t LINE_CENTER = A1;            // Центральный датчик линии
 27const uint8_t LINE_RIGHT = A2;             // Правый датчик линии
 28
 29const uint8_t SERVO_PIN = 9;               // Сервопривод
 30
 31// ==================== OBJECTS ====================
 32SoftwareSerial bluetooth(BT_RX, BT_TX);
 33AlashUltrasonic ultrasonic(TRIG_PIN, ECHO_PIN);
 34Servo servo;
 35
 36bool ledState = false;
 37
 38void setup() {
 39  Serial.begin(9600);
 40  bluetooth.begin(9600);
 41
 42  pinMode(LED_PIN, OUTPUT);
 43
 44  ultrasonic.begin();                      // Инициализация ультразвукового датчика
 45  servo.attach(SERVO_PIN);                 // Подключение сервопривода
 46  servo.write(90);                         // Начальная позиция 90°
 47
 48  Serial.println("🤖 Bluetooth Menu System Ready");
 49
 50  // Отправляем приветствие и меню
 51  sendMenu();
 52}
 53
 54void loop() {
 55  if (bluetooth.available()) {
 56    String cmd = bluetooth.readStringUntil('\n');
 57    cmd.trim();
 58    cmd.toUpperCase();
 59
 60    // Игнорируем служебные сообщения HM-10
 61    if (cmd.length() == 0 || cmd.indexOf("ERROR") >= 0) {
 62      return;
 63    }
 64
 65    Serial.print("📱 Command: ");
 66    Serial.println(cmd);
 67
 68    // ============ КОМАНДА 1: РАССТОЯНИЕ ============
 69    if (cmd == "1" || cmd == "DIST") {
 70      float distance = ultrasonic.getDistance();  // Реальное измерение!
 71
 72      bluetooth.print("📏 Расстояние: ");
 73      bluetooth.print(distance, 1);               // 1 знак после запятой
 74      bluetooth.println(" см");
 75
 76      Serial.print("Distance: ");
 77      Serial.print(distance);
 78      Serial.println(" cm");
 79
 80    // ============ КОМАНДА 2: ДАТЧИКИ ЛИНИИ ============
 81    } else if (cmd == "2" || cmd == "LINE") {
 82      int left = analogRead(LINE_LEFT);
 83      int center = analogRead(LINE_CENTER);
 84      int right = analogRead(LINE_RIGHT);
 85
 86      bluetooth.println("📊 Датчики линии:");
 87      bluetooth.print("   Левый: ");
 88      bluetooth.println(left);
 89      bluetooth.print("   Центр: ");
 90      bluetooth.println(center);
 91      bluetooth.print("   Правый: ");
 92      bluetooth.println(right);
 93
 94      Serial.print("Line sensors: L=");
 95      Serial.print(left);
 96      Serial.print(" C=");
 97      Serial.print(center);
 98      Serial.print(" R=");
 99      Serial.println(right);
100
101    // ============ КОМАНДА 3: СЕРВО ============
102    } else if (cmd == "3" || cmd == "SERVO") {
103      bluetooth.println("🔄 Сканирование серво 0°→180°...");
104
105      // Сканирование от 0 до 180 градусов
106      for (int angle = 0; angle <= 180; angle += 30) {
107        servo.write(angle);
108        delay(300);
109        bluetooth.print("   ");
110        bluetooth.print(angle);
111        bluetooth.println("°");
112      }
113
114      servo.write(90);                    // Вернуться в центр
115      bluetooth.println("✓ Серво вернулось в центр (90°)");
116
117      Serial.println("Servo scan completed");
118
119    // ============ КОМАНДА 4: СВЕТОДИОД ============
120    } else if (cmd == "4" || cmd == "LED") {
121      ledState = !ledState;               // Инверсия состояния
122      digitalWrite(LED_PIN, ledState);
123
124      bluetooth.print("💡 Светодиод: ");
125      bluetooth.println(ledState ? "ВКЛ" : "ВЫКЛ");
126
127      Serial.print("LED: ");
128      Serial.println(ledState ? "ON" : "OFF");
129
130    // ============ КОМАНДА HELP ============
131    } else if (cmd == "HELP") {
132      sendMenu();
133
134    // ============ НЕИЗВЕСТНАЯ КОМАНДА ============
135    } else {
136      bluetooth.println("❌ Неизвестная команда!");
137      bluetooth.println("Отправьте HELP для справки.");
138    }
139
140    // Пустая строка для удобства
141    bluetooth.println();
142  }
143}
144
145// ==================== ФУНКЦИЯ МЕНЮ ====================
146void sendMenu() {
147  bluetooth.println("==========================================");
148  bluetooth.println("  🤖 Робот Фобо - Меню датчиков");
149  bluetooth.println("==========================================");
150  bluetooth.println();
151  bluetooth.println("Команды:");
152  bluetooth.println("  [1] или [DIST]  - Расстояние");
153  bluetooth.println("  [2] или [LINE]  - Датчики линии");
154  bluetooth.println("  [3] или [SERVO] - Сканирование серво");
155  bluetooth.println("  [4] или [LED]   - Переключить LED");
156  bluetooth.println("  [HELP]          - Это меню");
157  bluetooth.println();
158  bluetooth.println("Отправьте команду:");
159
160  Serial.println("Menu sent to phone");
161}

Что нового:

  1. Строки 14-15: Подключаем библиотеки AlashUltrasonic и Servo

  2. Строки 17-30: Конфигурация всех пинов робота (датчики, серво, Bluetooth)

  3. Строки 33-35: Создание объектов для работы с датчиками

  4. Строки 44-46: Инициализация ультразвукового датчика и серво в setup()

  5. Строки 62-70: Команда 1 (DIST) — реальное измерение расстояния с RCWL-9610A

  6. Строки 73-90: Команда 2 (LINE) — чтение 3 аналоговых датчиков линии (A0, A1, A2)

  7. Строки 93-110: Команда 3 (SERVO) — сканирование серво от 0° до 180° с шагом 30°

  8. Строки 113-122: Команда 4 (LED) — переключение светодиода на D13

  9. Строка 101: servo.write(angle) — поворот серво на заданный угол

Пример работы:

==========================================
  🤖 Робот Фобо - Меню датчиков
==========================================

Команды:
  [1] или [DIST]  - Расстояние
  [2] или [LINE]  - Датчики линии
  [3] или [SERVO] - Сканирование серво
  [4] или [LED]   - Переключить LED
  [HELP]          - Это меню

Отправьте команду:

Вы: 1
Arduino: 📏 Расстояние: 23.5 см

Вы: LINE
Arduino: 📊 Датчики линии:
Arduino:    Левый: 892
Arduino:    Центр: 45
Arduino:    Правый: 901

Вы: SERVO
Arduino: 🔄 Сканирование серво 0°→180°...
Arduino:    0°
Arduino:    30°
Arduino:    60°
Arduino:    90°
Arduino:    120°
Arduino:    150°
Arduino:    180°
Arduino: ✓ Серво вернулось в центр (90°)

Вы: 4
Arduino: 💡 Светодиод: ВКЛ

Вы: LED
Arduino: 💡 Светодиод: ВЫКЛ
Интерактивное меню управления

Совет: Используйте макро-кнопки в Terminal Mode! Настройте M1=``1``, M2=``2``, M3=``3``, M4=``HELP`` для быстрого доступа к командам.

Поиск неисправностей

Проблема: HM-10 не мигает (светодиод не горит)

Возможные причины:

  1. Не подключено питание

    • Проверьте VCC → +5V и GND → GND на Sensor Shield

    • Убедитесь, что провода плотно сидят в разъёмах

  2. Перепутаны VCC и GND

    • ОПАСНО! Модуль может сгореть

    • Если модуль горячий → немедленно отключите питание

    • Проверьте полярность: VCC=красный → +, GND=чёрный → -

  3. Недостаточное напряжение

    • HM-10 требует минимум 3.6V

    • Если питание от батареи — проверьте заряд

    • Используйте USB для тестирования (стабильные 5V)

Проблема: Браузер не находит HM-10

Возможные причины:

  1. Неподдерживаемый браузер

    • Firefox не поддерживает Web Bluetooth API

    • Safari (Mac/iOS) не поддерживает Web Bluetooth API

    • ✅ Используйте Chrome, Edge или Opera

  2. HM-10 не включён

    • Светодиод должен мигать (быстро = не подключён)

    • Если не мигает → см. предыдущую проблему

  3. Bluetooth выключен на телефоне/компьютере

    • Настройки → Bluetooth → Включить

    • Убедитесь, что Bluetooth активен

  4. HM-10 уже подключён к другому устройству

    • Если светодиод горит постоянно → уже подключён

    • Отключите другие устройства

    • Выключите/включите питание HM-10 (перезагрузка)

  5. Android: не дано разрешение на геолокацию

    • ВАЖНО! Android требует разрешение Location для сканирования BLE

    • Настройки → Приложения → Chrome → Разрешения → Местоположение → Разрешить

    • Без этого устройства BLE не будут найдены!

Проблема: Подключение есть, но данные не приходят

Возможные причины:

  1. Перепутаны TX и RX

    • КРИТИЧНО! TX HM-10 → RX Arduino (D10), RX HM-10 ← TX Arduino (D11)

    • Попробуйте поменять местами провода на D10 и D11

  2. Неправильная скорость в коде

    • bluetooth.begin(9600); должна совпадать со скоростью HM-10

    • По умолчанию HM-10 использует 9600 бод (можно изменить через AT)

  3. Неправильные пины в коде

    • Убедитесь: HM-10 TXD → D10 (Signal), HM-10 RXD → D11 (Signal)

    • Проверьте код: SoftwareSerial bluetooth(10, 11);

Проблема: Получаю «крякозябры» вместо текста

Причина: Несовпадение скорости передачи (baud rate).

Решение:

  1. Проверьте код: bluetooth.begin(9600);

  2. Проверьте скорость HM-10 (по умолчанию 9600)

  3. Попробуйте другие скорости: 4800, 19200, 38400, 57600

Как узнать скорость HM-10:

  • Используйте программу-мост (см. раздел «AT-команды»)

  • Отправьте команду AT+BAUD? через Serial Monitor

  • Ответ: OK+Get:0 (0=9600, 1=19200, 2=38400, и т.д.)

Проблема: Мусорные данные до подключения

Симптомы: В Serial Monitor появляются «крякозябры» (ERROR, �횘, &Mj) до подключения телефона. После подключения всё работает нормально.

Причина: HM-10 отправляет служебные сообщения в режиме ожидания подключения.

Решение: Добавьте фильтрацию в код (уже есть во всех примерах):

void loop() {
  if (bluetooth.available()) {
    String cmd = bluetooth.readStringUntil('\n');
    cmd.trim();

    // Игнорируем служебные сообщения HM-10
    if (cmd.length() == 0 || cmd.indexOf("ERROR") >= 0) {
      return;  // Пропускаем пустые и служебные сообщения
    }

    // Дальше обычная обработка команд...
  }
}

Эта проверка фильтрует:

  • Пустые сообщения (length() == 0)

  • Сообщения со словом «ERROR» (служебные)

После подключения телефона служебные сообщения прекращаются автоматически.

Проблема: iOS Safari не работает

Причина: Apple не поддерживает Web Bluetooth API в Safari по соображениям безопасности.

Решение:

Вариант 1: Используйте Bluefy Browser (бесплатно в App Store)

Bluefy Browser в App Store

Вариант 2: Используйте альтернативные BLE Terminal приложения для iOS:

  • LightBlue (бесплатно) — универсальный BLE-сканер

  • BLE Terminal HM-10 (бесплатно) — специально для HM-10

  • BLESerial HM-10 (бесплатно) — Serial monitor для BLE

Вариант 3: Используйте компьютер или Android-устройство

Расширенная информация

Bluetooth Classic vs BLE

Существует два типа Bluetooth:

Характеристика

Bluetooth Classic (HC-05)

Bluetooth Low Energy (HM-10)

Энергопотребление

30-40 мА

8-15 мА

Дальность

10 метров

100 метров

Скорость

До 3 Мбит/с

48 Кбит/с

Совместимость

Android, ПК (НЕ iOS!)

✅ Android, iOS, ПК, Web

Профиль

SPP (Serial Port)

GATT (Generic Attribute)

Web Bluetooth

❌ Не поддерживается

✅ Полная поддержка

Стоимость

$2-4

$3-6

Вывод: HM-10 (BLE) — лучший выбор для Arduino-проектов! Работает с Web Bluetooth API, меньше потребляет энергии, больше дальность!

Дальность передачи

Факторы, влияющие на дальность:

  • Класс модуля:

    • Class 1: до 100 метров (промышленные модули)

    • Class 2: до 10 метров (HM-10 — это Class 2)

    • Class 3: до 1 метра (редко используется)

  • Преграды: стены, мебель, тело человека ослабляют сигнал

  • Частота 2.4 ГГц: совпадает с Wi-Fi (возможны помехи)

  • Ориентация антенны: на HM-10 антенна встроенная (не направленная)

На практике с HM-10 можно рассчитывать на 5-8 метров в помещении.

AT-команды HM-10 (дополнительно)

HM-10 можно настраивать через AT-команды — специальные текстовые команды для изменения параметров модуля.

Примечание

Для базового использования AT-команды не требуются! Настройки по умолчанию (имя BT05, скорость 9600) подходят для всех экспериментов в этом проекте.

Когда нужны AT-команды?

  • Изменить имя модуля (например, на «Phobo» для робота)

  • Изменить скорость передачи данных

  • Узнать MAC-адрес модуля

Программа-мост для AT-команд

Чтобы отправлять AT-команды на HM-10, нужна специальная программа-мост между Serial Monitor и модулем:

 1/*
 2 * Программа-мост для настройки HM-10 через AT-команды
 3 *
 4 * Подключение такое же: D10=RX, D11=TX
 5 *
 6 * Использование:
 7 * 1. Загрузите эту программу на Arduino
 8 * 2. Откройте Serial Monitor (9600 baud)
 9 * 3. Установите "Both NL & CR" (новая строка и возврат каретки)
10 * 4. Введите AT-команду и нажмите Enter
11 * 5. Ответ от HM-10 появится в Serial Monitor
12 */
13
14#include <SoftwareSerial.h>
15
16// RX, TX для HM-10
17SoftwareSerial BTSerial(10, 11);
18
19void setup() {
20  Serial.begin(9600);
21  BTSerial.begin(9600);  // Стандартная скорость HM-10
22
23  Serial.println("========================================");
24  Serial.println("  HM-10 AT Command Bridge");
25  Serial.println("========================================");
26  Serial.println("HM-10 готов к настройке");
27  Serial.println("Введите AT команды:");
28  Serial.println("Пример: AT+NAME=Phobo");
29  Serial.println();
30}
31
32void loop() {
33  // Передача данных от HM-10 к Serial Monitor
34  if (BTSerial.available()) {
35    Serial.write(BTSerial.read());
36  }
37
38  // Передача данных от Serial Monitor к HM-10
39  if (Serial.available()) {
40    BTSerial.write(Serial.read());
41  }
42}

Как использовать:

  1. Загрузите программу-мост на Arduino

  2. Откройте Serial Monitor (9600 baud)

  3. Важно: Убедитесь, что в Serial Monitor установлено «Both NL & CR» (новая строка и возврат каретки)

  4. Введите команду, например: AT и нажмите Enter

  5. HM-10 ответит: OK

Пример: изменение имени на «Phobo»

Шаг 1: Узнайте текущее имя:

Вы вводите: AT+NAME
HM-10 отвечает: OK+NAME:BT05

Шаг 2: Измените имя на «Phobo»:

Вы вводите: AT+NAME=Phobo
HM-10 отвечает: OK+Set:Phobo

Шаг 3: Перезагрузите модуль (выключите и включите питание Arduino)

Шаг 4: Проверьте новое имя:

Вы вводите: AT+NAME
HM-10 отвечает: OK+NAME:Phobo

Теперь при подключении через BLE Controller модуль будет отображаться как «Phobo»! 🤖

Полный список AT-команд

═══════════════════════════════════════════════════════════
ОСНОВНЫЕ КОМАНДЫ
═══════════════════════════════════════════════════════════
AT                    Проверка связи (ответ: OK)
AT+RESET              Перезагрузка модуля
AT+VERSION            Узнать версию прошивки
AT+ADDR               Узнать MAC-адрес модуля
AT+DEFAULT            Сброс к заводским настройкам
AT+RENEW              Сброс к заводским настройкам (альт.)

═══════════════════════════════════════════════════════════
НАСТРОЙКИ BLUETOOTH
═══════════════════════════════════════════════════════════
AT+NAME               Узнать имя модуля
AT+NAME=<name>        Изменить имя (макс. 12 символов)
                      Пример: AT+NAME=Phobo

AT+BAUD               Узнать скорость передачи
AT+BAUD=<n>           Изменить скорость:
                      0=9600, 1=19200, 2=38400, 3=57600,
                      4=115200, 5=4800, 6=2400, 7=1200, 8=230400
                      Пример: AT+BAUD=0 (9600)

AT+PARI?              Узнать настройки чётности
AT+PARI=<n>           0=None, 1=Odd, 2=Even

AT+STOP               Узнать стоп-биты
AT+STOP=<n>           0=1 bit, 1=2 bits

═══════════════════════════════════════════════════════════
РЕЖИМ И СОСТОЯНИЕ
═══════════════════════════════════════════════════════════
AT+ROLE               Узнать роль модуля
AT+ROLE=<n>           0=Slave (подчинённый), 1=Master (ведущий)
                      Обычно используется 0 (Slave)

AT+STATE              Узнать текущее состояние
                      Возможные ответы:
                      OK+LOST   - не подключён
                      OK+CONN   - подключён

AT+IMME?              Режим запуска
AT+IMME=<n>           0=автоматически начинает работу
                      1=ждёт команду AT+START

AT+START              Начать работу (если IMME=1)

═══════════════════════════════════════════════════════════
ЭНЕРГОСБЕРЕЖЕНИЕ
═══════════════════════════════════════════════════════════
AT+PWRM?              Узнать режим энергосбережения
AT+PWRM=<n>           0=обычный, 1=низкое энергопотребление

AT+POWE?              Узнать мощность передатчика
AT+POWE=<n>           0=-23dBm, 1=-6dBm, 2=0dBm, 3=+6dBm
                      Больше мощность = больше дальность,
                      но больше энергопотребление

AT+SLEEP              Перевести в режим сна

═══════════════════════════════════════════════════════════
ДОПОЛНИТЕЛЬНО (для Master режима)
═══════════════════════════════════════════════════════════
AT+INQ                Поиск Slave-устройств поблизости (M)
AT+SHOW               Показать найденные устройства (M)
AT+CONN=<n>           Подключиться к устройству по индексу (M)

AT+UUID?              Узнать SERVICE UUID (M)
AT+UUID=<uuid>        Изменить SERVICE UUID (M)

AT+CHAR?              Узнать CHARACTERISTIC UUID (M)
AT+CHAR=<uuid>        Изменить CHARACTERISTIC UUID (M)

═══════════════════════════════════════════════════════════
(M) = Команда работает только в Master режиме (ROLE=1)

Предупреждение

Осторожно с изменением настроек!

  • Если измените скорость (BAUD), нужно изменить BTSerial.begin() в коде!

  • Если измените ROLE на Master, модуль перестанет работать как Slave!

  • Если забыли настройки — используйте AT+DEFAULT для сброса к заводским

Рекомендуемые настройки для робота Фобо

Рекомендуем изменить только имя модуля для удобства:

AT+NAME=Phobo       → Легко найти среди других BLE устройств
AT+NAME             → Проверка: OK+NAME:Phobo

Все остальные параметры оставьте по умолчанию:

  • Скорость: 9600 бод (AT+BAUD=0)

  • Роль: Slave (AT+ROLE=0)

  • Мощность: 0 dBm (AT+POWE=2) — баланс дальности и энергопотребления

Энергопотребление HM-10

Типовые параметры:

  • Режим передачи: 8 мА при 5V

  • Режим ожидания (подключён): 2 мА

  • Режим сна: 0.03 мА (30 мкА)

Для робота Фобо HM-10 будет потреблять ~8 мА при активной связи — это приемлемо (светодиод потребляет 20 мА для сравнения).

Что дальше?

Поздравляем! Вы изучили модуль Bluetooth HM-10 и веб-приложение BLE Controller — современный способ управления роботом прямо из браузера! 🎉

Что мы узнали:

✅ Как работает Bluetooth Low Energy (BLE) и UART через BLE

✅ Как подключить HM-10 к Arduino через SoftwareSerial

✅ Как отправлять и принимать текстовые команды

✅ Как управлять Arduino через веб-приложение BLE Controller

✅ Как создавать интерактивное меню

✅ Что такое Web Bluetooth API и как он работает

Сравнение способов управления:

Метод

Преимущества

Недостатки

ИК-пульт

Быстро, не нужен телефон

Нужно целиться, не видим данные

Bluetooth

Управление из кармана, видим датчики

Нужен смартфон, медленнее ИК

В следующих проектах:

  • Проект 13: Управление роботом через Bluetooth — применяем HM-10 для ручного управления моторами с телефона! Используем режим RC Car (геймпад) вместо Terminal.

  • Проект 14: Мастер-режим — полная интеграция всех автономных режимов с Bluetooth-управлением!

О BLE Controller:

В Проекте 12 мы использовали Terminal Mode для изучения основ Bluetooth-коммуникации.

В Проектах 13-14 мы переключимся на RC Car Mode — режим с геймпадом (D-pad для движения, кнопки для режимов).

Идеи для экспериментов:

  1. Добавьте шифрование команд (простой XOR или Base64)

  2. Реализуйте двунаправленную телеметрию (датчики → телефон каждую секунду)

  3. Создайте голосовое управление через Google Assistant → Bluetooth

  4. Изучите режим Joystick в BLE Controller (аналоговое управление)

До встречи в Проекте 13 — управление роботом Фобо через Bluetooth с геймпадом! 🤖📱