Bluetooth-робот на Arduino Uno
В этом проекте вы соберёте двухколёсного робота и будете управлять им с Android-телефона. Телефон передаёт команды модулю HC-05, Arduino принимает их по UART, а L298N управляет двумя моторами.

Фото реальной сборки: fractaltech, Arduino Project Hub. Расположение плат может отличаться; соединения выполняйте по таблицам этой статьи.
Результат
Робот выполняет команды:
| Символ | Действие |
|---|---|
| F | вперёд |
| B | назад |
| L | поворот налево на месте |
| R | поворот направо на месте |
| S | остановка |
| 0…9 | скорость от нулевой до максимальной |
Если три секунды нет новой команды, робот останавливается сам.
Детали
| Деталь | Количество | Точная конфигурация |
|---|---|---|
| Arduino Uno R3 | 1 | плата на ATmega328P |
| L298N | 1 | модуль с ENA, IN1…IN4 и ENB |
| HC-05 | 1 | плата-адаптер, обычно ZS-040 |
| 2WD-шасси | 1 | два TT-мотора 3–6 В, два колеса и шаровая опора |
| NiMH AA 1,2 В | 6 | одинаковые заряженные аккумуляторы |
| Держатель 6×AA с выключателем | 1 | даёт около 7,2 В |
| Понижающий модуль LM2596 | 1 | настроить на 5,0 В |
| Резисторы 1 кОм и 2 кОм | по 1 | делитель для RXD модуля HC-05 |
| Макетная плата, провода Dupont, стяжки | 1 набор | для монтажа |
Нужны отвёртка, кусачки и мультиметр. Если провода не припаяны к моторам, понадобится помощь взрослого с паяльником.
Безопасное питание
Не используйте прямоугольную батарейку PP3 9 В: она плохо отдаёт ток двух моторов. Не подключайте моторы к выводу 5V Arduino.
На L298N снимите перемычки ENA, ENB и 5V-EN. Первые две линии будут получать PWM от Arduino, а логику драйвера запитает LM2596.
6×AA NiMH, 7,2 В
|
выключатель
+----> L298N +12V ----> два мотора
|
+----> LM2596 IN
|
5,0 В
+----> Arduino 5V
+----> L298N 5V
+----> HC-05 VCC
Минус батарей, LM2596 OUT-, Arduino GND,
L298N GND и HC-05 GND соединены вместе.
До подключения Arduino подайте питание только на LM2596. Измерьте напряжение между OUT+ и OUT- и подстроечником установите 5,0 В.
При загрузке программы выключайте батарейное питание. Не питайте Arduino одновременно от USB и через вывод 5V.
Сборка шасси
- Закрепите TT-моторы по бокам нижней пластины.
- Установите два колеса и шаровую опору.
- Закрепите держатель аккумуляторов снизу, чтобы центр тяжести был ниже.
- Установите сверху Arduino, L298N, LM2596 и макетную плату на диэлектрические стойки.
- Разместите HC-05 сверху, не закрывая антенну металлом.
- Уберите провода от колёс и валов и закрепите их стяжками.
Схема соединений
Моторы и L298N
| Откуда | Куда |
|---|---|
| Arduino D5 | L298N ENA |
| Arduino D7 | L298N IN1 |
| Arduino D8 | L298N IN2 |
| Arduino D9 | L298N IN3 |
| Arduino D10 | L298N IN4 |
| Arduino D6 | L298N ENB |
| L298N OUT1 и OUT2 | левый мотор |
| L298N OUT3 и OUT4 | правый мотор |
HC-05
| Откуда | Куда |
|---|---|
| HC-05 TXD | Arduino D2 |
| Arduino D3 | резистор 1 кОм |
| второй вывод 1 кОм | HC-05 RXD и первый вывод 2 кОм |
| второй вывод 2 кОм | GND |
| HC-05 VCC | стабилизированные 5 В |
| HC-05 GND | общая земля |
Делитель уменьшает пяти-вольтовый сигнал Arduino примерно до 3,3 В. Выводы KEY/EN и STATE не подключайте.
Программа
Дополнительные библиотеки не нужны: SoftwareSerial входит в ядро Arduino AVR. Выберите в Arduino IDE плату Arduino Uno и загрузите скетч при выключенном батарейном питании.
#include <SoftwareSerial.h>
const byte BT_RX = 2;
const byte BT_TX = 3;
SoftwareSerial bluetooth(BT_RX, BT_TX);
const byte EN_LEFT = 5;
const byte EN_RIGHT = 6;
const byte IN1 = 7;
const byte IN2 = 8;
const byte IN3 = 9;
const byte IN4 = 10;
int driveSpeed = 180;
bool moving = false;
unsigned long lastCommandAt = 0;
const unsigned long TIMEOUT_MS = 3000;
void setMotor(byte pin1, byte pin2, byte enablePin, int power) {
power = constrain(power, -255, 255);
if (power > 0) {
digitalWrite(pin1, HIGH);
digitalWrite(pin2, LOW);
} else if (power < 0) {
digitalWrite(pin1, LOW);
digitalWrite(pin2, HIGH);
} else {
digitalWrite(pin1, LOW);
digitalWrite(pin2, LOW);
}
analogWrite(enablePin, abs(power));
}
void drive(int leftPower, int rightPower) {
setMotor(IN1, IN2, EN_LEFT, leftPower);
setMotor(IN3, IN4, EN_RIGHT, rightPower);
moving = leftPower != 0 || rightPower != 0;
}
void executeCommand(char command) {
if (command >= '0' && command <= '9') {
driveSpeed = map(command - '0', 0, 9, 0, 255);
bluetooth.print("Speed: ");
bluetooth.println(driveSpeed);
lastCommandAt = millis();
return;
}
switch (command) {
case 'F': drive( driveSpeed, driveSpeed); break;
case 'B': drive(-driveSpeed, -driveSpeed); break;
case 'L': drive(-driveSpeed, driveSpeed); break;
case 'R': drive( driveSpeed, -driveSpeed); break;
case 'S': drive(0, 0); break;
default: return;
}
lastCommandAt = millis();
}
void setup() {
pinMode(EN_LEFT, OUTPUT);
pinMode(EN_RIGHT, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
drive(0, 0);
Serial.begin(9600);
bluetooth.begin(9600);
Serial.println("Bluetooth robot ready");
}
void loop() {
while (bluetooth.available() > 0) {
char command = bluetooth.read();
if (command >= 'a' && command <= 'z') {
command = command - 'a' + 'A';
}
executeCommand(command);
}
if (moving && millis() - lastCommandAt > TIMEOUT_MS) {
drive(0, 0);
bluetooth.println("STOP: timeout");
}
}
Настройка телефона
HC-05 использует Bluetooth Classic SPP, поэтому эта инструкция рассчитана на Android.
- Установите Serial Bluetooth Terminal.
- Включите робота. В настройках Android найдите HC-05 и выполните сопряжение. Обычный PIN — 1234 или 0000.
- В приложении откройте Devices, выберите Bluetooth Classic и HC-05, затем нажмите Connect.
- Создайте макросы F, B, L, R, S, 3, 6 и 9. Каждый макрос должен отправлять один символ без перевода строки.
- Для непрерывного движения повторяйте команду раньше, чем сработает трёхсекундный тайм-аут.
Первый запуск
- Поставьте робота на коробку, чтобы колёса не касались стола.
- Включите питание, отправьте 3, затем F и сразу S.
- Оба колеса должны вращаться вперёд. Если одно вращается назад, выключите питание и поменяйте местами два провода этого мотора.
- Проверьте B, L и R на малой скорости.
- Поставьте робота на свободный пол не менее 2×2 м и только затем увеличивайте скорость.
Диагностика
| Симптом | Что проверить |
|---|---|
| Телефон не видит HC-05 | 5 В между VCC и GND, мигает ли светодиод модуля |
| Связь есть, моторы молчат | сняты ли ENA и ENB, подключены ли D5 и D6, есть ли питание на клемме +12V L298N |
| Arduino перезагружается при старте | напряжение LM2596, заряд аккумуляторов, затяжку силовых клемм |
| Робот едет дугой | трение колёс, заряд аккумуляторов, различие моторов; при необходимости уменьшите мощность более быстрого мотора в функции drive |
| Команды не распознаются | скорость 9600 бод, один символ в макросе, правильный порядок TXD и RXD |
Практика
- Измерьте путь за три секунды на скоростях 3, 6 и 9. Для каждой скорости сделайте три попытки.
- Найдите максимальное расстояние устойчивой связи в открытой комнате и за одной стеной.
- Сравните безопасность и удобство тайм-аута 1000, 3000 и 5000 мс.
Проверьте себя
- Почему моторы нельзя питать от вывода 5V Arduino?
- Зачем всем модулям нужна общая земля?
- Для чего нужен делитель перед RXD HC-05?
- Что произойдёт после трёх секунд без команд?
- Как изменить направление одного мотора без изменения кода?
Словарь статьи
- Bluetooth Classic SPP — беспроводная передача, похожая для программы на последовательный порт.
- UART — последовательный интерфейс с линиями TX и RX.
- L298N — двухканальный драйвер двух DC-моторов.
- PWM — быстрое включение и выключение питания для изменения средней мощности.
- Тайм-аут — максимальное время ожидания новой команды.
Связанные темы
Источники
- Arduino Project Hub: Create Your Own 2WD Arduino Robot with Bluetooth Control — опубликованная сборка и фотография.
- Arduino Project Hub: DIY Bluetooth Controlled RC Car — дополнительный реальный пример Arduino Uno, HC-05 и L298N.
- Serial Bluetooth Terminal — приложение с поддержкой Bluetooth Classic SPP и HC-05.
- STMicroelectronics: L298 — техническое описание микросхемы драйвера.