Финальный проект: робот-разведчик
Соберём робота, который:
SENSE → THINK → ACT
Это твой первый настоящий робот! 🎉
| Компонент | Количество | Зачем |
|---|---|---|
| Arduino Uno | 1 | Мозг |
| HC-SR04 | 1 | Глаза |
| L298N | 1 | Сила для моторов |
| DC моторы с колёсами | 2 | Движение |
| Аккумулятор 7-12V | 1 | Питание |
| Шасси | 1 | Корпус |
| Провода | много | Соединения |
┌─────────────────────────────────┐
│ HC-SR04 │ ← Датчик спереди
│ ( 👁️ ) │
└──────────────┬──────────────────┘
│
┌───────────────────┼───────────────────┐
│ ┌─────────────┴─────────────┐ │
│ │ Arduino │ │
│ │ 🧠 │ │
│ └─────────────┬─────────────┘ │
│ │ │
│ ┌─────────────┴─────────────┐ │
│ │ L298N │ │
│ │ ⚡ │ │
│ └──────┬──────────┬─────────┘ │
│ │ │ │
╭╮ ╭─╯ ╰─╮ ╭╮
││ Мотор L │ │ Мотор R ││
╰╯ ⚙️ ⚙️ ╰╯
HC-SR04 Arduino
─────── ───────
VCC ─────── 5V
GND ─────── GND
TRIG ─────── D9
ECHO ─────── D10
L298N Arduino Питание
───── ─────── ───────
ENA ─────── D5 (PWM)
IN1 ─────── D6
IN2 ─────── D7
IN3 ─────── D8
IN4 ─────── D11
ENB ─────── D3 (PWM)
+12V ────────────────────── + Аккумулятор
GND ─────── GND ───────── - Аккумулятор
L298N Моторы
───── ──────
OUT1, OUT2 ─── Левый мотор
OUT3, OUT4 ─── Правый мотор
Совет: Если робот едет не туда — поменяй провода мотора местами!
// Пины ультразвука
const int TRIG = 9;
const int ECHO = 10;
// Пины моторов
const int ENA = 5; // Скорость левого
const int IN1 = 6; // Направление
const int IN2 = 7;
const int IN3 = 8;
const int IN4 = 11;
const int ENB = 3; // Скорость правого
// Скорость (0-255)
const int SPEED = 150;
int getDistance() {
// Посылаем ультразвук
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
// Измеряем время эха
long duration = pulseIn(ECHO, HIGH);
// Переводим в сантиметры
int distance = duration / 58;
return distance;
}
void forward() {
analogWrite(ENA, SPEED);
analogWrite(ENB, SPEED);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
void backward() {
analogWrite(ENA, SPEED);
analogWrite(ENB, SPEED);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
void turnLeft() {
analogWrite(ENA, SPEED);
analogWrite(ENB, SPEED);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
void turnRight() {
analogWrite(ENA, SPEED);
analogWrite(ENB, SPEED);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
void stop() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
void loop() {
int distance = getDistance();
if (distance > 30) {
// Путь свободен — едем!
forward();
}
else if (distance > 15) {
// Близко — притормаживаем
analogWrite(ENA, 100);
analogWrite(ENB, 100);
forward();
}
else {
// Препятствие! Объезжаем
stop();
delay(200);
backward();
delay(300);
turnRight(); // Или turnLeft() — попробуй!
delay(400);
}
delay(50); // Пауза между проверками
}
// === РОБОТ-РАЗВЕДЧИК ===
// Level 1 | Программа «Сопротивление»
// Пины ультразвука
const int TRIG = 9;
const int ECHO = 10;
// Пины моторов
const int ENA = 5, IN1 = 6, IN2 = 7;
const int ENB = 3, IN3 = 8, IN4 = 11;
const int SPEED = 150;
void setup() {
// Ультразвук
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
// Моторы
pinMode(ENA, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
Serial.begin(9600);
}
int getDistance() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long duration = pulseIn(ECHO, HIGH);
return duration / 58;
}
void forward() {
analogWrite(ENA, SPEED);
analogWrite(ENB, SPEED);
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
}
void backward() {
analogWrite(ENA, SPEED);
analogWrite(ENB, SPEED);
digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
}
void turnRight() {
analogWrite(ENA, SPEED);
analogWrite(ENB, SPEED);
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
}
void stop() {
digitalWrite(IN1, LOW); digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW); digitalWrite(IN4, LOW);
}
void loop() {
int distance = getDistance();
Serial.println(distance);
if (distance > 30) {
forward();
} else {
stop();
delay(200);
backward();
delay(300);
turnRight();
delay(400);
}
delay(50);
}
Открой Serial Monitor (Ctrl+Shift+M) и смотри расстояние.
Расстояние: 45 см — едем
Расстояние: 25 см — притормаживаем
Расстояние: 10 см — объезжаем!
| Проблема | Решение |
|---|---|
| Робот не едет | Проверь питание моторов |
| Едет назад вместо вперёд | Поменяй провода мотора |
| Крутится на месте | Одинаковая полярность моторов? |
| Не видит препятствия | Проверь подключение HC-SR04 |
Добавь серво с датчиком
Поворачивай «голову» влево-вправо, ищи свободный путь
Добавь датчики по бокам
Два HC-SR04 — смотреть влево и вправо
Добавь светодиоды
Красный — стоп, зелёный — еду
Добавь пищалку
Бип при обнаружении препятствия
#include <Servo.h>
Servo headServo;
int lookLeft() {
headServo.write(180); // Голова влево
delay(500);
return getDistance();
}
int lookRight() {
headServo.write(0); // Голова вправо
delay(500);
return getDistance();
}
// В loop():
if (distance < 20) {
int left = lookLeft();
int right = lookRight();
headServo.write(90); // Голова прямо
if (left > right) turnLeft();
else turnRight();
}
Ты освоил:
Переходи на Level 2 — Оператор:
| Урок | Тема |
|---|---|
| 2.1 | Робот по линии |
| 2.2 | Продвинутый объезд |
| 2.3 | PID-регулятор |
| 2.4 | Соревнования! |
Теперь ты знаешь, как устроен враг.