Перейти к основному содержимому

Двухсенсорный робот, следующий по линии

Вы соберёте робота, который следует по чёрной изоленте на белом поле. Два модуля TCRT5000 смотрят вниз: по отражённому инфракрасному свету они различают чёрную линию и белый фон. Arduino сравнивает их сигналы и меняет скорость левого и правого моторов.

Готовый двухколёсный робот для движения по линии

Реальная сборка робота на шасси

Фотографии реальной сборки: Circuit Digest — Arduino Line Follower Robot. В этой инструкции применён L298N и приведена согласованная с кодом распиновка.

Какой результат ожидается

Робот рассчитан на:

  • матовое белое поле;
  • чёрную матовую ленту шириной 20–25 мм;
  • плавные повороты радиусом от 20 см;
  • скорость для первого запуска около 55–65 %;
  • два датчика, установленные поперёк линии.

Это не скоростная соревновательная модель. Два цифровых датчика дают только четыре сочетания сигналов, но такую конструкцию легко собрать и отладить самостоятельно.

Детали

ДетальКоличествоТочная конфигурация
Arduino Uno R31ATmega328P
L298N1модуль двухканального драйвера
Модуль TCRT50002с выводами VCC, GND, DO и подстроечником
2WD-шасси1два TT-мотора 3–6 В, колёса и шаровая опора
NiMH AA 1,2 В6одинаковые заряженные аккумуляторы
Держатель 6×AA с выключателем1около 7,2 В
LM25961настроить на 5,0 В
Макетная плата, провода, стойки, стяжки1 набордля монтажа
Чёрная матовая изолента3–5 мширина 20–25 мм
Белый пенокартон или ватманнесколько листовиспытательная трасса

Нужны отвёртка, мультиметр, линейка и небольшой кусок белого и чёрного материала для настройки датчиков.

Питание

Снимите с L298N перемычки ENA, ENB и 5V-EN. Аккумуляторы питают моторную часть напрямую, а LM2596 создаёт 5 В для логики.

6×AA NiMH -> выключатель -> L298N +12V
-> LM2596 IN

LM2596 5,0 В -> Arduino 5V
-> L298N 5V
-> VCC обоих TCRT5000

Все земли соединены вместе.

Перед подключением плат настройте LM2596 мультиметром ровно на 5,0 В. Не используйте батарейку PP3 9 В и не питайте моторы от Arduino.

Сборка

  1. Соберите шасси и закрепите батарейный отсек снизу.
  2. Установите платы сверху, провода уберите от колёс.
  3. Закрепите датчики спереди снизу симметрично относительно продольной оси.
  4. Начальная высота чувствительной поверхности над полем — 6–8 мм.
  5. Расстояние между центрами датчиков — 12–16 мм. На прямом участке чёрная лента шириной 20–25 мм должна находиться сразу под обоими датчиками.
  6. Датчики не должны выступать так далеко, чтобы цеплять неровности трассы.
  7. Колёса должны свободно вращаться, а шасси — стоять без перекоса.

Схема соединений

ОткудаКуда
Arduino D5L298N ENA
Arduino D7L298N IN1
Arduino D8L298N IN2
Arduino D9L298N IN3
Arduino D10L298N IN4
Arduino D6L298N ENB
L298N OUT1 и OUT2левый мотор
L298N OUT3 и OUT4правый мотор
левый TCRT5000 DOArduino A0
правый TCRT5000 DOArduino A1
оба TCRT5000 VCCстабилизированные 5 В
оба TCRT5000 GNDобщая земля

Аналоговые выводы A0 и A1 здесь используются как обычные цифровые входы. Вывод AO модулей не подключается.

Калибровка датчиков

Сначала не подключайте моторное питание. Загрузите тест:

const byte SENSOR_LEFT = A0;
const byte SENSOR_RIGHT = A1;

void setup() {
pinMode(SENSOR_LEFT, INPUT);
pinMode(SENSOR_RIGHT, INPUT);
Serial.begin(9600);
}

void loop() {
Serial.print("L=");
Serial.print(digitalRead(SENSOR_LEFT));
Serial.print(" R=");
Serial.println(digitalRead(SENSOR_RIGHT));
delay(100);
}

Для каждого датчика:

  1. удерживайте его на рабочей высоте над белым полем;
  2. медленно вращайте подстроечник до устойчивого переключения индикатора;
  3. перенесите датчик на чёрную ленту — сигнал должен измениться;
  4. десять раз переместите его между белым и чёрным и убедитесь, что результат повторяется;
  5. настройте второй модуль тем же способом.

У большинства модулей цифровой сигнал над чёрной линией равен LOW. Если у ваших модулей наоборот, в основной программе замените LINE_LEVEL на HIGH.

Программа

Когда оба датчика видят линию, робот едет прямо. Если линию видит только левый датчик, робот корректирует путь влево; если правый — вправо. Если оба потеряли линию, робот медленно поворачивается в сторону последней коррекции.

