Проект 13: Управление роботом Фобо через Bluetooth
Введение
В этом проекте объединим Bluetooth (Проект 12) и моторы (Проект 2) — научим робота Фобо слушаться команд со смартфона!
Что робот умеет:
▲ Двигаться вперёд (W или стрелка вверх)
▼ Двигаться назад (S или стрелка вниз)
◄ Поворачивать влево на месте (A или стрелка влево)
► Поворачивать вправо на месте (D или стрелка вправо)
⏹ Останавливаться (отпускание любой кнопки)
Используем:
BLE Controller (web app, режим RC Car) — геймпад в браузере
HM-10 (Bluetooth модуль) — связь с телефоном
AlashMotorControlLite (библиотека) — управление моторами
Компоненты
Робот Фобо в сборе (Проект 1)
HM-10 Bluetooth подключён к D10 (RX), D11 (TX)
L298N + 4 мотора подключены (IN1-IN4, ENA, ENB)
2x 18650 батареи заряженные
Смартфон/компьютер с Chrome/Edge/Opera
Примечание
Робот должен быть полностью собран (Проект 1), моторы работают (Проект 2), Bluetooth протестирован (Проект 12).
Теория
Протокол команд BLE Controller (RC Car Mode)
BLE Controller в режиме RC Car отправляет две команды для каждой кнопки:
- Заглавная буква при нажатии (например, F)
- строчная буква при отпускании (например, f)
Это позволяет роботу двигаться пока кнопка нажата, и останавливаться при отпускании.
Кнопка |
Команды |
Действие |
|---|---|---|
W |
|
Вперёд (нажата/отпущена) |
S |
|
Назад (нажата/отпущена) |
A |
|
Влево (нажата/отпущена) |
D |
|
Вправо (нажата/отпущена) |
▲ (стрелка вверх) |
|
Вперёд (нажата/отпущена) |
▼ (стрелка вниз) |
|
Назад (нажата/отпущена) |
◄ (стрелка влево) |
|
Влево (нажата/отпущена) |
► (стрелка вправо) |
|
Вправо (нажата/отпущена) |
Вы можете управлять роботом прямо с клавиатуры компьютера: используйте клавиши WASD, стрелки (↑↓←→), или цифры 1-9 для дополнительных функций.
Как это работает:
Палец нажимает кнопку W (или стрелку вверх ▲) в браузере
BLE Controller отправляет
'W'через BluetoothHM-10 принимает и передаёт на Arduino (UART)
Arduino читает
'W'черезbluetooth.read()Вызывается
moveForward()→ моторы крутятсяПалец отпускает кнопку → отправляется
'w'→stopMotors()
Функции движения
Используем AlashMotorControlLite (из Проекта 2):
// Вперёд: оба мотора +скорость
void moveForward() {
motorLeft.setSpeed(70);
motorRight.setSpeed(70);
}
// Назад: оба мотора -скорость
void moveBackward() {
motorLeft.setSpeed(-65);
motorRight.setSpeed(-65);
}
// Влево: левый назад, правый вперёд
void turnLeft() {
motorLeft.setSpeed(-80);
motorRight.setSpeed(80);
}
// Вправо: левый вперёд, правый назад
void turnRight() {
motorLeft.setSpeed(80);
motorRight.setSpeed(-80);
}
// Остановка
void stopMotors() {
motorLeft.setSpeed(0);
motorRight.setSpeed(0);
}
Важно: Скорости подобраны с учётом минимумов для Robot Phobo: - Forward/Backward: минимум 45 - Turn/Reverse: минимум 65
BLE Controller (RC Car Mode)
Открытие приложения
Шаг 1: Откройте браузер (Chrome/Edge/Opera)
Шаг 2: Перейдите по ссылке:
https://alash-electronics.github.io/bluetoothWebApp/
Шаг 3: Выберите режим RC Car (🚗 Машина)
Шаг 4: Подключитесь к HM-10 (процесс как в Проекте 12)
Примечание
Подключение: Процесс подключения подробно описан в Проекте 12. Нажмите на красную точку Bluetooth → выберите BT05 → дождитесь зелёной точки.
Интерфейс RC Car Mode
Элементы управления:
Клавиши WASD (слева): - W — вперёд (
Wпри нажатии,wпри отпускании) - A — влево (A/a) - S — назад (S/s) - D — вправо (D/d)Стрелки (справа): - ▲ — вперёд (
F/f) - ◄ — влево (L/l) - ▼ — назад (B/b) - ► — вправо (R/r)Дополнительные кнопки (центр): - 9 настраиваемых кнопок (1-9, !, @, #…) - Не используются в Проекте 13
Статус Bluetooth (вверху): - Зелёная точка = подключено - Красная точка = не подключено
Код программы
Полная программа
1/*
2 * Проект 13: Управление роботом Фобо через Bluetooth
3 * Приложение: BLE Controller (RC Car Mode)
4 *
5 * Команды (заглавные при нажатии, строчные при отпускании):
6 * WASD клавиши: W/w - вперёд, S/s - назад, A/a - влево, D/d - вправо
7 * Стрелки: F/f - вперёд, B/b - назад, L/l - влево, R/r - вправо
8 */
9
10#include <SoftwareSerial.h>
11#include <AlashMotorControlLite.h>
12
13// ==================== BLUETOOTH ====================
14const uint8_t BT_RX = 10; // HM-10 TX → Arduino RX
15const uint8_t BT_TX = 11; // HM-10 RX ← Arduino TX
16SoftwareSerial bluetooth(BT_RX, BT_TX);
17
18// ==================== MOTORS ====================
19// Левый мотор (Motor B)
20const uint8_t MOTOR_L_IN3 = 8;
21const uint8_t MOTOR_L_IN4 = 12;
22const uint8_t MOTOR_L_ENB = 6;
23
24// Правый мотор (Motor A)
25const uint8_t MOTOR_R_IN1 = 4;
26const uint8_t MOTOR_R_IN2 = 2;
27const uint8_t MOTOR_R_ENA = 5;
28
29AlashMotorControlLite motorLeft(DIR_DIR_PWM, MOTOR_L_IN3, MOTOR_L_IN4, MOTOR_L_ENB);
30AlashMotorControlLite motorRight(DIR_DIR_PWM, MOTOR_R_IN1, MOTOR_R_IN2, MOTOR_R_ENA);
31
32// Скорости (учитывают минимумы 45/65)
33const int SPEED_FORWARD = 70; // Минимум 45
34const int SPEED_BACKWARD = 65; // Минимум 65 для реверса
35const int SPEED_TURN = 80; // Минимум 65 для поворота
36
37// ==================== SETUP ====================
38void setup() {
39 Serial.begin(9600);
40 bluetooth.begin(9600);
41
42 Serial.println("╔══════════════════════════════╗");
43 Serial.println("║ PHOBO - Bluetooth Control ║");
44 Serial.println("╚══════════════════════════════╝");
45 Serial.println("Подключитесь через BLE Controller");
46 Serial.println();
47
48 bluetooth.println("Робот Фобо готов!");
49 bluetooth.println("Используйте D-pad для управления");
50
51 stopMotors();
52}
53
54// ==================== LOOP ====================
55void loop() {
56 if (bluetooth.available()) {
57 char cmd = bluetooth.read();
58
59 // Фильтр HM-10 service messages
60 if (cmd == '\n' || cmd == '\r' || cmd < 32 || cmd > 126) {
61 return; // Игнорируем служебные символы
62 }
63
64 processCommand(cmd);
65 }
66}
67
68// ==================== КОМАНДЫ ====================
69void processCommand(char cmd) {
70 switch (cmd) {
71 case 'W': // Forward pressed
72 moveForward();
73 Serial.println("▲ Вперёд");
74 break;
75
76 case 'w': // Forward released
77 stopMotors();
78 Serial.println("⏹ Стоп");
79 break;
80
81 case 'S': // Backward pressed
82 moveBackward();
83 Serial.println("▼ Назад");
84 break;
85
86 case 's': // Backward released
87 stopMotors();
88 Serial.println("⏹ Стоп");
89 break;
90
91 case 'A': // Left pressed
92 turnLeft();
93 Serial.println("◄ Влево");
94 break;
95
96 case 'a': // Left released
97 stopMotors();
98 Serial.println("⏹ Стоп");
99 break;
100
101 case 'D': // Right pressed
102 turnRight();
103 Serial.println("► Вправо");
104 break;
105
106 case 'd': // Right released
107 stopMotors();
108 Serial.println("⏹ Стоп");
109 break;
110
111 // Стрелки (arrows) - те же действия
112 case 'F': // Arrow Up pressed
113 moveForward();
114 Serial.println("▲ Вперёд");
115 break;
116
117 case 'f': // Arrow Up released
118 stopMotors();
119 Serial.println("⏹ Стоп");
120 break;
121
122 case 'B': // Arrow Down pressed
123 moveBackward();
124 Serial.println("▼ Назад");
125 break;
126
127 case 'b': // Arrow Down released
128 stopMotors();
129 Serial.println("⏹ Стоп");
130 break;
131
132 case 'L': // Arrow Left pressed
133 turnLeft();
134 Serial.println("◄ Влево");
135 break;
136
137 case 'l': // Arrow Left released
138 stopMotors();
139 Serial.println("⏹ Стоп");
140 break;
141
142 case 'R': // Arrow Right pressed
143 turnRight();
144 Serial.println("► Вправо");
145 break;
146
147 case 'r': // Arrow Right released
148 stopMotors();
149 Serial.println("⏹ Стоп");
150 break;
151
152 default:
153 // Игнорируем неизвестные команды
154 break;
155 }
156}
157
158// ==================== ДВИЖЕНИЕ ====================
159void moveForward() {
160 motorLeft.setSpeed(SPEED_FORWARD);
161 motorRight.setSpeed(SPEED_FORWARD);
162}
163
164void moveBackward() {
165 motorLeft.setSpeed(-SPEED_BACKWARD);
166 motorRight.setSpeed(-SPEED_BACKWARD);
167}
168
169void turnLeft() {
170 motorLeft.setSpeed(-SPEED_TURN);
171 motorRight.setSpeed(SPEED_TURN);
172}
173
174void turnRight() {
175 motorLeft.setSpeed(SPEED_TURN);
176 motorRight.setSpeed(-SPEED_TURN);
177}
178
179void stopMotors() {
180 motorLeft.setSpeed(0);
181 motorRight.setSpeed(0);
182}
Загрузка и тестирование
Загрузка программы
Подключите Arduino к компьютеру (USB)
Важно: Отключите батареи перед загрузкой!
Выберите Arduino Uno и правильный Порт
Нажмите Загрузить (Ctrl+U)
Откройте Serial Monitor (9600 baud)
Проверка Serial Monitor
Вы должны увидеть:
╔══════════════════════════════╗
║ PHOBO - Bluetooth Control ║
╚══════════════════════════════╝
Подключитесь через BLE Controller
Первый запуск
Тест 1: Подключение
Отключите USB, вставьте батареи
Откройте BLE Controller в браузере
Выберите режим RC Car
Подключитесь к BT05
Проверьте: точка стала зелёной, HM-10 перестал мигать
Тест 2: Управление в воздухе
Предупреждение
Первый тест — с поднятым роботом (колёса в воздухе)!
Поднимите робота
Нажмите W (или стрелку вверх ▲)
Проверьте: оба колеса крутятся вперёд
Отпустите кнопку
Проверьте: колёса остановились
Тест 3: На полу
Поставьте робота на пол (свободное пространство 2x2м)
Попробуйте все направления: - W (▲) → едет вперёд - S (▼) → едет назад - A (◄) → поворот на месте влево - D (►) → поворот на месте вправо - Отпускание → останавливается
Поиск неисправностей
Браузер не находит HM-10
Проверьте: - HM-10 мигает (есть питание) - Bluetooth включён на телефоне/компьютере - Используете Chrome/Edge/Opera (НЕ Firefox/Safari) - HM-10 не подключён к другому устройству
Для iOS: Используйте Bluefy Browser (бесплатно в App Store)
Робот не реагирует
Проверьте: - Подключение в BLE Controller (зелёная точка) - Serial Monitor показывает команды (▲ Вперёд) - Провода HM-10: TX→D10, RX→D11 - Батареи заряжены (>7V) - Провода моторов подключены к L298N
Робот едёт не в ту сторону
Если оба мотора назад вместо вперёд: - Поменяйте провода обоих моторов на L298N (+ ↔ -)
Если только один мотор неправильно: - Поменяйте провода этого мотора
Если левый/правый перепутаны: - Поменяйте местами левый и правый моторы на L298N
Мусорные символы в Serial Monitor
Это нормально до подключения телефона — HM-10 отправляет service messages.
Код фильтрует их автоматически (строки 247-250).
Что дальше?
Поздравляем! Робот Фобо слушается команд со смартфона! 🎉
Что освоили:
✅ Протокол BLE Controller (WASD + стрелки)
✅ Управление роботом через браузер
✅ Фильтрация HM-10 service messages
✅ Ручное управление моторами по Bluetooth
Следующий шаг:
Проект 14: Мастер-режим — объединяем ВСЕ автономные режимы (линия, препятствия, рука) + Bluetooth! Переключение между режимами дополнительными кнопками! 🚀
До встречи в Проекте 14 — финальной интеграции! 🤖