Каталог
Проект 11: Робот который ездит по линии

Проект 11: Робот который ездит по линии

Этот проект основан на роботе, собранном из набора 4WD Smart Car Kit v1.0, который будет следовать за линией и выполнять различные виды поворотов с помощью четырех датчиков линии. Используя управление двумя моторами через библиотеку AlashMotorControlX2, робот будет обнаруживать и следовать за черной линией на белом фоне. В этом проекте робот будет выполнять нормальные и резкие повороты в зависимости от показаний датчиков линии.

Принцип работы

Датчики линии определяют, находится ли робот на линии или вне ее. В зависимости от показаний датчиков, Arduino принимает решение о направлении движения робота: вперед, налево, направо, резкий поворот налево или резкий поворот направо. Моторы управляются через библиотеку AlashMotorControlX2.

Настройка чувствительности датчиков линии

Чтобы робот мог точно следовать за линией, необходимо правильно настроить чувствительность каждого датчика линии. Для этого необходимо выполнить следующие шаги:

  1. Настройка чувствительности датчиков:

    • Каждый датчик линии имеет потенциометр, с помощью которого можно регулировать его чувствительность. Поворачивайте потенциометр, пока датчик не начнет стабильно реагировать на линию.
    • Для точной настройки датчиков можно использовать специальный проект "Датчик линии", в котором подробно описан процесс настройки чувствительности датчиков. Обратитесь к этому проекту для получения более детальной информации.
  2. Тестирование и корректировка:

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

Пример кода

