Благодарности
Введение
Глава 1. Конструируем мобильного робота
Выбираем контроллер
Глава 2. Знакомство и первые проекты
Загрузка и установка mBlock на компьютер
Настраиваем mBlock for PC
Выбираем плату контроллера
Расширения для среды mBlock
Установка расширений для среды mBlock
Подключаем робота к компьютеру
Проект 1. «Поговорим? Азбука Морзе»
Проект 2. «Поиграем? Панда с мячом»
Проект 3. «Пульт управления»
Проект 4. «Общительная Панда»
Проект 5. «Покатаемся? 9 вариантов движения»
Проект 6. «Управление сочетанием клавиш»
Глава 3. Умный робот. Автоматизация
Проект 7. «Доведи до линии, дальше я сам!»
Проект 8. «Движение по линии. Вернусь сам»
Проект 9. «Самостоятельный робот».
Проект 10. «Примите команду!»
Проект 11. «Три варианта следования по линии»
Проект 12. «Дискотека».
Глава 4. Больше возможностей. Используем сервомотор и гироскоп
Проект 13. «Метроном»
Проект 14. «Уклонение»
Проект 15. «Калибровка»
Проект 16. «Локатор на посадочном модуле»
Проект 17. «Парковка»
Проект 18. «Знакомьтесь, это — гироскоп!»
Проект 19. «Звёздные гонки!»
Глава 5. «Всё чудесатее и чудесатее!»
Проект 20. «Квадрокоптер на солнечных батареях»
Проект 21. «Спасательный вертолётик»
Проект 22. «Сохраняем верный курс»
Проект 23. «Пристальный взгляд»
Проект 24. «Еду туда, куда смотрю»
Проект 25. «Острое зрение». Сортировка массива значений, медиана
Проект 26. «Острое зрение 2. Дистанция»
Проект 27. «Острое зрение 3. Суперлокатор»
Проект 28. «Точные перемещения, калибровка»
Глава 6. Вы готовы экспериментировать?
Проект 29. «Пульт дистанционного управления. Осваиваем MindPlus»
Проект 30. «Управление двигателями. Знакомимся со Snap4Arduino»
Проект 31. «По клеточкам!»
Проект 32. «Навигатор в лабиринте»
Заключение
Приложение. Дополнительные проекты
Проект «Готовность! Тестируем систему»
Arduino IDE. Плоттер по последовательному соединению. Рисуем графики!
Проект «Демонстрация»
Блок _geekServo своими силами
Аппаратная конфигурация робота
Текст
                    
