Практикум по спецкурсу «Введение в робототехнику».

Автор: Волкова Т.А., ассистент кафедры математики, логики и интеллектуальных систем в гуманитарной сфере РГГУ. 2011 год.

Оглавление

Предисловие 3

Решение робототехнических задач в симуляторе 3

Обзор робототехнических симуляторов 3

О среде Simbad 3

Установка 4

Запуск 4

Компиляция и запуск из командной строки 4

Устройство программы. 4

Создание проекта Simbad в NetBeans 5

Задачи в симуляторе Simbad 5

Задача 1. Робот, следующий на свет. 5

Постановка задачи. 5

Устройство программы робота 5

Смена кинематической модели 6

Работа с источниками света 6

Работа с датчиками освещённости 6

Задача 2. Робот, приезжающий в заданную точку 7

Постановка задачи 7

Устройство пространства и времени в симуляторе 7

Алгоритм 8

Задача 3. Нахождение пути робота на заданной карте методом Дейкстры 8

Постановка задачи 8

Способ решения 8

Подзадачи 10

Задача 4. Определение координат робота в пространстве путем решения дифференциального уравнения. 10

Постановка задачи 10

Решение 10

Задача 5. Использование пропорционального регулятора для решения задачи езды вдоль стены 11

Постановка задачи 11

Подключение ультразвуковых дальномеров 11

Использование ультразвуковых дальномеров 12

Релейный регулятор 12

Пропорциональный регулятор 12

Задача 6. Навигация по трём маякам 12

Постановка задачи 12

Реализация распознавания цвета 13

Решение 13

Задача 7. Поиск пути в лабиринте 13

Постановка задачи 13

Решение 13

Задача 8. Движение по неизвестной карте с датчиками 13

Постановка задачи 13

Решение 14

Алгоритм 14

Расширение задачи 14

Изучение платы Arduino 14

Введение 14

Технические требования 15

Описание среды, установка 15

Практические задачи 15

Задача 1. Знакомство с платой 15

Задача 2. Работа с выходами. 15

Задача 3. Работа с последовательным портом 16

Задача 4. Работа со входами 16

Задача 5. Управление мотором 17

Дополнительные задачи 17

Работа с сервомашинкой 17

Поворот на источник света 18

Решение робототехнических задач на мобильном роботе 18

Описание робота POP-BOT 18

Состав набора 18

Сборка 19

Программирование 19

Устройство платы 20

Задачи с роботом 20

1. Сборка робота 20

2. Отъезд от препятствий 21

3. Езда по линии с одним датчиком 21

4. Езда по линии с двумя датчиками 21

5. Калибровка 21

6. Езда с компасом 21

7. Энкодеры 22


Предисловие

Эти материалы написаны по опыту преподавания спецкурса в весеннем семестре в РГГУ совместно с проф. Павловским. Практическая часть курса состояла из трёх основных частей:

  1. Решение робототехнических задач в симуляторе

  2. Основы электроники и программирования микроконтроллера

  3. Решение задач на реальном роботе

