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


Фотографии реальной сборки: Circuit Digest — Arduino Line Follower Robot. В этой инструкции применён L298N и приведена согласованная с кодом распиновка.
Какой результат ожидается
Робот рассчитан на:
- матовое белое поле;
- чёрную матовую ленту шириной 20–25 мм;
- плавные повороты радиусом от 20 см;
- скорость для первого запуска около 55–65 %;
- два датчика, установленные поперёк линии.
Это не скоростная соревновательная модель. Два цифровых датчика дают только четыре сочетания сигналов, но такую конструкцию легко собрать и отладить самостоятельно.
Детали
| Деталь | Количество | Точная конфигурация |
|---|---|---|
| Arduino Uno R3 | 1 | ATmega328P |
| L298N | 1 | модуль двухканального драйвера |
| Модуль TCRT5000 | 2 | с выводами VCC, GND, DO и подстроечником |
| 2WD-шасси | 1 | два TT-мотора 3–6 В, колёса и шаровая опора |
| NiMH AA 1,2 В | 6 | одинаковые заряженные аккумуляторы |
| Держатель 6×AA с выключателем | 1 | около 7,2 В |
| LM2596 | 1 | настроить на 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.
Сборка
- Соберите шасси и закрепите батарейный отсек снизу.
- Установите платы сверху, провода уберите от колёс.
- Закрепите датчики спереди снизу симметрично относительно продольной оси.
- Начальная высота чувствительной поверхности над полем — 6–8 мм.
- Расстояние между центрами датчиков — 12–16 мм. На прямом участке чёрная лента шириной 20–25 мм должна находиться сразу под обоими датчиками.
- Датчики не должны выступать так далеко, чтобы цеплять неровности трассы.
- Колёса должны свободно вращаться, а шасси — стоять без перекоса.
Схема соединений
| Откуда | Куда |
|---|---|
| Arduino D5 | L298N ENA |
| Arduino D7 | L298N IN1 |
| Arduino D8 | L298N IN2 |
| Arduino D9 | L298N IN3 |
| Arduino D10 | L298N IN4 |
| Arduino D6 | L298N ENB |
| L298N OUT1 и OUT2 | левый мотор |
| L298N OUT3 и OUT4 | правый мотор |
| левый TCRT5000 DO | Arduino A0 |
| правый TCRT5000 DO | Arduino 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);
}
Для каждого датчика:
- удерживайте его на рабочей высоте над белым полем;
- медленно вращайте подстроечник до устойчивого переключения индикатора;
- перенесите датчик на чёрную ленту — сигнал должен измениться;
- десять раз переместите его между белым и чёрным и убедитесь, что результат повторяется;
- настройте второй модуль тем же способом.
У большинства модулей цифровой сигнал над чёрной линией равен 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 м и запустите робота с BASE_SPEED, равной 120.
- Увеличивайте BASE_SPEED по 10. После каждого изменения проверяйте прямую и один плавный поворот.
Настройка трассы
- Лента должна быть матовой: глянцевая поверхность создаёт блики.
- Стыки ленты наклеивайте без щелей и ступенек.
- Первый поворот сделайте радиусом не меньше 30 см.
- Освещение должно быть постоянным; прямой солнечный свет может мешать инфракрасным датчикам.
- Если робот часто теряет линию, сначала уменьшите скорость, затем проверьте высоту и расстояние между датчиками.
Диагностика
| Симптом | Что исправить |
|---|---|
| Сигнал не меняется над белым и чёрным | высоту датчика, питание, подстроечник, подключение DO |
| Робот поворачивает от линии | поменяйте местами SENSOR_LEFT и SENSOR_RIGHT либо датчики физически |
| На прямой робот раскачивается | уменьшите BASE_SPEED или увеличьте SLOW_SPEED |
| На повороте робот вылетает | уменьшите скорость, сделайте поворот плавнее, сдвиньте датчики немного вперёд |
| После потери линии крутится не туда | поменяйте знаки lastTurn в двух ветвях |
| Arduino перезапускается | проверьте 5 В LM2596, заряд и силовые контакты |
Практика
- Для высот 4, 7 и 12 мм проверьте по десять распознаваний белого и чёрного.
- Найдите максимальную BASE_SPEED для трассы с прямой, левым и правым поворотом.
- Сравните матовую изоленту и глянцевую ленту при комнатном и солнечном освещении.
Проверьте себя
- Почему TCRT5000 различает чёрную и белую поверхность?
- Что означают четыре сочетания двух цифровых сигналов?
- Почему датчики калибруют на той же высоте, на которой они будут работать?
- Что сначала менять при сходе с линии: скорость, программу или механику?
- Для чего программа хранит lastTurn?
Словарь статьи
- TCRT5000 — отражательный инфракрасный датчик со светодиодом и фототранзистором.
- DO — цифровой выход модуля.
- Калибровка — настройка порога различения линии и фона.
- Дифференциальный привод — поворот за счёт разных скоростей левого и правого колёс.
- Коррекция — краткое изменение скоростей, возвращающее робота к линии.
Связанные темы
Источники
- Circuit Digest: Arduino UNO Line Follower Robot — опубликованная сборка, фотографии и вариант схемы с двумя ИК-датчиками.
- Vishay: TCRT5000 datasheet — техническое описание отражательного датчика.
- STMicroelectronics: L298 — техническое описание драйвера моторов.