Санкт-Петербург «БХВ-Петербург» 2022
УДК 004.43-053.2 ББК 32.973.26-018.1 Г83 Григорьев, А. Т. Г83 Робототехника в школе и дома. Книга проектов / А. Т. Григорьев, Ю. А. Винницкий. — СПб.: БХВ-Петербург, 2022. — 240 с.: ил. ISBN 978-5-9775-6837-1 Книга написана на основе опыта работы с учениками 3–11-х классов. Материалы оптимизированы для самостоятельного изучения и для занятий по робототехнике в образовательных учреждениях. Рассмотрено программирование мобильных роботов на платформе Arduino в Scratch-подобных визуальных средах mBlock, MindPlus и Snap4arduino. Описано создание более 30 игровых и образовательных проектов в двух режимах: интерактивном и автономном. Сложность проектов нарастает от ознакомительных, для учеников младших классов, до соревновательных. Рассмотрены задачи ориентирования и навигации робота с помощью датчиков линии, гироскопа и поворотной головы с УЗ- и ИК-дальномерами и другие проекты. Даны примеры проектов имитационного моделирования, не требующие наличия реального робота. Электронный архив на сайте издательства содержит дополнительные материалы и листинги всех программ. Для детей школьного возраста, родителей и педагогов УДК 004.43-053.2 ББК 32.973.26-018.1 Группа подготовки издания: Руководитель проекта Евгений Рыбаков Зав. редакцией Людмила Гауль Оформление обложки Зои Канторович «БХВ-Петербург», 191036, Санкт-Петербург, Гончарная ул., 20. ISBN 978-5-9775-6837-1 © Григорьев А. Т., Винницкий Ю. А., 2022 © Оформление. ООО «БХВ-Петербург», ООО «БХВ», 2022
Содержание Благодарности..............................................................................................................6 Введение..........................................................................................................................7 Глава 1. Конструируем мобильного робота.................................................10 Выбираем контроллер................................................................ 10 Глава 2. Знакомство и первые проекты....................................................... 15 Загрузка и установка mBlock на компьютер........................... 15 Настраиваем mBlock for PC........................................................ 17 Выбираем плату контроллера.................................................. 18 Расширения для среды mBlock.................................................. 19 Установка расширений для среды mBlock.............................. 20 Подключаем робота к компьютеру.......................................... 23 Проект 1. «Поговорим? Азбука Морзе».................................. 27 Проект 2. «Поиграем? Панда с мячом»................................... 35 Проект 3. «Пульт управления».................................................. 44 Проект 4. «Общительная Панда»............................................. 52 Проект 5. «Покатаемся? 9 вариантов движения»................. 57 Проект 6. «Управление сочетанием клавиш»....................... 60 Глава 3. Умный робот. Автоматизация.........................................................65 Проект 7. «Доведи до линии, дальше я сам!»....................... 65 Проект 8. «Движение по линии. Вернусь сам»...................... 74 СОДЕРЖАНИЕ 3
Проект 9. «Самостоятельный робот». Осваиваем автономный режим............................................... 77 Проект 10. «Примите команду!»............................................... 88 Проект 11. «Три варианта следования по линии»................ 91 Проект 12. «Дискотека». Инфракрасный пульт управления............................................ 98 Глава 4. Больше возможностей. Используем сервомотор и гироскоп...............................................................................................106 Проект 13. «Метроном»............................................................107 Проект 14. «Уклонение»...........................................................110 Проект 15. «Калибровка».........................................................112 Проект 16. «Локатор на посадочном модуле»....................118 Проект 17. «Парковка»..............................................................125 Проект 18. «Знакомьтесь, это — гироскоп!»..........................130 Проект 19. «Звёздные гонки!».................................................134 Глава 5. «Всё чудесатее и чудесатее!»......................................................138 Проект 20. «Квадрокоптер на солнечных батареях»...........................................................139 Проект 21. «Спасательный вертолётик»...............................144 Проект 22. «Сохраняем верный курс»..................................151 Проект 23. «Пристальный взгляд».........................................168 Проект 24. «Еду туда, куда смотрю»......................................171 Проект 25. «Острое зрение». Сортировка массива значений, медиана.............................178 Проект 26. «Острое зрение 2. Дистанция»...........................186 Проект 27. «Острое зрение 3. Суперлокатор».....................194 Проект 28. «Точные перемещения, калибровка»...............196 4 СОДЕРЖАНИЕ
Глава 6. Вы готовы экспериментировать?................................................ 199 Проект 29. «Пульт дистанционного управления. Осваиваем MindPlus»................................................................199 Проект 30. «Управление двигателями. Знакомимся со Snap4Arduino»................................................204 Проект 31. «По клеточкам!».....................................................213 Проект 32. «Навигатор в лабиринте»....................................223 Заключение............................................................................................................... 228 Приложение. Дополнительные проекты......................................................229 Проект «Готовность! Тестируем систему».............................229 Arduino IDE. Плоттер по последовательному соединению. Рисуем графики!................................................230 Проект «Демонстрация»..........................................................235 Блок _geekServo своими силами............................................236 Аппаратная конфигурация робота........................................237 СОДЕРЖАНИЕ 5
Благодарности Авторы благодарят фонд Темура Аминджанова и Сергея Вильского «Финист» за поддержку своих исследований и помощь в организации масштабной работы на занятиях с группами детей и подростков. Отдельная благодарность художнику Наталье Завадской за создание художественного образа робота и креативных заставок к каждой главе. Спасибо коллективу издательства «БХВ» и лично Евгению Рыбакову, Игорю Шишигину и Анне Кузьминой за активную помощь и поддержку в процессе работы над книгой. 6 БЛАГОДАРНОСТИ
Введение В ваших руках весьма необычная книга по робототехнике. Это сборник проектов для юных (и не только) конструкторов. В XXI веке уже не надо рассказывать читателям о том, что такое роботы и где их можно встретить в обычной жизни. Во многих домах трудятся роботы-­пылесосы, на заводах используются роботизированные станки, в воздухе часто видны квадрокоптеры, новости пестрят рассказами о достижениях робототехники, проходят соревнования спортивных роботов, в которых уже давно принимают участие и школьники… Все уже понимают, что робот не обязан быть похожим на человека; главное, чтобы он выполнял к­ акую-то работу! Само слово «робот» придумал чешский писатель Карел Чапек ещё в начале прошлого века, и в названии фантастических механизмов, способных выполнять опасные и тяжёлые задачи вместо людей, лежит чешское слово robota, означающее каторгу, подневольный труд. В настоящее время можно найти в продаже множество готовых наборов для сборки роботов либо купить нужные компоненты по отдельности и собрать собственную конструкцию. Проблема, обычно возникающая после сборки, — что делать с роботом дальше? И это не простой вопрос. Очень нужны проекты, в ходе выполнения которых робот продемонстрирует свои возможности, а конструктор начнёт лучше разбираться в робототехнике и смежных дисциплинах. Набор именно таких проектов представлен в книге. Сложность будет нарастать постепенно, нас ждёт путь от элементарных задач, с которыми справится начинающий юный исследователь, до весьма головоломных, представляющих интерес даже для опытных робототехников. Пожалуй, хватит общих слов, давайте лучше почётче определим, чем нам предстоит заниматься. А будем мы осваивать программирование мобильных роботов в визуальных средах разработки приложений. И постараемся сделать этот процесс понятным и интересным. Мобильный робот по определению должен иметь конструктивные элементы, позволяющие ему передвигаться. В зависимости от типа этих элементов робот может быть колёсным, шагающим или гусеничным, а ещё существуют ползающие, плавающие и летающие мобильные роботы. Самые разные конструкции, реальные и фантастические, можно увидеть в фильмах и мульт­ фильмах, например в ставшем уже классикой «Валли». ВВЕДЕНИЕ 7
Мобильные роботы в мультфильме «Валли» Мы возьмём за основу самый распространённый и доступный вариант на базе колёсного шасси с двумя ведущими колёсами и двумя моторами. В дополнение к этим базовым возможностям наш робот получит ещё и сервопривод, чтобы крутить головой направо и налево. Такой конструкции будет достаточно для множества проектов, а разобравшись с управлением и программированием, вы сумеете взяться и за проектирование других роботов, даже плавающих и летающих. Основное внимание мы будем уделять не столько схемотехнике или конструированию, сколько программированию. А тем, кого интересует, как работает электронная «начинка» роботов и других программируемых устройств, советуем почитать об этом в нашей книге «Scratch и Arduino для юных программистов и конструкторов». Если раньше программирование требовало длительного изучения специальных языков и было доступно узкому кругу посвящённых, то сравнительно недавно произошла настоящая революция: появились новые визуальные среды разработки приложений, в которых программа складывается из понятных кирпичиков. Даже самые юные пользователи получили возможность сочинять собственные программы! Но не думайте, что визуальные среды годятся лишь для малышей. Отсутствие необходимости вылавливать ошибки синтаксиса в сочетании с чёткой структурой и наглядностью скриптов помогают и взрослым разработчикам увеличить скорость создания и качество проектов. Многие специалисты считают, что за таким визуальным программированием из кирпичиков огромное будущее, и совсем скоро в подобном стиле будут 8 ВВЕДЕНИЕ
программироваться профессиональные прикладные системы, например промышленные роботы, что даст очередной импульс их широкому использованию. В книге мы расскажем о том, как запрограммировать несложного мобильного робота, покажем, как с ним можно играть, научим управлять им с различных устройств, использовать несколько популярных сред визуального программирования. Робот будет создан на свободной основе, поэтому мы обязательно продемонстрируем, как с помощью доступных деталей можно его усовершенствовать и научить выполнять новые действия! А главное, вы увидите, что мир технического творчества действительно безграничен и доступен каждому, кто хотел бы в него заглянуть. И кто знает, может быть, вы стоите на пороге выбора своей будущей профессии? Условные обозначения Жирным шрифтом выделены элементы интерфейса программ — меню, команды, кнопки. . Названия блоков программирования выделены так: Названия проектов, имена файлов, спрайтов и костюмов выделены цветом. Названия переменных и параметров выделены узким жирным шрифтом. Названия клавиш клавиатуры заключены в угловые скобки, например <Пробел>. Электронный архив В электронном архиве вы найдёте файлы всех проектов, описанных в книге. Скачать его можно по ссылке ftp://ftp.bhv.ru/9785977568371.zip или найти на странице книги на сайте издательства по адресу www.bhv.ru. Помимо финальных программ там расположены и промежуточные версии, по которым шаг за шагом можно проследить путь создания проекта. Таким образом, если ч­ то-то и пойдёт не так, как рассказывается в книге, можно заглянуть в архив и посмотреть, как должен был выглядеть результат на том или ином этапе разработки. Помимо версий проектов, предназначенных для робота базовой конфигурации, вы найдёте в электронном архиве и версии для робота на базе Arduino MEGA 2560. Файлы этих проектов имеют соответствующие пометки в своём имени. ВВЕДЕНИЕ 9
Конструируем мобильного робота Выбираем контроллер Контрóллер (от английского слова controller — регулятор, управляющее устройство) — это устройство управления. Именно контроллер будет получать информацию от «органов чувств» робота, обрабатывать её и отдавать исполнительным механизмам приказы: крутить колёса, зажигать светодиоды, вращать головой и так далее. За последнее десятилетие в мире появилось много различных и доступных робототехнических контроллеров. Многие из них базируются на свободной платформе Arduino. Поначалу юным робототехникам будет вполне хватать возможностей самых простых и дешёвых контроллеров, а позже несложно переключиться на использование более мощных, хотя и более дорогих. Мы выбрали одну из наиболее доступных платформ, совместимую с платой прототипирования Arduino Uno с чипом ATmega328. Полностью открытая архитектура позволяет разным производителям свободно копировать или дополнять Arduino-­контроллеры новым функционалом, дорабатывать их под различные задачи. Ну а для нас немаловажной будет возможность использовать огромное количество доступных электронных компонентов, совместимых с Arduino, для усовершенствования нашего робота. Мы не будем останавливаться на описании самой платы прототипирования Arduino Uno, её характеристик и количества портов, всё это вы без труда найдёте в Интернете либо в нашей книге «Scratch и Arduino для юных программистов и конструкторов». Обратим лишь внимание, что для мобильного робота на основе самостоятельно собранного контроллера обычно требуются следующие компоненты. 10 Глава 1
1. Плата Arduino Uno. 2. Драйвер двигателей, который принимает сигналы от портов контроллера и на их основе управляет работой ходовых двигателей, а иногда и других приводов. 3. Приводы (актуаторы) — разнообразные исполнительные механизмы, благодаря которым робот либо перемещается сам, либо манипулирует предметами, поворачивает голову и так далее. 4. Различные датчики, которые можно назвать органами чувств робота, позволяющие собирать информацию о внешнем мире (уровень освещения, расстояние до препятствия, касание объекта и так далее). Сигналы датчиков отправляются в контроллер, и на их основе программа принимает решение, например робот останавливается перед преградой. 5. Источник звука (зуммер, пьезоизлучатель, спикер) для подачи звуковых сигналов. 6. Источники света. Различные светодиоды (одноцветные, многоцветные) используются как для освещения, так и для подачи разнообразных сигналов во время исполнения программы. Робот собственной конструкции может иметь шасси из самых разных материалов, например из фанеры, листового пластика или из деталей конструктора, оказавшихся под рукой. Пример такого робота, использующего Arduino Uno, распространённые электронные компоненты и моторы, с шасси из деталей детского конструктора, можно посмотреть на рис. 1.1. Робот имеет поворотную голову с датчиком расстояния на сервоприводе, датчик света и Bluetooth-­модуль, обеспечивающий беспроводную связь и управление с другого устройства, например планшета или смартфона. Ну а то, что в качестве связующих элементов использованы резинки и пластиковые стяжки, не мешает этому роботу выполнять запрограммированные действия. Зато просто, дёшево и всё собрано своими руками. Но конечно же, у самостоятельно собранных роботов есть и недостатки. В то время как промышленные решения позволяют разместить на одной плате массу электронных компонентов и соединить их пайкой, робототехнику-­любителю приходится коммутировать всё проводами, которые во время эксплуатации могут выскочить из разъёмов. Из-за обилия торчащих во все стороны проводов пользоваться роботом становится неудобно. Кроме того, новички вполне могут допустить ошибки при сборке, в результате ­что-то может выйти из строя. Конструируем мобильного робота 11
Рис. 1.1. Робот на основе контроллера Arduino Uno Для первого знакомства с робототехникой желательно использовать такой набор, который позволит собрать робота без особых проблем. Читатели, которые уже имеют опыт и освоились в мире электронных самоделок, могут попытаться скомпоновать и собрать собственного робота самостоятельно. Мы подготовили рекомендации по сборке робота на базе Arduino MEGA 2560 (рис. 1.2), с которыми можно ознакомиться на сайте издательства и сайте «Лаборатория проектов 169» (http://www.lab169.ru). Более мощный контроллер позволит подключить большее число внешних устройств, в результате станут доступными не только проекты из данной книги, но и более сложные и интересные. В частности, на такого робота можно установить двигатели с энкодерами для точных перемещений на заданную дистанцию. Для выполнения проектов из нашей книги робот должен обладать определённым минимальным набором функциональных возможностей, например, иметь «на борту» программную кнопку, светодиодную индикацию, зуммер и так далее. Если всё необходимое у вашего робота присутствует, его можно будет научить выполнению представленных проектов, но скорее всего вам потребуется указывать, к каким именно портам подключен тот или иной датчик. Контроллеры, с которыми мы тестировали проекты, имеют определённую аппаратную конфигурацию. Мы постарались сделать так, чтобы как можно меньше отвлекаться на указание конкретных портов подключения, поэтому 12 Глава 1
Рис. 1.2. Робот на основе контроллера Arduino MEGA прописали их в настройках программного обеспечения, которое будем использовать. Подобную операцию можно осуществить и для альтернативных робототехнических контроллеров, например базирующихся на Arduino MEGA 2560. Таким образом, скрипты проектов данной книги без ­каких-либо изменений будут годиться для использования с различными роботами, в том числе самодельными. Мы предполагаем, что большинству читателей удобнее будет воспользоваться готовым промышленным решением, специально предназначенным для мобильной робототехники, в котором базовые компоненты уже подключены и расположены «на борту», на той же самой плате, на которой располагается «мозг» робота — чип ATmega328. Сразу, без переделок, с проектами из книги можно использовать робототехнический контроллер Lafvin либо контроллер mCore, разработанный компанией Makeblock. У этих производителей есть собственные робототехнические учебные комплекты, однако они не включают в себя то периферийное оборудование, на которое мы будем ориентироваться в данной книге. Оба этих контроллера базируются на чипе ATmega328 и совместимы с Arduino Uno, имеют удобные разъёмы с защёлками для подключения внешних датчиков и массу встроенных электронных компонентов, включая драйвер двигателя. Конструируем мобильного робота 13
В нашей книге мы будем приводить иллюстрации с использованием нового набора, скомпонованного издательством «БХВ» (рис. 1.3). В набор входят все нужные конструктивные элементы и инструкция по сборке. Рис. 1.3. Базовая конфигурация робота 14 Глава 1
Знакомство и первые проекты В этой главе мы познакомимся со средой разработки mBlock и её дополнениями, а заодно освоим создание простых программ для управления роботом. В первом проекте наш робот научится передавать сообщения. Начать следует с установки на компьютер среды программирования mBlock версии 3, которую мы считаем наиболее универсальной и удобной для программирования роботов на основе Arduino. Компания Makeblock разработала её уже достаточно давно, и в настоящее время существуют и другие среды визуального программирования, превосходящие mBlock в определённых сценариях использования. Мы познакомимся с лучшими из них чуть позже. Несмотря на наличие более современных конкурентов, по совокупности качеств и проработанности среде mBlock3 до сих пор нет равных. Загрузка и установка mBlock на компьютер Официальная страница загрузки mBlock — https://www.mblock.cc/en-us/ download. Разработчики предлагают воспользоваться самой свежей версией своей программы — mBlock 5. Однако их проверенный и отлаженный продукт mBlock 3 гораздо лучше подходит для наших целей и прекрасно работает со свободными Arduino-­платформами, а программировать новых проприетарных роботов компании Makeblock мы не собираемся. Кроме того, прежняя версия среды оказалась чрезвычайно интересной и востребованной энтузиастами-­программистами во всём мире. Разработчики Makeblock предоставили всем желающим удобный механизм написания собственных расширений, наделяющих среду новыми Знакомство и первые проекты 15
возможностями, а также средства для удобного поиска и установки данных расширений прямо из интерфейса программы. В результате с учетом наличия богатейшей библиотеки расширений именно версия 3 в настоящий момент предпочтительнее для использования в нашей книге. Поддерживается большое количество существующих контроллеров, плат расширения и других электронных компонентов; кроме того, совершенствуются программные функции, появляются новые возможности. Благодаря новаторскому подходу компании Makeblock в своё время появилось расширение AdvancedArduino, написанное и проверенное на деле авторами этой книги. Данное расширение принципиально изменило границы применимости среды mBlock, дополнив возможности визуального программирования элементами, свой­с твенными профессиональным средствам разработки. Об эффективности инструментов, предоставляемых AdvancedArduino, свидетельствуют победы детей, использующих его в робототехнических соревнованиях. Конечно же, через к­ акое-то время и в других средах визуальной разработки появится всё необходимое, а пока мы в нашей книге будем опираться на mBlock 3 с соответствующими расширениями. Вам потребуется прокрутить страницу загрузки www.mblock.cc/en-us/ download до заголовка Other mBlock software с надписью Download и выбрать версию mBlock 3 для своей операционной системы (рис. 2.1). Рис. 2.1. Нажмите кнопку Download в группе mBlock 3 for Windows, если ваш компьютер работает под управлением Windows 16 Глава 2
Примечание Программа mBlock способна работать в операционных системах Windows, Mac OS X и Linux. Загрузив версию для вашей операционной системы, установите её на компьютер. Мы будем рассматривать работу mBlock в операционной системе Windows. После загрузки программу следует установить. В случае использования Microsoft Windows просто дважды щёлкните мышью по загруженному файлу. Установка программы проблем не вызывает, дождитесь окончания процесса, и всё — среда mBlock готова для первого запуска! Запустив mBlock после установки, вы увидите главного персонажа программы — симпатичную панду (рис. 2.2). Если вы ранее работали с популярной средой программирования Scratch, то отметите, что внешний вид окна mBlock и элементы управления (говорят «интерфейс», от английского слова interface — взаимодействие) в этих программах очень похожи. Так что, научившись работать в одной среде, вы Рис. 2.2. Талисман mBlock — панда с лёгкостью перейдёте в другую. Настраиваем mBlock for PC Приступим к настройке среды mBlock и подключению робота. Только после этого он начнёт слушаться тех команд, которые мы отправляем ему с ком­ пьютера. Вн и ман и е! На время предварительной настройки не подключайте робота к компьютеру и не включайте его питание! Мы обязательно скажем, когда это стоит сделать. Вначале для удобства можете поменять язык интерфейса на русский. Не всё окажется хорошо и правильно переведено, но команды меню станут понятнее. Хотя, если вы изучаете английский язык и уже неплохо его понимаете, Знакомство и первые проекты 17
можете оставить английский вариант. Для изменения языка интерфейса служит команда главного меню Language (в переводе с английского — язык, рис.  2.3). Рис. 2.3. Меню выбора языка Выбираем плату контроллера Далее необходимо выбрать правильную плату контроллера, чтобы программа mBlock использовала соответствующую систему команд. Для выбора откройте в главном программном меню пункт Boards (в переводе с английского — плата; рис. 2.4). В этом меню перечислены платы, с которыми умеет работать mBlock. Робот, который мы используем в книге, имеет конфигурацию, совместимую с контроллером mCore. Выберите соответствующий пункт меню. 18 Глава 2
Рис. 2.4. Выбор платы контроллера Примечание Большинство проектов данной книги можно реализовать на основе стандартных плат Arduino Uno или Arduino MEGA 2560. В случае альтернативной конфигурации робота может потребоваться выбор иной платы в меню Boards. Информацию об особенностях работы с разными контроллерами при реализации проектов книги мы будем размещать на сайте www.lab169.ru и сайте издательства «БХВ-Петербург». Расширения для среды mBlock Теперь пришла пора подключить к mBlock расширения, которые дополнят возможности программы. Эти дополнения к mBlock, созданные программистами всего мира, позволяют реализовывать впечатляющие, разнообразные и практически профессиональные проекты в блочной среде программирования. Распространено мнение, будто блочные визуальные среды годятся лишь для знакомства с азами, в то время как удел «настоящих» программистов — текстовые языки. Раньше были основания так считать, но теперь ситуация поменялась. Можно найти множество примеров, подтверждающих очень простую идею: главной Знакомство и первые проекты 19
заботой разработчика должно быть обеспечение ясной и наглядной структуры проекта, реализация корректной программной логики. Блочные языки в этом отношении не только не уступают текстовым, но и способны их превзойти. Действительно, в ходе робототехнических соревнований победителями нередко оказываются именно те участники, которые создают программы в визуальных средах, благодаря чему меньше отвлекаются на борьбу с синтаксическими ошибками и основное своё время тратят на содержательные и технические вопросы. Сосредоточиться на главном, не увязая в деталях, позволяют библиотеки готовых программных блоков. Предположим, программисту периодически приходится решать однотипные задачи. Логично будет не изобретать велосипед каждый раз заново, а сделать соответствующий блок, который можно будет использовать повторно. И если оформить свою библиотеку блоков общепринятым способом и предоставить её в совместное использование, то это расширение визуальной среды программирования сможет пригодиться не только создателю, но и многим другим людям. Существуют расширения, обеспечивающие использование специфического оборудования, например особых датчиков или моторов. Но есть и достаточно универсальные, упрощающие работу и добавляющие возможности в самых разных ситуациях. Для начала мы предлагаем познакомиться с расширением simpleBot. Оно позволит нам удобно и просто программировать роботов, собранных из разных электронных компонентов, но имеющих сходные конфигурацию и набор функций. В дальнейшем мы познакомим вас и с другими полезными расширениями. Установка расширений для среды mBlock Существует два основных способа установки расширений, но в любом случае начать следует с запуска среды mBlock 3. Способ первый — из online-­библиотеки расширений Выберите команду меню Extensions > Manage Extensions (Расширения > Управления расширениями). Появится соответствующее окно. Вкладка Available показывает доступные на текущий момент расширения, размещённые на сайте Makeblock, во вкладке Installed отображаются уже установленные. Строка Search позволяет искать расширения по названию. 20 Глава 2
Введите в поисковую строку название нужного нам расширения, сейчас это simpleBot. Вы увидите результат поиска. Проверьте название и автора (рис. 2.5). Рис. 2.5. Нужное расширение найдено. Отображается самая свежая на текущий момент версия (в данном случае 1.9) Обратите внимание на ссылку More Info. Она ведёт на страницу разработчиков, где можно посмотреть дополнительную информацию и примеры использования, скачать расширение в виде архивного файла, посмотреть новости проекта и так далее. Но вернёмся к установке. Нажмите кнопку Загрузка и подождите, пока расширение загрузится и установится (список доступных расширений обновится, весь процесс займёт несколько секунд). Теперь можете выбрать вкладку Installed и проверить наличие на ней simpleBot. Заодно обратите внимание на кнопку Remove (Удалить), позволяющую удалить случайно установленное или больше не нужное расширение. Если для установленного расширения существует обновление, рядом отображается кнопка Update (Обновить). Способ второй — установка расширения из файла, сохранённого на диске Расширение можно добавить и с помощью специального файла. Например, если независимые разработчики разместят его на собственной веб-странице, либо преподаватель разошлёт по почте своим ученикам, специально создав для изучения нужной темы. Так, simpleBot можно загрузить на нашем сайте в разделе https://www.lab169.ru/mblock/extensions/simplebot/. Знакомство и первые проекты 21
Рассмотрим, как установить расширение из архивного файла, сохранённого на диске. Следует открыть всё то же окно Manage Extensions и нажать расположенную внизу кнопку Add Extension (Добавить расширение). В появившемся окне необходимо выбрать тип загруженного файла (в нашем случае это zip file (*.zip)), указать его расположение и нажать кнопку Открыть. Готово. Установка из файла может очень выручить в тех ситуациях, когда компьютер временно или постоянно лишён выхода в Интернет либо онлайн-­сервис по ­каким-то причинам недоступен. Итак, расширение установлено, можно переходить к его освоению. Отметим, что это расширение можно использовать не только с mBlock 3, но и с другими средами на базе Scratch 2 — AlphaBlock (https://www.waveshare.com/wiki/ KitiBot-­MG), MagicBlock (http://www.emakefun.com/en/download), WeeeCode (https://www.weeemake.com/en/download/). Не забывайте, что существует и масса других, не менее интересных расширений! Например, для работы с Интернетом вещей (IoT) либо для использования элементов искусственного интеллекта в собственных проектах (да-да, такие возможности тоже есть!). Открывающиеся перспективы настолько широки, что их не рассмотреть в рамках одной книги. Мы постараемся освоить лишь некоторые общие приёмы на примере использования наших авторских расширений. А теперь хорошо бы проверить, что нам доступны именно те кирпичики (блоки) для соРис. 2.6. Меню выбора бирания программ, которые мы используемых расширений хотим использовать. Откройте меню Extensions (Расширения) и убедитесь, что «галочка» (маркер) стоит лишь напротив пункта simpleBot (рис. 2.6). Пока отключите лишнее, чтобы не путаться. 22 Глава 2
Примечание Если вы используете робота на базе другого микроконтроллера, например Arduino MEGA 2560, вам потребуется установить и использовать иное расширение среды mBlock, в данном случае с названием smartBot2560. Скрипты всех проектов при этом будут выглядеть точно так же (за исключением символа-­маркера и названия заголовочного файла). Подробности смотрите на сайте www.lab169.ru и сайте издательства «БХВ-Петербург». Подключаем робота к компьютеру Ну вот, всё уже почти готово к подключению робота. Осталось понять, к какому соединению в компьютере он будет подключен (говорят «определить коммуникационный порт»). Вначале проверьте, какие коммуникационные порты уже присутствуют в вашей операционной системе. Щёлкните по пункту меню Соединить. Обычно mBlock подвисает на некоторое время, когда вы первый раз выбираете этот пункт меню. Подождите несколько секунд, пока mBlock снова начнёт реагировать на ваши действия, а потом выберите Соединить > Serial Port (Последовательный порт). Если вы видите, что коммуникационных портов нет, отлично, вы не будете путаться, когда появится новый и единственный, связанный с нашим роботом. Если же список коммуникационных последовательных портов не пустой, запомните (а лучше запишите) все номера портов. Например, на рис. 2.7 уже присутствует порт COM1, запомним. Рис. 2.7. Проверяем коммуникационные порты, записываем уже существующие Знакомство и первые проекты 23
Когда мы подключим робота к компьютеру при помощи кабеля USB и включим его питание, в операционной системе появится новый коммуникационный порт, который получит новый номер. Именно этот порт нам и надо будет использовать для связи. Приступим к соединению. Перво-наперво давайте сделаем одно важное действие: поставим робота на подставку. Вдруг он неожиданно поедет и упадёт со стола? В качестве подставки можно использовать кусок пенопласта или к­ акую-­нибудь коробочку. Главное, размеры подставки должны быть такими, чтобы робот мог свободно вращать колёсами в воздухе. Вообще, рекомендуем использовать такую подставку и в будущем, на первых стадиях написания и отладки программ, это убережёт вашего робота от случайных повреждений. Далее следует убедиться в том, что робот получает питание. Иногда будет достаточно того питания, которое поступает по кабелю USB, но в большинстве случаев для нормальной работы требуется подсоединить аккумуляторную батарею и щёлкнуть выключателем. Готовы? Подключаем! Кабель USB входит в комплект робота (рис. 2.8). Один его конец более плоский (называется USB-A и вставляется в разъём компьютера), а другой похож на квадрат со скошенными углами (USB-B, вставляется в разъём контроллера). Рис. 2.8. Кабель USB: слева — USB-A-разъём (в компьютер); справа — USB-B-разъём (к роботу) Подключите робота USB-кабелем к компьютеру, щёлкните выключателем питания на плате контроллера, если ещё этого не сделали. В списке доступных коммуникационных портов появится новый пункт (в примере на рис. 2.9 это 24 Глава 2
COM3). Запомните или запишите номер появившегося у вас порта. Выберите этот порт при помощи мыши или клавиатуры. Откройте список коммуникационных портов снова, вы увидите, что установлен маркер напротив соответствующего пункта меню, а заголовок программы mBlock изменился и уведомляет нас о том, что соединение установлено (см. рис. 2.9, заголовок окна вверху). Рис. 2.9. Соединение установлено, в примере выбран порт COM3 Если вы щёлкнете по выбранному коммуникационному порту ещё раз, то тем самым снимите установленное соединение. Попробуйте снять соединение и установить его заново. Когда вы убедитесь, что соединение есть (маркер установлен), закройте меню клавишей <Esc> либо щелкнув мышью г­ де-нибудь мимо, например по заголовку программы mBlock. Двигаемся дальше. Требуется объяснить нашему роботу, что он теперь будет работать со средой mBlock. Для этого загрузим специальную служебную программу (прошивку, firmware) в контроллер робота. Выберите пункт меню Соединить > Обновить прошивку (рис. 2.10). Вы увидите, что в информационном окне на экране компьютера побежали проценты. По окончании процесса на экране отобразится уведомление, что загрузка завершена Рис. 2.10. Обновим прошивку робота для работы с mBlock (рис. 2.11). Знакомство и первые проекты 25
Рис. 2.11. Процесс прошивки закончен успешно! Проверяем подключение Пора убедиться в том, что робот действительно готов исполнять наши команды. Выберите на палитре блоков категорию Робот. Вы увидите ещё один признак установленного соединения, индикатор зелёного (а не красного) цвета напротив раздела simpleBot (рис. 2.12). Рис. 2.12. Категория Робот на палитре блоков, индикатор соединения Вы видите множество команд, которые умеет исполнять наш робот. Найдите блок, отвечающий за работу звукового устройства — зуммера (рис. 2.13). Рис. 2.13. Блок управления звуком робота Щёлкните по нему. Получилось? Звук есть? Ура, робот слушается и выполняет команды! 26 Глава 2
Возможно, вам показался долгим и сложным процесс подключения робота к компьютеру и управляющей среде mBlock. Но поверьте, это только в первый раз столько всего надо проверять. В будущем всё просто — подсоединили робота и щёлкнули по порту соединения. Научитесь! Тестируем робота. Пищим, моргаем, двигаемся и измеряем Самое время проверить не только звук, но и остальные функции робота. Ведь никто не может быть уверен в том, что в собранном по инструкции роботе все детали сразу соединены правильно, а все электронные компоненты работают так, как надо. Вы уже настроили среду mBlock и умеете соединять с ней робота для интерактивного управления. Загляните в раздел «Приложения» в конце книги и найдите проект «Готовность! Тестируем систему». Это полностью готовый интерактивный проект для проверки всего оборудования, которое есть у робота. Очень рекомендуем попробовать. Мы периодически будем использовать в проектах готовые или частично готовые программные компоненты, включая скрипты и рисунки, и не всегда у нас будет возможность объяснять, как они созданы (просто объём книги не позволит). Зато у каждого пытливого читателя есть возможность покопаться в скриптах самостоятельно, и по мере продвижения по проектам всё легче будет разбираться в их устройстве. Если при тестировании оборудования обнаружились к­ акие-то проблемы, проверьте по сборочной инструкции правильность соединений и сами соединения. (Ох уж эта проблема хорошего контакта!..) Если же всё хорошо и робот готов к приключениям, перейдём к новым проектам. Проект 1. «Поговорим? Азбука Морзе» Введение в проект Наш робот вполне может разговаривать. Конечно, пока ещё не так, как обычно общаются между собой люди, у него просто нет такого устройства вывода звука (хотя ­когда-­нибудь вы сможете и такое устройство добавить). Зато он может пищать зуммером. Надо лишь научить его издавать понятные всем сигналы. И тут мы не будем изобретать велосипед, а воспользуемся известной Знакомство и первые проекты 27
системой сигналов, которая называется азбукой Мóрзе. Код Морзе состоит из точек, тире и пауз между ними. Рекомендуем прочитать историю кода и о его использовании, вы без труда найдёте эту информацию в Интернете, например по ссылке https://ru.wikipedia.org/wiki/Азбука_Морзе. Почитайте, там хорошо описаны принципы построения сигналов и отличия современных видов морзянки. Также там приведены напевы, то есть определённые словосочетания, позволяющие легче выучить код. Даже обычным людям неплохо бы знать азбуку Морзе, это может сильно выручить в сложных жизненных ситуациях, когда единственным способом подать сигнал будет, например, свет фонарика. Большинство людей знает сигнал бедствия SOS — три точки, три тире, три точки. Но мы же хотим не сигнал бедствия подавать (хотя, можно будет и это попробовать). Давайте научим робота передавать разные слова, а заодно освоим одно из самых важных средств программирования — создание и использование собственных именованных программных блоков. Приступаем к работе Давайте начнём с того, что вы придумаете своему роботу имя. А то как же к нему обращаться? На рис. 2.14 приведена таблица соответствия русских букв и сигналов Морзе. Теперь в среде mBlock создадим блоки для букв, например для О и К; пусть робот первым делом сообщит, что у него всё ОК. 1. Запустите среду mBlock. 2. Подключите робота к компьютеру кабелем USB, включите питание (далее мы будем реже напоминать про включение питания, это действие по умолчанию). 3. Выполните сопряжение с роботом (вернитесь к материалам в начале главы, если ­что-то забыли): проверьте наличие расширения simpleBot, правильный выбор платы контроллера и включите соединение по занятому порту. Рассмотрите интерфейс среды mBlock. Если вы раньше создавали программы в Scratch, то вам всё покажется очень знакомым (рис. 2.15). Если нет — 28 Глава 2
Рис. 2.14. Буквы русского языка в кодах Морзе Рис. 2.15. Интерфейс среды mBlock 3 Знакомство и первые проекты 29
не беда, интерфейс простой и понятный. Слева вверху — сцена, на ней расположилась панда. Панда — это один из спрайтов, в проекте их может быть несколько. Справа — рабочее поле, где и будет создаваться программа, складываемая из блоков (скрипт). А сами блоки берут из раздела блоков (палитры), расположенного посередине. Блоки вытягивают на поле скриптов мышью. Соединяются блоки, как паззл, примагничиваясь друг к другу. В дальнейшем, по мере необходимости, мы будем знакомить вас с другими элементами среды mBlock. А теперь продолжим наш проект. Несмотря на обилие стандартных, уже готовых блоков, нам понадобятся новые. Мы создадим собственные для «разговора» с помощью азбуки Морзе. 1. Собственные блоки создаются при помощи кнопки Сделайте блок, расположенной в палитре блоков в категории Данные и Блоки (рис. 2.16). Рис. 2.16. Кнопка Сделайте блок 2. Нажмите на неё. Вы увидите окно ввода имени. Введём букву О (рис. 2.17). Рис. 2.17. Вводим имя блока 30 Глава 2
3. На рабочем поле у вас появится новая «шапочка» (заголовок опреде(рис. 2.18). ления блока), а в палитре блоков — сам блок Рис. 2.18. Вводим имя блока 4. Пока что под определением блока не стоит никаких команд. Пусть вас это не смущает, мы добавим их позже. А пока создайте ещё один блок, для буквы К, самостоятельно. Для записи букв в кодах Морзе нам потребуются элементы, из которых буквы состоят: точки, тире и паузы между ними. Чтобы объяснить роботу, как говорить «О» и «К», нужны соответствующие блоки (точка, тире и пауза). Совет Предлагаем названия давать по возможности английскими символами, конечно, если у вас нет проблем с восприятием английских текстов. Это будет полезно в последующих проектах, особенно в автономных, когда потребуется ориентироваться в тексте программ, сгенерированных средой mBlock. (точка). В имени мы использовали сим1. Создайте новый блок волы подчеркивания, хотя это не обязательно. Обычно имена блокам дают так, чтобы они несли дополнительную информацию о создаваемом объекте. Мы включаем символы подчеркивания, чтобы обратить внимание на принадлежность этих блоков к основным элементам азбуне буква, а элемент буквы. ки Морзе. Блок Знакомство и первые проекты 31
2. Заполните определение блока . Для этого используйте команды из категорий Робот (расширение simpleBot) и Контроль, ориентируясь на рис. 2.19. Пояснение Рис. 2.19. Создаём определение блока Первый блок играет звук D5 в течение 100 миллисекунд с помощью зуммера, второй — обеспечивает паузу в 0.025 секунды (или 25 миллисекунд) после первого сигнала. Обратите внимание, что если в поле выбора внутри блока (обозначено флажками-­треугольниками) нет нужных цифр, их можно просто набрать с помощью клавиатуры. 3. Создайте ещё два новых блока: тире и паузу (между буквами), соответи , соберите определения блоков по ственно рис. 2.20. 4. Используя новые кирпичики, соберите определения для блоков (см. рис. 2.20). и Рис. 2.20. Набор определений новых блоков проекта 32 Глава 2
5. Вытяните на рабочее поле блоки и , сложите скрипт ОК (рис. 2.21) и запустите его на выполнение, щёлкнув по нему мышью. 6. Если всё правильно, робот пропищит сигнал «ОК» Рис. 2.21. в кодах Морзе. Если звук не раздался, проверьте соСкрипт для воспроизведения единение робота с компьютером (горит ли зелёный сигнала «ОК» индикатор напротив имени расширения в категории Робот (см. рис. 2.12); если нет, повторите соединение робота с портом управления, (см. рис. 2.9). Запустите скрипт на повторное выполнение. 7. Сохраните проект в папку на компьютере. Лучше сразу для проектов создать отдельную папку, назвав её, например, «Мои проекты». Для сохранения проекта воспользуйтесь командой из меню Файл > Save Project As (Сохранить проект как), покажите путь к нужной папке и введите имя проекта (осмысленное, чтобы проще было искать его среди других, например Азбука Морзе). 8. Закройте mBlock, затем вновь запустите среду. Попробуйте открыть предыдущий проект, используя команду меню Файл > Загрузить проект, указав в окне путь к вашему файлу в папке проектов. Подобное действие потребуется делать достаточно часто. Например, если вы не успеете за один раз выполнить целый проект, можно в любой момент времени его сохранить и вернуться к нему позже. В случае сбоев бывает полезно перезапустить среду mBlock. Также вам может понадобиться загрузка готовых проектов из электронного архива к этой книге. Дополнительные задания 1. Вы дали роботу имя. По таблице символов добавьте недостающие буквы. (Не забывайте, в конце каждой буквы нужна пауза!) Соберите скрипт, чтобы робот произносил своё имя. 2. Попробуйте озвучить дополнительные полезные сообщения. Проверьте, как звучат: СОС, СМС, ДА, НЕТ, ошибка, конец связи, 73 (это пожелание удачи у радистов; как кодируются цифры 7 и 3 — выясните самостоятельно). Между отдельными словами пауза минимум в 2 раза длиннее, чем между символами слова, предусмотрите это. Знакомство и первые проекты 33
Вспомогательные данные В электронном архиве к проекту есть файл Morse-blocks.sprite2, спрайт для mBlock, в котором мы приготовили готовый набор символов в кодах Морзе, который можно будет использовать в качестве библиотеки в будущих проектах. 1. Для его загрузки используйте кнопку Загрузить спрайт из файла (рис. 2.22). Рис. 2.22. Загрузить дополнительный спрайт 2. В открывшемся окне покажите путь к файлу Morse-blocks.sprite2 на вашем компьютере. 3. Загрузится новый спрайт, костюм которого выглядит как большая буква A. Выбрав этот спрайт и переключившись на категорию Данные и Блоки, вы увидите буквы русского алфавита, цифры, вспомогательные и служебные сигналы (рис. 2.23). Можно пользоваться. 34 Глава 2
Рис. 2.23. Большой набор символов в новом спрайте Проект 2. «Поиграем? Панда с мячом» Введение в проект В предыдущем проекте мы использовали спрайты mBlock только для создания скриптов управления роботом. Но основное, изначальное предназначение спрайтов в среде Scratch иное. Например, они способны выполнять некоторые действия по командам пользователя или ориентируясь на состояние датчиков (органов чувств) нашего робота. Вообще, взаимосвязанная активность реального робота и виртуальных персонажей в едином проекте — одна из интереснейших возможностей, которую предоставляет интерактивный режим управления роботом. Интерактивным он называется потому, что активностью робота постоянно управляет компьютер, отправляя необходимые команды. В отличие от интерактивного автономный режим подразумевает, что после загрузки программы компьютер становится не нужен, и робот действует самостоятельно. С автономным режимом мы будем разбираться чуть позже, а пока нам удобнее использовать интерактивный. Итак, в этом проекте мы будем играть! Предлагаем создать мини-игру, в которой движением руки можно будет управлять Пандой. А для этого вам Знакомство и первые проекты 35
понадобится научить Панду реагировать на показания датчика освещённости, которым располагает наш робот. В процессе работы над персонажем вы ещё и научитесь изменять костюмы спрайтов в mBlock, а также создавать переменные для использования в программах. Приступаем к работе Этап 1. Подготовительный Для начала нам потребуется несколько новых костюмов для спрайта Панды. Костюмы определяют, как выглядит спрайт в некоторый момент. Нам потребуются костюмы: Panda-веселая, Panda-грустная и Panda-играющая. 1. Запустите mBlock. Перед вами персонаж по умолчанию среды mBlock — Panda. 2. Перейдите на вкладку Костюмы (рис. 2.24). 3. Для начала продублируем первый костюм, ведь нам понадобятся три костюма, а пока доступны только два. Для этого щёлкните правой кнопкой по первому костюму в списке и выберите команду дубликат (рис. 2.25). Рис. 2.24. Вкладка Костюмы 4. Появился ещё один костюм с названием Panda-a2 (поле с названием — справа и чуть выше области костюмов). В поле названия переименуйте его в Panda-веселая. Но теперь надо изменить рисунок так, чтобы он соответствовал названию. 5. Щёлкните по костюму Панды в центре поля рисования. 36 Рис. 2.25. Дублируем костюм Panda-a Глава 2
Рис. 2.26. Разгруппировываем изображение Панды Появилась подсветка жёлтой каймой. Воспользуйтесь инструментом (справа, на панели инструментов, рис. 2.26), Разгруппировать чтобы иметь возможность редактировать отдельные элементы рисунка. Повторите выделение рисунка и разгруппировку дважды, чтобы все элементы рисунка стали отдельными объектами. Постарайтесь не сдвинуть сам костюм с места, это важно. Иначе придётся заново указывать центр изображения. 6. Теперь постарайтесь щёлкнуть кончиком курсора по рту Панды, чтобы он выделился, как на рис. 2.27. Обратите внимание, что используется справа вверху панели инструментов), каждый инструмент Выбор ( раз для выделения отдельных объектов требуется использовать именно этот инструмент. Для удобства можно сделать рисунок крупнее (обратите внимание на кнопочки +, — и = под изображением). Совет Если выделить лишь линию рта не получается, а выделяется вновь вся Панда, возможно, вы не всё разгруппировали. Щёлкните ещё . раз по инструменту Разгруппировать 7. Теперь, когда у Панды выделена линия рта, воспользуйтесь инструмен(изменение), как на рис. 2.28. Вокруг рта потом Реформирование явились опорные точки, которые можно двигать. Придайте линии подходящую форму, чтобы она выглядела как радостная улыбка. Знакомство и первые проекты 37
Рис. 2.27. Выделяем рот Панды Рис. 2.28. Изменяем линию рта Панды 8. Если всё получилось, Панда улыбается, обведите всю картинку курсором мыши (следует нажать и удерживать левую кнопку мыши, протянуть мышь по диагонали, отпустить) и вновь сгруппируйте инструмен(рис. 2.29). Готово, костюм Panda-веселая у нас есть. том Группа 9. Теперь переименуйте первый костюм (Panda-a) в Panda-грустная. Редактировать рисунок не обязательно, он нам подходит без изменений. Хотя 38 Глава 2
вы уже знаете, как это делается, и при желании можете добавить больше грусти. Например, опустив ещё больше уголки рта. Рис. 2.29. Группируем вновь созданный костюм 10. Теперь перейдите к костюму Panda-b. Переименуйте его в Pandaиграющая. Рис. 2.30. Группируем вновь созданный костюм Знакомство и первые проекты 39
11. Доработайте немного этот костюм. Измените линию рта и добавьте левую лапу. Для этого можно использовать инструмент Карандаш (рис. 2.30). Внизу на рисунке видны регулятор толщины линии и палитра для выбора цвета. В случае необходимости залить нарисованную лапу цветом можно с помощью инструмента Цвет формы . Не забудьте вновь сгруппировать весь костюм. 12. Всё, костюмы готовы. Но следует создать ещё кое-что. В процессе игры было бы неплохо знать, кто сколько набрал очков. Добавим две переменные, величина которых будет изменяться во время выполнения программы. Перейдите с вкладки Костюмы на вкладку Скрипты. В категории Данные и Блоки нажмите кнопку Создать переменную. Назовите эту переменную ПАНДА (рис. 2.31). Рис. 2.31. Создание переменной ПАНДА 13. Точно так же создайте переменную ТЕРА, она тоже понадобится в проекте. Подготовительная часть закончена, можно приступать к программиро­ванию! Вн и ман и е! Если у вас ­что-то не получилось или вы просто решили перепрыгнуть через подготовительную часть и сразу перейти к программированию, можете загрузить электронный архив проектов и открыть шаблон Панда и Тера играют с мячом (template).sb2, в котором содержатся все нужные костюмы, переменные и даже набор блоков для сборки скрипта. Мы в последующем часто будем предлагать использовать готовые шаблоны, чтобы сократить время, которое требуется потратить на создание проекта, особенно если в проекте будут встречаться уже знакомые приёмы работы. Но первые проекты всё же рекомендуем выполнять полностью самостоятельно. 40 Глава 2
Этап 2. Собираем первый вариант игры Несколько слов перед тем, как начнём собирать скрипт. Спрайт Панды будет двигаться по сцене, поэтому надо представлять себе её размеры и понимать, какая система координат используется. Центр сцены — это точка с нулевыми координатами, размер сцены 480 на 360 точек (пишут так: 480×360). Представить всё это получше поможет рис. 2.32. Рис. 2.32. Координаты на поле сцены 1. Соберите скрипт, ориентируясь на рис. 2.33. При поиске блоков на палитре (если вы собираете сами, а не воспользовались шаблоном) обращайте внимание на их цвет. При сборке составного блока внутри цикла учтите, что важна последовательность сборки (рис. 2.34). Рис. 2.33. Первый скрипт для Панды Знакомство и первые проекты 41
Рис. 2.34. Последовательность сборки Пояснения к программе Первый блок из категории События определяет, что выполнение над скрипта начнётся, когда вы щёлкнете по зелёному флажку сценой. Далее блок из категории Внешность уменьшает размер спрайта Панды до 60%, иначе на сцене было бы слишком тесно. Затем спрайт переходит в левую часть экрана, в точку с координатами (–208, 0), за это отвечает блок из категории Движение. Ещё один сложносоставной блок из этой категории находится внутри цикла , именно в нём происходит вычисление координаты точки, в которую переместится Панда при изменении показаний датчика освещённости. 2. Установите соединение с роботом, если вы ранее это не сделали. 3. Проверьте работу программы, запустив её с помощью зелёного флажка . Перекройте рукой датчик света на контроллере робота, подвигайте ею вверх-вниз, изменяя освещённость. Понаблюдайте, как двигается Панда. Для работы программы требуется хорошее внешнее освещение датчика. Этап 3. Игра с мячом 1. Добавьте в проект готовые спрайты Ball.sprite2 и Tera.sprite2 из электронного архива к проекту. Данные спрайты уже содержат все необходимые скрипты. Если вы забыли, как добавлять спрайты из файлов, посмотрите на рис. 2.22. 2. Попробуйте поиграть, управляя положением Панды так, чтобы она отбивала мячи. 42 Глава 2
3. Измените скрипт Панды так, чтобы она реагировала на изменения счёта (рис. 2.35). Рис. 2.35. Усложненный скрипт для Панды 4. Запустите проект. Поиграйте, обратите внимание на изменение внешности Панды при различном счёте. 5. Щёлкните в списке спрайтов на Ball, попробуйте разобраться, какие команды выполняются в его скриптах. Затем ознакомьтесь со скриптами спрайта Tera. 6. Придумайте название проекту и сохраните его в свою папку на компьютере. В дальнейшем мы всё реже будем напоминать об этом действии. Постарайтесь всегда своевременно сохранять свои работы, чтобы не потерять информацию при возможных сбоях. Не расстраивайтесь, если не всё оказалось ясным. По мере продвижения и знакомства с новыми проектами вы будете всё лучше понимать, как устроены те или иные скрипты и как они работают. Дополнительные задания 1. Отредактируйте скрипты Панды по рис. 2.36. Попробуйте разобраться, как изменится игровое поведение Панды. Проверьте в игре. Знакомство и первые проекты 43
Рис. 2.36. Модифицируем игровое поведение Панды 2. Попробуйте отредактировать значение 450. Посмотрите, как изменится поведение Панды при перемещении по вертикали. Попробуйте так же уменьшить и увеличить коэффициент 2.3. Эти параметры можно менять, подбирая оптимальные значения для ваших условий игры. Примечание Если вам понравилось создавать игры в mBlock, рекомендуем познакомиться со средой Scratch. На сайте разработчиков https:// scratch.mit.edu вы сможете опробовать онлайн-­версию, не требующую установки (либо скачать обычный дистрибутив), а также найдёте множество русифицированных учебников (https://scratch.mit. edu/ideas) и получите дополнительные навыки визуального программирования. Проект 3. «Пульт управления» Введение в проект В предыдущих проектах мы уже задействовали источник звука (зуммер) и датчик освещённости, настало время запустить моторы! Обычно для управления используют специальные пульты. В этом проекте мы создадим пару несложных пультов, один — виртуальный, с отображением кнопок на экране 44 Глава 2
компьютера, второй — на основе компьютерной клавиатуры. Мы будем наблюдать за отдаваемыми нами командами на сцене mBlock в виде тех или иных графических сигналов. Вн и ман и е! Во всех проектах с использованием моторов ­что-то может пойти не так, и существует опасность повредить робота. Например, он может шустро доехать до края стола и свалиться. Поэтому во время отладки лучше установить робота на ­какую-­нибудь подставку, на которой он может свободно крутить колёсами, не касаясь ими поверхности. Приступаем к работе Этап 1. Подготовительный На этом этапе потребуется создать спрайт Указатель с нужными костюмами. Именно он будет отвечать за отображение выбранных управляющих команд. Предлагаем ещё раз потренироваться в создании костюмов спрайтов (желающие пропустить эту часть могут воспользоваться электронным архивом, в котором есть готовый файл Указатель.sprite2). Нам потребуется удалить спрайт Панды и добавить новый спрайт — Указатель. 1. Щёлкните правой кнопкой по Панде в списке спрайтов и выберите команду удалить (рис. 2.37). Рис. 2.37. Удаляем спрайт Панды Знакомство и первые проекты 45
2. Нажмите кнопку Выберите спрайт из библиотеки (рис. 2.38). Рис. 2.38. Команда выбора спрайта из библиотеки 3. В библиотеке выберите спрайт Button1, нажмите кнопку OK или щёлкните дважды по выбранному спрайту (рис. 2.39). Рис. 2.39. Выбираем спрайт в библиотеке 4. В списке спрайтов появился новый спрайт. Нам требуется изменить его в левом верхнем название. Для этого щёлкните по синему кружку углу поля спрайта (рис. 2.40), откроются дополнительные настройки. Рис. 2.40. В кружке с буквой i находятся дополнительные настройки 5. Измените название спрайта на Указатель (рис. 2.41). 46 Глава 2
6. Можно выйти из дополнительных настроек ( ). Теперь требуется добавить несколько костюмов. В прошлом проекте вы научились дублировать, редактировать и дорисовывать костюмы. Но во многих случаях оказывается удобнее просто дополнять набор готовыми костюмами из библиотеки. Рис. 2.41. Меняем название 1. Перейдите на вкладку Костюмы. 2. Как и в окне спрайтов, здесь есть пиктограмма открытия (рис. 2.42). библиотеки 3. Добавьте костюмы и переименуйте их, ориентируясь на рис. 2.43. Рис. 2.42. Кнопка перехода к костюмам в библиотеке Рис. 2.43. Набор костюмов спрайта Указатель и их названия Знакомство и первые проекты 47
Подготовительный этап закончен. Если возникли к­ акие-то сложности, можно воспользоваться кнопкой Загрузить спрайт из файла или просто открыть шаблон проекта простое_управление_этап_1.sb2. Этап 2. Собираем пульт управления Теперь займёмся сборкой скриптов. Посмотрите на рис. 2.44, там представлен весь набор. Обратите внимание, что экстренная остановка происходит при двух событиях: и (пространство — клавиша <Пробел> на клавиатуре, это не очень удачный вариант перевода). Два скрипта позволяют нам быть уверенными, что при необходимости робот остановится настолько быстро, насколько это возможно в данной ситуации. Как видите, потребуется создать 5 новых блоков. Мы дали им такие названия, чтобы сложно было перепутать. Если вы забыли, как создаются собственные блоки, вернитесь к проекту 1 «Поговорим? Азбука Морзе». Далее мы всё меньше будем останавливаться на деталях, которые уже рассматривали ранее. Рис. 2.44. Набор скриптов спрайта Указатель для пульта управления 48 Глава 2
Приступим. 1. Создайте новые блоки, соберите скрипты и разместите их, ориентируясь на рис. 2.44. 2. Подключите робота к компьютеру USB-кабелем, настройте соединение с mBlock (если ранее это не сделали). Совет Напомним, что на стадии отладки лучше поставить робота на подставку, позволяющую свободно вращать колёсами. 3. Включите питание. , , , , 4. Щёлкая по блокам пульта управления ( ) на рабочем поле, проверьте, работает ли пульт управления, правильно ли вращаются колёса робота. При необходимости внесите изменения в программу. 5. Если всё работает, можно спустить робота на поверхность и покатать его, щёлкая по кнопкам пульта управления. Помните, что экстренная остановка — клавиша <Пробел> на клавиатуре. 6. Сохраните проект в свою папку на компьютере. Совет Если колеса не вращаются, проверьте соединение (зелёный индикатор в категории Робот). Помните о том, что щёлкать следует по самим блокам, а не по их определениям. Используйте блок , чтобы убедиться, что робот по команде издаёт звук. Если связи нет — переподсоедините кабель USB и заново пройдите все шаги. В некоторых случаях может помочь перезапуск среды mBlock. Если соединение установлено, но моторы не крутятся, проверьте коммутацию моторов с контроллером, посмотрите, включено ли питание от аккумуляторов. Разряженные аккумуляторы надо будет зарядить. Питания, подаваемого по кабелю USB, для моторов, скорее всего, не хватит. Получился интересный пульт, но думаем, вы заметили, что пользоваться им без сенсорного экрана не очень удобно. Стандартная компьютерная клавиатура лучше подходит на роль пульта управления. Знакомство и первые проекты 49
Этап 3. Клавиатурный пульт управления Вы уже использовали блоки, определяющие действие при нажатой клави. ше клавиатуры, например Теперь потребуется просто добавить больше подобных блоков и переназначить используемую клавишу. Очень удобно, что в среде mBlock (в отличие от оригинального Scratch) существует возможность обработки события . Примечание В случае, когда требуется создать несколько блоков со схожим содержанием, можно использовать операцию дублирования. Щёлкните правой кнопкой мыши по нужному блоку и в появившемся меню выберите команду дубликат (рис. 2.45). Затем в получившейся копии переназначьте всё необходимое и удалите ненужные компоненты. Рис. 2.45. Создаём дубликат блока На рис. 2.46 представлен набор скриптов для последней модификации пульта. Теперь управление движением робота будет осуществляться с помощью клавиш со стрелками на компьютерной клавиатуре. Надеемся, вы обратили внимание, что в двух колонках скрипты разного типа, и создание новой версии проекта не вызовет у вас проблем. 1. Попробуйте управление роботом с помощью клавиш клавиатуры. 2. Сохраните проект с новым названием. Примечание Данный проект имеет существенный недостаток — при одновременном нажатии нескольких клавиш выполняется лишь последняя команда. В будущих проектах мы постараемся сделать так, чтобы робот адекватно реагировал на то или иное сочетание клавиш. 50 Глава 2
Рис. 2.46. Набор скриптов клавиатурного пульта управления Вн и ман и е! Вероятно, в данном проекте вы почувствовали, насколько мешает движению робота кабель USB. Позже мы переключимся на проекты автономной работы, когда вообще никакая связь с компьютером роботу не нужна, но пока мы используем интерактивный режим, и поведением робота управляет среда mBlock. В таком варианте может выручить беспроводная связь с контроллером. Её можно наладить разными способами. При использовании обычных для Arduino проектов Bluetooth-­модулей (НС‑05, например), требуется сначала установить сопряжение между роботом и компьютером средствами операционной системы, а потом искать коммуникационный порт, который сопоставлен с целевым удалённым устройством. Намного проще использовать готовые комплекты сопряжённых беспроводных модулей, подключаемых через USB. В этом случае в системе просто появляется новый коммуникационный порт, соединение с которым производим точно так же, как при подключении проводом. Знакомство и первые проекты 51
В состав набора к книге входит комплект таких модулей. Подробнее о настройках соединения по Bluetooth читайте в электронном архиве, который можно скачать по ссылке ftp://ftp.bhv.ru/9785977568371.zip, а также со страницы книги на сайте https://bhv.ru. Проект 4. «Общительная Панда» Введение в проект В этом проекте наш реальный робот и виртуальный персонаж на экране компьютера снова будут действовать сообща. На этот раз мы научим робота определять расстояние до объекта и реагировать на изменение этого расстояния. В качестве объекта могут выступать и ваша рука, и коробка, и даже другой робот, если вы делаете этот проект на групповых занятиях. При этом Панда на экране будет информировать нас о происходящем не только словами, но и своим видом в разных ситуациях. Новый компонент в данном проекте имеет внешнее сходство с глазами (рис. 2.47). Это ультразвуковой дальномер, позволяющий определять препятствие впереди и расстояние до него. Он установлен на сервомоторе и может поворачиваться на значительный угол. Мы будем использовать возможность поворота в последующих проектах, но пока рекомендуем отключить сервомотор от контроллера (разъём, используемый для подключения сервомотора, указан в инструкции по сборке). В центральное положение можно повернуть «голову» вручную, только надо стараться не прилагать чрезмерных усилий, чтобы не сломать пластиковые шестерёнки в сервомоторе. Рис. 2.47. Обычно используемый в проектах с контроллерами Arduino ультразвуковой датчик расстояния 52 Глава 2
Приступаем к работе Этап 1. Подготовительный Для изменения вида Панды нам понадобятся новые костюмы. В этот раз мы вновь используем спрайт Панды, а поскольку у вас уже есть опыт работы с костюмами, то далее мы просто покажем на рис. 2.48, какие костюмы нужны и какие названия им надо дать. Примечание В электронном архиве к проекту есть и готовый спрайт Панды со всеми костюмами. Если ­ч то-то не получится, воспользуйтесь им (но тогда перед загрузкой сначала удалите текущий спрайт Панды). 1. Откройте среду mBlock. Нужный спрайт, Панда, уже доступен по умолчанию. 2. Перейдите на вкладку Костюмы и создайте костюмы по образцам на рис. 2.48. Рис. 2.48. Набор костюмов для спрайта Panda Знакомство и первые проекты 53
Этап 2. Общительная Панда демонстрирует своё настроение На этом этапе Панда начнёт сообщать о том или ином своём настроении в зависимости от расстояния до объекта, символизирующего собеседника. Когда он очень далеко, Панда будет грустить в ожидании общения. При появлении объекта на определённом расстоянии — оживляться и сообщать о желании пододвинуться поближе. Если «собеседник» окажется слишком близко от Панды, она будет смущаться и сообщать о желании отодвинуться подальше. При оптимальном расстоянии — радостно улыбаться. 1. На рис. 2.49 представлен набор скриптов второго этапа. Посмотрите на блоки, постарайтесь разобраться в том, что будет происходить при выполнении программы, как будет вести себя Панда при определённом расстоянии до объекта. Далее мы немного поможем разобраться в скриптах. 2. Нам потребуется одна новая переменная — дистанция. Создайте её в категории Данные и Блоки. 3. По рисунку видно, что вам надо создать 4 новых блока, отвечающих за отображение эмоций Панды. Содержание блоков соответствует их названиям. Обратите внимание, что используются блоки из категории Робот — simpleBot, которые управляют светодиодами, расположенными на контроллере. Цвета будут обозначать эмоции, испытываемые Пандой. 4. Обратите внимание на блок, в котором переменной дистанция присваивается значение, получаемое от ультразвукового сенсора. Далее сле, здесь описыдуют несколько вложенных проверок ваются разные варианты расположения Панды и собеседника. Данная структура скриптов напоминает матрёшку и обеспечивает выполнение лишь ­какого-то одного варианта действий из перечисленных в зависимости от условий. 5. Соберите скрипты проекта по рис. 2.49. Будьте внимательны, очередной следует вставлять в раздел «иначе» предыду­ блок щего. 6. Соедините робота с компьютером, настройте соединение с mBlock (если ранее это не сделали). 7. Запустите проект. Надеемся, вы помните, что для этого нужно щёлкнуть . по зелёному флажку над сценой 54 Глава 2
Рис. 2.49. Набор скриптов проекта «Общительная Панда», этап 2 8. Если всё работает, и Панда сообщает о своих эмоциях при изменениях расстояния до датчика, замечательно! Сохраните проект в свою папку. 9. Если ­что-то не работает — проверьте соединение с роботом, перепроверьте сборку. Напомним, что в случае необходимости можно загрузить и готовый проект из электронного архива. Мы научили Панду реагировать на расположение собеседника. Но у робота есть моторы и колёса, он вполне может осуществить желание Панды отодвинуться от объекта или подъехать поближе. Пробуем! Знакомство и первые проекты 55
Этап 3. Общительная Панда держит дистанцию 1. На рис. 2.50 представлен доработанный набор скриптов для Панды. Рассмотрите скрипты, обратите внимание на изменения. Всё достаточно просто, не правда ли? Моторы либо останавливаются, либо запускаются с определённым направлением вращения, если надо изменить дистанцию. Мощность лучше выбрать поменьше, например 85, а не 100, чтобы робот не очень быстро перемещался и не проскакивал по инерции ту зону, в которой должен остановиться. 2. Внесите изменения в предыдущий проект, руководствуясь рис. 2.50. Рис. 2.50. Набор скриптов проекта «Общительная Панда», этап 3 56 Глава 2
3. Проверьте работу программы, поднося к датчику руку или отодвигая её. Робот должен реагировать движением и светодиодами, при этом виртуальная Панда продолжит информировать о своём настроении. 4. Если всё работает правильно, сохраните проект с новым названием. Примечание В этом проекте вы не только поиграли с роботом, но и получили очень важный навык использования датчиков расстояния в связке с работой моторов. Это очень пригодится в проектах, связанных с движением робота, ведь важно сделать так, чтобы он не врезался в препятствия. Проект 5. «Покатаемся? 9 вариантов движения» Введение в проект В этом проекте вы попробуете более «продвинутое» управление роботом. Предусмотрено девять вариантов движения, часть из которых — движение по дуге. Для управления будут служить клавиши на клавиатуре: <Q>, <W>, <E>, <A>, <D>, <Z>, <X> и <C> запускают перемещение в ту или иную сторону, <S> — останавливает движение. Для езды по дуге (как в обычном автомобиле) требуется раздельное управление моторами. В стандартном расширении Makeblock есть команда, задающая произвольную мощность, но лишь для одного мотора, приходится включать её в скрипт дважды (для левого и правого моторов). Зато в расширении simpleBot существует специальный удобный блок сразу для двух моторов. Вот его и используем. Напомним, что в проектах с движением робота беспроводное соединение будет удобнее соединения кабелем USB (см. приложения). Приступаем к работе Этап 1. Подготовительный Нам потребуется спрайт Указатель1 с набором костюмов, показанных на рис. 2.51. Знакомство и первые проекты 57
Рис. 2.51. Набор костюмов спрайта Указатель1 Названия костюмов по порядку: остановка, вперед_прямо, вперед_налево, вперед_направо, назад_прямо, назад_налево, назад_направо, по_ часовой, против_часовой. Если вам интересно освоить новые инструменты встроенного графического редактора, можете попробовать нарисовать всё самостоятельно. В редакторе есть и кнопка Импорт, позволяющая импортировать изображения со стрелками (все или часть из них) как новые костюмы из папки проекта электронного архива. Здесь и далее для ускорения работы мы предлагаем опираться на готовые спрайты из электронного архива, содержащие все необходимые костюмы. Стандартный спрайт Panda можно удалять, он не понадобится. Запустите среду mBlock, удалите спрайт Panda и добавьте спрайт Указатель1 (создайте самостоятельно и отредактируйте костюмы или загрузите готовый из электронного архива). Всё, можно приступать. Этап 2. Покатаемся! Создаём программу управления 1. Создайте переменную Мощность в категории Данные и Блоки. 2. Соберите скрипты, ориентируясь на рис. 2.52. Щёлкните по блоку , чтобы задать значение переменной (первоначально оно равно нулю). 58 Глава 2
Рис. 2.52. Набор скриптов проекта «Покатаемся? 9 вариантов движения» 3. Соедините робота с компьютером, настройте соединение с mBlock. 4. Запустите проект на выполнение. 5. Проверьте работу программы, управляя движением робота с помощью клавиш на клавиатуре: <Q>, <W>, <E>, <A>, <S>, <D>, <Z>, <X> и <C>. Обратите внимание на отображение направления движения на экране mBlock. 6. Сохраните проект. Дополнительное задание Меняя коэффициенты мощности, можно изменять радиус дуги движения робота. Поэкспериментируйте с этими параметрами. Знакомство и первые проекты 59
Примечание Мы опубликовали в онлайн-­библиотеке расширений ещё одно, позволяющее с удобством управлять моторами робота с различными схемами подключения. Оно называется H-Bridge и доступно через Менеджер расширений среды mBlock. Мы пользуемся этим расширением для программирования учебных и соревновательных роботов. Основные команды H-Bridge напоминают те, что вы уже видели в simpleBot: move robot, run motors A B, run motor speed и stop defaults. Добавьте в набор расширений вашей среды mBlock расширение H-Bridge, активируйте его и познакомьтесь с основными командами. Попробуйте создать свою программу управления движением с помощью этого универсального расширения. Помните о том, что, если ваш робот имеет нестандартную конфигурацию (не является mBot-совместимым), для указания конфигурации следует использовать блоки attach motor или attach A&B motors, а в интерактивном режиме также подходящую прошивку для робота. Проект 6. «Управление сочетанием клавиш» Введение в проект До сих пор мы использовали управление с нажатием только одной управляющей клавиши в каждый момент времени. В этом проекте вы сможете использовать комбинацию одновременно нажатых клавиш. Но программный скрипт существенно усложнится, придётся проверять, какие клавиши и в каких сочетаниях нажаты. Потребуются логические операции И (AND) и НЕ (NOT). Как и раньше, тот или иной костюм демонстрирует выбранную подпрограмму движения. Роли управляющих клавиш будут играть курсорные стрелки на клавиатуре. Приступаем к работе Этап 1. Подготовительный В проекте потребуется спрайт с названием Указатель2 и набором костюмов, показанных на рис. 2.53. Вспомогательный набор стрелок для импорта можно найти в электронном архиве проекта. 60 Глава 2
Рис. 2.53. Набор костюмов спрайта Указатель2 Запустите среду mBlock, удалите спрайт Panda и добавьте спрайт Указатель2 (создайте самостоятельно и отредактируйте костюмы или загрузите готовый спрайт из электронного архива). Этап 2. Стрелки на экране На этом этапе мы отладим программу распознавания нажатий на клавиши с выводом соответствующих значков на экран без включения моторов робота. В этой программе используются блоки логических операций и . Будьте внимательны со сборкой. Небольшое пояснение: команду следует понимать, как «клавиша стрелка_вниз не нажата?». 1. Соберите скрипты по рис. 2.54. Рис. 2.54. Набор скриптов этапа «Стрелки на экране» Знакомство и первые проекты 61
Рис. 2.55. Набор скриптов этапа «Проговариваем направление движения» 62 Глава 2
Рис. 2.56. Итоговый набор скриптов проекта «Управление сочетанием клавиш» Знакомство и первые проекты 63
2. Проверьте работу программы, нажимая одновременно различные комбинации клавиш-­с трелок на клавиатуре. 3. Сохраните проект. Этап 3. Проговариваем направление движения Костюм отображает лишь общее направление, но мы можем добавить текстовые сообщения, уведомляющие нас о том, какой конкретно вариант движения выбран. 1. Измените программу в соответствии с рис. 2.55. 2. Проверьте работу программы, нажимая одновременно различные комбинации клавиш-­ с трелок на клавиатуре. Посмотрите, правильно ли отображаются названия направлений движения на экране. 3. Сохраните проект с новым названием. Этап 4. Поехали! Вот теперь всё проверено и готово для реального использования моторов робота. 1. Измените проект, добавьте блоки управления моторами, руководствуясь рис. 2.56. 2. Соедините робота с компьютером, настройте соединение с mBlock. 3. Запустите проект. Попробуйте управление, различные комбинации нажатых клавиш со стрелками. 4. Сохраните проект с новым названием. 64 Глава 2
Умный робот. Автоматизация Мы уже освоили работу с некоторыми датчиками. А также опробовали многовариантные алгоритмы в программах ручного управления. В этой главе мы начнём обучать нашего робота независимому выполнению некоторых функций, дадим ему самостоятельность в перемещениях, но за собой оставим право перехвата управления, вдруг ­что-то пойдёт не так. И начнём мы с проектов движения по чёрно-­белой разметке, такой же, как используется в распространённых дисциплинах спортивной робототехники. Проект 7. «Доведи до линии, дальше я сам!» Введение в проект В проекте мы соединим ручной и автоматический режимы управления. Подобное реализовано в настоящих роботизированных системах: водитель может вывести машину на определённый, подготовленный участок дороги и включить автопилот. Давайте и мы создадим программу с похожими функциями. В проекте будет использоваться датчик линии с несколькими (минимум двумя) чувствительными элементами, сенсорами. Сенсоры, которые имеет наш робот, цифровые, то есть они не распознают оттенки, а лишь определяют наличие или отсутствие отраженного от поверхности света. Это значит, что для удачного распознавания линия должна быть именно чёрной или очень тёмной, а остальная поверхность — белой или очень светлой. Другой возможный вариант — белая линия на чёрном фоне. Мы построили проекты так, что скрипты менять почти не придётся. Умный робот. Автоматизация 65
В качестве испытательного полигона можно использовать вложенное в набор поле с линией или создать собственное поле. Можно распечатать линии разной формы на обычном принтере (рис. 3.1) и собирать из них различные комбинации. В данном проекте важно использовать широкую линию, перекрывающую оба боковых сенсора, поэтому ширина разметки должна быть как минимум 3 см. Можно сделать трафареты и нарисовать линию на листе ватмана чёрной краской, а можно Рис. 3.1. Примеры элементов полей и просто наклеить на пол или коврик чёрную клейдля печати на принтере кую ленту (но важно ничего не испортить). Изобретайте, ездить по своей линии намного интереснее! Нужно отметить, что можно обучить робота следовать и по узкой разметке, не перекрывающей оба боковых сенсора одновременно, но для этого потребуется использовать иные алгоритмы. О различных вариантах алгоритмов следования мы будем говорить позже. Приступаем к работе Этап 1. Подготовительный Нам вновь потребуется спрайт Указатель1, который мы уже использовали ранее (см. рис. 2.51). Можно загрузить свой старый проект и либо просто заменить скрипты и пересохранить с новым именем, либо сохранить спрайт Указатель1 в виде отдельного файла и затем импортировать его в новый проект. Для сохранения спрайта щёлкните по нему правой кнопкой мыши и выберите в меню соответствующую операцию (рис. 3.2). Рис. 3.2. Сохранение спрайта в локальный файл 66 Глава 3
Запустите среду mBlock, удалите спрайт Панды и добавьте спрайт Указатель1 (свой или из электронного архива проектов). Этап 2. Выясняем значения, возвращаемые датчиком линии Датчики линии, которые используются с роботами, могут быть подключены по-разному. Поэтому на первом этапе мы выясним, какие значения возвращает датчик в той или иной ситуации. 1. Создайте переменные сенсор, на_поле, на_линии, линия_слева, линия_справа в категории Данные и Блоки. Примечание Линия разметки может быть чёрной на белом фоне или белой на чёрном фоне. Выберите соответствующий вариант в зависимости от того, какой полигон у вас есть в наличии. Проект практически не изменится, потребуется лишь прописать другие значения (см. рис. 3.5). Далее мы будем считать, что тип полигона у нас самый распространённый: чёрная линия разметки на белом фоне. 2. Соберите скрипт для выяснения показаний датчика линии по рис. 3.3. Это вспомогательный скрипт, поэтому мы даже не снабдили его командной шапочкой. Запускается просто щелчком мыши по скрипту. И слева, в поле переменной сенсор на сцене, будут видны показания датчика. Рис. 3.3. Скрипт для выяснения показаний датчика линии 3. Соедините робота с компьютером, настройте соединение с mBlock. Нам надо выяснить показания датчика, возвращаемые в четырёх разных положениях робота на разметке. Каждое значение будет связано с соответствующей переменной: на_поле, на_линии, линия_слева, линия_справа. Рассмотрите датчик линии. Каждый сенсор на датчике имеет два элемента: первый испускает инфракрасное излучение, второй ловит отражённый свет. У нашего робота Умный робот. Автоматизация 67
датчик с тремя сенсорами. Пока в проектах мы используем лишь два боковых сенсора. И вам потребуется по-разному располагать их над полем с линией, чтобы получить все нужные значения. 1. Поставьте робота так, чтобы все сенсоры расположились над полем. Посмотрите на показания переменной сенсоры. Вы должны увидеть одну из цифр: 0, 1, 2, 3. Внесите полученное значение в блок переменной на_ поле. Потом поставьте над линией, внесите соответствующее значение в блок на_линии. Далее надо расположить сенсоры над границей разметки, чтобы один сенсор был над белым, а второй над чёрным (рис. 3.4, обратите внимание на загорающиеся светодиоды датчика линии, это поможет сориентироваться). Рис. 3.4. Расположение датчика для положения «линия_справа» 2. Внесите все полученные цифры в блоки задания значений переменных. В нашем случае (с нашими датчиками) получилось так, как на рис. 3.5. В дальнейших проектах данной книги мы будем указывать именно эти значения. Если вы используете робота с другими датчиками или на другом типе полигона, в последующих скриптах этой книги вам следует указывать именно те значения, которые вы выяснили сами. Рис. 3.5. Значения переменных при различных положениях датчика относительно линии 68 Глава 3
Примечание Далее мы не будем выделять подготовительный этап, вы уже освоили работу со спрайтами и костюмами, так что отдельно акцентировать внимание на этом процессе уже не требуется. В этом нашем проекте мы будем использовать переменные на_поле, на линии, линия_слева и линия_справа как именованные константы, не меняющие своих значений в ходе выполнения программы. Этап 3. Автоматика, но ещё не ездим На этом этапе создадим и отладим режим автоматической езды, но моторы пока не задействуем. 1. Соберите скрипты по рис. 3.6. Видно, что вам потребуется создать свои , новые блоки (в категории Данные и Блоки) с названиями и . Проанализируйте программу, Рис. 3.6. Скрипты этапа проверки работы автоматики Умный робот. Автоматизация 69
постарайтесь разобраться, как работает каждый блок. Обратите внимание, мы вновь используем группу вложенных условных операторов для перебора всех нужных режимов работы. 2. Поставьте робота на белый фон, на линию, на границу линии и посмотрите, какая стрелочка отображается на экране, какие показания отображает блок переменной сенсор. 3. Если всё работает правильно, сохраните промежуточный проект. Мы всё реже будем напоминать вам о необходимости сохранения проектов, в том числе и промежуточных вариантов. Но настоятельно рекомендуем это делать, чтобы избежать потери данных. Этап 4. Ручное управление, отладка Теперь нам надо отладить ручное управление. Управлять движением будем с помощью клавиш-­с трелок клавиатуры. 1. Создайте новые переменные, которые помогут нам увидеть, какая кнопка на клавиатуре нажата. На рис. 3.7 показаны названия этих переменных и расположение соответствующих элементов интерфейса на сцене проекта. Рис. 3.7. Новые переменные 70 Глава 3
2. Дополните свой проект нужными блоками, измените скрипты, руководст­ вуясь рис. 3.8. Примечание На этом этапе скрипт автоматической езды из прошлого блока временно отрываем от основных блоков, оставляем в стороне, собираем и отлаживаем режим ручного управления. Рис. 3.8. Скрипты ручного управления (скрипт автоматики пока отодвинут в сторону) 3. Понажимайте на клавиши со стрелками, посмотрите на стрелку на экране, проверьте, правильно ли всё работает. Умный робот. Автоматизация 71
Этап 5. Соединяем ручное и автоматическое управление, но пока без моторов На этом этапе потребуется объединить возможности ручного и автоматического управления. По сути, вы всё уже собрали, остаётся создать ещё один и использовать в нём ранее отложенный новый блок в сторону блок команд автоматического управления. Дополним его ещё и блоком «проговаривания» режима работы. На рис. 3.9 видны все изменения. Рис. 3.9. Скрипт автоматического управления (дополнение к скриптам на предыдущем рисунке) Двигая робота над линией и нажимая кнопки со стрелками, убедитесь, что спрайт отображает текущее состояние движения. Этап 6. А теперь можно ехать! Ну вот, мы и дошли до стадии подключения моторов. Для контроля скорости введём новую переменную — мощность. Вы можете попробовать сами добавить в предыдущий проект соответствующие блоки управления. А можете повторить наш доработанный вариант, представленный на рис. 3.10. Если детализация на рис. 3.10 недостаточна, в электронном архиве проекта лежит 72 Глава 3
файл рисунка, который можно масштабировать и рассматривать на компьютере. Там же выложены готовые файлы по каждому этапу на случай, если ­что-то пойдёт не так, и вы захотите проверить сборку. 1. Создайте переменную мощность в категории Данные и Блоки. 2. Соберите финальный вариант программы. 3. Запустите программу, проверьте, можете ли управлять роботом вручную, с клавиатуры. 4. Заведите робота на линию. Дайте ему самому продолжить путь. 5. При необходимости скорректируйте программу. 6. Сохраните проект. Рис. 3.10. Окончательный вариант программы автоматического и ручного управления Умный робот. Автоматизация 73
Примечание В зависимости от того, насколько резко изгибается ваша линия, могут потребоваться изменения коэффициентов в блоках управления движением по дуге. Например, для маленького поля с разметкой в форме восьмёрки нам пришлось выставить коэффициент 0.1 вместо 0.5, иначе робот не успевал повернуть на крутом вираже. В нашем роботе используются обычные коллекторные двигатели, скорость вращения которых варьирует при изменении заряда аккумуляторов. Подбирать подходящую мощность для обеспечения нужной скорости нам придётся часто. Более совершенные роботы имеют двигатели с энкодерами, которые способны обеспечить точные дистанцию и скорость перемещения независимо от напряжения питания и других условий. 7. Поэкспериментируйте с коэффициентами, добейтесь уверенного прохождения линии в автоматическом режиме. 8. Управляя кнопками (ручной режим), разверните робота, отправьте его по линии в противоположную сторону. Убедитесь, что всё получается и в этом случае. Проект 8. «Движение по линии. Вернусь сам» Введение в проект В предыдущем проекте, когда робот терял линию, требовалось ваше участие для того, чтобы вернуть его на трассу. Сейчас мы попробуем запрограммировать робота на автоматический поиск линии при её потере. Приступаем к работе Этап 1. Простой возврат на линию Воспользуйтесь своим прошлым сохранённым проектом со спрайтом Указатель1 и созданными переменными. По сути в предыдущем проекте необходимо сделать небольшие преобразования, убрать лишнее и сохранить с новым именем. Все скрипты нового проекта представлены на рис. 3.11. 1. Соберите скрипты по рис. 3.11 (загрузите предыдущий проект и внесите нужные изменения или загрузите спрайт Указатель1 и соберите проект заново). 74 Глава 3
Рис. 3.11. Программируем возврат на линию 2. Соедините робота с компьютером, настройте соединение с mBlock. 3. Поставьте робота на линию, запустите программу на выполнение. Понаблюдайте за поведением робота. 4. Попробуйте вручную вынести робота за пределы линии. Посмотрите, как он будет действовать. 5. Сохраните текущий вариант проекта. Этап 2. Возврат на линию. Усложняем алгоритм Наш робот уже научился возвращаться на линию, но алгоритм его работы всё ещё можно значительно усовершенствовать. Этим и займёмся. Теперь робот во время поиска линии будет двигаться медленнее и поворачивать круче, а некоторых случаях даже пятиться назад. Иными словами, действия робота будут Умный робот. Автоматизация 75
разными при следовании по линии и при её потере. Если робот видит линию, он будет пользоваться уже отработанным ранее алгоритмом (только теперь эта подпрограмма будет называться следование). При потере разметки активируется . специальная подпрограмма, описание которой будет в новом блоке Нам потребуются новые переменные: известное_значение (хранит последнее значение сенсора, полученное в тот момент, когда линия была видна) и миним_ мощн (мощность, которая обеспечивает движение на минимальной скорости). 1. Посмотрите на рис. 3.12, найдите отличия от программы предыдущего этапа. 2. Создайте нужные переменные и блоки, соберите скрипты, ориентируясь на рисунок. 3. Запустите программу на выполнение. Посмотрите за поведением робота. Вручную выведите его с линии, понаблюдайте, как он возвращается. Рис. 3.12. Алгоритм возвращения на линию становится сложнее 76 Глава 3
Примечание Минимальная мощность должна быть такой, чтобы робот медленно, но перемещался, а не стоял на месте и пищал моторами. На различных робоплатформах эта мощность разная, значение необходимо подобрать. может смутить пустое И ещё одно замечание: в блоке поле иначе последнего вложенного условного цикла. Да, этот блок можно заменить на обычный . Но мы хотели показать, что такой вариант, как на рис. 3.12, тоже допустим, а в ряде случаев и удобен, например, если вы в будущем планируете добавить ещё несколько вложенных циклов проверки условий. Робот должен уверенно двигаться по линии и самостоятельно искать её в случае потери. Постарайтесь добиться такого результата. Особенно интересным процесс следования становится при использовании линий сложной конфигурации. Здесь уже можно играть с различными условиями прохождения трассы. Проект 9. «Самостоятельный робот». Осваиваем автономный режим Вот и пришла пора «оторвать» робота от компьютера. Ранее робот ездил на «привязи» (шнур USB), в лучшем случае использовалось беспроводное управление. Но руководила его поведением всё равно среда mBlock. Это значит, что робот должен был отправить информацию, полученную от датчиков, компьютеру, а тот принять решение и передать команды на вращение моторов. Вам не кажется, что это слишком мудреный процесс, чрезмерно заторможенный изза необходимости гонять данные туда и обратно? Но ведь у робота есть собственные «мозги» — микроконтроллер, давайте попробуем загрузить нужную программу прямо в его память! Скорость реакции на события должна заметно возрасти. Решено, пробуем автономный режим! Введение в проект Как и в предыдущем проекте, робот должен будет самостоятельно двигаться по линии и возвращаться на неё в случае потери, но теперь он должен это Умный робот. Автоматизация 77
делать в автономном режиме, независимо от компьютера. На финальной стадии робот не только будет ездить по линии, но и останавливаться перед препятствиями. Будет несколько новшеств. 1. Добавим ­ какой-­ нибудь сигнал, которым робот будет сообщать, что в него загружена программа автономной работы. Это удобно, мы будем понимать, что для возобновления его работы со средой управления на компьютере нам придётся вновь загрузить прошивку от mBlock. 2. Используем блок, запускающий выполнение программы после нажатия . кнопки на контроллере робота, 3. Добавим цветовую индикацию происходящих событий с помощью светодиодов на контроллере. , обе4. Испытаем новый вид связи с роботом, блок спечивающий передачу информации по последовательному порту. Мы же хотим получать к­ акие-то отчеты от робота, даже если он и будет сам решать, как и куда ему ехать. Этот вариант связи с автономным устройством очень пригодится в самых разных проектах, особенно если мы по тем или иным причинам не сможем видеть робота непосредственно. 5. Заменим привычные «шапочки» (блоки-­заголовки) из категории События на заголовки из категории Робот, в данном случае — из расширения simpleBot. Именно эти блоки-­заголовки объясняют среде mBlock, что создаётся программа автономной работы. 6. Загрузим получившуюся программу в память контроллера. Из новых приёмов работы отметим создание блоков с параметрами (от значения этих параметров будет зависеть результат выполнения блока). Как и ранее, создаются они в категории Данные и Блоки, но дополнительно используются опции. Пример на рис. 3.13. Создается новый блок с двумя числовыми параметрами (команда Добавить ввод числа). Первый параметр уже переименован в left, второй только выделили для переименования. Далее, когда вы будете собирать описание блока, эти параметры можно просто вытаскивать мышью и ставить в нужное место скрипта. 78 Глава 3
Рис. 3.13. Создание нового блока с двумя числовыми параметрами Приступаем к работе Этап 1. Первый проект автономного движения. Готовимся По сути, сейчас мы повторим предыдущий проект (см. рис. 3.12), но в автономном режиме, заодно добавив нужную индикацию и систему диагностических уведомлений от робота о происходящих с ним событиях. Поэтому можно загрузить прошлый проект, внести в него изменения и сохранить с новым именем. На этой стадии не будем использовать моторы, надо сперва убедиться, что всё работает правильно. 1. Внимательно рассмотрите скрипты на рис. 3.14, постарайтесь разобраться, в чём отличие от предыдущего проекта. Найдите командный блок во введении к проекту. и другие новые блоки, которые обсуждались 2. Соберите скрипты по рис. 3.14 (загрузите предыдущий проект и внесите нужные изменения). 3. Соедините робота с компьютером кабелем USB, настройте соединение с mBlock (для загрузки автономных программ беспроводной тип связи подходит плохо). 4. Перейдите в режим Arduino mode, используя меню Редактировать (рис. 3.15). Умный робот. Автоматизация 79
Рис. 3.14. Скрипты первого этапа автономного движения по линии 5. Справа, в окне, можно посмотреть вашу программу, но уже не в виде блоков, а в текстовом виде. Прокрутите программу, посмотрите, как записаны ваши блоки в виде текста. Обратите внимание, что названия блоков на русском языке заменены на бессмысленные наборы символов, что очень неудобно при отладке программы именно в таком, текстовом, виде. На следующем этапе проекта мы это исправим. 80 Глава 3
Рис. 3.15. Переход в режим Arduino mode 6. Нажмите кнопку Upload to Arduino (рис. 3.16), понаблюдайте за процессом загрузки программы в память контроллера робота. Рис. 3.16. Кнопка загрузки программы в память контроллера 7. Если процесс загрузки прошел корректно, вы увидите сообщение о завершении загрузки (рис. 3.17). Рис. 3.17. Загрузка завершена Всё, программа в памяти контроллера, робот готов к её выполнению. 1. Отсоедините робота от компьютера, USB-кабель больше не нужен. 2. Поставьте робота на линию. 3. Запустите программу, нажав кнопку на контроллере. Убедитесь, что робот подаёт звуковые и световые сигналы. Перемещая робота над линией, убедитесь, что сигналы меняются в соответствии с вашей про­ граммой. Умный робот. Автоматизация 81
Да, но как же сигналы, которые должен передавать робот? Мы же ввели специальные блоки для передачи сообщений по последовательному порту! Мы их задействуем чуть позже. Но сначала хотелось показать, что без всякой связи с компьютером автономная программа замечательно работает. Теперь давайте добавим возможность передавать сигналы от робота. Для этого потребуется восстановить линию связи, иначе как же он сможет «докричаться» до компьютера? Эта линия будет работать для передачи произвольных сообщений, а не лишь внутренней служебной информации среды mBlock, как раньше. В следующих проектах по такой линии мы сможем передавать сигналы и в обратном направлении, то есть от компьютера роботу. 1. Соедините робота с компьютером (пока проще использовать провод­ ную связь). 2. Если ранее вы отключали робота, запустите программу на выполнение (нажав кнопку на контроллере). 3. Перейдите в режим Arduino mode. 4. Справа внизу расположены инструменты коммуникации, терминальный клиент, встроенный в среду mBlock. Измените режим отображения сигналов по последовательному порту с binary (двоичный код) на char mode (от английского слова character — символ) для отображения символов, как на рис. 3.18. Рис. 3.18. Переключение режима отображения символов. Слева вверху видны поступающие сигналы 5. Левее и выше переключателей можно видеть поступающие от робота сигналы. Этап 2. Исправляем названия блоков и переменных для автономного режима Настало время изменить названия блоков и переменных для автономного режима. На предыдущем этапе вы уже убедились, что в режиме Arduino mode русскоязычные названия блоков и переменных в тексте программы нормально не отображаются, что неудобно, особенно при отладке и поиске ошибок. Рано или поздно вам придётся освоить текстовое программирование, 82 Глава 3
и умение читать код весьма пригодится. Заменим русские названия блоков и переменных английскими вариантами. Для изменения назваРис. 3.19. Переименование переменных ния не потребуется пересоздавать блоки или переменные. Достаточно использовать контекстное меню (вызывается щелчком правой кнопки мыши по объекту). Для переменных — переименовать переменную (рис. 3.19). Для блоков — контекстное меню редактировать. Сигналы, передаваемые по последовательному порту, можно не менять, они нормально отображаются независимо от используемого языка. 1. Измените названия блоков и переменных в соответствии с рис. 3.20. Рис. 3.20. Проект с измененными названиями блоков и переменных Умный робот. Автоматизация 83
2. Соедините робота с компьютером кабелем USB, настройте соединение с mBlock. 3. Перейдите в режим Arduino mode. 4. Обратите внимание на окно справа, ознакомьтесь с вашей программой в текстовом виде. Прокрутите программу, посмотрите, как теперь отображаются ваши блоки в виде текста. 5. Нажмите кнопку Upload to Arduino, понаблюдайте за процессом загрузки программы в память контроллера робота. 6. Получив сообщение о завершении загрузки, отсоедините робота от компьютера. 7. Поставьте робота на линию, запустите программу на выполнение (нажав кнопку на контроллере). 8. Убедитесь, что всё работает правильно. 9. Сохраните проект. Этап 3. Поехали! Включаем моторы Теперь, когда мы провели все проверочные и подготовительные работы, можно задействовать моторы. На этом этапе мы убрали передачу сигналов по последовательному порту, чтобы проект не был громоздким. Но при желании вы легко можете добавить эту функцию. Все скрипты показаны на рис. 3.21. Напомним, что в электронном архиве проекта можно найти файлы с изображениями скриптов, которые удобно просматривать на компьютере в увеличенном масштабе. 1. Соберите скрипты по рис. 3.21 (загрузите предыдущий проект и внесите нужные изменения). 2. Соедините робота с компьютером USB-кабелем, настройте соединение с mBlock. 3. Перейдите в режим Arduino mode. 4. Нажмите кнопку Upload to Arduino и, получив сообщение о завершении загрузки, отсоедините робота от компьютера. 5. Поставьте робота на линию, запустите программу на выполнение (нажав кнопку на контроллере). 6. Убедитесь, что всё работает правильно. 84 Глава 3
Рис. 3.21. Проект с блоками управления моторами 7. Попробуйте сместить робота с линии, понаблюдайте, как он ищет путь. 8. Сохраните проект. Умный робот. Автоматизация 85
Насколько быстрее теперь может двигаться робот! Раньше, в проектах с интерактивным режимом, нам приходилось ограничивать мощность моторов, чтобы предотвратить сход с линии. Теперь робот двигается на максимальной скорости и весьма уверенно. Вот что значит мгновенное получение информации от датчиков и принятие управляющих решений непосредственно контроллером! Кстати, вы обратили внимание, что движение не начинается, если после включения робот стоит не на линии, а на поле? Это происходит потому, что известное_значение (knownV) равно –1, робот линии ещё не видел, поэтому и не может на неё вернуться. Этап 4. Не сталкиваться! А теперь заключительный этап проекта. Давайте научим робота не сталкиваться с препятствиями, возникающими на его пути. Для этого задействуем датчик расстояния, ультразвуковой дальномер. Вот только пока мы ещё не освоили блоки работы с сервоприводом, так что повернуть голову робота, чтобы она смотрела прямо, придётся вручную. Изменения в скриптах и дополнения к предыдущему проекту представлены на рис. 3.22. 1. Загрузите предыдущий проект и внесите изменения в соответствии с рис. 3.22. 2. Загрузите программу в память робота (мы далее не будем описывать процесс перехода в нужный режим и последовательность действий по загрузке, всё это уже было ранее). 3. Поставьте робота на линию, запустите программу на выполнение. 4. Убедитесь, что всё работает правильно. 5. Попробуйте установить ­ какую-то преграду на трассе, понаблюдайте за пове­дением робота. Дальномер должен опознавать препятствие, не всегда удаётся заметить его своевременно. Играют роль материал и форма пре- 86 Рис. 3.22. Изменения и дополнения к этапу 3 Глава 3
пятствия, его положение на трассе. Обратите внимание, что на входящем в комплект поле с разметкой линия имеет крутые повороты. Подберите прямой отрезок трассы для установки препятствия либо поверните дальномер в нужную сторону. 6. Сохраните проект. Примечание Для этого проекта особенно интересно использовать длинную линию с различными пересечениями и поворотами. А если у ваших друзей есть роботы, которых тоже можно запрограммировать на автоматическое движение с остановкой перед препятствием, будет ещё интереснее (рис. 3.23). Также можно экспериментировать с другими элементами трассы. Например, в нашей книге с набором «Scratch и Arduino для юных программистов и конструкторов» приведён проект с созданием модели автоматического шлагбаума. Этот проект хорошо вписывается в текущую игру, роботы будут останавливаться перед закрытым шлагбаумом и возобновлять движение при его открытии. Если этой модели у вас нет, можете придумать и собрать из подручных средств собственную конструкцию и регулировать движение, поднимая и опуская штангу шлагбаума вручную. Рис. 3.23. Группа роботов путешествует по линии. Линия нарисована по трафарету на детских ковриках-­пазлах, что позволяет пересобрать её в разных вариантах Умный робот. Автоматизация 87
Проект 10. «Примите команду!» В интерактивном режиме управлять роботом и принимать его сигналы легко и удобно, ведь все средства оптимизированы для решения именно этой задачи. В автономном режиме робот действует сам, но всё равно может возникнуть потребность связаться с ним. Ранее вы уже столкнулись с передачей информации по последовательному порту (см. рис. 3.18). В том проекте робот сообщал нам о своём состоянии. Теперь же предлагаем научить робота, действующего в автономном режиме, выполнять наши команды, отправленные всё по тому же последовательному порту. Но есть небольшая сложность. Робот понимает команды в цифровом коде, а мы хотим нажимать обычные клавиши с символами. Значит, нам полезно будет знать, какие коды отправляются при нажатии той или иной символьной клавиши на клавиатуре. Это можно выяснить разными способами, один из самых простых — воспользоваться таблицей символов ASCII (American standard code for information interchange; это таблица, в которой распространённым печатным символам сопоставлены числовые коды). Фрагмент таблицы с английскими буквами представлен на рис. 3.24. Коды для других символов, в том числе и для русских, вы без труда найдёте в Сети. Рис. 3.24. Таблица ASCII (фрагмент) Посмотрите, для буквы F, например, код — 70, для символа @ («собака») — 64. Вот эти самые коды и будут использоваться в программах. 88 Глава 3
Введение в проект В новом проекте нам надо создать программу, позволяющую передавать роботу, работающему в автономном режиме, команды, набираемые с помощью клавиатуры компьютера. Главное — понять принцип передачи команд, поэтому сам проект будет несложным: посылая символы L, R и A, будем зажигать соответственно левый светодиод, правый или оба вместе. Приступаем к работе 1. Откройте среду mBlock, создайте новый проект, спрайт можно не менять. 2. Создайте новую переменную dat в категории Данные и Блоки. 3. Соберите скрипты по 3.25. Обратите внимание, что переменная dat обычно хранит числа, но мы используем хитрость: будем указывать текстовой символ, а при работе программы он преобразуется в числовой код, и таким образом будут сравниваться числа. Кавычки вокруг символов следует ставить одинарные! Рис. 3.25. Скрипт для управления роботом с помощью нажатия символьных клавиш Умный робот. Автоматизация 89
4. Загрузите программу в память робота. (Режим Arduino mode, используем кабель USB, помните?) 5. Вновь наладьте соединение с роботом. Ва ж но! Пока что мы используем упрощённый набор команд для работы с последовательной шиной. Приведённый скрипт будет работать и с контроллерами на основе Arduino Uno и с MEGA 2560, если они подключены к компьютеру кабелем USB. Однако в том случае, когда используется беспроводное соединение, может потребоваться указать ту скорость работы последовательной шины данных, на которую настроен подключенный модуль беспроводной связи. Кроме того, на некоторых контроллерах модуль может быть подключен к одной из дополнительных последовательных шин, например к Serial2, как на контроллере MegaPi. Потребуется использовать более совершенные программные средства, которые позволяют менять настройки, например среду MindPlus или наше авторское расширение Advanced Arduino Extension для mBlock3. Поэтому, если при беспроводном соединении с вашим роботом скрипт не работает, первым делом воспользуйтесь кабелем USB. 6. Вернитесь в режим Arduino mode. Справа внизу, в терминальном блоке, настройте режим char mode (рис. 3.26). 7. Проверьте работоспособность программы, вводя символы L, R и A и отправляя их контроллеру робота командой Send (см. рис. 3.26). Рис. 3.26. Терминальный модуль. Отправляем команду R (зажечь правый светодиод) Если всё получилось, замечательно! Теперь вы научились отправлять роботу команды, даже когда он находится в автономном режиме. Это может пригодиться, 90 Глава 3
например, в случае необходимости экстренной остановки, возврата на базу и так далее. Попробуйте придумать свою программу управления с помощью передаваемых символов. Проект 11. «Три варианта следования по линии» Введение в проект Наш робот уже умеет двигаться по линии, придерживаясь её середины. Но иногда может понадобиться сменить принцип работы алгоритма следования. Есть три основных варианта: ориентироваться на центр линии, на её левый край или на правый. Меняя их, робот сможет попасть в нужную точку на полигоне со сложной разметкой. В этом проекте мы рассмотрим все три режима следования, а заодно предусмотрим смену используемого алгоритма на ходу с помощью команд по последовательному порту. Приступаем к работе Этап 1. Интерактивный режим, подготовительные работы Во множестве случаев бывает проще первым делом отладить программу в интерактивном режиме, в котором сразу же видны последствия редактирования скрипта, а уже потом адаптировать программу для автономного режима работы робота. 1. Для возвращения робота в состояние для интерактивного режима управления надо подключить его к компьютеру и вновь обновить прошивку из программы mBlock (если забыли, как это делается, посмотрите на рис. 2.10 и 2.11). 2. В качестве основы нового проекта, можно использовать программу этапа 2 из проекта «Движение по линии. Вернусь сам» (см. рис. 3.12). Загрузите сохранённый проект или воспользуйтесь электронным архивом к книге. 3. На рис. 3.27 представлен весь набор скриптов нового проекта, на рис. 3.28 — переменные и создаваемые блоки. Посмотрите на программу, сравните с загруженным проектом, постарайтесь выделить новые элементы. 4. Добавьте переменную вариант_следования и задайте ей начальное значение («по центру»). Умный робот. Автоматизация 91
Рис. 3.27. Скрипты этапа 1 проекта «Три варианта следования по линии» 5. Переименуйте блок 6. Создайте в блоки (пока пустые) . и . 92 Глава 3
7. Добавьте вложенные проверки значения переменной вариант_следования в основной программный цикл. Рис. 3.28. Переменные и созданные блоки этапа 1 проекта «Три варианта следования по линии» 8. Запустите программу на выполнение, проверьте работу (напомним, что при движении по линии удобно использовать беспроводное соединение). Поправьте, если нужно, значения скорости (переменная миним_ мощн, значение должно позволять роботу двигаться). . Кстати, обраНа этом этапе всегда будет срабатывать тите внимание, блоки и , обеспечивающие следование по центру линии, остались неизменными, то есть поведение робота пока ничем не отличается от того, что он демонстрировал в исходном проекте с рис. 3.12. Пора добавить дополнительные алгоритмы следования по линии. Этап 2. Интерактивный режим с выбором трёх режимов следования по линии На этом этапе мы всё ещё отлаживаем программу в интерактивном режиме, но теперь наполним содержимым блоки следования по краю линии, а заодно введём переключение режима следования с помощью клавиш со стрелками на клавиатуре. Все изменённые блоки этапа 2 показаны на рис. 3.29. Умный робот. Автоматизация 93
Рис. 3.29. Измененные скрипты проекта для этапа 2 1. Доработайте блок для выбора варианта следования и отображения выбранного варианта, ориентируясь на рис. 3.29 94 Глава 3
(в интерактивном режиме переменным удобно присваивать осмысленные текстовые значения). 2. Соберите скрипты описания блоков и . Примечание Логику работы программы удобно отлаживать, убрав команды управления моторами. Устанавливаем робота в нужное место трассы и наблюдаем за индикацией. 3. Запустите программу на выполнение. Проверьте, как робот следует по линии в интерактивном режиме. При необходимости скорректируйте значения, определяющие скорость движения. 4. Используя клавиши клавиатуры (стрелка вверх, влево, вправо), изменяйте режим следования, понаблюдайте за поведением робота. Посматривайте и на индикацию на экране компьютера, режимы следования должны отображаться правильно. С использованием двух сенсоров надёжное следование по краю линии можно обеспечить лишь «нервным» реагированием на изменение ситуации, при этом чем толще линия, тем надёжнее следование. Вы собрали программу для реализации трёх режимов следования. Теперь, после отладки в интерактивном режиме, её надо перевести в вариант для автономного выполнения контроллером. Вы уже убедились ранее, что в автономном варианте всё будет происходить быстрее и робот будет двигаться увереннее. Приступим. Этап 3. Автономный режим с выбором режимов следования по линии Все скрипты программы для автономного режима показаны на рис. 3.30. Посмотрите, в скриптах предусмотрена звуковая и световая индикация, а также остановка робота (автоматическая, перед препятствием, с использованием переменной дист и ручная, по команде S). Команды выбора режима следования, а также команда на остановку будут передаваться по последовательному порту. 1. Добавьте переменную кмд (она будет отвечать за команды, передаваемые по последовательному порту). Символы по последовательному порту поступают не только те, которые мы видим, но и служебные, поэтому Умный робот. Автоматизация 95
Рис. 3.30. Все скрипты этапа 3 — автономный режим 96 Глава 3
режим следования необходимо менять лишь тогда, когда приходит один из нужных символов. У нас такими будут C, L, R соответственно для выбора режимов «по центру», «по левому краю» или «по правому краю». Ещё используем команду S для остановки. 2. Приведите скрипты проекта в соответствие с рис. 3.30. 3. В блоках блоки и для компактности можно заменить на . 4. Перейдите в режим Arduino mode и загрузите программу в память робота. 5. Вновь наладьте соединение с роботом (проводное или беспроводное), чтобы иметь возможность отправлять команды по последовательному порту. 6. Вернитесь в режим Arduino mode. Справа внизу, в терминальном блоке настройте режим char mode (если забыли — смотрим на рис. 3.18). Если вы внимательно посмотрели скрипты программы, то увидели, что изначально робот стоит на месте, ожидая вашей команды. 1. Проверьте работоспособность программы, вводя символы C, L, R и посылая их в контроллер робота командой Send. 2. Проверьте работу команды S (остановка) в ручном режиме, а также автоматическую остановку робота перед препятствием. Вновь напомним про возможность коррекции значения переменной миним_мощн. Если робот не едет, а лишь гудит моторами, стоя на месте, увеличьте данное значение и вновь загрузите программу в контроллер робота. Если всё работает правильно — поздравляем, вы справились с весьма сложным проектом, который можно использовать как основу для программирования робота, участвующего в спортивных состязаниях. В некоторых из них, например MakeX, есть задания, в которых робот должен доехать до определённого места на специальном поле. С использованием вышеописанных режимов следования (со своевременным переключением) можно выполнить такое задание. Отметим также, что команды по последовательному порту можно отправлять не только с помощью встроенного терминала mBlock, но и используя специальные терминальные программы, например Tera Term (https:// ru.wikipedia.org/wiki/Tera_Term). В этом случае символы отправляются сразу при нажатии на клавишу. Таким образом, клавиатуру компьютера можно использовать как пульт управления. Умный робот. Автоматизация 97
Проект 12. «Дискотека». Инфракрасный пульт управления Введение в проект Как можно понять по названию, в этом проекте робот будет танцевать, зажигать разноцветные огоньки и проигрывать музыку. Одним из компонентов контроллера робота является инфракрасный приёмник, а в комплект входит инфракрасный пульт. В этом проекте мы научимся использовать инфракрасный канал связи для передачи команд. И на всякий случай (например, если у вас нет батарейки для пульта) продублируем управление командами по последовательному порту. Существует множество бытовых устройств и масса разнообразных пультов для управления ими. Но в наборах с роботами используются в основном стандартные пульты для Arduino-­проектов, лишь на некоторых кнопках могут быть разные обозначения. Мы будем использовать кнопки с цифрами, они на всех пультах обозначаются одинаково. Приступаем к работе Этап 1. Подготовка. Получаем коды, отправляемые с инфракрасного пульта На этом этапе мы научимся получать и расшифровывать коды сигналов, отправляемых при нажатии кнопок пульта. В дальнейшем это позволит использовать любые кнопки любого пригодного инфракрасного пульта. По той же методике вы сможете получить искомые коды, отправляемые другими кнопками пульта при нажатиях. 1. Откройте среду mBlock. 2. Посмотрите скрипт программы на рис. 3.31. Видно, что потребуется переменная IR_cmd, в которой мы и будем хранить получаемый при нажатии кнопки пульта код (блок «опознания» кода с инфракрасного пульта ). Сама программа очень проста — при отличающемся от нуля значении переменной IR_cmd (которая получает значения кода с пульта) это значение выводится по последовательному порту, и мы можем его прочитать. 3. Соберите скрипт по рис. 3.31. 98 Глава 3
4. Перейдите в режим Arduino mode и загрузите программу в память робота. 5. Вновь наладьте соединение с роботом, чтобы иметь возможность принимать информацию по последовательному порту. 6. Вернитесь в режим Arduino mode. Справа внизу, в терминальном блоке, настройте режим char mode (если забыли — смотрим на рис. 3.18). 7. Проверьте работоспособность программы, нажимая кнопки инфракрасного пульта 0, 1, 2, 3 и наблюдая за информацией, отображаемой в окне терминального клиента. Запишите коды, получаемые роботом при нажатии этих кнопок, они нам будут нужны. В нашем случае получились соответственно коды 22, 12, 24, 94. Рис. 3.31. Скрипт этапа 1 проекта «Дискотека». Выясняем коды, отправляемые пультом Этап 2. Посветим светодиодами Теперь применим наши новые знания о кодах, получаемых с пульта управления. Используем кнопки пульта для простого действия — зажигать и гасить светодиоды. Заодно продублируем команды с инфракрасного пульта командами, отправляемыми с клавиатуры по последовательному порту (ну вдруг у вас ещё нет инфракрасного пульта или батарейки для него). 1. Откройте среду mBlock. 2. Соберите скрипт программы по рис. 3.32. 3. Перейдите в режим Arduino mode и загрузите программу в память робота. 4. Попробуйте управление роботом с помощью кнопок на пульте инфракрасного управления. Если вы внимательно рассмотрели скрипт проекта, то уже увидели, что кнопка 0 на пульте (код 22) выключает светодиоды робота, кнопки 1, 2 и 3 зажигают соответственно левый светодиод, Умный робот. Автоматизация 99
два светодиода сразу, правый светодиод. Попробуйте включать, выключать различные светодиоды с помощью пульта. 5. Вновь наладьте соединение с роботом, чтобы иметь возможность отправлять команды по последовательному порту. 6. Вернитесь в режим Arduino mode. Справа внизу, в терминальном блоке настройте режим char mode. 7. Управляйте светодиодами с помощью отправляемых (кнопка Send) команд с клавиатуры компьютера. Используются клавиши <S>, <1>, <2> и <3>. Рис. 3.32. Скрипт этапа 2 проекта «Дискотека». Зажигаем светодиоды Этап 3. Танцуем и поём! Теперь, когда мы научились командовать роботом с пульта, попробуем с каждой кнопкой управления связать к­ акое-то сложное действие. Например, при нажатии на кнопку 0 робот сыграет мелодию «кукарача» и помигает разноцветными светодиодами, а кнопками 1 и 2 запустим к­ акие-­нибудь танцевальные движения. Да, и пусть в момент начала работы программы робот произнесёт название проекта «Дискотека». Вот только синтезатора речи у нас нет, поэтому произносить он будет с помощью азбуки Морзе! 100 Глава 3
В этом проекте мы ещё раз потренируемся в использовании своеобразных готовых библиотек, уже содержащих нужные для наших программ блоки. Это легко реализовать с использованием спрайтов. Суть такова: создаём спрайт с набором скриптов, сохраняем этот спрайт в отдельный файл (с ним вместе сохраняются скрипты), потом загружаем его в свой новый проект, и все скрипты от этого спрайта можно использовать уже в новом проекте. Далее мы подробно рассмотрим этот процесс. Спрайты уже подготовлены и сохранены в электронном архиве проекта, оттуда вы их и импортируете. 1. Запустите среду mBlock. По умолчанию откроется спрайт Панды, вот для него мы и будем собирать основной скрипт проекта. Но нам нужны для этого блоки из подготовленных спрайтов в электронном архиве. 2. Загрузите в проект спрайты Morse-blocks.sprite2, Beetle.sprite2 и Robot1.sprite2 (если забыли, как это делается, посмотрите на рис. 2.22). 3. Для спрайта Панды нам надо собрать лаконичный скрипт, изображенный на рис. 3.33. Его простота обманчивая, так как все новые блоки , и остальные) имеют весьма сложное описание, ко( торое можно посмотреть, выбрав соответствующий спрайт. Рис. 3.33. Скрипт этапа 3 проекта «Дискотека» Умный робот. Автоматизация 101
4. Для сборки скрипта проекта в спрайте Панды нам надо перенести нужные блоки из подготовленных спрайтов. Для этого выбираем соответствующий спрайт, берём в поле спрайтов нужный блок и перетаскиваем его мышью на спрайт Панды в области спрайтов (рис. 3.34). Рис. 3.34. Перетаскиваем блок кукарача в скрипты спрайта Панды Примечание Мы перетаскиваем только сами блоки, оставив их определения в библиотеках-­спрайтах. Такой вариант работает исключительно для автономного режима. В интерактивном режиме можно перетаскивать таким же образом полностью собранные скрипты и определения блоков из других спрайтов. 5. Добавьте нужные блоки для спрайта Панды из библиотек и соберите скрипт по рис. 3.33. Будьте внимательны при сборке блоков проверки. 6. Перейдите в режим Arduino mode и загрузите программу в память робота. 7. По скрипту видно, что для управления, как и ранее на этапе 1, можно использовать как кнопки на пульте инфракрасного управления (0, 1, 2), так и команды по последовательному порту. Попробуйте запустить разные действия (подпрограммы) с пульта или используя команды с клавиатуры. Здесь и далее мы уже не будем описывать подробно работу с последовательным портом, если потребуется, всегда можно подсмотреть информацию в предыдущих проектах. 8. Испробуйте программу, запуская нужные действия кнопками пульта управления (или организовав управление по последовательному порту). 102 Глава 3
Примечание Обратите внимание, что блоки-­подпрограммы и — это своеобразные элементы «танца» робота. Их можно использовать последовательно в виде комбинаций, придумывать и добавлять новые движения. В соревновательной робототехнике есть такая дисциплина, как совместное выступление нескольких роботов, которое запускается по команде с одного пульта. Кстати, в программе mBlock одно из стандартных расширений называется Communication. Используя это расширение при наличии нескольких роботов, можно научить их отправлять друг другу сообщения. Дополнительные задания Придумайте свои «жесты» и добавьте их в скрипт проекта. В электронный архив проекта входит спрайт Wizard_Hat.sprite2, который содержит готовый скрипт для самостоятельной доработки прошлого проекта «Три варианта следования по линии» с возможностью смены режима следования с помощью инфракрасного пульта. 1. Загрузите из сохраненного проекта «Три варианта следования по линии» этап 3 (надеемся, вы не забываете сохранять свои проекты, но напомним, что проекты есть и в электронном архиве). 2. Загрузите в проект спрайт Wizard_Hat.sprite2 из электронного архива текущего проекта. 3. Скопируйте готовые скрипты из спрайта Wizard_Hat.sprite2 в спрайт Указатель1. Всё так же, как раньше с блоками, просто перетаскиваем скрипты на другой спрайт (рис. 3.35). 9. Теперь выбираем спрайт Указатель1 и видим на поле скриптов не только все скрипты проекта, но и новые, скопированные из спрайта Wizard_Hat. Их надо просто правильно вставить в нужное место. Самый простой вариант — на рис. 3.36. Но, конечно же, вы можете его улучшить. Например, вынести команду установки значения переменной IR_cmd в блок , оптимизировать блоки проверки и так далее. Умный робот. Автоматизация 103
Рис. 3.35. Перетаскиваем готовые скрипты в спрайт Указатель1 Рис. 3.36. Изменение основного скрипта проекта «Три варианта следования по линии» (фрагмент) 104 Глава 3
10. Протестируйте новую программу. Возможность быстро переключать режим движения по линии с удобного пульта хорошо использовать в играх. Например, строить трассы с разными ответвлениями и засекать время движения из одной точки в другую, соревнуясь с друзьями. В заключение главы упомянем ещё об одном проекте, который представлен в разделе «Приложения». Это проект «Демонстрация». Вы уже вполне готовы к его запуску, рекомендуем попробовать. Пригодятся ваши навыки работы с инфракрасным пультом, а заодно можно будет посмотреть на реализацию других интересных возможностей робота. Умный робот. Автоматизация 105
Больше возможностей. Используем сервомотор и гироскоп Вы уже многое умеете, многому научился и робот. Настало время расширить его возможности. И начнём мы с использования сервомотора (рис. 4.1). Рис. 4.1. Сервомотор SG90, часто используемый в проектах с контроллерами Arduino Сервомотор (ещё говорят «сервопривод») — очень важный элемент в робототехнике! Это специальный мотор, который может поворачивать ведущий вал в заданное положение (подробнее читайте на https://bhv.ru/servo). С обычным коллекторным двигателем так не получится, ведь необходимо учитывать и первоначальное положение, и скорость поворота вала, и много других 106 Глава 4
факторов. Сервомоторы часто используют в манипуляторах, «руках» робота, где на каждом сочленении установлен собственный сервомотор. В нашем роботе мы будем использовать один сервомотор, на котором закреплена «голова» с датчиками расстояния. В этой главе мы научим робота не просто определять наличие препятствия впереди, по ходу движения, но и поворачивать «голову», чтобы робот мог осмотреться вокруг. Несмотря на то что набор для сборки робота сопровождается подробной инструкцией, именно установка и настройка «головы» (сервопривода, соединённого с датчиком расстояния) могут оказаться вполне серьезным испытанием. Повторим несколько базовых рекомендаций. 1. Если ранее вы последовали нашей рекомендации и отсоединили кабель сервомотора от контроллера, сейчас надо его соединить. 2. Проверьте конфигурацию, для работы с нашими скриптами сервомотор должен быть подключен к тому самому пину («ноге») контроллера, который обозначен как «default SERVO pin» (смотрите инструкцию по сборке робота). Проект 13. «Метроном» Введение в проект Для начала просто научим робота крутить головой, это понадобится ему для осмотра окрестностей. Повороты головы робота будут напоминать движения стрелки метронома. Мы предусмотрим и светодиодную индикацию поворотов. Проект будем делать в интерактивном режиме, так проще вносить коррективы и проводить отладку программы. Поворот головы будем осуществлять на углы 45° и 135°. Вы можете использовать другие углы, но прежде чем устанавливать крайние значения (близкие к 0° и 180°), убедитесь в том, что поворотам головы ничто не препятствует и нет риска повредить пластиковые шестерни сервопривода. Приступаем к работе 1. Запустите среду mBlock. 2. Подготовьте робота для управления в интерактивном режиме управления (подсоедините к компьютеру и обновите прошивку; если забыли, как это делается, посмотрите на рис. 2.10 и 2.11). Больше возможностей. Используем сервомотор и гироскоп 107
3. Создайте новый блок в категории Данные и Блоки. У него будут два числовых параметра: cnt (отвечает за количество поворотов) и tm (временнáя задержка, пауза между поворотами). Напомним, для добавления параметров необходимо щёлкнуть по стреле Опции (рис. 4.2). Рис. 4.2. Блок метроном с двумя числовыми параметрами 4. На рис. 4.3 представлен весь набор скриптов нового проекта. Собери(параметры cnt и tm просто те описание блока перетаскиваются мышью в нужные места блоков). Рис. 4.3. Набор скриптов проекта «Метроном» 5. Этот проект — просто служебная программа для проверки работы сервопривода, поэтому мы не ставим командный блок, запускать блок метроном на выполнение можно просто щелчком по нему. Для начала выставите параметр временнóй задержки tm = 0. Запустите программу 108 Глава 4
на выполнение, убедитесь, что сервомотору не хватает времени для выполнения полноценных поворотов. 6. Измените параметр tm на 0.5, попробуйте вновь запустить программу. Посмотрите, хватает ли времени роботу на поворот головы. Если надо, подкорректируйте значение. Отметим, что время задержки — зачастую важный элемент настройки программ. Программист должен понимать, что на выполнение определённых команд требуется некоторое время, и лишь после завершения действия имеет смысл давать следующую команду. может потребоваться и в других проектах, Блок поэтому рекомендуем его сохранить в качестве библиотеки. Как вы уже видели ранее, это можно сделать, сохранив спрайт с этими блоками. Можно, конечно, , и спрайт Панды сохранить в качестве носителя блока но использовать базовый спрайт не очень удобно. Предлагаем использовать другой спрайт, а заодно потренироваться в копировании скриптов в другие спрайты. 1. Добавьте в проект спрайт Lightning из библиотеки спрайтов mBlock. 2. Скопируйте в спрайт Lightning все скрипты набора метроном (перетаскиванием, см. рис. 3.35). 3. Сохраните спрайт Lightning в отдельную папку, которую стоит создать для хранения таких спрайтов-­библиотек. Можете переименовать спрайт, чтобы было понятнее содержимое. На всякий случай учтите, что спрайт Lightning с набором скриптов метронома всегда можно забрать из электронного архива проекта. Дополнительное задание Для закрепления новых умений предлагаем вернуться к проекту «Дискотека» и дополнить его новыми движениями робота. 1. Создайте новый «жест» с использованием поворота головы (у вас же есть готовый спрайт Lightning). Пофантазируйте, добавьте различные движения головой, используйте и другие выразительных средства (например, LED). 2. Сохраните блоки нового жеста в отдельном спрайте. 3. Добавьте новый «жест» в проект «Дискотека». Больше возможностей. Используем сервомотор и гироскоп 109
Проект 14. «Уклонение» Введение в проект Используем возможность поворотов головы робота для уклонения от препятствий по ходу его движения. При обнаружении препятствия робот будет крутить головой влево-­вправо (одновременно используя светодиоды для индикации состояния), определять свободное направление и продолжать движение, уклоняясь от препятствий. Используем автономный режим управления. Общий вид скриптов проекта представлен на рис. 4.4. Сейчас мы используем ультразвуковой датчик, который обладает ограниченной чувствительностью, широким углом сканирования, при этом сигнал может отражаться от плоских поверхностей в сторону. Во время запуска проекта попробуйте устанавливать разные препятствия (включая ладошки) на пути движения робота, сделайте выводы о возможностях обнаружения препятствий с помощью ультразвукового дальномера. Примечание В бесконечном быстро прокручивающемся цикле каждую итерацию (повторение цикла) в нашей программе выполняется блок . Первую половину секунды результат проверки в условном операторе — истина, вторую половину секунды — ложь. В результате непрерывного (сотни и тысячи раз в секунду) срабатывания этого блока происходит периодический (2 раза в секунду) поворот головы. , прокручивание Если произошёл вызов блока основного программного цикла приостановилось (можно понять по отсутствию смены цвета светодиода на зелёный). В языке Си (используемом в Arduino) при делении целого числа на целое результат представляется в виде целого числа. Чтобы получилось дробное, следует делить на дробное. Поэтому необходимо указывать именно так, как в соответствующем блоке: 1000.0. Если указать 1000, поворот на долю секунды не получить, лишь на целую секунду или на ноль секунд. 110 Глава 4
Рис. 4.4. Набор скриптов проекта «Уклонение» Приступаем к работе 1. 2. 3. 4. Запустите среду mBlock. Создайте нужные блоки и соберите скрипт программы по рис. 4.4. Перейдите в режим Arduino mode и загрузите программу в память робота. Отсоедините робота от компьютера, запустите программу на выполнение, нажав кнопку на контроллере. 5. Проверьте поведение робота при возникновении различных препятствий (ладони, коробки и так далее). Больше возможностей. Используем сервомотор и гироскоп 111
Дополнительное задание В скриптах проекта не предусмотрена возможность экстренной остановки робота, а это было бы очень удобно в случае, если вы отправили робота путешествовать по комнате. Предлагаем дополнить программу возможностью отправки таких команд с использованием инфракрасного пульта или команд по последовательному порту. Можно также предусмотреть возможность ручного управления движением робота с пульта, отдельной кнопкой включая режим «уклонения». Экспериментируйте, наши проекты — лишь основа для вашего творчества! Проект 15. «Калибровка» Введение в проект В предыдущем проекте вы использовали стандартный блок для управления сервоприводом. Но его возможностей в некоторых ситуациях может оказаться недостаточно. Например, в вашем распоряжении окажется особый сервомотор, отличающийся своей работой от стандартного, например такой, который осуществляет поворот на 270°, а не на стан, дартные 180°. То есть мы выставим значение 180 в блок а поворот произойдет на 270°. Выглядит странно, неудобно, да и повредить детали можно, если вы не предусмотрели вероятность такого поворота конструкцией робота. В таком случае нам может понадобиться ограничить диапазон поворота вала, установить точно начальный и конечный углы поворота и к тому же подправить среднее положение вала сервопривода. Это очень серьёзная работа, и довольно сложно было бы описать все её аспекты в данной книге. Примечание для любознательных Поясним принцип коррекции среднего положения. Из курса математики вам, возможно, уже известно о существовании линейных и квадратичных функций. У первых графики — прямые (рис. 4.5, синий график), у вторых — изогнутые (рис. 4.5, оранжевый график). И смысл в том, что значения поворота сервопривода прихо- 112 Глава 4
дится находить, как результат смешивания, в той или иной пропорции, линейных и квадратичных значений, получая-­подбирая результирующий график нужной кривизны (рис. 4.5, штриховая линия). А значит, значения угла поворота надо определённым образом преобразовывать. При этом удобно угол поворота задавать не в градусах, а в долях от максимального диапазона перемещения, то есть используемые значения будут в диапазоне от нуля до единицы. Посмотрите на график: ноль в любом случае (при любой кривизне графика) превратится в ноль, единица в любом случае — в единицу. А вот к­ акое-то промежуточное значение будет слегка сдвинуто либо к нулю, либо к единице, и чем ближе к середине диапазона (0.5), тем сильнее сдвинуто. И нам потребуется учитывать это смещение значений, чтобы точно выставить положение вала сервомотора в среднее положение. Рис. 4.5. Графики линейной и квадратичной функций Отметим, что подобное преобразование значений используется при обработке изображений и называется гамма-­коррекцией. Рекомендуем найти в Википедии одноимённую статью, многое станет понятнее. Больше возможностей. Используем сервомотор и гироскоп 113
Чтобы упростить работу по калибровке сервопривода, в расширение (рис. 4.6). simpleBot мы добавили специальный блок — Рис. 4.6. Блок _geekServo… из расширения simpleBot Особенности блока таковы: • угол задаётся не в градусах, а в доле от максимального диапазона перемещения, то есть от нуля до единицы; • диапазон перемещения ограничивается указанием длины самого короткого управляющего импульса и длины самого длинного. Подробнее про длину импульса и протокол PDM рекомендуем почитать на https:// bhv.ru/servo; • среднее положение можно корректировать значением correction. Приступаем к работе Этап 1. Проводим процедуру калибровки (интерактивный режим) 1. Откройте среду mBlock. Настройте соединение с роботом, подготовьте робота для работы в интерактивном режиме управления. 2. Перетащите блок метрами по умолчанию. (команды расширения simpleBot) с пара- 3. Выставите 0 (крайнее положение по часовой), щёлкните по блоку. Вал повернулся. 4. Перекрутите (переставьте, если крепление не жёсткое) голову робота так, чтобы она смотрела относительно точно или даже слегка избыточно направо. 5. Выставите 1, щёлкните по блоку. Голова должна повернуться налево, в идеале точно налево или даже избыточно налево (если сервомотор способен поворачиваться более чем на 180°). При необходимости перекрутите голову, подправьте так, чтобы в диапазон подвижности попадали и строгий (90°) поворот направо, и строгий поворот налево. 6. Вновь поверните голову в положение 0, выставив значение и щёлкнув по блоку. 114 Глава 4
7. Если начальное положение — избыточный поворот направо, скорректируйте значение 544, подберите подходящее. 8. После этого поверните голову в положение со значением 1. При необходимости подправьте значение 2400, подберите нужное. 9. Добейтесь такого состояния, чтобы при значениях 0 и 1 голова поворачивалась строго направо и налево. 10. Выставите значение 0.5, щёлкните по блоку. Голова повернулась строго вперёд — отлично! Но, скорее всего, всё же вам потребуется слегка подправить значение correction, установив его чуть больше или чуть меньше единицы. Добейтесь такого результата. 11. Проверьте все три значения: 0, 0.5 и 1. Если вал сервомотора поворачивается строго направо, в положение центр, строго налево — вы добились превосходного результата! 12. Запоминаем, записываем значения, которые подобрали! Пригодятся для следующих проектов. Было бы жаль потерять результаты работы по калибровке сервомотора, не проводить же её каждый раз с нуля. Но искать записи и вводить каждый раз эти значения тоже не оптимальный вариант. Поэтому рекомендуем создать собственный блок и сохранить его для дальнейшего использования. Метод всё тот же — сохранение спрайта с нужными скриптами для последующего использования этого спрайта в виде соответствующей библиотеки. Заодно предусмотрим ввод в этот блок значений углов поворота в градусах, так удобнее, чем запоминать соответствие в виде долей единицы. 1. Выберите спрайт для хранения блока управления сервомотором, например Arrow1 из библиотеки mBlock. В проекте реализован поворот стрелки на экране в соответствии с поворотом сервомотора, используйте костюм arrow1‑d (стрелка направлена вверх), остальные костюмы не нужны, их можно удалить. 2. Создайте блок в категории Данные и Блоки, в опциях вы- берите Добавить ввод числа, задайте название параметра — n (будет отвечать за угол поворота). 3. Соберите скрипты по рис. 4.7 (но со своими значениями, полученными в ходе калибровки!). Больше возможностей. Используем сервомотор и гироскоп 115
Рис. 4.7. Скрипт-­описание блока myServo и пять базовых блоков для поворота Обратите внимание: чтобы указывать значение в градусах, мы используем деление на 180, причём вводить надо именно 180.0 вместо просто 180. Причина, как уже ранее объяснялось, в особенностях используемой в блоке операции деления. Например, если вбить целые 60/180, то получим не одну треть, а ноль, поскольку оба числа целые. А если хоть один из аргументов — с плавающей точкой, всё будет в порядке. Примечание В ряде случаев можно ограничить диапазон поворота вала сервомотора. Например, ограничить угол 120 градусами, тогда среднее положение (при 0.5 в блоке) будет 60 градусов (угол можно измерить транспортиром). В этом случае потребуется внести очевидные . изменения в скрипт Ещё одно важное замечание: в интерактивном и автономном режимах подобранные значения могут слегка различаться. Библиотеки, используемые программным обеспечением в этих случаях, могут быть различных версий и работать будут немного по-разному. Более того, одна и та же библиотека на разных пинах подключения сервомотора будет вести себя немного по-разному. Этап 2. Блок управления сервомотором: автономный режим в автономном режиме управПроверим, как отработает блок ления. Заодно убедимся в необходимости коррекции значений, полученных при калибровке того же сервомотора в режиме интерактивного управления. 116 Глава 4
В результате работы программы робот должен поворачивать голову чётко вправо, по центру, чётко влево. 1. Соберите скрипты по рис. 4.8, изменив предыдущий проект или подгрузив сохранённый спрайт с нужным блоком управления сервомотором. 2. Перейдите в режим Arduino mode и загрузите программу в память робота. 3. Отсоедините робота от компьютера, запустите программу на выполнение, нажав кнопку на контроллере. 4. Проверьте поведение робота, при необходимости немного скорректируйте значения в блоке. Посмотрите, как отличаются значения в блоке на 4.7 и 4.8. Это значения для одного и того же сервопривода, с которым мы проводили эксперимент, но в интерактивном и автономных режимах, когда за работу с сервоприводом отвечают разные программные библиотеки. Рис. 4.8. Скрипты проекта «Калибровка» для автономного режима Примечания по итогам проекта В целом можно сказать, что библиотека управления сервоприводами — один из самых сложных в реализации и капризных в настройке компонентов. Это проявляется, например, в том, что при использовании в проектах с Arduino других версий библиотеки (даже более Больше возможностей. Используем сервомотор и гироскоп 117
новых) может не работать сервомотор, если на плате он подключен к первому или второму джеку. В нашем расширении simpleBot специально для снижения сложности процессов работы с сервомоторами создан блок , и вы уже попробовали откалибровать сервомотор с его помощью. Но если взять другого робота или другую среду программирования, никакого блока там, скорее всего, не будет. В книге «Игровая робототехника для юных программистов и конструкторов: mBot и mBlock» (БХВ-Петербург, 2019) мы давали подробную инструкцию для самостоятельного создания подобного блока в среде mBlock. При необходимости ознакомьтесь со скриптами и инструкциями, приведёнными в приложении к книге и на сайте издательства «БХВ-Петербург». Проект 16. «Локатор на посадочном модуле» Введение в проект Представьте себе настоящую экспедицию на планету Марс. Вперёд выпускают специальный посадочный модуль, планетоход с локатором. Задача планетохода — осмотреться на местности и построить понятную для оператора-­ человека картинку препятствий, которые там имеются. А далее люди примут решение, подходит ли им этот район для посадки. При необходимости робот-­ планетоход может проехать некоторое расстояние, отыскивая ровную площадку. И желательно не наткнуться на препятствия, будь то огромная скала или торчащий из почвы тонкий металлический штырь, оставшийся от предыдущих экспедиций. Одного ультразвукового дальномера тут будет явно мало… В этом проекте мы задействуем ещё один сенсор, которым снабжён наш робот. Это инфракрасный дальномер (рис. 4.9). Он имеет свои преимущества и недостатки по сравнению с ультразвуковым дальномером, и заменить один другим не получится, лучше использовать их комбинацию. Подробнее об устройстве и принципе действия инфракрасного дальномера вы можете почитать на профильных сайтах, например здесь: https://3d-diy.ru/wiki/arduino-­ datchiki/infrakrasnyj-­datchik-rasstojanija/. 118 Глава 4
Рис. 4.9. Инфракрасный дальномер Sharp Работаем в интерактивном режиме, так проще отладить программу. Приступаем к работе Этап 1. Что показывают дальномеры? , созданный В проекте используем в качестве основы блок в прошлый раз. Для простоты пока будем использовать инфракрасный дальномер лишь для обнаружения наличия препятствия и определения его правой и левой границ. Для этого потребуется выяснить, какое значение сенсора можно использовать как признак наличия препятствия. Заодно посмотрим, какие значения передают наши дальномеры: и инфракрасный, и ультразвуковой, — а также особенности их «ви ́дения» различных препятствий. Это необходимо для понимания, как мы будем использовать эти показания для работы марсианского локатора. 1. Запустите среду mBlock. Настройте соединение с роботом, подготовьте робота для работы в интерактивном режиме управления. 2. Загрузите сохранённый проект, содержащий настроенный для вашего . робота блок 3. Проверьте, чтобы на сцене стрелка (спрайт Arrow1) в начальном положении была развернута вверх, выберите соответствующий костюм спрайта. 4. На последующих этапах стрелка на сцене будет поворачиваться, хорошо бы сделать так, чтобы при выборе угла поворота и голова робота, и стрелка-­спрайт поворачивались в одну сторону. Подкорректируйте Больше возможностей. Используем сервомотор и гироскоп 119
блок и добейтесь того, чтобы при значении 0 голова становилась в положение прямо, при 90 — строго направо. Пример корректировки (надо поправить формулу вычисления угла поворота в градусах) можно подсмотреть на рис. 4.10. 5. Поверните голову прямо. 6. Соберите скрипты по рис. 4.10 (для наглядности на рисунке показана и часть сцены). Рис. 4.10. Набор скриптов проекта «Локатор на посадочном модуле». Выясняем значения сенсоров 7. Запустите проект на выполнение, посмотрите на изменения значений инфракрасного и ультразвукового дальномеров. 8. Попробуйте поставить перед роботом различные предметы в качестве препятствий, оптимально использовать круглую банку или цилиндр из непрозрачного пластика или плотного картона. Изменяйте расстояния от предмета и его расположение. Примечание Обратите внимание, что ультразвуковой дальномер показывает расстояние до препятствия, даже когда оно чуть сбоку, а луч инфракрасного дальномера на препятствие не попадает. 9. Выберите желаемую максимальную дальность работы нашего локатора (ориентируйтесь на удобное для экспериментов пространство, ориентировочно 40 см), поставьте на этом расстоянии предмет и запомните граничное значение показаний инфракрасного дальномера на этом расстоянии. У нас получилось: если значение ИК_сенсор больше 120, это означает обнаружение препятствия. 120 Глава 4
10. Добавьте в проект скрипт с рис. 4.11, используя полученное для вашего робота граничное значение обнаружения препятствия. Теперь, при обнаружении препятствия, стрелка на экране будет увеличиваться в размере. 11. Попробуйте использовать в качестве препятствия обычный карандаш (или ручку), пронося его перед роботом на различных расстояниях. Последите за показаниями сенсоров. Смог бы робот обнаружить тонкий предмет, имея только ультразвуковой датчик? Рис. 4.11. Добавляем скрипт масштабирования спрайта при обнаружении препятствия Примечание Луч инфракрасного дальномера выходит не строго перпендикулярно плоскости крепления датчика. Может потребоваться корректировка положения, особенно если сенсор расположен горизонтально. В этом случае добиться того, чтобы робот обнаруживал тонкое (карандаш) препятствие, находящееся строго впереди, можно, добавляя с одной из сторон крепления обычные шайбы. Намного меньше проблем при вертикальном расположении инфракрасного дальномера (рис. 4.12), но не всегда размеры ультразвукового датчика позволяют его так расположить. Рис. 4.12. Вертикальное расположение инфракрасного дальномера Больше возможностей. Используем сервомотор и гироскоп 121
Этап 2. Крутим головой, сканируем пространство Теперь, когда мы знаем показания сенсоров при обнаружении препятствия, нам требуется реализовать одну из главных функций локатора — автоматическое сканирование пространства и обнаружение препятствий. Для этого обеспечим повороты головы робота слева направо, поставив её сначала в крайнее левое положение, а затем поворачивая на 1° в нужную сторону. Надо заранее учесть, что после команды перемещения в крайнее левое положение следует чуть подождать, так как голова робота поворачивается не мгновенно. Дальше голова будет успевать перемещаться градус за градусом вслед за стрелкой. Скорость прокрутки цикла сканирования невелика и естественным образом ограничена скоростью чтения показаний сенсоров в интерактивном режиме (в автономном надо будет предусмотреть задержку). Стрелка смещена в нижнюю часть сцены, бóльшая часть площади которой нам вскоре понадобится для построения «карты местности». 1. Дополните скрипты предыдущего этапа, ориентируясь на рис. 4.13, создайте требуемые новые блоки. Обратите внимание на блок , проанализируйте, что он делает и для чего может потребоваться. Рис. 4.13. Скрипты проекта «Локатор на посадочном модуле», добавляем поворот головы 122 Глава 4
2. Запустите проект, понаблюдайте, как стрелка на экране и голова робота синхронно поворачиваются и как меняются показания сенсоров. Так, робот уже крутит головой, сканирует местность на предмет препятствий и передаёт нужные значения дальности. Но постоянно следить за ними… и не удобно, и не наглядно. На следующем этапе мы это исправим! Этап 3. Строим радарную картинку Настало время построить на экране компьютера радарную картинку, отметив на ней препятствия, обнаруженные нашим локатором. Пример картинки, полученной в результате выполнения текущего этапа, можно посмотреть на рис. 4.14. Рис. 4.14. Этап 3 проекта «Локатор на посадочном модуле». Радарная картинка В таком варианте информация намного нагляднее, и ею удобнее пользоваться, например, управляющему роботом на расстоянии человеку-­оператору. Для рисования будем использовать блоки из категории Перо. 1. Все скрипты нового этапа показаны на рис. 4.15. Создайте новые блоки и соберите их описания. и испольОбратите внимание — блоки зуют показания и того, и другого сенсора, но делают это по-разному. 2. Запустите программу на исполнение. Понаблюдайте за результатом. Больше возможностей. Используем сервомотор и гироскоп 123
3. В качестве эксперимента можно по очереди отключить один из блоков маркировки. Вы увидите, что инфракрасный дальномер способен точно обозначить направление на малогабаритное препятствие (карандаш), которое не замечает ультразвуковой дальномер. Кроме того, инфракрасный дальномер способен определить наличие пушистой кошки или плоской поверхности, расположенной под углом. Итак, у нас уже есть картинка, по которой видно наличие препятствий и их общее расположение! Но показания инфракрасного дальномера представлены в ­каких-то непонятных единицах, не очень удобных в использовании. Хорошо бы получить их в привычных сантиметрах. Однако преобразование аналоговых показаний в стандартные метрические значения — отдельная задача, которую мы рассмотрим несколько позже. Рис. 4.15. Полный набор скриптов проекта «Локатор на посадочном модуле» 124 Глава 4
Примечание Радарную картинку можно было бы нарисовать и иным способом, например создав специальное приложение (в среде Processing либо с использованием программирования на Python, Паскале и прочих языках), которое получает от робота сырые данные по последовательному порту и обрабатывает их. Но в среде Scratch/mBlock это сделать несравненно проще. Проект 17. «Парковка» В интерактивном режиме мы поработали. Теперь попробуем использовать полученные навыки для программирования работы робота-­локатора в автономном варианте. Введение в проект Наш планетоход готовится к изучению обнаруженных объектов. Проблема в том, что ему пока сложно координировать повороты головы и корпуса. Наш робот ещё не способен поворачиваться на строго определённый угол, мы не научились пользоваться гироскопом или вращать колёсами с оглядкой на показания энкодеров (даже если в будущем мы и оснастим ими наш робонабор). Но попробуем выкрутиться. Решаем следующую задачу — по нажатию на кнопку робот должен просканировать пространство перед собой, подъехать вплотную к ближайшему обнаруженному подходящему объекту и сфотографировать его (условно, так как модуля фотокамеры у нас в наборе нет). Подходящими объектами будем считать те, которые определяются и инфракрасным, и ультразвуковым сенсором. Предполагаем, что вблизи могут оказаться максимум два объекта (в нашем эксперименте кружка, консервная банка), один левее, другой правее продольной оси робота, на разных расстояниях от робота, остальное пространство свободно от объектов. Приступаем к работе Этап 1. Определяем ближайший объект На этом этапе робот-­планетоход сканирует пространство, и если объект обнаружен, поворачивает в его направлении голову и зажигает зелёный свет. При Больше возможностей. Используем сервомотор и гироскоп 125
отсутствии объекта сигналит красным. Если объектов несколько — выбирается ближайший. 1. Откройте среду mBlock. 2. Познакомьтесь со скриптами проекта на рис. 4.16. Определитесь, удобно ли будет использовать в качестве основы предыдущий проект или (напроще использовать лишь вашу библиотеку с блоком стройки для автономного режима). 3. Создайте нужные переменные и новые блоки. 4. Соберите скрипты по рис. 4.16. При проблемах можно загрузить файл проекта из электронного архива, но потребуется изменить настройки под вашего робота. Рис. 4.16. Скрипты проекта «Парковка». Определяем ближний предмет 5. Сохраните проект в личную папку проектов (давно не напоминали). Проекты становятся всё сложнее, лучше каждый этап сохранять под разным 126 Глава 4
названием, чтобы можно было воспользоваться этим файлом на последующих этапах. 6. Перейдите в режим Arduino mode и загрузите программу в память робота. 7. Отсоедините робота от компьютера, запустите программу на выполнение, нажав кнопку на контроллере. 8. Проверьте, как ведёт себя робот при различных положениях предметов-­ препятствий. Этап 2. Фиксируем цель Теперь, после успешного поиска, робот дополнительно уточнит правую и левую границы объекта, а потом обозначит их, троекратно поворачивая голову влево-­вправо. Рис. 4.17. Скрипты проекта «Парковка». Фиксация цели Больше возможностей. Используем сервомотор и гироскоп 127
1. Познакомьтесь со скриптами проекта на рис. 4.17. Отметьте для себя изменения, сравнивая с программой на этапе 1. Скрипты становятся всё больше, при недостаточной детализации рисунка в книге воспользуйтесь файлом рисунка в электронном архиве. 2. Создайте нужные переменные и новые блоки. 3. Соберите скрипты по рис. 4.17. 4. Сохраните проект. 5. Перейдите в режим Arduino mode и загрузите программу в память робота. 6. Отсоедините робота от компьютера, запустите программу на выполнение, нажав кнопку на контроллере. 7. Проверьте, как ведёт себя робот при различных положениях предметов-­ препятствий. Этап 3. Обнаружил, подъезжаю! Реализация проекта представлена на рис. 4.18. Вы уже набрали достаточно опыта, поэтому мы попробуем сократить объём описаний и комментариев, коснуться всех аспектов и тонкостей у нас не получится. На этом этапе робот-­луноход не обозначает границы, а начинает поворот в сторону объекта. При этом голова повёрнута так, чтобы можно было остановить поворот корпуса, когда снова будет найдена граница объекта. Поэтому фактически поворот происходит до первого объекта слева или справа (в зависимости от направления вращения робота). Дальнейшее движение — просто по прямой, с остановкой по показаниям ультразвукового дальномера. Робот поворачивает голову левее-­правее по ходу движения (4 перемещения в секунду). Когда доезжает до объекта, доворачивается к нему, останавливается, условно «фотографирует» (кстати, мог бы и в действительности сфотографировать, управление затвором фотоаппарата подключить несложно). Можно было бы найденный объект объехать вокруг, приподнять захватом и увезти назад. К­огда-нибудь вы можете реализовать и эти варианты, пока же ограничимся относительно простым — нашёл, подъехал, остановился. Даже в подобном случае проект получается довольно громоздким (см. рис. 4.18), рекомендуем для удобства воспользоваться файлом рисунка из электронного архива, его можно масштабировать. 128 Глава 4
Рис. 4.18. Скрипты проекта «Парковка». Финальный этап Больше возможностей. Используем сервомотор и гироскоп 129
Примечания Робот может сбиться с курса, и пока мы не научились пользоваться гироскопом или энкодерами, предотвратить это сложно. Можно было бы предусмотреть автоматическую коррекцию направления движения, используя показания инфракрасного дальномера и ориентируясь на границу объекта, но это значительно увеличило бы проект, а он у нас не маленький. Проект 18. «Знакомьтесь, это — гироскоп!» Введение в проект В продвинутых роботах часто используются моторы с энкодерами, специальными устройствами, позволяющими учитывать количество оборотов вала мотора и использовать это в программах управления. В нашем роботе стоят обычные моторы, и вы, вероятно, уже сталкивались с тем, что при команде «вперёд» робот может двигаться совсем не по прямой, так как моторы не идеально одинаковые и по-разному крутят колёса. Да и развороты нашего робота можно задавать очень условно, ориентируясь на время работы моторов. Для различных условий (например, слегка сели батареи питания) это будут разные повороты. Всё это очень усложняет жизнь нашего робота. Но мы попробуем её наладить. А поможет в этом очень важный модуль, в который входят гироскоп и акселерометр. Как всегда рекомендуем самостоятельно почитать более подробную информацию об этом модуле в Интернете, например здесь: https://arduinoplus. ru/arduino-­giroskop/. Если кратко, гироскоп — устройство, умеющее определять угол поворота относительно первоначального направления. Наш робот имеет трёхосевой гироскоп с трёхосевым акселерометром, это значит, мы сможем учитывать углы поворотов по трём направлениям (рис. 4.19). Эти направления часто называют крéном (наклон влево-­вправо), тангажем (наклон вперёд-­назад) и рысканьем (вращение вокруг вертикальной оси). Вероятно, вы уже поняли, что применение гироскопа не ограничено наземными роботами, это, по сути, обязательный элемент и для роботов летающих (например, квадрокоптеров), и для плавающих. 130 Глава 4
К­огда-то гироскопы были механическими устройствами, но в данном случае гироскоп — это аппаратно-­программный комплекс на основе микроэлектромеханической системы (МЭМС), который непрерывно и очень точно измеряет скорость вращения (угловую скорость) устройства по каждой из осей и подсчитывает суммарный угол поворота. Рис. 4.19. Трёхосевой гироскоп Акселерометр — прибор, позволяющий измерять ускорение, то есть величину и направление вектора силы тяжести. Это тоже важная информация для ориентации в пространстве. В частности, она позволяет уточнить угол наклона устройства. При каждом включении гироскопа происходит его инициализация (процесс автокалибровки). Процесс занимает мало времени, но чтобы автокалибровка прошла успешно, важно соблюдать следующие требования. • Не рекомендуем сразу привинчивать голову робота центральным шурупом, чтобы её можно было легко снимать и надевать, пробуя различные положения. • Все сервомоторы немного разные, у каждого свои границы подвижности (предел поворота вала сервомотора в одну или другую сторону). Поэтому сначала лучше установить голову так, чтобы правая и левая границы подвижности были максимально далеко и одинаково далеко от центрального положения (голова «смотрит» вперёд). Это положение можно примерно определить даже вручную, осторожно поворачивая голову в разные стороны. • Будьте аккуратны при первых включениях, чрезмерные нагрузка и блокировка подвижной части могут привести к тому, что пластиковые шестерни не выдержат и сломаются. Больше возможностей. Используем сервомотор и гироскоп 131
• При выборе значений углов поворота надо помнить о том, что выбор предельных значений угла поворота в блоке управления сервомотором (0 и 180) может приводить к достижению границы подвижности, поначалу лучше избегать их использования. • Робот должен быть неподвижен. • Робот должен стоять горизонтально (без выраженного наклона). • Напряжение питания должно быть стабильным. Если требования не соблюдены, гироскоп начнёт выдавать неправильные показания. В идеале во всех проектах с использованием гироскопа последовательность действий такова: поставили робота на горизонтальную поверхность, включили, подождали несколько секунд (напряжение питания стабилизируется), нажали кнопку Reset на плате контроллера (перезапустили загруженную в контроллер программу). Обнулять положение и заново инициализировать гироскоп можно нажатием на кнопку Reset контроллера даже прямо во время работы программы в интерактивном режиме. После этого процесс инициализации закончен, гироскоп начинает работать и отслеживать все изменения ориентации робота в пространстве. Примечание Если вы используете контроллер с пластиковой прозрачной защитой, например mCore, кнопка Reset прикрыта от случайных нажатий, но есть отверстие, через которое её можно нажать, используя, например, деревянную зубочистку. Приступаем к работе Этап 1. Смотрим на значения, передаваемые гироскопом Для работы с гироскопом нам потребуются команды из стандартного расширения Makeblock. На первом этапе просто посмотрим, какие значения передает гироскоп при изменении положения робота в пространстве. Работать будем в интерактивном режиме. 1. Добавьте расширение Makeblock в среде mBlock (меню Extensions, поставьте галочку у расширения Makeblock). В категории команд Робот должна появиться ещё одна группа блоков под названием mBot. 132 Глава 4
2. Соедините робота с компьютером, подготовьте робота к управлению в интерактивном режиме. 3. Проведите подготовительную работу для проекта с гироскопом (смотрите введение в проект). 4. Соберите скрипты по образцу на рис. 4.20. Здесь нет необходимости вводить командные блоки, запускать на исполнение и прекращать работу скриптов можно просто щелчками мыши. Рис. 4.20. Скрипты этапа 1. Смотрим на значения, передаваемые гироскопом 5. Запустите первый скрипт (ось x), покрутите робота вокруг оси (ориентируйтесь на рис. 4.19), посмотрите на значения, «проговариваемые» спрайтом. Выключите выполнение (ещё раз щёлкните мышью по скрипту). 6. По аналогии повторите действия с осями y и x. Для чистоты эксперимента не забывайте отключать остальные скрипты, работать должен только один. Этап 2. Применяем гироскоп для управления виртуальным персонажем На этом этапе попробуем применить получаемые от гироскопа значения поворотов по осям для управления. Пока что будем управлять виртуальным персонажем, например стрелкой. Пусть стрелка поворачивается на некоторый угол при повороте робота. Единственно, стрелка у нас на плоскости, вращаться в трёхмерном пространстве она не сможет. Ну и не надо, мы просто понаблюдаем за её поворотами при выборе различных осей. Впоследствии мы сможем использовать ­какую-то одну ось для создания «пульта управления» поворотом персонажа в игре, а повороты относительно другой оси — для управления скоростью, например. 1. Если вы выключали робота, проведите подготовительную работу для проекта с гироскопом. Больше возможностей. Используем сервомотор и гироскоп 133
2. Удалите спрайт Панды и добавьте в проект спрайт Arrow1 из библиотеки спрайтов. 3. Соберите скрипты по образцу на рис. 4.21. Рис. 4.21. Скрипты этапа 2, используем значения, передаваемые гироскопом 4. По аналогии с этапом 1 попробуйте управлять стрелкой на сцене, поворачивая робота относительно выбранной оси. Если всё получается, замечательно! Теперь мы можем использовать приобретённые знания для создания игры, в которой робот выполнит функцию продвинутого пульта управления. Проект 19. «Звёздные гонки!» Создавать игры с участием виртуальных персонажей — довольно увлекательный процесс. Уже в первых проектах книги вы объединили возможности виртуальных персонажей и нашего робота. А сейчас мы предлагаем создать по-настоящему продвинутую игру, в которой робот превратится в пульт управления, позволяющий контролировать космический корабль, несущийся вперёд и уклоняющийся от встречных препятствий (рис. 4.22). В целом процесс создания игр заслуживает отдельной книги, здесь мы не сможем подробно остановиться на различных стадиях создания спрайтов и отладки игрового процесса. Если вас заинтересует эта тема, рекомендуем скачать наше пособие «Дизайн компьютерных игр» и электронный архив к нему. Там представлено много игровых проектов и детально расписано их создание. Пособие можно найти на сайте lab169.ru или загрузить со страницы проекта по короткой ссылке https://clck.ru/V7YN4. 134 Глава 4
Рис. 4.22. Проект «Звёздные гонки» 1. Откройте среду mBlock. 2. Удалите спрайт Панды. 3. Добавьте сцене фон rays из библиотеки, чтобы создать впечатление звёздного туннеля при движении корабля. Да, так же как и костюмы для спрайтов, для сцены можно изменять фон. Надо щёлкнуть по значку сцены, далее методика та же — нажмите соответствующую кнопку (рис. 4.23) и выберите фон из библиотеки. Рис. 4.23. Выбор фона из библиотеки 4. Создайте переменные ШТРАФ и СЧЁТ (буквы заглавные, Ё, а не Е). Обратите внимание, переменные получаются глобальными для всех спрайтов. 5. Теперь надо создать спрайт космического корабля — UFO. Для ускорения процесса можно воспользоваться готовым рисунком из электронного Больше возможностей. Используем сервомотор и гироскоп 135
архива проекта. Нажмите кнопку Загрузить спрайт из файла, выберите рисунок UFO.svg, получится спрайт UFO. Как альтернатива — можете нарисовать свой корабль (никто не мешает и дорисовать несколько костюмов-­кораблей и менять их во время игровых ситуаций). Учтите, если рисуете корабль сами, надо проверить центрироУстановите костюм в правом верхнем вание объекта (инструмент углу поля рисования). Примерный вид, размер корабля и центрирование показаны на рис. 4.24 (при выбранном масштабе рисования 100%). Рис. 4.24. Спрайт космического корабля UFO 6. Создайте для этого спрайта скрипты по образцу на рис. 4.25. Рис. 4.25. Скрипты для спрайта UFO 136 Глава 4
7. Соедините робота с компьютером, подготовьте робота к управлению в интерактивном режиме. 8. Проведите подготовку робота к использованию гироскопа. 9. Запустите программу на выполнение, попробуйте управлять кораблём, держа робота в руках и наклоняя его из стороны в сторону. 10. Теперь нужны звёзды, от которых будем уклоняться. Добавьте готовый спрайт, содержащий все необходимые скрипты, из файла Starfish. sprite2 в электронном архиве. 11. Проверьте готовую игру. Удачного полёта! Познакомьтесь со скриптами спрайта Starfish, вы уже вполне способны самостоятельно разобраться в их работе. Попробуйте внести изменения в игру, улучшающие игровой процесс. Примечание Реальные показания гироскопа практически никогда не равны абсолютному нулю. При плохом соединении (некачественный кабель, например) могут временами получаться значения, равные нулю. Это признак того, что произошла временная потеря соединения. Скрипт пре­ду­ преждает скачки в ориентации летающей тарелки в подобных случаях. Больше возможностей. Используем сервомотор и гироскоп 137
«Всё чудесатее и чудесатее!» В этой главе мы предложим довольно сложные и объёмные проекты, описать все стадии создания и особенности программирования которых в небольшой книге невозможно. Но зато их можно загрузить, посмотреть в действии, разобраться (с нашей помощью) с основными элементами и использованными приёмами. В робототехнике вообще много сложных и интересных тем, к которым можно периодически возвращаться по мере взросления. Пример — регуляторы. Вы пробовали пройти по бревну или по натянутому канату? И как при этом работало всё ваше тело, как махали руками, сохраняя равновесие, помните? И как, чуть больше махнув рукой, тут же качались в противоположенную сторону и падали, теряя равновесие… А как научить балансирующего робота сохранять равновесие на двух колёсах или снизить «рыскание» несущейся по линии спортивной модификации? Как научить квадрокоптер зависать в одной точке пространства и сохранять это положение? Как обучить автопилот спасательного вертолёта держать расстояние до поверхности гор, в которых он проводит поисково-­спасательную операцию? Вот для решения подобных задач люди и придумали специальные алгоритмы — регуляторы, работу которых мы продемонстрируем в виртуальном мире mBlock и применим к вполне реальным задачам нашего робота. На первых порах можно просто посмотреть, как это работает. Потом — попробовать применить на практике, но уже в своих проектах, готовые решения из книги. А дальше — можно возвращаться к этим проектам, уже будучи студентом технического вуза, и улучшать наши алгоритмы, создавать свои решения. 138 Глава 1
Проект 20. «Квадрокоптер на солнечных батареях» Введение в проект В этом проекте мы предлагаем вам познакомиться с имитационным моделированием. При использовании этого метода исследования некоторая изучаемая система заменяется моделью, которая с достаточной точностью описывает реальную систему. И уже с этой моделью проводятся эксперименты с целью получения информации о моделируемой системе. Сложно? Вероятно, проще продемонстрировать на примере: мы будем моделировать поведение квадрокоптера, моторы которого работают от солнечных батарей, выдающих разное напряжение при разной освещённости (рис. 5.1). Если сумрачно, то вольтаж батарей падает, и моторам приходится работать почти на полной мощности, чтобы удержать летательный аппарат на прежней высоте. Если света много, необходимо снизить мощность двигателей, чтобы квадрокоптер не взмывал вверх. Рис. 5.1. Проект «Квадрокоптер на солнечных батареях» «Всё чудесатее и чудесатее!» 139
Для автоматического управления в робототехнике применяют специальные алгоритмы — регуляторы. Регулятор следит за изменением к­ акой-либо величины (например, высоты) и для достижения заданного значения вводит некое управляющее воздействие. В данном конкретном проекте мы познакомимся с одним из видов таких автоматических регуляторов — пропорциональным. Это простой в использовании, но не самый совершенный регулятор. Вы сможете убедиться, что наш летательный аппарат будет выдерживать нужную высоту не слишком уж точно. Проект работает в интерактивном режиме. Приступаем к работе Этап 1. Моделируем освещённость На этом этапе смоделируем освещённость неба, запрограммировав изменение цвета фона на основании показаний датчика освещённости контроллера робота. Для фона сцены используем файл тёмно-­серый.png из электронного архива проекта. Скрипты, представленные на рис. 5.2, собираем прямо для сцены. Потребуются переменные освещённость и сенсор. Рис. 5.2. Скрипты для сцены проекта «Квадрокоптер на солнечных батареях» 1. Запустите программу на выполнение. Проверьте, меняется ли цвет фона при изменении освещённости (прикройте светодиод на контроллере рукой, отодвиньте ладонь). 2. В скрипт встроена проверка соединения робота с компьютером. Вы узнали метод? 140 Глава 5
Этап 2. Добавляем визуальный указатель высоты (автоматический режим полёта) 1. Добавьте спрайт Указатель_высоты из файла Указатель_высоты.png. 2. Создайте новую переменную целевая_высота. 3. Соберите скрипты для спрайта Указатель_высоты по рис. 5.3. Рис. 5.3. Скрипты для спрайта Указатель_высоты (автоматический режим полёта) 4. Проверьте работу скриптов. Если щёлкнуть по спрайту Указатель_высоты на сцене после запуска проекта, он должен перемещаться вверхвниз вслед за курсором мыши. Этап 3. Добавляем ручку газа (ручной режим полёта) 1. Добавьте спрайт ручка_газа из файла ручка_газа.png. 2. Создайте переменную автопилот и и два новых блока — с параметром мощ (мощность). 3. Соберите скрипты для спрайта ручка_газа по рис. 5.4. Описание блока пока оставим пустым, оно нам понадобится для реализации автопилота на следующем этапе. 4. Проверьте работу скриптов. После запуска индикатор газа должен изменяться при движении курсора мыши вверх-вниз. «Всё чудесатее и чудесатее!» 141
Рис. 5.4. Скрипты для спрайта ручка_газа (ручной режим полёта) Итак, мы обеспечили возможность выбора двух режимов управления квадрокоптером — ручного и автоматического. Однако блок пока пуст. Да и самого квадрокоптера пока нет. Этап 4. Моделируем квадрокоптер 1. Добавьте спрайт квадрокоптер из файла квадрокоптер.png. 2. Добавьте нужные переменные и блоки, соберите скрипты по рис. 5.5. Действует ручное управление. Важно! Считаем значение переменной _верт_скорость конфиденциальной информацией, недоступной другим спрайтам (эта переменная должна быть локальной). Зачем? Чтобы научиться измерять эту самую вертикальную скорость самостоятельно (см. след. проект). 3. Проверьте работу скриптов. После запуска вы можете вручную управлять квадрокоптером, перемещая курсор мыши по сцене. 142 Глава 5
Будьте внимательны при сборке скриптов, важно соблюсти правильный порядок вычислений. При необходимости можно воспользоваться готовым файлом этапа из электронного архива. Рис. 5.5. Скрипты для спрайта квадрокоптер (ручной режим полёта) Этап 5. Моделируем автопилот на основе пропорционального регулятора 1. Вернитесь к спрайту ручка_газа и добавьте описание блока . Новые переменные и описание блока — на рис. 5.6. Рис. 5.6. Реализуем автопилот с использованием пропорционального регулятора «Всё чудесатее и чудесатее!» 143
2. Запустите проект на выполнение, проверьте работу. Сначала управляйте полётом модели «вручную», потом попробуйте включить автопилот (щёлкните по спрайту Указатель_высоты на сцене; меняя стрелку указателя, понаблюдайте, как квадрокоптер старается выйти на целевую высоту). Проверьте работу автопилота при переменном освещении. Обратите внимание, что при работающем автопилоте и при освещённости выше 50 процентов квадрокоптер зависает на большей высоте, чем целевая, при освещённости ниже 50 процентов — на меньшей. Это прямое следствие лаконичности алгоритма. Чтобы существовало управляющее воздействие, должна существовать ошибка. Если мы хотим избавиться от этой ошибки, нам необходимо добавить более сложное, интегральное регулирование. Если хотим, чтобы колебания затухали как можно быстрее, — дифференциальное. Кстати, если коэффициент пропорционального регулирования слишком большой, колебания не только не затухают, но становятся ещё больше. По сути, пропорциональное регулирование превращается в релейное, как следствие — возникают автоколебания. Проект 21. «Спасательный вертолётик» Введение в проект Спасательный вертолётик спешит на помощь потерявшейся в горах группе туристов. Для обнаружения пострадавших требуется лететь на небольшой высоте и внимательно осматривать местность. Но даже искусство пилота не всегда позволяет осуществить такой полёт в сложных горных условиях (рис. 5.7). Нужен продвинутый автопилот! Приступим. Рис. 5.7. Проект «Спасательный вертолётик» 144 Глава 5
Проект является ознакомительным, нам хотелось бы показать возможности имитационного моделирования и продемонстрировать особенности работы различных видов регуляторов. Мы будем использовать готовые файлы из электронного архива. Датчики робота задействовать не будем, для знакомства с проектом необходимы лишь компьютер и среда mBlock. Приступаем к работе Этап 1. Пилотируем вручную Проверим, насколько сложно управлять вертолётом вручную. При этом вновь используем имитационное моделирование, учитывающее особенности поведения настоящего вертолёта в воздухе. 1. Запустите в среде mBlock файл Спасательный_вертолётик_этап_1_ (задание).sb2 из электронного архива. 2. По умолчанию активировано ручное управление, автопилота ещё нет. Попробуйте управлять движением вертолёта, смещая курсор (ручку газа) вверх-вниз по сцене. Обратите внимание на модельную визуализацию измерения расстояния от вертолёта до поверхности земли (спрайт эхо). Попробуйте лететь на небольшой высоте. 3. Можете поменять параметры инерция и коэффициент аэродинамического сопротивления (в том числе прямо во время работы программы) и посмотреть, как ведёт себя модель при различных значениях. Но далее в книге мы будем опираться на уже выбранные параметры физической модели, поэтому верните первоначальные значения для работы на следующем этапе (рис. 5.8). Рис. 5.8. Параметры физической модели «Всё чудесатее и чудесатее!» 145
Этап 2. СпасЁт ли нас пропорциональный регулятор? В предыдущем проекте мы уже использовали автопилот на основе пропорционального регулятора. Попробуем применить тот же метод и для создания автопилота вертолёта. 1. Запустите файл Спасательный_вертолётик_этап_2.sb2 из электронного архива. Найдите блок автопилота, ознакомьтесь со скриптом, обеспечивающим пропорциональное регулирование (рис. 5.9). 2. Для удобства при запуске сразу активируется автопилот. При целевой дистанции 125 вертолёт ухитряется хоть к­ ак-то не врезаться в препятствия. Но попробуйте поставить целевую дистанцию до рельефа 50, посмотрите на полёт. На этой дистанции вертолёт постоянно врезается в поверхность. Хорошо, что мы не летим на этом вертолёте. Рис. 5.9. Блок РЕГУЛЯТОР, этап 2 Да, всё что мог дать пропорциональный регулятор, мы использовали, и результат оставляет желать лучшего. Пора переходить к более сложным вариантам. Этап 3. «Великий и ужасный» дифференциальный регулятор Если посмотреть Википедию и найти статью про дифференциальный регулятор, мы прочитаем, что «дифференцирующая составляющая пропорциональна темпу изменения отклонения регулируемой величины и предназначена для противодействия отклонениям от целевого значения, которые прогнозируются в будущем». Звучит непонятно. Если там же посмотреть на формулы, всё становится ещё туманнее. Но если попробовать выделить главное, смысл, то окажется, что управляющее воздействие в дифференциальном регуляторе зависит не от ошибки значения, а от скорости изменения значения. Ключевое слово — скорость. Предназначение дифференциального регулятора — минимизировать скорость изменения регулируемой величины. Если скорость изменения величины сделать равной нулю, будет сохраняться сама величина. Попробуем показать, как это выглядит на практике. 146 Глава 5
Вернемся к нашему вертолётику, ему всё ещё нужен надежный автопилот. 1. Запустите файл Спасательный_вертолётик_этап_3.sb2 из электронного архива. 2. Посмотрите, как изменился блок автопилота, постарайтесь проанализировать работу скриптов, отвечающих за дифференциальное регулирование (рис. 5.10). Рис. 5.10. Блок РЕГУЛЯТОР, этап 3 Вся сложность использования дифференциального регулятора объясняется исключительно сложностью вычисления скорости изменения нужной величины. В данном случае нам нужно знать не саму дистанцию до рельефа, а скорость, с которой мы к нему приближаемся или удаляемся. К счастью, в проекте уже реализовано вычисление скорости сближения с рельефом в спрайте эхо, имитирующем работу локатора. Остаётся использовать её в скрипте. 1. Запустите программу на выполнение, посмотрите, как летит вертолётик с подобранным нами коэффициентом дифференциального регулирования 2.5. Менять высоту полёта можно, просто перетаскивая вертолётик курсором мыши. Попробуйте изменить коэффициент, возможно, вы подберёте более удачное значение. 2. Внимательно изучите скрипт. Коэффициент пропорционального регулирования остаётся выставленным в 10, но это ни на что не влияет. И самое главное, ни на что не влияет выставленная в 125 целевая дистанция. Вертолётик просто стремится оставаться на той же относительной высоте, на которой находился, то есть просто не менять высоту, и в результате огибает рельеф. Вертолётик можно передвинуть вручную, на любую произвольную высоту, и он будет пытаться её сохранять. Правда, небольшой случайный дрейф высоты ­всё-таки всё время происходит. В результате вертолётик может «сползти» до почти нулевой высоты и столкнуться с рельефом. «Всё чудесатее и чудесатее!» 147
Да, результат интересный и многообещающий, но и данный вариант автопилота не решает всех задач… А если объединить два регулятора и использовать достоинства обоих? Этап 4. Объединяем возможности пропорционального и дифференциального регулирования 1. Запустите файл Спасательный_вертолётик_этап_4.sb2 из электронного архива. Изучите скрипты (рис. 5.11). 2. Коэффициент пропорционального регулирования теперь можно выставить гораздо более скромный. Главное, чтобы вертолётик не сползал со временем на ошибочную высоту. Теперь он может лететь низко над рельефом с целевой дистанцией, выставленной в 50! Рис. 5.11. Блок РЕГУЛЯТОР, этап 4 Что ж, у нас почти получилось. И всё же следует отметить, что вертолётик слишком резво реагирует на перегибы рельефа. Можно сказать, это «экстремальный» режим полёта, который плохо подходит для перевозки пассажиров и пострадавших. Исправить положение может добавка ещё одного регулятора с очередным «страшным» названием — интегральный. И будет у нас полноценный ПИДрегулятор (пропорциональный + интегральный + дифференциальный) в автопилоте. Этап 5. Автопилот. Добавляем интегральное регулирование Запустите файл Спасательный_вертолётик_этап_4.sb2 из электронного архива. Посмотрите на изменения в скриптах и в поведении вертолётика (рис. 5.12). 148 Глава 5
Рис. 5.12. Блок РЕГУЛЯТОР, этап 5 В этом варианте можно слегка уменьшить другие коэффициенты регулирования. В результате траектория вертолётика становится более плавной, а реакция на перегибы более мягкой и чуть запоздалой. Но нам пришлось немного увеличить дистанцию до рельефа. Следует признаться, что характер нашего проекта не особо позволяет продемонстрировать достоинства интегрального регулирования, здесь без него вполне можно обойтись. Однако в других случаях польза была бы налицо. Например, если бы вертолётик летел не над гористой местностью с резкими складками рельефа, а над округлыми холмами с мягкими формами. Другой пример — если бы требовалось избавить пилота от необходимости всё время толкать штурвал от себя или, наоборот, тянуть на себя, когда самолёт не летит горизонтально при нейтральном положении штурвала. Особо следует отметить, что интегральным регулированием необходимо пользоваться очень аккуратно. При незначительно завышенном коэффициенте начинаются размашистые автоколебания. Полезно ограничивать величину интегрального управляющего воздействия, чтобы оно не имело возможности расти бесконечно. Примечание Несколько слов относительно измерения скорости. В некоторых случаях (в имитационном моделировании) скорость нам известна заранее, поскольку является частью физической модели. Но ис­пользовать заранее известное значение — всё равно, что заглядывать в ответ, решая головоломку (теряется сам смысл «Всё чудесатее и чудесатее!» 149
имитационного моделирования). В некоторых случаях физический прибор измеряет непосредственно скорость (угловую или линейную), и нам повезло. Например, спидометр автомобиля или электронный гироскоп (который измеряет именно угловые скорости, а все остальные показатели — результат вычислений). Но очень во многих случаях скорость приходится вычислять самостоятельно, путём периодической проверки измеряемой величины. Например, в предыдущий проект можно добавить спрайт вариометр (см. электронный архив проекта), который именно этим и занимается (рис. 5.13). Если взглянуть на скрипт, в него встроена защита от деления на ноль. Мало ли что, программа может и зависнуть (попытка деления на ноль — одна из распространённых причин сбоев). Теперь у пытливых умов есть возможность поэкспериментировать с предыдущим проектом и реализовать для квадрокоптера ПИД-регулирование. Кстати, почему показания скорости немного скачут? Погрешности при измерении положения. Сенсорный блок возвращает лишь целые значения, без десятичных, и значение скорости мы получаем с некоторым запозданием, с «плавающей» периодичностью. Всё как в жизни. Рис. 5.13. Скрипт спрайта вариометр 150 Глава 5
Проект 22. «Сохраняем верный курс» Введение в проект В этом проекте мы ещё раз проверим работу различных видов регулирования, но уже не на виртуальной модели, а на реальном роботе. Не удивляйтесь, если на отдельные этапы проекта потребуется много времени, приходится проводить множество пробных запусков и перезагрузок скетчей с разными параметрами. Кроме того, не страшно, если материал покажется вам очень уж сложным для понимания. Можно двинуться дальше и вернуться к содержанию этого проекта тогда, когда возникнет необходимость. Для начала определим задачу. Мы хотим добиться того, чтобы робот, действующий в автономном режиме, после нажатия на кнопку начал двигаться по прямой до тех пор, пока кнопка не будет нажата снова (как вариант — пока не обнаружит перед собой препятствие). Во время движения робот должен сопротивляться любым попыткам сбить его с курса. Для удобства отладки во время каждого этапа, кроме заключительного, робот будет оставаться на месте и просто разворачиваться при попытке изменить его положение (переменную м_лин мы приравниваем нулю; это компонента мощности, обеспечивающая перемещение вперёд). Но в любой момент вы можете откорректировать значение переменной и проверить, насколько эффективно робот сохраняет верное направление во время поступательного движения. Примечание Несколько слов про стабильность работы программ этой серии проектов. Гироскоп — это отдельный электронный компонент, и микроконтроллер получает от него информацию по каналу связи, весьма чувствительному к возможным скачкам напряжения. На аппаратных платформах с достаточным «запасом прочности» (в первую очередь в отношении стабильности электропитания) проекты работают без особых проблем, разве что требуется иногда ещё раз нажать на кнопку Reset, если инициализация гироскопа с первого раза не удалась, и программа не запустилась. Но на некоторых платформах контроллеры могут «виснуть» при одновременной работе сервомотора и тяговых двигателей, а также при подключении энергоёмкой периферии. Например, мы выяснили, что «Всё чудесатее и чудесатее!» 151
на робоплатформах с контроллером Lafvin требуется отключать инфракрасный дальномер для повышения стабильности! Ну и конечно же, всегда стоит следить за качеством источника питания. При подвисаниях можно также снижать мощность работы двигателей. Используемые в переменных сокращения: кП — коэффициент регулирования пропорциональный, увД — дифференциальная составляющая управляющего воздействия и так далее. Догадаться, что имеется в виду, не очень сложно, если вы начали серьёзно углубляться в тему регуляторов и разбираться в используемой в ней терминологии. Приступаем к работе Предварительный, пробный этап. Проверяем работу гироскопа В проекте робот должен держать курс следования. Чтобы начать проект, потребуется проверить, какие значения и в каком формате возвращают блоки работы с гироскопом, а для этого в mBlock надо установить авторское расширение Tiny_MPU_6050, созданное на базе открытой Arduino-­библиотеки TinyMPU6050. Данные робот будет транслировать по последовательному порту. 1. Откройте среду mBlock. 2. Установите в менеджере расширение Tiny_MPU_6050 (если забыли, как это делается, посмотрите на рис. 1.9). Убедитесь, что в категории Робот появилась новая группа команд. 3. Соберите скрипт программы по рис. 5.14. Рис. 5.14. Пробный этап. Скрипт с использованием блока ждать 152 Глава 5
4. Наладьте соединение с роботом, перейдите в режим Arduino mode и загрузите программу в память робота. 5. Вновь наладьте соединение с роботом, чтобы иметь возможность принимать данные по последовательному порту. 6. В режиме Arduino mode, справа внизу, в терминальном блоке настройте режим char mode. 7. Поворачивая корпус робота, понаблюдайте за числами, показывающими поворот гироскопа (см. рис. 5.14, справа). При повороте робота направо значения угла положительные, налево — отрицательные (чем сильнее поворот, тем больше по абсолютному значению). Приведённый скрипт очень простой, и на первый взгляд, вполне для нас подходящий. Но при создании проектов, использующих значения временных́ интервалов, следует избегать необоснованных задержек при выполнении программы. Запрос показаний электронного гироскопа с перерасчётом значений должен осуществляться хотя бы несколько десятков раз в секунду (а лучше чаще), иначе вычисления недостаточно точны. Поэтому придётся научиться периодически выполнять некоторые действия без задержки прокрутки основного цикла. Правильнее будет опираться на иной, более сложный вариант программы. Этап 1. Читаем показания гироскопа, избегая задержек 1. Повторите действия предварительного этапа, но скрипт измените по образцу на рис. 5.15, используя две новые переменные. Рис. 5.15. Скрипт для получения данных с гироскопа («текущий курс») «Всё чудесатее и чудесатее!» 153
2. Убедитесь, что в окне терминального клиента по-прежнему отображаются значения угла поворота. Что мы получили? Основной цикл прокручивается с максимально возможной скоростью, при этом десять раз в секунду выполняется отправка данных. Этап 2. Сохраняем направление, но с тряской (релейный регулятор) Теперь реализуем самый простой, релейный регулятор для поддержания исходного направления робота. Этот регулятор работает так: «движемся либо налево, либо направо». Стадии покоя нет вовсе, непрерывные автоколебания. Зато принцип работы прост и очевиден. Основные используемые понятия: ошибка, управляющее воздействие. Набор скриптов для реализации этапа показан на рис. 5.16. Рис. 5.16. Скрипты для реализации релейного регулятора на этапе 2 1. Соберите скрипт программы по рис. 5.16. 2. Наладьте соединение с роботом, перейдите в режим Arduino mode и загрузите программу в память робота. 3. Запустите (кнопка) программу на выполнение. Попробуйте развернуть робота, понаблюдайте за тем, как работает регулятор. 154 Глава 5
Примечание Если робот вдруг перестал трястись, а начал просто поворачивать направо или налево, значит, контроллер завис. Иногда (для определённых контроллеров) это происходит почти сразу после запуска, моторы работают чрезмерно напряжённо, а это причина сбоев. Но надеемся, что робот будет продолжать функционировать хотя бы несколько секунд, и вы успеете познакомиться с работой релейного регулятора. Если нарисовать график зависимости управляющего воздействия от ошибки, получится простая ступенька (рис. 5.17). Рис. 5.17. Релейный регулятор, график зависимости управляющего воздействия от величины ошибки Этап 3. Сохраняй спокойствие! Релейный регулятор с «мёртвой зоной» Попробуем уменьшить тряску робота, для чего добавим в программу релейного регулятора «мёртвую зону», то есть некоторый диапазон угла поворота робота, не требующий коррекции. Изменение описания двух блоков из программы предыдущего этапа — на рис. 5.18. 1. Измените скрипты предыдущей программы по рис. 5.18, загрузите изменённую программу в память робота. 2. Запустите программу на выполнение. Попробуйте развернуть робота, понаблюдайте за тем, как работает регулятор. Удобно поставить робота «Всё чудесатее и чудесатее!» 155
на листок бумаги и затем этот листок под роботом пытаться поворачивать. Подумайте, что можно сказать о точности выдерживания направления роботом при использовании такого варианта регулятора. Рис. 5.18. Измененные скрипты для реализации релейного регулятора с «мёртвой зоной» на этапе 3 График зависимости управляющего воздействия от ошибки — двой­ная ступенька (рис. 5.19). Рис. 5.19. Релейный регулятор с мёртвой зоной, график зависимости управляющего воздействия от величины ошибки 156 Глава 5
Итак, достоинство такого регулятора — достаточно простой и понятный, при этом уже вполне можно пользоваться. Несколько менее очевидны недостатки. Такой регулятор либо медленный, либо неточный, либо и то и другое. И, если нам хочется добиться лучшего результата, пора переходить к более сложным решениям. Помните «квадрокоптер»? Этап 4. Пропорциональный регулятор Здесь и на последующих этапах используем уже готовые файлы программ. Запустите файл верный_курс_этап_4.sb2 из электронного архива. Изучите скрипты (рис. 5.20). Рис. 5.20. Скрипты проекта «Сохраняем верный курс», этап 4 Здесь мы переименовали переменную, теперь это предельное управляющее воздействие. На практике имеет смысл ограничивать диапазон значений. Вводятся пропорциональное управляющее воздействие и коэффициент пропорционального регулирования. «Всё чудесатее и чудесатее!» 157
1. Загрузите программу в память робота и запустите её на выполнение. Понаблюдайте за поведением робота. 2. Интересно понаблюдать за изменением показаний, вращая робота в руках на весу. Для этого создан блок (подпрограмма) . Для использования возможности передачи данных по последовательному порту вновь наладьте соединение с роботом. В режиме Arduino mode, справа внизу, в терминальном блоке настройте режим char mode. 3. Поворачивая корпус робота, понаблюдайте за потоком данных о положении робота. Примечание Для хорошей работы пропорционального регулятора важно подобрать оптимальный коэффициент регулирования. То, какой коэффициент подойдёт, зависит от характеристик робота, его массы, мощности двигателей, вольтажа батарей и так далее. В этом проекте мы подбираем коэффициент методом проб и ошибок. Вычислять его весьма сложно, этому учат в профильных институтах и университетах. График зависимости управляющего воздействия от ошибки с учётом ограничения абсолютной величины управляющего воздействия показан на рис. 5.21. Крутизна среднего отрезка зависит от коэффициента регулирования. Рис. 5.21. Пропорциональный регулятор, график зависимости управляющего воздействия от величины ошибки 158 Глава 5
4. Подберите такое значение коэффициента, чтобы ваш робот реагировал живо, но автоколебания не возникали. Этап 5. Пропорциональный регулятор + расширение AdvancedArduino При решении сложных задач удобно пользоваться продвинутыми инструментами, не изобретая велосипед заново. В своё время для mBlock был создан такой инструмент — авторское расширение AdvancedArduino. На этом этапе мы реализуем предыдущий вариант регулятора, но уже с использованием этого инструмента, пригодного, кстати, для реализации весьма сложных проектов. 1. Установите AdvancedArduino через Менеджер расширений mBlock. Убедитесь, что в категории Робот появился новый сборник команд. 2. Запустите на выполнение файл верный_курс_этап_5.sb2 из электронного архива. Изучите скрипты (рис. 5.22). Рис. 5.22. Скрипты проекта «Сохраняем верный курс», этап 5 «Всё чудесатее и чудесатее!» 159
Как и на прошлом этапе, здесь реализована обратная связь по последовательному порту. Наладьте связь, запустите программу на выполнение и понаблюдайте за поведением робота. Примечание В текущем варианте использовано ограничение значений при помощи операции constrain, хорошо знакомой разработчикам Arduino-­проектов. Периодический запуск (в данном случае 10 раз в секунду) реали. Обратите внимание зован при помощи блока (для использования в своих проектах) — блок создается именно с таким названием (с учётом строчных и заглавных букв). Но будем надеяться, что это самая большая сложность при использовании данного инструмента. Теперь периодическая отправка показаний происходит с самого запуска программы, даже . во время работы блоков Этап 6. Совершенствуем пропорциональный регулятор Проводя тесты и наблюдая за поведением робота, вы уже могли заметить, что простой релейный регулятор с мёртвой зоной хорош с точки зрения предупреждения автоколебаний. Можно пытаться добавлять «мёртвую зону» в пропорциональный регулятор. Но эффективнее и проще использовать квадратичное преобразование значений. Этот подход и демонстрируется программой из файла верный_курс_этап_6.sb2 (рис. 5.23). Следует учесть, что коэффициент придётся подбирать заново, и он будет иметь меньшее значение. Зато мы минимальными усилиями увеличили качество регулирования (живее отклик на интенсивное отклонение при меньшей склонности к автоколебаниям). Такой регулятор для простоты тоже часто называют пропорциональным, хотя правильнее говорить «квадратичный». График зависимости управляющего воздействия от величины ошибки (с учётом ограничения абсолютного значения управляющего воздействия) показан на рис. 5.24. Как видите, он представляет собой нечто среднее между графиками этапов 3 и 4. 160 Глава 5
Рис. 5.23. Скрипты проекта «Сохраняем верный курс», этап 6 Рис. 5.24. Квадратичный регулятор, график зависимости управляющего воздействия от величины ошибки «Всё чудесатее и чудесатее!» 161
Примечание Легко обеспечить быстрые неточные движения. Также не проблема обеспечить медленные точные движения. Сложность в том, чтобы обеспечить быстрые и точные движения. Вот эту задачу мы и стремимся решить, поэтому мы и переходим к использованию более сложных регуляторов. Этап 7. Снова «великий и ужасный» дифференциальный регулятор Настало время для дифференциального регулятора. На этом этапе проверим чисто дифференциальное регулирование. Программа для демонстрации доступна в электронном архиве, файл верный_курс_этап_7.sb2 (рис. 5.25). Рис. 5.25. Скрипты проекта «Сохраняем верный курс», этап 7 162 Глава 5
Нужный нам для вычислений показатель — угловая скорость. Мы её можем определять на основе периодического замера угла поворота. Но угловая скорость — именно тот «сырой» показатель, который и измеряет электронный гироскоп (и именно на основе угловой скорости вычисляется остальное). Сделать двой­ную работу мы сможем всегда. Но у нас также есть возможность просто взять исходные данные гироскопа при помощи соответствующего блока расширения Tiny_MPU_6050 и проверить, сработает ли наше дифференциальное регулирование. Последовательность действий: 1. Оторвите блоки, относящиеся к пропорциональному регулированию, и отодвиньте их в сторонку. 2. Соберите новый скрипт, используя уже имеющуюся конструкцию регулятора. 3. Подберите подходящий коэффициент. При чрезмерно большом начинается тряска, автоколебания достаточно высокой частоты. Что это именно автоколебания, можно проверить, взяв робота в руки. При повороте корпуса робот начинает вращать колёсами так, чтобы воспрепятствовать повороту, и делает это чрезмерно старательно. 4. После проверки поведения робота в руках, поставьте его на листок бумаги и начните поворачивать листок под ним. Задача — добиться того, чтобы старания робота были не чрезмерными, но в ­ сё-таки заметными. Оптимально, чтобы при повороте листка бумаги робот частично компенсировал этот поворот вращением колёс. Предотвратить тряску помогает снижение коэффициента, а также аккуратное ограничение величины управляющего воздействия (в нашем случае 65). Мы использовали квадратичное преобразование для того, чтобы меньше влиял цифровой шум при замере показаний, но можно попробовать и без квадратичного преобразования. Оптимальное преобразование — творческая тема. Идеальное решение предполагает, что при любой угловой скорости поворота корпуса робот вращает колёсами с такой скоростью, чтобы частично воспрепятствовать повороту. Проверить можно, поставив робота на листок бумаги, взявшись за корпус и принудительно поворачивая рукой (вместе с листком бумаги). Следите за скоростью вращения листка бумаги под роботом. «Всё чудесатее и чудесатее!» 163
Примечание С помощью специального инструмента Плоттер по последовательному соединению, встроенного в современные версии Arduino IDE (например, 1.8.13), удобно наблюдать за изменением показаний. В приложении «Arduino IDE. Плоттер по последовательному соединению. Рисуем графики!» детально рассказано, как использовать этот инструмент. Потребуется скачать дистрибутив и установить на свой компьютер свежую версию Arduino IDE. Рекомендуем попробовать уже в этом проекте. Обратите внимание, что при отображении угловой скорости площадь под или над построенной кривой отражает, по сути, суммарный угол поворота корпуса робота. Например, на рис. 5.26 робота, стоящего на месте, вначале быстро повернули налево, а затем вернули в прежнее положение. Рис. 5.26. Отображение угловой скорости в плоттере по последовательному соединению Этап 8. Пропорционально-­дифференциальное регулирование Вы уже встречались с этой связкой регуляторов. Очень хороший вариант, особенно для тех случаев, когда нет нужды сопротивляться постоянному асимметричному внешнему воздействию (например, когда один мотор робота заедает). Программа для демонстрации доступна в электронном архиве, файл верный_курс_этап_8.sb2 (рис. 5.27). 164 Глава 5
Рис. 5.27. Скрипты проекта «Сохраняем верный курс», этап 8 Примечание Переменная УВ — общее суммарное управляющее воздействие (в данном случае увП + увД). Для пропорциональной (для квадратичной, если быть точнее) и дифференциальной составляющих мы используем разные значения в качестве предельно допустимых. Отправка данных производится 50 раз в секунду для большей информативности, блок из расширения AdvancedArduino (32 — это символ «пробел»). Обратите внимание, если взять робота и вращать в руках, можно заметить, что при отвороте от целевого курса, фиксации текущего курса и при повороте на целевой курс мощность моторов разная. Можно понаблюдать за динамикой изменения двух показателей через Плоттер по последовательному соединению. Управляющее воздействие начинает замедлять вращение робота ещё до того, как ошибка стала равной нулю. «Всё чудесатее и чудесатее!» 165
Этап 9. ПИД-регулирование во всей красе Использование трёх регуляторов в связке (пропорциональный + интегральный + дифференциальный) даёт самые хорошие результаты, если правильно подобрать все коэффициенты. Программа для демонстрации доступна в электронном архиве, файл верный_курс_этап_9.sb2 (рис. 5.28). Рис. 5.28. Скрипты проекта «Сохраняем верный курс», этап 9 166 Глава 5
Примечание Блок теперь не просто отсылает данные телеметрии, в нём ещё и осуществляется периодическое изменение значения интегральной составляющей управляющего воздействия. Частоты обновления 50 раз в секунду для этого более чем достаточно (запуск каждые 20 миллисекунд). В нестабилизированном по скорости прокрутки цикле один и тот же коэффициент интегрального регулирования работал бы по-разному в разные моменты. Последовательность действий после запуска программы: 1. Запустите робота (на месте), проверьте, как он возвращается в нулевой курс. Задача — подобрать такой коэффициент интегрального регулирования, чтобы при не абсолютно точном положении корпуса робот за несколько секунд накапливал достаточное управляющее воздействие, способное чуть подвинуть его к нулевому курсу. Главное, чтобы не возникали размашистые автоколебания. 2. После подбора коэффициента интегрального регулирования проверьте, как робот двигается вперёд и сохраняет курс, если выставить значение переменной линейная скорость в положительное значение (например, 100). Позвольте роботу въехать на листочек бумаги и покрутите листок под движущимся роботом для того, чтобы убедиться в эффективности работы программы. В архиве проекта данного этапа есть ещё два файла, содержащие модификации программы с подключенными инфракрасным дальномером и сервоприводом. Попробуйте эти проекты. Если ваш контроллер не виснет во время запросов к гироскопу при подключенном инфракрасном дальномере, то можно поменять критерий остановки (аналоговое значение дальномера больше 450). Показания гироскопа могут сбиваться при чрезмерно быстрых разворотах корпуса. Это следует учитывать в проектах, например при необходимости, ограничивая максимальную мощность работы двигателей. Примечание для продвинутых читателей При приближении к целевому курсу значение интегрального регулятора перестаёт увеличиваться ещё до того момента, как текущий курс достиг целевого. Дифференциальный регулятор помогает «Всё чудесатее и чудесатее!» 167
предотвратить автоколебания, к которым интегральный весьма склонен за счёт своей «медлительности». Именно поэтому интегральное регулирование имеет смысл добавлять лишь после дифференциального (либо использовать иные хитрости для быстрого обнуления накопленного интегрального управляющего воздействия). И ещё одно: в Википедии есть красивая динамичная иллюстрация переходной характеристики системы, размещённая на странице http://ru.wikipedia.org/wiki/ПИД-регулятор. Нет никакой гарантии, что с коэффициентами, которые мы подобрали наугад, получается такая же красивая переходная характеристика, как в Википедии, но робот свою задачу в­ сё-таки выполняет! Проект 23. «Пристальный взгляд» Введение в проект После очень важных для робототехники, но относительно сложных в реализации и понимании проектов с регуляторами вернёмся к более динамичным игровым проектам. Ранее мы уже продемонстрировали, что возможности, которые получает робот при наличии гироскопа и сервомотора, очень хорошо дополняют друг друга. Вы уже освоили работу и с тем, и с другим. Пойдём дальше! Для последующих проектов очень важно обеспечить стабилизированное положение головы робота. Попробуем сделать так, что даже если корпус робота поворачивается влево и вправо, голова, как башня танка при стрельбе по цели, будет сохранять первоначальное положение. Такая возможность крайне полезна. Например, если вы решите создать свой вариант программы управления роботом с использованием FPV-видеокамеры (от английских слов first person view — видение от первого лица). Ведь это очень удобно, когда робот перемещается именно туда, куда направлены камера и взгляд оператора. В проекте «Пристальный взгляд» мы научим робота «смотреть» всё время в одну сторону, сохраняя это направление взгляда при любых поворотах корпуса. В скриптах будут использоваться стандартные расширения Makeblock (mBot), авторское расширение simpleBot и AdvancedArduino (для этапа автономного режима). 168 Глава 5
Примечание При возникновении проблем со стабильностью работы (в некоторых конфигурациях роботов) рекомендуем отключать неиспользуемую в проекте периферию, особенно инфракрасный дальномер. Также следите за уровнем заряда батарей питания. Приступаем к работе Этап 1. «Пристальный взгляд» в интерактивном режиме Начнём с варианта управления в интерактивном режиме, так проще настроить программу и проверить, какие значения возвращает блок гироскопа. Помните про необходимость калибровки в проектах с использованием гироскопа. 1. Откройте среду mBlock. 2. Подсоедините робота, настройте соединение. 3. Подготовьте робота к интерактивному режиму управления (Соединить > Обновить прошивку). 4. Соберите скрипты по рис. 5.29. Для ускорения используйте свой блок с настройками для интерактивного режима. 5. Запустите проект на выполнение. Как и в большинстве проектов с использованием гироскопа, сделайте небольшую паузу, чтобы робот успел сориентироваться в пространстве. После этого можно попробовать покрутить его в одну или другую сторону, наблюдая за положением головы и данными, отображаемыми на сцене. Учтите, что стоит избегать резких поворотов, чтобы направление не сбивалось. Рис. 5.29. Скрипты проекта «Пристальный взгляд». Этап 1, интерактивный режим «Всё чудесатее и чудесатее!» 169
Наблюдая за значениями, можно увидеть, что блок гироскопа возвращает их из диапазона от –180 до 180. Нам это подходит, можно переходить к варианту автономной работы. Этап 2. Автономный режим Теперь попробуем реализовать «Пристальный взгляд» в автономном режиме. Если вы внимательно рассмотрите скрипты на рис. 5.30, то узнаете блоки из расширения AdvancedArduino (если вы ранее пропустили сложный проект и не установили это расширение, добавьте его через Менеджер расширений). Насоздается с именно таким названием, помним, что блок как на рисунке (учитывайте строчные и заглавные символы). 1. Соберите скрипты, ориентируясь на рис. 5.30. Обратите внимание — используется необычный вариант скрипта, когда в основном программном цикле вообще пусто. В дальнейшем можно будет его наполнять любыми командами, при этом весь текущий функционал у нас находится . внутри блока 2. Настройте соединение робота с компьютером. 3. Перейдя в режим Arduino mode, загрузите программу в память контроллера. 4. Отсоедините провод, проверьте, как работает программа, поворачивая робота из стороны в сторону. Понаблюдайте, как он «перебрасывает» голову слева направо или справа налево при больших углах поворота. Рис. 5.30. Скрипты проекта «Пристальный взгляд». Этап 2, автономная работа 170 Глава 5
Проект 24. «Еду туда, куда смотрю» Введение в проект Удерживать «пристальный взгляд» мы робота научили. Представим, что на нашем роботе камера FPV. Её и на самом деле не особо большая проблема установить на поворотную голову. Для таких проектов удобно было бы иметь управление, которое позволяет оперативно осматриваться на месте, быстро поворачивая в первую очередь голову робота и лишь при необходимости — корпус. Когда робот начинает движение, корпус должен доворачиваться в ту сторону, куда направлена голова робота. Кроме того, робот должен сопротивляется всяким сбивающим факторам и пытаться сохранять направление движения и направление взгляда с использованием гироскопа. Если помечтать о возможном продолжении, при наличии нужных деталек можно смонтировать прямо на очках FPV компактный микроконтроллер со своим гироскопом, тогда будет возможность добиться того, чтобы голова робота поворачивалась синхронно с головой оператора. Может быть, именно вы ­когда-­нибудь такой проект осуществите? Но вернёмся к нашей задаче, тут и без камеры много тонкостей. Используем интерактивный режим управления и возможности виртуальных персонажей среды mBlock. Реализуем виртуальное отображение происходящих с реальным роботом событий. Расплачиваться придётся тем, что робот у нас будет ездить и поворачивать относительно медленно, чтобы меньше сбивалось направление. Но если у ­кого-то из читателей появится возможность реализовать удобное управление при помощи к­ акого-то аппаратного пульта, по образу и подобию можно будет создать проект для автономного режима. Вы уже вполне готовы к такой работе. Обратите внимание, что на всех этапах, кроме заключительного, сервомотор не задействуем. Сначала робот будет искать целевое направление за счёт поворота корпуса и лишь в самом конце добавит поворот «шеи». Приступаем к работе Этап 1. Виртуальный исполнитель. Стрелка — указатель целевого направления На этом этапе подготовим виртуализацию указателя целевого направления. Стрелка на круге будет поворачиваться, реагируя на положение курсора мыши. «Всё чудесатее и чудесатее!» 171
1. Запустите среду mBlock. 2. Удалите текущий спрайт, вместо него добавьте в проект спрайт из файла электронного архива стрелка1.png (рис. 5.31, слева). 3. Соберите скрипт, ориентируясь на рис. 5.31. Рис. 5.31. Спрайт (слева) и скрипт для виртуального исполнителя (справа) 4. Запустите программу на исполнение. Проверьте ее работу, поводя курсором мыши около стрелки на сцене. Теперь стрелочка оперативно поворачивается в сторону курсора мыши, когда мы его подводим поближе. Это будет виртуальный указатель направления «взгляда» (целевого направления при движении). Этап 2. Поворачиваемся в сторону взгляда Добавим скрипты для автоматического доворота корпуса робота в избранное направление. В интерактивном режиме мы не будем усложнять проект использованием ПИД-регулирования, достаточно предсказуемо будет работать простенький и неспешный релейный регулятор с «мёртвой зоной». Обновление показаний гироскопа происходит в интерактивном режиме не так часто. 1. Доработайте скрипты, ориентируясь на рис. 5.32. 2. Проверьте соединение робота с компьютером. (Заметили, в программе также предусмотрена проверка?) 3. Запустите программу на исполнение. Посмотрите, как поворачивается робот в направлении, которое вы задаете курсором (стрелкой на экране) и сопротивляется попыткам отвернуть корпус с этого направления. 172 Глава 5
Рис. 5.32. Теперь корпус робота будет автоматически поворачиваться в нужном направлении Уже неплохо. Но хотелось бы видеть на экране ещё и реальную ориентацию корпуса робота. Этап 3. Добавляем отображение ориентации корпуса Покажем на экране не только стрелку целевого направления, но и ещё одну, отображающую текущую ориентацию корпуса. Так мы сможем следить за процессом реального поворота в виртуальном пространстве. 1. Добавьте в проект спрайт, который будет отображать ориентацию корпуса робота. Используйте файл стрелка2.png из электронного архива (рис. 5.33, слева по центру). 2. Скрипт этого спрайта приведён на рис. 5.33. Обратите внимание на команду перейти в верхний слой. Важно, чтобы второй спрайт не был загорожен первым. «Всё чудесатее и чудесатее!» 173
Рис. 5.33. Спрайт (слева, стрелка в центре) и скрипт для отображения ориентации корпуса (справа) 3. Запустите программу на исполнение. Проверьте её работу основательнее. Теперь на сцене видно не только желаемое направление, но и текущая ориентация корпуса. Проблема: корпус робота не хочет пересекать направление –180/180 градусов. Вместо того чтобы чуть довернуть, осуществляет почти полный оборот. Это надо исправлять. Этап 4. Поворачиваться можно умнее Нам придётся изменить описание блока спрайта Стрелка1 (старый вариант — на рис. 5.33). Когда используются закольцованные значения, ошибку приходится вычислять чуть хитрее. Измените описание блока в соответствии с рис. 5.34. Значения целевой курс и текущий курс изменяются в диапазоне от –180 до 180°. Значение переменной ошибка остаётся в том же диапазоне, от –180 до 180°. Теперь робот должен корректно доворачиваться до целевого направления по кратчайшему пути. Проверьте! 174 Глава 5
Рис. 5.34. Измененное описание блока коррекция_направления_корпуса Этап 5. Начинаем двигаться в сторону взгляда А теперь доработаем проект. Посмотрите на рис. 5.35. Это полный набор изменённых скриптов спрайта Стрелка1. 1. Измените скрипты спрайта Стрелка1 в соответствии с рис. 5.35. 2. Проверьте новую программу в действии. На экране всё уже правильно, как и задумывалось: мы можем менять направление взгляда (внешняя стрелка), при этом корпус (внутренняя стрелка) начинает доворачиваться лишь при необходимости, когда не хватает диапазона подвижности «шеи». Если захотим, можем заставить робота довернуть корпус в направлении взгляда в произвольный момент. Для этого нужно передвинуть курсор мыши на спрайт указателя. Когда мы подвели курсор просто поближе к спрайту (стрелочка гоняется за курсором), можно нажать кнопку мыши, и робот поедет. В правильную сторону, само собой. Экспериментируйте и разберитесь с управлением. Этап 6. Крутим головой и едем в правильном направлении Последний штрих. Сам робот уже разворачивается, но вот голова ещё не крутится синхронно с указателем направления. Надо сделать! «Всё чудесатее и чудесатее!» 175
Рис. 5.35. Почти готовый набор скриптов спрайта Стрелка1, добавлено движение в нужном направлении 1. Добавьте блок и доработайте скрипты спрайта Стрелка1 в соответствии с рис. 5.36. 2. Проверьте программу в работе. Теперь робот должен аккуратно поворачивать голову в направлении стрелки, а если угол не позволяет, доворачиваться корпусом. При нажатой кнопке мыши (курсор возле стрелки) — едет в заданном направлении, сохраняя курс. Как обычно в проектах с обилием периферии — на правильных, отлаженных робоплатформах всё продолжает работать, робот вращает головой. На некоторых конфигурациях — виснет, требуется отладка, отключение лишнего от питания (например, неиспользуемого сейчас инфракрасного дальномера) и проверки питания. 176 Глава 5
Рис. 5.36. Финальный набор скриптов спрайта Стрелка1. Крутим головой и едем в заданную сторону «Всё чудесатее и чудесатее!» 177
Проект 25. «Острое зрение». Сортировка массива значений, медиана Введение в проект Очень важно в робототехнике научиться снимать данные с различных датчиков, но не менее важно — научиться их обрабатывать и убирать цифровой шум и случайные значения. Особенно это актуально при снятии аналоговых значений с ­какого-либо сенсора. Например, инфракрасный дальномер Sharp грешит такими шумами. И здесь может помочь обработка показаний с использованием массивов. Задача — читаем данные с датчика и сохраняем массив полученных значений. Далее обрабатываем его так, чтобы на основании нескольких (или нескольких десятков) измерений получить более чистые и точные показания. В проекте используем среду mBlock + расширение AdvancedArduino, управление в автономном режиме. Также, для снятия графических данных, потребуются среда Arduino IDE и её инструмент — Плоттер по последовательному соединению. О том, где взять эту среду и как настроить плоттер, рассказано в приложении «Arduino IDE. Плоттер по последовательному соединению. Рисуем графики!». Приступаем к работе Этап 1. Получаем сырые (необработанные) данные, используем плоттер из Arduino IDE 1. Запустите среду mBlock. 2. Соберите скрипт, ориентируясь на рис. 5.37. 3. Загрузите программу в память робота (Arduino mode). Рис. 5.37. Скрипт для передачи данных 178 Глава 5
На этот раз нам не нужно вновь настраивать соединение робота с mBlock, так как мы хотим использовать другой инструмент. 1. Запустите среду Arduino IDE (дополнительно установленную свежую версию программы). 2. Настройте соединение (плата, порт) и используйте инструмент Плоттер по последовательному соединению. 3. Понаблюдайте за отрисовкой на основе сырых данных через плоттер, убедитесь в том, что периодически происходят всплески показаний (пример — на рис. 5.38). Рис. 5.38. Пример — полученный в плоттере график (этап 1) Этап 2. Ищем максимальное значение в массиве данных На этом этапе применяем программный поиск максимума в некотором массиве значений. Используем типы переменных: байтовая, целая и масиз расширения сив целых. В скрипте задействован полезный блок AdvancedArduino. Если захотите увидеть больше примеров использования, рекомендуем посетить страницу разработчиков https://www.lab169.ru/mblock/ extensions/advanced-­arduino-extension-c-v. 1. Запустите среду mBlock, настройте соединение с роботом. 2. Соберите скрипты по образцу на рис. 5.39. 3. Загрузите программу в память робота (режим Arduino mode). «Всё чудесатее и чудесатее!» 179
Рис. 5.39. Скрипты для поиска максимального значения в массиве данных 4. Вновь наладьте соединение с роботом, чтобы иметь возможность принимать данные по последовательному порту. 5. Вернитесь в режим Arduino mode. Справа внизу в терминальном блоке настройте режим char mode. 6. Проверьте, что подпрограмма поиска максимума работает корректно. В терминальном окне должны показываться значения массива данных и индекс максимального из них. Примечание Использовать терминальный блок в mBlock в этом проекте уже неудобно (в окно помещается только один массив, причем первое значение неудобно расположено). Если вы уже освоили возможности Arduino IDE, то вместо монитора из mBlock лучше использовать монитор последовательного порта. Всё точно так же — настройка соединения (плата, порт) и кнопка Монитор порта (пример — рис. 5.40). На рисунке 180 Глава 5
мы выделили стрелками максимальные значения в наборе данных массива, можно убедиться, что индекс (порядковый номер элемента с максимальным значением считается от 0) выводится правильно. Рис. 5.40. Вариант отображения максимальных значений из массивов в мониторе порта Arduino IDE Этап 3. Проверка корректности сортировки с помощью монитора последовательного порта В данном случае используем уже готовую программу для ознакомления. 1. Запустите среду mBlock, настройте соединение с роботом. 2. Загрузите программу из файла массивы_этап3.sb2 (электронный архив проекта) в память робота (режим Arduino mode). Познакомьтесь со скриптами проекта (рис. 5.41). «Всё чудесатее и чудесатее!» 181
Рис. 5.41. Скрипты проекта «Острое зрение», этап 3 3. Запустите среду Arduino IDE (удобнее использовать, окно для данных в мониторе порта больше), настройте соединение (плата, порт) и используйте инструмент Монитор порта. 4. Понаблюдайте за выводом данных и сортировкой массива. Корректна ли сортировка (по возрастанию)? Пример — на рис. 5.42. Поменяйте расположение робота или поставьте препятствие перед датчиком, посмотрите на изменения. 182 Глава 5
Рис. 5.42. Пример — корректная сортировка массива значений (этап 3) Этап 4. Находим и выводим медиану Медиана — это значение среднего элемента в отсортированном списке. Именно эти значения хорошо использовать вместо сырых данных с датчика. Мы покажем, как это реализовать программно. Если вас заинтересует тема — рекомендуем почитать материалы по статистической обработке. 1. Запустите среду mBlock, настройте соединение с роботом. 2. Загрузите программу из файла массивы_этап4.sb2 (электронный архив проекта) в память робота (режим Arduino mode). Познакомьтесь со скриптами проекта (рис. 5.43). 3. Запустите среду Arduino IDE, настройте соединение (плата, порт) и используйте инструмент Плоттер по последовательному соединению. 4. Теперь данные выводятся в хорошей динамике и довольно гладко, без лишних шумов. Попробуйте подвигать робота, меняя расстояния до препятствий. Понаблюдайте за построением графика. Результат наших испытаний в качестве примера — на рис. 5.44. «Всё чудесатее и чудесатее!» 183
Рис. 5.43. Скрипты проекта «Острое зрение», этап 4 Рис. 5.44. Пример — полученный в плоттере график (используем медиану, этап 4) 5. Попробуйте изменить количество измерений в скриптах, подберите то, которое устроит с точки зрения чистоты получаемых данных. Теперь в Плоттер по последовательному соединению заглядывать будет гораздо приятнее. 184 Глава 5
Этап 5. Обрабатываем данные в фоновом режиме Для использования в реальных приложениях хорошо бы научиться делать так, чтобы текущее измерение и обработка происходили в фоновом режиме. А мы бы при необходимости просто смотрели на текущее последнее измеренное значение, чтобы не ждать. Вот такой процесс и демонстрируется на этом этапе. 1. Запустите среду mBlock, настройте соединение с роботом. Рис. 5.45. Скрипты проекта «Острое зрение», этап 5 «Всё чудесатее и чудесатее!» 185
2. Загрузите программу из файла массивы_этап5.sb2 (электронный архив проекта) в память робота (режим Arduino mode). Познакомьтесь со скриптами проекта (рис. 5.45). 3. Запустите среду Arduino IDE, настройте соединение (плата, порт) и используйте инструмент Плоттер по последовательному соединению. 4. Вновь попробуйте подвигать робота, меняя расстояния до препятствий. Понаблюдайте за построением графика. Наш пример — на рис. 5.46. Рис. 5.46. Пример — полученный в плоттере график (этап 5) Примечание В примере пересчёт значения переменной var_M происходит 50 раз в секунду. Важно, чтобы выделенного времени (в данном случае 1/50 секунды) хватало для завершения вычислений. А запрос последнего вычисленного значения может происходить чаще — 100 раз в секунду, например. Чтобы не тормозить другие, более критичные, фоновые процессы, вставляем в циклы с предопределённым числом повторов блоки . Там, где есть блок , это не требуется. Проект 26. «Острое зрение 2. Дистанция» Введение в проект В этом проекте предлагаем решить очередную сложную и очень полезную задачу. Если вы освоите предложенную методику, то сможете применять её в самых разных проектах. 186 Глава 5
Вспомните проекты с локатором. При использовании датчиков, например инфракрасного и ультразвукового дальномеров, мы выводим показания, но они в некоторых условных единицах. Намного удобнее было бы получать их не в этих условных цифрах, а в обычных сантиметрах, например. При этом хотелось бы, чтобы «видимые» показания от двух датчиков были бы одинаковыми (или близкими по значению), чтобы можно было ориентироваться на измеренное расстояние независимо от того, какой датчик передал данные. По сути, надо понять, как взаимосвязаны показания ультразвукового и инфракрасного датчиков, и ­каким-то образом преобразовать их значения так, чтобы они стали одинаковыми при равном расстоянии до препятствия и были представлены в обычных, метрических единицах измерения. Вот этим процессом мы и займёмся. В процессе будем рисовать графики. (Не бойтесь, всю черновую работу возьмёт на себя компьютер!) Работать будем в интерактивном режиме, в котором скорость считывания показаний невысока, придётся ориентироваться на «шумные» значения. Примечание Чтобы получать непосредственно от контроллера чистые данные, надо научить контроллер заниматься их обработкой, то есть необходимо изменить прошивку и загрузить её вместо стандартной. Это вполне реальная задача. Возможно, вы ­когда-­нибудь реализуете и такой проект. Приступаем к работе Этап 1. Выясняем значения датчиков, готовимся к исследованию Для начала просто посмотрим, какие значения выводит контроллер с ультразвуковым и инфракрасным датчиками. 1. Запустите среду mBlock, настройте соединение с роботом. 2. Подготовьте робота для работы в интерактивном режиме управления (Соединить > Обновить прошивку). 3. Удалите спрайт Панды, добавьте спрайт Arrow1. В этом проекте его использовать удобнее, только выберите костюм со стрелкой, развернутой вверх. «Всё чудесатее и чудесатее!» 187
4. Загрузите фон сцены xy-grid из библиотеки. На эту координатную плоскость мы и будем ориентироваться. 5. Соберите скрипт по рис. 5.47, создав нужные переменные. Рис. 5.47. Выясняем значения, получаемые с датчиков 6. Запустите программу на выполнение. В качестве препятствия лучше взять однотонную пластину (мы использовали серую коробку от обуви, но можно взять любой подходящий плоский предмет с однотонной поверхностью). Расположите препятствие перпендикулярно сенсорам перед роботом и двигайте, наблюдая за показаниями датчиков. Для нахождения взаимосвязи и построения графиков проще взять к­ акие-то удобные значения. Например, отодвигая робота от препятствия, выбрать «круглые» значения ультразвукового датчика (его значения практически совпадают с реальным расстоянием в сантиметрах). Мы выбрали показания ультразвукового датчика в диапазоне от 10 до 40. При замерах инфракрасный датчик на этом же диапазоне расстояний показал значения от 400 до 110. У вас, вполне возможно, будут другие значения. Запишите их и используйте при составлении скриптов. Теперь нам надо сделать подготовительную работу для построения графика. Можно было бы просто откладывать точки с координатами по осям x и y, взяв в качестве координат значения дальномеров, но получится очень узкий график. А чтобы он красиво и удобно занял всю сцену, надо таким образом преобразовать данные с датчиков, чтобы полученные значения укладывались в диапазон координат на сцене. По оси х у нас 480 точек, по оси y — 360. 188 Глава 5
По оси x у нас будут откладываться значения для ультразвукового датчика, по оси y — значения инфракрасного датчика. Мы собрали специальный блок, преобразующий значения датчиков в такие, чтобы они занимали весь предложенный диапазон координат на оси. Это (описание см. на рис. 5.49). Блок универсален, вписав в него свои блок диапазоны реальных показаний ультразвукового и инфракрасного датчиков, вы получите преобразование для координатной сетки 480×360. лучше создавать с опцией Выполнение без обновления экраБлок на (рис. 5.48). Такой режим поможет увеличить скорость выполнения, а также уберёт ступеньки, если мы впоследствии захотим рисовать линии графиков. Описание блока представлено на рис. 5.49. Рис. 5.48. Создание и вид блока goto… Рис. 5.49. Преобразование значений, стрелка двигается в пределах координатной сетки «Всё чудесатее и чудесатее!» 189
Для визуализации преобразованные значения показаний датчиков используем для указания положения маркера — стрелки Arrow1. 1. Соберите скрипты, ориентируясь на рис. 5.49. В комментарии мы ещё раз показали, что используем свои диапазоны значений датчиков, вам надо использовать те, которые получите вы. При необходимости можно загрузить готовый файл этапа из электронного архива. 2. Запустите программу на выполнение. Двигая лист картона перед датчиками, убедитесь, что на выбранном диапазоне расстояний стрелка не выходит за пределы координат и перемещается из одного угла сцены в противоположный. Этап 2. Рисуем на экране точки и получаем гиперболу А теперь стрелка на экране будет не просто перемещаться, а оставлять ­отметки-­точки, соответствующие преобразованным значениям датчиков расстояния. 1. Дополните скрипты проекта, ориентируясь на рис. 5.50. 2. Расположите коробку-­препятствие перед роботом. 3. Запустите проект на выполнение. Передвигайте препятствие. На сцене рисуется набор точек. Рис. 5.50. Рисуем точки на основании преобразованных данных инфракрасного и ультразвукового датчиков 190 Глава 5
Когда точек становится много и вырисовывается некая линия, можно остановить отрисовку и убрать с экрана показания переменных (нажать и отпустить клавишу <Пробел>). Получившийся набор точек, если представить его в виде линии, подозрительно напоминает гиперболу (см. рис. 5.50, слева). Теперь понятно, что данные инфракрасного дальномера нелинейно зависят от расстояния, и это очень неудобно при использовании таких необработанных данных в тех же регуляторах (с одной стороны диапазона было бы «перерегулирование» с автоколебаниями, а с другой — «недорегулирование»). Мы попробуем подобрать формулу, соответствующую данной гиперболе. И если график, построенный по этой подобранной формуле, ляжет на исходный рисунок точек, то можно считать, что мы подобрали формулу и к вычислению реальных значений датчика. Для сравнения нам потребуется скриншот данных, полученных на этапе 2. Например, можно нажать клавишу <PrintScreen>, тогда весь экран компьютера попадёт в буфер обмена. Затем надо открыть графический редактор (Paint подойдёт), вставить изображение из буфера обмена (комбинация клавиш <Ctrl>+<V>), обрезать по размеру сцены 480 на 360 и сохранить в файл. На всякий случай мы добавили в электронный архив рисунок-­образец. Этап 3. Подбираем формулу для линии Нам надо подобрать формулу функции, которая нарисует график, близкий по форме к нашей реальной картинке с данными из прошлого проекта. 1. Вставьте получившуюся ранее картинку в проект как фон сцены с названием данные_480х360 (команда Загрузить фон из файла). 2. Добавьте вторую стрелочку-­ спрайт чёрного цвета из библиотеки (Arrow2). Теперь задача — научить вторую стрелочку двигаться по экрану так, чтобы она воспроизводила траекторию перемещений первой. 1. Соберите скрипты для второй стрелочки, ориентируясь на рис. 5.51. скопируйте из первого спрайта. Можно этот блок переимеБлок новать для определённости, а можно этого и не делать. 2. Запустите программу на исполнение. Здесь нет командного блока, так что просто щёлкаем курсором по скрипту. Вторая стрелочка начинает рисовать линию. Смотрим на совпадение с нашим исходным вариантом на заднем фоне (см. рис. 5.51, слева). «Всё чудесатее и чудесатее!» 191
Рис. 5.51. Подбираем параметры для отображения графика с помощью спрайта Arrow2 В настоящее время можно поискать компьютерные приложения, которые способны автоматизировать процесс подбора данных для формулы. Мы же пока просто подбираем такие значения в формуле вычисления «_В_», чтобы при изменении значений «_А_» в диапазоне данных инфракрасного датчика маркер попадал на линию. Для скорости активируем режим «турбо» (Редактировать > Режим Turbo). Мы подобрали функцию для наших датчиков, получилось _В_ = (3500/(_А_ — 36)) — 1.2. Но у вас могут быть другие данные, попробуйте подобрать значения так, чтобы нарисованная линия как можно точнее легла на полученные ранее точки данных. Этап 4. Данные о расстоянии становятся одинаковыми. Можно пользоваться! А теперь используем полученную на предыдущем этапе информацию для преобразования полученных с инфракрасного дальномера значений в такие же, как у ультразвукового (по сути — совпадающие с реальными сантиметрами расстояния). Значит, используя значения УЗ_дальномер и ИК_дистанция в блоке , можно указывать один выбранный диапазон расстояний (у нас от 10 до 40 см). 192 Глава 5
1. Добавьте переменную ИК_дистанция и измените скрипты спрайта Arrow1 по образцу на рис. 5.52. Учтите, что формула преобразования диапазона у вас может быть с другими значениями. 2. Проверьте соединение робота с компьютером и запустите программу на исполнение. 3. Обратите внимание, что в скриптах есть блок команд для демонстрации показаний датчиков и вычисленного значения ИК_дистанция по щелчку мыши. Запустите блок на исполнение и посмотрите на значения переменных. Хорошо, если значения УЗ_дальномер и ИК_дистанция почти одинаковые, значит, всё сделано и посчитано правильно. Рис. 5.52. Теперь значения дистанции для инфракрасного и ультразвукового датчиков совпадают. Победа! 4. Подвигайте препятствие перед роботом, понаблюдайте за данными о расстоянии. График зависимости показаний ультразвукового датчика и преобразованных в дистанцию показаний инфракрасного дальномера теперь — прямая линия. Ура! Отличный результат. «Всё чудесатее и чудесатее!» 193
Понятно, что процесс можно продолжить, подбирая подходящие коэффициенты и добиваясь максимальной близости результатов датчиков между собой, а также более точного соответствия реального расстояния с полученным от датчиков. Но надеемся, что сам механизм решения задачи стал более понятным, и вы сможете при необходимости самостоятельно провести такую работу. Проект 27. «Острое зрение 3. Суперлокатор» Введение в проект А теперь применим полученные результаты к нашему старому проекту 16 «Локатор на посадочном модуле». Доработаем и немного изменим проект, он станет лаконичнее, но намного функциональнее, ведь теперь мы сможем увидеть форму, а также измерять и выводить на экран реальное расстояние до объекта. Проект выполняется в интерактивном режиме управления. Приступаем к работе 1. Запустите среду mBlock. 2. Настройте соединение робота с компьютером. 3. Подготовьте робота к интерактивному режиму управления (Соединить > Обновить прошивку). 4. Проще взять за основу проект 16 «Локатор на посадочном модуле». Загрузите проект из вашего файла и соберите скрипты на основе рис. 5.53. Варианты: создайте новый проект, используя спрайт Arrow1 с костюмом, в котором стрелка повернута направо, или загрузите готовый проект из файла в электронном архиве. 5. Запустите программу на выполнение и посмотрите, как строится радарная картинка окружающего пространства. Попробуйте поставить различные препятствия, в том числе и плоскостью под острым углом к сканирующему лучу. Да, робот может определять дистанцию до поверхности, ориентированной под острым углом к лучу. 6. Возможно, вам больше понравился стиль оформления радарной картинки в старом проекте, тогда можете загрузить из электронного архива проекта файл суперлокатор_A.sb2, в котором реализован этот стиль (рис. 5.54). 194 Глава 5
Рис. 5.53. Сканируем пространство и рисуем радарную картинку с реальными расстояниями на экране Рис. 5.54. Альтернативный вариант оформления радарной картинки «Всё чудесатее и чудесатее!» 195
Этот проект как основу можно использовать во множестве интересных разработок: двигаться вдоль стенки, осуществлять поиск небольших предметов, лежащих на полу, и так далее. Добавив непосредственно в проект спрайт с масштабной линейкой, можно наглядно представлять расстояния до предметов. Экспериментируйте и придумывайте свои применения предложенным алгоритмам. Проект 28. «Точные перемещения, калибровка» Как здорово, когда робот совершает в точности те движения, которые задумал программист. В виртуальных симуляторах обычно так и происходит, но в реальности добиться этого намного сложнее. В нашем роботе используются обычные коллекторные двигатели, а их конечное действие определяется не только временем работы, но и текущим состоянием батарей питания, качеством самих моторов и так далее. Да, существует решение в виде энкодеров — специальных датчиков угла поворота вращающихся объектов. Энкодеры у робота — удобная вещь, но зачастую нам приходится опираться на другие решения, повышающие точность перемещения. И они, конечно же, существуют, ведь человек к­ ак-то без энкодеров обходится? Мы ориентируемся на информацию от разных органов чувств, чтобы сопоставлять усилия с результатом. Конечно, влияют условия — усталость, масса поклажи, которую мы на себя взвалили, но мы всё время тренируем и совершенствуем свою способность точно двигаться, правильно оценивать расстояние, свой глазомер. В этом проекте мы покажем ещё одну методику для повышения точности расчётного (запрограммированного) перемещения робота. Конечно, можно перед основным заездом сделать массу тестовых и попытаться подобрать подходящее значение мощности двигателей и времени их работы. А можно просто измерить текущую скорость при определённых значениях мощности и использовать это значение для дальнейших вычислений необходимого времени движения (рис. 5.55). Пример реализации такой тестовой программы в интерактивном режиме управления представлен на рис. 5.56. Достаточно поставить робота перед препятствием и запустить программу, Панда «озвучит» текущие значения. Можно менять мощность, подбирать нужные значения и так далее. Можно установить в удалении кружок-цель и запрограммировать робота на основе полученных данных так, чтобы он проехал строго заданное расстояние. 196 Глава 5
Рис. 5.55. Вывод данных в виде оформленного текстового сообщения Рис. 5.56. Программа расчёта и вывода значений скорости Конечно, всё это работает для определённых условий, например для конкретной мощности двигателей и заряда батарей. Чтобы робот учился сам сопоставлять свои усилия с результатом в естественных условиях, от него требуется способность определять ситуации, в которых полученные сведения можно использовать как проверенные эталонные значения. А это не всегда легко. Но возможно. Примечание На нашем роботе потенциально реализуема и инерциальная навигация с помощью гироскопа-­акселерометра. Мы знаем ускорение свободного падения. Начальную скорость считаем равной нулю. Отслеживая точные значения ускорения по всем трём осям «Всё чудесатее и чудесатее!» 197
(вперёд-­назад, влево-­вправо, вверх-вниз), можно в каждый момент определить вектор ускорения и его абсолютную величину. Далее потребуется рассчитать приращения скорости по всем трём направлениям (помня о существующем ускорении свободного падения), в результате в каждый момент времени нам становится известна скорость перемещения по каждой из трёх осей (относительно начальной нулевой). А зная скорость, можно рассчитать перемещение. Подобные вычисления достаточно сложны сами по себе, задействуют много аппаратных ресурсов, требуют моделирования в трёхмерном пространстве и сложных вычислительных методов, например использования фильтра Кальмана. Однако существуют решения, относительно легкие для использования. Так, микросхема абсолютной ориентации Bosch BNO‑055 («Smart sensor») имеет собственный производительный процессор и осуществляет все вычисления самостоятельно на основании показаний встроенных гироскопа, магнитометра и акселерометра. 198 Глава 6
Вы готовы экспериментировать? Во всех предыдущих проектах для программирования робота использовалась среда mBlock. На текущий момент мы считаем её наиболее универсальным и проработанным программным средством из визуальных Scratch-­ подобных программ. Но это не значит, что прямо сейчас в мире не развиваются новые среды визуальной разработки, некоторые из них могут стать настоящим прорывом в области программирования микроконтроллеров. Если вам понравились наши проекты и сама технология визуального блочного программирования, то за новыми продуктами стоит следить, а также проводить их тестирование и проверку. Появляются новые микроконтроллеры, расширяется спектр электронных компонентов, все это находит отражение и в новых, современных средах программирования. В этой главе мы познакомим вас с некоторыми из сред, а заодно продемонстрируем возможности расширения проектных возможностей за счёт использования дополнительной электроники. Проект 29. «Пульт дистанционного управления. Осваиваем MindPlus» Введение в проект В этом проекте мы создадим и запрограммируем беспроводной пульт управления в виде джойстика из дополнительных электронных компонентов. По сути, мы свяжем между собой два контроллера Arduino, на один из которых возложим функции пульта. Такую же технологию можно было бы использовать Вы готовы экспериментировать? 199
и для связи двух роботов между собой. Замечательно, если у вас есть наша книга «Scratch и Arduino для юных программистов и конструкторов» (второе издание) с набором электронных компонентов, в нём присутствует все необходимое для проекта. Мы рассчитываем на то, что у вас есть и два Bluetooth-­ модуля, уже сопряжённых друг с другом, либо аналогичный по возможностям коммуникационный комплект 2.4G (дополнительную информацию смотрите в приложении). В случае отсутствия готового набора под рукой можно использовать компоненты из магазинов для технического творчества и провести согласование Bluetooth-­модулей самостоятельно, инструкция размещена на сайте lab169.ru (Материалы > Коммуникация между устройствами). Приступаем к работе Этап 1. Сборка пульта-­джойстика Нам понадобится устройство, состоящее из микроконтроллера Arduino Uno с установленной на него платой расширения (такие платы часто называют «шилд», от английского слова shield), похожей на привычный игровой джойстик (рис. 6.1). Рис. 6.1. Плата Arduino с установленным джойстик-­шилдом Джойстик-­шилды бывают разных модификаций, на рис. 6.1 изображен вариант JoyStick Shield v1.A. На плате расположены подпружиненная рукоятка, поворачивающая два потенциометра, четыре основные (цветные) кнопки в правой части и три дополнительные слева (одна из кнопок спрятана под «грибком» рукоятки), переключатель питания 3.3V/5V, специальный коннектор для подключения внешнего жидкокристаллического дисплея Nokia 5110 LCD, 200 Глава 6
отдельные коннекторы для установки внешнего радиомодуля на микросхеме nRF24L01, а также для коммуникационного модуля с последовательным соединением (например, модуля Bluetooth или 2,4G). Установите джойстик-шилд на плату Arduino. Эта задача не должна вызвать особых проблем. Просто будьте внимательны, следите за совпадением пинов и контактных разъёмов, ориентируйтесь по подписям контактов, а перед установкой ещё раз взгляните на рис. 6.1. Для связи пульта с роботом мы будем использовать спаренные коммуникационные модули, один из которых по-прежнему останется в роботе, а вот второй мы подключим к коммуникационному разъёму на пульте. Но сделаем это позже, чтобы он не мешал программировать плату контроллера пульта. При включенном модуле Bluetooth загрузка не пойдёт. Этап 2. Программируем робота Для робота программа уже готова, это проект «Демонстрация» из приложений. В проекте всё расписано. Если вы ранее им не воспользовались, почитайте описание и загрузите программу проекта из электронного архива в контроллер робота. Если ранее вы ещё не освоили беспроводное соединение, ознакомьтесь с соответствующим руководством в разделе «Приложения». Мы используем заранее сопряжённые между собой модули Bluetooth, один из которых запрограммирован как главный (мастер), другой — подчинённый (слейв). Такие модули при включении ищут друг друга и соединяются при обнаружении. В роботе должен находиться слейв-­модуль, в компьютер для организации связи мы вставляли мастер-­модуль. Теперь же мастер-­модуль станет частью пульта управления. Этап 3. Программируем пульт-­джойстик Программу для пульта можно создать и в mBlock 3, но мы предлагаем попробовать другую среду блочного программирования, MindPlus. В первую очередь, чтобы вы смогли убедиться, что и в других средах приёмы работы будут похожи на те, которыми вы овладели в процессе работы с проектами книги. Кроме того, mBlock 3 — наиболее универсальное решение, но некоторые среды лучше реализуют тот или иной режим управления, и надо понимать, что вы можете использовать их преимущества в разных проектах. Вы готовы экспериментировать? 201
Итак, среда MindPlus, страница загрузки — http://mindplus.cc/download-en. html. 1. Загрузите и установите на компьютер среду MindPlus. Изначально язык интерфейса — китайский, сменить его на более понятный английский (русского, к сожалению, пока нет) можно, нажав кнопку в виде шестеренки в правом верхнем углу (рис. 6.2). Рис. 6.2. Настройка языка интерфейса MindPlus 2. По умолчанию включен режим Online (рис. 6.3, справа вверху). Поскольку мы собираемся использовать пульт в качестве автономного устройства, надо перейти в режим Offline > Code. Рис. 6.3. Режим для проектов с автономным управлением 3. Теперь нужно выбрать плату контроллера. Щёлкните по кнопке Extenti­ ons в левом нижнем углу, из предложенных вариантов выберите плату Arduino Uno, после чего вернитесь на основной экран, нажав кнопку Back. 4. Подсоедините контроллер пульта управления (проверьте, что модуль Bluetooth не подсоединен!) к компьютеру проводом USB точно так же, как раньше соединяли робота. Для соединения щелкните по меню Connect Device и выберите порт из найденных (рис. 6.4). 202 Глава 6
Рис. 6.4. Указываем коммуникационный порт Всё, система готова для программирования и загрузки программы. 1. Загрузите файл RC-pult_MindPlus.sb3 из электронного архива проекта (Project > Load Project). Посмотрите, насколько похожи скрипты на те, которые мы собирали в проектах книги. Да и по расширению файла видно, что в основе MindPlus лежит всё тот же Scratch, только в отличие от mBlock 3 — последней версии. Даже если вы не знаток английского, надеемся, структура и назначение блоков будут вам понятны. 2. Нажмите кнопку Upload, программа грузится в память контроллера, причём быстро. 3. Теперь можно отсоединить кабель от контроллера. 4. Соединяем коммуникационный модуль (мастер!) с джойстик-­шилдом, следим за надписями на колодке подключения и на модуле Bluetooth, подключаем питание (рис. 6.5). Рис. 6.5. Модуль Bluetooth установлен на пульт Вы готовы экспериментировать? 203
5. Включите робота, на которого уже загружена демо-программа, пронаблюдайте, как модули устанавливают соединение (светодиоды на модулях должны поморгать и загореться постоянным светом). 6. Теперь можно управлять роботом, используя джойстик. Обратите внимание, в электронном архиве проекта есть и программа пульта для среды mBlock. Если будут сложности с MindPlus, можно попробовать этот вариант. Примечание Если у вас не оказалось под рукой дополнительного микроконтроллера и джойстик-­шилда, можно организовать управление с компьютера, используя специализированные программы, например приложения Tera Term и ARCCar, которые очень удобны в использовании. В случае необходимости разобраться с их установкой и настройкой поможет Интернет. Проект 30. «Управление двигателями. Знакомимся со Snap4Arduino» Введение в проект Далеко не всегда в той или иной среде программирования существуют готовые библиотеки для управления двигателями робота. В среде mBlock 3 можно использовать универсальное расширение H-bridge, в котором достаточно указать номера пинов, управляющих моторами. Но как быть, если вы используете другие среды, где нет таких универсальных дополнений? В этом проекте вы научитесь создавать блоки управления моторами робота в ещё одной крайне интересной среде — Snap4Arduino. Заодно разберётесь, как работает расширение H-bridge (или другое аналогичное). Это позволит управлять двигателями в любой среде программирования, просто меняя состояние пинов. Одной из наиболее часто используемых схем управления двигателями является такая, в которой один пин управляет направлением вращения, а второй — скоростью. Если контроллер робота — mCore-совместимый (как в нашем роботе), вы сможете опробовать эту схему управления на практике. 204 Глава 6
Другая распространённая схема управления требует использования трёх пинов для каждого двигателя. Один из них задаёт мощность, два других — направление вращения либо режим торможения. Если ваш робот MegaPiсовместимый, вы также сможете на практике освоить эту схему управления, но придётся брать проекты из электронного архива с меткой MegaPi. В проекте мы будем использовать интерактивный режим управления в среде Snap4Arduino. Перед тем как начать, следует объяснить одну сложность. И среда MindPlus, и среда Snap4Arduino используют для обмена данными с контроллером скорость 57600, а не 115200, как mBlock. Пока вы управляете платой по проводу, вы об этом, возможно, даже не догадываетесь. Но при беспроводном подключении коммуникационные модули должны быть настроены именно на эту скорость обмена, иначе связи не будет. Поэтому будем управлять роботом по проводу. Ну, а если в наличии уже есть пара сопряжённых модулей, работающих на 57600, или процедура перенастройки не вызывает страха — супер, можно попробовать и беспроводное соединение. Приступаем к работе Среда Snap4Arduino. Знакомимся и устанавливаем Snap4Arduino — интересное ответвление в развитии блочных языков программирования, перспективная среда управления, базирующаяся на BYOB (Snap!), разработке Университета Беркли. Одно из неоспоримых достоинств Snap4Arduino — скоростная и надежная работа с микроконтроллерами в интерактивном режиме и при чтении состояния портов, и при их изменении. Для проектов, в которых необходима достаточная скорость работы с большим количеством портов, среда Snap4Arduino — совершенно незаменимый инструмент. Пробуем? Страница загрузки — www.snap4arduino.rocks/#download. Программа доступна для различных операционных систем, выберите дистрибутив для своей и установите программу на компьютер. Файл-дистрибутив загружается в виде zip-архива, перед установкой его надо разархивировать. Также можно воспользоваться онлайн-­версией программы (пункт Play online) и работать с ней без установки на компьютер. Прямая ссылка на онлайн-­ вариант — snap4arduino.rocks/run/ (запускается не во все браузерах, иногда требует выставления определённых настроек-­разрешений). После загрузки программы автоматически определяется язык интерфейса, но вы всегда можете выбрать язык в настройках (как обычно — символ шестерёнки). Вы готовы экспериментировать? 205
Подготовка контроллера Для работы со средой Snap4Arduino нашего робота потребуется подготовить. Дело в том, что здесь нет удобной кнопки загрузки специальной прошивки для работы в интерактивном режиме управления, как в mBlock. Но в противовес этому неудобству Snap4Arduino использует одну из стандартных прошивок, входящих в набор примеров Arduino IDE — Standard Firmata. Вот её мы и должны загрузить в контроллер робота. Загрузка программы позволит нам немного потренироваться в использовании Arduino IDE, это пригодится. 1. Подключите робота к компьютеру кабелем USB, включите питание. Рис. 6.6. Выбор файла прошивки 206 Глава 6
2. Запустите Arduino IDE и настройте соединение с роботом (если возникают вопросы, процедура запуска и настройки соединения описана в приложении). 3. Выберите файл прошивки, перейдя в меню Файл > Примеры-­Firmata > StandardFirmata (рис. 6.6). 4. Загрузите прошивку в контроллер робота, нажав кнопку Загрузка , рис. 6.7). (кнопка Рис. 6.7. Загрузка файла прошивки в контроллер 5. После процесса загрузки должна появиться надпись «Загрузка завершена» внизу окна Arduino IDE. Робот готов к работе со Snap4Arduino. Закройте Arduino IDE. Примечание Среда Mind+ также использует аналогичную (совместимую) прошивку и имеет удобный механизм её загрузки на устройство. Иными словами, для работы в Snap4Arduino вместо прошивки, загружаемой через Arduino IDE, можно воспользоваться встроенной прошивкой, загружаемой средой Mind+. Надо перейти в режим online, выбрать расширение Arduino Uno или Romeo Explorer D1 educational robot, выбрать коммуникационный порт, после чего прошивка установится автоматически. Соединяем среду Snap4Arduino и контроллер Рис. 6.8. Соединение среды Snap4Arduino с контроллером Запустите среду Snap4Arduino, перейдите в категорию Arduino и там щёлкните по команде Подключиться к Arduino, затем укажите порт соединения (рис. 6.8). Система готова к работе. Можно начинать программи­ ровать блоки. Вы готовы экспериментировать? 207
Этап 1. Создаём новые блоки для управления двигателями В этой среде у нас нет универсального расширения с удобными блоками управления. Значит, надо научиться самим создавать такие блоки и использовать их в последующих проектах. 1. Перейдите в категорию Прочее, нажмите кнопку Новый блок. 2. В появившемся окне выберите категорию будущих блоков (например, Arduino, см. рис. 6.9) и дайте название новому блоку (моторы_СТОП). Блок создаём в режиме для всех спрайтов. Нажмите кнопку OK. Рис. 6.9. Создание нового блока в среде Snap4Arduino 3. Появится блок редактора. Заполните описание блока (команды из категории Arduino) по образцу на рис. 6.10. В конфигурации нашего робота порты управления моторами — 5 и 6. При необходимости отредактировать содержимое описания всегда можно щёлкнуть по блоку правой кнопкой мыши и выбрать команду Редактировать. 208 Глава 6
Рис. 6.10. Создание блока моторы_СТОП в редакторе блоков Теперь создадим блок с параметрами. Например, с возможностью задавать мощность моторов (назовём их левый и правый). Рис. 6.11. Добавление параметров Вы готовы экспериментировать? 209
1. Создайте новый блок . В редакторе описания щёлкните по значку «+» справа от названия блока, откроется окно определения имени вводимых данных (переменных). Введите название — левый, выберите вариант Любой тип (рис. 6.11), нажмите кнопку OK. Аналогично добавьте переменную правый. 2. Соберите описание блока, руководствуясь примером на рис. 6.12. Обратите внимание, что в скрипте описания блока присутствуют команды задания первоначального направления вращения моторов (порты 7 и 4), а также проверка вводимых значений (если больше максимально допустимого 255, то используется 255). Переменные скрипта добавляются стрелочками вправо, как и параметры в блоке. Рис. 6.12. Описание блока управления моторами 3. Создайте по аналогии ещё два блока, и , для управления отдельно левым и правым моторами с возможностью управления мощностью. Описания блоков приведены на рис. 6.13. 210 Глава 6
Рис. 6.13. Описание блоков управления левым и правым моторами по отдельности Всё, блоки созданы. Попробуйте запускать их на выполнение, просто щёлкая по ним мышью. Обратили внимание, что однократное нажатие не всегда срабатывает? Да, некоторые команды могут потеряться по дороге. Учтём этот факт, интерактивные программы будем писать так, чтобы команды либо отправлялись непрерывно, либо по крайней мере дублировались пару раз. Если не сработала первая, сработает вторая. Примечание Если в сборке скриптов описаний блоков ­что-то вызовет проблемы, можно загрузить готовые блоки управления из электронного архива. Для этого щёлкните в шапке Snap4Arduino по кнопке с изобра, выберите команду Импорт и покажите жением листка бумаги путь к файлу электронного архива mCore_motors blocks.xml (файлы проектов для среды Snap4Arduino имеют расширение xml, а не привычные по Scratch-­подобным средам расширения sb2, sb3). Всё, блоки импортированы. В целом, если блоки созданы как глобальные (для всех спрайтов), их можно сохранить в виде библиотеки (экспортировать). Возможная проблема при будущем импортировании — если перепутать и импортировать в проект не библиотеку блоков, а другой проект, потеряете результаты своей работы. Поэтому обратите внимание, в названии нашего файла есть слово blocks, для определённости. Вы готовы экспериментировать? 211
Этап 2. Пишем скрипт для управления роботом с клавиатуры компьютера Теперь, когда у нас есть блоки управления двигателями робота, попробуем в качестве примера собрать скрипт клавиатурного пульта управления. Содержание скрипта представлено на рис. 6.14. Заодно вынесем на рабочее поле и блоки управления двигателями с заданными значениями мощности, чтобы иметь возможность запускать их при желании. Рис. 6.14. Скрипт программы «Пульт управления» Соберите скрипт, попробуйте его в работе. Если всё правильно, то демонстрируется вполне быстрый отклик на нажатие клавиш в интерактивном режиме. Хотя и используется неоптимизированная система связи, вместо отправки одной высокоуровневой команды отправляем много низкоуровневых (но и это можно исправить, если покопаться в начинке Snap4Arduino). Послесловие к проекту Snap4Arduino — очень мощная и перспективная среда программирования, но пока что стабильность интерактивного управления роботом в ней очень зависит от надёжности связи, требуется использование модулей беспроводной 212 Глава 6
коммуникации, настроенных на скорость 57600 (тогда как у нас 115200), а возможности создания программ автономной работы ограничены. Было бы здорово увидеть доработанную среду Snap4Arduino, лишённую своих главных недостатков — неудобства прошивки контроллера, чрезмерного минимализма средств создания автономных программ, потери команд при сбоях связи. Предлагаем всем присоединиться к сообществу энтузиастов, помогающих небольшой команде официальных разработчиков дорабатывать и совершенствовать проект. Примеры удачного развития среды — созданная энтузиастами специальная прошивка Firmata с библиотекой блоков для управления шаговыми двигателями, позволяющая сделать робота-­художника. Отправкой одной команды запускается работа сразу двух шаговых двигателей, которые далее синхронно работают нужное время в нужном режиме, чтобы робот осуществил запланированное перемещение. Возможно и другими методами обеспечить надёжное управление двигателями в среде Snap4Arduino. Кстати, та же команда разрабатывает среду MicroBlocks, и связка из этих двух продуктов видится идеальным средством для создания проектов на базе современных 32‑разрядных микроконтроллеров (http://microblocks.fun/). А ещё существует BeetleBlocks с головокружительными возможностями освоения базовых концепций структурного программирования на примере создания 3D-объектов. В трёхмерном пространстве перемещается исполнитель-­жучок и формирует при своём движении графические примитивы. Получившийся объект можно сохранить в виде STL-файла, а впоследствии даже распечатать на 3D-принтере! Рекомендуем познакомиться (http:// beetleblocks.com/). Но и в текущем виде среда Snap4Arduino замечательно подходит для проектов виртуальной робототехники, где легко даст фору всем остальным блочным средам, и в этом мы ещё убедимся. Проект 31. «По клеточкам!» Введение в проект Продолжим работать со средами — альтернативами mBlock. Очень важно донести до вас, наших читателей, главную идею — визуальных сред программирования много, они развиваются, и некоторые могут обладать к­ акими-то Вы готовы экспериментировать? 213
преимуществами перед другими в определённых областях. Это надо использовать и выбирать среду программирования соответственно решаемым задачам. В этом проекте мы снова возвратимся к MindPlus и научим робота ездить по квадратной разметке, да не просто ездить, а запоминать свой путь и выдавать список движений по нашему запросу. Чтобы не перенастраивать скорость обмена для коммуникационных модулей, будем использовать автономный режим функционирования робота, в котором можно выбирать произвольные настройки коммуникационного порта. Примечание Поле с разметкой в виде квадратов — одно из наиболее используемых нами в игровых и учебных проектах. Можно ездить по определённым заранее маршрутам, огибать препятствия и искать оптимальные пути возвращения и многое, многое другое. Фрагмент изображен на рис. 6.15, количество клеточек ограничивается только возможностью удобного расположения поля на полу или на столе. Такое поле может входить в состав набора с роботом, но если у вас его нет в готовом виде, нарисуйте в графическом редакторе и распечатайте на обычных листах А4, потом их можно будет склеить обычным клеящим карандашом. Возможно также использовать чёрную изоленту. Ширина линии — около 15–18 мм, расстояние между линиями клетки — 195 мм или больше. Рис. 6.15. Фрагмент поля с квадратной разметкой 214 Глава 6
Приступаем к работе 1. Откройте среду MindPlus, переключитесь в режим Offline. 2. Настройте проводное соединение робота с компьютером (Connect device > выбор порта). 3. В Extensions (слева внизу) перейдите в раздел Kit и выберите расширение Romeo. Это робот с mCore-совместимой схемой управления двигателями, как и у нашего робота. Этап 1. Проверяем соединение по последовательному порту Проверяем, что вообще получается управлять роботом по последовательному порту. Пусть робот хотя бы просто посигналит зуммером. 1. Соберите скрипты по образцу на рис. 6.16. 2. Загрузите программу в контроллер робота (кнопка Upload). Рис. 6.16. Скрипт проекта «По клеточкам!». Этап 1 — проверка соединения Теперь надо передать по последовательному порту команду «h» (от английского слова horn — гудок) и услышать гудок робота в ответ. Передать можно разными способами. 1. Можно наладить соединение в самом MindPlus, справа внизу, набор настроек показан на рис. 6.17. Отправка сигнала — кнопка Send. 2. Можно разорвать соединение с MindPlus (чтобы не занимать порт), запустить Arduino IDE, там настроить соединение и воспользоваться инструментом Монитор порта для отправки сообщения «h». Вы готовы экспериментировать? 215
Рис. 6.17. Передача сигнала по последовательному порту в MindPlus 3. Мы уже упоминали программу Tera Term, очень удобную для работы по последовательному порту. Официальная страница загрузки — osdn.net/ projects/ttssh2/releases/. Программа проста в установке. После запуска программа обычно сама находит порт соединения (если он опять же не занят тем же MindPlus). Но когда требуется настроить соединение, используем меню File > New connection. Что примечательно, тут не нужны никакие кнопки Send, просто жмём клавишу <h> клавиатуры (язык раскладки должен быть английским) и сразу же получаем результат выполнения команды — гудок. Попробуйте, Tera Term понадобится и на следующих этапах, с её помощью управлять роботом намного удобнее и интереснее. Этап 2. Проверяем моторы, создаём блоки управления На этом этапе добавим возможность управления моторами, а заодно создадим блок для короткого перемещения по прямой, он нам понадобится. Блок подготовки дополним блоком выбора мощности. 1. Соберите скрипты по образцу на рис. 6.18, внесите изменения в блок . У вас уже достаточно опыта, чтобы разобраться в создании новых блоков и переменных. Обратите внимание, что мотор на портах D4, D5 (правый) должен у нас крутиться в прямом направлении, а на портах D6, D7 (левый) — в обратном. 2. Загрузите программу в контроллер робота (Upload). 3. Теперь у нас появилось два управляющих сигнала. Команда «h» вызывает гудок, а «m» приводит робота в движение. Используйте любой понравившийся способ передачи сигналов по последовательному порту. 216 Глава 6
Рис. 6.18. Появляется блок управления моторами 4. Подберите такую мощность, чтобы робот ехал неспешно, но уверенно, и за 0.2 секунды успевал пересечь линию разметки поля. Этап 3. Определяем перекрёсток Дополним предыдущую программу новым блоком, реализующим важную команду перемещения по разметке до следующего перекрёстка. После достижения перекрёстка робот должен ещё чуть-чуть проехать вперёд, чтобы иметь возможность повернуться на 90° и попасть при этом снова на линию. Мы будем использовать в скрипте прямое чтение значений портов микроконтроллера, к которым подключены сенсоры датчика линии. На рис. 6.19 представлены измененные ( блоки проекта. ) и новые 1. Внесите изменения и дополнения в программу предыдущего этапа. 2. Загрузите программу в контроллер. 3. Поставьте робота на линию, отправьте команду «f» для движения с определением перекрёстка. Попробуйте подобрать такие параметры мощности двигателей и времени проезда, чтобы задние колёса робота остановились на биссектрисах прямых углов, которые образует разметка. Тогда при дальнейшем повороте вокруг правого или левого колеса робот снова окажется на разметке именно тогда, когда повернёт ровно на 90°. Вы готовы экспериментировать? 217
Во время этих проб кабель, связывающий робота с компьютером, уже начнёт мешать. Если вы не боитесь экспериментировать, лучше использовать комплект беспроводной связи из набора робота, но MindPlus для этого не подойдёт (помните — разница в скоростях передачи). Поэтому после загрузки программы в контроллер придётся закрыть соединение в среде MindPlus и отсоединить кабель, а затем подключить комплект беспроводной связи и установить соединение из утилиты Tera Term. Рис. 6.19. Вводим блоки определения перекрестка 218 Глава 6
Этап 4. «Кругом марш!» Следующим шагом реализуем разворот на 180°. Он будет осуществляться против часовой стрелки с вращением обоих колёс. Новый блок и соответствующие изменения скрипта проекта показаны на рис. 6.20. 1. Внесите изменения и дополнения в программу предыдущего этапа, загрузите в контроллер. 2. Поставьте робота на линию, отправьте команду «f» для движения с определением перекрестка. Теперь отправьте команду «u», робот должен развернуться на 180° и вновь оказаться на линии. Можно попробовать чередовать команды так, чтобы робот доезжал до перекрёстка, разворачивался на месте и ехал назад. Обратите внимание, центр вращения робота не совпадает с центром перекрёстка. В подобном решении есть как свои недостатки, так и свои преимущества. В частности, голова робота находится ближе к центру перекрёстка. Если в будущем захочется усложнить данный проект, можно будет вращать головой робота, чтобы он мог осмотреться и оценить, какие пути открыты, а какие перегорожены препятствиями. Рис. 6.20. Блок разворота на 180° и изменённый скрипт проекта Вы готовы экспериментировать? 219
Этап 5. «Поворот налево» Добавляем левый поворот вокруг левого колеса. Дополнения к проекту и изменённый скрипт показаны на рис. 6.21. Проверьте работу программы. После поворота робот должен оказаться сориентированным вдоль линии разметки без существенного отклонения. При необходимости скорректируйте настройки: мощность моторов и время про. езда по прямой в блоке Рис. 6.21. Блок левого поворота и изменённый скрипт проекта Этап 6. «Теперь направо!» Добавляем правый поворот. Попробуйте самостоятельно, ориентируясь на и его описание, добавьте блок в оспредыдущий этап, создать блок новной скрипт проекта, символ управления конечно же «r». На всякий случай напомним — при необходимости самопроверки можно загрузить файл этапа из электронного архива проекта. 220 Глава 6
Проверьте программу в работе. Если всё правильно, теперь возможно осуществить такую последовательность манёвров: вперёд, направо, разворот, налево, вперёд. Этап 7. «Доклад о маршруте» А теперь научим робота не просто действовать согласно полученным командам, но и запоминать осуществлённые действия и докладывать о них по нашему запросу. Большое достоинство среды MindPlus заключается в том, что в ней можно использовать списки при создании программ автономной работы. Это позволяет реализовать множество интересных проектов. Конечно, и списки, и массивы можно обрабатывать в среде mBlock 3 при помощи наших расширений Рис. 6.22. Блок say_path и изменённый скрипт проекта Вы готовы экспериментировать? 221
(AdvancedArduino, List256), но в MindPlus поддержка списков встроена непосредственно в среду программирования, её обеспечили сами разработчики, и к ним всегда можно обратиться при возникновении тех или иных вопросов. На рис. 6.22 показаны новый блок для вывода записей списка отработанных роботом команд и изменённый скрипт проекта. Внесите требуемые изменения и попробуйте вновь покомандовать роботом. Как и раньше, лучше использовать Tera Term. А после того как робот выполнит ваши команды, запросите список выполненных команд, послав в контроллер команду «s». И прямо в терминале Tera Term вы увидите все свои команды, ранее отданные роботу (пример — на рис. 6.23). Рис. 6.23. Список отработанных команд выводится в окно Tera Term Послесловие к проекту Списки — очень мощный инструмент, который можно использовать во множестве сложных проектов. Например, можно научить робота проезжать маршрут, ориентируясь на список, полученный им ранее в ручном режиме управления или полученный в результате автоматического определения препятствий и их объезда. А можно научить робота возвращаться по наиболее короткому маршруту, проведя анализ списка движений и автоматически оптимизировав его (попробуйте самостоятельно доработать таким образом предыдущий проект). А если продолжать развивать тему использования MindPlus, то стоит упомянуть, что в эту среду встроена поддержка AI-камеры HuskyLens, умеющей распознавать лица и разнообразные объекты, а также передавать контроллеру информацию об их координатах и других характеристиках. Есть и программные расширения для машинного обучения и создания собственных нейронных сетей. Не перестаём повторять: то, что среда программирования визуальная, не означает, что она годится лишь для «детских» проектов! 222 Глава 6
Проект 32. «Навигатор в лабиринте» Введение в проект Вот мы и подошли к заключительному проекту. В качестве последнего «бонуса» предлагаем познакомиться с демонстрацией возможностей имитационного моделирования в среде Snap4Arduino. Мы уже упоминали о том, что она замечательно для этого подходит. Зачем нужно имитационное моделирование? Во-первых, это позволяет заниматься робототехникой, даже не имея своего настоящего робота. Во-вторых, в виртуальной среде можно отрабатывать сложные решения до переноса на реальную конструкцию, ведь намного проще экспериментировать и вводить поправки в виртуальном пространстве. В-третьих, в мире программирования есть масса интересного и помимо программирования именно робототехнических наборов. Используя навыки имитационного моделирования, можно создавать реалистичные игры, а также модели различных устройств и процессов, моделировать физические явления. В предложенной демонстрации наш виртуальный робот будет передвигаться по лабиринту. Использовать будем готовый проект из электронного архива. Приступаем к работе 1. Запустите среду Snap4Arduino. 2. Откройте (загрузите) файл навигатор_в_лабиринте_(демо).xml из электронного архива проекта. 3. Переключитесь в категорию Переменные, поставьте галочку у переменной _путь. 4. Для удобства лучше увеличить размер сцены (рис. 6.24, потянуть за штрихи слева вверху сцены). Измените размер окошка переменной так, чтобы оно не загораживало лабиринт, но при этом было больше в высоту. 5. Опробуйте блоки перемещения ( , , , ), щёлкая по ним (рис. 6.25). Посмотрите на окно переменной. Переменная _путь хранит список координат ячеек, он пополняется при перемещениях виртуального робота. Перемещения будут быстрее, если выбрать в меню турборежим. Вы готовы экспериментировать? 223
Рис. 6.24. Расположение окна переменной _путь Рис. 6.25. Окно переменной _путь отображает список перемещений робота 6. Щёлкните по блоку , возвращающему систему в первоначальное состояние. 7. Щёлкните по первому скрипту из трёх блоков (рис. 6.26). Рис. 6.26. Скрипт осмотра лабиринта 224 Глава 6
Начинается довольно длительный процесс осмотра. Робот осматривает лабиринт, а по завершении отображает пройденный путь, дополненный теми перемещениями, которые он имел возможность совершить, но не стал этого делать за ненадобностью. Таким образом, отмечены все возможные проезды. 1. Спрячьте значение _путь и теперь поставьте галочки у переменных _ячейки и _узлы. Пока там пусто. . Окошки переменных 2. Щёлкните по блоку на­полнились значениями. Теперь мы знаем, из каких ячеек и узлов лабиринт состоит. 3. Наш виртуальный робот подготовился к работе, он знает лабиринт, его ячейки и узлы и готов ехать в любую из заданных точек. Щёлкните по нижнему главному скрипту (рис. 6.27, слева: «переслать, непрерывно…»). Теперь при перемещении курсора мыши по сцене бегает маркер. Щёлкните маркером по произвольной точке лабиринта — туда едет робот (рис. 6.27, справа). Рис. 6.27. Робот едет в указанную точку по короткому маршруту 4. Спрячьте _узлы и _ячейки, далее при работе программы они не меняются и нам не интересны. Любопытно проверить, как меняются _маршрут и _ волновая_модель_распространения. Первое — список. Второе — список, содержащий списки. Щёлкая мышью — курсором (при запущенном скрипте «переслать, непрерывно…») по разным ячейкам лабиринта, можно понаблюдать, как выстраиваются и отображаются маршрут и волновая модель распространения (рис. 6.28). Вы готовы экспериментировать? 225
Рис. 6.28. Робот едет в указанную точку, отображаются маршрут и волновая модель распространения Чтобы рассмотреть всё подробнее, лучше переключиться в режим «сцена на весь экран». Нажатием клавиши <Пробел> можно тормознуть все скрипты, полюбоваться, сделать скриншот. Правда, придётся перезапускать всё, но это не проблема. В конце концов, программу можно собрать из кусочков в одно . целое, причём использовать блок Да, кстати, вполне естественно, что лабиринты можно подклеивать любые, в том числе и собственные. Лабиринты меняются блоком . Для создания изображений лабиринтов можно использовать проект Редактор_полей.xml из электронного архива и графический редактор. Послесловие к проекту Чтобы научить реального робота подобным возможностям, много чего потребуется освоить. И намного проще это сделать на виртуальном роботе. Потом потребуется повозиться с настройкой реального робота, натренировать его на те же действия. Зато можно будет наслаждаться, наблюдая, как реальный робот бегает по полигону, изучая его, на экране компьютера появляется карта, мы указываем точку, на карте отображается маршрут, и оба робота побегут исполнять наши команды. 226 Глава 6
Само собой, можно заставить виртуального робота бегать не только по лабиринту, но и по чёрно-­белой разметке, подобной той, что входит в комплект с нашим роботом. Но эти проекты уже выходят за рамки нашей книги. К сожалению, мы все же ограничены в объёмах. Но вы вполне можете продолжить эксперименты самостоятельно, используя разработки из книги в качестве основы. Это и было нашей целью — познакомить вас с огромными возможностями, предоставляемыми современным миром робототехники и блочного программирования исследователям любого возраста. Дерзайте, пробуйте, и всё обязательно получится! ЗАКЛЮЧЕНИЕ 227
Заключение Вот и закончилось наше совместное путешествие в мир программирования мобильных роботов. Очень надеемся, что оно оказалось увлекательным, мы старались. В эту книгу, которую можно было бы назвать «Энциклопедия проектов для детей от 9 до 99 лет», вошли лучшие проекты, придуманные в «Лаборатории проектов 169» за несколько лет. И, если вы добрались до послесловия, имея за спиной все выполненные проекты из этой книги, — замечательно, вы переходите на новый уровень! Впереди новые открытия! Мы познакомили вас лишь с частью огромных возможностей, предоставляемых миром современной робототехники исследователям любого возраста. Дерзайте, пробуйте, создавайте свои оригинальные конструкции, делитесь своими разработками в творческих сообществах, и кто знает, возможно, именно ваши открытия принесут пользу всему человечеству! Если вам интересны другие работы авторов, заглядывайте к нам на сайт lab169.ru, там всё время появляются новые проекты. До встречи! 228 ПРИЛОЖЕНИЕ
Приложение. Дополнительные проекты Проект «Готовность! Тестируем систему» Введение в проект Этот проект — интерактивный и полностью готовый. Его предназначение — тестирование аппаратной части робота. Как мы уже неоднократно отмечали, наши проекты можно использовать с различными роботами, собранными с использованием разных электронных блоков. Но для того чтобы в проектах ничего не надо было менять, конфигурация оборудования должна быть однотипной. Мы тестировали проекты на роботах c контроллерами от компаний MakeBlock (mCore) и Lafvin, а также собрали полностью подходящий комплект на основе контроллера Arduino MEGA 2560 и даже создали для последнего специальное расширение, позволяющее использовать все проекты без изменения рисунков со скриптами. Набор возможностей наших роботов — фактически уже базовый, минимально необходимый для учебного Arduino-­робота, и многие производители делают своих собственных роботов так, чтобы они изначально имели подобный набор функций. Но на какой бы основе не был собран робот, после сборки его стоит проверить, правильно ли функционируют все системы и совпадает ли конфигурация (контакты соединения и так далее) с базовой для книги. Именно с этой целью был создан специальный проект тестирования, с помощью которого мы и проверим работу основных функций — робот будет пищать зуммером, мигать светодиодами, замерять освещённость фоторезистором и выполнять другие действия. По сути, это набор мини-проектов для тестирования в стиле «нажали на кнопку, на экране персонаж Панда нам сообщила о текущих этапах или состоянии проверки, робот зажёг огни на секунду, подвигался и так далее». Во всех мини-проектах предусмотрены параллельные реакции на одно и то же событие у персонажа на сцене и у робота. ДОПОЛНИТЕЛЬНЫЕ ПРОЕКТЫ 229
Приступаем к работе 1. Запустите среду mBlock. 2. Настройте среду mBlock. Должна быть выбрана плата mBot (mCore) и загружено расширение simpleBot, далее используем именно его. (Подробное описание настройки среды mBlock, выбора платы и загрузки расширений, а также о соединении робота с компьютером читайте в главе 2.) 3. Соедините робота с компьютером, настройте соединение с mBlock. Загрузите в контроллер стандартную немодифицированную прошивку (Соединить > Обновить прошивку) для работы в интерактивном режиме управления. 4. Загрузите из электронного архива проекта «Тестирование» файл проекта тест_аппаратной_части.sb2 (Файл > Загрузить проект). 5. Запустите проект на выполнение (щелчок по зелёному флажку). 6. Следуя подсказкам Панды, проведите проверку оборудования. Наблюдайте за значениями и рекомендациями персонажа, следите за реакциями робота. Для проверки работы отдельных датчиков можно просто щёлкать по соответствующим блокам в категории Данные и Блоки и наблюдать за подсказками спрайта Панды. Arduino IDE. Плоттер по последовательному соединению. Рисуем графики! Для программирования контроллера робота мы использовали блочную среду mBlock. Это удобно по множеству причин, но существуют и другие средства программирования. И в первую очередь отметим инструмент, изначально созданный для работы с микроконтроллерами семейства Arduino — Arduino IDE. Программирование — в текстовом виде, язык программирования основан на C/C++. Если вас стесняют рамки Scratch-­подобных сред, можно будет перей­ ти в Arduino IDE и продолжить разработку на классическом языке программирования. Кстати, подсоединив к Arduino IDE библиотеки MakeBlock, вы сможете 230 ПРИЛОЖЕНИЕ
использовать и другие продукты этой компании, в числе которых множество электронных модулей и контроллеров. Arduino IDE одной из последних версий (например, 1.8.13) предоставляет много интересных инструментов, среди которых Плоттер по последовательному соединению, предназначенный для динамического построения графиков, отображающих изменение данных, передаваемых по последовательному порту. Эту информацию можно использовать для отладки проектов, а также для иллюстрации процессов обработки данных. Далее мы рассмотрим, как установить Arduino IDE и использовать основные инструменты. На одном компьютере можно иметь несколько разных версий Arduino IDE, например 1.6.5 в составе mBlock и отдельно 1.8.13. Каждая из версий должна быть установлена в отдельную папку. Месторасположение по умолчанию встроенной в mBlock версии Arduino IDE 1.6.5 — C:\Program Files (x86)\ mBlock\Arduino. Загрузка и установка Arduino IDE Программа написана под свободной лицензией и бесплатна для загрузки и использования. Страница загрузки — https://www.arduino.cc/en/software. Требуется выбрать вариант дистрибутива для вашей операционной системы. В нашем варианте это Windows Win 7 and newer. На странице загрузки можно поддержать разработчиков финансово (добровольная функция), но можно и просто бесплатно загрузить последнюю версию программы, нажав Just download. После загрузки программу надо установить (просто запустить файл на выполнение, все настройки можно оставить по умолчанию). Настройка программы Arduino IDE для работы с контроллером вашего робота или другого устройства 1. Запустите программу Arduino IDE. 2. Перейдите в меню Инструменты > Плата, проверьте настройку. Для набора к книге выберите Arduino Uno (или Arduino Mega or Mega 2560, если вы используете такую плату), рис. П1. ДОПОЛНИТЕЛЬНЫЕ ПРОЕКТЫ 231
Рис. П1. Выбор типа микроконтроллера в среде Arduino IDE 3. Теперь надо настроить порт соединения. Очень похоже и на наши настройки mBlock перед работой с контроллером, не правда ли? Перейдите в меню Инструменты > Порт, выберите тот же порт соединения, который вы используете для своего робота в mBlock (рис. П2). Вн и ман и е! Для работы с Arduino IDE робот не должен быть соединен с другими средами, порт должен быть свободен. Если ранее вы соединились с mBlock — отсоединитесь, а уже потом соединяйте робота с Arduino IDE. 232 ПРИЛОЖЕНИЕ
Рис. П2. Выбор коммуникационного порта в среде Arduino IDE Инструменты для работы с последовательным портом Теперь можно посмотреть, какие данные идут по последовательному порту от вашего контроллера (разумеется, если он настроен в настоящее время их передавать). Рис. П3. Окно монитора порта с настройками скорости соединения ДОПОЛНИТЕЛЬНЫЕ ПРОЕКТЫ 233
1. Для этого справа, под строкой меню, нажмите кнопку Монитор порта. Если всё правильно, вы увидите отдельное окно с прокручивающимися (стоит галочка Автопрокрутка) данными (рис. П3). Такие данные вы уже видели, когда настраивали окно терминала mBlock на работу с последовательным портом. Обратите внимание, что здесь можно легко настраивать и скорость передачи вашего канала связи, что может помочь в случаях, когда вы используете альтернативные (иные, чем мы использовали в данной книге) платы коммуникации. 2. Закройте окно Монитора порта (все то же — нельзя одновременно использовать данные для нескольких инструментов). Теперь посмотрим, какие графические данные может нарисовать графопостроитель — плоттер на основе идущих от робота данных. Перейдите в Инструменты > Плоттер по последовательному соединению. Теперь вы видите графическую интерпретацию поступающих данных в текущем времени (рис. П4). Рис. П4. Окно плоттера по последовательному соединению На иллюстративной картинке плоттер отображает ситуацию, когда перед инфракрасным датчиком быстро проносят тонкий предмет (карандаш). 234 ПРИЛОЖЕНИЕ
Некоторая проблема в том, что нельзя записать показания и графики для последующего просмотра, но и это можно решить, используя сторонние инструменты. А нам для анализа происходящих явлений достаточно и такого, в реальном времени, отображения событий. Проект «Демонстрация» Введение в проект Можно использовать для проверки функционирования робота после сборки. Многие производители снабжают своих роботов демо-прошивкой, которая позволяет увидеть возможности робота ещё до того, как полноценно освоено его программирование. Это здорово, когда только что собранный робот демонстрирует свои возможности и позволяет поиграть с собой даже самым юным конструкторам! Вот и мы решили снабдить робота такой программой. В ней реализуются четыре демонстрационных режима — езда с ручным управлением и выбором скорости при помощи инфракрасного пульта или Arduino-­пульта; езда с уклонением от препятствий (с поворотом головы); следование по широкой линии (причём с первоначальным поиском линии поворотом вокруг оси и автоопределением цвета линии и типа подключенного сенсора линии, чтобы всё работало с разными сенсорами линии, а также и на вариантах трассы «чёрное на белом» и «белое на чёрном»); следование по узкой линии с остановками на перекрёстках. Для использования программы надо уметь как минимум открывать готовые файлы проектов в среде mBlock, настраивать проводное соединение с роботом и загружать программы в режиме Arduino mode. Все это есть в первых главах книги. Выбор режима демонстрации производится с помощью кнопки на роботе: короткое нажатие кнопки контроллера меняет режим (меняется цвет светодиодов), длинное нажатие запускает на исполнение. Приступаем к работе 1. Запустите среду mBlock 2. Загрузите файл demo.sb2 из электронного архива проекта. 3. Настройте соединение робота с компьютером. ДОПОЛНИТЕЛЬНЫЕ ПРОЕКТЫ 235
4. Загрузите программу в контроллер робота в режиме Arduino mode. 5. Отсоедините робота от компьютера. Он готов к демонстрации. 6. Начнём с первого режима (потребуется комплектный, инфракрасный пульт из комплекта или любой подходящий). Нажмите один раз на кнопку робота, мигающие огни светодиодов покажут, что он готов к выполнению задачи. Запомните цвет светодиодов на первом варианте выбора. Длинным нажатием клавиши запустите первый режим на выполнение. 7. Управляйте роботом с помощью пульта (в нём должна быть действующая батарейка). Справка Команды пульта. Выбор одного из трех автоматических режимов осуществляется верхними тремя кнопками пульта (обычно обозначены как «А», «В», «С» или «K», «L», «M»). Переключение на ручное управление — любые цифровые кнопки (кроме нуля) либо английские строчные символы q, w, e, a, s, d, z, x, c. Увеличение и уменьшение мощности — кнопки «+» и «–» (стандартный пульт), или «стрелка влево» и «настройки» (пульт Makeblock) либо символы u и i (английские строчные). 8. Попробуйте другие демо-режимы. Короткое нажатие кнопки остановит текущую демонстрацию и вновь предложит выбрать режим. Короткими нажатиями можно передвигаться по режимам (ориентируйтесь на цвет светодиодов), длинным — запускать программу на исполнение. Отслеживание команд на последовательном порту позволяет реализовать управление c джойстик-­шилда (см. проект 29 «Пульт дистанционного управления. Осваиваем MindPlus», посвящённый программированию джойстик-­шилда в среде MindPlus). Блок _geekServo своими силами Если вы хотите понять, как работает блок , попробуйте реализовать его аналог самостоятельно (рис. П5). Скрипт на рис. П5 создан с использованием расширения AdvancedArduino в среде mBlock 3, но вы можете перенести данный алгоритм в среду Mind+, Snap4Arduino или любую другую. 236 ПРИЛОЖЕНИЕ
Рис. П5. Определение самостоятельно реализованного аналога блока _geekServo Аппаратная конфигурация робота Подключаемое оборудование Последовательное соединение Инфракрасный канал связи, приёмник Инфракрасный канал связи, передатчик Драйвер правого двигателя (направление, мощность) Драйвер левого двигателя (направление, мощность) Зуммер Датчик линии (левый, центральный и правый сенсоры) Адресные RGB-светодиоды Инфракрасный дальномер Ультразвуковой дальномер Сервомотор Датчик освещённости Программная кнопка Гироскоп ДОПОЛНИТЕЛЬНЫЕ ПРОЕКТЫ Используемые порты D0, D1 D2 D3 D4, D5 D7, D6 D8 D11, A2 (D16), D12 D13 A0 A1 (D15) A3 (D17) A6 A7 (D21) SDA, SCL 237