🔧 Собираем робота!

Урок 1.4 | Level 1: Новобранец

Финальный проект: робот-разведчик

Что будем делать?

Соберём робота, который:

  1. 👁️ Видит препятствия (HC-SR04)
  2. 🧠 Думает — решает, куда ехать
  3. 💪 Едет — управляет моторами
SENSE → THINK → ACT

Это твой первый настоящий робот! 🎉

Компоненты

Что понадобится

КомпонентКоличествоЗачем
Arduino Uno1Мозг
HC-SR041Глаза
L298N1Сила для моторов
DC моторы с колёсами2Движение
Аккумулятор 7-12V1Питание
Шасси1Корпус
ПроводамногоСоединения

Схема робота

         ┌─────────────────────────────────┐
         │           HC-SR04               │ ← Датчик спереди
         │          (  👁️  )              │
         └──────────────┬──────────────────┘
    ┌───────────────────┼───────────────────┐
    │     ┌─────────────┴─────────────┐     │
    │     │         Arduino           │     │
    │     │           🧠              │     │
    │     └─────────────┬─────────────┘     │
    │                   │                   │
    │     ┌─────────────┴─────────────┐     │
    │     │          L298N            │     │
    │     │           ⚡              │     │
    │     └──────┬──────────┬─────────┘     │
    │            │          │               │
   ╭╮          ╭─╯          ╰─╮           ╭╮
   ││ Мотор L  │              │  Мотор R  ││
   ╰╯         ⚙️              ⚙️          ╰╯

Подключение

Шаг 1: Ультразвуковой датчик

HC-SR04          Arduino
───────          ───────
VCC      ───────  5V
GND      ───────  GND
TRIG     ───────  D9
ECHO     ───────  D10

Шаг 2: Драйвер моторов L298N

L298N            Arduino        Питание
─────            ───────        ───────
ENA      ───────  D5 (PWM)
IN1      ───────  D6
IN2      ───────  D7
IN3      ───────  D8
IN4      ───────  D11
ENB      ───────  D3 (PWM)

+12V     ──────────────────────  + Аккумулятор
GND      ───────  GND  ─────────  - Аккумулятор

Шаг 3: Моторы

L298N            Моторы
─────            ──────
OUT1, OUT2  ───  Левый мотор
OUT3, OUT4  ───  Правый мотор

Совет: Если робот едет не туда — поменяй провода мотора местами!

Код: по частям

Часть 1: Настройка пинов

// Пины ультразвука
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;

Часть 2: Функция измерения расстояния

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;
}

Часть 3: Функции движения

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);
}

Часть 3: Функции движения (продолжение)

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);
}

Часть 4: Главный цикл (ЛОГИКА!)

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);
}

Тестирование

Чек-лист перед запуском

  • Проверь полярность питания (+ и -)
  • Arduino подключён к компьютеру
  • Датчик смотрит вперёд
  • Колёса не касаются проводов
  • Код загружен без ошибок

Отладка

Открой Serial Monitor (Ctrl+Shift+M) и смотри расстояние.

Расстояние: 45 см — едем
Расстояние: 25 см — притормаживаем
Расстояние: 10 см — объезжаем!

Частые проблемы

ПроблемаРешение
Робот не едетПроверь питание моторов
Едет назад вместо вперёдПоменяй провода мотора
Крутится на местеОдинаковая полярность моторов?
Не видит препятствияПроверь подключение HC-SR04

Улучшения

Идеи для апгрейда

  1. Добавь серво с датчиком
    Поворачивай «голову» влево-вправо, ищи свободный путь

  2. Добавь датчики по бокам
    Два HC-SR04 — смотреть влево и вправо

  3. Добавь светодиоды
    Красный — стоп, зелёный — еду

  4. Добавь пищалку
    Бип при обнаружении препятствия

Код с серво-головой (идея)

#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();
}

🎉 Поздравляем!

Ты собрал своего первого робота!

Ты освоил:

  • ✅ Датчик расстояния (Sense)
  • ✅ Логику принятия решений (Think)
  • ✅ Управление моторами (Act)

Что дальше?

🟢 Level 1 — Пройден! ✅

Переходи на Level 2 — Оператор:

УрокТема
2.1Робот по линии
2.2Продвинутый объезд
2.3PID-регулятор
2.4Соревнования!

Ресурсы

Справочник

Симуляторы

  • 🔗 Wokwi — Arduino онлайн
  • 🔗 Tinkercad — схемы и код

Добро пожаловать в Сопротивление! 🤖⚡

Теперь ты знаешь, как устроен враг.