Pathfinder: набор робота-избегателя препятствий на Arduino UNO
Компоненты и материалы
- Arduino UNO — 1 шт. (основа)
- Ультразвуковой датчик HC-SR04 — 1 шт.
- Li-Ion аккумулятор 1000 мАч — 2 шт.
- RGB светодиод общий катод — 1 шт.
- Пьезо-зуммер — 1 шт.
- Резисторы 330 Ом — 3 шт. (для RGB)
- USB A-B кабель — 1 шт.
- Провода-перемычки — 20 шт.
Инструменты
- Arduino Materia 101 (3D-принтер для шасси)
- Отвёртка
Программное обеспечение
- Arduino IDE
- Autodesk Fusion 360 (моделирование шасси)
О проекте
Аннотация
Проект представляет собой автономного робота-исключателя препятствий на базе Arduino UNO и Adafruit Motor Shield. Код написан в Arduino IDE. Ультразвуковой датчик на микросервоприводе сканирует пространство на 180° впереди. Робот оснащён магнитным зуммером и RGB-светодиодом для индикации режимов и контроля скорости двигателей в 4 сценариях. Технология применима для военных и гуманитарных задач при доработке системы обнаружения.
Мультимедиа
Алгоритм работы
Библиотеки: AFMotor.h (Adafruit Motor Shield), Servo.h.
Распиновка:
| Пин | Назначение |
|---|---|
| A0 | Buzzer (+) |
| A1 | Trig (HC-SR04) |
| A2 | Echo (HC-SR04) |
| A3 | RGB Blue |
| A4 | RGB Green |
| A5 | RGB Red |
Логика управления (4 зоны дистанции):
- < 30 см: Препятствие близко → Красный LED, Зуммер ВКЛ, скорость 100, разворот/объезд.
- 30–60 см: Препятствие близко → Синий LED, скорость 150, движение вперёд.
- 60–90 см: Препятствие далеко → Зелёный LED, скорость 200, движение вперёд.
- > 90 см: Путь свободен → Белый (RGB все), скорость 250 (макс), движение вперёд.
Сервопривод поворачивает сонар: вперёд (80°) → право (12°) → лево (160°) → выбор направления с большим расстоянием.
Полный код (Arduino)
#include <AFMotor.h>
#include <Servo.h>
#define BuzzPIN A0
#define TrigPIN A1
#define EchoPIN A2
#define LEDBPIN A3
#define LEDGPIN A4
#define LEDRPIN A5
#define DCMROFF 25 // Калибровка разницы моторов
AF_DCMotor M1(1, MOTOR12_64KHZ);
AF_DCMotor M2(2, MOTOR12_64KHZ);
Servo SER1;
int Search() {
float Duration = 0.0, CM = 0.0;
digitalWrite(TrigPIN, LOW); delayMicroseconds(2);
digitalWrite(TrigPIN, HIGH); delayMicroseconds(10);
digitalWrite(TrigPIN, LOW);
Duration = pulseIn(EchoPIN, HIGH);
CM = Duration / 58.8;
return (int)CM;
}
int RightDistance, LeftDistance;
float Distance = 0.00;
void setup() {
pinMode(BuzzPIN, OUTPUT);
pinMode(TrigPIN, OUTPUT);
pinMode(EchoPIN, INPUT);
pinMode(LEDBPIN, OUTPUT);
pinMode(LEDGPIN, OUTPUT);
pinMode(LEDRPIN, OUTPUT);
SER1.attach(10); // Серво на пине 10 Motor Shield
}
void loop() {
SER1.write(80); delay(100); // Вперёд
Distance = Search();
if (Distance < 30) {
digitalWrite(BuzzPIN, HIGH);
digitalWrite(LEDBPIN, LOW); digitalWrite(LEDGPIN, LOW); digitalWrite(LEDRPIN, HIGH);
M1.setSpeed(100); M2.setSpeed(100);
ChangePath();
}
else if (Distance >= 30 && Distance < 60) {
digitalWrite(BuzzPIN, LOW);
digitalWrite(LEDBPIN, HIGH); digitalWrite(LEDGPIN, LOW); digitalWrite(LEDRPIN, LOW);
M1.setSpeed(150); M2.setSpeed(150);
Forward();
}
else if (Distance >= 60 && Distance < 90) {
digitalWrite(BuzzPIN, LOW);
digitalWrite(LEDBPIN, LOW); digitalWrite(LEDGPIN, HIGH); digitalWrite(LEDRPIN, LOW);
M1.setSpeed(200); M2.setSpeed(200);
Forward();
}
else {
digitalWrite(BuzzPIN, LOW);
digitalWrite(LEDBPIN, HIGH); digitalWrite(LEDGPIN, HIGH); digitalWrite(LEDRPIN, HIGH);
M1.setSpeed(250); M2.setSpeed(250);
Forward();
}
}
void ChangePath() {
Stop(); Backward(); Stop();
SER1.write(12); delay(500); RightDistance = Search(); delay(500);
SER1.write(160); delay(1000); LeftDistance = Search(); delay(500);
SER1.write(80); delay(500);
CompareDistance();
}
void CompareDistance() {
if (RightDistance > LeftDistance) TurnRight();
else if (LeftDistance > RightDistance) TurnLeft();
else TurnAround();
}
void Forward() { M1.run(FORWARD); M2.run(FORWARD); }
void Backward() { M1.run(BACKWARD); M2.run(BACKWARD); delay(500); }
void TurnRight() { M1.run(BACKWARD); M2.run(FORWARD); M1.setSpeed(100+DCMROFF); delay(300); }
void TurnLeft() { M1.run(FORWARD); M2.run(BACKWARD); M2.setSpeed(100+DCMROFF); delay(300); }
void TurnAround() { M1.run(FORWARD); M2.run(BACKWARD); M2.setSpeed(100+DCMROFF); delay(700); }
void Stop() { M1.run(RELEASE); M2.run(RELEASE); delay(100); }
3D-модель шасси
Файл шасси для 3D-печати (Fusion 360) — в разделе CAD проекта.
Схема подключения
Принципиальная схема подключения Motor Shield, сервы, сонара, RGB и зуммера к Arduino UNO.
Youth Zest Project Showcase — проект в рамках молодежной выставки.
Производственный процесс
- Синтаксис нетлистов SPICE: именование компонентов, пассивные и активные элементы, определение источников
- Интегральные схемы (ИС): компактные мощные чипы, питающие современную электронику
- Передача данных температуры и влажности между двумя Arduino через Firebase
- Цифровые кости на Arduino: генератор случайных чисел с LCD-дисплеем и кнопкой
- Многопозиционная система датчиков температуры для интеграции в умный дом
- DIY USB-геймпад на Arduino: собственный высокопроизводительный контроллер
- Набор MOSMusic: MOSFET, Arduino и управление светом по музыке
- Микроэлектроника: наука о сверхмалых электронных компонентах
- Основные компоненты сверлильного станка: подробный обзор
- Ключевые компоненты двигателя внутреннего сгорания