Назад к каталогу
Проект 3. Движение по линии
Сложность: СреднийДлительность: 60-90 минутРобототехника

Проект 3. Движение по линии

Настройка датчиков линии и программирование алгоритма автоматического следования по трассе

В этом проекте робот впервые начинает ориентироваться по окружающей среде с помощью датчиков. На машинке установлены два датчика линии (левый и правый), которые смотрят вниз и определяют цвет поверхности. Arduino постоянно считывает их показания и корректирует движение, чтобы удерживать робота на трассе. Моторы по-прежнему управляются по сторонам через драйвер MX1508. Для коррекции траектории программа изменяет скорость или направление левой и правой группы моторов, создавая плавные или резкие повороты.

Теги

  • STEM
  • Arduino
  • Робототехника
  • Датчики линии
  • Следование по линии
  • PWM
  • Электроника

В этом проекте робот учится двигаться по чёрной линии на светлой поверхности. Это один из самых важных проектов в образовательной робототехнике, потому что здесь робот уже не просто едет вперёд по команде, а начинает ориентироваться по датчикам. Именно в таких заданиях ученик впервые видит, как программа реагирует на окружающую среду. На машинке установлены два датчика линии: левый и правый. Они смотрят вниз и определяют, что находится под ними — светлая поверхность или тёмная линия. Когда датчик находится над чёрной линией, его показание меняется. Arduino постоянно считывает эти значения и в зависимости от них решает, как нужно изменить движение робота. Смысл проекта заключается в том, чтобы робот всё время удерживался на линии. Если он начинает смещаться влево или вправо, программа должна быстро это заметить и скорректировать движение. Для этого мы будем по-разному управлять левой и правой стороной робота. Как и в предыдущих проектах, моторы подключены по сторонам. Два мотора слева работают как одна группа, и два мотора справа работают как вторая группа. Для управления используется драйвер MX1508. Это значит, что для коррекции движения мы меняем скорость или направление не у каждого колеса отдельно, а у левой и правой стороны платформы.

Подключение датчиков линии

Обычно у датчиков линии три контакта: питание, земля и сигнальный вывод. Питание подключается к 5V, земля к GND, а сигнальные выводы подключаются к цифровым пинам Arduino. В примере ниже левый датчик подключён к D7, а правый — к D8. Перед началом работы убедитесь, что датчики установлены достаточно низко и смотрят прямо вниз. Если датчик находится слишком высоко, он может плохо различать поверхность. Если слишком низко, он может задевать трассу. Лучше всего сначала проверить датчики на месте рукой: поднести под них белую бумагу и чёрную полосу и посмотреть, меняется ли сигнал.

Проверка датчиков линии

Перед тем как программировать движение, полезно убедиться, что датчики вообще работают правильно. Сначала можно загрузить небольшую тестовую программу, которая будет выводить состояния левого и правого датчика в монитор порта.

const int LEFT_SENSOR  = 7;
const int RIGHT_SENSOR = 8;

void setup() {
  Serial.begin(9600);
  pinMode(LEFT_SENSOR, INPUT);
  pinMode(RIGHT_SENSOR, INPUT);
}

void loop() {
  int leftValue  = digitalRead(LEFT_SENSOR);
  int rightValue = digitalRead(RIGHT_SENSOR);

  Serial.print("Left: ");
  Serial.print(leftValue);
  Serial.print("   Right: ");
  Serial.println(rightValue);

  delay(200);
}

После загрузки этой программы откройте монитор порта и перемещайте робота над линией. Смотрите, как меняются значения. На одной поверхности датчик должен показывать одно состояние, а на линии — другое. Очень важно запомнить, что именно выдают ваши датчики на белом фоне и на чёрной линии, потому что у разных модулей логика может быть разной. Например, у одного датчика над белой поверхностью может быть значение 1, а над чёрной линией — 0. У другого модуля логика бывает обратной. Именно поэтому сначала нужно провести проверку, а не просто копировать код.

Основная программа движения по линии

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

const int LEFT_SENSOR  = 7;
const int RIGHT_SENSOR = 8;

// Пины драйвера MX1508
const int LEFT_IN1  = 5;
const int LEFT_IN2  = 6;
const int RIGHT_IN1 = 9;
const int RIGHT_IN2 = 10;

int baseSpeed = 170;

void setup() {
  pinMode(LEFT_SENSOR, INPUT);
  pinMode(RIGHT_SENSOR, INPUT);

  pinMode(LEFT_IN1, OUTPUT);
  pinMode(LEFT_IN2, OUTPUT);
  pinMode(RIGHT_IN1, OUTPUT);
  pinMode(RIGHT_IN2, OUTPUT);

  stopMotors();
}

void loop() {
  int leftValue  = digitalRead(LEFT_SENSOR);
  int rightValue = digitalRead(RIGHT_SENSOR);

  // Предположим:
  // 0 = датчик видит чёрную линию
  // 1 = датчик видит светлую поверхность

  if (leftValue == 0 && rightValue == 0) {
    moveForward();
  }
  else if (leftValue == 0 && rightValue == 1) {
    turnLeft();
  }
  else if (leftValue == 1 && rightValue == 0) {
    turnRight();
  }
  else {
    stopMotors();
  }
}

void moveForward() {
  analogWrite(LEFT_IN1, baseSpeed);
  analogWrite(LEFT_IN2, 0);
  analogWrite(RIGHT_IN1, baseSpeed);
  analogWrite(RIGHT_IN2, 0);
}

void turnLeft() {
  analogWrite(LEFT_IN1, 0);
  analogWrite(LEFT_IN2, 0);
  analogWrite(RIGHT_IN1, baseSpeed);
  analogWrite(RIGHT_IN2, 0);
}

