Перейти к содержимому
Constell Shop
Робот, едущий по линии 3D

Инструкции к проектам

Робот, едущий по линии

Два датчика KY-033 смотрят на пол: куда уходит чёрная линия, туда и поворачивает робот. Наклейте чёрную изоленту на белую бумагу — трасса готова.

Сложность
Легко
Время
~120 min
Детали
деталей: 12
Шаг за шагом
шагов: 4
  • Работать с ИК-датчиком отражения
  • Простой алгоритм управления
  • Настраивать датчик (потенциометр)

Детали

Ещё понадобится

  • — Компьютер и Arduino IDE (бесплатно на arduino.cc)
  • — USB-кабель для UNO (вариант UNO SMD «+ USB-кабель»)
  • — Небольшая крестовая отвёртка
  • — Чёрная изолента и белая бумага или картон

Шаг за шагом

  1. 01

    Соберите машинку

    Шасси, моторы, L298N и питание — как в инструкции «Робот-машинка».

  2. 02

    Установите датчики

    Закрепите оба KY-033 спереди, датчиками вниз, на высоте 5–10 мм от пола и на расстоянии чуть шире линии (2–3 см) друг от друга.

  3. 03

    Подключите и настройте

    OUT левого датчика → D12, правого → D11, VCC → 5V, GND → GND. Подайте питание и подстройте потенциометры: над белым светодиод горит, над чёрной линией гаснет.

  4. 04

    Загрузите код и проверьте на трассе

    Поставьте робота так, чтобы линия была между датчиками. Если вылетает на поворотах, уменьшите SPEED.

Подключение

  • Питание (+)
  • Земля (−)
  • Сигнальный пин
  • Шина I²C / SPI
L298N ⟷ UNOпроводов: 8
  1. L298NENA→UNOD5 снимите перемычку с ENA
  2. L298NIN1→UNOD7
  3. L298NIN2→UNOD8
  4. L298NIN3→UNOD2
  5. L298NIN4→UNOD4
  6. L298NENB→UNOD6 снимите перемычку с ENB
  7. L298NGND→UNOGND общая земля — обязательно
  8. L298N5V→UNO5V питает UNO от драйвера
L298N ⟷ Левый моторпроводов: 1
  1. L298NOUT1OUT2→Левый мотор
L298N ⟷ Правый моторпроводов: 1
  1. L298NOUT3OUT4→Правый мотор
Аккумулятор ⟷ L298Nпроводов: 2
  1. Аккумулятор+(2×18650)→L298N12V
  2. Аккумулятор−→L298NGND
KY-033 ⟷ UNOпроводов: 4
  1. KY-033левыйOUT→UNOD12
  2. KY-033правыйOUT→UNOD11
  3. KY-033VCC→UNO5V
  4. KY-033GND→UNOGND

Код

sketch.ino
// моторы (L298N)
const int ENA = 5, IN1 = 7, IN2 = 8;   // левый
const int ENB = 6, IN3 = 2, IN4 = 4;   // правый

void motors(int left, int right) {     // -255 … 255
  digitalWrite(IN1, left >= 0);  digitalWrite(IN2, left < 0);
  digitalWrite(IN3, right >= 0); digitalWrite(IN4, right < 0);
  analogWrite(ENA, abs(left));   analogWrite(ENB, abs(right));
}

void setupMotors() {
  int pins[] = {ENA, IN1, IN2, ENB, IN3, IN4};
  for (int p : pins) pinMode(p, OUTPUT);
  motors(0, 0);
}

const int LEFT = 12, RIGHT = 11;   // HIGH = над чёрной линией
const int SPEED = 150, TURN = 170;

void setup() {
  setupMotors();
  pinMode(LEFT, INPUT); pinMode(RIGHT, INPUT);
  delay(1500);
}

void loop() {
  bool l = digitalRead(LEFT), r = digitalRead(RIGHT);
  if (!l && !r)      motors(SPEED, SPEED);    // линия между датчиками
  else if (l && !r)  motors(-TURN / 2, TURN); // линия под левым: поворот налево
  else if (!l && r)  motors(TURN, -TURN / 2); // под правым: поворот направо
  else               motors(0, 0);            // оба на чёрном: перекрёсток или финиш
}

Если что-то не работает

  • Робот не видит линию: датчики слишком высоко — опустите до 5–10 мм и перенастройте потенциометр.
  • Поворачивает не в ту сторону: поменяйте местами провода датчиков (D12/D11).
  • Не работает на солнце: ИК-датчики не любят яркий свет — испытывайте в помещении.

Что дальше

  • Добавьте третий датчик для плавных поворотов
  • Освойте ПИД-регулятор — быстрее и точнее