Проект 10: Робот, который объезжает препятствия

Этот проект основан на роботе, собранном из набора 4WD Smart Car Kit, который будет объезжать препятствия с помощью ультразвукового датчика и серво. Используя библиотеки AlashUltrasonic и AlashMotorControlLite, мы упростим управление датчиком и моторами для выполнения этой задачи. Робот сможет обнаруживать препятствия, сканировать окружающее пространство и объезжать их, что позволяет проверить правильность сборки и работоспособность датчиков.

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

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

Необходимые компоненты

  • Arduino Uno

  • Ультразвуковой датчик HC-SR04

  • Серво SG90

  • Модуль драйвера двигателя L298N

  • 2 DC мотора

  • Источник питания

  • Шасси робота с колесами

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

Подключение ультразвукового датчика:

  • VCC → 5V Arduino

  • GND → GND Arduino

  • TRIG → пин A1

  • ECHO → пин A0

Подключение серво:

  • VCC → 5V Arduino

  • GND → GND Arduino

  • Signal → пин 11

Подключение модуля L298N:

  • ENA → пин 10 (управление скоростью левого мотора)

  • IN1 → пин 9 (направление левого мотора)

  • IN2 → пин 8 (направление левого мотора)

  • IN3 → пин 7 (направление правого мотора)

  • IN4 → пин 6 (направление правого мотора)

  • ENB → пин 5 (управление скоростью правого мотора)

  • VCC → 5V Arduino

  • GND → GND Arduino

  • VM → внешний источник питания

Установка библиотек

Чтобы подключить библиотеки для Arduino, выполните следующие шаги:

  1. Скачайте библиотеки с официального сайта или из репозитория GitHub: - AlashUltrasonic - AlashMotorControl

  2. Откройте программу Arduino IDE и перейдите в меню «Скетч» → «Подключить библиотеку» → «Добавить .ZIP библиотеку…».

  3. В открывшемся окне выберите скачанный .zip файл и нажмите «Открыть».

  4. Внизу Arduino IDE появится сообщение «Библиотека добавлена. Проверьте меню «Подключить библиотеку»».

  5. Теперь библиотека будет доступна для использования в ваших проектах.

Пример кода

#include <AlashUltrasonic.h> // Библиотека для ультразвукового датчика
#include <Servo.h> // Библиотека для сервопривода

// Пины для ультразвукового датчика
const uint8_t TRIGGER_PIN = A1;
const uint8_t ECHO_PIN = A0;
AlashUltrasonic sensor(TRIGGER_PIN, ECHO_PIN);

// Подключаем библиотеку
#include <AlashMotorControlX2.h>
#include <AlashMotorDriverType.h> // Подключаем для использования DRIVER_TA6586

// Определение пинов для моторов TA6586
// ВАЖНО: Для TA6586 пины IN1 и IN2 ДОЛЖНЫ быть PWM-пинами!
// Пример для Arduino Uno/Nano (PWM пины: 3, 5, 6, 9, 10, 11)

// Мотор A - Левый мотор
const unsigned int PIN_IN1_A = 9; // Пин IN1 для левого мотора (PWM)
const unsigned int PIN_IN2_A = 10; // Пин IN2 для левого мотора (PWM)
// Пин Enable НЕ используется для TA6586

// Мотор B - Правый мотор
const unsigned int PIN_IN1_B = 5; // Пин IN1 для правого мотора (PWM)
const unsigned int PIN_IN2_B = 6; // Пин IN2 для правого мотора (PWM)
// Пин Enable НЕ используется для TA6586

// Инициализация двух моторов для драйвера TA6586
// Используем конструктор без пинов Enable и указываем тип драйвера
AlashMotorControlX2 motors(PIN_IN1_A, PIN_IN2_A, // Пины мотора A
                           PIN_IN1_B, PIN_IN2_B, // Пины мотора B
                           DRIVER_TA6586, // Тип драйвера для мотора A
                           DRIVER_TA6586); // Тип драйвера для мотора B

// Пин для серво
const uint8_t SERVO_PIN = 11;
Servo servo;

// Константы
const float SAFE_DISTANCE = 20.0; // Безопасное расстояние в см
const int MOTOR_SPEED = 255; // Скорость вращения моторов (0-255 для ШИМ)
const int BACKWARD_TIME = 700; // Время движения назад в мс
const int SCAN_ANGLE = 90; // Угол для проверки препятствий (половина полного угла сканирования)

void setup() {
  Serial.begin(9600);
  sensor.begin();
  servo.attach(SERVO_PIN);
  servo.write(90); // Установим серво в центральное положение

  // Инициализация моторов - используем stop()
  motors.stop();

  delay(500); // Небольшая пауза для инициализации всего
}

void loop() {
  float distance = sensor.getDistance();
  Serial.print("Distance: ");
  Serial.print(distance);
  Serial.println(" cm");

  if (distance < SAFE_DISTANCE && distance > 0) { // Проверка на препятствие и валидность данных
    avoidObstacle();
  } else {
    moveForward();
  }
  delay(100); // Задержка между циклами
}

// Функция движения вперед
void moveForward() {
  motors.setSpeed(MOTOR_SPEED);
  motors.forward();
}

// Функция движения назад
void moveBackward() {
  motors.setSpeed(MOTOR_SPEED);
  motors.backward();
  delay(BACKWARD_TIME);
  stopMotors();
}

