3.10.md
ЛИНЕЙНОЕ ДВИЖЕНИЕ РОБОТЕЛЕЖКИ
РОБОТЕЛЕЖКА — это простейшая платформа на колесах. Два колеса ведущих (закреплены на валах двигателей) и одно пассивное с возможность поворота на 360 градусов.
Двигатели используются для перемещения:
- Вперед
- Назад
- Поворота на произвольный угол
НАПОМИНАНИЕ При использовании внешнего питания сначала подключаем внешнее питание, а потом USB-кабель для связи или программирования. При выключении все делаем наоборот: сначала вытаскиваем USB-кабель, а затем внешнее питание. Несоблюдение данного правила может привести к выходу из строя платы Рудирон.
Управляя двигателями (задаем направление и скорость вращения) можно реализовать движение тележки по любой сложной траектории. В предыдущем уроке мы рассмотрели, как управлять одним двигателем. В этом уроке мы заставим ехать тележку по прямой, управляя двумя двигателями.
Рассмотрим схему подключения двух плат драйверов к контроллеру «Рудирон». Для управления нам понадобятся два цифровых выхода для задания направления вращения двигателями и два вывода с генерацией ШИМ сигналов для задания скоростей вращения. Комбинируя время и последовательность подачи сигналов на драйвер мы можем получить различные режимы перемещения тележки.
Подача питания на мотор:
1 Питание от контроллера.
Не рекомендуется так как может выйти из строя стабилизатор питания контроллера! Хотя это маловероятно, так как на плате установлен самовосстанавливающийся предохранитель, но все же не стоит рисковать.
2 Питание мотора от внешнего источника. Рекомендуемый вариант подключения.
Для управления двигателем необходимо задать направление вращения двигателя и скорость вращения.
Составим алгоритм работы тележки, чтобы она ехала бесконечно вперед:
А теперь в общем алгоритме заменим блоки включения двигателем на сам алгоритм включения исключив «Начало» и «Конец».
Обратите внимание, что мы сначала разработали общий и простой алгоритм работы всего устройства. Потом нарисовали алгоритмы работы каждого блока в отдельности. И затем нарисовали общий детальный алгоритм работы устройства. То есть мы задачу разбили на крупные подзадачи. Каждую подзадачу детально описали. И только потом получили алгоритм, по которому можно уже писать программу.
Перейдем к написанию программы для контроллера «Рудирон». Наш проект будет несколько другим нежели мы его создавали до этого. Мы вынесем программный код по управлению двигателями в дополнительные файлы. В основной программе мы будем просто вызывать функции управления и все. То есть проект будет состоять из 2 программных файлов. В одном мы реализуем управление двигателями, а в другом общий алгоритм управления роботележкой. Так удобнее разрабатывать, изменять и поддерживать программное обеспечение.
Открываем пустой проект:
Проект состоит из файла scketсh.cpp – файл в котором мы реализуем общий алгоритм программы.
Для реализации функций управления двигателями необходимо создать два файла с любым именем. В нашем случае мы создаем файл drive.h (заголовочный файл) и drive.cpp (код управления двигателями). Заголовочный файл необходим для того, чтобы основная программа sketch.cpp увидела функции из файла drive.cpp. Для создания нового файла в проекте необходимо нажать на иконку листа со знаком плюс напротив названия папки проекта:
В списке файлов проекта появится пустая строка для ввода имени файла:
Вводим имя файла drive.h и подтверждаем нажатием клавиши ENTER:
Таким же образом создаем файл drive.cpp:
Создав все необходимые файлы, мы подготовили проект к написанию программного кода.
Напишем код в заголовочный файл drive.h:
#define DIRECTION_FORWD true // направление движения вперед
#define DIRECTION_BACK false // направление движение назад
define DIR_LEFT 4 // направление вращения левого двигателя
#define SPEED_LEFT 7 // скорость вращения левого двигателя
#define DIR_RIGHT 6 // направление вращения правого двигателя
#define SPEED_RIGHT 8 // скорость вращения левого двигателя
void drive_setup ();// функция настройки портов контроллера для управления двигателями
void drive_init (); // функция начального управления
двигателями - установка нулевой скорости и вращения вперед
void lefr_motor (bool direction,int speed); // функция установки скорости и направления вращения левого двигателя
void right_motor (bool driection,int speed); // функция установки
скорости и направления вращения правого двигателя
В заголовочном файле мы дали осознанные имена выходам контроллера «РУДИРОН», которые будут управлять драйверами двигателя:
#define DIR_LEFT 4 // направление вращения левого двигателя
#define SPEED_LEFT 7 // скорость вращения левого двигателя
#define DIR_RIGHT 6 // направление вращения правого двигателя
#define SPEE
Создали 2 константы для задания направления вращения двигателя;
#define DIRECTION_FORWD true // направление движения вперед
#define DIRECTION_BACK false // направление движение назад
Описываем заголовки функций управления двигателем и начальной настройки контроллера без самого кода реализации:
void drive_setup (); // функция настройки портов контроллера для управления двигателями
void drive_init (); // функция начального управления двигателями - установка нулевой скорости и вращения вперед
void lefr_motor (bool direction,int speed); // функция установки скорости и направления вращения левого двигателя
void right_motor (bool driection,int speed); // функция установки скорости и направления вращения правого двигателя
В файле drive.cpp мы уже опишем реализацию функций, которые мы написали (объявили) в заголовочном файле:
#include “Arduino.h”
#include “drive.h”
void drive_setup () // функция настройки портов контроллера для управления двигателями
{
pinMode(DIR_LEFT, OUTPUT);
pinMode(SPEED_LEFT, OUTPUT);
pinMode(DIR_RIGHT, OUTPUT);
pinMode(SPEED_RIGHT, OUTPUT);
}
void drive_init () // функция начального управления двигателями – установка
// нулевой скорости и вращения вперед
{
drive_setup();
lefr_motor(DIRECTION_FORWD,0); // устанавливаем направление
//вращения - вперед
right_motor(DIRECTION_FORWD,0); // устанавливаем нулевую скорость
// вращения двигателя
}
// функция установки скорости и направления вращения левого двигателя
void lefr_motor (bool direction,int speed)
{
digitalWrite(DIR_LEFT, direction); // задаем направление вращения двигателя
analogWrite(SPEED_LEFT, speed); // задаем скорость вращения в виде
// сигнала шим
}
// функция установки скорости и направления вращения правого двигателя
void right_motor (bool directiont,int speed)
{
digitalWrite(DIR_RIGHT, directiont); // задаем направление вращения
// двигателя analogWrite(SPEED_RIGHT, speed); // задаем скорость вращения в
виде
// сигнала шим
}
Функция drive_setup необходима для установки режимов работы портов контроллера. Функция drive_init необходима для вызова функции drive_setup и затем задания на драйверах двигателей вращения вперед с нулевой скоростью.
Функции left_motor и right_motor служат для задания направления движения и скорости вращения каждого двигателя соответственно.
Теперь остается написать код реализации основного алгоритма работы устройства:
#include “Arduino.h” #include “drive.h”
void setup()
{
drive_init(); // вызываем функцию из drive.cpp по начальной настройке
// двигателей - движение вперед и нулевая скорость
}
void loop()
{
lefr_motor(DIRECTION_FORWD,255);
// для движения вперед
// на малой скорости
right_motor(DIRECTION_FORWD,255); // включаем правый двигатель
// для движения вперед
// на малой скорости
}
Что у нас получилось:
- Мы разделили программный код на 2 категории
- Первая категория — это функции управления двигателями и начальной инициализации контроллера
- Вторая категория непосредственная реализация основного алгоритма устройства
- Для каждой категории кода мы используем разные файлы
Мы, конечно могли написать программу в одном основном файле, так как количества кода небольшое. Однако разнесение кода по файлам дает большие преимущества при модификации и поиске ошибок. Все программисты реализуют свои проекты с созданием большого количества файлов под разные задачи в рамках одной программы. Это позволяет разрабатывать больший программы в десятки тысяч строк одновременно несколькими программистами. Загружаем скомпилированный файл в контроллер, переключаем джампер питания на внешний источник питания, устанавливаем джампер на исполнение программы и наблюдаем результат работы программы – тележка едет прямо!
ПРИМЕЧАНИЕ Если Вы хотите выполнять программу при последующих включениях «Рудирона», то не забудьте переставить перемычку из положения «Режим программирования» обратно в «Режим выполнения». Если этого не сделать, то программа при включении «Рудирона» выполняться не будет.
ВЫВОДЫ
Мы научились работать с двумя двигателями постоянного тока в наших программах, поняли принципы управления тележкой, научились декомпозировать свои программы.
СПИСОК КОНТРОЛЬНЫХ ВОПРОСОВ
- Как управляется двигатель и есть ли отличие когда их два?
- Какой алгоритм работы применяется при работе с двумя двигателями?
- Нужна ли дополнительная библиотека для работы с двумя двигателями?
- Какое количество драйверов применяется для управления двумя двигателями?
- Какую технологию мы использовали для управления вращением двигателя? Подсказка: вспомните урок по управлению яркостью светодиода.
- Что может произойти, если запитать двигатель от контроллера?
- Сколько и каких портов нам необходимо задать для управления двумя двигателями?
- Какие функции мы определили (написали) для управления двигателями?
- Можно было бы не писать отдельно функции из п.8? И какой результат был в этом случае?
- Что будет результатом выполнения программы?
СПИСОК ДОПОЛНИТЕЛЬНЫХ ЗАДАЧ
- Использовать для написания программы среду Arduino IDE.
- Написать программу управления двумя двигателями с началом движения в противоположную сторону.
- Написать программу управления двумя двигателями с началом движения в противоположную сторону и последовательным увеличением скорости.
ЭЛЕМЕНТЫ КОНТРОЛЯ И ПРОВЕДЕНИЯ СОРЕВНОВАНИЙ
- Проведение тестирования по контрольным вопросам. Критерии: кто быстрее и допустил меньшее количество ошибок.
- Написание одного из трех вариантов (исходный и два варианта из списка дополнительных задач) программы и загрузка этого варианта в контроллер.
Критерии: Правильно написанная программа согласно выданного задания, работающий контроллер и наименьшее количество времени затраченного на эти работы.