3.13.md
ВЗАИМОДЕЙСТВИЕ С ОКРУЖАЮЩИМ МИРОМ
РОБОТЕЛЕЖКА — это простейшая платформа на колесах. Два колеса ведущих (закреплены на валах двигателей) и одно пассивное с возможность поворота на 360 градусов.
НАПОМИНАНИЕ При использовании внешнего питания сначала подключаем внешнее питание, а потом USB-кабель для связи или программирования. При выключении все делаем наоборот: сначала вытаскиваем USB-кабель, а затем внешнее питание. Несоблюдение данного правила может привести к выходу из строя платы Рудирон.
Любой робот должен обладать возможностью взаимодействовать с окружающим миром. Такое взаимодействие происходит посредством датчиков.
Датчики — устройства преобразующие различные физические явления (световой поток, температура, давление, скорость воздуха и т.д.) в электрические сигналы (ток, напряжение, частоту, сопротивление).
Датчики не измеряют, а преобразовывают!
Добавим к нашей роботележке ультразвуковой датчик для определения расстояний до препятствий на ее пути. Теперь при движении мы будем контролировать какое расстояние у нас до препятствия и изменять траекторию движения с целью избегания столкновения.
Реализуем простой алгоритм работы нашего мобильного робота. Будем двигаться по прямой линии и при появлении препятствия остановим тележку. Алгоритм очень простой.
В схему подключения добавляется ультразвуковой датчик, а подключение моторов у нас не изменяется:
Подача питания на мотор:
1 Питание от контроллера. Не рекомендуется так как может выйти из строя стабилизатор питания контроллера! Хотя это маловероятно, так как на плате установлен самовосстанавливающийся предохранитель, но все же не стоит рисковать.
2 Питание мотора от внешнего источника. Рекомендуемый вариант подключения.
Для управления двигателем необходимо задать направление вращения двигателя и скорость вращения.
Вход модуля | Назначение | Значения |
---|---|---|
GND | Общая шина земли | Подсоединяем к контактам контроллера с обозначением земли |
VСС | Шина питания от контроллера | Подсоединяем к контактам контроллера с обозначением +5 В |
TRIG | Вход для генерации ультразвуковых импульсов на излучение датчика | Подается логическая единица длительностью 10 мс (одиночный импульс) |
ECHO | Выход в виде импульса пропорционально дистанции до препятствия | Длина импульса от 150 мкс – 3 см дистанция до 25 мс – 4 метра дистанция |
TRIG — подключаем к выводу 31 контроллера «Рудирон»
ECHO — подключаем к выводу 31 контроллера «Рудирон»
Создаем отдельный заголовочный файл ultrasonic.h. В нем прописываем к каким выводам контроллера подключаем ультразвуковой датчик и объявляем 2 функции:
// Задаем номерам портов для подключения ультразвукового датчика
#define HCSR04_TRIG_PIN 31
#define HCSR04_ECHO_PIN 32
void ultrasonic_setup(); // инициализация ультразвукового датчика
float ultrasonic_distance(); // измерение расстояния
Создаем файл с реализацией, объявленных функций ultrasonic.cpp:
#include “Arduino.h”
#include “ultrasonic.h”
void ultrasonic_setup()
{
// Устанавливаем режим работы портов TRIG на выход и Echo на вход
pinMode(HCSR04_TRIG_PIN, OUTPUT);
pinMode(HCSR04_ECHO_PIN, INPUT);
}
float ultrasonic_distance() // измеряем расстояние и переводим его в сантиметры
{
// Генерируем импульс 10 мкс на выходе TRIG
digitalWrite(HCSR04_TRIG_PIN, LOW); // выход в 0
delayMicroseconds(5); // пауза на 5 мкс
digitalWrite(HCSR04_TRIG_PIN, HIGH); // подача единицы на выход TRIG
delayMicroseconds(10); // Пауза 10 мкс В этот момент датчик будет посылать сигналы с частотой 40 КГц.
digitalWrite(HCSR04_TRIG_PIN, LOW); // Выход TRIG в ноль импульс в 10 мкс завершен
//Время задержки акустического сигнала на эхолокаторе.
int duration = pulseIn(HCSR04_ECHO_PIN, HIGH); // считываем длительность импульса
float distance = (duration / 2) / 29.1; // рассчитываем расстояние в сантиметрах
return distance;
}
После создания фалов проекта, отвечающих за работу с ультразвуковым датчиком, пишем основной текст программы по заданному нами выше алгоритму:
#include “Arduino.h”
#include “drive.h”
#include “ultrasonic.h”
void setup()
{
pinMode(BUTTON_BUILTIN_1, INPUT_PULLDOWN);
ultrasonic_setup();
drive_init();
// вызываем функцию из drive.cpp по начальной настройке двигателей - движение вперед и нулевая скорость
}
bool btnState; // создаем переменную для хранения состояния нажатия кнопки true или false
void loop()
{
stop_telegka(10); // останавливаем тележку
if (ultrasonic_distance()>20.00) // измеряем расстояние и определяем расстояние
{
forward_telegka(70,1000); // двигаемся прямо
}
else {
stop_telegka(3000); // если расстояние меньше 20 см то останавливаемся
}
}
Записываем программу в контроллер и проверяем как движется наша тележка. Если перед ней нет препятствия ближе 20 см она едет вперед. Как только возникаем какой-то объект на пути ближе, чем 20 сантиметров тележка останавливается. Немного усложним задачу и заставим тележку искать новый путь.
При появлении препятствия тележка останавливается. Затем она поворачивается вправо и измеряет расстояние если расстояние стало больше она едет прямо если нет, она опять поворачивает и так далее.
Текст программы изменится минимально:
#include “Arduino.h”
#include “drive.h”
#include “ultrasonic.h”
void setup()
{
pinMode(BUTTON_BUILTIN_1, INPUT_PULLDOWN);
ultrasonic_setup();
drive_init(); // вызываем функцию из drive.cpp по начальной настройке двигателей - движение вперед и нулевая скорость
}
bool btnState; // создаем переменную для хранения состояния нажатия кнопки true или false
void loop()
{
stop_telegka(10); // останавливаем тележку
if (ultrasonic_distance()>20.00) // измеряем расстояние и определяем расстояние
{
forward_telegka(70,1000); // двигаемся прямо
}
else {
stop_telegka(2000); // если расстояние меньше 20 см то останавливаемся
rotation_telegka(RIGHT_ROTATION,70,1300);
}
}
Тележка при появлении препятствия ближе 20 см будет делать поворот вправо в течении 1.3 секунды и если после поворота расстояние станет больше 20 см начнет снова двигаться вперед.
ПРИМЕЧАНИЕ Если Вы хотите выполнять программу при последующих включениях «Рудирона», то не забудьте переставить перемычку из положения «Режим программирования» обратно в «Режим выполнения». Если этого не сделать, то программа при включении «Рудирона» выполняться не будет.
ВЫВОДЫ
Мы научились программировать ультразвуковой датчик, поняли принцип его работы, написали библиотеку, содержащую функции работы с ультразвуковым датчиком.
СПИСОК КОНТРОЛЬНЫХ ВОПРОСОВ
- С какими целями новые функции управления добавляются в отдельную библиотеку, а не в основную программу?
- Какие новые функции мы разработали? Их назначение?
- Что необходимо для проведения поверки на наличие препятствия?
- Что надо исправить для увеличения дистанции проверки наличия препятствий?
- Что надо исправить для уменьшения дистанции проверки наличия препятствий?
- Что надо исправить для выполнения поворота налево при появлении препятствия по ходу движения?
- Что надо исправить для изменения угла поворота роботележки при появлении препятствия?
- По какому принципу работает ультразвуковой датчик? Подсказка: Вспомните урок «Измерение расстояний с помощью ультразвукового датчика».
- Можно было бы не писать отдельно функции из п.2? И какой результат был в этом случае?
- Что будет результатом выполнения программы?
СПИСОК ДОПОЛНИТЕЛЬНЫХ ЗАДАЧ
Проведение тестирования по контрольным вопросам. Критерии: кто быстрее и допустил меньшее количество ошибок.
Написание одного из трех вариантов (исходный и два варианта из списка дополнительных задач) программы и загрузка этого варианта в контроллер. Критерии: Правильно написанная программа согласно выданного задания, работающий контроллер и наименьшее количество времени затраченного на эти работы.