void turnRight() {
  analogWrite(LEFT_IN1, baseSpeed);
  analogWrite(LEFT_IN2, 0);
  analogWrite(RIGHT_IN1, 0);
  analogWrite(RIGHT_IN2, 0);
}

void stopMotors() {
  analogWrite(LEFT_IN1, 0);
  analogWrite(LEFT_IN2, 0);
  analogWrite(RIGHT_IN1, 0);
  analogWrite(RIGHT_IN2, 0);
}

Разбор программы

В начале программы задаются пины датчиков линии. Переменные LEFT_SENSOR и RIGHT_SENSOR отвечают за левый и правый датчик. Ниже задаются пины драйвера MX1508, через который управляются моторы левой и правой стороны. Переменная baseSpeed задаёт базовую скорость движения робота. Это обычное числовое значение PWM. Если скорость будет слишком высокой, робот может не успевать реагировать на изменения линии. Если слишком низкой, движение получится медленным, но более стабильным. Поэтому этот параметр часто приходится подбирать на практике. В функции setup() датчики переводятся в режим INPUT, а управляющие пины драйвера — в режим OUTPUT. Команда stopMotors() в конце setup() нужна для того, чтобы робот не начал движение сразу после включения. Дальше начинается основной цикл loop(). В каждой итерации программа считывает состояния левого и правого датчика. После этого она анализирует комбинацию значений и выбирает нужное действие. В этом примере предполагается, что значение 0 означает, что датчик видит чёрную линию, а значение 1 — светлую поверхность. Если у ваших датчиков всё наоборот, нужно просто поменять условия в if. Когда оба датчика видят линию, вызывается функция moveForward(), и робот едет прямо. Когда левый датчик видит линию, а правый — светлую поверхность, значит робот сместился вправо относительно линии, поэтому вызывается turnLeft(), чтобы вернуть его обратно. Когда правый датчик видит линию, а левый — светлую поверхность, ситуация обратная: робот ушёл влево, и программа вызывает turnRight(), чтобы скорректировать движение. Если оба датчика не видят линию, в этом примере робот останавливается. Это самый простой и безопасный вариант. Позже можно будет улучшить программу так, чтобы робот искал линию или продолжал движение по последнему направлению. Функция moveForward() подаёт одинаковую скорость на обе стороны, и робот едет вперёд. В функции turnLeft() левая сторона останавливается, а правая продолжает движение. Из-за этого робот поворачивает влево. Функция turnRight() работает зеркально: правая сторона останавливается, а левая продолжает движение. Функция stopMotors() выключает движение обеих сторон. Здесь на все управляющие пины подаётся ноль, поэтому драйвер не даёт моторам команду вращаться.

Как проверить работу проекта

После загрузки программы поставьте робота на трассу с чёрной линией на светлом фоне. Линия должна быть достаточно широкой, чтобы оба датчика могли уверенно её видеть. Сначала лучше взять простую трассу без резких поворотов. Если робот сразу уезжает в сторону или вообще не реагирует на линию, вернитесь к тестовой программе и снова проверьте показания датчиков. Очень часто проблема оказывается не в моторах, а именно в том, что логика датчиков перепутана. Если робот дёргается и слишком резко корректирует траекторию, попробуйте уменьшить значение baseSpeed. Если повороты получаются слишком слабыми, можно изменить функции turnLeft() и turnRight(), например сделать не полную остановку одной стороны, а уменьшение скорости. Тогда движение станет мягче. Этот проект очень важен, потому что именно здесь появляется настоящая обратная связь: робот не просто выполняет команду, а постоянно наблюдает за поверхностью и меняет своё поведение в зависимости от показаний датчиков. После освоения этого проекта можно переходить к более сложным трассам, перекрёсткам, скоростному движению и более умным алгоритмам следования по линии.

Материалы

  • контроллер
  • Драйвер MX1508
  • 4 мотор-редуктора
  • 2 датчика линии
  • Соединительные провода
  • Трасса (чёрная линия на светлом фоне)

Этапы

  1. 1

    Подключение датчиков линии

    Подключите питание к 5V, землю к GND, сигнальные выводы левого и правого датчиков к пинам D7 и D8 соответственно

  2. 2

    Физическая установка датчиков

    Убедитесь, что датчики установлены низко и смотрят прямо вниз, не задевая трассу, но достаточно близко к поверхности

  3. 3

    Загрузка тестовой программы

    Загрузите код для вывода состояний левого и правого датчика в монитор порта (скорость 9600 бод)

  4. 4

    Определение логики датчиков

    Перемещайте робота над линией и белым фоном, запишите, какие значения (0 или 1) соответствуют чёрной линии для ваших модулей

  5. 5

    Настройка пинов драйвера

    Задайте пины MX1508: LEFT_IN1=5, LEFT_IN2=6, RIGHT_IN1=9, RIGHT_IN2=10

  6. 6

    Написание основной программы

    Создайте программу с функциями moveForward(), turnLeft(), turnRight(), stopMotors() и логикой if/else на основе показаний датчиков

  7. 7

    Адаптация условий if

    Внесите в код правильные значения (0 или 1) для чёрной линии, которые вы определили при тестировании

  8. 8

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

    Загрузите программу и проверьте движение по простой трассе без резких поворотов

  9. 9

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

    Отрегулируйте переменную baseSpeed: уменьшите, если робот дёргается, или измените логику поворотов для плавности

  10. 10

    Усложнение трассы

    Попробуйте более сложные маршруты, перекрёстки или измените алгоритм поиска линии при её потере

Комментарии

0
Загрузка комментариев...