3.10.md


ЛИНЕЙНОЕ ДВИЖЕНИЕ РОБОТЕЛЕЖКИ

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

Рисунок 1

Двигатели используются для перемещения:

  • Вперед
  • Назад
  • Поворота на произвольный угол

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

Управляя двигателями (задаем направление и скорость вращения) можно реализовать движение тележки по любой сложной траектории. В предыдущем уроке мы рассмотрели, как управлять одним двигателем. В этом уроке мы заставим ехать тележку по прямой, управляя двумя двигателями.

Рассмотрим схему подключения двух плат драйверов к контроллеру «Рудирон». Для управления нам понадобятся два цифровых выхода для задания направления вращения двигателями и два вывода с генерацией ШИМ сигналов для задания скоростей вращения. Комбинируя время и последовательность подачи сигналов на драйвер мы можем получить различные режимы перемещения тележки.

Рисунок 1

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

1 Питание от контроллера.

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

Рисунок 1

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

Рисунок 1

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

Составим алгоритм работы тележки, чтобы она ехала бесконечно вперед:

Рисунок 1

А теперь в общем алгоритме заменим блоки включения двигателем на сам алгоритм включения исключив «Начало» и «Конец».

Рисунок 1

Обратите внимание, что мы сначала разработали общий и простой алгоритм работы всего устройства. Потом нарисовали алгоритмы работы каждого блока в отдельности. И затем нарисовали общий детальный алгоритм работы устройства. То есть мы задачу разбили на крупные подзадачи. Каждую подзадачу детально описали. И только потом получили алгоритм, по которому можно уже писать программу.

Перейдем к написанию программы для контроллера «Рудирон». Наш проект будет несколько другим нежели мы его создавали до этого. Мы вынесем программный код по управлению двигателями в дополнительные файлы. В основной программе мы будем просто вызывать функции управления и все. То есть проект будет состоять из 2 программных файлов. В одном мы реализуем управление двигателями, а в другом общий алгоритм управления роботележкой. Так удобнее разрабатывать, изменять и поддерживать программное обеспечение.

Открываем пустой проект:

Рисунок 1

Проект состоит из файла scketсh.cpp – файл в котором мы реализуем общий алгоритм программы.

Для реализации функций управления двигателями необходимо создать два файла с любым именем. В нашем случае мы создаем файл drive.h (заголовочный файл) и drive.cpp (код управления двигателями). Заголовочный файл необходим для того, чтобы основная программа sketch.cpp увидела функции из файла drive.cpp. Для создания нового файла в проекте необходимо нажать на иконку листа со знаком плюс напротив названия папки проекта:

Рисунок 1

В списке файлов проекта появится пустая строка для ввода имени файла:

Рисунок 1

Вводим имя файла drive.h и подтверждаем нажатием клавиши ENTER:

Рисунок 1

Таким же образом создаем файл drive.cpp:

Рисунок 1

Создав все необходимые файлы, мы подготовили проект к написанию программного кода.

Напишем код в заголовочный файл 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); // включаем правый двигатель

// для движения вперед
// на малой скорости
}

Что у нас получилось:

  1. Мы разделили программный код на 2 категории
  2. Первая категория — это функции управления двигателями и начальной инициализации контроллера
  3. Вторая категория непосредственная реализация основного алгоритма устройства
  4. Для каждой категории кода мы используем разные файлы

Мы, конечно могли написать программу в одном основном файле, так как количества кода небольшое. Однако разнесение кода по файлам дает большие преимущества при модификации и поиске ошибок. Все программисты реализуют свои проекты с созданием большого количества файлов под разные задачи в рамках одной программы. Это позволяет разрабатывать больший программы в десятки тысяч строк одновременно несколькими программистами. Загружаем скомпилированный файл в контроллер, переключаем джампер питания на внешний источник питания, устанавливаем джампер на исполнение программы и наблюдаем результат работы программы – тележка едет прямо!

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

ВЫВОДЫ

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

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

  1. Как управляется двигатель и есть ли отличие когда их два?
  2. Какой алгоритм работы применяется при работе с двумя двигателями?
  3. Нужна ли дополнительная библиотека для работы с двумя двигателями?
  4. Какое количество драйверов применяется для управления двумя двигателями?
  5. Какую технологию мы использовали для управления вращением двигателя? Подсказка: вспомните урок по управлению яркостью светодиода.
  6. Что может произойти, если запитать двигатель от контроллера?
  7. Сколько и каких портов нам необходимо задать для управления двумя двигателями?
  8. Какие функции мы определили (написали) для управления двигателями?
  9. Можно было бы не писать отдельно функции из п.8? И какой результат был в этом случае?
  10. Что будет результатом выполнения программы?

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

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

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

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

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