Проект 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, выполните следующие шаги:
Скачайте библиотеки с официального сайта или из репозитория GitHub: - AlashUltrasonic - AlashMotorControl
Откройте программу Arduino IDE и перейдите в меню «Скетч» → «Подключить библиотеку» → «Добавить .ZIP библиотеку…».
В открывшемся окне выберите скачанный .zip файл и нажмите «Открыть».
Внизу Arduino IDE появится сообщение «Библиотека добавлена. Проверьте меню «Подключить библиотеку»».
Теперь библиотека будет доступна для использования в ваших проектах.
Пример кода
#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 градусов, если оба пути заблокированы.
Алгоритм работы
Робот работает по следующему алгоритму:
Движение вперед - робот движется вперед, пока не обнаружит препятствие
Обнаружение препятствия - ультразвуковой датчик определяет расстояние до препятствия
Остановка и движение назад - робот останавливается и отъезжает назад
Сканирование пространства - серво поворачивает датчик влево и вправо для измерения расстояний
Выбор направления - робот выбирает направление с большим свободным пространством
Поворот - робот поворачивает в выбранном направлении
Повторение - цикл повторяется
Результат работы
После загрузки кода робот будет:
Двигаться вперед, пока не обнаружит препятствие
Останавливаться и отъезжать назад при обнаружении препятствия
Сканировать пространство слева и справа
Поворачивать в сторону с большим свободным пространством
Продолжать движение в новом направлении
Полезная информация
Ультразвуковые датчики: Ультразвуковые датчики, такие как HC-SR04, позволяют точно измерять расстояние до объектов и избегать препятствий. Они отправляют ультразвуковые волны и измеряют время их отражения, что позволяет определять расстояние до объекта с высокой точностью.
Библиотека AlashUltrasonic: Эта библиотека упрощает работу с ультразвуковыми датчиками, предоставляя удобные функции для получения расстояния. Она абстрагирует детали работы с датчиком, позволяя разработчикам сосредоточиться на логике приложения.
Библиотека AlashMotorControlLite: Эта библиотека упрощает управление моторами, предоставляя функции для управления скоростью и направлением вращения моторов. Она поддерживает различные режимы управления и позволяет легко интегрировать управление моторами в проекты на базе Arduino.
Серво: Серво используется для поворота ультразвукового датчика, что позволяет роботу сканировать пространство перед собой и определять наилучший путь для объезда препятствий.
Оптимизация работы: Вы можете экспериментировать с настройками скорости, времени поворота и расстояния, чтобы оптимизировать работу робота для конкретных задач и условий. Например, вы можете настроить пороговые значения расстояний для более точного управления движением робота.
Настройка параметров
Для оптимизации работы робота можно изменить следующие параметры:
Безопасное расстояние: Измените SAFE_DISTANCE для настройки расстояния обнаружения препятствий
Скорость движения: Измените MOTOR_SPEED для регулировки скорости робота
Время движения назад: Измените BACKWARD_TIME для настройки времени отъезда назад
Угол сканирования: Измените SCAN_ANGLE для настройки диапазона сканирования
Время поворота: Измените delay(500) в функциях поворота для точной настройки
Заключение
Этот проект позволяет создать робота, собранного из набора 4WD Smart Car Kit, который объезжает препятствия, используя ультразвуковой датчик и серво для сканирования пространства. Это отличная возможность для изучения основ робототехники, работы с датчиками и управления моторами на базе Arduino.
Вы можете продолжить улучшать и модифицировать этот проект, добавляя новые функции и возможности, такие как более сложные алгоритмы избегания препятствий или использование дополнительных датчиков для повышения точности и функциональности робота.
Экспериментируйте с различными настройками и компонентами, чтобы убедиться, что робот работает корректно. Этот проект предоставляет прочную основу для дальнейшего развития и исследований в области робототехники.