// Функция остановки моторов
void stopMotors() {
  motors.HardStop();
}

// Функция поворота направо
void turnRight() {
  motors.setSpeed(MOTOR_SPEED);
  motors.forwardB();
  motors.backwardA();
  delay(500); // Подбирайте время поворота
  stopMotors();
}

// Функция поворота налево
void turnLeft() {
  motors.setSpeed(MOTOR_SPEED);
  motors.forwardA();
  motors.backwardB();
  delay(500); // Подбирайте время поворота
  stopMotors();
}

// Функция сканирования расстояния под заданным углом
float scanDistance(int angle) {
  servo.write(angle);
  delay(1000);
  float dist = sensor.getDistance();
  delay(500);
  return dist;
}

// Функция объезда препятствия (логика не изменена)
void avoidObstacle() {
  stopMotors();
  moveBackward();

  float distanceRight = scanDistance(90 - SCAN_ANGLE);
  Serial.print("Scan Right (");
  Serial.print(90 - SCAN_ANGLE);
  Serial.print(" deg): ");
  Serial.println(distanceRight);

  float distanceLeft = scanDistance(90 + SCAN_ANGLE);
  Serial.print("Scan Left (");
  Serial.print(90 + SCAN_ANGLE);
  Serial.print(" deg): ");
  Serial.println(distanceLeft);

  servo.write(90);
  delay(300);

  if (distanceRight > distanceLeft) {
    Serial.println("Turning Right (fallback)");
    turnRight();
  } else if (distanceLeft > distanceRight) {
    Serial.println("Turning Left (fallback)");
    turnLeft();
  }
}

Описание кода

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

Инициализация пинов: Определены пины для ультразвукового датчика, моторов и серво.

Константы: Определены константы для безопасного расстояния, скорости моторов, времени движения назад и угла сканирования.

Функция setup: Инициализация серийного порта, ультразвукового датчика, серво и установка начальных скоростей моторов.

Основной цикл loop: В цикле считывается расстояние до препятствия. Если расстояние меньше безопасного, вызывается функция для объезда препятствия, иначе робот движется вперед.

Функции для движения и маневров: Определены функции для движения вперед, назад, остановки, поворота направо и налево.

Функция scanDistance: Поворачивает серво на заданный угол и считывает расстояние до препятствия.

Функция avoidObstacle: Робот отъезжает назад, сканирует расстояние справа и слева, поворачивает в сторону, где больше свободного пространства, или поворачивается на 180 градусов, если оба пути заблокированы.

Алгоритм работы

Робот работает по следующему алгоритму:

  1. Движение вперед - робот движется вперед, пока не обнаружит препятствие

  2. Обнаружение препятствия - ультразвуковой датчик определяет расстояние до препятствия

  3. Остановка и движение назад - робот останавливается и отъезжает назад

  4. Сканирование пространства - серво поворачивает датчик влево и вправо для измерения расстояний

  5. Выбор направления - робот выбирает направление с большим свободным пространством

  6. Поворот - робот поворачивает в выбранном направлении

  7. Повторение - цикл повторяется

Результат работы

После загрузки кода робот будет:

  • Двигаться вперед, пока не обнаружит препятствие

  • Останавливаться и отъезжать назад при обнаружении препятствия

  • Сканировать пространство слева и справа

  • Поворачивать в сторону с большим свободным пространством

  • Продолжать движение в новом направлении

Полезная информация

Ультразвуковые датчики: Ультразвуковые датчики, такие как HC-SR04, позволяют точно измерять расстояние до объектов и избегать препятствий. Они отправляют ультразвуковые волны и измеряют время их отражения, что позволяет определять расстояние до объекта с высокой точностью.

Библиотека AlashUltrasonic: Эта библиотека упрощает работу с ультразвуковыми датчиками, предоставляя удобные функции для получения расстояния. Она абстрагирует детали работы с датчиком, позволяя разработчикам сосредоточиться на логике приложения.

Библиотека AlashMotorControlLite: Эта библиотека упрощает управление моторами, предоставляя функции для управления скоростью и направлением вращения моторов. Она поддерживает различные режимы управления и позволяет легко интегрировать управление моторами в проекты на базе Arduino.

Серво: Серво используется для поворота ультразвукового датчика, что позволяет роботу сканировать пространство перед собой и определять наилучший путь для объезда препятствий.

Оптимизация работы: Вы можете экспериментировать с настройками скорости, времени поворота и расстояния, чтобы оптимизировать работу робота для конкретных задач и условий. Например, вы можете настроить пороговые значения расстояний для более точного управления движением робота.

Настройка параметров

Для оптимизации работы робота можно изменить следующие параметры:

  • Безопасное расстояние: Измените SAFE_DISTANCE для настройки расстояния обнаружения препятствий

  • Скорость движения: Измените MOTOR_SPEED для регулировки скорости робота

  • Время движения назад: Измените BACKWARD_TIME для настройки времени отъезда назад

  • Угол сканирования: Измените SCAN_ANGLE для настройки диапазона сканирования

  • Время поворота: Измените delay(500) в функциях поворота для точной настройки

Заключение

Этот проект позволяет создать робота, собранного из набора 4WD Smart Car Kit, который объезжает препятствия, используя ультразвуковой датчик и серво для сканирования пространства. Это отличная возможность для изучения основ робототехники, работы с датчиками и управления моторами на базе Arduino.

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

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