В значительной степени формулировки задач на симуляторе Simbad (особенно задачи 3,4 и 7) взяты из курса Howie Choset университета Карнеги-Меллона (http://generalrobotics.org).

Решение робототехнических задач в симуляторе

Обзор робототехнических симуляторов

Далее перечислены самые популярные робототехнические симуляторы. Принципиальным было свободное распространение, поэтому в список не попали такие известные программы, как Webots, LabView или Marilou.

Microsoft Robotics Studio (http://www.microsoft.com/robotics/)

Player Project (http://playerstage.sourceforge.net/)

Simbad (http://simbad.sourceforge.net)

Симулятор

Язык программирования

3D-визуализация

Физический движок

Поддержка

ОС

Лицензия

Microsoft Robotics Studio

Visual Programming Language (VPL), языки .NET

Есть

Nvidia PhysX

Малое количество документации

Windows

Различные; с 2008 года — свободно распространяется

Player/

Stage/

Gazebo

C++

Есть (в Gazebo - Ogre3D)

Open Dynamic Engine (ODE)

Есть руководство пользователя

POSIX

GNU GPL

Simbad

Java

Есть (Java3d, OpenGL)

Нет

Есть справочник по API

Любая

GNU GPL

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

О среде Simbad

Simbad (http://simbad.sourceforge.net) - это несложный симулятор мобильных роботов. Он целиком написан на Java, и с этим связано его главное преимущество: кроссплатформенность. Недостатком Simbad является отсутствие серьёзного моделирования динамики, а также тот факт, что в настоящее время (лето 2011 года) проект практически не развивается.

Установка

Сам Simbad установки не требует, но для его работы нужно скачать и установить некоторые Java-библиотеки. Устанавливать всё нужно в следующей последовательности:

  1. JRE (Java Runtime Environment) (нужно для запуска)

  2. JDK (Java Development Kit) (с сайта oracle.com) (нужно для компиляции)

  3. Java3D (http://java.sun.com/products/java-media/3D/download.html)

Java3D официально пока не поддерживается в 64-битной версии Windows (но поддерживается в 64-битной версии Linux). Для работы Java3D необходим OpenGL версии не менее 1.2. Если его нет, требуется обновить драйвера видеокарты.

Если компилятор выдаёт ошибку об отсутствии пакетов, связанных с графикой (не понимает выражений Point3d, Vector3d и подобных), то необходимо переустановить Java3d.

Запуск

Просто запускается файл simbad-1.4.jar. Можно посмотреть примеры. Наибольший интерес представляют LightSearchDemo (использование датчиков освещённости), AvoidersDemo (использование датчиков препятствий), PickCherriesDemo (взаимодействие с объектами), PushBallsDemo (простая физика).

Компиляция и запуск из командной строки

Если нужно написать программу для Simbad, требуется компилятор Java (есть в JDK).

Хороший пример типичной программы для Simbad есть на официальном сайте (http://simbad.sourceforge.net/example1.php).

Собрать программу можно прямо из командной строки (cmd) Windows или из оболочки Linux. Если сборка производится под Windows, вначале нужно прописать в системной переменной path строку: C:\Program Files\Java\jdk1.6.0_23\bin, чтобы система знала, где искать компилятор Java.

Для компиляции и запуска собственной программы нужно зайти в папку, где лежат её исходные файлы .java.

Команды для компиляции:

javac -classpath ".\..\simbad-1.4.jar;C:\Program Files\Java\Java3D\1.5.1\lib\ext\vecmath.jar;C:\Program Files\Java\Java3D\1.5.1\lib\ext\j3dcore.jar;C:\Program Files\Java\Java3D\1.5.1\lib\ext\j3dutils.jar" MyProg.java MyEnv.java MyRobot.java

Запуск:

java -classpath ".;.\..\simbad-1.4.jar;C:\Program Files\Java\Java3D\1.5.1\lib\ext\vecmath.jar;C:\Program Files\Java\Java3D\1.5.1\lib\ext\j3dcore.jar;C:\Program Files\Java\Java3D\1.5.1\lib\ext\j3dutils.jar" MyProg

Примечание: В ключе classpath перечисляются внешние библиотеки. Важно, что при запуске в -classpath стоит точка (она означает текущий каталог). Она нужна, чтобы среда Java знала, из какого каталога брать файлы.

Устройство программы.

Простая программа на Simbad состоит из трёх классов:

Создание проекта Simbad в NetBeans

Можно работать в удобной среде разработки NetBeans. Она кроссплатформенная, свободная, имеет красивый интерфейс. Для установки требует JDK. Чтобы написать программу для Simbad, нужно сделать следующее:


  1. Создать проект Java (выбрать тип "Приложение Java"). Желательно убрать крестик в "Создать главный класс", так как пакет, содержащий Main, называется по-другому, и из-за этого придётся потом менять настройки проекта и указывать главный класс вручную.

  2. Создать классы MyProg, MyRobot, MyEnv и добавить их в проект. Что должно быть в этих файлах — примеры есть на сайте Simbad.

  3. Слева дерево проекта. Правый клик на "Библиотеки" - "Добавить архив JAR или папку". Выбрать файл simbad-1.4.jar.

Задачи в симуляторе Simbad

Далее приведены формулировки задач и некоторые указания к их выполнению. Исходные тексты задач все имеются в папках, пронумерованных соответственно.

Задача 1. Робот, следующий на свет.

Постановка задачи.

Робот, следующий на свет (photovore), или, как вариант, следующий по линии (line tracer) - это своего рода "Hello World" в робототехнике. На Западе такие «машинки» называют ещё Breitenberg Vehicles. При простоте алгоритма, они показывают достаточно интересное, зависящее от перемен в окружающей среде поведение.

Устройство программы робота

Обычно вся программа робота выглядит следующим образом. При старте робота, запускается некоторая функция инициализации систем робота. В Simbad эти действия происходят в конструкторе робота и функции initBehavior. Потом программа входит в бесконечный цикл и сама из него никогда не выходит. Работа этого цикла завершается только при отключении питания робота или, в случае с симулятором, принудительном завершении его программы. В Simbad такой цикл называется performBehavior. Устроен он так:

Бесконечный цикл {

Опрос датчиков();

Выбор действия();

Действие();

}

Как правило, кроме основного цикла других циклов во всей программе нет. Такая модель ещё называется на Западе Sense-Think-Act. Вначале робот «чувствует», то есть воспринимает окружающую среду. Затем «думает», то есть анализирует данные и принимает решение о том, что делать дальше. И наконец «действует», то есть посылает сигналы на свои моторы.



Смена кинематической модели

В стандартных примерах Simbad роботу сообщается угловая (рад/с) и линейная (м/с) скорость. Но в существующих роботах чаще используется другая, дифференциальная модель, при которой движения робота управляются посредством разности скоростей на моторах. В ней можно задать только скорости двигателей (левого и правого).


Поэтому в программе лучше сразу сменить модель на дифференциальную.

Для начала нужно завести переменную класса «Робот»:

L=10.0 //ширина колесной базы

Объявляется кинематическая модель — тоже как переменная класса «Робот»:

DifferentialKinematic kinematic;

Она инициализируется в конструкторе класса “Робот” с параметром L:

kinematic = new DifferentialKinematic(L);

Там же даётся команда:

setKinematicModel(kinematic);

Теперь скорость задается так:

kinematic.setWheelsVelocity(left, right);

где left, right – скорости на моторах в м/с.

Отрицательное число означает вращение мотора назад.

Работа с источниками света

На сцене располагается 2 источника освещения - две лампы (можно повращать камерой и увидеть их). Источники света в Simbad реализованы не очень удачно. Их нельзя конструировать, можно только менять их параметры в конструкторе среды:

light1IsOn = true;

light1SetPosition(3,1,-3);

light1Color = white;

Аналогично и со вторым источником цвета, только тогда переменные будут вида light2IsOn.

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

Работа с датчиками освещённости

К роботу нужно добавить 2 датчика освещённости. Они будут выглядеть как желтые точки слева и справа от робота. Датчики объявляются как переменные класса «Робот»:

LightSensor sensorLeft;

LightSensor sensorRight;

Они инициализируются в конструкторе класса «Робот»:

sensorLeft = RobotFactory.addLightSensorLeft(this);

sensorRight = RobotFactory.addLightSensorRight(this);

Чтобы считать показания датчика света:

float llum = sensorLeft.getAverageLuminance();

float rlum = sensorRight.getAverageLuminance();

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

Задача 2. Робот, приезжающий в заданную точку

Постановка задачи

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

В Simbad есть функция getCoords, дающая глобальные координаты робота. Если робот уже знает свои координаты, то ему остается высчитать свой угол поворота относительно заданной точки, повернуться так, чтобы стоять к ней «лицом», и затем просто приехать в неё по прямой.

Устройство пространства и времени в симуляторе


Необходимо обратить внимание на то, что по умолчанию X и Z — это ширина и длина, а Y — это высота. Время в симуляторе устроено следующим образом: каждые 0.05 секунд (50 миллисекунд) происходит шаг симуляции, в ходе которого робот выполняет то, что задано в функции performBehavior. Это время тоже можно менять по своему усмотрению, но для простых задач вполне хватит и такого.

Алгоритм

  1. Завести переменную для текущего угла

  2. Каждый шаг симуляции:

    1. Измерить текущий угол робота: вычислить угловую скорость робота и прибавить к текущему углу шаг времени, умноженный на угловую скорость.

    2. Если робот уже развёрнут по направлению к цели - дать роботу команду ехать вперёд

    3. Иначе:

  1. Найти угол между текущим направлением робота и направлением на заданную точку

  2. Повернуть робота так, чтобы разница между ними стала почти равна нулю. Возможны ситуации, когда робот проскакивает направление: из-за временного шага в 200 миллисекунд на достаточно большой скорости он почти всегда проворачивается мимо. Поэтому необходимо ввести epsilon.

    1. Если робот уже находится на расстоянии delta от заданной точки - остановиться

Дополнительная задача — следование по маршруту из списка точек (ArrayList). Это пригодится в следующей задаче.

Задача 3. Нахождение пути робота на заданной карте методом Дейкстры

Постановка задачи

У робота имеется карта помещения. Заранее неизвестны старт и финиш. На входе робот получает точку, в которую должен попасть. Свои координаты он по-прежнему знает.

В данном случае задача решается при помощи явного задания опорных точек. Эта же постановка задачи будет впоследствии в задаче «Лабиринт», но там опорными точками будут уже все точки, где нет стены.

Способ решения

Можно облегчить роботу задачу и задать некоторое число опорных точек:


(0,0),(0,5),(1,7),(3,0),(3,4),(4,7),(4,10),(6,4),(6,7),(9,10),(10,6),(10,0)


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



(0,1),(0,3),(1,4),(1,2),(2,5),(3,4),(3,10),(4,7),(5,6), (5,8),(6,9),(7,10),(7,11),(8,7),(9,11),(10,11)


Таким образом, карта превращается в граф. Теперь на этом графе можно применять известные методы поиска кратчайшего пути, такие как метод Дейкстры.

Нет необходимости писать метод Дейкстры с нуля — этот алгоритм достаточно известен, и можно взять любую рабочую реализацию в Интернете. В нашем случае была взята программа с сайта http://algowiki.net на языке C и переделана под Java. Студентам предлагалось доработать эту программу, чтобы она стала применимой для конкретного случая.

Но чтобы найти в этом графе кратчайший путь, список вершин и рёбер нужно представить в виде матрицы смежности. В ячейках матрицы пишутся расстояния между вершинами. Если между вершинами нет ребрапишетсябесконечное расстояние(часто задаётся числом вроде 999)

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

Подзадачи

1. Задать массив опорных точек (Waypoints)

2. Задать возможные переходы между этими точками (Edges)

3. Дописать код в методе Дейкстры (порождение матрицы смежности из списка вершин и рёбер в функции create_adj_matrix)

4. Написать функцию, которая из списка preced создаст путь (ArrayList – список точек)

5. Заставить робота следовать по этому пути, используя предыдущую задачу

Задача 4. Определение координат робота в пространстве путем решения дифференциального уравнения.

Постановка задачи

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

Нужно узнать координаты робота в пространстве, основываясь на известных нам данных: скоростях на колёсах и времени.

Решение

Cоставляется и решается простое дифференциальное уравнение.

Получится такое уравнение:

x' = v*sin(th)

y'=v*cos(th)

th' = w

То, что находится в левой части – зависимые от t переменные. t (время) – независимая переменная. Переменные w и v не зависят от t (строго говоря, зависят, но мы упростили задачу). Самое простое – это посчитать текущий угол. Это уже было сделано в задаче 2:

th = th_prev + h*w

Таким образом, третье уравнение системы уже решено (методом Эйлера, хоть мы об этом и не догадывались). Как быть с остальными двумя?

Это уравнение нельзя решить аналитически, потому что оно не принадлежит к известным классам (линейным, с разделяющимися переменными, однородным).

С другой стороны, численные методы можно использовать всегда – даже тогда, когда есть аналитическое решение. Поэтому можно применить численный метод Рунге-Кутты.

Задача 5. Использование пропорционального регулятора для решения задачи езды вдоль стены

Постановка задачи

Имеется составленная из простых блоков стена с различными изогнутыми участками.

Устраивается соревнование — чей робот быстрее проедет вдоль стены.

Подключение ультразвуковых дальномеров

В Simbad есть ультразвуковые дальномеры. Их можно добавить несколько, и тогда они образуют «пояс» вокруг робота. В классе “Робот” заводится переменная:

RangeSensorBelt sonars;

В конструкторе класса “Робот” она инициализируется:

sonars = RobotFactory.addSonarBeltSensor(this, число датчиков);

Считать информацию с датчика:

double cur_dist = sonars.getMeasurement(номер датчика);



При запуске вокруг робота должны появиться чёрточки (датчики). А в панели робота появится новое окошко. Слева красными лучами выделяются активные датчики, справа — численные показания на датчиках.

Использование ультразвуковых дальномеров

Для решения задачи нужно выбрать один или несколько датчиков, снимать с них показания и использовать для движения вдоль стены. Датчик выдаёт значения от 0.0 до 1.5 метров, а дальше – бесконечность (константа Double.POSITIVE_INFINITY), и этот случай нужно отдельно обрабатывать. Вначале проще взять один датчик. Если выбран датчик по диагонали, его значение нужно умножить на косинус угла, под которым стоит датчик, чтобы получить верное расстояние.

Релейный регулятор

Требуемое расстояние до стены вводится как константа (разумно сделать её 1.0, чтобы расчёты были проще). Дальше нужно посчитать текущее расстояние до стены и установить скорости на двигателях. Для соревнования необходимо договориться, что максимальная скорость - не более 1.5 м/с на двигателе. После выполнения задачи нужно зафиксировать время прохождения роботом трассы (lifetime) – как только его координата по X превысит значение, соотвествующее краю карты (на предлагаемой трассе оно равно 1.0).

Пропорциональный регулятор

Задача выполняется аналогично. Считается текущее отклонение от требуемого значения (разница, величина рассогласования). Разница используется, чтобы установить скорости на двигателях. Интересно посмотреть, что будет при разных значения коэффициента пропорциональности: 0.5, 1, 5. Сможет ли робот в конце дистанции обогнуть стену?

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

Задача 6. Навигация по трём маякам

Постановка задачи

Есть 3 маяка (изображены цветными кубиками). Их робот может видеть при помощи видеокамеры. Он распознаёт цвет кубика и его угол по отношению к роботу. Имея 3 угла и зная координаты маяков, робот должен определить, где он находится в текущий момент.

Реализация распознавания цвета

Распознавание цветных кубиков делается при помощи внешней библиотеки blobDetection (http://v3ga.net/processing/BlobDetection/), которая находится в jar-файле и подключается к проекту аналогично библиотеке Simbad.

Решение

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

Задача 7. Поиск пути в лабиринте

Постановка задачи

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

Решение

Лабиринт представляется как булева матрица со значениями true, где есть стена, и false, где её нет. Для отрисовки лабиринта мы использовали алгоритм проекта Algernon (http://sourceforge.net/projects/lemaze/).

Предлагается решить задачу нахождения оптимального пути в лабиринте тремя способами:

  1. Метод А*

  2. Метод Дейкстры

  3. Волновой фронт

Идеально было бы перед тем, как отправлять робота в путь, визуализировать работу алгоритма разноцветными блоками.

Можно не писать алгоритм с нуля, а взять одну из готовых реализаций — их много в Интернете. Необходимо определить, что у метода на входе и что на выходе. У всех методов — по-разному!

Вопрос: как роботу потом ехать по построенному маршруту? Очень просто! Метод выдаёт список точек, мы можем ехать по этим точкам, каждый раз выбирая как целевую очередную точку этого списка. Задача «Езда в точку» уже была.

В общем виде задача выглядит так: на входе есть двоичная матрица — карта лабиринта. Есть стартовая точка и финишная точка. На выходе должен быть путь — набор точек.

Задача 8. Движение по неизвестной карте с датчиками

Постановка задачи

Задача отличается от предыдущей тем, что в ней у робота нет полной карты, и поэтому он должен составлять её по ходу движения. Самый простой способ решить эту задачу — использовать уже известный алгоритм волнового фронта. Предполагается, что у робота есть средства навигации, выдающие ему угол поворота и координаты (это делалось в предыдущих задачах).

Решение

Робот едет и поворачивается в разные стороны, измеряя расстояние до препятствий. Измерения используются для построения грубой карты лабиринта.

Алгоритм

Написать функцию: вход — показание датчика, координаты робота и угол поворота робота, выход - координаты препятствия на карте (клетка, которой оно принадлежит).

Написать функции, при помощи которых робот будет ехать вперёд на заданное число клеток и поворачивать на 90 градусов.

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

Применять wavefront на материале этих измерений в каждой новом клетке

Расширение задачи

Эта задача, как и все остальные, может быть решена в симуляторе, и затем перенесена на мобильного робота. В этом случае на робота потребуется прикрепить ИК-дальномер SHARP GP2D120 на сервомашинке. Датчик должен постоянно вращаться и делать хотя бы 3 измерения на каждые 180 градусов — одно прямо перед собой, два других слева и справа от себя. Для проверки решения, в классе должны быть клетчатая карта и препятствия.

Изучение платы Arduino

Введение

В этом разделе курса студенты должны ознакомиться с микроконтроллером, который является «мозгом» для простых роботов. Для этого необходима готовая плата с микроконтроллером, так как курс не включает в себя проектирования схем, изготовления и пайки плат — это является отдельным предметом, на некоторых факультетах и вовсе не изучаемым. Кроме того, это долго, требует наличия специализированной лаборатории и не даёт возможности сразу приступить к программированию.

Нами была выбрана плата итальянского OpenSource проекта Arduino. К её достоинствам можно отнести: доступность для новичков за счет обилия документации и обучающих примеров, отсутствие необходимости пайки и специализированного программатора, кроссплатформенность среды разработки, язык разработки C++ (avr-gcc). Из недостатков можно назвать высокую цену (~1000 рублей за стандартную плату, 500 рублей за уменьшенную плату формата Nano), аскетичную среду разработки.

Основные цели работы с платой:

Технические требования

Для выполнения нижеперечисленных задач требуются:

Описание среды, установка

Среда разработки свободно скачивается с официального сайта http://arduino.cc

Установка среды проста и не требует каких-либо разъяснений. При запуске есть один нюанс: если есть антивирус Касперского, то лучше его временно отключить, потому что он удаляет запускаемый Arduino java-файл. В этом случае ни одна программа не скомпилируется, и придётся переустанавливать всю среду.

Практические задачи

Предполагается, что студенты знакомы с языками C и (желательно) C++, а также физикой в объёме школьной программы. Схемы практически ко всем задачам есть в редакторе Fritzing, но полезнее, если студенты сами до них додумаются.

Задача 1. Знакомство с платой

Здесь студенты рассматривают плату и осознают, где что находится. Они должны быть кратко проинформированы о технике безопасности при работе с платой (опасность короткого замыкания, статики). Преподаватель должен показать презентацию об Arduino.

Например, очень хороша презентация Bionic Arduino — http://todbot.com/blog/bionicarduino/. О том, что рассказывается на занятиях: http://machineproject.com/archive/news/2007/10/10/bionicarduino/

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

Потом студенты осваивают среду разработки Arduino IDE, Processing IDE и смотрят редактор Fritzing.

Также обязательно изучение мультиметра (приносится учителем самостоятельно). Отработать измерение:

Задача 2. Работа с выходами.

Далее приведена таблица с подзадачами. В графе «Название» - условное название задачи. В графе «Изучаемые понятия» - теоретические сведения, которые иллюстрируются задачей, и которые предварительно нужно объяснить. В графе «Используемые устройства» - материалы, необходимые для выполнения; во всех задачах также необходимы плата Arduino и USB-кабель.

N

Название

Изучаемые понятия

Устройства

Стандартный пример

Усложнение задачи

1

Мигание светодиодом

Цифровой выход, задержка

светодиод

Basics - Blink

Подключение к другим выходам (через резистор)

2

Плавное включение светодиода

ШИМ

светодиод

Basics - Fade


3

Подключение динамика.


динамик

Digital — Tone Melody

Наиграть узнаваемую мелодию («Чижик-Пыжик»).

4

Подключение светодиода к этому же выходу вместо или вместе с динамиком.


Динамик, светодиод

Digital — Tone Melody


5

Мигание светодиодом без использования функции delay

Таймер

Светодиод

Digital — BlinkWithoutDelay



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

Задача 3. Работа с последовательным портом

В этой задаче необходимо освоить основные команды печати, а также особенности работы с Serial Port (выбор правильного COM-порта). Нужно донести мысль, что в отсутствие дебаггера, вывод на печать — единственный способ отладить программу.


N

Название

Изучаемые понятия

Устройства

Стандартный пример

Усложнение задачи

1

Печать в последовательный порт

Serial Monitor


Communication — ASCII Table


2

Плавное зажигание светодиода после наведения мышки

Взаимодействие с Processing

Светодиод

Communication - Dimmer


Задача 4. Работа со входами

Для этих и дальнейших задач необходима беспаечная макетная плата и перемычки к ней.

N

Название

Изучаемые понятия

Устройства

Стандартный пример

Усложнение задачи

1

Подключение кнопки

Цифровой вход, подтягивающий резистор

Кнопка, светодиод

Digital - Button

  1. Пока нажата кнопка - горит светодиод

  2. Включение и выключение светодиода по нажатию кнопки

  3. 2 светодиода и 2 кнопки (можно с двухцветным светодиодом)

2

Подключение потенциометра

Потенциометр, фоторезистор, аналоговый вход

Потенциометр, фоторезистор

Analog - AnalogInput

Подключение фоторезистора на тот же вход

3

Вывод показаний на аналоговом входе и показ графика в Processing

Потенциометр, фоторезистор

Потенциометр, фоторезистор

Comunication - Graph


Задача 5. Управление мотором

Далее студенты должны освоить подключение мотора. Питание для мотора берется с Arduino (выводы 5V и GND), на которую оно идёт с USB-порта.


N

Название

Изучаемые понятия

Устройства

Стандартный пример

Усложнение задачи

1

Включение электромотора

Электромотор, полярность

Мотор



2

Управление мотором

Транзистор

Мотор, транзистор

Basics - Blink

Плавное управление (через ШИМ)

3

Вращение мотора в разные стороны

Навык сборки сложной схемы

Мотор, 4 транзистора




В 3-й сложной задаче должна быть наготове схема для сборки, на случай, если студенты сами не смогут её придумать.

Дополнительные задачи

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

Работа с сервомашинкой

Подключение сервомашинки (выдача определенного периода). Управление сервомашинкой при помощи потенциометра.

Поворот на источник света

Прикрепить беспаечную макетную плату с фоторезисторами к сервомашинке и заставить ее поворачиваться в сторону источника света. Либо прикрепить фоторезисторы на двусторонний скотч.

Решение робототехнических задач на мобильном роботе

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

Описание робота POP-BOT

Мы остановили свой выбор на робоконструкторе POP-BOT таиландской фирмы Innovative Experiment, как на самом доступном по цене и простом для новичков, при этом с богатым функционалом. Рассматривался также вариант Pololu 3pi, но вскоре стало ясно, что этот робот уже для более «продвинутых» робототехников, и его сложнее расширять в силу маленького размера.

Состав набора

Роботы POP-BOT продаются в магазинах и вполне доступны по цене (5,5 тыс.р. — сравнительно небольшая цена за полностью готового робота). Робот поставляется в коробке в разобранном виде, в комплекте есть отвёртки и инструкция по сборке. Практически все детали из комплекта можно купить по отдельности в магазине «Терраэлектроника», а значит, испорченную часть легко заменить.

Из периферии в наборе имеются: 2 оптических датчика освещённости, 2 кнопки, ИК-дальномер SHARP GP2D120, сервомашинка, ЖК-экран. Набор всевозможного крепежа, пластинок и уголков. Единственное, что потребуется, чтобы немедленно начать работу с POP-BOT — это питание. Аккумуляторов в наборе, разумеется, нет, так что необходимо подготовить 4 штуки АА. Прилагается хороший CD с программами, документацией, презентациями про Arduino и даже с видео. Подробнейшее и полное опечаток руководство пользователя - на английском (есть и на русском, в электронном виде).

Сборка

Сборка несложна и интересна для студентов.

Небольшое разочарование происходит при попытке прикрепиить ЖК-экран. В нем крепежные отверстия под 2,5 мм, а в наборе есть только 3 мм. Поэтому необходимо запастись крепежом помельче.

Кроме того, нет крепежа, с помощью которого можно было бы правильно закрепить сервомашинку. Для этого нужно вставить в отверстия сервомашинки вначале резиновые втулки, затем латунные, в которые уже продеваются винты. Но винтов такого размера тоже нет в наборе, поэтому крепить её приходится без втулок, только на винты. Это приводит к тому, что «ушки» сервомашинки быстрее отламываются из-за вибрации.

Программирование

На CD есть только дистрибутив Arduino 0017 под Windows. Если нет желания устанавливать уже устаревшую среду (самая новая — Arduino 0022), или нет возможности (например, если стоит Linux), то нужно сделать всего 2 несложные манипуляции:

  1. Установить среду (в Linux - из-под эмулятора wine) и достать оттуда примеры (папка POP-BOT), положить в arduino/examples. Потом эту версию можно удалить.

  2. Добавить в arduino/hardware/arduino/boards.txt дополнительный фрагмент.

Примеры программ, приложенные к роботу, оставляют смешанные чувства. Их много, они разнообразны и разной сложности — от «азбуки» вроде мигания светодиодом и управления сервомашинкой, до несложных алгоритмов обнаружения объекта и езды по линии. С другой стороны, написаны они немного на скорую руку, и в основном сделаны методом хардкодинга, то есть все повороты и отрезки записаны константами. Никаких калибровок, порогов — всё подобрано заранее. Поэтому ничего удивительного, что более-менее сложные алгоритмы из примеров сразу не работают, и даже простую езду по линии пришлось редактировать и дописывать код. Кстати, это хорошее упражнение для студентов и шанс устроить соревнование.

Устройство платы

В качестве платы используется модуль POP-168. Он является Arduino-совместимым. Если сравнить с Arduino Nano, то бросается в глаза немного другое расположение выводов, и «урезанность» платы: D10, D11, D12, D13 заняты под разъём ISP-программатора и не выведены сбоку. Но, как бы то ни было, все выводы можно использовать. Нет стабилизатора на 5В (он есть на «большой» плате) и 3.3В.

Выведены 7 аналоговых входов. К ним подключается через разъёмы JST (Japanese Solderless Terminal) вся периферия (датчики, экран). Расположение выводов такое же, как у ИК-дальномеров SHARP GP2D120 и модулей DFRobot, так что дополнительные устройства подключаются без труда. Разъёмы с ключами, так что при всём желании их нельзя вставить неправильно. Их трудно вынимать из гнезда, приходится подцеплять ногтями или щипчиками. На практике обжимка таких разъёмов сложна из-за небольших размеров. Продаются в магазине «Кварц», если необходимо подключить к роботу что-либо не из набора. Для сервомашинок — два отдельных выхода, сделаны тоже с учетом стандартного расположения проводов у сервомашинки. Экран снабжен встроенным контроллером и соединяется с основной платой по интерфейсу RS-232. На плате робота не выведен отдельно аппаратный UART, поэтому экранчик подсоединяется при помощи SoftwareSerial на свободном выходе.

Остальные выводы: 2 кнопки (в режиме входа)/светодиода (в режиме выхода), ценный аналоговый вход А0 работает как выход и занят под динамик. 4 выхода заняты для управления моторами, 4 выведены на программатор. Ещё 2 — RX и TX. Выходит, подключить можно сразу всё, что есть в комплекте: сервомашинку, ИК-дальномер, 2 кнопки, 2 датчика полосы, экранчик, и ещё останутся свободные выводы.

К сожалению, заняты оба вывода с внешним прерыванием. Но проблема невелика. Почти на всех выводах микроконтроллера ATMega88/168/328 можно включить внешние прерывания по смене состояния (с высокого на низкое) — называется PinChangeInterrupt, есть библиотека PCInt. Зато, что гораздо важнее, свободны выводы SDA и SDL для подключения устройств с интерфейсом I2C.

Задачи с роботом

1. Сборка робота

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

После того, как робот собран в минимальном варианте (пока без датчиков), нужно подсоединить моторы и попробовать запрограммировать базовые движения: старт, стоп, повороты, движение с заданными маневрами, движение по времени. Чтобы студенты могли их написать, достаточно только указать им номера выводов, которые подсоединены к микросхеме управления моторами. Эти движения обязательно нужно оформить как функции, чтобы использовать в дальнейшем.

Когда эти функции отлажены, хорошим заданием на дом будет поместить их в объекты класса «Мотор», то есть переписать эту несложную программу в С++. В конструктор мотора передаются два номера вывода. У мотора есть методы «Вращаться вперёд», «Вращаться назад», «Остановиться». В качестве параметров туда передаётся скорость. Также можно вынести всё в отдельный файл и использовать как библиотеку для дальнейших проектов. Для этого нужно посмотреть, как устроены библиотеки Arduino и оформить аналогично.

2. Отъезд от препятствий

В этой задаче необходимо подсоединить кнопки к роботу и заставить его отъезжать от препятствий при касании. Дополнительный вариант этой задачи — подключить ИК-дальномер SHARP GP2D120 и отъезжать при встрече с препятствием на расстоянии.

Код, имеющийся в примерах (файл BumperRobot.pde), вполне работает, но полезнее написать его самостоятельно, чтобы освоить работу со входами.

3. Езда по линии с одним датчиком

Самая первая задача — это езда по линии с одним датчиком, когда робот отслеживает край линии. Входящий в набор пример программы не очень хорош и предназначен для варианта с двумя датчиками, поэтому лучше написать её самостоятельно, дополнив предыдущую программу. Хорошо, если студенты попробуют разные варианты расположения датчика относительно робота: под основанием, на длинном креплении, строго по центру или чуть с краю.

4. Езда по линии с двумя датчиками

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

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

5. Калибровка

Когда становится понятно, что подбирать параметр Ref долго и сложно, естественно встаёт вопрос о калибровке датчиков робота. Несложно написать код, в котором дважды производятся измерения по нажатию кнопки. Затем берется среднее арифметическое и оно считается параметром Ref. Эта процедура выполняется для обоих датчиков линии. Задача простая и вполне может быть выполнена дома.

6. Езда с компасом

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

Компас HMC6352 подключается через интерфейс I2C. Купить его можно в магазине 4robots.ru. Вначале необходимо подключить компас к плате Arduino. Для этого нужно открыть в Интернете страничку про него на сайте sparkfun и посмотреть Wiring Example - схему подключения и пример программы. Затем можно поднести магнит (он есть в любом электромоторе) и посмотреть, как изменятся показания компаса.

Затем можно ставить компас на робота при условии, что заблаговременно подготовлен провод с разъёмами JST для подключения к плате робота.

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

7. Энкодеры

Роботу очень полезно обладать хотя бы примитивной системой одометрии. Очень часто для измерения пройденного пути используют оптические энкодеры, подобные тем, что есть в механической «мышке».

Возможно соорудить энкодеры из входящих в набор ИК-отражателей. Бумажные круги должны быть заранее нарисованы и распечатаны в AutoCAD. На каждом — по 20 чёрных и 20 белых полосок. Для начала, энкодеры нужно очень аккуратно закрепить так, чтобы датчик не тёрся о колесо, и при этом был бы достаточно близко к нему, чтобы различать полоски. Чтобы оценить, насколько точно закреплён датчик, необходимо написать простую программу, которая бы считала количество переходов между белым и чёрным и выводила их на экран компьютера. То, что видят в данный момент датчики (черную или белую полосу), удобно выводить на встроенных светодиодах D2 и D4.

На практике, если крутить колесо рукой и смотреть на счетчик полосок, и на левом, и на правом «пропадает» 2-3 полоски, то есть после полного оборота колеса датчик насчитывает около 37 переходов.

Самая простая задача с энкодерами — это выровнять скорости моторов, приведя их какой-либо заданной наперед скорости. Это получается при помощи ПИ-регулятора (Д-составляющая здесь была не очень критична).

Программа получается длинная и сложная.