3.12.md


ДВИЖЕНИЕ ПО СЛУЧАЙНОЙ ТРАЕКТОРИИ

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

Рисунок 1

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

Движение по определенному маршруту часто встречающаяся задача для современных беспилотных аппаратов. Создадим случайный маршрут для нашей тележки, состоящий из 10 событий, определяющих движение роботележки.

Мы с Вами определили 3 возможных действия – остановка, движение прямо, поворот. Также мы для этих действий определили длительность, скорость и направление.

Нарисуем общий алгоритм движения роботележки:

Рисунок 1

Схема подключения у нас остается той же, что и в предыдущем уроке. Для повторения приведем данную схему и здесь.

Рисунок 1

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

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

Рисунок 1

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

Рисунок 1

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

Представим в табличном виде какие параметры нам нужны для определенного действия тележки. Мы будем создавать весь набор параметров даже если какое-то действию не требуется весь набор.

Номер события Действия тележки, 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:

Рисунок 1

Текст программы, реализующий генерацию случайного маршрута:

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]);
   }
  }
 }
}

Загружаем скомпилированный файл в контроллер, переключаем джампер питания на внешний источник питания, устанавливаем джампер на исполнение программы и наблюдаем результат работы программы – тележка едет по случайному маршруту!

ПРИМЕЧАНИЕ Если Вы хотите выполнять программу при последующих включениях «Рудирона», то не забудьте переставить перемычку из положения «Режим программирования» обратно в «Режим выполнения». Если этого не сделать, то программа при включении «Рудирона» выполняться не будет.

ВЫВОДЫ

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

СПИСОК КОНТРОЛЬНЫХ ВОПРОСОВ

  1. С какой целью мы используем массив и какие данные в нем хранятся?
  2. Можем ли мы использовать другую встроенную кнопку?
  3. Что необходимо сделать для движения по одному и тому же маршруту?
  4. Что необходимо для осуществления поворота в случайную сторону?
  5. Будет ли совершать движение роботележка, если мы не напишем код, отвечающий за обработку нажатия кнопки?
  6. Для чего мы в начале работы программы анализируем нажатие кнопки?
  7. Как можно развернуть роботележку на 180°?
  8. Что нам дает использование цикла при заполнении массива данными?
  9. Что нам дает использование цикла при выполнении движения?
  10. Что будет результатом выполнения программы?

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

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

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

  1. Проведение тестирования по контрольным вопросам. Критерии: кто быстрее и допустил меньшее количество ошибок.
  2. Написание одного из трех вариантов (исходный и два варианта из списка дополнительных задач) программы и загрузка этого варианта в контроллер. Критерии: Правильно написанная программа согласно выданного задания, работающий контроллер и наименьшее количество времени затраченного на эти работы.
  3. Проведение соревнования «Я умею передвигаться…» по индивидуальному техническому заданию. Перед проведением подготовить несколько маршрутов трасс. Техническое задание составляется из нескольких частей: а) Старт запуска определенной кнопкой (Варианты B1, B2, B3).

б) Управление встроенными светодиодами (варианты L1, L2):

  • включение при старте;
  • выключение первого при финише и включение второго светодиода.

в) Следование заданному маршруту.

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

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