Bluetooth-робот с избеганием препятствий: умное управление со смартфона
Компоненты и материалы
| Arduino Nano R3 | ×1 |
| Драйвер двигателей L298N (Dual H-Bridge) | ×1 |
| Ультразвуковой датчик HC-SR04 | ×1 |
| Bluetooth-модуль HC-05 | ×1 |
| RGB-светодиод (общий анод) | ×1 |
| Logic Level Converter (двунаправленный) | ×1 |
| Резистор 330 Ом | ×1 |
| Макетная плата | ×1 |
| Источник питания 5V/3.3V для макетной платы | ×1 |
| DC моторы 12V с редуктором | ×2 |
| Перемычки (папа-мама) | ×1 набор |
Приложения
- Arduino IDE
- Arduino BlueControl (Android, Play Store)
О проекте
Робот на двухколёсной платформе с управлением через Android-приложение по Bluetooth. Реализовано автоматическое избегание препятствий ультразвуковым датчиком при движении вперёд. Проект создан в период локдауна COVID-19.
Архитектура
- Arduino Nano — центральный контроллер.
- HC-05 — приём команд от приложения BlueControl (Serial, 9600 бод). TX/RX через Logic Level Converter (3.3V ↔ 5V).
- L298N — управление двумя моторами (ENA/ENB — PWM скорость, IN1–IN4 — направление).
- HC-SR04 — измерение расстояния впереди (Trig→D6, Echo→D7).
- RGB LED — индикация режима: зелёный = вперёд, красный = стоп/препятствие, синий = назад.
Управление через приложение
Приложение Arduino BlueControl отправляет цифровые коды команд:
| Код | Действие |
|---|---|
| 1 | Вперёд (с авто-стопом при препятствии < 20 см) |
| 2 | Назад |
| 3 | Влево (поворот на месте) |
| 4 | Вправо (поворот на месте) |
| 5 | Стоп |
Алгоритм избегания препятствий
При команде «Вперёд» (case 1) в цикле вызывается dist(): измеряется расстояние. Если < 20 см — вызывается stoprobot(), RGB переключается на красный (стоп). Робот ждёт новой команды.
Сборка
- Установить Arduino Nano на макетную плату.
- Подключить L298N: моторы к OUT1–OUT4, ENA/ENB → D9/D10 (PWM), IN1–IN4 → D5/D4/D3/D2.
- HC-SR04: Trig→D6, Echo→D7.
- HC-05: TX→D12, RX→D13 через Logic Level Converter (SoftwareSerial).
- RGB LED: R→D8, G→A0, B→D11 (общий анод → +5V через 330 Ом на каждый канал).
- Питание: 12V на L298N (VIN), 5V от Breadboard Power Supply на Arduino и логику.
Код Arduino (полный скетч)
/* Bluetooth Controlled Obstacle Avoidance Robot
Prepared by: Alok Talukdar, Date: 09.05.2020 */
#include <SoftwareSerial.h>
#define IN1 5 #define IN2 4 #define IN3 3 #define IN4 2
#define ENA 9 #define ENB 10
#define redLED 8 #define greenLED A0 #define blueLED 11
const int trigPin = 6; const int echoPin = 7;
float duration, distance;
SoftwareSerial mySerial(12, 13); // RX, TX
String data; int btVal;
void setup() {
pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT);
mySerial.begin(9600);
pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT);
pinMode(ENA, OUTPUT); pinMode(ENB, OUTPUT);
pinMode(redLED, OUTPUT); pinMode(blueLED, OUTPUT); pinMode(greenLED, OUTPUT);
digitalWrite(IN1, LOW); digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW); digitalWrite(IN4, LOW);
analogWrite(redLED, 255); digitalWrite(blueLED, HIGH); digitalWrite(greenLED, HIGH); // RGB OFF (common anode)
}
void loop() {
while (mySerial.available()) { data = mySerial.readStringUntil('\n'); }
btVal = data.toInt();
switch (btVal) {
case 1: forward(); digitalWrite(greenLED, LOW); analogWrite(redLED, 255); digitalWrite(blueLED, HIGH); dist(); break;
case 2: reverse(); digitalWrite(greenLED, HIGH); analogWrite(redLED, 255); digitalWrite(blueLED, LOW); break;
case 3: left(); break;
case 4: right(); break;
case 5: stoprobot(); digitalWrite(greenLED, HIGH); analogWrite(redLED, 0); digitalWrite(blueLED, HIGH); break;
default: digitalWrite(greenLED, HIGH); analogWrite(redLED, 255); digitalWrite(blueLED, HIGH); break;
}
}
void forward() {
for (int i = 0; i <= 100; i++) {
analogWrite(ENA, i); analogWrite(ENB, i);
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
}
}
void reverse() {
for (int j = 0; j <= 100; j++) {
analogWrite(ENA, j); analogWrite(ENB, j);
digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
}
}
void left() {
analogWrite(ENA, 127); analogWrite(ENB, 0);
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH); digitalWrite(IN4, HIGH);
}
void right() {
analogWrite(ENA, 0); analogWrite(ENB, 127);
digitalWrite(IN1, HIGH); digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
}
void stoprobot() {
analogWrite(ENA, 0); analogWrite(ENB, 0);
digitalWrite(IN1, LOW); digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW); digitalWrite(IN4, LOW);
}
void dist() {
digitalWrite(trigPin, LOW); delayMicroseconds(2);
digitalWrite(trigPin, HIGH); delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration * 0.0343) / 2;
if (distance < 20) {
stoprobot();
digitalWrite(greenLED, HIGH); analogWrite(redLED, 0); digitalWrite(blueLED, HIGH);
}
delay(1000);
}
Перспективы развития
- Автономный режим навигации (SLAM, построение карты).
- Дополнительные датчики (IR, камера).
- Интеграция в системы автоматизации складов/производства.
Производственный процесс
- Визионный мобильный робот, избегающий препятствия, на Raspberry Pi
- Создание Bluetooth-робота на Raspberry Pi с аудио-обратной связью
- Создание интернет-управляемого видеostreaming-робота на Arduino и Raspberry Pi
- Жестово-управляемый робот на Raspberry Pi
- Создание WiFi-робота на Raspberry Pi и Android-смартфоне
- Построение робота с голосовым управлением на Windows 10 IoT Core на Raspberry Pi 2
- Построение Wi-Fi-управляемого робота на Raspberry Pi с Python — пошаговое руководство
- ROObockey: Робот для уличного хоккея с точной прицельной системой
- Система избегания препятствий с ИИ (Q-learning) на Arduino и ультразвуковых датчиках
- Голосовой робот на Arduino Nano: Управление речью через Bluetooth