3.12.md
ДВИЖЕНИЕ ПО СЛУЧАЙНОЙ ТРАЕКТОРИИ
РОБОТЕЛЕЖКА — это простейшая платформа на колесах. Два колеса ведущих (закреплены на валах двигателей) и одно пассивное с возможность поворота на 360 градусов.
НАПОМИНАНИЕ При использовании внешнего питания сначала подключаем внешнее питание, а потом USB-кабель для связи или программирования. При выключении все делаем наоборот: сначала вытаскиваем USB-кабель, а затем внешнее питание. Несоблюдение данного правила может привести к выходу из строя платы Рудирон.
Движение по определенному маршруту часто встречающаяся задача для современных беспилотных аппаратов. Создадим случайный маршрут для нашей тележки, состоящий из 10 событий, определяющих движение роботележки.
Мы с Вами определили 3 возможных действия – остановка, движение прямо, поворот. Также мы для этих действий определили длительность, скорость и направление.
Нарисуем общий алгоритм движения роботележки:
Схема подключения у нас остается той же, что и в предыдущем уроке. Для повторения приведем данную схему и здесь.
Подача питания на мотор:
1 Питание от контроллера. Не рекомендуется так как может выйти из строя стабилизатор питания контроллера! Хотя это маловероятно, так как на плате установлен самовосстанавливающийся предохранитель, но все же не стоит рисковать.
2 Питание мотора от внешнего источника. Рекомендуемый вариант подключения.
Для управления двигателем необходимо задать направление вращения двигателя и скорость вращения.
Представим в табличном виде какие параметры нам нужны для определенного действия тележки. Мы будем создавать весь набор параметров даже если какое-то действию не требуется весь набор.
Номер события | Действия тележки, 1-стоять 2-вперед, 3-поворот | Направление поворота, 1 -право, 0- лево | Скорость вращения двигателей 70-254 | Время исполнения, 1000-10000 мс |
---|---|---|---|---|
1 | 1 | 1 | 76 | 1300 |
2 | 2 | 0 | 200 | 2700 |
3 | 3 | 0 | 134 | 8654 |
10 | 1 | 1 | 254 | 12345 |
Для хранения маршрута мы будем использовать массивы. В нашем случае требуется двумерный массив из 10 строчек при 4 столбцах в строке.
Long route[10][4]; — создание двумерного массива из 10 строк по 4 столбца в строке.
Для записи в первый столбец третьей строки числа шесть мы вводим код:
route[2][0] = 6;
Для генерации случайных значений используем функцию random();.
Например, при записи:
Long random_number;
Random_number = random(134);
В переменную random_number будет записано случайное число из диапазона от 0 до (134-1).
Например, при записи:
Long random_number;
Random_number = random(50,145);
В переменную random_number будет записано случайное число из диапазона от 50 до (145-1).
В нашем алгоритме есть блок Генерация случайного маршрута.
Представим алгоритм генерации случайного маршрута с учетом хранения точек маршрута в двумерном массиве 10 на 4:
Текст программы, реализующий генерацию случайного маршрута:
long route[10][4]; // массив случайного маршрута что делать, угол поворота, скорость вращения, время действия
for (int x = 0; x < 10; x++) // заносим 10 значений случайного маршрута
{
route[x][0] = random(1,4); // случайное состояние 1 - стоп, 2- вперед, 3- поворот
route[x][1] = random(0,2); // случайное направление поворота 0- лево, 1- право
route[x][2] = random(70,254); // случайная скорость вращения
route[x][3] = random(1000,5000); // случайная задержка на время выполнения действия
}
Для реализации всей программы остается в цикле считывать записанный маршрут и передавать действия контроллеру:
#include “Arduino.h”
#include “drive.h”
void setup()
{
pinMode(BUTTON_BUILTIN_1, INPUT_PULLDOWN);
drive_init(); // вызываем функцию из drive.cpp по начальной настройке
// двигателей - движение вперед и нулевая скорость
}
bool btnState; // создаем переменную для хранения состояния нажатия кнопки
// true или false
long route[10][4]; // массив случайного маршрута что делать, угол поворота,
// скорость вращения, время действия
void loop()
{
stop_telegka(10); // останавливаем тележку
for (int x = 0; x < 10; x++) // заносим 10 значений случайного маршрута
{
route[x][0] = random(1,4); // случайное состояние 1 - стоп,
// 2- вперед, 3- поворот
route[x][1] = random(0,2); // случайное направление поворота
// 0- лево, 1- право
route[x][2] = random(70,254); // случайная скорость вращения
route[x][3] = random(1000,5000); // случайная задержка на время
// выполнения действия
}
btnState = digitalRead(BUTTON_BUILTIN_1); rand_number = random(600);
if (btnState) // нажата ли кнопка
{
for(int i = 0; i<10; i++) {
if (route[i][0] == 1) // остановиться
{
stop_telegka(route[i][3]);
}
if (route[i][0] == 2) // едем вперед
{
forward_telegka(route[i][2],route[i][3]);
}
if (route[i][0] == 3) // поворот
{
rotation_telegka(route[i][1],route[i][2],route[i][3]);
}
}
}
}
Загружаем скомпилированный файл в контроллер, переключаем джампер питания на внешний источник питания, устанавливаем джампер на исполнение программы и наблюдаем результат работы программы – тележка едет по случайному маршруту!
ПРИМЕЧАНИЕ Если Вы хотите выполнять программу при последующих включениях «Рудирона», то не забудьте переставить перемычку из положения «Режим программирования» обратно в «Режим выполнения». Если этого не сделать, то программа при включении «Рудирона» выполняться не будет.
ВЫВОДЫ
Мы научились программировать движение тележки по случайной траектории, поняли принципы заполнения массива маршрута данными о траектории.
СПИСОК КОНТРОЛЬНЫХ ВОПРОСОВ
- С какой целью мы используем массив и какие данные в нем хранятся?
- Можем ли мы использовать другую встроенную кнопку?
- Что необходимо сделать для движения по одному и тому же маршруту?
- Что необходимо для осуществления поворота в случайную сторону?
- Будет ли совершать движение роботележка, если мы не напишем код, отвечающий за обработку нажатия кнопки?
- Для чего мы в начале работы программы анализируем нажатие кнопки?
- Как можно развернуть роботележку на 180°?
- Что нам дает использование цикла при заполнении массива данными?
- Что нам дает использование цикла при выполнении движения?
- Что будет результатом выполнения программы?
СПИСОК ДОПОЛНИТЕЛЬНЫХ ЗАДАЧ
- Использовать для написания программы среду Arduino IDE.
- Написать программу движения по фиксированному маршруту.
- Написать программу движения с возвратом в точку старта.
ЭЛЕМЕНТЫ КОНТРОЛЯ И ПРОВЕДЕНИЯ СОРЕВНОВАНИЙ
- Проведение тестирования по контрольным вопросам. Критерии: кто быстрее и допустил меньшее количество ошибок.
- Написание одного из трех вариантов (исходный и два варианта из списка дополнительных задач) программы и загрузка этого варианта в контроллер. Критерии: Правильно написанная программа согласно выданного задания, работающий контроллер и наименьшее количество времени затраченного на эти работы.
- Проведение соревнования «Я умею передвигаться…» по индивидуальному техническому заданию. Перед проведением подготовить несколько маршрутов трасс. Техническое задание составляется из нескольких частей: а) Старт запуска определенной кнопкой (Варианты B1, B2, B3).
б) Управление встроенными светодиодами (варианты L1, L2):
- включение при старте;
- выключение первого при финише и включение второго светодиода.
в) Следование заданному маршруту.
Можно проводить как одиночные запуски на время прохождения, так и групповые с целью выявления победителя в заезде из нескольких роботележек.
Критерии: Правильно написанная программа согласно выданного технического задания, работающий контроллер и наименьшее количество времени затраченного на эти работы. Главный критерий как можно более точное выполнение технического задания и прохождение выданного маршрута без отклонений. По завершению соревнования произвести разбор написанных программ и работу над допущенными ошибками.