Перейти к основному содержимому

Bluetooth-робот на Arduino Uno

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

Готовый двухколёсный Bluetooth-робот

Фото реальной сборки: fractaltech, Arduino Project Hub. Расположение плат может отличаться; соединения выполняйте по таблицам этой статьи.

Результат

Робот выполняет команды:

СимволДействие
Fвперёд
Bназад
Lповорот налево на месте
Rповорот направо на месте
Sостановка
0…9скорость от нулевой до максимальной

Если три секунды нет новой команды, робот останавливается сам.

Детали

ДетальКоличествоТочная конфигурация
Arduino Uno R31плата на ATmega328P
L298N1модуль с ENA, IN1…IN4 и ENB
HC-051плата-адаптер, обычно ZS-040
2WD-шасси1два TT-мотора 3–6 В, два колеса и шаровая опора
NiMH AA 1,2 В6одинаковые заряженные аккумуляторы
Держатель 6×AA с выключателем1даёт около 7,2 В
Понижающий модуль LM25961настроить на 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.

Сборка шасси

  1. Закрепите TT-моторы по бокам нижней пластины.
  2. Установите два колеса и шаровую опору.
  3. Закрепите держатель аккумуляторов снизу, чтобы центр тяжести был ниже.
  4. Установите сверху Arduino, L298N, LM2596 и макетную плату на диэлектрические стойки.
  5. Разместите HC-05 сверху, не закрывая антенну металлом.
  6. Уберите провода от колёс и валов и закрепите их стяжками.

Схема соединений

Моторы и L298N

ОткудаКуда
Arduino D5L298N ENA
Arduino D7L298N IN1
Arduino D8L298N IN2
Arduino D9L298N IN3
Arduino D10L298N IN4
Arduino D6L298N ENB
L298N OUT1 и OUT2левый мотор
L298N OUT3 и OUT4правый мотор

HC-05

ОткудаКуда
HC-05 TXDArduino 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.

  1. Установите Serial Bluetooth Terminal.
  2. Включите робота. В настройках Android найдите HC-05 и выполните сопряжение. Обычный PIN — 1234 или 0000.
  3. В приложении откройте Devices, выберите Bluetooth Classic и HC-05, затем нажмите Connect.
  4. Создайте макросы F, B, L, R, S, 3, 6 и 9. Каждый макрос должен отправлять один символ без перевода строки.
  5. Для непрерывного движения повторяйте команду раньше, чем сработает трёхсекундный тайм-аут.

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

  1. Поставьте робота на коробку, чтобы колёса не касались стола.
  2. Включите питание, отправьте 3, затем F и сразу S.
  3. Оба колеса должны вращаться вперёд. Если одно вращается назад, выключите питание и поменяйте местами два провода этого мотора.
  4. Проверьте B, L и R на малой скорости.
  5. Поставьте робота на свободный пол не менее 2×2 м и только затем увеличивайте скорость.

Диагностика

СимптомЧто проверить
Телефон не видит HC-055 В между VCC и GND, мигает ли светодиод модуля
Связь есть, моторы молчатсняты ли ENA и ENB, подключены ли D5 и D6, есть ли питание на клемме +12V L298N
Arduino перезагружается при стартенапряжение LM2596, заряд аккумуляторов, затяжку силовых клемм
Робот едет дугойтрение колёс, заряд аккумуляторов, различие моторов; при необходимости уменьшите мощность более быстрого мотора в функции drive
Команды не распознаютсяскорость 9600 бод, один символ в макросе, правильный порядок TXD и RXD

Практика

  1. Измерьте путь за три секунды на скоростях 3, 6 и 9. Для каждой скорости сделайте три попытки.
  2. Найдите максимальное расстояние устойчивой связи в открытой комнате и за одной стеной.
  3. Сравните безопасность и удобство тайм-аута 1000, 3000 и 5000 мс.

Проверьте себя

  • Почему моторы нельзя питать от вывода 5V Arduino?
  • Зачем всем модулям нужна общая земля?
  • Для чего нужен делитель перед RXD HC-05?
  • Что произойдёт после трёх секунд без команд?
  • Как изменить направление одного мотора без изменения кода?

Словарь статьи

  • Bluetooth Classic SPP — беспроводная передача, похожая для программы на последовательный порт.
  • UART — последовательный интерфейс с линиями TX и RX.
  • L298N — двухканальный драйвер двух DC-моторов.
  • PWM — быстрое включение и выключение питания для изменения средней мощности.
  • Тайм-аут — максимальное время ожидания новой команды.

Связанные темы

Источники