Проект 12: Bluetooth-модуль HM-10
Введение
Что мы будем делать?
В этом проекте мы научимся принимать команды со смартфона через 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:
Режим передачи данных — обычный режим, передаёт данные между Arduino и телефоном
Режим AT-команд — режим настройки (имя, пароль, скорость)
Мы будем использовать режим передачи данных (по умолчанию при включении).
Протокол UART через BLE
HM-10 использует UART через BLE — имитация обычного COM-порта через Bluetooth Low Energy.
Как это работает:
Arduino отправляет данные в
SoftwareSerial→ HM-10 TXHM-10 преобразует в BLE-пакеты и передаёт по воздуху
Браузер принимает пакеты через Web Bluetooth API и отображает в приложении
Обратно: браузер → 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: см. Проект 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 для управления роботом Фобо.
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: Установите Bluefy Browser (бесплатно) из App Store — это браузер с поддержкой Web Bluetooth
Вариант 2: Используйте другие BLE Terminal приложения (LightBlue, BLE Terminal HM-10)
Вариант 3: Используйте Android-устройство или компьютер
Открытие приложения
Шаг 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 (💻 Терминал).
Подключение к HM-10
Шаг 1: Включите робота Phobo
Включите питание (выключатель на батарейном отсеке)
Светодиод HM-10 должен мигать (режим ожидания подключения)
Шаг 2: Нажмите на кнопку Bluetooth
В приложении нажмите на красную точку (статус Bluetooth) в центре заголовка.
Появится диалог выбора устройства.
Шаг 3: Выберите устройство
В списке найдите устройство BT05 (или HMSoft, HM-10) и нажмите на него.
Примечание
Имя модуля: По умолчанию HM-10 называется BT05 или HMSoft. Это имя можно изменить через AT-команды (см. раздел «Расширенная информация»).
Шаг 4: Дождитесь подключения
Статус изменится с красной точки (отключен) на зелёную точку (подключен)
Светодиод HM-10 на роботе перестанет мигать и будет постоянно гореть
В окне терминала появится сообщение «Connected to BT05»
Готово! Теперь можно отправлять команды роботу.
Что вы увидите
Интерфейс Terminal Mode:
Верхняя часть: Статус подключения (зелёная точка), кнопка Settings (⚙️)
Центральная часть: История сообщений - Синие сообщения — полученные от Arduino - Зелёные сообщения — отправленные с телефона - Временные метки у каждого сообщения
Нижняя часть: - Текстовое поле для ввода команд - Кнопка Send для отправки - 6 макро-кнопок (M1-M6) - Кнопка Clear для очистки истории
В Arduino IDE Serial Monitor вы также увидите все полученные команды — это полезно для отладки и проверки корректности передачи данных:
Код программы
Эксперимент 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}
Как работает код:
Строка 15: Подключаем библиотеку
SoftwareSerialдля создания виртуального COM-портаСтроки 18-19: Определяем пины RX=10 (принимает от HM-10), TX=11 (передаёт в HM-10)
Строка 21: Создаём объект
bluetoothтипаSoftwareSerialСтрока 24: Инициализируем Serial Monitor (9600 бод)
Строка 25: Инициализируем Bluetooth (9600 бод — стандартная скорость HM-10)
Строки 38-39: Отправляем приветствие на телефон
Строка 45:
bluetooth.available()— проверяет, есть ли данные от телефонаСтрока 46:
readStringUntil('\n')— читает до символа новой строки (Enter)Строка 47:
trim()— убирает пробелы и переводы строк по краямСтроки 49-51: Фильтрация служебных сообщений — HM-10 отправляет «мусор» до подключения (
ERROR,�횘), игнорируем ихСтроки 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 и нажмите 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}
Что нового:
Строка 15: Используем встроенный светодиод на пине 13
Строка 19: Переменная
ledStateхранит текущее состояние (вкл/выкл)Строка 43:
toUpperCase()— преобразует команду в заглавные буквы (чтобыon=ON)Строки 46-67: Обработка трёх команд: ON, OFF, STATUS
Строки 64-67: Если команда неизвестна → выводим список доступных команд
Пример работы:
Вы: ON
Arduino: ✓ Светодиод ВКЛЮЧЕН
Вы: STATUS
Arduino: Состояние: ВКЛЮЧЕН
Вы: OFF
Arduino: ✓ Светодиод ВЫКЛЮЧЕН
Вы: HELLO
Arduino: ❌ Неизвестная команда!
Arduino: Доступные: ON, OFF, STATUS
Эксперимент 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}
Что нового:
Строки 14-15: Подключаем библиотеки
AlashUltrasonicиServoСтроки 17-30: Конфигурация всех пинов робота (датчики, серво, Bluetooth)
Строки 33-35: Создание объектов для работы с датчиками
Строки 44-46: Инициализация ультразвукового датчика и серво в
setup()Строки 62-70: Команда
1(DIST) — реальное измерение расстояния с RCWL-9610AСтроки 73-90: Команда
2(LINE) — чтение 3 аналоговых датчиков линии (A0, A1, A2)Строки 93-110: Команда
3(SERVO) — сканирование серво от 0° до 180° с шагом 30°Строки 113-122: Команда
4(LED) — переключение светодиода на D13Строка 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 не мигает (светодиод не горит)
Возможные причины:
Не подключено питание
Проверьте VCC → +5V и GND → GND на Sensor Shield
Убедитесь, что провода плотно сидят в разъёмах
Перепутаны VCC и GND
ОПАСНО! Модуль может сгореть
Если модуль горячий → немедленно отключите питание
Проверьте полярность: VCC=красный → +, GND=чёрный → -
Недостаточное напряжение
HM-10 требует минимум 3.6V
Если питание от батареи — проверьте заряд
Используйте USB для тестирования (стабильные 5V)
Проблема: Браузер не находит HM-10
Возможные причины:
Неподдерживаемый браузер
❌ Firefox не поддерживает Web Bluetooth API
❌ Safari (Mac/iOS) не поддерживает Web Bluetooth API
✅ Используйте Chrome, Edge или Opera
HM-10 не включён
Светодиод должен мигать (быстро = не подключён)
Если не мигает → см. предыдущую проблему
Bluetooth выключен на телефоне/компьютере
Настройки → Bluetooth → Включить
Убедитесь, что Bluetooth активен
HM-10 уже подключён к другому устройству
Если светодиод горит постоянно → уже подключён
Отключите другие устройства
Выключите/включите питание HM-10 (перезагрузка)
Android: не дано разрешение на геолокацию
ВАЖНО! Android требует разрешение Location для сканирования BLE
Настройки → Приложения → Chrome → Разрешения → Местоположение → Разрешить
Без этого устройства BLE не будут найдены!
Проблема: Подключение есть, но данные не приходят
Возможные причины:
Перепутаны TX и RX
КРИТИЧНО! TX HM-10 → RX Arduino (D10), RX HM-10 ← TX Arduino (D11)
Попробуйте поменять местами провода на D10 и D11
Неправильная скорость в коде
bluetooth.begin(9600);должна совпадать со скоростью HM-10По умолчанию HM-10 использует 9600 бод (можно изменить через AT)
Неправильные пины в коде
Убедитесь: HM-10 TXD → D10 (Signal), HM-10 RXD → D11 (Signal)
Проверьте код:
SoftwareSerial bluetooth(10, 11);
Проблема: Получаю «крякозябры» вместо текста
Причина: Несовпадение скорости передачи (baud rate).
Решение:
Проверьте код:
bluetooth.begin(9600);Проверьте скорость HM-10 (по умолчанию 9600)
Попробуйте другие скорости: 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)
Это специальный браузер для iOS с поддержкой Web Bluetooth
Скачайте: https://apps.apple.com/app/bluefy-web-ble-browser/id1492822055
Откройте BLE Controller через Bluefy
Всё будет работать как на Android
Вариант 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}
Как использовать:
Загрузите программу-мост на Arduino
Откройте Serial Monitor (9600 baud)
Важно: Убедитесь, что в Serial Monitor установлено «Both NL & CR» (новая строка и возврат каретки)
Введите команду, например:
ATи нажмите EnterHM-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 для движения, кнопки для режимов).
Идеи для экспериментов:
Добавьте шифрование команд (простой XOR или Base64)
Реализуйте двунаправленную телеметрию (датчики → телефон каждую секунду)
Создайте голосовое управление через Google Assistant → Bluetooth
Изучите режим Joystick в BLE Controller (аналоговое управление)
До встречи в Проекте 13 — управление роботом Фобо через Bluetooth с геймпадом! 🤖📱