Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

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 набор

Приложения

О проекте

Робот на двухколёсной платформе с управлением через Android-приложение по Bluetooth. Реализовано автоматическое избегание препятствий ультразвуковым датчиком при движении вперёд. Проект создан в период локдауна COVID-19.

Архитектура

Управление через приложение

Приложение Arduino BlueControl отправляет цифровые коды команд:

КодДействие
1Вперёд (с авто-стопом при препятствии < 20 см)
2Назад
3Влево (поворот на месте)
4Вправо (поворот на месте)
5Стоп

Алгоритм избегания препятствий

При команде «Вперёд» (case 1) в цикле вызывается dist(): измеряется расстояние. Если < 20 см — вызывается stoprobot(), RGB переключается на красный (стоп). Робот ждёт новой команды.

Сборка

  1. Установить Arduino Nano на макетную плату.
  2. Подключить L298N: моторы к OUT1–OUT4, ENA/ENB → D9/D10 (PWM), IN1–IN4 → D5/D4/D3/D2.
  3. HC-SR04: Trig→D6, Echo→D7.
  4. HC-05: TX→D12, RX→D13 через Logic Level Converter (SoftwareSerial).
  5. RGB LED: R→D8, G→A0, B→D11 (общий анод → +5V через 330 Ом на каждый канал).
  6. Питание: 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);
}

Перспективы развития

Производственный процесс

  1. Визионный мобильный робот, избегающий препятствия, на Raspberry Pi
  2. Создание Bluetooth-робота на Raspberry Pi с аудио-обратной связью
  3. Создание интернет-управляемого видеostreaming-робота на Arduino и Raspberry Pi
  4. Жестово-управляемый робот на Raspberry Pi
  5. Создание WiFi-робота на Raspberry Pi и Android-смартфоне
  6. Построение робота с голосовым управлением на Windows 10 IoT Core на Raspberry Pi 2
  7. Построение Wi-Fi-управляемого робота на Raspberry Pi с Python — пошаговое руководство
  8. ROObockey: Робот для уличного хоккея с точной прицельной системой
  9. Система избегания препятствий с ИИ (Q-learning) на Arduino и ультразвуковых датчиках
  10. Голосовой робот на Arduino Nano: Управление речью через Bluetooth