3.14.md


ДВИЖЕНИЕ С КОНТРОЛЕМ ПРЕПЯТСТВИЙ

РОБОТЕЛЕЖКА — это простейшая платформа на колесах. Два колеса ведущих (закреплены на валах двигателей) и одно пассивное с возможность поворота на 360 градусов.

Рисунок 1

НАПОМИНАНИЕ При использовании внешнего питания сначала подключаем внешнее питание, а потом USB-кабель для связи или программирования. При выключении все делаем наоборот: сначала вытаскиваем USB-кабель, а затем внешнее питание. Несоблюдение данного правила может привести к выходу из строя платы Рудирон.

В предыдущем уроке мы научили тележку обнаруживать препятствия на своем пути на расстоянии меньше 20 см и пытаться их объезжать. Алгоритм был очень простой. Мы поворачивали тележку вправо и измеряли повторно расстояние. Если расстояние было больше 20 см, то мы ехали прямо. Это простейший алгоритм. Добавим к нашей тележке управление сервоприводом так как на нем крепится наш ультразвуковой датчик.

Рисунок 1

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

Рисунок 1

Когда до препятствия 1 станет меньше расстояние чем 20 см тележка остановится. Дальше мы с помощью серво поворачиваем ультразвуковой датчик на 45 градусов вправо и измеряем расстояние. Затем мы поворачиваем ультразвуковой датчик на 45 градусов влево и так же измеряем расстояние. Затем сравниваем и поворачиваем тележку в ту сторону, где большее расстояние и оно превышает 20 сантиметров.

Таким образом применяя сервопривод, мы делаем маршрут роботележки более оптимальным.

Рисунок 1

Представим общий алгоритм передвижения нашей роботележки в виде графической блок схемы:

Рисунок 1

Перед реализацией программы выполним подключение всех компонентов роботележки.

Рисунок 1

Подача питания на мотор:

1 Питание от контроллера. Не рекомендуется так как может выйти из строя стабилизатор питания контроллера! Хотя это маловероятно, так как на плате установлен самовосстанавливающийся предохранитель, но все же не стоит рисковать.

Рисунок 1

2 Питание мотора от внешнего источника. Рекомендуемый вариант подключения.

Рисунок 1

Для управления двигателем необходимо задать направление вращения двигателя и скорость вращения.

Рисунок 1

Вход модуля Назначение Значения
GND Общая шина земли Подсоединяем к контактам контроллера с обозначением земли
VСС Шина питания от контроллера Подсоединяем к контактам контроллера с обозначением +5 В
TRIG Вход для генерации ультразвуковых импульсов на излучение датчика Подается логическая единица длительностью 10 мс (одиночный импульс)
ECHO Выход в виде импульса пропорционально дистанции до препятствия Длина импульса от 150 мкс – 3 см дистанция до 25 мс – 4 метра дистанция

TRIG – подключаем к выводу 31 контроллера «Рудирон»

ECHO – подключаем к выводу 32 контроллера «Рудирон»

Рисунок 1

Вход модуля Назначение Значения
Коричневый провод Земля 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); // установка необходимого угла с временной задержкой

Рисунок 1

Создаем файл с реализацией, объявленных функций servo_telegka.cpp:

Рисунок 1

#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. Какие новые функции мы разработали? Их назначение?
  2. Что необходимо для проведения поверки на наличие препятствия?
  3. По какому принципу работает сервопривод? Подсказка: Вспомните урок «Управление сервоприводом».
  4. По какому принципу работает ультразвуковой датчик? Подсказка: Вспомните урок «Измерение расстояний с помощью ультразвукового датчика».
  5. Можно было бы не писать отдельно функции из п.1? И какой результат был в этом случае?
  6. Что произойдет, если проводить анализ только расстояния до препятствия по прямой? Будет ли результат работы такой программы оптимальным?
  7. Что будет результатом выполнения программы?
  8. Для чего необходима функция servo_setup()?
  9. Для чего необходима функция servo_angle() и какие параметры ей передаются?
  10. Можно ли использовать при анализе данных от ультразвукового датчика другое расстояние? И что от этого может измениться в движении роботележки?

СПИСОК ДОПОЛНИТЕЛЬНЫХ ЗАДАЧ

  1. Использовать для написания программы среду Arduino IDE.
  2. Написать программу с увеличением расстояния до препятствия по ходу движения.
  3. Написать программу с уменьшением расстояния до препятствия по ходу движения.

ЭЛЕМЕНТЫ КОНТРОЛЯ И ПРОВЕДЕНИЯ СОРЕВНОВАНИЙ

  1. Проведение тестирования по контрольным вопросам. Критерии: кто быстрее и допустил меньшее количество ошибок.
  2. Написание одного из трех вариантов (исходный и два варианта из списка дополнительных задач) программы и загрузка этого варианта в контроллер. Критерии: Правильно написанная программа согласно выданного задания, работающий контроллер и наименьшее количество времени затраченного на эти работы.