// Подключаем библиотеку
#include <AlashMotorControlX2.h>
// Определение пинов для моторов
const unsigned int PIN_FORWARD_LEFT = 9;
const unsigned int PIN_BACKWARD_LEFT = 8;
const unsigned int PIN_ENABLE_LEFT = 10;
const unsigned int PIN_FORWARD_RIGHT = 7;
const unsigned int PIN_BACKWARD_RIGHT = 6;
const unsigned int PIN_ENABLE_RIGHT = 5;
// Инициализация двух моторов
AlashMotorControlX2 motors(PIN_FORWARD_LEFT, PIN_BACKWARD_LEFT, PIN_ENABLE_LEFT, PIN_FORWARD_RIGHT, PIN_BACKWARD_RIGHT, PIN_ENABLE_RIGHT);
// Определение состояний робота
#define STATE_FORWARD    0
#define STATE_RIGHT      1
#define STATE_LEFT       2
#define STATE_SUPER_RIGHT 3
#define STATE_SUPER_LEFT  4
#define STATE_STOP       5
int state = STATE_FORWARD; // Начальное состояние робота - движение вперед
int SpeedAll = 80; // Базовая скорость
int SuperTurnSpeedAll = 150; // Скорость для резких поворотов
int TurnSpeedAll = 100; // Скорость для обычных поворотов
boolean right = false; // Флаг правого датчика
boolean left = false; // Флаг левого датчика
boolean Sright = false; // Флаг центрального правого датчика
boolean Sleft = false; // Флаг центрального левого датчика
void setup() {
  Serial.begin(9600);  // Инициализация последовательного порта для отображения информации
  while (!Serial) {    // Ожидание открытия Serial Monitor
    // ничего не делаем
  }
  motors.setSpeed(SpeedAll);  // Установка начальной скорости для обоих моторов
  pinMode(2, INPUT); // Устанавливаем пин 2 как вход для левого датчика
  pinMode(3, INPUT); // Устанавливаем пин 3 как вход для центрального левого датчика
  pinMode(4, INPUT); // Устанавливаем пин 4 как вход для центрального правого датчика
  pinMode(12, INPUT); // Устанавливаем пин 12 как вход для правого датчика
}
void loop() {
  if (digitalRead(2) == HIGH) Sleft = true; // Читаем состояние левого датчика
  else Sleft = false;
  if (digitalRead(3) == HIGH) left = true; // Читаем состояние центрального левого датчика
  else left = false;
  if (digitalRead(4) == HIGH) right = true; // Читаем состояние центрального правого датчика
  else right = false;
  if (digitalRead(12) == HIGH) Sright = true; // Читаем состояние правого датчика
  else Sright = false;
  int targetState; // Переменная для хранения целевого состояния робота
  if (left == right && Sleft == Sright) targetState = STATE_FORWARD; // Если все датчики одинаковы, едем вперед
  else if (left) targetState = STATE_LEFT; // Если левый датчик активен, поворот налево
  else if (right) targetState = STATE_RIGHT; // Если правый датчик активен, поворот направо
  else if (Sleft) targetState = STATE_SUPER_LEFT; // Если центральный левый датчик активен, резкий поворот налево
  else if (Sright) targetState = STATE_SUPER_RIGHT; // Если центральный правый датчик активен, резкий поворот направо
  else targetState = STATE_FORWARD; // В остальных случаях едем вперед
  Serial.println(targetState); // Выводим текущее состояние в Serial Monitor
  if (state == targetState) return; // Если текущее состояние равно целевому, ничего не делаем
  switch (targetState) {
    case STATE_FORWARD:
      forward();
      Serial.println("F");
      break;
    case STATE_RIGHT:
      rightTurn();
      Serial.println("R");
      break;
    case STATE_LEFT:
      leftTurn();
      Serial.println("L");
      break;
    case STATE_SUPER_RIGHT:
      superRightTurn();
      Serial.println("SR");
      break;
    case STATE_SUPER_LEFT:
      superLeftTurn();
      Serial.println("SL");
      break;
    case STATE_STOP:
      stopMotors();
      Serial.println("S");
      break;
  }
  delay(50); // Небольшая задержка перед следующим циклом
}
void forward() {
  state = STATE_FORWARD; // Устанавливаем состояние робота как движение вперед
  motors.setSpeed(SpeedAll); // Устанавливаем скорость для обоих моторов
  motors.forward(); // Запускаем движение вперед
}
void leftTurn() {
  state = STATE_LEFT; // Устанавливаем состояние робота как поворот налево
  motors.setSpeedA(SpeedAll + TurnSpeedAll); // Устанавливаем скорость для левого мотора
  motors.setSpeedB(SpeedAll + TurnSpeedAll); // Устанавливаем скорость для правого мотора
  motors.backwardA(); // Левый мотор движется назад
  motors.forwardB(); // Правый мотор движется вперед
}
void rightTurn() {
  state = STATE_RIGHT; // Устанавливаем состояние робота как поворот направо
  motors.setSpeedA(SpeedAll + TurnSpeedAll); // Устанавливаем скорость для левого мотора
  motors.setSpeedB(SpeedAll + TurnSpeedAll); // Устанавливаем скорость для правого мотора
  motors.forwardA(); // Левый мотор движется вперед
  motors.backwardB(); // Правый мотор движется назад
}
void superLeftTurn() {
  state = STATE_SUPER_LEFT; // Устанавливаем состояние робота как резкий поворот налево
  motors.setSpeedA(SpeedAll + SuperTurnSpeedAll); // Устанавливаем скорость для левого мотора
  motors.setSpeedB(SpeedAll + SuperTurnSpeedAll); // Устанавливаем скорость для правого мотора
  motors.backwardA(); // Левый мотор движется назад
  motors.forwardB(); // Правый мотор движется вперед
}
void superRightTurn() {
  state = STATE_SUPER_RIGHT; // Устанавливаем состояние робота как резкий поворот направо
  motors.setSpeedA(SpeedAll + SuperTurnSpeedAll); // Устанавливаем скорость для левого мотора
  motors.setSpeedB(SpeedAll + SuperTurnSpeedAll); // Устанавливаем скорость для правого мотора
  motors.forwardA(); // Левый мотор движется вперед
  motors.backwardB(); // Правый мотор движется назад
}
void stopMotors() {
  state = STATE_STOP; // Устанавливаем состояние робота как остановка
  motors.stop(); // Останавливаем оба мотора
}

Заключение

Этот проект позволяет создать робота, который следует за линией и выполняет различные виды поворотов, используя четыре датчика линии и библиотеку AlashMotorControlX2 для управления моторами. Важно правильно настроить чувствительность датчиков линии и отрегулировать скорость робота, чтобы он мог корректно следовать за линией. Для более детальной информации по настройке датчиков линии обратитесь к проекту "Датчик линии". Экспериментируйте с настройками и компонентами, чтобы убедиться, что робот работает корректно и следует за линией.

Предзаказ
Предзаказ успешно отправлен!
Имя *
Телефон *
Добавить в корзину
Название товара
100 тг
1 шт.
Перейти в корзину
Обратный звонок
Запрос успешно отправлен!
Имя *
Телефон *
Заказ в один клик
С помощью уведомлений о заказе можно не только получать актуальную информацию по заказу, но и иметь быстрый канал связи с магазином