const byte SENSOR_LEFT = A0;
const byte SENSOR_RIGHT = A1;
const byte LINE_LEVEL = LOW;

const byte EN_LEFT = 5;
const byte EN_RIGHT = 6;
const byte IN1 = 7;
const byte IN2 = 8;
const byte IN3 = 9;
const byte IN4 = 10;

const int BASE_SPEED = 155;
const int SLOW_SPEED = 65;
const int SEARCH_SPEED = 105;
int lastTurn = 1;

void setMotor(byte pin1, byte pin2, byte enablePin, int power) {
power = constrain(power, -255, 255);
digitalWrite(pin1, power > 0 ? HIGH : LOW);
digitalWrite(pin2, power < 0 ? HIGH : LOW);
analogWrite(enablePin, abs(power));
}

void drive(int leftPower, int rightPower) {
setMotor(IN1, IN2, EN_LEFT, leftPower);
setMotor(IN3, IN4, EN_RIGHT, rightPower);
}

bool seesLine(byte pin) {
return digitalRead(pin) == LINE_LEVEL;
}

void setup() {
pinMode(SENSOR_LEFT, INPUT);
pinMode(SENSOR_RIGHT, INPUT);
pinMode(EN_LEFT, OUTPUT);
pinMode(EN_RIGHT, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
drive(0, 0);
delay(1000);
}

void loop() {
bool left = seesLine(SENSOR_LEFT);
bool right = seesLine(SENSOR_RIGHT);

if (left && right) {
drive(BASE_SPEED, BASE_SPEED);
} else if (left && !right) {
drive(SLOW_SPEED, BASE_SPEED);
lastTurn = -1;
} else if (!left && right) {
drive(BASE_SPEED, SLOW_SPEED);
lastTurn = 1;
} else if (lastTurn < 0) {
drive(-SEARCH_SPEED, SEARCH_SPEED);
} else {
drive(SEARCH_SPEED, -SEARCH_SPEED);
}

delay(5);
}

Первый запуск

  1. Поставьте робота на коробку и включите питание.
  2. Поднесите под оба датчика чёрную полоску. Оба колеса должны крутиться вперёд.
  3. Оставьте чёрное только под левым датчиком: левое колесо должно замедлиться.
  4. Оставьте чёрное только под правым: должно замедлиться правое колесо.
  5. Если «вперёд» для одного колеса оказался движением назад, выключите питание и поменяйте провода этого мотора.
  6. Сделайте прямую трассу длиной около 1 м и запустите робота с BASE_SPEED, равной 120.
  7. Увеличивайте BASE_SPEED по 10. После каждого изменения проверяйте прямую и один плавный поворот.

Настройка трассы

  • Лента должна быть матовой: глянцевая поверхность создаёт блики.
  • Стыки ленты наклеивайте без щелей и ступенек.
  • Первый поворот сделайте радиусом не меньше 30 см.
  • Освещение должно быть постоянным; прямой солнечный свет может мешать инфракрасным датчикам.
  • Если робот часто теряет линию, сначала уменьшите скорость, затем проверьте высоту и расстояние между датчиками.

Диагностика

СимптомЧто исправить
Сигнал не меняется над белым и чёрнымвысоту датчика, питание, подстроечник, подключение DO
Робот поворачивает от линиипоменяйте местами SENSOR_LEFT и SENSOR_RIGHT либо датчики физически
На прямой робот раскачиваетсяуменьшите BASE_SPEED или увеличьте SLOW_SPEED
На повороте робот вылетаетуменьшите скорость, сделайте поворот плавнее, сдвиньте датчики немного вперёд
После потери линии крутится не тудапоменяйте знаки lastTurn в двух ветвях
Arduino перезапускаетсяпроверьте 5 В LM2596, заряд и силовые контакты

Практика

  1. Для высот 4, 7 и 12 мм проверьте по десять распознаваний белого и чёрного.
  2. Найдите максимальную BASE_SPEED для трассы с прямой, левым и правым поворотом.
  3. Сравните матовую изоленту и глянцевую ленту при комнатном и солнечном освещении.

Проверьте себя

  • Почему TCRT5000 различает чёрную и белую поверхность?
  • Что означают четыре сочетания двух цифровых сигналов?
  • Почему датчики калибруют на той же высоте, на которой они будут работать?
  • Что сначала менять при сходе с линии: скорость, программу или механику?
  • Для чего программа хранит lastTurn?

Словарь статьи

  • TCRT5000 — отражательный инфракрасный датчик со светодиодом и фототранзистором.
  • DO — цифровой выход модуля.
  • Калибровка — настройка порога различения линии и фона.
  • Дифференциальный привод — поворот за счёт разных скоростей левого и правого колёс.
  • Коррекция — краткое изменение скоростей, возвращающее робота к линии.

Связанные темы

Источники