3.14.md
ДВИЖЕНИЕ С КОНТРОЛЕМ ПРЕПЯТСТВИЙ
РОБОТЕЛЕЖКА — это простейшая платформа на колесах. Два колеса ведущих (закреплены на валах двигателей) и одно пассивное с возможность поворота на 360 градусов.
НАПОМИНАНИЕ При использовании внешнего питания сначала подключаем внешнее питание, а потом USB-кабель для связи или программирования. При выключении все делаем наоборот: сначала вытаскиваем USB-кабель, а затем внешнее питание. Несоблюдение данного правила может привести к выходу из строя платы Рудирон.
В предыдущем уроке мы научили тележку обнаруживать препятствия на своем пути на расстоянии меньше 20 см и пытаться их объезжать. Алгоритм был очень простой. Мы поворачивали тележку вправо и измеряли повторно расстояние. Если расстояние было больше 20 см, то мы ехали прямо. Это простейший алгоритм. Добавим к нашей тележке управление сервоприводом так как на нем крепится наш ультразвуковой датчик.
Так как ультразвуковой датчик установлен на вале сервопривода мы можем поворачивать его в разные стороны, чтобы измерить расстояние слева и справа от препятствия и поворачивать затем тележку в ту сторону, где большее свободное расстояние.
Когда до препятствия 1 станет меньше расстояние чем 20 см тележка остановится. Дальше мы с помощью серво поворачиваем ультразвуковой датчик на 45 градусов вправо и измеряем расстояние. Затем мы поворачиваем ультразвуковой датчик на 45 градусов влево и так же измеряем расстояние. Затем сравниваем и поворачиваем тележку в ту сторону, где большее расстояние и оно превышает 20 сантиметров.
Таким образом применяя сервопривод, мы делаем маршрут роботележки более оптимальным.
Представим общий алгоритм передвижения нашей роботележки в виде графической блок схемы:
Перед реализацией программы выполним подключение всех компонентов роботележки.
Подача питания на мотор:
1 Питание от контроллера. Не рекомендуется так как может выйти из строя стабилизатор питания контроллера! Хотя это маловероятно, так как на плате установлен самовосстанавливающийся предохранитель, но все же не стоит рисковать.
2 Питание мотора от внешнего источника. Рекомендуемый вариант подключения.
Для управления двигателем необходимо задать направление вращения двигателя и скорость вращения.
Вход модуля | Назначение | Значения |
---|---|---|
GND | Общая шина земли | Подсоединяем к контактам контроллера с обозначением земли |
VСС | Шина питания от контроллера | Подсоединяем к контактам контроллера с обозначением +5 В |
TRIG | Вход для генерации ультразвуковых импульсов на излучение датчика | Подается логическая единица длительностью 10 мс (одиночный импульс) |
ECHO | Выход в виде импульса пропорционально дистанции до препятствия | Длина импульса от 150 мкс – 3 см дистанция до 25 мс – 4 метра дистанция |
TRIG – подключаем к выводу 31 контроллера «Рудирон»
ECHO – подключаем к выводу 32 контроллера «Рудирон»
Вход модуля | Назначение | Значения |
---|---|---|
Коричневый провод | Земля Ground | Подключается к порту GND на плате |
Красный провод | Питание +5 V | Подключается к порту 5V на плате |
Желтый провод | Сигнал управления | Подключается к цифровому порту работающий в режиме ШИМ (PWM) |
Сигнал управления — подключаем к выводу 5 контроллера «Рудирон», так как он позволяет генерировать сигнал ШИМ.
Создаем отдельный заголовочный файл servo_telegka.h. В нем прописываем к каким выводам контроллера подключаем ультразвуковой датчик и объявляем 2 функции:
#define SERVO_PIN 5 // даем имя порту 5 по управлению сервоприводом
void servo_setup(); // инициализация шима для управления серовприводом
void servo_angle( int angle, int delay_ms); // установка необходимого угла с временной задержкой
Создаем файл с реализацией, объявленных функций servo_telegka.cpp:
#define SERVO_PIN 5 // даем имя порту 5 по управлению сервоприводом
void servo_setup(); // инициализация шима для управления серовприводом
void servo_angle( int angle, int delay_ms); // установка необходимого угла с временной задержкой
#include «Arduino.h»
#include «Servo.h» // подключаем дополнительно программу
// по управлению сервоприводом
#include «servo_telegka.h»
Servo servo; // создаем переменную типа сервопривод
void servo_setup()
{
pinMode(SERVO_PIN, OUTPUT);
servo.attach(SERVO_PIN, 450, 2500); // устанавливаем параметры
// сервопривода
}
void servo_angle(int angle, int delay_ms)
{
servo.write(angle); // устанавливаем необходимый градус поворота оси
// сервопривода
delay(delay_ms);
}
В результате наша основная программа примет вот такой вид:
#include “Arduino.h”
#include “drive.h”
#include “ultrasonic.h”
#include “servo_telegka.h”
void setup()
{
ultrasonic_setup(); // настройка управлением ультразвуковым датчиком
drive_init(); // начальная настройке двигателей
servo_setup(); // настройка управления сервоприводом
stop_telegka(3000); // останавливаем тележку
servo_angle(90,2000);
}
float right_distance; // расстояние справо от препятствия
float left_distance; // расстояние слева от препятствия
void loop()
{
if (ultrasonic_distance()>20.00) // измеряем расстояние и определяем расстояние
{
forward_telegka(70,2000); // двигаемся прямо
}
else {
stop_telegka(1000); // если расстояние меньше 20 см то останавливаемся
servo_angle(45,1300); // поворачиваем на 45 вправо сервопривод
right_distance = ultrasonic_distance(); // измеряем расстояние справа
servo_angle(135,1300); // поворот влево на 45 сервопривод
left_distance = ultrasonic_distance(); // измеряем расстояние слева
servo_angle(90,1300); // устанавливаем сервопривод в нулевое положение
if (right_distance>20.00 && right_distance > left_distance )
{
rotation_telegka(0,70,1300); // поворачиваем тележку влево
}
}
Записываем программу в контроллер и проверяем как движется наша тележка. Если перед ней нет препятствия ближе 20 см она едет вперед. Как только возникаем какой-то объект на пути ближе, чем 20 сантиметров тележка останавливается. Поворачивает сервоприводом ультразвуковой датчик влево на 45,измеряет расстояние до препятствия, затем поворачивает ультразвуковой датчик вправо на 45 (от направления движения роботележки) и тоже проверяет расстояние. После замера расстояния сервопривод возвращает ультразвуковой датчик в нулевое положение. В зависимости от расстояния до препятствия слева или справа роботележка поворачивает в сторону где замеренное расстояние больше. Затем повторяются все действия, начиная с движения вперед.
ПРИМЕЧАНИЕ Если Вы хотите выполнять программу при последующих включениях «Рудирона», то не забудьте переставить перемычку из положения «Режим программирования» обратно в «Режим выполнения». Если этого не сделать, то программа при включении «Рудирона» выполняться не будет.
ВЫВОДЫ
Мы научились программировать движение роботележки с объездом встречающихмя препятствий, написали библиотеку, содержащую функции поворота ультразвукового датчика при помощи сервопривода.
СПИСОК КОНТРОЛЬНЫХ ВОПРОСОВ
- Какие новые функции мы разработали? Их назначение?
- Что необходимо для проведения поверки на наличие препятствия?
- По какому принципу работает сервопривод? Подсказка: Вспомните урок «Управление сервоприводом».
- По какому принципу работает ультразвуковой датчик? Подсказка: Вспомните урок «Измерение расстояний с помощью ультразвукового датчика».
- Можно было бы не писать отдельно функции из п.1? И какой результат был в этом случае?
- Что произойдет, если проводить анализ только расстояния до препятствия по прямой? Будет ли результат работы такой программы оптимальным?
- Что будет результатом выполнения программы?
- Для чего необходима функция servo_setup()?
- Для чего необходима функция servo_angle() и какие параметры ей передаются?
- Можно ли использовать при анализе данных от ультразвукового датчика другое расстояние? И что от этого может измениться в движении роботележки?
СПИСОК ДОПОЛНИТЕЛЬНЫХ ЗАДАЧ
- Использовать для написания программы среду Arduino IDE.
- Написать программу с увеличением расстояния до препятствия по ходу движения.
- Написать программу с уменьшением расстояния до препятствия по ходу движения.
ЭЛЕМЕНТЫ КОНТРОЛЯ И ПРОВЕДЕНИЯ СОРЕВНОВАНИЙ
- Проведение тестирования по контрольным вопросам. Критерии: кто быстрее и допустил меньшее количество ошибок.
- Написание одного из трех вариантов (исходный и два варианта из списка дополнительных задач) программы и загрузка этого варианта в контроллер. Критерии: Правильно написанная программа согласно выданного задания, работающий контроллер и наименьшее количество времени затраченного на эти работы.