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

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

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

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

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

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

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

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

  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 && distanceRight > SAFE_DISTANCE) {
// Serial.println("Turning Right");
// turnRight();
// } else if (distanceLeft > distanceRight && distanceLeft > SAFE_DISTANCE) {
// Serial.println("Turning Left");
// turnLeft();
// } else
if (distanceRight > distanceLeft) {
Serial.println("Turning Right (fallback)");
turnRight();
} else if (distanceLeft > distanceRight) {
Serial.println("Turning Left (fallback)");
turnLeft();
// } else {
// Serial.println("Turning Back (180 deg)");
// turnRight();
// turnRight();
}
// moveForward(); // Можно раскомментировать, если нужно движение вперед после маневра
// delay(300);
}

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

  1. Подключение библиотек: Подключены библиотеки для ультразвукового датчика, серво и управления моторами.
  2. Инициализация пинов: Определены пины для ультразвукового датчика, моторов и серво.
  3. Константы: Определены константы для безопасного расстояния, скорости моторов, времени движения назад и угла сканирования.
  4. Функция setup: Инициализация серийного порта, ультразвукового датчика, серво и установка начальных скоростей моторов.
  5. Основной цикл loop: В цикле считывается расстояние до препятствия. Если расстояние меньше безопасного, вызывается функция для объезда препятствия, иначе робот движется вперед.
  6. Функции для движения и маневров: Определены функции для движения вперед, назад, остановки, поворота направо и налево.
  7. Функция scanDistance: Поворачивает серво на заданный угол и считывает расстояние до препятствия.
  8. Функция avoidObstacle: Робот отъезжает назад, сканирует расстояние справа и слева, поворачивает в сторону, где больше свободного пространства, или поворачивается на 180 градусов, если оба пути заблокированы.

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

  • Ультразвуковые датчики: Ультразвуковые датчики, такие как HC-SR04, позволяют точно измерять расстояние до объектов и избегать препятствий. Они отправляют ультразвуковые волны и измеряют время их отражения, что позволяет определять расстояние до объекта с высокой точностью.
  • Библиотека AlashUltrasonic: Эта библиотека упрощает работу с ультразвуковыми датчиками, предоставляя удобные функции для получения расстояния. Она абстрагирует детали работы с датчиком, позволяя разработчикам сосредоточиться на логике приложения.
  • Библиотека AlashMotorControlLite: Эта библиотека упрощает управление моторами, предоставляя функции для управления скоростью и направлением вращения моторов. Она поддерживает различные режимы управления и позволяет легко интегрировать управление моторами в проекты на базе Arduino.
  • Серво: Серво используется для поворота ультразвукового датчика, что позволяет роботу сканировать пространство перед собой и определять наилучший путь для объезда препятствий.
  • Оптимизация работы: Вы можете экспериментировать с настройками скорости, времени поворота и расстояния, чтобы оптимизировать работу робота для конкретных задач и условий. Например, вы можете настроить пороговые значения расстояний для более точного управления движением робота.

Заключение

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

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

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