Проект 13: Управление роботом Фобо через Bluetooth

Управление роботом Фобо через 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

W / w

Вперёд (нажата/отпущена)

S

S / s

Назад (нажата/отпущена)

A

A / a

Влево (нажата/отпущена)

D

D / d

Вправо (нажата/отпущена)

▲ (стрелка вверх)

F / f

Вперёд (нажата/отпущена)

▼ (стрелка вниз)

B / b

Назад (нажата/отпущена)

◄ (стрелка влево)

L / l

Влево (нажата/отпущена)

► (стрелка вправо)

R / r

Вправо (нажата/отпущена)

Клавиши управления на клавиатуре ноутбука

Вы можете управлять роботом прямо с клавиатуры компьютера: используйте клавиши WASD, стрелки (↑↓←→), или цифры 1-9 для дополнительных функций.

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

  1. Палец нажимает кнопку W (или стрелку вверх ▲) в браузере

  2. BLE Controller отправляет 'W' через Bluetooth

  3. HM-10 принимает и передаёт на Arduino (UART)

  4. Arduino читает 'W' через bluetooth.read()

  5. Вызывается moveForward() → моторы крутятся

  6. Палец отпускает кнопку → отправляется '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 (🚗 Машина)

Выбор режима RC Car

Шаг 4: Подключитесь к HM-10 (процесс как в Проекте 12)

Примечание

Подключение: Процесс подключения подробно описан в Проекте 12. Нажмите на красную точку Bluetooth → выберите BT05 → дождитесь зелёной точки.

Интерфейс RC Car Mode

Интерфейс RC Car Mode

Элементы управления:

  1. Клавиши WASD (слева): - W — вперёд (W при нажатии, w при отпускании) - A — влево (A / a) - S — назад (S / s) - D — вправо (D / d)

  2. Стрелки (справа): - ▲ — вперёд (F / f) - ◄ — влево (L / l) - ▼ — назад (B / b) - ► — вправо (R / r)

  3. Дополнительные кнопки (центр): - 9 настраиваемых кнопок (1-9, !, @, #…) - Не используются в Проекте 13

  4. Статус 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}

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

Загрузка программы

  1. Подключите Arduino к компьютеру (USB)

  2. Важно: Отключите батареи перед загрузкой!

  3. Выберите Arduino Uno и правильный Порт

  4. Нажмите Загрузить (Ctrl+U)

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

Проверка Serial Monitor

Вы должны увидеть:

╔══════════════════════════════╗
║  PHOBO - Bluetooth Control  ║
╚══════════════════════════════╝
Подключитесь через BLE Controller

Первый запуск

Тест 1: Подключение

  1. Отключите USB, вставьте батареи

  2. Откройте BLE Controller в браузере

  3. Выберите режим RC Car

  4. Подключитесь к BT05

  5. Проверьте: точка стала зелёной, HM-10 перестал мигать

Тест 2: Управление в воздухе

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

Первый тест — с поднятым роботом (колёса в воздухе)!

  1. Поднимите робота

  2. Нажмите W (или стрелку вверх ▲)

  3. Проверьте: оба колеса крутятся вперёд

  4. Отпустите кнопку

  5. Проверьте: колёса остановились

Тест 3: На полу

  1. Поставьте робота на пол (свободное пространство 2x2м)

  2. Попробуйте все направления: - 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 — финальной интеграции! 🤖