Содержание
Введение
Юным конструкторам-изобретателям
Условные обозначения
Электронный архив
Глава 1. Спрайты, скрипты, черепахи и другие жители виртуального мира в Scratch
Знакомьтесь — это Scratch!
«Черепашья графика»
Собственные блоки для очень сложных узоров
Проект «Спираль из квадратов»
Справочная система Scratch и проекты «Шаг за шагом»
Глава 2. Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock
Arduino — это просто!
Scratch для Arduino? Знакомьтесь — mBlock!
Основы работы с Arduino в mBlock
Подключение внешних светодиодов к плате Arduino Uno
Расширенные возможности цифровых портов Arduino
Макетная плата — инструмент для творческого конструирования
Обычная кнопка — пример цифрового датчика
Аналоговые датчики
Возможности сложных цифровых датчиков
Глава 3. Придумываем, конструируем, играем! Arduino + mBlock = креативные игры!
Компьютерные игры — простор для творчества!
Проект «Голодная рыбка» версия 1
Проект «Голодная рыбка» версия 2
Проект «Голодная рыбка» версия 3
Проект «Голодная рыбка» версия 4
Глава 4. «Умный домик». Автономный проект с платой Arduino
Собираем электрическую схему «умного домика»
Проект «Умный домик» версия 1
Проект «Умный домик» версия 2
Как вернуть возможность управлять Arduino интерактивно с использованием среды mBlock?
Глава 5. Новые горизонты. Проекты продвинутого уровня для энтузиастов
Несколько слов о расширениях для среды mBlock
Установка расширений для среды mBlock
Проект «Программируемая новогодняя гирлянда»
Проект «Автоматический переезд»
Проект «Полноцветная иллюминация»
Всё чудесатее и чудесатее!  Добавление возможностей в интерактивные проекты заменой прошивки
Игровой проект «Ловкий динозаврик» с использованием джойстика-шилда
Заключение
Полезные книги
Приложение. Содержание электронного архива
Фрагмент проекта «Собачка с мячом». Используем потенциометр. Программируем вращение баскетбольного мяча
Text
                    
САНКТ-ПЕТЕРБУРГ «БХВ-ПЕТЕРБУРГ» 2022
УДК 004.43-053.2 ББК 32.973.26-018.1 В48 Винницкий, Ю. А. В48 Scratch и Arduino для юных программистов и конструкторов. — 2-е изд., перераб. и доп. / Ю. А. Винницкий, А. Т. Григорьев. — СПб.: БХВ-Петербург, 2022. — 232 с.: ил. ISBN 978-5-9775-0952-7 Книга написана на основе опыта работы с детьми 3–11 классов и посвящена творческим проектам юных программистов и конструкторов. На примере алгоритмов черепашьей графики и простых компьютерных игр дети познакомятся с креативным программированием в визуальной среде Scratch. Рассмотрено применение плат Arduino, плат расширения и различных внешних датчиков в конструкторских проектах начального уровня. Даны основы визуального программирования этих устройств в среде mBlock в двух режимах, интерактивном и автономном, путем написания интерактивных компьютерных игр, в которых управление персонажем осуществляется посредством Arduino-консоли, а также при помощи создания автономных «умных вещей», работающих под управлением Arduino без подключения к компьютеру. Второе издание дополнено проектами продвинутого уровня. Электронный архив на сайте издательства содержит дополнительные материалы и листинги всех программ. Для детей младшего и среднего школьного возраста УДК 004.43-053.2 ББК 32.973.26-018.1 Группа подготовки издания: Руководитель проекта Евгений Рыбаков Зав. редакцией Людмила Гауль Компьютерная верстка Людмилы Гауль Корректор Анна Брезман Дизайн обложки Зои Канторович «БХВ-Петербург», 191036, Санкт-Петербург, Гончарная ул., 20. ISBN 978-5-9775-0952-7 © Винницкий Ю. А., Григорьев А. Т., 2022 © Оформление. ООО «БХВ-Петербург», ООО «БХВ», 2022
Содержание ВВЕДЕНИЕ ..................................................................................................................................7 ЮНЫМ КОНСТРУКТОРАМ-ИЗОБРЕТАТЕЛЯМ: ВРЕМЯ СОЗДАВАТЬ БУДУЩЕЕ!........................................................................................ 9 ГЛАВА 1. СПРАЙТЫ, СКРИПТЫ, ЧЕРЕПАХИ И ДРУГИЕ ЖИТЕЛИ ВИРТУАЛЬНОГО МИРА В SCRATCH ......................................................... 12 Знакомьтесь — это Scratch!.......................................................12 «Черепашья графика»..............................................................17 Собственные блоки для очень сложных узоров ...............25 Проект «Спираль из квадратов» ............................................29 Справочная система Scratch и проекты «Шаг за шагом» .....................................................37 ГЛАВА 2. ЗНАКОМИМСЯ С КОНТРОЛЛЕРАМИ ARDUINO И УЧИМСЯ ПРОГРАММИРОВАТЬ ИХ В СРЕДЕ MBLOCK ................. 41 Arduino — это просто! ................................................................41 Scratch для Arduino? Знакомьтесь — mBlock! ......................44 Основы работы с Arduino в mBlock .......................................47 Подключение внешних светодиодов к плате Arduino Uno ...................................................................57 Расширенные возможности цифровых портов Arduino.......................................................67 Макетная плата — инструмент для творческого конструирования .......................................................................72 СОДЕРЖАНИЕ 3
Обычная кнопка — пример цифрового датчика ...............82 Аналоговые датчики.................................................................89 Возможности сложных цифровых датчиков .....................98 ГЛАВА 3. ПРИДУМЫВАЕМ, КОНСТРУИРУЕМ, ИГРАЕМ! ARDUINO + MBLOCK = КРЕАТИВНЫЕ ИГРЫ! ......................................107 Компьютерные игры — простор для творчества! ........... 107 Проект «Голодная рыбка» версия 1: управление клавишей <Пробел> ...................................... 108 Проект «Голодная рыбка» версия 2: управление с Arduino с помощью кнопки...........................126 Проект «Голодная рыбка» версия 3: оптимизация программы .................................................... 127 Проект «Голодная рыбка» версия 4: модификация программы, создание новых вариантов игры ............... 133 ГЛАВА 4. «УМНЫЙ ДОМИК». АВТОНОМНЫЙ ПРОЕКТ С ПЛАТОЙ ARDUINO ...................................................................................... 139 Собираем электрическую схему «умного домика» .................................................................... 140 Проект «Умный домик» версия 1 ....................................... 145 Проект «Умный домик» версия 2: автономная работа ................................................................ 156 Как вернуть возможность управлять Arduino интерактивно с использованием среды mBlock? ........... 166 ГЛАВА 5. НОВЫЕ ГОРИЗОНТЫ. ПРОЕКТЫ ПРОДВИНУТОГО УРОВНЯ ДЛЯ ЭНТУЗИАСТОВ ..................................................................................... 168 Несколько слов о расширениях для среды mBlock ........ 168 Установка расширений для среды mBlock ....................... 169 Проект «Программируемая новогодняя гирлянда» ................................................................................. 173 4 СОДЕРЖАНИЕ
Проект «Автоматический переезд» .................................. 188 Проект «Полноцветная иллюминация» ........................... 196 Всё чудесатее и чудесатее! Добавление возможностей в интерактивные проекты заменой прошивки ................................................................ 204 Игровой проект «Ловкий динозаврик» с использованием джойстика-шилда ............................... 207 ЗАКЛЮЧЕНИЕ..................................................................................................................... 223 ПОЛЕЗНЫЕ КНИГИ ..............................................................................................................224 ПРИЛОЖЕНИЕ. СОДЕРЖАНИЕ ЭЛЕКТРОННОГО АРХИВА ...............................225 Фрагмент проекта «Собачка с мячом». Используем потенциометр. Программируем вращение баскетбольного мяча. .............................................225 СОДЕРЖАНИЕ 5
Введение Scratch — популярнейший визуальный язык программирования, который идеально подходит для обучения детей от 8 лет, позволяет создавать творческие проекты, в непринуждённой игровой форме осваивать алгоритмизацию и программирование, развивать техническое мышление и инженерные навыки. Arduino — самый распространённый микроконтроллер для создания электронных самоделок. Маленькая печатная плата совершила настоящую революцию в мире технического творчества, придав новый импульс развитию робототехники и конструирования. Программирование и использование микроконтроллеров перестало быть уделом избранных. А с появлением графических средств разработки на основе Scratch обучить Arduino выполнению нужной работы стало ещё проще. Грядёт новая революция — программирование микроконтроллеров становится доступным не только взрослым, но и детям! Хотите попробовать? В ваших руках книга, в которой Scratch и Arduino объединяются в общих творческих проектах. Книга написана опытными преподавателями, в её основе — многолетний опыт практических занятий с детьми. Материалы предложены в игровой форме и занимательных проектах, с которыми интересно разбираться и детям, и взрослым, так что совместное техническое творчество может стать занимательным и полезным семейным досугом. Всё что для этого нужно — книга, домашний компьютер и небольшой набор распространённых деталей. Шаг за шагом авторы проведут вас в мир программирования и конструирования: • глава 1 позволит получить основные навыки работы в визуальной среде Scratch с помощью рисования и компьютерной графики; • глава 2 познакомит читателей с первыми Arduino-проектами, использующими подключаемые электронные компоненты; • глава 3 даст юным изобретателям возможность почувствовать себя в роли программистов-разработчиков компьютерных игр, получить ВВЕДЕНИЕ 7
навыки отладки и модификации компьютерных программ, а также собрать на основе Arduino оригинальные игровые приставки; • глава 4 продемонстрирует технологии «умного дома» на примере создания устройства, работающего в автономном режиме и управляющего осветительными приборами; • глава 5 предназначена для самых увлечённых исследователей и позволит им создать проекты повышенного уровня сложности с помощью усовершенствованных программных инструментов. А дальше... дальше открывается огромный мир возможностей. Роботы, квадрокоптеры, 3D-принтеры, манипуляторы, «умные вещи» и игровые проекты — лишь небольшой перечень путей дальнейшего развития. Главное — увлечь, показать, научить сделать первый шаг. И мы очень надеемся, что эта книга станет хорошим проводником в этот замечательный мир творчества. Не зря в ближайшие годы инженерное образование и техническое творчество подрастающего поколения будут являться особо важной сферой для дальнейшего технологического развития нашей страны. Нужно растить инженеров, конструкторов, изобретателей, создавать своё будущее! 8
Юным конструкторам-изобретателям: время создавать будущее! Привет, наши юные читатели! Возможно, вам захочется пропустить это введение, чтобы побыстрее начать экспериментировать, сочинять компьютерные игры и собирать электронные самоделки. Мы вполне разделяем это стремление, ведь именно для тех, кто любит создавать что-то новое, книга и написана. Но, тем не менее, считаем важным рассказать, что побудило нас взяться за неё. Мы живём в интересное время. Нас окружают технические чудеса, о которых писатели-фантасты совсем недавно могли лишь мечтать. В руках почти у любого человека можно увидеть смартфон. Задумайтесь: это же миниатюрный компьютер, несопоставимо более мощный, чем тот, что использовался для расчёта траектории полёта первых космических кораблей и занимал целый этаж. Никого уже не удивляют домашние роботы-пылесосы или системы автоматической парковки в автомобилях. Мы привыкаем к чудесам и порой даже не задумываемся над тем, как же создаются разные технические диковинки, какой путь проходит изобретение от возникновения идеи до воплощения её в привычный всем бытовой прибор. Но, раз вы читаете эту книгу, вряд ли подобные вопросы вам безразличны. И это здорово! Перед вами открывается огромная сказочная страна! Здесь будет своё волшебство — техническое, будут и специальные магические слова — программные команды, будут виртуальные существа и забавные устройства, выполняющие наши приказы. И происходить всё будет не только в воображении и на экране компьютера. Добро пожаловать в мир конструирования и творчества, инженеры будущего! Вам потребуются знания, упорство и смелость мысли. Да-да, смелость! Ведь для того чтобы отказаться от обыденного и сделать нечто по-настоящему новое, нужна именно она. Подумайте, как непросто было создателям самых привычных для нас с вами вещей. В 1975 году два друга — никому не известные студенты Билл Гейтс и Пол Аллен — прочитали опубликованную в журнале «Popular Electronics» («Популярная электроника») статью о появившейся новинке — персональном компьютере Altair 8800, продающемся в виде набора для сборки. Юным конструкторам-изобретателям: время создавать будущее! 9
Воодушевившись, они попытались написать для него программу — интерпретатор языка Basic, после чего и основали компанию Microsoft, в штате которой в первый год работы было всего 3 человека. А двое других друзей — Стив Джобс и Стив Возняк — примерно в то же время решили наладить собственное производство компьютеров. И 1 апреля 1976 года официально была основана компания Apple, а на рынке появился собранный вручную Apple Computer I. Может, вам кажется, что такие примеры перестали быть актуальными? Всё уже изобретено? Но посмотрите, сколько нового появилось только за последние годы! Взять хотя бы 3D-принтеры — устройства, создающие из пластиковой нити готовые предметы. Совсем недавно технология трёхмерной печати показалась бы фантастикой, теперь же 3D-принтером никого не удивишь. Его можно собрать даже в домашних условиях, и существуют специальные Apple Computer I наборы, включающие все необходимые детали и инструкции. Всё, как в далёких 1970-х годах с Altair 8800. История повторяется! Роботы, квадрокоптеры, 3D-принтеры и многие другие технические новинки стали доступны благодаря появлению микроконтроллеров, по сути — маленьких и дешёвых компьютеров, запрограммированных на порученную им работу. Современный размах использования микроконтроллеров впечатляет. Они способны управлять самыми разными электронными и механическими устройствами, повсеместно используются в средствах связи, современных автомобилях, производственных станках, в массовой домашней технике и даже в игрушках. Благодаря микроконтроллерам окружающие нас вещи становятся всё «умнее», а благодаря творческим идеям «умных» вещей становится всё больше. Сравнительно недавно в мире появилась замечательная программная среда Scratch, навсегда изменив представление о том, с какого возраста можно серьёзно заниматься программированием. А новые модификации программ на основе Scratch позволили даже детям программировать микроконтроллеры, 10
что раньше вообще невозможно было представить! И наша книга именно о том, как работать в этих доступных средах, как создавать новые электронные устройства на основе микроконтроллеров и программировать их на выполнение необходимой работы. Для того чтобы процесс был интереснее, мы будем создавать компьютерные игры и играть в них, используя необычные электронные устройства, от которых всего один шаг к самым настоящим «умным» вещам, например, пульту управления бытовыми приборами, контрольной системе для освещения. Читая книгу, вы можете сразу обращаться к страницам, на которых приведены программы в готовом для реализации виде, а можете пройти вместе с нами все шаги разработки, выступить в роли программиста и разобраться с каждым элементом проекта. Выбор за вами. Но главное — дерзайте, придумывайте, пробуйте, ошибайтесь и пробуйте вновь, создавая новое будущее. Ведь вполне вероятно, что именно ваше изобретение завоюет мир через несколько лет! Удачи! Условные обозначения Жирным шрифтом выделены элементы интерфейса программ — меню, команды, кнопки. Названия блоков программирования выделены так: . Названия переменных и параметров выделены узким жирным шрифтом. Названия клавиш клавиатуры заключены в угловые скобки, например <Пробел>. Электронный архив В электронном архиве, который можно скачать по ссылке https://zip.bhv. ru/9785977509527.zip или найти на странице книги на сайте издательства по адресу www.bhv.ru, сохранены файлы всех проектов, описанных в книге. Все проекты распределены по главам. Обратите внимание на то, что помимо финальных программ там расположены и промежуточные версии, по которым шаг за шагом можно проследить путь создания проекта. Таким образом, если что-то и пойдёт не так, как рассказывается в книге, можно заглянуть в архив и посмотреть, как должен был выглядеть результат на том или ином этапе разработки. Юным конструкторам-изобретателям: время создавать будущее! 11
Спрайты, скрипты, черепахи и другие жители виртуального мира в Scratch Знакомьтесь — это Scratch! Дорогие читатели! В следующих главах вы научитесь собирать разнообразные электронные устройства на базе контроллера Arduino и «оживлять» их с помощью интересных программ. Но, прежде всего, следует выбрать язык программирования, который мы будем использовать для этого. Юным исследователям более всего подходит программирование в среде Scratch, где программы (называемые сценариями) собираются из блоков, как из кубиков конструктора. Предлагаем вам познакомиться с этой средой и её основными возможностями. Откуда появилось название «Scratch»? Одни авторы утверждают, что своим названием программа обязана главному действующему персонажу, коту-царапке (рис. 1.1), так как в английском языке есть глагол to scratch, означающий «царапать». Кстати, персонажи в Scratch называются спрайтами. 12 Рис. 1.1. Спрайт кота ГЛАВА 1
Но есть и другие версии. Так, в американском варианте английского языка есть выражение to start from scratch — это значит «начать с самого начала (с основ)». И правда, Scratch и в нашем случае — начало, основа, с изучения которой вы войдёте в мир профессиональной разработки как будущие программисты, схемотехники, инженеры-конструкторы или технические дизайнеры. А по ещё одной версии название произошло от слова scratching — техники, используемой хип-хоп-диджеями, которые крутят виниловые пластинки взадвперёд руками, для того чтобы смешивать музыкальные темы. Выбирайте, какой вариант вам больше нравится! Где взять Scratch? Тут всё просто. Эта среда является представителем свободного программного обеспечения, то есть любой желающий может её использовать и даже модифицировать. Официальная страница проекта Scratch — https://scratch.mit.edu/. Зайдя на данный ресурс, вы увидите много (всего представлено более 20 миллионов) уже готовых программ-сценариев, созданных в сообществе Scratch, в состав которого и вы можете войти, воспользовавшись ссылкой Присоединяйся. Регистрация даст возможность хранить ваши новые сценарии в облаке Scratch, общаться с единомышленниками — изобретателями со всего мира. Для того чтобы попробовать программирование в среде Scratch, даже не обязательно загружать и устанавливать программу на компьютер, можно перейти на вкладку Создавай (рис. 1.2) и воспользоваться онлайн-версией программы. Этот вариант особенно удобен в случае, когда работать со Scratch приходится вдали от основного рабочего места, например, в дороге, с планшета. Для постоянного использования удобнее стационарное приложение, так называемый офлайн-редактор, который можно загрузить со страницы https:// scratch.mit.edu/download. Здесь размещена самая свежая, третья версия Scratch с рядом новых возможностей и новым внешним видом. Рис. 1.2. «Создавай» — переход к онлайн-версии Scratch Спрайты, скрипты, черепахи и другие жители виртуального мира в Scratch 13
Однако следует учитывать, что в проектах с контроллерами Arduino мы будем использовать программу, основанную на предыдущей, второй версии Scratch. Поэтому и в данной главе лучше работать с той же версией. Установить её можно, прокрутив страницу вниз, до раздела «Предыдущие версии» и щелкнув по ссылке Офлайн-редактор Scratch 2.0. Затем нужно последовательно загрузить и инсталлировать две программы: Adobe AIR и Scratch 2.0 Offline Editor для операционной системы своего компьютера (доступны версии для Windows и Mac OS). Совет для любознательных Возможно, кто-то предпочтёт свежую версию Scratch старой. Нет никаких проблем! Это будет даже интереснее, так как придётся исследовать новую среду самостоятельно, используя в качестве основы наши проекты. Вы легко освоитесь с работой в Scratch3. При этом учтите, что проекты в электронном архиве прекрасно выполняются как в предыдущей, так и в новой версии среды, то есть нет нужды изменять программы. Более того, на компьютер можно одновременно установить обе версии либо запускать Scratch 3 в онлайн-режиме (прямая ссылка — https://scratch.mit.edu/projects/editor). Запуск и начало работы После установки запустите среду Scratch, дважды щёлкнув по её значку на рабочем столе компьютера либо воспользовавшись главным меню операционной системы. Выберите язык, на котором вы будете общаться со Scratch, — щёлкните по значку глобуса в меню программы и, прокрутив длинный список, найдите русский язык (рис. 1.3). Сцена и персонажи на ней Взгляните на экран (рис. 1.4). Вот уже знакомый царапающийся персонаж — спрайт . Спрайт перемещается по специальной области экрана — сцене . В середине экрана программы находится окно блоков , которые мы будем перетаскивать в правую область , создавая программы (в терминологии Scratch — скрипты или сценарии). 14 ГЛАВА 1
Рис. 1.3. Выбираем язык общения с программой Рис. 1.4. Окно программы Scratch 2.0 Спрайты, скрипты, черепахи и другие жители виртуального мира в Scratch 15
Выбор блоков по цвету Все блоки распределены по группам-категориям и выделены разными цветами, поэтому очень просто собирать скрипты, которые представлены в нашей книге: посмотрите на цвет блоков, откройте соответствующую по цвету группу и выберите нужные блоки-команды. Координаты персонажа-спрайта Во время выполнения скриптов ваш спрайт будет перемещаться по сцене. Его текущие координаты (положение по осям x и y) отображаются в правом верхнем углу области скриптов (см. рис. 1.4). Команды вроде иногда вводят в заблуждение, ведь при их исполнении спрайт не собирается бодро шагать 10 человеческих шагов. Он их проходит, конечно, но под шагами подразумевается перемещение на указанное количество экранных точек, которых всего в окне сцены 480 по горизонтали (слева направо) и 360 по вертикали (снизу вверх). Точка с координатами (0, 0) находится в центре сцены, координаты X и Y могут быть положительными (когда персонаж перемещается вправо или вверх) и отрицательными (когда персонаж перемещается влево или вниз) — рис. 1.5. Рис. 1.5. Координаты на сцене Scratch 16 ГЛАВА 1
Ну вот, мы немного освоились, самое время приступать к программированию в этой замечательной среде. «Черепашья графика» Если вы успели закрыть Scratch, запустите программу вновь, разверните её окно на весь экран и вспомните, какие основные элементы среды Scratch мы уже рассмотрели. Сцена, спрайт, блоки, скрипты, координаты... Всё помните? Готовы продолжить? Тогда начнём... играть. Учиться программировать мы будем играя. А точнее — рисуя! Вам предстоит освоить «черепашью графику». При чём тут черепахи? Это забавное название «черепашья графика» (turtle graphics) появилось благодаря математику, программисту и психологу Се́ймуру Пе́йперту и инженеру Иди́т Харе́ль. Они изобрели язык программирования Logo и придумали для него особого исполнителя, имитирующего робота, вооружённого пером. Этот робот, и правда, двигается очень медленно, как черепашка. Зато старательно и аккуратно вырисовывает каждую чёрточку, жужжа моторами, поворачиваясь и переезжая с места на место (рис. 1.6). Рис. 1.6. Робот Sparki пишет своё имя В наших проектах вместо черепашки будут спрайты Scratch, а придумывать и программировать рисунки будете вы сами. Спрайты, скрипты, черепахи и другие жители виртуального мира в Scratch 17
Готовим черепашку После запуска Scratch у нас на сцене всё тот же спрайт-кот. Но рисовать с его помощью будет неудобно, кот большой и будет закрывать от нас часть рисунка. Удалим его и добавим из библиотеки спрайтов маленькую скромную стрелочку с именем Arrow1. Итак, щёлкните правой кнопкой мыши по спрайту кота и выберите команду удалить (рис. 1.7). Рис. 1.7. Удаление спрайта с помощью контекстного меню Щёлкните левой кнопкой мыши (далее — просто «щёлкните») по значку Выбрать спрайт из библиотеки (рис. 1.8). Откроется окно с библиотекой спрайтов. Щёлкните по значку Arrow1 (рис. 1.9), а затем нажмите кнопку OK. Рис. 1.8. Значок открытия окна библиотеки спрайтов 18 Рис. 1.9. Спрайт Arrow1 больше подойдёт для рисования ГЛАВА 1
На сцене появилась стрелочка, но даже она слишком велика. Предусмотрим её уменьшение, для этого служит блок из категории скриптов Внешность. Перетащите этот блок в область скриптов и вместо 100% введите, например, 20% (то есть у нас будет стрелка в 5 раз меньше). Нам понадобится ещё несколько блоков, в первую очередь (категория Перо), , , (категория Движение). Вытащите эти блоки в область пользовательских скриптов спрайта Arrow1 (рис. 1.10). Рис. 1.10. Набор блоков для первой программы Щёлкните на блоке . Посмотрите: размер спрайта на сцене уменьшился. Щёлкните на блоке , чтобы начать рисо- вать. Теперь можно пощёлкать мышью по блокам движения и поворотов и понаблюдать, что получается. Стрелка-черепашка исправно поворачивается, движется, оставляя за собой след. Хотите стереть линии, чтобы попробовать нарисовать новый рисунок? Вытащите блок из категории Перо и щёлк- ните по нему. Внимание! Не путайте блоки Это распространённая ошибка! и Спрайты, скрипты, черепахи и другие жители виртуального мира в Scratch . 19
Задаём начальное положение и направление движения спрайта Спрайт во время движения может «спрятаться» за край сцены. Для того чтобы не вытаскивать его каждый раз мышью, воспользуемся блоком из категории скриптов Движение. Вытащите этот блок на сцену, отредактируйте координаты X и Y, щёлкните по нему мышью. Спрайт окажется в центре экрана. (Помните схему координат на рис. 1.5?) Этот блок поможет задавать положение спрайта при выполнении программы. Нам нужен ещё один блок из категории Движение. Это блок . Он задаёт направление, в котором будет двигаться спрайт. Перетащите его в область сценариев. Группируем блоки в программные сценарии Вы уже обратили внимание, что блоки можно склеивать друг с другом в группы и разрывать группы в произвольном месте? Достаточно мышью ухватить один блок и подвести его к другому — и блоки сцепятся. Сгруппируйте блоки (рис. 1.11). Рис. 1.11. Группируем блоки в скрипт Теперь одним щелчком на группе можно выполнить сразу несколько действий. Это и называется скрипт — программный сценарий некоторых действий. 20 ГЛАВА 1
Добавляем реакцию на события Вы уже заметили, что рисовать, щёлкая мышью по отдельным блокам или даже целым скриптам, неудобно? Приходится всё время переводить взгляд то на область скриптов, то на сцену. Намного проще будет запускать нужные команды нажатием на кнопки компьютерной клавиатуры. В этом помогут специальные вводные блоки из категории События (они похожи на «шапочки» скриптов). Нам понадобится три «шапочки» для клавиш <K> (стрелка вверх), <I> (стрелка влево) и <J> (стрелка направо). Используйте блок (перетащите его в область сценариев, выберите нужный вариант из списка). Заодно заставим нашу стрелку перемещаться чуть шустрее, продвигаясь на 10 шагов и разворачиваясь сразу на 45 градусов (рис. 1.12). Рис. 1.12. Скрипты для управления с помощью клавиш Попробуйте с помощью клавиш порисовать на экране. Правда, удобно?! Поздравляем! Вы написали первую программу в среде Scratch! И использовали для её создания событийно-ориентированный подход в программировании. Спрайты, скрипты, черепахи и другие жители виртуального мира в Scratch 21
Учимся сохранять проекты Для сохранения проекта в меню Файл выберите команду Сохранить как (рис. 1.13). Рис. 1.13. Сохраняем проект Укажите место сохранения и имя проекта. В дальнейшем можно будет пользоваться командой Сохранить из меню Файл. Открыть сохранённый проект можно командой Открыть из меню Файл. Задания 1. Добавьте заголовочные блоки к скриптам подготовки к началу рисования (нажатие клавиши <0>, «ноль») и очистки экрана (нажатие клавиши <Пробел>). 2. Измените набор скриптов таким образом, чтобы можно было поднимать и опускать перо в произвольное время, то есть перемещать спрайт без рисования линии. Самостоятельно выберите клавиши для поднятия и опускания пера. 22 ГЛАВА 1
Учим спрайт выполнять сложные скрипты Когда вы порисуете и поэкспериментируете вдоволь, то, скорее всего, заметите, что для получения симметричного узора (рис. 1.14) приходится повторять однотипные действия, воспроизводя простые элементы рисунка. Рис. 1.14. Пример простого симметричного узора Создадим для таких повторяющихся действий отдельные скрипты. Они будут выполняться при нажатии клавиш <1> и <2>. Составлять узоры станет проще. Совет Кстати, в Scratch есть маленькая хитрость: блоки, целые скрипты или их части можно дублировать, ускоряя процесс программирования. Для этого нужно щёлкнуть правой кнопкой мыши по нужному блоку и выбрать команду дублировать. В наш стартовый скрипт добавим пару блоков: , из категории Перо. В последнем случае, для того чтобы выбрать цвет, надо щёлкнуть по цветному квадратику, а потом щёлкнуть по любому месту на экране с нужным цветом. Теперь отредактируем исходное направление стрелки, пусть при запуске скрипта она будет повёрнута в направлении 45 градусов (то есть в правый верхний угол экрана). Скрипты становятся всё сложнее (рис. 1.15). Спрайты, скрипты, черепахи и другие жители виртуального мира в Scratch 23
Рис. 1.15. Скрипты, включающие набор действий Попробуйте порисовать, используя уже пять скриптов рисования. Экспериментируя, нетрудно получать самые разные узоры. Задание Попробуйте воспроизвести узор на рис. 1.16. Это достаточно просто, если пользоваться готовыми скриптами для клавиш <1> и <2>. Рис. 1.16. Сложный узор 24 ГЛАВА 1
Собственные блоки для очень сложных узоров Наверное, вы уже догадались, что можно составить скрипт, который при нажатии клавиши будет рисовать весь задуманный орнамент целиком. Правда, если использовать лишь блоки движения и поворота, скрипт будет огромным, и мы заблудимся в нём, как в дремучем лесу. Задание Создайте скрипт, который при нажатии клавиши <3> рисует сложный узор (см. рис. 1.16) целиком (подсказка: упростить работу можно с помощью дублирования скриптов). Сосчитайте число блоков. А нельзя ли создавать узор из уже готовых элементов? Можно! Для этого действия, запускаемые по нажатию клавиш, надо оформить как отдельные блоки. Мы научим спрайт новым командам, а наши инструкции окажутся достаточно короткими и понятными! Создаём блоки и Создадим новый блок, который в одиночку будет выполнять все команды из скрипта (см. рис. 1.15), и присвоим ему понятное нам имя, например «изгиб». Перейдите в категорию Другие блоки и нажмите кнопку Создать блок. Введите изгиб в поле имени нового блока и нажмите кнопку OK (рис. 1.17). Обратите внимание, в категории Другие блоки появился новый блок , а в области скриптов — вводный (заголовочный) блок с соответствующим именем. Требуется объяснить программе, какие действия блок будет выполнять. Для этого к его вводному блоку следует «прицепить» все необходимые команды. Можно собрать последовательность команд заново, но проще отделить курсором команды от заголовка Спрайты, скрипты, черепахи и другие жители виртуального мира в Scratch 25
и переставить их под заголовок есть две взаимосвязанные вещи: сам блок (рис. 1.18). Теперь у нас и его определение. При запу- ске блока будет выполняться несколько команд. Говорят, что будет выполняться последовательность действий. Проверяем. Щёлкните по заголовку . Очистите экран клавишей <Пробел>. А теперь щёлкните по самому блоку . Получается одно и то же? Работает! Рис. 1.17. Создаём новый блок Рис. 1.18. Новый блок 26 и его определение ГЛАВА 1
Создайте ещё один блок, назвав его «разворот». Теперь для скриптов, выполняемых при нажатии клавиш <1> или <2>, можно использовать готовые блоки и (рис. 1.19). Рис. 1.19. Набор скриптов с новыми блоками Создаём блок и рисуем одним блоком Кажется, что мы усложнили старый вариант (см. рис. 1.15). Но это лишь кажется: ведь определить блок надо только один раз, а использовать можно будет многократно! Спрайты, скрипты, черепахи и другие жители виртуального мира в Scratch 27
Теперь вы можете создавать очень сложные рисунки, просто собирая нужную последовательность из новых, созданных вами блоков! Попробуем создать новый блок , рисующий не элемент, а целый орнамент. Теперь это легко сделать (рис. 1.20). Рис. 1.20. Рисуем узор одним блоком Задание Поэкспериментируйте, попробуйте придумать свои варианты блоков-узоров, например, напоминающих древнеславянские и кельтские орнаменты (рис. 1.21). Рис. 1.21. Примеры орнаментов 28 ГЛАВА 1
Проект «Спираль из квадратов» Поскольку теперь мы знаем, как учить спрайт новым командам, нарисуем что-нибудь сложное и красивое, но при этом состоящее из простых фигур. Знаете, как может выглядеть разноцветная спираль из обычных квадратов? Посмотрите на рис. 1.22. Рис. 1.22. Квадраты и... немножко программирования! Выполним несколько подготовительных упражнений. Рисуем квадрат Прежде всего следует объяснить нашему спрайту, как рисовать квадрат. Это нетрудно. Создайте новый блок, назовите его «квадрат» и определите его команды (рис. 1.23). Щёлкните по блоку. Стрелка пробежала по экрану, оставила след в виде квадрата. Можно было бы использовать 4 команды и лишь три команды , но тогда при работе блока возникал бы нежелательный побочный эффект. Стрелка оказывалась бы повёрнутой в новом направлении, чего мы в данном случае не ожидаем. Рис. 1.23. Новый блок Спрайты, скрипты, черепахи и другие жители виртуального мира в Scratch 29
Рисуем квадрат 2. Объединяем повторяющиеся команды в цикл В блоке 4 раза повторяется одна и та же последовательность действий. Давайте так и скомандуем: «повторить четыре раза». Для этого воспользуемся блоком из категории Управление (рис. 1.24). Кстати, иначе этот управляющий блок можно назвать циклом, содержащим некоторое количество повторов (итераций). Итера́ция — это одно повторение цикла. Например, цикл из десяти повторений содержит десять итераций. Бесконечный цикл предусматривает бесконечное количество итераций. Он будет выполняться до тех пор, пока его не прервут принудительно, извне. Рис. 1.24. Используем цикл Программа стала значительно компактнее и понятнее. Теперь легко можно изменить скрипт, если мы захотим рисовать не квадрат, а другой многоугольник. Задания 1. Отредактируйте определение блока пользовалась команда , чтобы исвместо . Проверьте работу. Что изменилось? 2. Нарисуйте равносторонние треугольник и пятиугольник. Учтите, что поворачивать стрелку надо будет на другой угол. На какой именно — догадайтесь сами! 30 ГЛАВА 1
Оформляем правильно: начало — программа — остановка Давайте будем учиться оформлять программу так, чтобы не только нам, но и самой среде Scratch было понятно, что выполнение началось. Хоть мы об этом не всегда догадываемся, при старте зачастую просто необходимо выполнить некоторые подготовительные действия, чтобы всё прошло гладко. Для запуска программы в Scratch используется нажатие на зелёный флажок над окном служит для остановки работы. Поэтому сцены. А красный восьмиугольник в категории События выберите вводный блок и вытащите его на рабочее поле. Это заголовок программы, её начало. Теперь будем шаг за шагом наращивать тело программы, дорабатывать скрипт, определяющий нужную последовательность действий. Основная программа и вспомогательный скрипт Разделим управляющий скрипт, предусмотрев запуск программы рисования квадрата и возможность очистки экрана перед повторным исполнением по отдельной команде, лишь когда нам это требуется. Для очистки экрана будем использовать блок (рис. 1.25). Рис. 1.25. Набор скриптов для очистки экрана перед перезапуском Спрайты, скрипты, черепахи и другие жители виртуального мира в Scratch 31
Рисуем узор из одинаковых квадратов Проанализируйте работу программы, попробуйте её в действии. Щелчок по зелёному флажку над сценой — появился квадрат. Перетащили стрелку, зацепив курсором мыши, снова щёлкнули — квадрат в новом месте. А если спрайт-стрелку повернуть, квадрат окажется иначе ориентированным. Теперь нарисуем много квадратов, для чего воспользуемся блоком . Напомним, что на программном языке это называется циклом. В цикле нарисуем квадраты, каждый раз их немного поворачивая. Рождается симпатичный узор, для которого удобно создать отдельный новый блок (рис. 1.26). Рис. 1.26. Узор из квадратов и скрипт для его рисования Задаём размер квадрата Мы близки к цели! Для того чтобы узор напоминал спираль, будем рисовать каждый следующий квадрат чуть больше предыдущего. Придётся добавить параметр, позволяющий задавать размер квадрата. 32 ГЛАВА 1
Параметр — это свойство объекта или системы, которое можно измерить. В программировании часто используется как синоним понятий «аргумент процедуры» и «аргумент функции». В языке Scratch существует немало блоков с числовым параметром, требующих указания конкретного значения при использовании. Например, «идти (сколько-то) шагов». Щёлкните по блоку правой кнопкой мыши и в меню выберите команду редактировать (рис. 1.27). Щёлкните по серому треугольнику рядом с надписью «Параметры» и выберите вариант Добавить числовое поле, задайте имя поля (длина_грани) и нажмите кнопку OK (рис. 1.28). Рис. 1.27. Начинаем редактировать блок Рис. 1.28. Создаём поле параметров блока В названии длина_грани используется символ подчёркивания. Несмотря на то что Scratch «понимает» имена, содержащие пробелы, стоит придерживаться более универсальных приёмов при создании составных названий. Лучше объединять слова с помощью символа подчёркивания либо пользоваться стилем именования «ВсеНачальныеБуквыЗаглавные». Спрайты, скрипты, черепахи и другие жители виртуального мира в Scratch 33
Перетащите появившийся параметр длина_грани из заголовка «определить квадрат» в блок , заменив им число 100 (рис. 1.29). Рис. 1.29. Параметр длина_грани теперь определяет длину грани квадрата Готово, теперь у нас появилась возможность рисовать квадраты с произвольной длиной грани, просто меняя значение параметра в блоке (рис. 1.30). Опробуйте изменённый вариант блока, порисуйте квадраты разного размера. Рис. 1.30. Блоки, рисующие квадраты разного размера Создаём переменную размер_квадрата Осталось понять, как надо изменить определение блока , чтобы размер каждого нового квадрата, который рисует наша стрелка, увеличивался. Существует несколько решений. Мы будем использовать переменную (изменяемую величину), умеющую сохранять значение и выдавать нам его по запросу. Вначале такую переменную нужно создать, после этого появятся блоки работы в ней. В программе нам придётся присвоить переменной некоторое стартовое значение, а потом в цикле каждый раз увеличивать это значение и использовать его в качестве длины грани для рисования квадрата. Вы уже 34 ГЛАВА 1
достаточно освоились с интерфейсом Scratch, для того чтобы самостоятельно разобраться, как создаются переменные. Скажем лишь, что для этого следует выбрать категорию скриптов Данные. Задание Создайте переменную с именем размер_квадрата самостоятельно. Меняем размер и цвет квадрата в цикле Внутри цикла мы будем также менять цвет пера, ведь цвет в среде Scratch обозначается числом, которое тоже можно увеличивать или уменьшать. Наш проект усложняется! Кроме того, поскольку всё готово, и нам больше не нужно сохранять пробные предыдущие рисунки при перезапуске программы, перенесём команды из вспомогательного скрипта в основную программу, будем очищать экран перед исполнением блока (рис. 1.31). Рис. 1.31. Рисунок и полный набор скриптов проекта «Спираль из квадратов» Спрайты, скрипты, черепахи и другие жители виртуального мира в Scratch 35
Наслаждаемся результатом Всё готово. Можно посмотреть на результат. И желательно — на полном экране! Переключимся специальной кнопкой в режим презентации (в левом верхнем углу прямо над сценой (рис. 1.32); возвращение в оконный режим — нажатие на аналогичную кнопку в том же месте). Рис. 1.32. Кнопка для режима презентации Барабанная дробь, представление начинается! Щёлкните по зелёному флажку. Стрелка побежала рисовать... И вот она, ожидаемая нами цветная спираль! Если же у вашей стрелки-черепашки что-то поначалу пошло не так, не расстраивайтесь. Создание программ — это всегда борьба с ошибками. Не опускайте руки, и всё получится! Совет В качестве дополнительной литературы по языку Scratch рекомендуем книги [1 и 2], приведённые в разделе «Полезные книги» (стр. 170). 36 ГЛАВА 1
Справочная система Scratch и проекты «Шаг за шагом» Вам понравился Scratch? А хотели бы вы продолжить его изучение самостоятельно? Тогда вам будет полезно узнать, что среда Scratch 2.0 содержит отличную встроенную справочную систему. Достаточно щёлкнуть по кружочку со знаком вопроса в главном меню, а потом по интересующему нас блоку, и справа откроется специальная панель с пояснениями, как этот блок использовать (рис. 1.33). Тем, кто знает английский язык, сразу всё станет понятно. Остальным помогут картинки... и толстый словарь либо компьютерная программа-переводчик. Ещё одной интересной возможностью встроенной системы помощи является отображение пошаговых инструкций. Вызвать их можно из самого окна Рис. 1.33. Хотите узнать больше об объекте — используйте знак вопроса! Спрайты, скрипты, черепахи и другие жители виртуального мира в Scratch 37
помощи, нажав кнопку Домой и выбрав вкладку Step-by-Step (Шаг за шагом), или щелчком по меню Подсказки. Этот раздел позволит вам освоить основные возможности Scratch на примере создания разных проектов (рис. 1.34). Рис. 1.34. Пошаговые инструкции к проектам Scratch Несмотря на то что вся эта ценнейшая информация представлена по-английски, анимированные подсказки понятны даже тем, кто не изучал либо только начинает изучать иностранный язык. Для примера предлагаем вам собрать игру «Пинг-понг» (в рубрике «Step-by-Step» выберите проект «Create a Pong Game»). Внимание! В новой версии среды, Scratch 3, пошаговые инструкции собраны в разделе Руководства программного меню. Обязательно загляните в этот раздел, там представлены как материалы для начинающих, так и замечательные демонстрационные проекты для тех, кто уже имеет некоторый опыт, в том числе проект по созданию игры «Пинг-понг» с переводом на русский язык. 38 ГЛАВА 1
Примечание Если вас увлекло рисование в Scratch, то попробуйте освоить ещё один интересный продукт — онлайн-редактор Beetle Blocks (http:// beetleblocks.com), в котором можно программировать блоками, как и в Scratch, и не только создавать объёмные фигуры, но и сохранять их в форматах для печати на 3D-принтерах (рис. 1.35). Всё нарисованное можно превратить в осязаемый предмет! Рис. 1.35. Сайт Beetle Blocks Заканчивая главу, посвящённую Scratch, мы хотели бы ещё раз отметить огромные проектные возможности этой программной среды. Рисование, создание игровых и учебных проектов, мультипликация и презентации — всё это можно делать в Scratch. Программа оказалась настолько удачной, что в современном мире появляется всё больше инструментов, основанных на Scratch и ориентированных на самые разные специализированные области применения. Спрайты, скрипты, черепахи и другие жители виртуального мира в Scratch 39
Мы узнали, что... • Scratch — визуальная объектно-ориентированная среда программирования для начинающих (и не только) программистов. • Спрайт — объект-персонаж в среде Scratch. • Скрипт (или сценарий) — программа из блоков в среде Scratch. • «Черепашья графика» — принцип организации графического вывода, построенный на образе черепахи — воображаемого (а в некоторых случаях и реального) роботоподобного устройства, которое перемещается по экрану или бумаге и поворачивается в заданных направлениях, при этом оставляя (или, по выбору пользователя, не оставляя) за собой нарисованный след заданного цвета и ширины. • Цикл — разновидность управляющей конструкции в языках программирования, предназначенная для организации многократного исполнения набора команд. • Встроенная справочная система Scratch — мощный инструмент помощи начинающим (и не только) программистам. • beetleblocks.com — сайт онлайн-редактора в стиле Scratch для рисования объёмных фигур с возможностью их последующей печати на 3D-принтерах. В следующей главе мы познакомимся с mBlock — средой, основанной на Scratch 2.0 и предназначенной для программирования микроконтроллеров. 40 ГЛАВА 1
Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock Arduino — это просто! Теперь, когда вы научились создавать программы для персонального компьютера в среде Scratch, можете применить полученные знания и для программирования микроконтроллеров. Как мы уже рассказывали во введении, сейчас в мире чрезвычайно распространены разнообразные устройства, созданные на базе микроконтроллеров Arduino. На каждой плате этого семейства располагается сам микроконтроллер, стабилизатор напряжения, несколько гнёзд, позволяющих подключить различные датчики и исполнительные органы, кварцевый генератор, разъём питания и USB-адаптер для обмена информацией между платой и компьютером (рис. 2.1). Для начала работы с устройством достаточно просто подключить к нему батарейку (говорят «подать питание от батарейки») либо подсоединить к компьютеру с помощью USB-кабеля. Принципиально важно то, что плата позволяет нам создавать электронные самоделки без помощи паяльника или других специальных средств. Существует огромное количество готовых модулей расширения с простым подключением, продаваемых поштучно и целыми наборами. Работать с Arduino очень легко! Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 41
Рис. 2.1. Основные элементы платы Arduino Платы семейства Arduino В семейство Arduino входят различные платы. Подробную информацию можно получить на сайте поддержки по адресу http://arduino.ru/Hardware. Чаще всего, когда говорят «Ардуино», подразумевают самый распространённый вариант — Arduino Uno (рис. 2.2, слева). Плата Arduino Uno (в текущей редакции) выполнена на базе процессора ATmega328p с тактовой частотой 16 мегагерц и обладает памятью размером 32 килобайта, позволяющей хранить довольно сложные программы. В состав платы входит всё необходимое для удобной работы с микроконтроллером: 20 контактов ввода и вывода для взаимодействия с внешним миром, разъём USB, разъём питания, кнопка сброса. Когда в проектах важнее не удобство подключения, а компактность и низкая стоимость, используют Arduino Nano (рис. 2.2, справа). Кроме того, благодаря наличию «ножек» такой вариант хорош для использования вместе с макетной платой. 42 ГЛАВА 2
Рис. 2.2. Платы Arduino (слева направо): Arduino Uno, Arduino Mega, Arduino Nano Если же требуется подключать большое количество датчиков и внешних устройств, то самым подходящим выбором будет Arduino Mega (1280 и 2560). Эту плату отличает увеличенное количество контактов ввода-вывода (70 штук!) и размер (рис. 2.2, в центре). Это уже, скорее, «контроллер», без претензий на миниатюрность. Стоит дороже, но имеет память большего объёма, больше возможностей и позволяет управлять сложными механизмами, включая 3Dпринтеры и станки с числовым программным управлением (ЧПУ). Существует огромное разнообразие Arduino-совместимых плат, подходящих для самых разнообразных случаев. Научившись работать с Arduino Uno, вы сможете использовать и другие микроконтроллеры, подбирая их в соответствии с характером задуманного вами проекта. Платы расширения Arduino shield Для Arduino Uno создано множество специальных плат-расширений (их называют шилдами — Arduino shields), с помощью которых легко наращивать функциональные возможности вашего проекта. Примерами могут служить Sensor Shield (рис. 2.3, слева) для удобного подключения датчиков к Arduino Uno и Motor Shield (рис. 2.3, справа) для управления двумя мощными моторами. Соединив подобный шилд с Arduino Uno, вы сможете построить самодвижущегося робота и оставить незанятыми контакты ввода-вывода для подключения к нему различных датчиков и дополнительных устройств. И таких расширений самого разного назначения для Arduino Uno создано великое множество Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 43
Рис. 2.3. Платы расширения для Arduino Uno (слева направо): Sensor Shield и Motor Shield (например, шилд для связи по Wi-Fi с возможностью выхода в Интернет, шилд с реле, позволяющий включать и выключать освещение в доме и разнообразные электрические приборы). Ещё и поэтому для представленных в книге самоделок мы выбрали именно эту плату. Мы узнали, что... • Существует множество разновидностей плат Arduino, самая распространённая из которых — Arduino Uno. • Для создания различных устройств на основе Arduino часто используют специальные платы-расширения (Arduino shields). Scratch для Arduino? Знакомьтесь — mBlock! Итак, мы выбрали плату для экспериментов и готовы к новым исследованиям. Теперь нам потребуется специальная среда программирования. Вы уже кое-чему научились в среде программирования Scratch и теперь сможете применить свои знания к работе с микроконтроллерами. Вот только оригинальная версия Scratch не умеет взаимодействовать с электроникой Arduino и не содержит требующихся для этого разделов-блоков. Но не беда, ведь Scratch относится к свободному программному обеспечению, а это значит, что другие разработчики могут его дополнять и видоизменять под свои задачи. 44 ГЛАВА 2
Так и поступила компания MakeBlock (www.makeblock.com), разработчик весьма интересных наборов по робототехнике. Программисты MakeBlock создали специализированную среду управления для разнообразных контроллеров (в том числе и для плат собственной разработки) — mBlock, в основе которой всё тот же знакомый нам Scratch 2.0. Очень важно, что полученную программу можно будет загрузить прямо на плату, и микроконтроллер после этого начнёт функционировать самостоятельно! А пока научим Arduino работать в связке с компьютером под управлением mBlock. Загрузка и установка mBlock на компьютер Страница загрузки mBlock на сайте разработчиков — https://www.mblock. cc/en-us/download. В настоящее время последняя версия — mBlock 5. Но так сложилось, что предыдущая версия среды, mBlock 3, оказалась чрезвычайно интересной и востребованной энтузиастами-программистами всего мира. Разработчики предоставили для всех желающих удобный механизм написания собственных расширений — дополнений, наделяющих среду новыми возможностями. Вот так и получилось, что на текущий момент, с учётом разнообразнейших расширений, именно версия 3 не имеет аналогов в мире. За счёт расширений поддерживается большое количество существующих контроллеров, плат расширения и других электронных компонентов, совершенствуются и программные функции, появляются новые возможности. В своё время именно так появилось расширение Advanced Arduino Extension, написанное одним из авторов этой книги, Александром Григорьевым. Это дополнение принципиально изменило границы применимости среды mBlock, нарастив возможности визуального программирования контроллеров до уровня профессионального применения и стирая границы между «блочным» и «текстовым» программированием. Возможно, когда-нибудь и для mBlock 5 будут разработаны соответствующие расширения, но пока для программирования контроллеров Arduino мы будем использовать версию 3. Вам потребуется прокрутить страницу загрузки www.mblock.cc/en-us/ download до заголовка Other mBlock software и выбрать загрузку (нажать кнопку Download) mBlock 3 для своей операционной системы (рис. 2.4). Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 45
Примечание Программа mBlock способна работать в операционных системах Windows, Mac OS X и Linux. Загрузив версию для вашей операционной системы, установите её на компьютер. Мы будем рассматривать работу mBlock в операционной системе Windows. Рис. 2.4. Нажмите кнопку Windows Download, если ваш компьютер работает под управлением Windows Установите программу на ваш компьютер. Запустив её после установки, вы увидите, что внешний вид (говорят «интерфейс», от английского слова interface — взаимодействие) и система управления программы очень похожи на Scratch, правда, главный персонаж теперь не кот-царапка, а добрая панда (рис. 2.5). Рис. 2.5. Талисман mBlock — панда Выбираем язык интерфейса mBlock Как и Scratch, среда mBlock поддерживает множество языков общения, поэтому выберите русский язык в меню Language (рис. 2.6). Стоит предупредить, хоть интерфейс программы поменяется, не все надписи будут по-русски. Ничего, разберёмся! Ну, а если вы изучаете английский язык, можно оставить всё как есть. Программа установлена, переходим к подключению платы Arduino. 46 ГЛАВА 2
Рис. 2.6. Здесь можно изменить язык общения с программой Мы узнали что... • mBlock — специальная среда программирования, похожая на Scratch 2.0 и позволяющая управлять различными устройствами на основе Arduino. • Интерфейс mBlock поддерживает множество языков, среди которых есть и русский. Основы работы с Arduino в mBlock Подключаем Arduino Uno к компьютеру и настраиваем mBlock на работу с платой На лицевой стороне платы находятся электронные компоненты. Постепенно вы узнаете назначение всех основных элементов Arduino Uno. Сейчас выделим три из них: гнездо подключения кабеля USB, светодиод ON (загорается во время работы платы) и светодиод L, который вы будете использовать в первой программе на mBlock (рис. 2.7). Рис. 2.7. Компоненты платы Arduino Uno Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 47
Внимание! С обратной стороны платы видны многочисленные пропаянные контакты — берегите микроконтроллер от повреждения внешними источниками высокого напряжения или при случайном замыкании контактов друг с другом (например, при касании посторонних металлических предметов). Для экспериментов плату лучше закрепить на специальной площадке (она обычно имеется в наборе для изучения Arduino), либо следите за тем, чтобы плата располагалась на непроводящей электричество поверхности (дерево, пластик, картон). Во время экспериментов не дотрагивайтесь до элементов платы и соединительных кабелей мокрыми руками. Это азы безопасности при работе с электроникой. Соедините кабелем USB плату Arduino Uno с компьютером. Если это первое подключение устройства к компьютеру, то начнётся установка нужных драйверов для Arduino. В состав дистрибутива mBlock входит Arduino IDE (среда управления от разработчиков Arduino) и нужные драйверы, поэтому установка должна пройти автоматически. Если система всё-таки не сможет установить их самостоятельно, то в меню Соединить программы mBlock можно выбрать команду Install Arduino Driver (Установить драйвер Ардуино). Драйвер — от английского слова driver — водитель, а для программистов это слово означает специальную программу, которая помогает работать устройству. Дистрибутив — один или несколько файлов, предназначенных для распространения программного обеспечения и его установки на компьютер. IDE расшифровывается как Integrated Development Environment — интегрированная среда разработки, то есть это одна бо-о-ольшая программа, которая содержит много инструментов, используемых при создании других программ. Если все нужные для работы программы установлены, то на плате загорится светодиод ON и никаких дополнительных действий не потребуется. 48 ГЛАВА 2
Тот, кто хорошо разбирается в средствах настройки операционной системы Windows, может запустить Диспетчер устройств (<Win>+<Pause Break>) и убедиться, что в разделе Порты (COM и LPT) появился соответствующий пункт. В нашем случае это COM4 (рис. 2.8). COM — это сокращение английского слова communication, которое переводится как соединение. Рис. 2.8. Номер порта, подключённого к компьютеру Arduino Uno, отображается Диспетчером устройств Теперь в среде mBlock надо указать порт соединения компьютера с устройством. Если вы использовали USB-кабель, то надо выбрать последовательный порт COM с номером, который присвоила операционная система новому соединению (на рис. 2.9, например, это COM4). Выберите в меню Соединить команду Serial Port, а затем команду COM4 (рис. 2.9). Если в списке один-единственный порт, его и выбирайте. Если же портов много, попробуйте отключить Arduino-контроллер (выдернуть провод из USBразъёма) и, перезапустив mBlock, посмотрите, какой порт исчез из меню. Затем подключите плату Arduino вновь. Этот порт должен опять появиться среди команд меню. Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 49
Рис. 2.9. Выбираем в среде mBlock номер порта для подключения платы Arduino Uno После успешного соединения в заголовке программы появится надпись Serial Port Соединено (рис. 2.10), а когда вы вновь откроете в меню Соединить список команд Serial Port, то обнаружите галочку напротив названия соответствующего порта. Повторное нажатие снимает эту галочку (она называется флажком), и если вы это сделали, то вновь установите соединение. Рис. 2.10. После успешного соединения в заголовке программы появляется надпись Serial Port Соединено Теперь настроим среду mBlock на работу с Arduino Uno. Помните, мы уже рассказывали о том, что разновидностей Arduino очень много? Вот и надо объяснить mBlock, какой именно платой мы будем пользоваться. Для этого в меню Boards (Платы) выберите из списка Arduino Uno (рис. 2.11). 50 ГЛАВА 2
Рис. 2.11. Выбираем плату Arduino Uno из списка плат, поддерживаемых mBlock Загрузим в память нашего контроллера Arduino особую программу, управляющую работой устройства. Такие программы называют прошивками. Arduino при работе с mBlock использует специальную прошивку, которая позволяет микроконтроллеру понимать, какие команды мы ему отправляем с компьютера. Для её загрузки нам не потребуется пользоваться какими-то внешними приложениями, в среде mBlock для этого в меню Соединить существует отдельная команда — Обновить прошивку (рис. 2.12, слева). Выберите её. Прошивка — это встроенное «фирменное» программное обеспечение, микропрограмма, которая хранится в энергонезависимой памяти устройства и обеспечивает выполнение им своих функций. Даже если устройство выключить, лишить питания, эта программа не стирается. Вы увидите окно процесса обновления прошивки. После удачной загрузки программы в память устройства появится надпись Upload Finish (Загрузка завершена) — рис. 2.12, справа. Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 51
Рис. 2.12. Обновление прошивки на плате Arduino Uno Почти всё готово, остаётся в меню Extensions (Расширения) выбрать компоненты, добавляющие новые удобные блоки для работы со специализированными контроллерами и компонентами. В будущем вы научитесь пользоваться этой возможностью, а может быть, даже станете придумывать собственные контроллеры и наборы команд для них (разработчики позаботились об этом, включив в меню пункт Manage Extensions (Управление расширениями)). Пока же выберите только расширение Arduino (рис. 2.13). Если где-то ещё рядом с непонятными вам названиями стоят флажки — снимите их, чтобы не путаться. Рис. 2.13. Выберите расширение Arduino для работы с платой Arduino Uno 52 ГЛАВА 2
Всё! Среда управления mBlock готова к работе с контроллером Arduino Uno, а в категории Робот появились блоки управления для Arduino (рис. 2.14). Справа от заголовка расширения — зелёный кружок. Он показывает, что плата соединена со средой управления mBlock, и вы всё настроили правильно. Если этот кружок станет красным, надо проверить, не отошли ли контакты кабеля USB и выставлен ли порт соединения (см. рис. 2.14). Рис. 2.14. Среда управления mBlock готова к работе с платой Arduino Uno Если вам показалось, что процесс первичной настройки долгий и нудный — не огорчайтесь, в дальнейшем всё будет намного проще. Вам уже не придётся ждать установки драйверов, да и тип контроллера и нужные расширения уже Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 53
выбраны, программа сохранит эти настройки. А вот соединение с нужным портом придётся выполнять каждый раз, когда вы подключаете плату. Обновление прошивки периодически тоже потребуется, но об этом поговорим, когда будем создавать программы для автономной (самостоятельной, без подключения к компьютеру) работы вашей электронной самоделки. Мигаем светодиодом. Наша первая программа для Arduino в среде mBlock Ну что ж, напишем первую простую программу для платы Arduino Uno. Попробуем управлять встроенным в плату светодиодом L (см. рис. 2.7). Скрипт мигания светодиодом поможет нам в будущем решать одну важную вспомогательную задачу. Коммуникационный протокол mBlock для общения с программой-прошивкой (его можно назвать языком общения между компьютером и Arduino) пока, к сожалению, далёк от совершенства, и иногда происходят сбои. И при каждом запуске какой-либо нашей программы полезно будет убедиться, что соединение ещё есть, всё работает корректно, и плата готова исполнять команды, которые отправляет ей компьютер. Перед началом работы Перед тем как начать составлять скрипт, поясним важные детали. Во-первых, при соединении с помощью USB-кабеля плата получает питание от компьютера и в дополнительных батарейках не нуждается. Во-вторых, помните, когда мы говорили о плате Arduino Uno, то упоминали, что у неё есть 20 различных контактов ввода и вывода для взаимодействия с окружающим миром? Именно к этим контактам мы будем подсоединять разные кнопки, датчики и другие компоненты. Эти контакты часто называют портами ввода-вывода, или пи́нами (от английского слова pins — ножки, штифты) — см. рис. 2.1. Схема подключения Для выполнения проекта подсоедините плату Arduino Uno к компьютеру. Светодиод L находится непосредственно на плате. Он подсоединён к цифровому пину под номером 13. На этот пин, как и на любой другой, можно подавать цифровой сигнал 1 или 0, или, по-другому — HIGH или LOW (высокий или 54 ГЛАВА 2
низкий, напряжение либо есть, либо отсутствует). В зависимости от того какой сигнал подан, подсоединённый светодиод будет загораться или гаснуть. Попробуем. Пишем скрипт Соберите простой скрипт (рис. 2.15), используя блоки из категорий События и Контроль и блоки из новой категории Робот. Рис. 2.15. Скрипт, мигающий встроенным в плату светодиодом Обратите внимание, в данном проекте мы используем бесконечный цикл (блок ). После запуска программы действия, что расположены внутри цикла, будут повторяться снова и снова, до тех пор пока мы не прервём работу нажатием на кнопку Стоп . Тестируем программу Проверьте работу программы, нажав на зелёный флажок . Мигает светодиод L? Замечательно. Вместо HIGH и LOW попробуйте в поля вручную ввести числа 1 и 0. Остановите программу, запустите её вновь и убедитесь, что и такой вариант сигналов понятен системе. Теперь присмотритесь к плате — мигает не только светодиод L, но кратковременно вспыхивают ещё два светодиода, помеченные на плате как TX и RX (рис. 2.16). Это передаются на контроллер команды с компьютера — «включи» и «выключи». Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 55
Когда светится светодиод TX, это означает, что Arduino передаёт данные (Transmitter Exchanges), и наоборот — при приёме данных светится светодиод RX (Receiver Exchanges). То есть свечение светодиода TX означает «Передаю (Transmit) данные», а RX означает «Принимаю (Receive) данные». Запомните, это нам ещё пригодится. Рис. 2.16. Когда светится светодиод TX, это означает, что Arduino передаёт данные, и наоборот, при приёме данных светится светодиод RX Вот мы и научились подключать платы Arduino к компьютеру и настраивать среду управления mBlock для работы с ними. Теперь можно приступать к самому интересному — создавать игры с использованием наших самодельных устройств. Но перед этим следует освоить работу с различными электронными компонентами. Мы узнали, что... 56 • Специальные программы, управляющие работой контроллеров, называют прошивками (firmware). • Компьютерный порт ввода-вывода (например, COM4) определяет путь взаимодействия (коммуникации) процессора и периферийного оборудования, например, платы Arduino. • В Arduino цифровые порты ввода и вывода представляют собой металлические контакты, которые часто называют пинами (pins — ножки, штифты). К этим контактам подключают внешние устройства (светодиоды, кнопки, датчики и другие компоненты). ГЛАВА 2
Подключение внешних светодиодов к плате Arduino Uno Встроенным светодиодом на плате Arduino мы уже поморгали. Как вы помните, он был подключён к порту ввода-вывода (пину) под номером 13. А теперь попробуем подсоединить дополнительные светодиоды, чтобы с их помощью научиться управлять разнообразными внешними устройствами, меняя состояние портов Arduino. Arduino может управлять не только маленькими светодиодами, но и чрезвычайно мощными устройствами — лампами домашнего освещения, прожекторами, насосами, двигателями и так далее. Для этого используется усиление сигнала с помощью транзисторов и реле. Мы обязательно рассмотрим эти технологии, когда будем говорить об «умном доме», а пока просто помните о том, что, обучаясь управлению светодиодами, мы учимся управлять и мощными потребителями электроэнергии. Самый простой и удобный вариант — воспользоваться готовым модулем с уже установленными и припаянными компонентами. Их часто называют сборками, в нашем случае это светодиодная сборка (иногда говорят «матрица» или «светодиодная шкала», так как её можно использовать для индикации состояния). Примечание Если вы работаете с набором, в котором нет данной сборки, и приобрести аналогичную в магазине электронных компонентов не получилось, можете сразу перейти к разделу «Светодиодная сборка своими руками», где мы соберём подобное устройство на основе распространённых компонентов (светодиодов, резисторов) и макетной платы. Выглядит светодиодная сборка следующим образом: небольшой модуль с ножками, который вставляется непосредственно в разъёмы платы Arduino (рис. 2.17). С лицевой стороны на нём можно увидеть 6 светодиодов, помеченных как D1–D6, и столько же резисторов (сопротивлений), соединённых с контактом, имеющим пометку GND (рис. 2.18). Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 57
GND — сокращение от английского слова ground — земля. Обозначает соединение с «минусом» питания электрической схемы соединений. Рис. 2.17. Ножки светодиодной сборки, которые можно вставить прямо в разъёмы платы Arduinо Рис. 2.18. Лицевая сторона модуля со светодиодами Схема подключения Если соединить ножку GND с соответствующим контактом на плате («минус» питания), а на остальные ножки светодиодного модуля подавать управляемый «плюс» с портов Arduino, ток будет течь через светодиоды, вызывая их свечение. Попробуем! И заодно познакомимся с новыми элементами платы Arduino Uno. Посмотрите на схему разъёмов Arduino (рис. 2.19). На ней отображены 14 цифровых портов и контакт платы GND. Дополнительно отметим кнопку RESET, нажатие которой вызывает перезагрузку контроллера. Если при работе Рис. 2.19. Схема цифровых разъёмов платы Arduino Uno 58 ГЛАВА 2
ваших программ что-то сбивается в работе платы, программа перестаёт работать корректно (правильно), помочь может нажатие на кнопку перезагрузки. Другой способ перезагрузить контроллер — отключить питание (выдернуть провод USB) и подключить его снова. При этом, если вы столкнулись с проблемами повторного подключения (флажок соединения в меню не выставляется), можно попробовать перезапустить среду mBlock. Соедините модуль светодиодной сборки с платой Arduino. Выберите такое расположение модуля, чтобы ножка GND сборки попала в гнездо GND на плате Arduino, а ножки D1–D6 сборки были соединены с цифровыми портами D8–D13 платы Arduino Uno (рис. 2.20). Если вы ошибётесь, ничего страшного не произойдёт, просто вставьте сборку заново. Тем не менее, и сейчас, и в будущем, будьте аккуратны при подключении новых компонентов и по возможности при монтаже отсоединяйте питание платы. Кстати, название D8 обозначает цифровой (Digital) порт Arduino под номером 8. Напомним, что цифровой порт имеет лишь два возможных состояния: 0 (напряжения нет) и 1 (напряжение есть). Рис. 2.20. Соединение светодиодной сборки с платой Arduino Uno Всё, монтаж закончен, можно «позажигать»! Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 59
Проект 1. Управляем одним светодиодом По аналогии со скриптом нашего подготовительного проекта (см. рис. 2.14) запустим программу «мигания» светодиода номер 1 из сборки. Необходимые компоненты • Плата Arduino Uno — 1 штука. • Кабель USB — 1 штука. • Светодиодная сборка (DC 3.3V 5V 12V 6bits Multicolor Rapid Prototyping LED 2.54mm PIN 0603 Package for Arduino Uno) — 1 штука. Порядок выполнения 1. Соедините плату Arduino и светодиодную сборку (см. рис. 2.20). 2. Подключите плату Arduino к компьютеру с помощью USB-кабеля. 3. Запустите среду программирования mBlock. 4. Настройте mBlock для работы с платой Arduino. (Примечание: если вы не экспериментировали с платой после прошлого подключения к mBlock, то единственное, что надо сделать вновь — показать порт соединения, как на рис. 2.9.) 5. Соберите программу, как в подготовительном проекте (см. рис. 2.14). Да-да, не удивляйтесь, программа не изменилась. Дело в том, что светодиод сборки, которым мы собираемся мигать, подключён к порту D13 (см. рис. 2.19), так же как и светодиод L на самой плате Arduino. И мы одним и тем же сигналом на порт D13 будем управлять и внешним, и внутренним светодиодом. Попробуйте. Если всё правильно, то оба светодиода будут загораться и гаснуть одновременно. 6. Обратите внимание, что после запуска программы одновременно загорелись и горят непрерывно светодиоды сборки под номерами 4 и 5. Значит, на эти порты изначально идёт сигнал не «0», а «1». Возможно, эту особенность прошивки mBlock изменят в будущих версиях, мы же пока просто добавим пару блоков, для того чтобы «погасить» эти диоды во время работы программы. Посмотрим, к каким портам на плате они подсоединены. Это порты Arduino D9 и D10. Установим их в значение 60 ГЛАВА 2
LOW (или 0) — см. рис. 2.21 (раз уж зашла речь, откроем маленькую тайну: по умолчанию в значение HIGH установлены еще и порты D4 и D7 Arduino, но это нам сейчас не мешает). 7. Запустите программу. Видите — на модуле сборки мигает только один светодиод, подключённый к порту D13, а также мигает светодиод непосредственно на плате Arduino. Рис. 2.21. Установим в значение LOW (или 0) порты D9 и D10 8. Сохраните проект с именем Проект_1.sb2 с помощью команды Save project As (Сохранить проект как) из меню Файл. Совет Рекомендуется сохранять все созданные проекты, чтобы их можно было использовать в дальнейшем. Давайте им осмысленные названия, чтобы в будущем не путаться в выборе. Задание Измените программу так, чтобы «помигать» любым другим светодиодом сборки. Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 61
Проект 2. Управляем несколькими светодиодами Давайте придумаем и реализуем какой-нибудь «художественный» способ управления светодиодами сборки. Например, запрограммируем «бегущие огни» (их еще называют «муравьиной дорожкой») и разные другие варианты иллюминации. Получится этакая «цветомузыкальная установка», способная «проигрывать» разные ритмы по нашей команде. Вариант 1. Решаем «в лоб» Конечно, можно просто по очереди быстро включать-выключать светодиоды, как в предыдущем проекте (см. рис. 2.21), тем более что операция дублирования (щёлкнуть по блоку правой кнопкой мыши и в меню выбрать команду дубликат) позволяет существенно ускорить процесс создания новой программы. Но получится нечто очень громоздкое (рис. 2.22). Вариант 2. Используем собственные блоки Рис. 2.22. Примитивный и громоздкий вариант программы Мы ведь умеем создавать собственные блоки! Убедимся, насколько удобен такой вариант. Создадим блок «мигания» светодиодом с выбором номера порта подключения и времени свечения светодиода. 1. Создайте новый блок (в категории Данные и Блоки нажмите кнопку Сделайте блок) и назовите его Светодиод. 2. Определим параметры нового блока. Добавьте два поля ввода числа, назвав поля соответственно порт и время (рис. 2.23). 62 ГЛАВА 2
Рис. 2.23. Создание блока 3. Определим, что будет делать данный блок. Соберите под его вводным блоком скрипт, включающий светодиод на некоторое время, а затем выключающий его. Номер порта и время свечения задайте параметрами блока . Для этого перетащите их в нужные поля (рис. 2.24). Рис. 2.24. Описание блока 4. Теперь создайте программу «Бегущие огни», но уже на основе нового блока (рис. 2.25). С использованием команды дубликат это совсем просто. Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 63
Рис. 2.25. Программа «Бегущие огни» Соберём «цветомузыкальную установку», добавив к нашей «муравьиной дорожке» дополнительные скрипты. Первый будет зажигать и гасить светодиоды, «проигрывая» определенный ритм, а запускаться при нажатии клавиши <Z> (рис. 2.26). Попробуйте использовать предложенный вариант либо придумайте на его основе собственный. Второй скрипт будет оставлять один из светодиодов непогашенным (рис. 2.27). Пусть запуск будет происходить при нажатии клавиши <V>. Рис. 2.26. Первый дополнительный скрипт для «цветомузыки» 64 Рис. 2.27. Второй дополнительный скрипт для «цветомузыки» ГЛАВА 2
Отредактируйте время горения светодиодов в скрипте «бегущие огни» в соответствии с рис. 2.28. Для этого удобно использовать копирование и вставку значения из буфера обмена (<Ctrl>+<C> и <Ctrl>+<V>). А теперь попробуйте «наиграть» собственный ритм, нажимая на клавиши <Z> и <V>, запуская и останавливая основную программу. Понаблюдайте за тем, что происходит. Разные скрипты работают одновременно и управляют свечением одних и тех же светодиодов. Сохраните проект с именем Проект_2.sb2. Кстати, если вы ещё не обратили внимание, заметьте: и Scratch, и mBlock действительно умеют проигрывать звуки! В палитре скриптов есть раздел, который так и называется — Звук. Теперь вы можете доработать свою «цветомузыкальную установку» по собственному усмотрению. Рис. 2.28. Полный набор скриптов «цветомузыкальной установки» Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 65
Задания 1. Добавьте в свой проект звуки, сопровождающие свечение светодиодов, придумайте скрипты для собственных ритмов. 2. Исследуйте некоторые особенности интерактивного режима mBlock. Проверьте, как меняется состояние портов D9, D10 при и при перезагрузке платы Arduino нажатии на кнопку Стоп кнопкой Reset. 3. Создайте скрипт для перевода порта D11 в состояние HIGH. Проведите аналогичные проверки для этого порта. 4. Попробуйте написать программу, которая будет последовательно зажигать светодиоды с использованием цикла, переменной и изменения значения переменной. Мы узнали, что... 66 • К плате Arduino Uno можно подключать внешние компоненты (например, светодиоды), для управления которыми можно использовать цифровые порты D0–D13. • При управлении Arduino из среды mBlock на портах D9 и D10, а также D4 и D7 по умолчанию присутствует сигнал «1» («высокий», HIGH), и это нужно учитывать в проектах. ГЛАВА 2
Расширенные возможности цифровых портов Arduino Вы научились использовать цифровые порты Arduino для включения и выключения светодиодов. По сути, вы либо подавали напряжение +5 В (сигнал HIGH или «1») на порт, либо убирали его (сигнал LOW или «0»). Если бы этот сигнал управлял работой прожектора, тот включался бы на полную мощность либо полностью отключался. А что делать, если мы хотим эту мощность плавно менять? +5 В — так записывают напряжение. Читается «плюс пять вольт». Широтно-импульсная модуляция Посмотрите внимательно на обозначения цифровых портов на плате Arduino (см. рис. 2.19). Около некоторых стоят специальные пометки, показывающие их «особенные» свойства. Порты D3, D5, D6, D9, D10, D11 отмечены символом «тильда» ~. Это значит, что они умеют не только включать или отключать управляющий сигнал, но и модулировать (изменять) его особым способом, который называется широтно-импульсной модуляцией (ШИМ, поанглийски — Pulse Width Modulation или PWM). В таком режиме напряжение на порт Arduino подаётся не непрерывно, а импульсами, с регулируемой длительностью как самих импульсов, так и пауз между ними (рис. 2.29). Площадь прямоугольников, выделенных синим цветом, показывает количество энергии, которая попадает на внешнее устройство, в нашем случае — светодиод. Очевидно, что при импульсном управлении светодиод получит меньше энергии, поэтому яркость свечения уменьшится. Это и есть принцип работы ШИМ. Если портам D3, D5, D6, D9, D10, D11 при помощи специальных команд отправлять значения от 0 до 255, можно менять ширину импульсов и пауз, управляя таким образом мощностью подключённых устройств. 0 — полностью выключено, 255 — включено на полную мощность, от 1 до 254 — промежуточные значения мощности (1 — импульсы очень короткие, 254 — паузы очень короткие). Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 67
Рис. 2.29. В режиме ШИМ управляющий сигнал с порта Arduino на внешнее устройство подаётся импульсами Проект 3. Изменяем яркость свечения светодиода с помощью широтно-импульсной модуляции Теперь мы можем регулировать яркость свечения светодиодов на нашей сборке с помощью ШИМ. 1. Подключите плату Arduino со светодиодной сборкой к компьютеру с помощью кабеля USB, запустите mBlock и установите соединение с необходимым COM-портом. 2. Вытащите в область скриптов блок работы с ШИМ-портами из категории Робот (рис. 2.30). Рис. 2.30. Блок работы с ШИМ-портами 68 ГЛАВА 2
3. Выберите порт с ШИМ, к которому подключён один из наших светодиодов, например, D11 (наберите «11» в первом поле блока). 4. Поменяйте значение ШИМ в списке выбора (выбрав из списка или введя значение с клавиатуры), щёлкните по блоку и убедитесь, что светодиод меняет яркость. Опробуйте произвольные значения от 0 до 255. Если вы решили использовать для запуска блок (либо нажали кнопку Старт или Стоп случайно), отключите светодиоды на портах D9 и D10, чтобы их свечение вам не мешало (рис. 2.31). Рис. 2.31. Блоки отключения светодиодов на портах 9 и 10 Ну вот, мы убедились, что использовать широтно-импульсную модуляцию для управления мощностью совсем несложно. Задания 1. Посмотрите, у каких ещё светодиодов сборки можно менять яркость. Проведите эксперимент. 2. Проверьте, что получится, если записать в порт ШИМ следующие значения: 1, –1, 256, 257, 511, 512, 513, 514. Попробуйте найти закономерность и понять, почему мощность сигнала меняется наблюдаемым образом. Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 69
Проект 4. Программируем циклическое изменение яркости свечения светодиода Составим программу, которая будет плавно изменять яркость светодиода на порту D11, подавая сигнал от 0 до 255 и обратно с шагом изменения 5. Шаг изменения — это величина, на которую изменяется значение переменной в каждой итерации цикла. Например, при шаге изменения 5 числа от 0 до 255 изменяются так: 0, 5, 10, 15, ..., 250, 255. Один из примеров реализации показан на рис. 2.32. Обратите внимание, что для значений яркости светодиода и шага изменения яркости мы ввели соответствующие переменные. Рис. 2.32. Плавное изменение яркости свечения светодиодов Проанализируйте программу, проверьте её работоспособность. Сохраните проект с именем Проект_4.sb2. В будущем не забывайте сохранять свои проекты, мы всё реже будем напоминать о необходимости этого действия. 70 ГЛАВА 2
Задания 1. Понаблюдайте за изменением значений переменной яркость в окне mBlock (слева, вверху окна сцены). Значения меняются слишком быстро? Добавьте после блока установки сигнала из категории Контроль. ШИМ блок 2. Поменяйте шаг яркости, например, на 12. Посмотрите на изменение показаний яркости. Получается ли достигнуть 0 или 255? Правильно, в нашем примере это не получается. Подумайте, как можно это исправить, и попытайтесь найти универсальное решение для любого шага изменения яркости. 3. Вы научились изменять сигнал на специальных ШИМ-портах Arduino. Теперь вы можете создавать программы, в которых некоторые светодиоды сборки будут не просто зажигаться и гаснуть, а изменять свечение в соответствии с вашим замыслом. Попробуйте создать несколько художественных световых композиций с участием всех светодиодов. Мы узнали, что... Порты на плате Arduino, отмеченные символом «тильда» ~, можно использовать не только для включения или выключения управляющего сигнала, но и для подачи сигнала особым способом, который называется широтно-импульсной модуляцией (ШИМ, по-английски Pulse Width Modulation или PWM). В режиме ШИМ сигнал может принимать значения от 0 до 255. Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 71
Макетная плата — инструмент для творческого конструирования Ранее вы подключили готовый светодиодный модуль непосредственно к разъёмам контроллера Arduino. Это было просто и удобно, но как быть, если подключить надо отдельный светодиод с резистором или ряд других электронных компонентов? А если эти компоненты должны быть соединены друг с другом сложным образом? Для подобных случаев используется контактная макетная плата. Контактная макетная плата Контактная макетная плата — очень удобная конструкция для экспериментов с электроникой без применения паяльника! Эти платы сейчас выпускают самых разных размеров, но всех их объединяет общий принцип использования: радиоэлементы просто вставляются в контактные отверстия и удерживаются подпружиненными внутренними зажимами (такие зажимы называют ца́нговыми, что дало этому типу плат ещё одно название — цанговые макетные платы). Создают нужную схему путём комбинирования внутренних электрических связей и внешних соединений с помощью проводов (рис. 2.33). Рис. 2.33. Платы с различным количеством контактов — 800, 400, 170 72 ГЛАВА 2
Контактные посадочные места электрически связаны друг с другом определённым образом (рис. 2.34). Рис. 2.34. Макетные платы. Зелёными, красными и синими линиями показаны внутренние соединения контактов Рассмотрим популярную макетную плату на 400 контактов: • все отверстия вдоль красной линии соединены между собой и служат, как правило, для подачи питания; • все отверстия вдоль синей линии тоже электрически соединены друг с другом и играют роль шины заземления; • каждые пять отверстий, расположенных вертикальными рядами, также соединены друг с другом. Примечание Обратите внимание, что для маленьких макетных плат на 170 контактов шины питания и заземления отсутствуют. Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 73
Шилд прототипирования Для небольших проектов удобно использовать шилд прототипирования, включающий макетную плату малого размера (рис. 2.35). Собранное устройство получается компактным, его легко носить с собой. Прототипирование (от английского слова prototyping) — первичная («черновая») реализация задуманной изобретателем системы, в нашем случае — электрической схемы с микроконтроллером. Такой прототип должен легко собираться, желательно без пайки, и обеспечивать основную работоспособность устройства. Инженеры, используя прототип, исправляют ошибки, допущенные в ходе «придумывания» схемы, и находят оптимальные решения по компоновке деталей. Шилд прототипирования облегчает подключение разнообразных компонентов как с применением пайки, так и беспаечным способом. Помимо того, что продублированы все порты и прочие контакты Arduino (а также кнопка RESET), на плате есть два ряда разъёмов с питанием +5 В (VCC) и заземлением (GND). В результате появляется возможность одновременного использования сразу нескольких внешних модулей с трёхпроводным подключением, ведь каждому из них требуется собственная пара контактов VCC и GND. Макетная плата удобно и надежно крепится на шилде благодаря клейкой основе, причём близость всех нужных контактов позволяет применять короткие соединительные провода, а во многих случаях вообще обойтись без них (за счёт подключения одной из ножек радиодетали непосредственно к разъёму на шилде). В своих инструкциях мы будем опираться на электрические схемы, построенные на базе большой макетной платы (так удобнее), но дополнять их фотографиями сборки с использованием шилда прототипирования. Выбирайте любой подходяРис. 2.35. Проект на основе шилда щий вам вариант. прототипирования и малой макетной платы 74 ГЛАВА 2
Проект 5. Монтируем светодиод на макетной плате Установим на макетную плату светодиод, подключим его к порту D13 на плате Arduino и «помигаем» (воспользуемся программой для циклического включения и выключения светодиода). Необходимые компоненты • Плата Arduino Uno — 1 штука. • Кабель USB — 1 штука. • Светодиод — 1 штука. • Резистор 220 Ом — 1 штука. Схема подключения к Arduino Схема подключения приведена на рис. 2.36. Рис. 2.36. Схема подключения светодиода 1. Светодиод и резистор разместите на макетной плате и с помощью проводов подключите к порту D13 и контакту GND на плате Arduino (рис. 2.37). Выполнять соединения можно проводами разных цветов, но рекомендуем придерживаться логичной схемы — синие провода ведут к «–», красные — к «+». Учтите полярность подключения светодиода — длинная нога подключается к «+» (порт D13), короткая — к «–» (контакт GND). Внимание! Поскольку мы не использовали специальные горизонтальные контактные группы для средней платы (что вполне допустимо для проектов, содержащих не очень большое количество элементов), то схемы подключения к большой и малой платам одинаковы, так что в будущем мы ограничимся только одним вариантом рисунка. Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 75
Светодиодный индикатор [4] Светодиодный индикатор излучает свет при подаче небольшого постоянного тока — около 20 мА (а иногда намного меньше) — при напряжении менее 5 В (см. схему подключения светодиода). Собственное сопротивление светодиода после насыщения очень мало, и без резистора, ограничивающего ток через светодиод, он перегорит. Приблизительное значение номинала токоограничительного резистора (R) можно вычислить с помощью очень простой формулы R=(VCC-VF)/I, в которой R обозначает номинал резистора, VCC — напряжение источника питания, VF — указанное для светодиода прямое напряжение, а I — требуемую силу тока. В схемах с напряжением 5 В подойдёт резистор мощностью 0,125 Вт. Миллиампер (или мА) — это обозначение единицы измерения силы тока. Вольт (или В) — это обозначение единицы измерения напряжения. Ватт (или Вт) — это обозначение единицы измерения мощности. 76 ГЛАВА 2
Рис. 2.37. Схема соединения для средней и малой плат 2. Проверьте, что подключён USB-кабель, выбран порт соединения, на устройство загружена соответствующая прошивка для управления с использованием среды mBlock. 3. Загрузите программу «мигания» встроенным светодиодом L, которую мы использовали при тестировании подключения платы (см. рис. 2.14). 4. Щёлкните по флажку . Светодиод начнёт мигать. Вот вы и провели первые монтажные работы на макетной плате. Теперь можно использовать отдельные светодиоды в наших игровых проектах, например, для проверки состояния связи платы и компьютера или индикации Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 77
игровых состояний. В этом плане использовать готовую светодиодную сборку не всегда удобно, так как она занимает сразу шесть портов управления, а они могут потребоваться для подключения других компонентов. Задания 1. Подключите светодиод к порту D11. 2. Проверьте работоспособность управления светодиодом по ШИМ. Можно воспользоваться программой на рис. 2.32. Из неё можно убрать пару верхних блоков, которыми раньше «гасили» светодиоды на портах D9 и D10. Сейчас у нас только один светодиод, и необходимость в этих блоках отпадает. Проект 6. Светодиодная сборка своими руками Если требуется подключить сразу несколько светодиодов, основная схема подключения каждого из них остаётся неизменной, просто надо подумать, как разместить на плате соответствующее число светодиодов и резисторов. Создадим аналог готовой светодиодной сборки (см. рис. 2.20) из отдельных светодиодов и резисторов, смонтировав их на макетной плате. Необходимые компоненты 78 • Плата Arduino Uno — 1 штука. • Кабель USB — 1 штука. • Светодиод красный — 1 штука. • Светодиод оранжевый — 1 штука. • Светодиод жёлтый — 1 штука. • Светодиод зелёный — 1 штука. • Светодиод синий — 1 штука. • Светодиод белый — 1 штука. • Резисторы 220 Ом — 6 штук. • Отрезки провода — 7 штук. ГЛАВА 2
Схема подключения Электрическая схема показана на рис. 2.38. При монтаже на большой макетной плате мы используем отмеченный синим продольный ряд посадочных гнёзд в качестве заземления, соединив его с контактом GND контроллера Arduino (рис. 2.39). Цвета светодиодов на схеме условны. Примечание Ещё раз напомним, что контактов GND на плате Arduino несколько, и для монтажа можно использовать любой из них. Рис. 2.38. Электрическая схема подключения шести светодиодов Рис. 2.39. Один из вариантов монтажа светодиодной сборки с использованием большой макетной платы Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 79
Взаимное расположение платы, резисторов, а также длину проводов, точки подключения выбирайте в соответствии с оборудованием, которое у вас есть. Порядок подключения резистора со светодиодом к управляющему пину роли не играет («пин — светодиод — резистор — земля» либо «пин — резистор — светодиод — земля»). Посмотрите, как по-разному может выглядеть одна и та же схема подключения при использовании большой (рис. 2.40) и малой (рис. 2.41) макетных плат. Рис. 2.40. Размещение светодиодов на большой плате Рис. 2.41. Пример компоновки светодиодов на малой плате При любом варианте монтажа у нас получился аналог промышленной светодиодной сборки. Да, он несколько громоздок, зато вы теперь понимаете, что для разработки такого устройства требуется решить множество задач: придумать монтажную схему, создать прототип на контактной макетной плате, провести отладку. При подготовке к серийному производству эти шаги были бы дополнены проверкой спаянного вручную рабочего прототипа изделия, оптимизацией размеров и прочих характеристик, отладкой производственного процесса и так далее. 80 ГЛАВА 2
Прототип — первоначальный образец, прообраз будущей платы. Оптимизация — выбор наилучшего (оптимального) варианта из множества возможных. Для нас же пока вполне достаточно того, что полученное изделие позволяет нам провести все нужные эксперименты. Тот, кто хочет, может вернуться к уже пройденным проектам, для того чтобы проверить, как будет работать в них собственноручно собранное устройство. Мы узнали, что... • Для создания макетов будущих электронных устройств используют макетные платы различных размеров. Контактные (цанговые) макетные платы позволяют собирать схемы без использования паяльника. • Для создания компактных прототипов электронных устройств удобно использовать специальные шилды (платы расширения) прототипирования. Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 81
Обычная кнопка — пример цифрового датчика Мы подошли к использованию датчиков (или сенсоров — от английского слова sensor). Собранные нами устройства будут не так уж полезны, если не научить их реагировать на события окружающей действительности. Каждый цифровой порт Arduino Uno умеет не только генерировать сигнал, но и «слушать». Этот режим называется INPUT («на вход», в противоположность OUTPUT, «на выход»), и именно он является базовым, исходным для любого цифрового порта, режимом работы по умолчанию. Примечание Поскольку каждый цифровой порт способен работать на чтение и на запись, в большинстве случаев требуется вручную переключать его в необходимый режим. При использовании интерактивного управления в среде mBlock эту функцию берёт на себя прошивка платы Arduino, выбор нужного режима происходит автоматически. При текстовом программировании разработчикам приходится использовать специальные команды для смены режима работы. Чтобы узнать состояние цифрового порта, надо провести чтение данных, результатом которого будет значение 0 (LOW), если пин электрически связан с контактом GND, или 1 (HIGH) в случае соединения с контактом VCC (+5 В). А что произойдёт, если нет электрического соединения ни с контактом VCC, ни с контактом GND? Получим случайное значение, 0 или 1. Наш пин работает как антенна и ловит электрическую активность расположенных вокруг источников радиопомех. Простые цифровые датчики предоставляют очень мало сведений для микроконтроллера. Возможно лишь два значения: 1 или 0, а иными словами, HIGH или LOW, «да» или «нет», истина (True) или ложь (False). Тем не менее в такой лаконичности есть и свои плюсы. Нам требуется понимать, что подразумевается под истиной или ложью, и мы сумеем объяснить устройству, что нужно сделать в одном и в другом случае. А о том, какие существуют способы для получения более полной информации о происходящем, мы поговорим чуть позже. 82 ГЛАВА 2
Примером элементарного цифрового датчика может служить обычная кнопка, имеющая лишь два состояния: «нажато» и «не нажато». Негусто, однако достаточно, для того чтобы наш Arduino-проект заработал с учётом происходящего в реальном мире. Попробуем! Что требуется освоить? Подключим к плате Arduino кнопку и научимся считывать её значение. Напишем программу, зажигающую встроенный светодиод при нажатии на кнопку. Компоненты Проще и удобнее использовать уже готовый модуль с кнопкой, имеющий трёхконтактное подключение (рис. 2.42, слева): • VCC (Volten current continue, «+» питания, требуется подключить к гнезду +5V на плате Arduino); • GND (Ground, «земля», подключить к одноимённому гнезду на плате); • OUT (Output, «Signal» — «выход», «сигнал», подключить к цифровому порту на плате, состояние которого мы будем проверять, например, D2). Такое трёхконтактное подключение часто называют подключением SVG («сигнал», «питание», «земля»). Если подобного модуля нет, то можно взять обычную тактовую кнопку (рис. 2.42, справа) и резистор (с сопротивлением от 10 до 100 килоом), который нужен, чтобы устранить действие радиопомех. Резистор «притягивает» Рис. 2.42. Модуль «кнопка» (слева) и тактовая кнопка (справа) Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 83
электрическое напряжение на пине либо к «земле» (так называемый стягивающий резистор), либо к питанию (подтягивающий резистор), при этом слабые радиопомехи оказываются не в силах преодолеть это влияние. На рис. 2.43 изображена схема с использованием стягивающего резистора. Если контакт кнопки разомкнут, прочитанное Рис. 2.43. Подключение кнопки с использованием стягивающего значение цифрового порта будет равно резистора LOW (False, ложь). В случае замыкания контакта пин окажется соединённым с питанием +5 В напрямую, а с заземлением — через резистор, поэтому значением порта станет HIGH (True, истина). Примечание Если присмотреться к схеме на рис. 2.43, то можно увидеть, что она не содержит элементов, для которых была бы важна полярность. Иными словами, при подключении модуля кнопки можно безбоязненно поменять местами контакты VCC и GND. В этом случае стягивающий резистор превратится в подтягивающий, при ненажатой кнопке будет прочитано значение HIGH (True), а при нажатой — LOW (False). Говорят, что сигнал становится инвертированным (обращенным в противоположную сторону). Варианты подключения Использовать готовый трёхконтактный модуль очень просто. Понадобится лишь три провода (рис. 2.44). Для использования тактовой кнопки придётся собрать несложную схему. На рис. 2.45 показан возможный вариант монтажа, который годится и для большой, и для малой макетной платы. Обратите внимание, что обычная тактовая кнопка с четырьмя ножками имеет лишь два контакта. На рисунке левая пара ножек — один контакт, а правая — другой. На рис. 2.46 изображены возможные варианты размещения кнопок на шилде прототипирования. 84 ГЛАВА 2
Рис. 2.44. Модуль кнопки подключен к Arduino Uno Рис. 2.45. Монтажная схема кнопки с резистором Рис. 2.46. Варианты монтирования кнопки Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 85
Проверка готовности платы Arduino к работе с mBlock с помощью тестового скрипта Подсоедините кнопку к контроллеру Arduino, используя любой удобный вам вариант монтажа. Подключите Arduino к компьютеру при помощи USB-кабеля, запустите программу mBlock и установите соединение с платой. Давайте ещё раз вспомним, нам нужно: • проконтролировать, что в меню Boards выбрана плата Arduino Uno; • установить соединение с нужным коммуникационным портом компьютера; • быть уверенным, что на плату загружена прошивка для работы с mBlock (если есть сомнения, просто загрузите её ещё раз из меню Соединить командой Обновить прошивку). Создадим тестовый скрипт для проверки готовности платы Arduino работать с mBlock, а заодно освежим в памяти способы управления встроенным светодиодом, подключенным к порту D13. Советуем вам в каждый свой проект добавлять такой скрипт с однократным запуском при старте программы либо по отдельной команде. Вытащите на рабочее поле нужные блоки и объедините их (рис. 2.47). Рис. 2.47. Скрипт мигания встроенным светодиодом Запустите скрипт, щёлкнув по нему мышью. Светодиод поморгал? Отлично! Значит, есть соединение с платой, всё работает корректно. 86 ГЛАВА 2
Включение светодиода кнопкой Проверим работу кнопки, подключённой к контроллеру Arduino. Вытащите в область скриптов блок , измените номер порта (мы сейчас используем порт D2). Щёлкните по блоку мышью, должна появиться надпись false. Нажмите на кнопку, щёлкните по блоку ещё раз. Появилась надпись true (рис. 2.48). Всё верно? Наша схема работает, можно продолжать. Если же у вас все наоборот, надпись true появляется, когда кнопка не нажата, а false, когда нажата, значит, вы подключили кнопку таким образом, что резистор работает как подтягивающий. Исправьте подключение либо просто учтите этот момент в своей программе. Рис. 2.48. Блок считывания информации с цифрового порта Теперь научим нашего помощника Панду сообщать нам о состоянии кнопки. Соберём следующий скрипт и запустим его (рис. 2.49). Рис. 2.49. Панда говорит «1» или «0» Над спрайтом Панды появилось «облачко-окошко», в котором при нажатии и отпускании кнопки меняется значение (0 и 1). Как нам добиться того, чтобы Панда «выражалась яснее», может ли она использовать более понятный нам язык? Давайте задействуем для этого блок проверки условия (рис. 2.50). Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 87
Рис. 2.50. Панда говорит «Кнопка нажата» или «Кнопка отпущена» Проверили, всё правильно? Теперь легко добавить команды включения и отключения светодиода. И, кстати, проверка «равняется ли единица единице» совершенно избыточна. На компьютерном языке единица — это и есть истина, а ноль — ложь. Наша программа стала выглядеть вот так (рис. 2.51). Рис. 2.51. Управляем работой светодиода при помощи кнопки Итак, мы разобрались с использованием простых цифровых датчиков, а подключённая кнопка окажется полезной в наших следующих проектах (см. игровой проект «Голодная рыбка»). Давайте двигаться дальше! 88 ГЛАВА 2
Аналоговые датчики Посмотрите на плату Arduino, вы увидите ряд контактов, помеченных как A0–A5 (рис. 2.52). Это так называемые аналоговые порты, имеющие дополнительный и во многих случаях очень нужный режим работы. Каждый такой порт способен читать аналоговый сигнал, то есть преобразовывать поданное на контакт напряжение в цифровое значение от 0 до 1023. Если мы подобным образом будем измерять освещённость, мы не просто узнаем, есть свет или нет, а поймём, насколько он яркий (всего возможно 1024 варианта значений яркости, это 10-битное число, 210 = 1024). Например, если на аналоговый Рис. 2.52. Аналоговые порты Arduino Рис. 2.53. Преобразование аналогового сигнала в цифровой (на примере трёхбитного АЦП) Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 89
порт подать напряжение 0,5 В (одна десятая от напряжения VCC), прочитанным значением окажется 102 (одна десятая от 1024 с округлением до целого). Аналоговый сигнал преобразуется в цифровую форму (рис. 2.53). Отвечает за подобную работу аналогово-цифровой преобразователь (АЦП), встроенный в микроконтроллер. Аналоговые порты (см. рис. 2.52) обычно используют для снятия информации с различных датчиков (свет, звук, температура и так далее). Примечание Каждый аналоговый порт Arduino Uno также способен работать как совершенно обычный цифровой порт. Например, можно зажигать и гасить светодиод, подключённый к A0. При подобном использовании порты A0–A5 удобнее обозначать как D14–D19. Проект 7. Создаём заготовку для игры, перемещаем собачку потенциометром В электронном архиве содержатся инструкции для создания игры, в которой собачка будет играть с мячом, отскакивающим от стен и потолка. Давайте сейчас научимся управлять спрайтом собачки, чтобы можно было менять скорость и направление движения персонажа с помощью ползунка (слайдера — от английского слова slider) пропорционального потенциометра. Пропорциональный потенциометр (рис. 2.54) имеет три электрических контакта для подключения и использует нехитрый принцип работы. Когда крайние на схеме контакты подключены к источнику тока, электрический потенциал, а иными словами — напряжение на среднем подвижном (S — сигнальном) контакте определяется положением ползунка. Прочитанное на порту Arduino значение будет пропорционально (или почти пропорционально) меняться при перемещении ручки регулировки. Меняться пропорционально означает изменяться (увеличиваться или уменьшаться) во столько же раз, во сколько изменяется другая величина. 90 ГЛАВА 2
Рис. 2.54. Пропорциональный потенциометр: схема (слева) и внешний вид (справа) Монтажная схема изображена на рис. 2.55. В проектах Arduino преимущественно используются потенциометры с сопротивлением от 1 до 100 килоом. Рис. 2.55. Схема подключения потенциометра и светодиодов в проекте «Собачка» Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 91
Светодиоды подключены с соблюдением полярности, последовательно с резисторами номиналом 220 Ом. Новый проект и спрайт собачки 1. Создайте новый проект, дайте ему имя и сразу сохраните. 2. Удалите спрайт Панды. Добавьте из библиотеки спрайт Dog1 (собачка с лиловым носом). 3. Посмотрите, где находится центр спрайта. Это точка, вокруг которой будет происходить разворот. Используйте инструмент Установите костюм (рис. 2.56). Рис. 2.56. Установка центра спрайта 92 ГЛАВА 2
Сценарий для получения данных с потенциометра 1. Добавьте спрайту Dog1 сценарий для считывания и отображения показаний потенциометра (рис. 2.57). Этот сценарий содержит также блоки управления светодиодами. При запуске программы зажигается зелёный светодиод (D11), а горение оранжевого и жёлтого светодиодов (D9 и D10) будет сообщать о завершении программы. Рис. 2.57. Проверка работы потенциометра 2. Запустите программу, подвигайте ползунок. Проверьте, что диапазон значений максимальный, от 0 до 1023, либо близок к максимальному, а среднее (511) достигается перемещением ручки в середину. Обратите внимание, что считываемое значение может слегка меняться даже при неподвижном слайдере. Сценарий перемещения собачки Теперь заставим собачку перемещаться в соответствии с положением ползунка. Когда ползунок установлен примерно посередине, значение порта A0 близко к 511. В этом случае скорость собачки почти нулевая. При отклонении ползунка от среднего значения собачка должна начать двигаться либо направо (положительное значение скорости), либо налево (отрицательное значение скорости). Для этого: 1. Создайте глобальную переменную скорость_собачки. 2. Замените блок блоком , который позволит получать переменной скорость_собачки значения порта A0. Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 93
3. Напишите сценарий перемещения собачки в зависимости от значения потенциометра. Полный сценарий для спрайта собачки приведён на рис. 2.58. Нажмите на флажок Старт. Теперь вы можете управлять движением вправовлево с помощью потенциометра. Рис. 2.58. Скрипт спрайта Dog1 Внимание! В электронном архиве к книге приведены инструкции для создания игры «Dog Basketball», в которой собачка не просто перемещается по экрану, но и играет с баскетбольным мячом. 94 ГЛАВА 2
Проект 8. Управляем спрайтом с помощью модуля кнопок Управлять перемещением персонажей игр можно с помощью разнообразных устройств ввода. В игровом проекте «SpaceShips», приведённом в электронном архиве, мы используем для этого модуль кнопочной сборки. Космический кораблик поворачивается, стреляет и перемещается, реагируя на нажатия кнопок. Модуль кнопочной сборки представляет собой своего рода мини-джойстик из пяти кнопок, помеченных как sw1, ..., sw5 (рис. 2.59). Он имеет три электрических контакта: два контакта питания Рис. 2.59. Кнопочный модуль (GND и VCC) и один OUT для подключения к аналоговому порту Arduino. Как же можно прочитать данные о нажатии одной из пяти кнопок через один контакт OUT? Чтобы понять это, придётся обратиться к электрической схеме. Рассмотрим вариант с четырьмя кнопками (рис. 2.60). Для нашего проекта такого количества будет достаточно. Подсоединим разъём OUT к аналоговому порту на плате Arduino, и мы будем получать разные значения при нажатии различных кнопок. Показания Рис. 2.60. Схема кнопочного модуля Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 95
порта будут зависеть от соотношения сопротивлений резисторов в верхней и нижней частях схемы (их возможные номиналы указаны на рисунке). Если у вас нет готовой кнопочной сборки, то вам придётся собрать собственный вариант на макетной плате. Посмотрите на вариант монтажа с кнопками, расположенными в ряд (рис. 2.61). Как разместить их иначе, удобным для вас образом, подумайте сами. Рис. 2.61. Вариант монтажа кнопочной сборки на макетной плате Сценарий 1. Создайте и сохраните новый проект. 2. Создайте глобальную переменную состояние_кнопок. Флажок возле имени переменной снимите. 3. Соберите скрипт считывания состояния порта A0 в глобальную переменную состояние_кнопок. Для отображения прочитанного значения мы будем использовать команду сказать (состояние_кнопок). 4. Соберите сценарий (рис. 2.62). Обратите внимание, что в блоке мы используем управление светодиодами для индикации работы устройства, для чего в монтажной схеме на рис. 2.61 преду- 96 ГЛАВА 2
смотрено подключение готовой или сборной светодиодной сборки. Возможен и упрощённый вариант проекта, без использования светодиодной сборки. Тогда для индикации работоспособности устройства можно использовать встроенный в плату Arduino светодиод. Поскольку встроенный светодиод подключён к пину 13, то менять сценарий не потребуется. Рис. 2.62. Сценарий для отображения значений аналогового порта при нажатии кнопок Теперь, запустив программу, вы сможете выяснить значение порта A0 при нажатии каждой кнопки (рис. 2.63). Рис. 2.63. Спрайт отображает значение, связанное с нажатой кнопкой Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 97
Примечание В электронном архиве к книге приведена игра «SpaceShips», в которой одновременно участвуют два игрока. Игрокам необходимо наперегонки расстреливать метеориты, получая очки за попадание в цель. Один из игроков управляет своим боевым кораблём с помощью клавиатуры, а второй — с помощью кнопочного пульта. Приложены пошаговая инструкция и файлы проекта. Рекомендуем попробовать, игра интересная, а вы научитесь использовать кнопочную сборку в своих проектах! Возможности сложных цифровых датчиков Рассказывая о датчиках, стоит упомянуть, что они могут быть весьма головоломными устройствами со сложными принципами работы. В программе подчас приходится применять многоэтапную обработку результатов измерений. Даже простой сигнал «да/нет», «единица/ноль» может нести в себе массу информации, быть модулированным (помните наш разговор о ШИМ?). Например, при использовании распространённого датчика расстояния — ультразвукового дальномера — необходимо определить длительность ответного электрического импульса. Это позволяет узнать время, которое потребовалось звуку, чтобы долететь до препятствия и вернуться обратно, а зная скорость звука, вычислить дистанцию. В другом случае, напротив, использовать выходной сигнал датчика будет очень легко, несмотря на то что принцип действия самого устройства может быть потрясающе сложным. Сенсор пожарной сигнализации может срабатывать на основании измерений температуры, задымления, уровня теплового излучения, количества углекислого, угарного газа и прочих параметров. По сути, сам датчик должен иметь микроконтроллер, чтобы произвести сложный анализ всех показаний и выдать в конце концов очень простой сигнал: есть пожар (HIGH) или нет (LOW). Примером устройства, конструктивно сложного, но простого в использовании и распространённого, может быть сенсор движения, который применяется 98 ГЛАВА 2
для включения освещения при появлении человека. К сожалению, пока этот датчик срабатывает и во многих других ситуациях. Но недалеко время, когда «умные вещи» научатся не только определять, что человек улыбнулся, например (эта задача вполне по силам современным фотоаппаратам и смартфонам), но и узнавать каждого из нас, реагируя лишь на своего хозяина. Давайте попробуем реализовать пару проектов посложнее с использованием «умных» датчиков. Проект 9. Охранная система на базе инфракрасного датчика движения Создадим модель охранной системы дома. Пассивный инфракрасный датчик движения будет контролировать пространство вокруг себя и в случае обнаружения опасности «разбудит» собаку, которая выбежит и начнёт лаять. Подключите инфракрасный датчик движения к плате Arduino Uno (рис. 2.64). Рис. 2.64. Подключение инфракрасного датчика движения к Arduino Uno Сценарий 1. Создайте и сохраните новый проект. Удалите спрайт панды. Добавьте из библиотеки спрайт Dog1 собачки с лиловым носом. Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 99
Модуль пассивного инфракрасного датчика [5] Модуль на основе пассивного инфракрасного датчика содержит несколько компонентов. Заметнее всего матрица из 15 небольших линз, которые фокусируют инфракрасное излучение из разных участков окружающего пространства на пироэлектрический детектор. Его основу составляет пластина из танталата лития, которая вырабатывает небольшое напряжение в ответ на поступающее тепловое излучение. Линзы нужны для того, чтобы чувствительные элементы срабатывали один за другим. Каждая линза направлена в сторону одной из целевых зон. Когда источник инфракрасного излучения перемещается из одной зоны в другую, элементы по очереди срабатывают и генерируется выходной сигнал. С помощью дополнительной электронной схемы пользователь может регулировать чувствительность инфракрасного модуля, а также интервал времени, в течение которого реле остаётся замкнутым. Модуль пассивного инфракрасного датчика 100 ГЛАВА 2
2. Выберите фон для вашей сцены. Мы выбрали из библиотеки фон pathway. 3. Создайте глобальную переменную alarm. 4. Соберите сценарий, который считывает состояния порта D2 в глобальную переменную alarm. Если значение переменной alarm становится равным 1, то как из-под земли на сцене появляется собака, начинает носиться и лаять. Как только все движения прекратятся (alarm = 0), собака замолчит и спрячется (рис. 2.65). Рис. 2.65. Программа охранной сигнализации и результат её работы Задания 1. Добавьте в свой проект звуки. 2. Попробуйте изменить программу так, чтобы сенсор движения будил собаку только в ночное время. Для этого воспользуйтесь датчиком освещённости (фоторезистором). В случае возникновения сложностей обратитесь к проекту «Умный домик». Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 101
Проект 10. Парктроник автомобиля на базе ультразвукового дальномера Создадим проект, который будет имитировать работу парктроника автомобиля. Для этого подключим к контроллеру Arduino ультразвуковой датчик, измеряющий расстояние до объекта. Парковать автомобиль будем задним ходом в лесу у ёлки, которую будем наблюдать в «зеркало заднего вида» на экране компьютера. Если автомобиль приблизится к ёлке на расстояние менее 10 см, загорится светодиод, и вы услышите предупреждающий звуковой сигнал. Парктро́ник или парковочный рада́р — электронная система, которая следит за расстоянием между автомобилем и окружающими предметами. Ультразвуковой датчик [5] Принцип работы ультразвукового датчика приближения основан на излучении коротких импульсов ультразвука с последующим приёмом эхосигналов от объектов, расположенных перед датчиком. Недорогой ультразвуковой датчик приближения HC-SR04 популярен среди любителей робототехники, он надёжно работает на расстояниях от 2 см до 5 м. Ультразвуковой датчик HC-SR04 102 ГЛАВА 2
Соберите электрическую схему (рис. 2.66): 1. Подключите выводы VCC, Trig, Echo, GND модуля HC-SR04 соответственно к выводам 5V, D4, D3, GND платы Arduino. 2. Подключите одну ножку светодиода к контакту D12, а вторую — через сопротивление 220 Ом к контакту GND. Можно воспользоваться макетной платой. Рис. 2.66. Схема подключения ультразвукового датчика HC-SR04 Теперь напишем сценарий. 1. Создайте и сохраните новый проект. 2. Удалите спрайт панды. Добавьте из библиотеки спрайт ёлки с именем Tree. 3. Создайте глобальную переменную дистанция. 4. Соберите сценарий, который считывает расстояние до объекта в глобальную переменную дистанция. Если значение переменной дистанция Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 103
будет меньше 10 (то есть объект приблизился к датчику на расстояние меньше 10 см), то на контакт D12 поступает сигнал HIGH, который включает светодиод, затем появляется надпись «БАМС!!!» и звучит бубен (рис. 2.67). Рис. 2.67. Сценарий для парктроника Щёлкните мышью по . Замигал встроенный светодиод. Начинаем парковку. Приближайте датчик расстояния к любому препятствию (или просто пододвигайте ладонь ближе). На сцене будет отображаться расстояние от датчика до объекта (в переменной дистанция), и ёлка будет приближаться в окне сцены (в «зеркале заднего вида») по мере уменьшения расстояния. Если расстояние окажется менее 10 см, то появится надпись «БАМС!!!», и вы услышите звук бубна (рис. 2.68). 104 ГЛАВА 2
Рис. 2.68. Вид в «зеркало заднего вида» при парковке в лесу Задание Добавьте в проект несколько светодиодов (или светодиодную сборку), чтобы они сообщали о приближении к объектам на различные расстояния. Знакомимся с контроллерами Arduino и учимся программировать их в среде mBlock 105
Мы узнали, что... • Существуют аналоговые и цифровые датчики и разные режимы работы портов Arduino. • Для получения данных с цифровых датчиков можно использовать контакты D0–D13 и A0–A5 платы Arduino, а с аналоговых — лишь контакты A0–A5. • Датчик может быть сложным устройством и даже иметь собственный микроконтроллер для обработки данных. Дальше нас с вами ждут компьютерные игры с использованием электроники Arduino. Ведь не очень интересно просто подключать к плате всё новые и новые компоненты (кнопку, потенциометр, датчики) и смотреть, как они работают. Лучше осваивать все тонкости, создавая игру, в которой эта электроника примет участие. Вот этим мы и займёмся! 106 ГЛАВА 2
Придумываем, конструируем, играем! Arduino + mBlock = креативные игры! Компьютерные игры — простор для творчества! Вам нравится играть в компьютерные игры? Поверьте, придумывать их самому и состязаться потом с друзьями — ещё интереснее! Да и приобретать таким способом новые знания гораздо увлекательнее, верно? Давайте создадим совсем несложную игру, в которой всё управление будет осуществляться нажатием одной кнопки (сначала на клавиатуре компьютера, а затем сделаем внешний пульт управления на Arduino). Может быть, вы думаете, что это скучно и даже браться за подобное не стоит? Но дело в том, что многие «игрушки» для тех же смартфонов, появляющиеся в AppStore и Google Play, отличаются именно такой простотой управления, и при этом многие из них бьют все рекорды популярности! Отметим, что является важной именно простота управления, позволяющая миллионам пользователей получать удовольствие от действия, не тратя время Придумываем, конструируем, играем! Arduino + mBlock = креативные игры! 107
на освоение сложного интерфейса. Так что дело за малым — придумать сюжет с интересным игровым процессом и простым управлением (в нашем случае — одна кнопка или один потенциометр) и воплотить всё в реальность. Причём самое сложное здесь — придумать! Поэтому так ценятся по-настоящему творческие или, как модно говорить, креативные идеи. Вполне возможно, что именно вы придумаете новую игру, которая покорит сердца пользователей! А для начала мы рассмотрим несколько примеров, отображающих процесс разработки, покажем, на что автору следует обратить внимание. Готовы? Приступим. Проект «Голодная рыбка» версия 1: управление клавишей <Пробел> Для создания игры воспользуемся средой mBlock, ведь мы хотим управлять не только с клавиатуры, но и с помощью внешнего пульта на базе Arduino. Вначале сделаем упрощённый, но вполне рабочий вариант, а потом усовершенствуем, усложним его и добавим возможностей. Любой разработчик проходит через этапы совершения ошибок, их поиска и попыток устранения. Можно сказать, что всё это и называется программированием. Написание любой программы — в значительной степени troubleshooting (в переводе с английского языка — отстрел проблем, отладка), именно этот процесс занимает львиную долю времени. Даже если бы мы, авторы этой книги, всеми силами постарались уберечь вас от ошибок и оградить от проблем, вряд ли бы это получилось. Но в борьбе с ошибками приобретается опыт! Поэтому вооружитесь храбростью, и приступим. В этот раз сюжет предложим мы, а вашей задачей будет обучить всех существ-персонажей выполнять именно то, что требуется. Будет нелегко, но мы же к этому готовы! Формулируем задачу Давайте определим сюжет для нашей первой игры. Живёт-поживает оченьочень голодная и непоседливая рыбка, этакий санитар водоёма. Сверху падают различные съедобные и несъедобные предметы, первые надо пытаться подобрать (коснувшись их), другие старательно игнорировать, отворачивая в сторону. 108 ГЛАВА 3
Управлять направлением движения будем одной кнопкой, по нажатию на которую рыбка будет сворачивать налево или направо (в первой версии игры задействуем клавишу <Пробел>, затем подключим кнопку к плате Arduino). А в следующих играх освоим устройства ввода поинтереснее. Хотя и с единственной кнопкой мы не соскучимся, скоро вы в этом убедитесь сами! Рыбка наша бойкая и активная, будет плавать взад-вперёд. Первое, что нам понадобится, — это водоём, второе — сама рыбка, третье — объекты (съедобные и несъедобные вещи). Рисуем водоём Откройте mBlock и создайте новый проект. Напомним, что в основе mBlock находится всё тот же Scratch. Пользование привычными средствами не должно вызывать проблем. Удалите спрайт панды. Теперь нужно отредактировать фон сцены, нарисовать водоём. Выберите сцену. Переключитесь на вкладку Фоны. Здесь масса интересных инструментов для редактирования изображений. Причём сразу два набора — инструменты и для растровой графики, и для векторной. Может, вы уже успели нарисовать что-то, напоминающее морское царство, но на всякий случай сделаем ещё один, самый простой, но подходящий нам фон. Ваши творения удалять не будем, создадим новую картинку, нажав кнопку Закрасить новый фон (рис. 3.1). Наверное, вы догадались, что фоны можно будет менять во время игры, как и костюмы у спрайтов. Рис. 3.1. Кнопка Закрасить новый фон сцены Придумываем, конструируем, играем! Arduino + mBlock = креативные игры! 109
Растровая и векторная графика Растровая графика состоит из точек, пикселов (от английских слов picture elements — элементы изображения). Если сильно увеличить такое изображение, каждая точка превратится в квадратик. Векторная графика организована иначе, изображение там состоит из примитивов — дуг, многоугольников, кругов и так далее. Рисовать сложнее, да и на обработку движения векторного объекта в программе уйдёт больше ресурсов, но зато такое изображение можно без проблем сжимать и растягивать, линия так и останется линией, а не превратится в набор квадратиков. Растровый (слева) и векторный (справа) рисунки Теперь закрасьте весь прямоугольник сцены тёмно-синим цветом. Сейчас это удобнее сделать, преобразовав изображение в растровое (нажатием на соответствующую кнопку в правом нижнем углу программного окна — рис. 3.2), Рис. 3.2. Кнопки выбора режима графики (справа, внизу) 110 ГЛАВА 3
а затем выбрав инструмент Залить цветом ны — краска разлилась (рис. 3.3). . Щёлкните в любом месте сце- Рис. 3.3. Выбрали инструмент Залить цветом в растровом режиме и закрасили фон Обратите внимание, что в векторном режиме панель инструментов располагается справа, а в растровом — слева от области редактирования. Не забывайте, что при необходимости можно пользоваться кнопкой Отмена над областью редактирования, если что-то пошло не так. А ещё можно просто удалить изображение фона и создать заново (например, через контекстное меню, вызываемое щелчком правой кнопкой мыши, — рис. 3.4). Изображение водоёма готово. Судя по густому синему цвету на наших рисунках, дело происходит на достаточно большой глубине. Придумываем, конструируем, играем! Arduino + mBlock = креативные игры! 111
Рис. 3.4. Удаление текущего фона Создаём спрайт-рыбку Добавьте из библиотеки спрайтов первого обитателя игрового водоёма — рыбку с именем Fish3 (выберите тему Подводный). Теперь спрайт нужно отредактировать, ведь требуется подобрать подходящий размер, чтобы рыбка не загораживала собой весь водоём. Иначе ей просто негде будет развернуться! Менять размер можно несколькими способами. Как изменить размер спрайта Помните, что в Scratch размер спрайта можно было менять специальными инструментами-кнопками? В программе mBlock всё так же, только кнопки имеют названия Расти и Сжать (рис. 3.5). Рис. 3.5. Кнопки управления величиной спрайта в mBlock Управлять величиной спрайта можно и программным способом: с помощью блоков и в категории Внешность. И, во многих случаях, это самое подходящее решение. Например, это позволило бы легко экспериментировать с величиной спрайта, просто меняя значение в блоке . Вспомните: в начале главы мы отмечали, что векторная графика, конечно, выглядит лучше, и рисунок не превращается в квадратики при масштабировании (изменении размеров), но расчёт изменений векторного объекта сложнее, чем растрового. Так вот, в данном проекте мы столкнёмся с необходимостью повысить скорость работы программы, чтобы не происходило подвисаний (задержек выполнения операций) во время игры. Если сразу сделать костюм поменьше, это упростит нам задачу оптимизации и увеличит скорость работы программы. 112 ГЛАВА 3
Итак, мы собираемся уменьшить длину и ширину костюма рыбки примерно в 2 раза. Переключитесь на вкладку Костюмы, щёлкните по кнопке = (она находится в правом нижнем углу окна), чтобы масштаб изображения в окне редактирования стал 100%, как и в окне сцены (рис. 3.6). Рыбка — изначально векторный объект, но сейчас мы видим инструменты растровой графики. Получилось так потому, что этот режим был выбран при изме- Рис. 3.6. Устанавливаем масштаб костюма 100% нении фона для игры. Несколько спорная особенность работы графического редактора, будем её учитывать. Пока же вернитесь в векторный режим с помощью кнопки Преобразовать в векторное изображение. Выделите рыбку, щёлкнув по ней курсором мыши. Теперь уменьшите ширину и высоту в 2 раза, потянув за любой маркер в углах выделения (рис. 3.7). Затем тем же инструментом переместите рыбку в центр. Щёлкнув курсором за пределами выделения, зафиксируйте изменения. Посмотрите на размер рыбки на основной сцене, если всё устраивает — хорошо, можно двигаться дальше, если нет — продолжите редактирование. Рис. 3.7. Меняем размер рыбки Иногда нужно точно установить положение точки, вокруг которой будет происходить вращение спрайта, то есть центр костюма. Для этого есть специальный инструмент — Установите костюм (рис. 3.8). Теперь, если ваш спрайт неожиданно меняет положение при вращении, вы знаете, что именно надо поправить. Проверьте, дали ли вы название и сохраняли ли проект во время работы? Если вы ещё не сделали этого, срочно исправляйте свою ошибку! Пусть наша Придумываем, конструируем, играем! Arduino + mBlock = креативные игры! 113
Рис. 3.8. Устанавливаем центр костюма игра называется Hungry_Fish. Вызовите меню Файл и выберите команду Save Project As. Не забывайте время от времени сохранять все свои наработки, при этом для каждой новой модификации проекта рекомендуем изменять название. В дальнейшем напоминать об этом будем всё реже. Учим рыбку плавать Пора научить рыбку плавать! Переместите её в стартовую позицию, куда-нибудь к нижнему краю сцены. Вытащите блок , там окажутся текущие координаты спрайта. Соберите простой скрипт (рис. 3.9). Блок тоже используем, вдруг размер рыбки по какой-то причине изменился (далее в программе мы будем использовать блоки изменения размера). 114 Рис. 3.9. Первый скрипт для рыбки ГЛАВА 3
Рыбка весело поплыла вперёд-назад. Но что это?! Налево она плывёт вверх тормашками! Исправляем ситуацию: добавляем блок . Где он находится? Подумайте и поищите самостоятельно. Получилось? Продолжим! Создаём спрайт-яблоко Пока рыбка одиноко плавает в своём водоёме. Прежде чем пытаться управлять её движением, вспомним цель игры. Надо собирать всякие вкусные съедобные предметы, которые опускаются сверху. Вот эти вкусности нам и нужны. Добавим спрайт яблока (Apple). Оно огромное! Пожалуй, рыбке такое не по зубам, его следует сделать поменьше. Решим задачу тем же способом: отредактируем костюм, уменьшим его примерно в 4 раза (рис. 3.10). Рис. 3.10. Соотношение размеров рыбки и яблока Английское имя можно было бы оставить, но давайте попробуем его сменить. Давать понятные имена всем объектам — хорошая привычка. Переименуйте спрайт Apple в Яблоко. Как переименовать спрайт Спрайты можно переименовать. Выберите спрайт в области спрайтов, подведите курсор мыши к значку с буквой i (рис. 3.11, слева) и щёлкните по нему. Развернётся область свойств спрайта. Введите новое имя спрайта в поле редактирования (рис. 3.11, справа) и щёлкните на кружке со стрелочкой . Имя спрайта изменится. Придумываем, конструируем, играем! Arduino + mBlock = креативные игры! 115
Рис. 3.11. Переименование спрайта Учим яблоко опускаться на дно Теперь создадим скрипт для яблока. По сценарию оно должно время от времени появляться у верхнего края сцены и опускаться вниз, пока не коснётся дна. Выделите спрайт-яблоко. Когда в проекте несколько спрайтов, очень важно не перепутать, какой скрипт для какого спрайта вы пишете! То, что работа идёт именно с полем скриптов яблока, показывает его значок в правой верхней части рабочего пространства. Соберите скрипт по образцу (рис. 3.12). Рис. 3.12. Скрипт для съедобного объекта 116 ГЛАВА 3
В программе мы воспользовались управляющим блоком . Это цикл с проверкой условия. Команды, которые находятся внутри блока , будут выполняться до тех пор, пока условие не окажется истинным. Яблоко будет сдвигаться чуть вниз до тех пор, пока не коснётся нижнего края сцены (bottom edge), и лишь после этого циклическое повторение действия закончится. Запустите программу, проверьте её работу. Рыбка плавает, яблоко появляется и опускается вниз. Но даже когда рыбка случайно касается яблока, ничего не происходит. Всё правильно, мы пока не предусмотрели никаких реакций на это событие. Игра на счёт. Программируем взаимодействие рыбки и яблока Давайте определим, что именно должно происходить в программе со спрайтами. Во-первых, яблоко должно исчезать. Во-вторых, при «съедании» яблока (если рыбка коснулась яблока) должен увеличиваться счётчик очков. В-третьих, если яблоко коснулось дна, а не рыбки, счётчик очков должен уменьшаться. Таким образом, нам необходимо добавить счётчик очков (переменную) и доработать скрипт яблока. А ещё ограничим время игры, раз уж мы подсчитываем очки. Сравнение результатов должно быть объективным. Можно приступать к программированию. Создайте переменную, дайте ей имя СЧЕТ. Она должна быть доступной для всех спрайтов (рис. 3.13). Рис. 3.13. Создаём переменную Придумываем, конструируем, играем! Arduino + mBlock = креативные игры! 117
По умолчанию рядом с именем переменной стоит галочка. Это значит, что мы будем видеть её значение во время и после игры в левом верхнем углу сцены (рис. 3.14). Рис. 3.14. Переменная СЧЕТ Необходимо обнулять счёт в начале игры и ограничивать её длительность. Для этого нужен отдельный скрипт, который будет работать одновременно со всеми остальными игровыми процессами (рис. 3.15). Удобно такой скрипт приписать объекту Сцена. Добавим ей соответствующий скрипт (не забудьте сначала выделить сцену). А заодно пусть скрипт сцены занимается отсчётом оставшегося времени игры, для чего добавим переменную время. Теперь доработаем скрипт яблока, добавив элементы взаимодействия и ведения счёта. Нам понадобятся блоки , , тащите их в область скриптов (рис. 3.16). 118 , . Вы- Рис. 3.15. Скрипт для объекта Сцена ГЛАВА 3
Рис. 3.16. Блоки для доработки взаимодействия рыбки и яблока Доработаем скрипт таким образом, чтобы передвижение яблока вниз заканчивалось не только при касании дна, но и при касании рыбки. При этом счётчик очков должен увеличиться либо уменьшиться в зависимости от того, чего именно коснулось яблоко (рис. 3.17). Рис. 3.17. Доработанный скрипт для яблока Придумываем, конструируем, играем! Arduino + mBlock = креативные игры! 119
Отлаживаем скрипт для спрайта яблока Проверьте работу скрипта (см. рис. 3.17), причём запускать всю программу целиком не надо. Для отладки программы сейчас важно, чтобы стартовал лишь скрипт яблока. Если скрипт рыбки останется бездействующим, мы сумеем перемещать её по сцене вручную при помощи мыши, точно так же, как можно делать при полной остановке программы. Итак, вместо щелчка по кнопке Старт над сценой щёлкните по заголовку скрипта яблока. Он стал активным, начал работать. Яблоко периодически появляется и опускается вниз, а вам надо постараться успеть ухватить рыбку мышью и передвинуть её под опускающееся яблоко. Важно только вовремя, перед касанием, рыбку отпускать! Если при касании яблоком рыбки значение счётчика очков возрастает, а при достижении дна — уменьшается, то всё в порядке. Останавливайте скрипт, можно продолжать. Если что-то не так, проверяйте программный сценарий, ищите ошибку. Так и идёт отладка программы. Выводим на сцену дополнительные спрайты Если всё в порядке, вы полностью подготовили и проверили скрипт яблока, пора обогатить рацион рыбки. Из библиотеки спрайтов добавьте в проект спрайты Muffin и Donut (рис. 3.18). Переименуйте их, назвав Кекс и Пончик. Рис. 3.18. Спрайты Muffin и Donut Отредактируйте костюмы спрайтов, чтобы они при масштабе 100% оказались подходящего для проекта размера (см. рис. 3.14). Теперь и кексу и пончику надо добавить скрипты, которые должны быть точно такими же, как у яблока. Скопируйте их. Командой дубликат лучше не пользоваться, она работает не всегда корректно и создаёт двойников (которые потом надо найти и уничтожить, один скрипт обычно прячется под 120 ГЛАВА 3
другим). Проще и надёжнее ухватить нужный скрипт мышью и перетащить его прямо на другой спрайт (рис. 3.19). Когда отпустим кнопку мыши, исходный скрипт вернётся на место, а его копия появится у того спрайта, куда мы показали. Скопируйте в спрайты Кекс и Пончик скрипт из спрайта Яблоко. Убедитесь, что у каждого спрайта есть собственный скрипт, при этом в единственном экземпляре (отодвиньте скрипт в сторону, проверьте, что под ним не прячется его копия). Рис. 3.19. Копирование скрипта от спрайта яблока на спрайт кекса Теперь запустите программу и проверьте, всё ли работает именно так, как мы задумали. Нажмите кнопку Старт . Счётчик очков катастрофически быстро уменьшается, мы не набираем очки, а теряем их всё больше и больше. Рыбка движется хаотично, но когда всё-таки случайно касается яблока, кекса или пончика, значение счётчика возрастает. Вот если бы можно было рыбку вовремя разворачивать!.. Придумываем, конструируем, играем! Arduino + mBlock = креативные игры! 121
Управляем рыбкой с клавиатуры Хочется уже поиграть, добавив в программу скрипты, управляющие движением рыбки. Как и обещали, сначала опробуем то, что получилось, при помощи компьютерной клавиатуры. Воспользуемся блоком проверки нажатия клавиши. Итак, обеспечим возможность управления движением. Выберите спрайт рыбки и добавьте в область скриптов блоки , , (рис. 3.20). Рис. 3.20. Блоки для управления с клавишей <Пробел> Внимание! Доработайте скрипт рыбки (рис. 3.21). При нажатии клавиши <Пробел> (в mBlock название этой клавиши переведено на русский язык как <Пространство>) рыбка будет поворачиваться против часовой стрелки на 180 градусов (не забудьте поменять значение 15 на 180), но так как у нас задан стиль вращения влево-вправо, то она просто будет разворачиваться в противоположную сторону, что нам и нужно. Рис. 3.21. Скрипт рыбки с блоками управления 122 ГЛАВА 3
Замедляем разворот рыбки Запускаем. Пробуем... Но что это?! При нажатии клавиши <Пробел> рыбка хаотично меняет направление! Предсказать, куда она, в конце концов, окажется повёрнутой, совершенно невозможно. Дело в том, что приказ на разворот повторяется непрерывно, пока нажата клавиша, и даже за столь короткое время направление успевает смениться несколько раз. Решений у этой проблемы несколько. Мы будем использовать задержку, чтобы разворот рыбки занимал некоторое время, превышающее время нажатия клавиши. Добавим блок (рис. 3.22). Играть так станет сложнее и интереснее, придётся учитывать время разворота. Рис. 3.22. Использование задержки для решения проблемы разворота рыбки Ура, получилась первая рабочая версия игры! Отлаживаем программу Вполне можно играть и так, но хочется сразу устранить пару недочётов. Разворот рыбки выглядит как-то неестественно. И от края она отталкивается с иной скоростью, это путает все планы игрока. Придумываем, конструируем, играем! Arduino + mBlock = креативные игры! 123
Решим обе проблемы созданием блока . Рыбка в процессе разворота будет менять не только направление, но и размер, чтобы движение выглядело более естественно (рис. 3.23). Рис. 3.23. Финальный вариант скрипта с блоком разворота для рыбки Игра стала ещё симпатичнее. Можно было бы и остановиться на этом варианте, но не будем забывать, что нашей целью является научиться работать с платой Arduino. Поэтому далее займёмся подключением кнопки к контроллеру, а в следующих играх сможем использовать уже не кнопку, а ползунковый потенциометр и другие устройства, заменить которые компьютерной клавиатурой не получится. 124 ГЛАВА 3
Мы узнали, что... • Отладка программы — важный этап написания программы. Он проводится в несколько этапов. • Графические изображения могут быть растровыми или векторными. • Растровое изображение складывается из множества маленьких элементов — пикселов, где каждый пиксел содержит информацию о цвете. Большинство фотографий и фотореалистических изображений в компьютерном мире именно растровые. Определить растровое изображение можно, изменив масштаб: при увеличении становится заметно множество маленьких квадратов. Это и есть пикселы. • Для векторной графики характерно разбиение изображения на ряд графических примитивов — не только точек, но и отрезков, окружностей, дуг и так далее. Сохраняются не отдельные точки изображения, а координаты и свойства примитивов (цвет, связи и прочее). При изменении размера такое изображение пересчитывается для новых условий, сохраняя чёткость всех элементов. • О компьютерной графике узнать больше можно здесь: http://compgraph. tpu.ru/Picture_in_PC.htm. • Графический инструментарий mBlock и Scratch позволяет преобразовывать векторные изображения в растровые. • Редактируя костюм спрайта, всегда стоит проверить расположение его центра. Для этого используется инструмент Установите костюм в mBlock и Установить центр костюма в Scratch. • Скрипты в mBlock и Scratch можно копировать между спрайтами, перетаскивая их из рабочей области одного спрайта на изображение другого. Придумываем, конструируем, играем! Arduino + mBlock = креативные игры! 125
Проект «Голодная рыбка» версия 2: управление с Arduino с помощью кнопки Попробуем поиграть с помощью кнопки, подключённой к контроллеру Arduino. Окажется полезной ещё и светодиодная сборка либо яркий внешний светодиод. Вы же помните, как всё подключать? Если забыли, вернитесь назад, освежите знания. Всё в порядке? Итак, продолжаем! Измените скрипт рыбки, добавив пробное помигивание светодиодом при старте программы и использование Arduino-кнопки вместо клавиши <Пробел>. Чтобы не загромождать основной скрипт подготовительными действиями, вынесем их в отдельный блок (рис. 3.24). Рис. 3.24. Набор скриптов рыбки при управлении с Arduino 126 ГЛАВА 3
Примечание Обратите внимание, скрипт управления разворотом можно использовать в двух вариантах (рис. 3.25). Для кого-то может оказаться более понятным вариант справа (с использованием операции сравнения), но сами сигналы «true» и «false» (1 и 0) уже несут нужную информацию, так что мы использовали левый, более лаконичный вариант. Рис. 3.25. Два варианта блока разворота по условию Попробуйте запустить программу. Если всё работает, как вы ожидаете — замечательно! Если возникают проблемы — ищите причины. Могли быть допущены ошибки в монтаже, в программном коде, да и просто могло прерваться соединение компьютера с платой из-за плохого контакта, либо вы забыли «прошить» контроллер Arduino для работы с mBlock... Проверьте все возможности, устраните проблемы, и всё заработает. Будьте уверены, не существует ни одного конструктора или программиста, который бы всё и с первого раза делал правильно! Проект «Голодная рыбка» версия 3: оптимизация программы Мы могли бы не останавливаться на данном этапе, но задумайтесь — всё ли вас устраивает во время игры? Вы уже наверняка заметили, что скорость движения объектов в разные моменты времени меняется, а мы не ожидали такого. Мелочь, но раздражает! Самое время предпринять меры по устранению этого эффекта, а заодно освоить процесс оптимизации работы программы. Формулируем задачу Подумав над причинами изменения скорости объектов, мы приходим к нескольким выводам. Придумываем, конструируем, играем! Arduino + mBlock = креативные игры! 127
Во-первых, среда программирования mBlock всё ещё содержит недоработки, которые нам следует учитывать и не дожидаться, пока они будут исправлены разработчиками. При программировании сплошь и рядом приходится иметь дело с теми или иными недоработками используемых программных средств, ведь идеальных программ не бывает. Во-вторых, скорость выполнения отдельных частей программы зависит от того, с какой частотой «прокручиваются» циклы в соответствующих фрагментах кода. Важно, чтобы эта частота была достаточной и стабильной. А удобнее всего, когда цикл в каждом объекте программы прокручивается с одной и той же частотой, хоть это и не всегда осуществимо на практике. Решение очевидно: от скорости «прокрутки» цикла зависит очень многое, следует попытаться её увеличить либо хотя бы стабилизировать. Будем исправлять ситуацию, попробуем оптимизировать программу, ускорив её быстродействие доступными нам средствами. Увеличиваем скорость в режиме Турбо Увеличить скорость выполнения программы можно путём переключения в режим Турбо. Для этого следует выбрать соответствующий пункт в меню Редактировать (рис. 3.26). Рис. 3.26. Выбран режим Турбо Запустите программу снова, попробуйте поиграть в этом режиме. Кажется, рыбка движется равномерно, но при нажатии на кнопку меняет направление движения чрезмерно быстро. И куда-то делись наши «съедобные» спрайты... На самом деле они никуда не делись, просто проскакивают по сцене настолько быстро, что мы не успеваем их заметить. 128 ГЛАВА 3
Стабилизируем скорость, вставляя блоки ожидания Следует во все циклы вставить блок ожидания, это ограничит и стабилизирует скорость их прокрутки. Скрипт для объекта Сцена не поменялся (см. рис. 3.15). Скрипты у спрайтов яблока, кекса и пончика одинаковые, блок добавлен в цикл (рис. 3.27). Для рыбки добавьте блоки в блок (рис. 3.28). Попробуйте поиграть в игру с обновлённым набором скриптов. Ну вот, уже почти всё хорошо. Играть можно, только движение опускающихся спрайтов замедляется, когда рыбка меняет направление. Если вы такого не наблюдаете — замечательно, у вас очень мощный компьютер. Рис. 3.27. Скрипт «съедобных» объектов Придумываем, конструируем, играем! Arduino + mBlock = креативные игры! 129
Рис. 3.28. Обновленный блок спрайта рыбки Используем растровую графику, чтобы играть на «слабых» компьютерах Попробуем облегчить задачу компьютеру, используя растровую графику невысокого разрешения вместо векторной. Помните отличия? Рисунки в векторной графике собираются из графических примитивов (линий, простых фигур), и при изменении их размеров компьютер пересчитывает каждый такой объект, сохраняя чёткость изображения. Растровый рисунок состоит из точек — пикселов, и при небольшом их количестве масштабирование проходит быстрее. Мы можем смириться с некоторой потерей качества изображений, получив прирост быстродействия. Выберите по очереди спрайты и на вкладке Костюмы нажмите кнопку Преобразовать в растровое изображение (рис. 3.29). Иногда требуется заново определить центр костюмов (см. рис. 3.8). В редакторе спрайты стали выглядеть чуть хуже, но в игре это будет незаметно. Запустите программу вновь. Пожалуй, скорость движения чуть возросла, но с равномерностью опускания спрайтов по-прежнему проблемы. В чём же дело? Рис. 3.29. Преобразование рисунка в растровое изображение Что не так во время разворота рыбки? 130 ГЛАВА 3
Устраняем неравномерность движения с помощью параллельных процессов Подумав и проанализировав программу, находим причину. Посмотрите на скрипт разворота рыбки — пока он выполняется, перестаёт считываться состояние цифрового порта D2 платы Arduino, поэтому меняется загрузка процессора и скорость выполнения скриптов для всех остальных спрайтов. Делаем вывод, что программу в среде mBlock следует писать так, чтобы опрос состояния порта Arduino осуществлялся постоянно и с одинаковой частотой. Рис. 3.30. Обновлённый набор скриптов рыбки с использованием параллельных процессов Придумываем, конструируем, играем! Arduino + mBlock = креативные игры! 131
Поэтому создайте дополнительный скрипт для спрайта рыбки. В нём мы будем опрашивать (читать) цифровой порт Arduino и присваивать значение переменной кнопка (отображать это значение на сцене нам необязательно, поэтому снимем соответствующую галочку). В исходном скрипте вместо блока мы будем использовать переменную кнопка. Операция опроса цифрового порта проходила долго и тормозила весь скрипт, теперь же он начнёт выполняться гораздо быстрее. Следует ограничить скорость прокрутки, добавив блок ожидания. Остальные скрипты у рыбки не изменились (рис. 3.30). Обратите внимание, запускаемых по кнопке Старт скриптов у рыбки теперь два, и выполняются они параллельно! Примечание Наши скрипты занимают всё больше места на экране. Для перемещения по области скриптов можно навести указатель мыши на любое свободное место рабочего поля, зажать левую кнопку мыши и перемещать всё поле в любом направлении. Полезно бывает временно уменьшить область сцены (в меню Редактировать команда Малая планировка этапа) или использовать режим, когда сцена не видна совсем, зато полностью открыта область скриптов (в меню Редактировать команда Hide stage layout, рис. 3.31). Рис. 3.31. Режим редактирования. Макет сцены скрыт Попробуйте новый вариант игры. Пожалуй, теперь основные недочёты исправлены. Все игровые персонажи ведут себя так, как надо, программа в обычном режиме и в режиме Турбо работает почти одинаково. 132 ГЛАВА 3
Подводим предварительные итоги • Программа доработана. • Устранён ряд недостатков. • Получен опыт анализа и последующей оптимизации программного продукта. Надеемся, вы будете использовать этот опыт в своих самостоятельных проектах! Вы думаете, наша игра доведена до совершенства? Нет, сказке ещё не конец! Давайте на примере «Голодной рыбки» посмотрим, как можно модифицировать проект, создавая различные, более интересные варианты на базе готовой программы. Проект «Голодная рыбка» версия 4: модификация программы, создание новых вариантов игры В том варианте, который мы создали, в процессе игры можно лишь набирать или терять очки. Предлагаем создать модифицированный вариант проекта, в котором не будет счётчика очков и ограничения по времени, зато появится возможность выиграть либо проиграть игру. Формулируем задачу Новое игровое условие: рыбка всплывает ближе к поверхности, когда успешно подбирает съедобное, и погружается, когда ей это не удаётся. Дополнительно следует избегать касания несъедобных предметов. Игра заканчивается при погружении до самого дна (проигрыш), либо когда достигнутая глубина становится меньше 100 единиц (выигрыш). По мере всплытия цвет воды светлеет, при погружении — темнеет. Придумываем, конструируем, играем! Arduino + mBlock = креативные игры! 133
Используем механизм отправки сигналов-сообщений Для того чтобы реализовать задуманное, следует задействовать механизм отправки сигналов-сообщений, которые передаются сразу всем объектам программы, причём каждый объект может иметь собственный вариант реагирования на это событие. Мы будем использовать два сообщения: «всплывай» и «погружайся». Вначале их следует создать, выбрав соответствующий Рис. 3.32. пункт в списке блока Создание нового сообщения (рис. 3.32). Полный набор скриптов проекта На этот раз мы не будем объяснять все изменения в проекте. Надеемся, что вы получили уже достаточно опыта, для того чтобы разобраться со всеми сложными моментами самостоятельно. Даже если у вас не получится воспроизвести все скрипты безошибочно с первого раза, не отчаивайтесь, воспринимайте это задание как головоломку! На сцене вода должна менять цвет по мере всплытия рыбки. Для этого используйте эффект «призрак». Поскольку больше нет необходимости подсчитывать очки и время, сцена теперь имеет вот такой скрипт (рис. 3.33). Рис. 3.33. Используем эффект «призрак» в скрипте сцены У рыбки изменились скрипты и появились новые (рис. 3.34). Кроме того, теперь используется новая переменная (понаблюдайте, как меняется её значение во время игры). 134 ГЛАВА 3
Рис. 3.34. Полный набор скриптов спрайта Fish3 в модифицированной версии игры Придумываем, конструируем, играем! Arduino + mBlock = креативные игры! 135
У спрайтов яблока, кекса и пончика одинаковые скрипты (рис. 3.35). Рис. 3.35. Скрипты для яблока, кекса и пончика в модифицированной версии игры Новые объекты — несъедобные, например спрайты из библиотеки Key и Pencil. Переименуйте их в Ключ и Карандаш. Костюмы уменьшите, как уменьшали костюмы яблока, кекса и пончика. Преобразуйте их в растровые изображения. Скрипты у новых спрайтов одинаковые (рис. 3.36). Ну, вот и всё. Проект «Голодная рыбка» завершён. 136 ГЛАВА 3
Рис. 3.36. Скрипт для несъедобных объектов Задания 1. Добавьте блок, с помощью которого рыбка сообщает о конце игры в случае погружения до самого дна. 2. Спрячьте переменную достигнутая_глубина, пусть рыбка сообщает результат по этому показателю лишь в случае проигрыша. 3. Пусть при выигрыше рыбка сообщает общее время игры. 4. Отредактируйте фон сцены так, чтобы во время игры понимать, достижение какой глубины необходимо для выигрыша. Добавьте объекты, двигающиеся на этой глубине влево-вправо. Придумываем, конструируем, играем! Arduino + mBlock = креативные игры! 137
Рис. 3.37. Проект «Голодная рыбка» завершён Итоги проекта «Голодная рыбка» Мы прошли все основные стадии разработки игры: замысел, программная реализация, отладка, оптимизация, модификация. И теперь готовы придумывать как новые модификации уже готовой игры, так и собственные игры! 138 ГЛАВА 3
«Умный домик». Автономный проект с платой Arduino В начале книги мы рассказывали о тех задачах, которые способны решать микроконтроллеры в современном мире. И одно из самых интересных направлений сейчас — технологии «умного дома». Теперь, когда в ходе игровых проектов вы научились не только программировать в среде mBlock, но и освоили использование электроники на базе Arduino, можно приступать к созданию «умных вещей». В этом деле много своих тонкостей, но главное вы уже умеете: вы способны писать управляющие алгоритмы, пусть пока ещё простые, считывать значения портов, а также управлять работой внешних устройств. «Умный домик». Автономный проект с платой Arduino 139
Собираем электрическую схему «умного домика» Создадим макет устройства, которое будет самостоятельно включать и выключать лампочку на крыльце дома в зависимости от уровня внешнего освещения. Солнечный свет будем имитировать фонариком, направляя его на сенсор освещённости («день») или отводя в сторону («ночь»). В зависимости от показаний датчика устройство будет замыкать или размыкать контакты. Днём при ярком свете лампочка будет выключаться, а ночью включаться. Нам может потребоваться настройка чувствительности нашего устройства. Будем использовать потенциометр, для того чтобы указывать, при каком уровне внешнего освещения лампочка должна включаться и отключаться. Необходимые компоненты • Плата Arduino Uno. • Кабель USB. • Светодиодная сборка для индикации работы программы (с использованием портов D9, D10, D11), готовая либо собранная на макетной плате. • Макетная плата либо плата расширения Arduino ProtoShield. • Ползунковый пропорциональный потенциометр. • Аналоговый датчик освещённости с трёхконтактным подключением SVG (либо резистор 10 килоом и фоторезистор). • Набор монтажных проводов либо кусок одножильного провода (диаметром около 0,5 мм). • Батарейка, лампочка и соединительные провода для имитации света в доме (желательно). Прежде чем приступить к сборке электрической схемы, кратко опишем компоненты, которые мы ещё не использовали в наших проектах 140 ГЛАВА 4
Реле, катушка, якорь [3] Реле позволяет электрическому сигналу включать (или выключать) электрический ток. Как правило, для управления реле используется низкое напряжение или слабый ток, чтобы с его помощью управлять высоким напряжением и (или) сильным током. Реле состоит из катушки, якоря и хотя бы одной пары контактов. Ток протекает через катушку, которая действует как электромагнит и создаёт магнитное поле, приводящее в движение якорь, который в результате замыкает (или размыкает) контакты силовой части реле. Это упрощённое изображение показывает основные детали двухполюсного реле на одно направление Сам термин «реле» (по-английски relay) возник по аналогии с процедурой смены уставших лошадей на почтовых станциях и подразумевает освежение, восстановление и увеличение сил. Релейный модуль Для подключения к контроллеру Arduino удобнее всего использовать специальный релейный модуль. Это плата, на которой размещены одно или несколько реле, а также контакты для связи к Arduino и разъёмы для управления внешними устройствами (на рис. 4.1 роль внешнего устройства играет лампочка с источником питания). Маркировка контактов для подключения к контроллеру Arduino может отличаться у разных модулей. Внимательно смотрите, что написано на вашей плате. Существуют одиночные модули с трёхконтактным подключением SVG. «Умный домик». Автономный проект с платой Arduino 141
Рис. 4.1. Модуль с двумя реле При помощи релейного модуля мы действительно могли бы включить освещение в комнате или на приусадебном участке, однако освоение способов монтажа высоковольтной проводки не входит в наши планы, поэтому просто смоделируем ситуацию. Датчик освещённости В качестве датчика освещённости удобно использовать специализированный трёхконтактный модуль SVG (рис. 4.2). На плате датчика размещён фоторезистор, подтягивающий резистор и контакты для подключения к плате Arduino. На рис. 4.2 видна маркировка крайних контактов: S (от английского слова signal — сигнал) и «–» (заземление, GND). Центральный контакт не помечен, это VCC (от французских слов Volt en courant continue — «+» питания). 142 Рис. 4.2. Датчик освещённости с трёхконтактным подключением SVG ГЛАВА 4
Рис. 4.3. Электрическая схема «Умного домика» (питание платы Arduino по USB-кабелю или от отдельного источника) «Умный домик». Автономный проект с платой Arduino 143
Если у вас нет датчика освещённости с трёхконтактным подключением SVG, его можно заменить подходящим фоторезистором и подтягивающим (либо стягивающим) резистором на 10 килоом (при сильном освещении — на 1 килоом). Поскольку фоторезистор одинаково работает при любой полярности подключения, можно безбоязненно менять местами VCC и GND (точно так же, как при подключении обычной трёхконтактной кнопки, с тем же самым эффектом инвертирования сигнала). Порядок подключения Соберите электрическую схему (рис. 4.3). На рисунке изображён вариант с использованием отдельных светодиодов. Если у вас имеется светодиодная сборка, то монтаж существенно упрощается, вместо светодиодов и резисторов просто надо вставить сборку. Обратите внимание: • контакт VCC (или +5V) каждого модуля подсоединяют к контакту +5V платы Arduino, а контакт GND (или «–») — к контакту GND; • порт A0 платы Arduino Uno используют для считывания показаний потенциометра (сюда подключён контакт S (или, по-другому, OTA) потенциометра); • порт A1 платы Arduino Uno считывает показания датчика освещённости (сюда подключён контакт S датчика); • контакт S (или, по-другому, IN, INPUT) модуля реле подключён к порту D5 платы Arduino Uno. Собранное устройство отложим на время и займёмся рисованием домика. 144 ГЛАВА 4
Проект «Умный домик» версия 1 Рисуем домик Создайте в mBlock новый проект и удалите спрайт панды. Откройте фоновое изображение сцены. Нам требуется создать изображение дома в сумерках, используйте самые тёмные варианты цвета. Закрасьте фон синим. Нарисуйте зелёный прямоугольник. Это будет трава. Теперь нарисуйте домик и оставьте место под окно (рис. 4.4). Рис. 4.4. Заготовка рисунка для проекта «Умный домик» Нарисуйте окно. Для этого нажмите кнопку Закрасить новый спрайт в области спрайтов (рис. 4.5), а затем дайте ему имя Окно. Нарисуйте белый квадрат (рис. 4.6). Создайте для спрайта два костюма — чёрный и белый. Для этого на вкладке Костюмы щёлкните по образу белого костюма правой кнопкой мыши и выберите команду дубликат (рис. 4.7), а затем перекрасьте первый костюм в чёрный цвет. Дайте названия костюмам: «свет_выключен» и «свет_включён» (рис. 4.8). «Умный домик». Автономный проект с платой Arduino 145
Рис. 4.5. Создаём новый спрайт Рис. 4.7. Дублируем костюм Рис. 4.6. Нарисовали окно в новом спрайте 146 Рис. 4.8. Костюмы спрайта окна в проекте «Умный домик» ГЛАВА 4
Подготовительные операции Подключите собранное ранее электронное устройство (контроллер Arduino со всеми необходимыми компонентами) к компьютеру. Проверьте соединение с mBlock. Устанавливаем порты светодиодов Займёмся светодиодной индикацией. Контрольное переключение состояния портов со светодиодами относится к подготовительным операциям. При старте программы будем зажигать светодиод на порте D11 (в светодиодной сборке он зелёного цвета) и гасить на портах D10 и D9 (жёлтый и оранжевый). Сгруппируйте соответствующие команды в новом блоке спрайта окна (зачем в данном случае использовать английское название, объясним чуть позже). При подобном оформлении легко отделить действия, выполняющиеся один раз, от тех, что будут совершаться снова и снова внутри цикла (рис. 4.9). Рис. 4.9. Скрипт спрайта окна. Блок подготовки Считываем показания потенциометра и датчика освещённости Нам предстоит проверка диапазона значений портов A0 и A1, к которым подключены потенциометр и датчик освещённости. Необходимо убедиться в том, что оба устройства исправны, а также выяснить особенности их работы, ведь каждый экземпляр датчика уникален. Создайте две переменные с именами dat_A0 и dat_A1, сохраните отображение их значений на экране. Усложните скрипт спрайта окна (рис. 4.10). «Умный домик». Автономный проект с платой Arduino 147
Рис. 4.10. Скрипт спрайта окна. Считываем показания портов A0 и A1 Запустите программу и подвигайте ползунок потенциометра. Если значение переменной dat_A0 удаётся менять от 0 до 1023 — отлично! Теперь обратите внимание на вторую переменную, dat_A1. Закройте рукой датчик освещённости, потом, наоборот, попробуйте добавить света, например, поднесите поближе яркую лампу или фонарик. Как видите, диапазон оказался более узким, показания никогда не принимают крайних значений, 0 или 1023. Мы можем этим воспользоваться для диагностики состояния соединения с платой Arduino, чтобы замечать, что соединение пропало. Давайте попробуем. Как проверить соединение с платой Arduino? Снимите галочку соединения в меню mBlock (в меню Соединить выберите команду Serial Port). Светодиодная сборка мигнула и погасла. Запустите программу. Мы видим, что значения A0 и A1 равны нулю. Значит, по этому признаку можно определить ситуацию, когда компьютер теряет соединение с контроллером Arduino. Модифицируем , добавив проверку работы при отключённой и подклюблок чённой плате (рис. 4.11). 148 ГЛАВА 4
Рис. 4.11. Скрипт спрайта окна. Проверяем соединение Изменяем выводимые значения показаний потенциометра и датчика освещённости Проверяя диапазон значений портов A0 и A1, мы можем столкнуться с парой проблем. Во-первых, показания датчика света «скачут» (быстро меняют значения), нам ещё придётся побороться с этим. Во-вторых, в зависимости от способа подключения они могут возрастать при увеличении освещённости либо, наоборот, уменьшаться. В последнем случае нам понадобится исправить подключение (поменять местами контакты VCC и GND; при использовании датчика освещённости на базе фоторезистора это возможно) либо использовать блок . «Умный домик». Автономный проект с платой Arduino 149
В программе удобнее будет использовать диапазон значений от 0 до 100. Для этого разделите текущее значение на 10.23 (так как 1023 / 10.23 = 100). Модифицируйте скрипт снова (рис. 4.12). Обратите внимание, что в формуле для dat_A1 вначале должна выполняться операция вычитания, а потом деления. Рис. 4.12. Скрипт спрайта окна. Изменяем выводимые значения Запустите программу вновь, проверьте отображаемый диапазон. Показания dat_A0 должны меняться от 0 до 100, включая дробные значения. Больше в этом проекте нам не понадобится работать с исходными данными портов A0 и A1, будем использовать лишь переменные dat_A0 и dat_A1. 150 ГЛАВА 4
Включаем свет вручную Опробуйте возможность включать и выключать свет вручную, добавив спрайту окна пару управляющих скриптов (рис. 4.13). Рис. 4.13. Скрипт спрайта окна. Скрипты ручного управления светом Проверьте работу скриптов, несколько раз включив и выключив свет в домике. Обратите внимание, теперь у нас не только зажигается и гаснет свет в окошке нарисованного домика, но и щёлкает электромагнитное реле, переключая внутренние контакты и меняя собственную светодиодную индикацию. Меняем яркость домика в зависимости от освещённости Сделаем так, чтобы при смене освещённости в комнате менялась яркость картинки нарисованного домика. Применим к сцене эффект «яркость». Создайте глобальную переменную luminosity (светимость). Добавим сцене (то есть изображению домика) следующий скрипт (рис. 4.14). Рис. 4.14. Управляем яркостью сцены «Умный домик». Автономный проект с платой Arduino 151
Теперь такой же скрипт добавим спрайту окна. Заодно реализуем простой способ определения значения переменной luminosity, пока просто приравняв её к значению переменной dat_A1 (рис. 4.15). Рис. 4.15. Изменённые скрипты спрайта окна Тестируем. Яркость изображения колеблется, особенно при искусственном освещении, но пока не будем обращать на это внимания. Задаём границу освещённости для автоматического включения лампы Задействуем потенциометр. Положением ползунка будем задавать граничный уровень освещённости, при котором лампа будет включаться. Изменим набор скриптов для автоматического переключения состояния нашего устройства в зависимости от уровня освещённости и положения ползунка. Ручное включение и выключение больше не понадобится (рис. 4.16). Тестируем вновь. Свет включается и выключается при перемещении ползунка и смене уровня освещённости, но, пожалуй, иногда это делает чрезмерно часто. При некоторых условиях он начинает «моргать», реле щёлкает непрерывно. Жить в таком доме вряд ли кому-то захочется. 152 ГЛАВА 4
Рис. 4.16. Изменённый набор скриптов спрайта окна «Умный домик». Автономный проект с платой Arduino 153
Устраняем моргание света. Сглаживаем и стабилизируем показания датчиков, добавляем «отставание» в реагировании Нам необходимо как-то справиться с проблемой моргания. Первая идея, которая приходит в голову, — добиться, чтобы значение переменной luminosity менялось более плавно. В реальной жизни смена освещённости происходит относительно медленно. Даже если налетает грозовая туча, процесс длится несколько секунд. Давайте изменим алгоритм: будем не приравнивать, а менять значение переменной luminosity, слегка «подтягивая» к dat_A1 в каждой Рис. 4.17. Модифицированные скрипты спрайта окна 154 ГЛАВА 4
итера́ции, например, на одну десятую разницы между ними. Потребуется ещё установить начальное значение этой переменной (в нашем случае лучше в середину диапазона). Модифицируем блок и скрипт, вычисляющий значения переменных (рис. 4.17). Протестируйте систему управления. Изменяйте положение ползунка, задавая граничное значение для срабатывания автоматики, пробуйте менять освещённость. Да, стало гораздо лучше, но проблема не исчезла. Для её решения нам придётся добавить нашей системе управления дополнительное свойство — стремление сохранять предыдущее состояние. Сделаем так, чтобы выключение света происходило лишь тогда, когда уровень освещённости превышает пограничное значение на некоторую величину. Соответственно, включаться свет должен лишь в том случае, если уровень освещённости ниже пограничного значения на некоторую величину. Таким образом, у нас появляется диапазон, в котором свет может быть как включён, так и выключен, в зависимости от предыдущего состояния, а переключения не происходят. Измените ту часть программы для спрайта окна, которая отвечает за проверку условий включения-выключения света (рис. 4.18). Рис. 4.18. Изменённый скрипт спрайта окна. Финальный вариант для проекта с виртуальным домиком «Умный домик». Автономный проект с платой Arduino 155
Проверяем. Всё работает? Отлично! Итак, вы собрали устройство автоматического управления освещением, да ещё и с возможностью настройки уровня срабатывания. Правда, пока лишь для виртуального домика, но среда mBlock позволяет программировать контроллеры и для автономной работы. А с учётом того, что в состав нашего устройства входит электромагнитное реле, мы сможем создать автономное устройство управления реальными осветительными (и не только) приборами! Приступим, но сначала несколько слов о разнице автономного и интерактивного режимов Arduino при работе с mBlock. Проект «Умный домик» версия 2: автономная работа Автономный и интерактивный режимы работы Arduino Во всех предыдущих экспериментах вы использовали так называемый интерактивный режим работы с контроллером Arduino. Вспомните, вначале требовалось загрузить специальную программу-прошивку, которая позволяла контроллеру понимать указания из среды управления mBlock. При таком варианте управления сама программа выполняется на компьютере, а для взаимодействия с контроллером Arduino обязательно должно быть соединение с платой (по кабелю USB или с помощью Bluetooth). Мы можем создать и загрузить в память Arduino собственную программу, позволяющую плате работать в автономном режиме. Обычно для подготовки таких приложений, называемых скетчами (от английского слова sketch — эскиз, зарисовка), применяется специальная среда Arduino IDE, использующая текстовый язык программирования, основанный на C/C++. Программу загружают в память устройства, подают внешнее питание, и далее Arduino работает самостоятельно — автономно (рис. 4.19). Вы ещё не успели познакомиться с текстовым программированием. Зато вы работаете с mBlock, а разработчики этой замечательной среды предусмотрели возможность создания скетчей уже привычным для вас визуальным способом. В mBlock есть специальный режим, в котором программа из «блочного» вида 156 ГЛАВА 4
Рис. 4.19. Режимы работы Arduino Uno при работе с mBlock переводится в язык, понятный Arduino IDE, и затем может быть либо сразу загружена на плату, либо отправлена в Arduino IDE для дальнейшего редактирования уже в текстовом виде. Так что теперь даже начинающие программисты могут создавать программы для автономной работы микроконтроллеров, как настоящие профессионалы! Внешнее питание Arduino Uno Arduino Uno может получать питание через подключение USB (от компьютера) или от внешнего источника питания, подключаемого к специальному разъёму. Можно использовать любой подходящий источник тока (например, зарядку от смартфона или аккумуляторную батарею) с выходом USB или разъёмом 2,1 мм с центральным положительным контактом. Кроме того, провода от батареи иногда бывает проще подключить непосредственно к GND («–» питания) и Vin (+) в контактные гнёзда на плате (рис. 4.20). Рис. 4.20. Разъёмы питания на плате Arduino Uno «Умный домик». Автономный проект с платой Arduino 157
Платформа способна работать при внешнем питании от 6 до 12 В. Можно использовать специальные боксы (от английского слова box — коробка) на 4–8 элементов размера AA (рис. 4.21) или подключать батареи 6LR61/6LF22 (чаще называемые «крона»). Рис. 4.21. Бокс на 6 элементов питания размера AA (слева) и разъём для подключения батареи «Крона» (справа) Для питания платы через USB-соединение удобно использовать внешние аккумуляторы для смартфона (Power Bank). Но проще всего, пожалуй, подключить Arduino к любому зарядному устройству с USB-разъёмом. Изменим нашу программу управления освещением таким образом, чтобы её можно было загрузить в контроллер Arduino для автономной работы. Адаптируем скрипты к автономному режиму, удаляем лишние и несовместимые блоки Многие блоки интерактивного режима нам больше не понадобятся. Удалите скрипт сцены и проверку подключения платы к компьютеру. Светодиодная индикация наличия подключения к компьютеру нам тоже больше не нужна. Надо убрать ряд блоков, не совместимых с автономным режимом (смена костюмов, применение эффектов). Для спрайта окна в автономном варианте проекта полный набор скриптов показан на рис. 4.22. 158 ГЛАВА 4
Внимание! Для автономной программы вам уже не понадобятся блоки, которые в начале программы подавали сигнал LOW на порты 9 и 10. Наличие этих блоков было связано с особенностями работы среды mBlock в интерактивном режиме. Теперь команды отключения светодиодов можно убрать. Рис. 4.22. Сокращённый набор скриптов спрайта окна «Умный домик». Автономный проект с платой Arduino 159
Объединяем два цикла в один, изменяем заголовок В режиме автономной работы контроллер Arduino не может работать с параллельными процессами, которые мы так успешно использовали в интерактивном варианте управления. Эту особенность требуется учесть, в программе необходимо объединить два цикла в один. Это сделать несложно. Кроме того, у нас больше нет причин использовать параллельные процессы (теперь чтение из цифрового порта проходит очень быстро). Можно убрать блок временно́й задержки, сейчас в нём нет необходимости. Рис. 4.23. Финальный вариант скриптов спрайта окна для автономной работы 160 ГЛАВА 4
И, главное, нужно изменить вводный блок, объяснив системе, что мы намерены создать программу для работы в автономном режиме. В mBlock перейдите в категорию Робот. До сих пор вы использовали множество блоков из этой категории, но не использовали вводный блок . Замените вводный блок программы блоком (рис. 4.23). Преобразуем скрипт в текстовой вид Перейдите в режим загрузки программ на устройства Arduino (рис. 4.24). Для этого в меню Редактировать выберите команду Arduino mode либо просто один раз щёлкните по блокам вашей программы. Рис. 4.24. mBlock в режиме Arduino mode Исчезла сцена, она больше не нужна. Справа появились инструменты для работы с Arduino: кнопки управления загрузкой, окно текстового кода и область управления обменом информацией с устройством. «Умный домик». Автономный проект с платой Arduino 161
Примечание Возможно, вы уже случайно попадали в этот режим, запуская программу на исполнение в среде mBlock, щёлкнув не два, а один раз. Если понадобится выйти из этого режима, просто щёлкните по кнопке Back или снимите галочку с команды Arduino mode в меню Редактировать. Обратите внимание на кнопку Edit with Arduino IDE: ваши программы, но уже в виде кода, можно загружать прямо в среду программирования Arduino IDE и далее редактировать код в ней, что и делают продвинутые программисты. В окне справа представлен текстовой вариант программы, в котором присутствуют англоязычные имена наших переменных и блоков. Если бы мы использовали русские названия, mBlock заменил бы их бессмысленным набором символов. Программа всё равно бы заработала, но её текст был бы нам менее понятен. Для загрузки программы в память устройства нажмите кнопку Upload to Arduino. Появится информационное окно Start Uploading. При удачном завершении вы увидите надпись «Upload Finish» (загрузка завершена, рис. 4.25). Рис. 4.25. Удачное завершение загрузки 162 ГЛАВА 4
Внимание! Иногда вместо «Upload Finish» появляется надпись «Upload Failed» (ошибка загрузки). Это может быть вызвано как программным сбоем, так и проблемами с соединением, ошибкой выбора порта или той причиной, что mBlock не может перевести в текстовой код выбранные или созданные пользователем блоки. В окне справа можно посмотреть техническую информацию о сбое, а затем заново подсоединить кабель USB, проверить выставленный порт соединения с платой, иногда даже перезапустить mBlock. И, конечно же, проверить программу. Проверяем работу в автономном режиме После загрузки программы в контроллер остаётся проверить её работу, подключив Arduino к автономному источнику питания вместо компьютера. Проверили, всё в порядке, светодиоды на плате загораются, реле щёлкает при изменении освещения? Поздравляем! Вы создали своё первое функциональное автономное устройство на базе контроллера Arduino! Это настоящий элемент «умного дома». Например, такое устройство можно использовать для автоматизации освещения приусадебного участка, подключив осветительные фонари к сети питания через реле. Но работы с напряжением в 220 вольт оставим профессиональным электромонтёрам, мы же сделаем макет подобного подключения, используя в качестве потребителя маленькую лампочку накаливания и батарейку для её питания. Подключаем внешний осветительный прибор к реле В начале главы мы рассмотрели принцип действия электромагнитного реле. На рис. 4.1 показано назначение его контактов. На модуле реле располагается группа контактов с винтовыми креплениями, предназначенная для управления внешними потребителями энергии. Взрослые исследователи, знакомые с правилами безопасности при электромонтажных работах, способны подключить сюда мощную нагрузку по собственному выбору. Юным же конструкторам для экспериментов можно рекомендовать управление устройствами, имеющими напряжение питания 7–9 вольт. Это «Умный домик». Автономный проект с платой Arduino 163
могут быть лампочки, моторы постоянного тока и другие потребители, работающие от батареек или аккумуляторов. В нашем проекте для подключения лампочки мы используем контакты реле COM и NO (см. рис. 4.3, 4.26). Рис. 4.26. Подключение лампочки к реле Рис. 4.27. Проект «Умный домик» в сборе 164 ГЛАВА 4
На рис. 4.27 показан вариант сборки с использованием лампочки и батарейки из набора по физике для любознательных. Проверьте устройство в работе. Отрегулируйте положение ручки потенциометра для включения лампочки при понижении уровня освещения. Возможно, вам захочется применить данное устройство для макета «умного дома». Такой домик можно сделать из подручных средств (картон, клей) или собрать из деталей конструктора, например, Лего. В этом случае придётся продумать компоновку электронной части макета, вывести фоторезистор наружу с помощью более длинных проводов. Это хорошие задачи для инженера. Надеемся, вы с ними успешно справитесь. А на рис. 4.28 показан вариант такого «умного дома», собранного ребятами из школы № 169 Санкт-Петербурга, в которой работают авторы этой книги. Рис. 4.28. «Умный домик» из Лего «Умный домик». Автономный проект с платой Arduino 165
Как вернуть возможность управлять Arduino интерактивно с использованием среды mBlock? Теперь вспомним об одном важном вопросе. Мы загрузили собственный скетч на контроллер Arduino. Как нам вернуть возможность интерактивного управления? Ведь бо́льшая часть книги посвящена интерактивным игровым программам. Да и автономные программы проще создавать и отлаживать сначала в интерактивном режиме. Напоминаем, всё просто. Достаточно подключить плату к компьютеру посредством USB-кабеля, выбрать порт соединения (см. рис. 2.9) и вновь загрузить прошивку mBlock для управления контроллером Arduino (в меню Соединить выбрать команду Обновить прошивку, см. рис. 2.12). Готово, устройство вновь управляется с помощью mBlock. Задания 1. Соберите макет «умного дома» из доступных материалов, установите в нём электрическую схему автоматического управления освещением. 2. Сделайте проект с включением и выключением освещения по хлопку. В этом случае вместо фоторезистора можно воспользоваться датчиком звука. 3. Дополните проект охранной системой. Для этого в проект можно добавить датчик присутствия, как это было сделано в проекте 9 главы 2. 4. Поставьте ползунок в положение, при котором управляющая система готова выключить свет при малейшем увеличении уровня освещённости. Теперь поднесите датчик света поближе к лампочке (или вплотную к светодиодному индикатору на модуле реле). Что вы наблюдаете и как вы можете объяснить этот эффект? Как с ним можно бороться и как его можно использовать? Что произойдёт, если в предыдущем задании вы по хлопку начнёте включать не источник света, а источник шума? И наоборот, при увеличении громкости выключать источник шума, а при уменьшении включать? 166 ГЛАВА 4
Мы узнали, что... • В качестве «органов чувств» для контроллеров Arduino выступают различные датчики (света, температуры, расстояния и так далее). • С помощью Arduino можно управлять мощными потребителями электроэнергии. Для этого используются специальные устройства — транзисторы и реле. • Существует два режима управления устройствами на основе Arduino. Интерактивным режимом называют такой, когда контроллер лишь исполняет команды, приходящие извне (например, из среды mBlock, работающей на компьютере). Если же вся управляющая программа загружена в память устройства Arduino — такой вариант называют автономным. • Для автономной работы устройствам на основе Arduino Uno требуется обеспечить внешнее питание 6–12 В. Мы научились... • Использовать датчики для приёма информации о состоянии внешней среды. • Подключать простые исполнительные устройства и механизмы. • И самое главное — мы теперь умеем создавать автономные интеллектуальные устройства, самостоятельно функционирующие под управлением контроллера Arduino! «Умный домик». Автономный проект с платой Arduino 167
Новые горизонты. Проекты продвинутого уровня для энтузиастов В этой главе мы узнаем, как значительно расширить возможности среды mBlock, и опробуем часть из них в новых проектах. Усовершенствованные программные инструменты станут подспорьем для тех, кто не привык останавливаться на достигнутом, и позволят взяться за достаточно сложные технические задачи. Готовы перейти на следующий уровень? Тогда начнём! Несколько слов о расширениях для среды mBlock Ранее мы уже объясняли, почему выбрали mBlock 3, а не наиболее свежую версию, называющуюся mBlock 5 (см. главу 1). Самые главные достоинства используемой нами версии программы — изначальная (что называется «из коробки») поддержка работы с микроконтроллерами Arduino плюс доступность сотен замечательных программных расширений, созданных энтузиастами со всего мира. Эти расширения позволяют реализовывать впечатляющие, разнообразные и практически профессиональные проекты в блочной среде программирования. А ведь достаточно распространено мнение, что блочные визуальные среды годятся лишь для знакомства с азами, в то время как удел «настоящих» программистов — текстовые языки. 168 ГЛАВА 5
Можно найти множество примеров, подтверждающих очень простую идею: главной заботой разработчика должно быть обеспечение ясной и наглядной структуры проекта, реализация корректной программной логики. Блочные языки в этом отношении не только не уступают текстовым, но и способны их превзойти. И действительно, в ходе робототехнических соревнований победителями нередко оказываются именно те участники, которые создают программы в визуальных средах, благодаря чему меньше отвлекаются на борьбу с синтаксическими ошибками и основное своё время тратят на содержательные и технические вопросы. Сосредоточиться на главном, не увязая в деталях, позволяют библиотеки готовых программных блоков. Предположим, программисту периодически приходится решать однотипные задачи. Логично будет не изобретать велосипед каждый раз заново, а сделать соответствующий блок, который можно будет использовать многократно. И если оформить свою библиотеку блоков общепринятым способом и предоставить её в совместное использование, то это расширение визуальной среды программирования может пригодиться не только создателю, но и многим другим людям. Существуют расширения, обеспечивающие использование специфического оборудования, например, особых датчиков или моторов. Но есть и достаточно универсальные, упрощающие работу и добавляющие возможности в самых разных ситуациях. Мы предлагаем познакомиться с Advanced Arduino Extension. Это расширение позволит нам разобраться со многими тонкостями, возникающими при программировании микроконтроллеров Arduino. Очень скоро и mBlock 5 обзаведётся достаточным количеством полезных программных расширений. А пока мы продолжаем использовать версию mBlock 3, хорошо зарекомендовавшую себя и в большей мере ориентированную на свободный мир Arduino. Установка расширений для среды mBlock Давайте установим Advanced Arduino Extension на свой компьютер. Существует два основных способа, но в любом случае начать следует с запуска среды mBlock 3. Новые горизонты. Проекты продвинутого уровня для энтузиастов 169
Способ первый — из онлайн-библиотеки расширений. В меню Extensions (Расширения) выберите команду Manage Extensions (Управление расширениями). Появится соответствующее окно (рис. 5.1) Рис. 5.1. Окно выбора расширений Вкладка Available показывает доступные на текущий момент расширения, размещённые на сайте Makeblock, на вкладке Installed отображаются уже установленные. Строка Search позволяет искать расширения по названию. Введите в поисковую строку Search часть названия нужного нам расширения, например Advan. Вы увидите, что список сократится до нескольких пунктов. Проверьте название — AdvancedArduino — и автора (рис. 5.2) Обратите внимание на ссылку More Info. Она ведёт на страницу разработчиков, где можно посмотреть дополнительную информацию и примеры использования, скачать расширение в виде архивного файла, узнать новости проекта и так далее. Но вернёмся к установке. 170 ГЛАВА 5
Рис. 5.2. Нужное расширение найдено. Отображается самая свежая на текущий момент версия (в данном случае 2.87) Нажмите кнопку Загрузка и подождите, пока расширение загрузится и установится (список доступных расширений обновится, весь процесс займёт несколько секунд). Теперь можете выбрать вкладку Installed и проверить наличие на ней AdvancedArduino. Заодно обратите внимание на кнопку Remove (Удалить), позволяющую удалить случайно установленное или больше не нужное расширение. Если для установленного расширения существует обновление, рядом отображается кнопка Update (Обновить). Способ второй — установка расширения из файла, сохранённого на диске. Расширение может быть добавлено и с помощью особого файла. Например, если независимые разработчики разместят его на собственной веб-странице, либо преподаватель разошлёт по почте своим ученикам, специально создав для изучения нужной темы. Так, Advanced Arduino Extension можно загрузить на нашем сайте https://www.lab169.ru/mblock/extensions/advanced-arduinoextension/. Там же можно познакомиться с более подробным описанием и примерами использования для решения таких задач, которых мы не сумели коснуться в этой книге из-за ограниченности её объёма. Рассмотрим, как установить расширение из архивного файла, сохранённого на диске. Следует открыть всё то же окно Manage Extensions (см. рис. 5.1) и нажать расположенную внизу кнопку Add Extension (Добавить расширение). В появившемся окне необходимо выбрать тип загруженного файла (в нашем случае это zip-file) и указать его расположение. После чего нажать кнопку Открыть. Готово, строка AdvancedArduino добавилась на вкладку Installed. Новые горизонты. Проекты продвинутого уровня для энтузиастов 171
Рис. 5.3. Выбираем файл расширения, сохранённый на диске Установка из файла может очень выручить в тех ситуациях, когда компьютер временно или постоянно лишён выхода в Интернет либо онлайн-сервис по каким-то причинам недоступен. Итак, расширение установлено, можно переходить к его освоению. Но не забывайте, что существует и масса других, не менее интересных вещей, например для работы с Интернетом (Internet of thing, IoT) либо использования элементов искусственного интеллекта в собственных проектах! (Да-да, такие возможности тоже есть!) Открывающиеся перспективы настолько широки, что их не рассмотреть в рамках одной книги. Мы постараемся освоить лишь некоторые общие приёмы на примере использования Advanced Arduino Extension. Программы в этой главе будут постепенно усложняться, но начнём мы с простых шагов, повторяя и совершенствуя реализованные ранее проекты. Примечание Использование расширения AdvancedArduino позволяет глубже разобраться не только в тонкостях визуального программирования микроконтроллеров, но и в языке Wire. Вновь обращаем внимание читателей на сайт Arduino.ru, который поможет освоить важные средства программирования продвинутого уровня. Нет нужды учить 172 ГЛАВА 5
синтаксис языка Wire наизусть, но полезно будет ознакомиться с основными понятиями и принципами. Например, в следующих проектах мы планируем использовать различные типы данных (целые и действительные числа, массивы), а также локальные, глобальные и статические переменные. Следует понимать, в чём заключается разница между ними (http://arduino.ru/Reference). В начале книги мы рассказывали о тех задачах, которые способны решать микроконтроллеры в современном мире, в том числе и о технологиях «умного дома». По мере освоения новых средств у нас появится всё больше возможностей перехода от учебных проектов к более «взрослым», прикладным и профессионально ориентированным. Проект «Программируемая новогодняя гирлянда» В главе 2 мы уже создавали «бегущие огни», но тот проект работал лишь под управлением компьютера. Теперь же гирлянда будет функционировать самостоятельно. Воспользуемся нашей любимой светодиодной сборкой, чтобы собрать прототип гирлянды. При желании можно будет доработать его и заменить полноценным устройством, имеющим корпус, блок питания и управляющим линейками светодиодов посредством транзисторов. В этот раз проект будет работать в автономном режиме. Не забывайте, что загрузка программы на плату подразумевает процесс компиляции, который может пройти успешно лишь при отсутствии ошибок в тексте программы. Ошибка не повод опускать руки, это всего лишь потерянное время, которым оплачивается приобретённый опыт. Но быть достаточно внимательным теперь важнее, чем раньше! Вновь «бегущие огни», но в автономном режиме Соберите электронную часть проекта точно так же, как в главе 2 (см. рис. 2.20), используя плату Arduino Uno и светодиодную сборку. Создайте скрипт по рис. 5.4, реализующий «бегущие огни» в автономном режиме работы. Новые горизонты. Проекты продвинутого уровня для энтузиастов 173
Переключитесь в Arduino mode (меню Редактировать), познакомьтесь с отображённым в правой панели текстовым вариантом программы. Рис. 5.4. Программа в режиме Arduino mode с текстовым вариантом справа Загрузите программу на Arduino Uno (кнопка Upload to Arduino) и убедитесь, что скрипт работает, огни начали двигаться. «Бегущие огни»: пробуем использовать собственные блоки Вспомните рис. 2.25. В интерактивном режиме мы успешно использовали собственные блоки, чтобы уменьшить громоздкость программы, оптимизировать её структуру. Давайте попытаемся создать аналогичный блок и в нашем текущем проекте. Проверим, как он будет функционировать в режиме автономной работы платы Arduino. 174 ГЛАВА 5
Назовём этот блок blink, а используемый в нём параметр — pin (напоминаем, что при создании блока надо щёлкнуть по флажку Опции и выбрать Добавить ввод числа, а в появившееся поле ввести требуемое имя). Соберите скрипт по рис. 5.5. Обратите внимание, скрипт несколько проще, чем на рис. 2.25. Мы жёстко зададим время мигания, программа окажется лаконичнее, и легче будет разобраться в происходящем. Кроме того, для автономного режима предпочтительнее использование английского языка (или трансли́та) для всех создаваемых нами идентификаторов (блоков, параметров, переменных). Текстовой вариант программы окажется значительно понятнее, а это имеет особое значение при возникновении ошибок компиляции. Посмотрев на сообщение об ошибке, мы сможем выяснить, в чём она заключается. Рис. 5.5. Скрипт с собственным блоком. Пробуем в автономном режиме работы Попробуйте загрузить программу на Arduino Uno (Upload to Arduino)... Ну вот и окно ошибки загрузки. Не беда, мы были к этому готовы. Полностью избежать ошибок не удавалось никому и никогда. Самый главный вопрос — что делать, когда такое происходит? В правом нижнем углу mBlock — область с текстовым выводом программы-компилятора (рис. 5.6). Полистайте текст. Вы увидите сообщения: «In function void setup( )», «error: pin was not declared in this score». Новые горизонты. Проекты продвинутого уровня для энтузиастов 175
Рис. 5.6. Область текстовых сообщений Природа ошибки становится яснее, если вспомнить об особенностях работы автономного режима. В момент компиляции значение pin ещё не определено. И вместо идентификатора pin (это параметр функции) в команду pinMode(pin,OUTPUT); нельзя подставить какое-то конкретное число (то есть аргумент функции; обратите внимание, что pinMode и pin — совершенно разные, не связанные друг с другом идентификаторы; см. рис. 5.5). В интерактивном режиме ошибка не возникает, поскольку этапа компиляции нет, каждое действие осуществляется «на лету». При этом в реальности выполняется не одно действие (как кажется пользователю), а сразу несколько взаимосвязанных. Разработчики mBlock попытались оградить нас от ряда технических тонкостей, взяв их решение на себя. Как видите, в данном случае получилось только хуже. Разбираться в причинах и способах устранения ошибки нам всё равно придётся, и поможет в этом Advanced Arduino Extension. Не пугайтесь раньше времени, на самом деле всё не так уж сложно. «Бегущие огни»: для собственных блоков используем расширение AdvancedArduino Для начала проверьте, что в меню Extensions (Расширения) главного окна установлена галочка рядом с пунктом AdvancedArduino (рис. 5.7). На палитре блоков выберите категорию Робот. Сейчас тут отображаются наборы команд обоих расширений: и встроенного Arduino, и нашего добавленного AdvancedArduino. Для удобства скройте отображение команд Arduino (нужно щёлкнуть по названию и выбрать пункт Спрятать расширение, рис. 5.8). 176 ГЛАВА 5
Давайте теперь, используя расширение AdvancedArduino, отредактируем скрипт предыдущего проекта (рис. 5.9). Меняем «шапочна ку» (заголовок) , в блок вместо прежних вставляем команды . ОбратиРис. 5.7. Активные расширения отмечены те внимание, что названия блоков AdvancedArduino специально не переведены и соответствуют используемым в текстовом языке программирования. Это обеспечивает наглядность, ведь легко увидеть взаРис. 5.8. На время спрячем блоки имосвязь между содержимым лерасширения Arduino вого поля (графического) и правого (отображающего так называемый текстовой скетч). Кроме того, запоминая названия команд, мы знакомимся с синтаксисом Arduino IDE, что пригодится в будущем. Рис. 5.9. «Бегущие огни» с использованием расширения AdvancedArduino Проверьте, что соединение с микроконтроллером установлено (индикаторы возле расширений Arduino и AdvancedArduino зелёные, см. рис. 5.9). Нажмите кнопку Upload to Arduino. Если программа была составлена правильно, она откомпилируется, загрузится и заработает на плате. Новые горизонты. Проекты продвинутого уровня для энтузиастов 177
Да, программа работает, но почему-то работает не совсем так, как мы ожидали. Светодиоды зажигаются еле-еле, их яркость гораздо ниже, чем в проекте с интерактивным управлением. Продолжим наше исследование, а заодно вспомним о двух основных режимах работы каждого порта — INPUT и OUTPUT. «Бегущие огни»: вручную задаём режимы работы портов Проблема кроется в том, что в нашем проекте порты микроконтроллера Arduino пока что работают не в том режиме. При интерактивном управлении прошивка автоматически переключает режимы работы каждого порта (INPUT или OUTPUT) при выполнеили ). Этот нии команды чтения или записи ( процесс скрыт от нас, прошивка решает задачу самостоятельно, причём не играет роли, какое именно расширение используется — Arduino или AdvancedArduino. В режиме автономной работы ситуация меняется. Как мы убедились, с расширением Arduino возникают ошибки компиляции. Поэтому в AdvancedArduino используется иной принцип управления режимами работы портов микроконтроллера. Добавлен специальный блок , и выбирать режим работы используемого порта в автономных проектах необходимо вручную. Это общепринятое универсальное решение, именно так и поступают профессиональные программисты, создающие приложения в Arduino IDE и других средах. можно и в теле основной Использовать блок программы (внутри цикла ), но в большинстве случаев удобнее будет выполнить эту команду один раз при запуске микроконтроллера (пе). Кстати, для ясности уточним, что в интерактивных ред циклом проектах по-прежнему не будет играть никакой роли, задействован блок или нет. Итак, давайте доработаем нашу программу. Создайте и добавьте в скрипт новый блок (подпрограмму, функцию) жащий несколько команд (подготовка), содер, которые установят пра- вильный режим работы используемых портов (рис. 5.10). 178 ГЛАВА 5
Рис. 5.10. Добавляем управление режимами работы портов из расширения AdvancedArduino Загрузите программу на Arduino Uno и убедитесь, что в этот раз светодиоды горят ярко. Победа! Теперь хотелось бы наш проект усовершенствовать. Давайте подумаем, что делать, если потребуется управлять не шестью лампочками, а шестьюдесятью, например, с контроллером Arduino Mega 2560? Просто удлинять перечень портов не очень рационально, должны быть средства, позволяющие решить задачу просто и изящно. Есть они у нас? Конечно, ведь у нас есть AdvancedArduino! Используем счётчик В этом проекте мы задействуем специальный блок, исполняющий роль счётчика. Пусть смена номера порта происходит автоматически, от нас же требуется лишь указать общее число повторов. Следует учесть, что традиционно в компьютерных программах используется счёт от нуля, а не от единицы. Например, при трёхкратном повторении событий счётчик принимает значения от 0 до 2. Найдите блок (счётчик), который добавлен в расширение AdvancedArduino. Для понимания того, как он функционирует, просто воспроизведём предыдущий проект, но с использованием данного блока (рис. 5.11). Новые горизонты. Проекты продвинутого уровня для энтузиастов 179
Рис. 5.11. «Бегущие огни» на основе счётчика Загрузите программу на микроконтроллер, проверьте её работоспособность. . Не треОбратите внимание на удобство использования блока буется специально создавать переменную, исполняющую роль счётчика, она сама собой появляется в листинге (в тексте программы). Разберёмся, как работает этот блок в нашем скрипте. Возьмём один из циклов (рис. 5.12). Рис. 5.12. Разбираемся с работой счётчика Значение блока изначально равно 0. С каждой итерацией (по- втором цикла) это значение увеличивается на единицу. При шести итерациях блок Выражение ( принимает последовательно значения 0, 1, 2, 3, 4, 5. ) принимает значения 13, 12, 11, 10, 9, 8. Это со- ответствует номерам используемых нами пинов. 180 ГЛАВА 5
Используем счётчик. Огни бегут туда-обратно Для закрепления новых знаний модифицируем наш проект так, чтобы огонёк перемещался сначала в одну сторону, а потом в другую, не останавэто будет несложно. ливаясь нигде надолго. С блоком Следует обратить внимание лишь на одну небольшую хитрость. В теле основной программы потребуется использовать два цикла, причём в первом выражение внутри блока должно принимать значения от 13 до 9, а во втором — от 8 до 12. Можете попробовать решить эту задачу самостоятельно, не заглядывая в следующий рисунок (рис. 5.13). Рис. 5.13. Теперь огни бегут то туда, то обратно Проверьте работу программы. Не правда ли, стало интереснее! Мы був этой книге и дальше. Но не следует задем использовать блок ) бывать о том, что он в отличие от базовых блоков (например, работает лишь в автономных проектах, в режиме Arduino mode. Для особо любознательных можно использовать и во вложенных циклах. РазоБлок браться в том, что при этом будет происходить, можно на примерах (пример № 13 в описании расширения на сайте www.lab169.ru), а для более глубокого изучения следует поискать в интернет-источниках понятие «область видимости переменной». Новые горизонты. Проекты продвинутого уровня для энтузиастов 181
Перепутанные огни: используем массивы Когда юные программисты постигают азы мастерства, на пути рано или поздно встречается тема, которая пугает одним только названием, — «МАССИВЫ». Есть разные научные определения этого понятия, но по сути оно означает пронумерованный набор каких-то однородных величин. Настало время и нам опробовать этот тип данных. Зачем мы заговорили о массивах сейчас? С одной стороны, у нас есть повод освоить новый инструмент, который понадобится в будущем, в том числе на уроках информатики. С другой — мы предлагаем прямо сейчас убедиться, что и в нашем конкретном проекте использование массивов может принести вполне ощутимую пользу. Например, мы захотели создать «светомузыкальную композицию» произвольной длины, да ещё так, чтобы порядок проигрывания «нот» можно было динамически менять. Или вот более простая задача. Предположим, у нас есть желание запрограммировать «бегущие огни», но проблема в том, что гирлянда перепутана и исправить это невозможно. Либо нам просто нравится какой-то необычный порядок зажигания огоньков. Для сборки перепутанной гирлянды понадобится макетная плата. А при наличии в руках светодиодной сборки будем считать, что просто хотим обеспечить нестандартный порядок зажигания лампочек. Кстати, проект потом можно будет усовершенствовать, чтобы в произвольный момент и в произвольной точке заставлять огонёк менять направление движения! Попробуем. Нам потребуется массив, длина которого должна быть равна количеству лампочек (6 штук). Корректные индексы (номера элементов массива) для данной ситуации это 0, 1, 2, 3, 4, 5. Индексов тоже шесть, но нумерация начинается с нуля. Индексы массивов обычно пишут в квадратных скобках, обратите на это внимание, когда будете анализировать скрипты проекта. Использовать мы будем три блока из расширения AdvancedArduino (рис. 5.14), они предназначены именно для массивов (по-английски array). Массив сделаем глобальным (global), чтобы можно было работать с ним в любой части нашей программы. Не перепутайте, там есть ещё много похожих блоков для переменных разных типов. 182 ГЛАВА 5
Рис. 5.14. Блоки работы с массивом, используемые в проекте На рис. 5.14 слева направо блоки, в которых: • назначается тип хранимых данных, указывается название массива и количество элементов в нём; • присваивается значение конкретному элементу выбранного массива; • вызывается элемент массива для использования значения, которое в нём хранится. Для того чтобы не чрезмерно усложнять нашу книгу, мы не будем рассказывать обо всех возможных типах данных и вариантах использования массивов. В рамках нашего проекта важны лишь некоторые частности. Всё остальное любопытные читатели легко найдут в Интернете. Соберите скрипты, используя рис. 5.15, с помощью флажков в окошках блоков выберите нужные значения (например, тип данных byte, означающий целое число от 0 до 255). Рис. 5.15. Скрипт проекта «Перепутанные огни». Работаем с массивом Посмотрите внимательно на программу. В блоке мы задаём начальные значения всех элементов массива. Например, элементу массива Новые горизонты. Проекты продвинутого уровня для энтузиастов 183
с индексом 1 мы присваиваем значение 5, а с индексом 4 — значение 2, и эти значения в ходе выполнения программы не меняются. В рамках нашего проекта это не нужно, но такая возможность есть, и она потребуется для решения других задач. Ещё одно небольшое замечание: в данном проекте и значения элементов массива, и индексы занимают диапазон от 0 до 5. Для того чтобы было проще разбираться в логике работы программы, можно считать, что к пину D8 подключена лампочка номер ноль, а к пину D13 — номер пять. Задание А можете сделать, чтобы светодиоды зажигались так: D13, D8, D9, D12, D11, D10? Надо просто поменять начальные значения элементов массива. Обязательно попробуйте! А захотите проверить — в электронном архиве есть такой файл проекта. Бегущий «червячок» Давайте возьмёмся за новую задачу, решение которой потребует использования новых инструментов, возможно, не менее головоломных, чем массивы. Пусть движется не единственный огонёк, а сразу несколько. Скажем, два или три рядом расположенных, чтобы получилась движущаяся светящаяся полоска (движущийся «червячок»). В каждой итерации программы один светодиод потребуется зажигать, а другой, расположенный несколько позади, гасить. У нас достаточно короткая линейка светодиодов, всего 6 штук. Будем считать, что нумерация лампочек идёт по кругу, условно образуя кольцо. При желании можно собрать и настоящее кольцо из светодиодов на макетной плате. Для решения задачи воспользуемся особой операцией — остаток от целочисленного деления (modulo, не путать с abs — абсолютным значением). Для её обозначения в среде программирования Arduino применяют символ %. 184 ГЛАВА 5
Для того чтобы не тратить много слов на объяснения работы операции modulo, предлагаем просто ознакомиться с таблицей, которую, мы уверены, каждый сможет продолжить и сам. 0%6=0 1%6=1 2%6=2 3%6=3 4%6=4 5%6=5 6%6=0 7%6=1 8%6=2 9%6=3 10 % 6 = 4 11 % 6 = 5 12 % 6 = 0 13 % 6 = 1 14 % 6 = 2 15 % 6 = 3 16 % 6 = 4 17 % 6 = 5 18 % 6 = 0 19 % 6 = 1 20 % 6 = 2 ... Другие примеры и разбор оператора % — по ссылке http://arduino.ru/ Reference/Modulo. В расширении AdvancedArduino есть соответствующий блок (рис. 5.16), он находится в самом конце списка. Рис. 5.16. Блок остатка от целочисленного деления в AdvancedArduino Теперь можно собрать скрипты программы, опираясь на рис. 5.17. Обратите внимание, что необходимо создать новый блок (свет) с двумя полями для ввода числовых значений. Пара- метр num требуется для вычисления номера цифрового пина, а state задаёт состояние этого пина (1 или 0, иными словами HIGH или LOW). Рис. 5.17. Скрипты бегущего «червячка» Новые горизонты. Проекты продвинутого уровня для энтузиастов 185
Кроме того, мы воспользуемся ещё одним новым блоком — . Дело в том, что аргументами блока modulo (%) должны быть лишь целые числа, а параметры функции — действительные (с дробной ча- стью), поэтому возникает необходимость в использовании операции приведения одного типа к другому. Блок осуществляет приведение действительного типа к целому. В программировании часто приходится следить за типом используемых данных и, если требуется, менять один тип на другой. Возможно, всё это выглядит как неоправданное усложнение, способное лишь запутать начинающего программиста, но не следует забывать о том, что вычислительные ресурсы современных микроконтроллеров пока очень ограничены. Целые числа занимают меньше памяти при хранении, чем действительные, да и операции с ними выполняются быстрее. По мере приобретения опыта вы будете всё лучше понимать, какой тип данных нужен в той или иной ситуации. Закончив составление программы, загрузите её на плату. Понаблюдайте, как огоньки перемещаются группой. Светящийся «червячок», дойдя до одного края светодиодной линейки, продолжит свой путь у другого. А если светодиоды расположены в форме кольца, получится движение по кругу. Лучший способ понять, как работает программа, — это внести в неё изменения и проверить, что получилось. Попробуйте «поиграть» числами. Как добиться того, чтобы длина «червячка» оказалась равной пяти огонькам? Не исключено, что для кого-то окажется полезным представить себя на месте компьютера (в данном случае микроконтроллера) и самостоятельно произвести необходимые расчёты. В таком случае постарайтесь не ошибиться и заполнить следующую таблицу. Значения счётчика counter (у нас 6 циклов) Что получается в блоке pin= state= Что получается в блоке pin= state= 0 1 2 3 4 5 186 ГЛАВА 5
Надеемся, ни у кого не возникло сомнений, что операция вычисления остатка целочисленного деления очень полезна и помогает в самых разных ситуациях. Мы непременно будем её использовать и дальше. Экспериментируем с новыми командами Тем, кому нравятся головоломки, предлагаем дополнительную задачу! Давайте возьмём проект, в неработоспособности которого мы уже убедились (см. рис. 5.6), и попробуем его изменить. Отредактируйте определев соответствии с рис. 5.18. ние блока Рис. 5.18. Измененный скрипт Загрузите скрипт на плату и посмотрите, что получилось. Не правда ли, очень похоже на работу проекта на рис. 5.9? Всё дело во встроенных подтягивающих резисторах! Объём книги ограничен, и мы не можем в ней объять необъятное. Скажем лишь, что об использовании внутренних (встроенных в микроконтроллер) подтягивающих резисторов можно прочитать здесь: http://arduino.ru/ Tutorial/DigitalPins. А также здесь: https://novator.team/post/655. Далее мы начинаем серию проектов с новыми электронными компонентами. В модифицированном и расширенном наборе «Дерзай! Scratch плюс Arduino. Набор для юных конструкторов» уже есть всё необходимое. Но если подобного набора не оказалось под рукой, не беда. Компоненты распространённые, их можно найти во многих магазинах радиодеталей или заказать через Интернет. Мы выбрали наиболее полезные на наш взгляд модули, которые наверняка пригодятся в самых разных ситуациях. Новые горизонты. Проекты продвинутого уровня для энтузиастов 187
Проект «Автоматический переезд» В этом проекте мы займёмся изготовлением модели автоматического переезда, реагирующего на транспортное средство и управляющего шлагбаумом и светофором. Всё больше появляется учебных роботов, способных двигаться по размеченной линии. Почему бы не использовать их для игры? Автоматический переезд будет следить за проезжающими мимо роботами, игрушечными поездами и машинками. Знакомьтесь, RGB-светодиод Для создания цветового светофора на переезде нам понадобится всего один модуль, но особенный, способный светиться разными цветами. На маленькой плате с четырьмя контактами размещается специальный RGBсветодиод, содержащий в одном прозрачном корпусе три источника света (рис. 5.19). За счёт смешения красного, зелёного и синего компонентов в разных пропорциях (RGB — аббревиатура английских слов red, green, blue, то есть красный, зелёный, синий) можно получить практически любой оттенок. Этот принцип используется и для создания цветного изображения на экранах смартфонов, компьютеров и телевизоров. Развернутые описания классических RGB-светодиодов легко найти в Интернете, например на странице http://arduino-diy.com/arduino-rgbsvetodiod. Рекомендуем посмотреть материал по этой ссылке тем, кто хочет подключить к плате Arduino вместо готового RGB-модуля сам светодиод, выглядящий как лампочка с ножками. Следует помнить о том, что на светодиодном модуле уже смонтированы необходимые токоограничивающие резисторы, а при использовании макетной платы с подобной «лампочкой» эти резисторы в схему нужно будет добавить самому. Ещё один момент, на который следует обратить внимание, заключается в том, что мы планируем использовать RGB-светодиод с общим анодом (об этом Рис. 5.19. RGB-светодиод мы подробнее поговорим чуть позже). 188 ГЛАВА 5
На рис. 5.20 изображён RGB-модуль со встроенными токоограничивающими резисторами и привычными контактами для подключения проводов. Учтите, что модули бывают разные, производители не всегда должным образом подбирают сопротивление резисторов, в результате три источника света могут иметь разную яркость, а при смешении давать цвет с каким-то оттенком вместо белого. Рис. 5.20. Модуль RGB-светодиод Посмотрите на модуль, у него 4 ножки. Каждым источником света будет управлять отдельный пин микроконтроллера, и эти 3 контакта на модуле подписаны буквами R, G и B. А четвертый контакт, общий, определяет схему подключения модуля. Принципиально возможны две схемы: либо с общим катодом, либо с общим анодом. И проект будет функционировать по-разному в одном и в другом случае. Подключение светодиода с общим катодом — R, G, B, Gnd, подключение светодиода с общим анодом — R, G, B, VCC (рис. 5.21). Рис. 5.21. Два типа RGB-светодиодов На рис. 5.20 видно, что четвертый контакт нашего модуля обозначен буквой V, значит, следует использовать схему подключения с общим анодом. Новые горизонты. Проекты продвинутого уровня для энтузиастов 189
Приступаем к сборке. Соедините проводами контакты модуля с выходами платы Arduino Uno. Подключение: контакт R к порту D12, контакт G к D8, контакт B к D2, контакт V к гнезду +5V. Наш проект предусматривает цифровое управление — мы будем лишь включать или выключать каждый компонент, но не менять его яркость. Пины D2, D8, D12 не поддерживают аппаратно широтно-импульсную модуляцию (ШИМ); мы выбрали их, чтобы нас не отвлекали особые ситуации, периодически возникающие с теми пинами, которые прошивка использует для управления моторами. Давайте проведём первый эксперимент с модулем. Для начала будем работать с контроллером в интерактивном режиме. Подключите плату USBкабелем к компьютеру, проверьте соединение с нужным последовательным портом и не забудьте обновить прошивку на плате (в меню Соединить выберите пункт Обновить прошивку). Соберите скрипты по образцу (рис. 5.22) и пробуйте запускать их, наблюдая за результатами. Например, вначале блок, который устанавливает на портах D2, D8 и D12 значение LOW, а затем блок, устанавливающий на тех же портах значение HIGH. Рис. 5.22. Скрипты для эксперимента с модулем Вы увидите, что при значении HIGH светодиод гаснет, а при LOW — загорается. Несколько странно, не правда ли? Вновь зажгите все светодиоды блоком LOW, а после этого попробуйте . считать значения портов, запустив блок с командами 190 ГЛАВА 5
Выясняется, что светодиоды гаснут и при чтении значения пинов, когда прошивка переключает порты в режим INPUT. Раньше мы считали, что HIGH — это всегда включение электрического тока, а LOW — выключение, но на практике всё оказывается несколько сложнее и зависит от используемой схемы соединения элементов. Создаем блоки включения и выключения белого цвета Продолжим работу в интерактивном режиме, так будет проще и быстрее, ведь пока что мы лишь продолжаем своё исследование. На следующем этапе мы создадим и протестируем блоки для полного включения и полного выключения светодиода. Как мы уже знаем, используемый нами RGB-светодиод зажигается, если записать во все три порта значение LOW (а не HIGH), но было бы неплохо понять, почему так происходит. Когда активирован режим INPUT, соответствующий порт находится в так называемом высокоимпедансном состоянии. Это означает, что контакт изолирован от обеих шин питания (от VCC и от Gnd). Электрического тока нет. В режиме OUTPUT контакт связан либо с положительной шиной питания (HIGH), либо с отрицательной (LOW). Электрический ток возникает, если есть разность потенциалов, поэтому RGB-светодиод с общим анодом (подключенным к VCC) загорается при записи в порты значения LOW (когда порты становятся подключенными к Gnd). и по образцам на рис. 5.23 Создайте два новых блока и проверьте их работу. Рис. 5.23. Модули включения и выключения всех трёх компонентов RGB-светодиода Новые горизонты. Проекты продвинутого уровня для энтузиастов 191
Обратите внимание, что получившийся цвет, скорее всего, не является чисто белым (имеет оттенок) из-за несбалансированной яркости компонентов. При желании это можно исправить, добавив дополнительные токоограничивающие резисторы. Например, при наличии голубого оттенка контакт B (blue) следует подключить через дополнительный резистор сопротивлением в несколько десятков или сотен ом. Восемь вариантов цвета На третьем этапе создадим блоки для восьми разных режимов работы RGB-светодиода, опираясь на рис. 5.24. имеет три параметра (флажок Опции — Добавить Блок ввод числа, названия: красный, зеленый, синий). Рис. 5.24. Блоки, обеспечивающие восемь режимов работы RGB-светодиода Обратите внимание, что управляющих пина у нас три, а блоков, задающих конкретный цвет (включая чёрный и белый), восемь. Восемь — это два в третьей степени (23). Здесь два — это два режима работы каждого компонента (включено, выключено). На рис. 5.24 можно увидеть, что мы перебрали все варианты расположения 0 и 1 в трех позициях цвета, получилось 192 ГЛАВА 5
именно восемь вариантов. Можно ещё сказать, что получившиеся последовательности нулей и единиц — это числа от 0 до 7 в двоичном формате. С двоичной арифметикой мы ещё будем сталкиваться в следующих проектах. Проверьте работу блоков, щёлкая по ним (по самим блокам прямо на палитре, а не по определениям на рабочем пространстве). Как видите, есть возможность получить красный, жёлтый и зелёный цвета — то, что нам нужно для реализации проекта светофора. Модель автоматического переезда: собираем шлагбаум и светофор На этом этапе мы приступим к сборке модели автоматического переезда, периодически открывающего и закрывающего шлагбаум. Помимо модуля RGB-светодиода нам потребуется ещё сервомотор (рис. 5.25), который будет поворачивать штангу вверх-вниз. Про устройство сервомотора и его подключение к плате Arduino можно почитать в ИнтерРис. 5.25. Сервомотор нете, например в статьях http://wiki.amperka.ru/ articles:servo и https://роботехника18.рф/сервопривод-ардуино/. Обязательно посмотрите эти материалы! Управление сервомотором осуществляется модулированным сигналом, но всю сложную работу выполняют библиотеки, так что пользоваться сервомотором в графической среде программирования легко. Даже необходимые подготовительные команды в текстовой скетч будут добавлены автома. тически. Нам понадобится лишь специальный блок Несколько важных слов про подключение. В нашем случае для небольшого сервомотора без особой нагрузки вполне хватит мощности стабилизатора питания на плате Arduino, так что подсоединить сервомотор можно непосредственно к разъёмам микроконтроллера. Но будет удобнее воспользоваться шилдом прототипирования, или сенсором-шилдом (там больше гнёзд +5V и GND). При этом требуется обеспечить достаточное питание, например, от батареи из шести элементов по 1,5 В или двух литиевых аккумуляторов по 3,7 В (рис. 5.26). Новые горизонты. Проекты продвинутого уровня для энтузиастов 193
Рис. 5.26. Электронные компоненты проекта «Переезд» У сервомоторов, которые обычно используют в проектах с Arduino, три провода: чёрный/коричневый, красный и рыжий/жёлтый. Чёрный провод присоединяем к GND, красный провод — к 5V, оранжевый/жёлтый — к подходящему цифровому выходу (в создаваемом нами устройстве это порт D9). Подключение модуля RGB-светодиода такое же, как раньше (D12, D8, D2). Соберите скрипты, ориентируясь на рис. 5.27. Рис. 5.27. Скрипты проекта «Переезд» 194 ГЛАВА 5
Загрузите программу на контроллер Arduino, подсоедините источник питания, убедитесь, что всё работает в соответствии с замыслом. Примечание Обычно в проектах с использованием сервомоторов проблемы возникают из-за недостаточного электропитания. Если при отключенном сервомоторе модуль RGB меняет цвет так, как задумано, а при подключении серво работа сбивается (плата начинает перезагружаться), то требуется увеличить мощность источника питания. Замените батарейки или воспользуйтесь литиевыми аккумуляторами (двух элементов по 3,7 В вполне хватит). Теперь самое время проявить фантазию конструктора, чтобы превратить разложенные на столе детали в законченную модель устройства. Из чего изготовить нужные конструктивные элементы — выбирайте сами. Можно использовать детали Лего, а можно просто вырезать из бумаги или картона и склеить всё то, что нужно. Мы даже не будем размещать здесь фотографию шлагбаума для примера. Вы ведь уже знаете, где можно её найти?! Наша модель переезда пока что просто периодически запрещает и разрешает движение. И даже в таком виде ей можно найти множество применений в игровых и учебных задачах. Например, использовать для занятий с младшеклассниками по правилам дорожного движения. Но давайте двигаться дальше. Попробуем усовершенствовать этот проект? «Умный» автоматический переезд Предлагаем сделать наш автоматический переезд «умным», научим его реагировать на подъезжающий поезд или машину (или подходящего к перекрестку пешехода) и своевременно останавливать транспорт, движущийся поперёк. Такие устройства обычно используют на малозагруженных участках дорог, в результате движение происходит почти без задержек. Давайте опишем схему работы переезда. Шлагбаум будет стоять на основной дороге, по которой движется много транспорта. Начальное состояние — штанга поднята, сигнал проезжающим машинам — зелёный. Новые горизонты. Проекты продвинутого уровня для энтузиастов 195
Ультразвуковой дальномер развёрнут в сторону пересекающей дороги, по которой время от времени проезжает какое-то важное транспортное средство, например, железнодорожный состав или машина аварийной службы. Как только это происходит, сигнал на основной дороге становится сначала жёлтым, затем красным, и шлагбаум перекрывает движение основному потоку машин. Через некоторое время вновь загорается жёлтый сигнал, затем зелёный, и шлагбаум поднимается, открывая движение. Попробуйте реализовать этот проект самостоятельно. Потребуется усовершенствовать предыдущий скрипт, обеспечив чтение показаний ультразвукового дальномера HC-SR04, который и будет сигнализировать о приближении транспортного средства. Дальномер уже использовался нами раньше в игровой задаче «Парктроник автомобиля» (см. проект 10 в главе 2). Небольшую подсказку мы всё же дадим. Внести в проект нужные изме(выполнения какого-то услонения можно с помощью блока вия, рис. 5.28). Рис. 5.28. Блок ожидания показаний ультразвукового датчика Видно, что для работы с ультразвуковым дальномером мы используем порты 4 и 5. На модуле HC-SR04 всего четыре контакта. Оставшиеся два провода вновь потребуют 5V и GND, но шилд прототипирования имеет достаточно гнёзд питания. Расстояние срабатывания можно подобрать по ситуации. Пробуйте, создавайте, добивайтесь правильного функционирования в соответствии со своим замыслом. Ну а если что-то пойдёт не так, в электронном архиве есть пример реализации данного проекта. Проект «Полноцветная иллюминация» Разноцветные огни всегда создают атмосферу праздника, достаточно вспомнить о ёлочной гирлянде на новогодней ёлке. Вам наверняка понравится этот проект! Ведь сейчас мы займёмся созданием разноцветной 196 ГЛАВА 5
динамической иллюминации со случайным выбором цвета. А поможет нам интересный электронный компонент, который управляется точно так же, как лента c RGB-светодиодами. Это RGB-модуль в виде кольца на базе светодиодов WS2812B, которые часто называют NeoPixel. Как обычно, дополнительный материал об этих симпатичных и удобных источниках света легко найти в Интернете. Мы скажем лишь, что в модулях и светодиодных лентах NeoPixel можно управлять и всеми огнями сразу, и каждым огонёчком отдельно по его адресу (номеру), а также использовать цвет любого оттенка. Свечение яркое, красивое и сбалансированное по тональности. Для управления применяется специальный модулированный сигнал, который дешифрует микросхема, расположенная внутри каждого светодиода. Но и здесь программирование будет несложным для нас. Опять всю тяжёлую работу берут на себя библиотечные функции, а нам остаётся лишь воспользоваться удобными визуальными блоками для создания собственного алгоритма. Рассмотрим один из распространённых вариантов модуля NeoPixel (рис. 5.29). Рис. 5.29. Модуль NeoPixel. Кольцо, 8 светодиодов Новые горизонты. Проекты продвинутого уровня для энтузиастов 197
Если перевернуть модуль, можно прочитать надписи на двух группах контактов (рис. 5.30). Нас интересует группа, в которой средний контакт помечен как DI (digital input — цифровой вход), именно он будет принимать управляющий сигнал от платы Arduino. Другая группа, в которой есть контакт DO (digital output — цифровой выход), предназначена для присоединения дополнительных светодиодных модулей. Остальные обозначения знакоРис. 5.30. Модуль NeoPixel. Маркировка контактов мы: GND и 5V необходимо подключить к соответствующим гнёздам на плате. На рис. 5.29 видно, что в разъём первой группы контактов (GND, DI, 5V) мы воткнули провода для связи с платой Arduino. Обратите внимание, нам потребуется всего один пин для управления всеми огнями! Удобные блоки управления светодиодными модулями есть в штатном расширении Orion. Этими блоками (и расширением) мы и воспользуемся, чтобы не подключать нужные библиотеки вручную. Для того чтобы разобраться, как управлять модулем, предлагаем для начала поработать в интерактивном режиме. Подключите модуль NeoPixel к микроконтроллеру. Контакты проводов GND и 5V к соответствующим гнёздам, а управляющий DI — к порту D13 на плате. Присоедините Arduino к компьютеру при помощи кабеля USB. В меню mBlock выберите плату Starter/Ultimate (Orion) (рис. 5.31). Эта плата совместима с Arduino Uno. Не забудьте выбрать в меню пункт Соединить, коммуникационный порт, а затем Обновить прошивку. Обновление прошивки необходимо для того, чтобы микроконтроллер научился в интерактивном режиме отправлять команды модулю NeoPixel. 198 ГЛАВА 5
Перейдите в раздел Робот палитры блоков, временно скройте все расширения, кроме Orion (рис. 5.32). Теперь всё готово для интерактивного управления огнями модуля. Нам потребуется блок (см. рис. 5.32). На контроллере Orion вместо номеров пинов используются обозначения «порт/слот». Выбранные на рисунке Рис. 5.31. Выбираем плату значения «Порт 3, Слот 2» соответствуStarter/Ultimate (Orion) ют пину D13, к которому подключен управляющий контакт нашего светодиодного модуля. На сайте Makeblock есть документация о контроллере Orion, в которой можно посмотреть обозначения других пинов. Поменяйте интенсивность цветовых компонентов в полях red, green, blue и щёлкните по блоку. Кольцо начнёт светиться выбранным цветом. Напоминаем, что значения могут быть любыми от 0 до 255. А как погасить все огоньки? Правильно: выбрать везде интенсивность 0 и вновь щёлкнуть по блоку. Теперь попробуйте поиграть отдельными огоньками (задавая номер светодиода в третьем поле, где на рисунке указано значение все). Если хотите, можете собрать простой скрипт, меняющий цвета один за другим. Получилось? Замечательно, теперь мы готовы к созданию автономных проектов с модулем NeoPixel. Рис. 5.32. Блок управления модулем светодиодов в расширении Orion Новые горизонты. Проекты продвинутого уровня для энтузиастов 199
«Докладчик», или как узнать, что «надумало» наше автономное устройство? В этом проекте займёмся отладкой алгоритма выбора насыщенного цвета со случайным оттенком. При этом мы освоим очень полезный инструмент, позволяющий обмениваться информацией с платой, работающей в автономном режиме. По последовательному соединению контроллер Arduino будет отправлять нам три числа, соответствующие новому сгенерированному им случайному цвету (red, green, blue). Условимся, что для получения различных цветов приблизительно равной интенсивности значение одного из каналов всегда должно быть равно нулю (то первое, то второе, то третье), сумма двух других — 255. При создании этого автономного проекта используйте заголовокшапочку — . Вытащите на рабочее поле сразу же и блок . Независимо от того, какой именно заголовок имеет программа, блоки расширения AdvancedArduino по-прежнему можно использовать. Поэтому вновь раскройте этот набор команд в дополнение к Orion. Соберите скрипты, ориентируясь на рис. 5.33. Внимание, в блоках много вложений! Если совсем запутаетесь, можете обратиться к уже готовому проекту в электронном архиве, чтобы проверить последовательность сборки. Мы не будем детально разбирать работу скриптов данного проекта. Отметим лишь, что используется блок, задающий скорость обмена данными по последовательному соединению Serial begin 115200, а также переменные и значения различных типов, включая массивы, символы (char) и строки (String). Символ char(32), который можно увидеть в программе, — это обычный пробел, разделяющий при выводе сгенерированные числа. Примечание для любознательных В проекте используется и так называемая статическая переменная. Это локальная переменная, не видимая за пределами подпрограммы (блока, функции), но отличающаяся тем, что сохраняет своё значение между последовательными вызовами подпрограммы. Подробнее с локальными и глобальными переменными мы будем разбираться позже. Вы убедитесь, что локальные переменные не только удобны, но и иногда незаменимы. 200 ГЛАВА 5
Рис. 5.33. Скрипты проекта «Докладчик» Перейдите в Arduino mode (меню Редактировать) и загрузите программу нажатием кнопки Upload to Arduino. Убедитесь, что микроконтроллер выполняет программу в автономном режиме (при наличии электропитания от любого подходящего источника светодиодное кольцо загорается разными цветами). Теперь снова подключите плату к компьютеру USB-кабелем и установите соединение. Обратите внимание, в режиме Arduinio mode в правом нижнем углу программного окна отображается монитор последовательного порта, в котором что-то происходит. Выберите вариант char mode на панели, как на рис. 5.34 (чтобы видеть выводимые значения цветов в привычном формате). Огни раз в секунду меняют цвет, а на панели появляются соответствующие числа. Одно из значений — всегда ноль, сумма двух других равна 255. Новые горизонты. Проекты продвинутого уровня для энтузиастов 201
Например, на рис. 5.34 самая нижняя комбинация — 0 103 152, то есть R = 0, G = 103 и B = 152. 103 + 152 = 255. Если всё работает именно так, поздравляем, задача выполнена! Вычисления происходят в соответствии с замыслом. Рис. 5.34. Область монитора последовательного порта в mBlock (режим Arduino mode, выбран вариант char mode) Не исключено, что кому-то наш программный алгоритм показался слишком сложным. Но можно относиться к предложенной задаче, как к приятной и полезной головоломке, ведь подходящий набор чисел позволяет получить симпатичный цветовой оттенок! Самое главное, что мы хотели освоить в этом проекте, — это инструменты вывода данных с устройства, работающего в автономном режиме, на экран монитора. Следует учесть, что в ряде случаев без этого бывает просто не обойтись. «Бегущие огни» со сменой цвета Модифицируем предыдущий проект так, чтобы огни зажигались не все вместе, а поочерёдно, меняя цвет на новом круге. Выводить информацию по последовательному соединению уже не обязательно, эти блоки можно убрать. Вариант программного алгоритма показан на рис. 5.35. 202 ГЛАВА 5
Рис. 5.35. Скрипты проекта «„Бегущие огни“ со сменой цвета» В данном проекте подразумевается использование кольца с восемью светодиодами, но можно взять любое другое и поправить скрипт. Надеемся, что предложенные программы окажутся лишь отправной точкой для реализации новых, собственных, более интересных! Кто-то будет осваивать сложные вычисления, кто-то — опираться на лаконичные средства для создания интересных визуальных эффектов. Можно найти NeoPixel-кольцу и новые применения, например, в качестве индикатора событий или даже компонента датчика цвета! Главное — подать идею и воплотить её, суметь довести проект до работоспособного состояния. Как сделать, чтобы точка, с которой кольцо начинает загораться, всё время сдвигалась по кругу? Опять поможет операция modulo! Новые горизонты. Проекты продвинутого уровня для энтузиастов 203
Всё чудесатее и чудесатее! 1 Добавление возможностей в интерактивные проекты заменой прошивки Если вы добрались до этих страниц, то наверняка уже обратили внимание на то, что для одних проектов годится автономный режим (Arduino mode), а для других — интерактивный. Например, для создания собственных игр, работающих в среде Scratch/mBlock, необходим интерактивный режим, в котором среда программирования, запущенная на компьютере, и специальная прошивка, работающая на микроконтроллере, общаются с использованием общей системы команд. В большинстве случаев этой базовой системы управляющих команд оказывается достаточно для реализации самых разных проектов. Однако встречаются ситуации, требующие индивидуального подхода и особых инструментов. Ранее мы уже создавали игру, управляемую нажатием на одну кнопку, а также игру с использованием клавиатурной сборки («Космический тир» в дополнительных материалах). К сожалению, подобная клавиатурная сборка не даёт возможности понять, что две кнопки нажаты одновременно. Мы были вынуждены использовать управление с поочерёдным нажатием кнопок. Теперь же мы хотим в среде mBlock создать игру, в которой управление персонажем будет осуществляться сочетанием нажатых кнопок. Если считывать состояние каждой отдельно, на передачу информации будет тратиться чрезмерно много времени, игровой персонаж станет реагировать на наши команды с большой задержкой. Никакого удовольствия от игры получить не удастся. Однако выход есть. Мы можем добавить специальную инструкцию для считывания состояния сразу нескольких пинов (нескольких кнопок). Данные будут передаваться в несколько раз быстрее, в результате наш игровой проект останется таким же динамичным. Но потребуется доработать 1 204 Льюис Кэрролл «Алиса в стране чудес» (перевод Н. М. Демуровой). ГЛАВА 5
(изменить) сразу два компонента — расширение среды mBlock и прошивку платы Arduino. Итак, давайте научимся заменять стандартную прошивку платы Arduino усовершенствованной. Звучит страшновато, но мы справимся! Создать усовершенствованную (модифицированную) прошивку платы Arduino можно самостоятельно, однако для этого потребуется серьёзно разобраться в её работе. Мы предлагаем использовать готовую, которую мы специально модифицировали для нашего будущего проекта (а также для поддержки расширения H-Bridge, позволяющего управлять самыми разными драйверами двигателей). Прошивка — это файл с расширением имени hex, который создаётся посредством Arduino IDE из обычного скетча с расширением ino. Нам нужен файл uno.hex, который можно найти в дополнительных электронных материалах к книге на сайте издательства «БХВ-Петербуг» либо скачать со страницы https://www.lab169.ru/mblock/extensions/h-bridge-ru/ (там же лежат исходные скетчи, позволяющие создать hex-файл самостоятельно, а также увидеть, как именно прошивка была изменена). Необходимо скопировать этот файл в две специальные папки, используемые средой mBlock, заменив оригинальный файл uno.hex (на всякий случай обязательно сохраните себе где-нибудь оригинал). Начнём. Откройте в Проводнике ту папку, в которую установлена программа mBlock. Обычно это C:\Program Files (x86)\mBlock. Перейдите в подпапку tools, а затем в hex. В папке C:\Program Files (x86)\mBlock\tools\hex хранятся все оригиналы прошивок; скопируйте в надёжное место стандартный файл uno.hex (или переименуйте, например, в uno._hex, рис. 5.36), а затем Рис. 5.36. Старый файл uno.hex переименовали (слева внизу), новый добавили (справа) Новые горизонты. Проекты продвинутого уровня для энтузиастов 205
замените его новым. Не забывайте, что обычно для модификации содержимого папки Program Files (x86) требуются права администратора компьютера. Вторую папку найти несколько сложнее. Один из вариантов — в адресной строке Проводника набрать %userprofile%\AppData\Roaming\com. makeblock.Scratch3.4.12\Local Store\mBlock\tools\hex (не забудьте символы процента — %). Вы попадёте сразу в нужную папку. Другой вариант — вначале при помощи программного меню в среде mBlock открыть папку, в которой расположено расширение Advanced Arduino. Для этого в меню Extensions (Расширения) выберите пункт Manage Extensions (Управление расширениями), в окне управления расширениями переключитесь на вкладку Installed, найдите расширение AdvancedArduino и щёлкните на ссылке Посмотреть код (рис. 5.37). Рис. 5.37. Ссылка Посмотреть код Откроется окно Проводника. Далее останется лишь перейти в файловой системе на пару уровней выше и пролистать до нужного места (tools\hex). Замените файл uno.hex и в этой папке на новый. Итак, новая версия файла теперь находится в обеих папках: • C:\Program Files (x86)\mBlock\tools\hex; • %userprofile%\AppData\Roaming\com.makeblock.Scratch3.4.12\Local Store\mBlock\tools\hex. Готово. При выборе в меню Соединить команды Обновить прошивку на плату Arduino будет загружаться прошивка, поддерживающая не только старые, но и дополнительные возможности. И они понадобятся нам в следующем проекте. 206 ГЛАВА 5
Игровой проект «Ловкий динозаврик» с использованием джойстика-шилда Создадим игру, в которой будем управлять персонажем при помощи импровизированной игровой приставки. По игровому пространству будет перемещаться динозаврик, его задача — собирать бонусы (звёздочки) и избегать встречи с недоброжелательными существами, уворачиваясь от них или отпугивая. В зависимости от того, какое сочетание кнопок нажато, герой будет производить то или иное действие. Для данного проекта нам понадобится устройство, состоящее из Arduinoмикроконтроллера с установленной на него платой расширения, похожей на привычный игровой джойстик (рис. 5.38). Рис. 5.38. Плата Arduino с установленным джойстиком-шилдом Это очень простой и доступный вариант игровой приставки на базе Arduino, содержащий шесть отдельных кнопок и миниатюрную двухосевую рукоятку с дополнительной кнопкой. Как видите, возможностей достаточно, хотя, к сожалению, из-за компактных размеров устройства пользоваться не всеми органами управления одинаково удобно. В данном случае мы ориентируемся на распространённую и дешёвую плату расширения. Однако следует помнить, что с помощью микроконтроллеров можно придумывать собственные хитроумные игровые Новые горизонты. Проекты продвинутого уровня для энтузиастов 207
приставки с разным расположением и количеством кнопок, подходящие для разнообразных динамичных игр. Например, даже пульт управления космическим кораблём или подводной лодкой! Кроме того, микроконтроллер Arduino позволяет отслеживать сложные кнопочные комбинации, тогда как с помощью компьютерной клавиатуры в среде Scratch/mBlock получается уверенно определять сочетания лишь из двух-трёх одновременно нажатых клавиш. Знакомимся: джойстик-шилд и новые блоки из AdvancedArduino Джойстик-шилды бывают разных модификаций. На рис. 5.38 изображен вариант JoyStick Shield v1.A. На плате расположены четыре основные (цветные) кнопки в правой части и три дополнительные слева, подпружиненная рукоятка, поворачивающая два потенциометра (одна из кнопок спрятана под «грибком» рукоятки), переключатель питания 3.3V/5V, специальный коннектор для подключения внешнего жидкокристаллического дисплея Nokia 5110 LCD, отдельные коннекторы для установки внешнего радиомодуля на микросхеме nRF24L01, а также для коммуникационного модуля с последовательным соединением (например, модуля Bluetooth или 2,4G). Базовый вариант нашей игры требует наличия лишь четырёх основных кнопок, но уже понятно, что в будущих проектах можно использовать массу новых возможностей! Установите джойстик-шилд на плату Arduino. Это уже знакомая задача, которая не должна вызвать особых проблем. Просто будьте внимательны, следите за совпадением пинов и контактных разъемов, ориентируйтесь по подписям контактов, а перед установкой ещё раз взгляните на рис. 5.38. Запустите среду mBlock и создайте первый скрипт, который позволит понять, каким способом происходит отслеживание состояния нескольких кнопок одновременно. Этот скрипт можно будет использовать в будущем проекте в качестве готового шаблона. Спрайт Панды не понадобится, удалите его. Теперь в нашем проекте остаётся лишь сцена, вытащите на её рабочее пространство нужные блоки. Блок находится в расширении AdvancedArduino. Создайте переменную данные, соберите всё в соответствии с рис. 5.39. 208 ГЛАВА 5
Обратите внимание на надпись «ПРОВЕРЬТЕ СОЕДИНЕНИЕ!» в блоке . Переменные в интерактивных проектах Scratch/ mBlock могут хранить любые значения, как числа, так и текст. При запуске будет осуществляться поверка, и мы увидим это напоминание в поле, отображающем значение переменной, если забудем установить соединение с платой Arduino. Рис. 5.39. Проверяем соединение и считываем данные с нескольких портов одновременно Давайте проверим настройки mBlock. Откройте меню Boards, выберите плату Arduino Uno, убедитесь, что AdvancedArduino в меню Extensions отмечено. Подключите микроконтроллер Arduino со смонтированным сверху джойстиком-шилдом, установите соединение и обновите прошивку. Не забывайте, что блок будет работать лишь с модифицированной версией uno.hex. Запустите программу. Если ни одна из кнопок джойстика не нажата, переменная данные должна отобразить значение 15. Попробуйте нажимать на основные кнопки джойстика по отдельности и в разных сочетаниях. Вы увидите, что значение переменной меняется. Пояснение Параметр mask, имеющий значение 15, обеспечивает чтение состояния четырёх пинов подряд. Благодаря блоку мы получим значение, зависящее от состояния пинов D2, D3, D4, D5. Максимальное количество пинов, которое можно прочесть, — восемь, для этого надо использовать маску 255. Новые горизонты. Проекты продвинутого уровня для энтузиастов 209
Отслеживаем состояние сразу четырёх кнопок Теперь давайте добьёмся того, чтобы видеть состояние каждого из четырёх пинов отдельно. Создайте четыре переменные с именами Единичка, Двойка, Четвёрка и Восьмёрка. Откуда взялись такие названия, скоро станет понятно. Нам придётся доработать скрипт, но много времени это не займёт (рис. 5.40). Как видите, скрипт содержит похожие повторяющиеся операции. Используйте дублирование и каждый раз немножко модифицируйте копию. Рис. 5.40. Четыре кнопки — четыре переменные Проверьте, что выставлены галочки, отображающие значения переменных на сцене. Разместите сами переменные, как на рис. 5.41. Рис. 5.41. Отслеживаем состояние четырёх кнопок (пинов) в удобной форме 210 ГЛАВА 5
Запустите программу и проверьте её работу, нажимая кнопки. Ура, у нас есть четыре отдельных значения, которые показывают, нажата ли та или иная кнопка! Теперь и сами кнопки для определённости мы можем называть теми же самыми именами — Единичка, Двойка, Четвёрка и Восьмёрка. Шаблон для реализации задуманного нами игрового проекта готов. И кстати, на базе этого шаблона можно будет создавать самые разные игры! Однако, прежде чем приступить к созданию и программированию игровых персонажей, хочется понять, в чём смысл тех вычислений, которые выполняет наш скрипт. «Великий Вычислитель» Скорее всего, многие уже догадались, что речь идёт о двоичной системе исчисления. Ведь в двоичном формате запись 0001 означает единичку, 0010 — двойку, 0100 — четвёрку, а 1000 — восьмёрку. Несложно заметить, что каждое следующее число больше предыдущего в 2 раза. Мы не будем подробно рассказывать о двоичной системе, на эту тему есть много информации, которую несложно найти. Давайте лучше реализуем вспомогательный проект, поработав с которым нам всё и без объяснений станет понятно. Назовём этот проект «Великий Вычислитель». Игровой персонаж — спрайт Laptop, он будет проводить обратные вычисления, то есть из единичек и нулей (из так называемых битов) создавать снова десятичное число, а также называть компоненты, из которых это число состоит. Скрипт сцены трогать не будем, он готов. Добавьте в проект спрайт Laptop из библиотеки спрайтов (рис. 5.42). Рис. 5.42. Добавляем в проект спрайт Laptop Новые горизонты. Проекты продвинутого уровня для энтузиастов 211
Понадобятся две новые переменные: биты и исходные_данные (в имени переменной используйте не пробел, а символ подчёркивания). Создайте их, выбрав опцию Только для этого спрайта, пусть они будут локальными (рис. 5.43). Рис. 5.43. Создаем локальные переменные Соберите скрипт спрайта Laptop (рис. 5.44). Переменная биты будет использоваться нами для хранения строки с названиями компонентов числа. Рис. 5.44. Создаем локальные переменные 212 ГЛАВА 5
Собрав скрипт, разместите переменные на сцене так, как на рис. 5.45. Рис. 5.45. Сцена проекта «Великий Вычислитель» Можно запускать программу. Поиграйте — нажимая кнопки в разных сочетаниях, добейтесь того, чтобы получить все числа от 0 до 15. Как видите, если сложить компоненты, отображаемые в поле биты, получается десятичное число исходные_данные. А сверху отображено то же число в двоичном формате. Теперь мы готовы двигаться дальше и начать создавать игру про динозаврика. При желании сохраните эту версию проекта и переименуйте. В игре спрайт Laptop нам не понадобится, удалите его. Обратите внимание, что вместе со спрайтом удалились и локальные переменные биты и исходные_данные, они нам теперь тоже не нужны. Редактируем костюмы игрового персонажа Пришло время заняться игровым персонажем — динозавриком. Давайте назовём его Дино. Мы добавим соответствующий спрайт, отредактируем костюмы и добьёмся того, чтобы Дино послушно исполнял наши команды: делал гимнастическое колесо налево или направо, нижней лапой отпугивал мелких ползающих монстриков, а грозными зубами — летающих. Заготовка нашего проекта уже содержит скрипты сцены. Нужно лишь снять галочки с имён переменных, чтобы они не отображались на экране. Мы уже убедились в том, что эта часть программы корректно работает. Откройте библиотеку спрайтов, добавьте спрайт Dinosaur1 (рис. 5.46) и переименуйте его в Дино. Новые горизонты. Проекты продвинутого уровня для энтузиастов 213
Рис. 5.46. Спрайт Dinosaur1 Теперь будем готовить костюмы. Рисовать их нам не понадобится, у Дино уже есть семь собственных, нужно будет их лишь чуть видоизменить — повернуть при по. У некоторых костюмов мощи инструмента Выбор мы ещё поменяем расположение центральной точки. Дополнительный восьмой получается дублированием ). Заи переворотом (инструмент Флип вверх-вниз одно дадим костюмам новые понятные имена вместо прежних (рис. 5.47). Приступим. Вот что нужно сделать: • костюм «dinosaur1-a» переименовать в «удивлённый» и повернуть; • костюм «dinosaur1-b» переименовать в «смелый»; • костюм «dinosaur1-c» переименовать в «ловкий» и повернуть; • костюм «dinosaur1-d» переименовать в «бойкий» и повернуть; • костюм «dinosaur1-e» переименовать в «весёлый»; • костюм «dinosaur1-f» переименовать в «расслабленный», поверсменуть, а затем с помощью инструмента Установите костюм нить расположение центральной точки (на рисунке помечена перекрестьем); • костюм «dinosaur1-g» переименовать в «испуганный» и повернуть; • костюм «ловкий» продублировать, появится его копия с названием «ловкий2». Затем модифицировать эту копию, перевернув при по. Поменять расположение мощи инструмента Флип вверх-вниз центральной точки, чтобы было как у костюма «ловкий». Набор костюмов готов. Теперь создадим необходимые переменные. Все они будут использоваться и в других спрайтах нашего проекта, поэтому должны быть глобальными. Вот список их названий: ВРЕМЯ, СЧЁТ, айяйяй, напр_Дино, полож_Дино, сост_Дино, смещ_дор. Снимите галочки со всех переменных, кроме двух: ВРЕМЯ и СЧЁТ. Пусть и то и другое отображается на сцене сверху; разместите поудобнее, как считаете нужным. 214 ГЛАВА 5
удивлённый смелый ловкий бойкий весёлый расслабленный испуганный ловкий2 Рис. 5.47. Костюмы спрайта Дино Новые горизонты. Проекты продвинутого уровня для энтузиастов 215
Наконец-то можно обучить нашего героя всем трюкам. Убедившись, что выбран именно спрайт Дино, соберите необходимый набор скриптов , (рис. 5.48). Проще всего будет начать с создания заголовков блоков , , , , . В блоке необходимо указать, что используется параметр текстового типа (Добавить строковый ввод). Рис. 5.48. Набор скриптов проекта Дино 216 ГЛАВА 5
Обратите внимание, что блок принимает в качестве параметра названия костюмов в виде текста, и эти названия следует набирать точно, без ошибок. После создания скриптов можно проверить их работу, запустив программу. При нажатии кнопки влево или вправо («восьмёрки» или «двойки» на джойстике) Дино должен перекатываться колесом в соответствующую сторону, а если дополнительно нажать вверх или вниз («единичку» или «четвёрку»), блокировать атаку когтистой лапой или грозным рыком. Добавляем перемещающийся фон и противников Итак, управление работает, вот только ни бонусов, ни противников нет, и Дино у нас стоит на месте, никуда не двигается. Для того чтобы получилась полноценная игра, нужно добавить в проект ещё несколько спрайтов. Начнём мы с дороги — перемещаться влево или вправо будет она, а герой будет оставаться посередине. Щёлкните мышкой по кнопке Закрасить новый спрайт и нарисуйте костюм — эллипс (овал) произвольного размера, залитый тёмно-серой краской и расположенный примерно по центру поля редактирования. Затем при помощи инструмента Выбор измените размер фигуры так, чтобы он стал равен 160 точкам по горизонтали и 80 по вертикали (отслеживать размер можно в окошке костюма, рис. 5.49). Переместите центр Рис. 5.49. Новый спрайта по возможности поближе к середине фигуры. Переименуйте этот спрайт, дайте ему название «доро- спрайт «дорога» га». Пока что у нас в наличии один-единственный «булыжник», но если его клонировать несколько раз, действительно получится мостовая. Давайте соберём скрипты, которые будут этим заниматься (рис. 5.50). Только вначале потребуется создать дополнительную переменную с именем _номер, необходимую для работы спрайта «дорога». Обратите внимание, переменная обязательно должна быть локальной! Ещё одно маленькое замечание: порядок выполнения операций имеет значение. В данном случае нужно вначале собирать блоки и , а потом вставлять их внутрь блоков сложения/вычитания. Новые горизонты. Проекты продвинутого уровня для энтузиастов 217
Рис. 5.50. Скрипты для спрайта «дорога» Мы используем начальный символ подчёркивания в имени переменной, чтобы не забыть о том, что она локальная. Давайте условимся и остальные переменные данного проекта именовать сходным образом, это удобно. Когда новый клон спрайта «дорога» будет создан, он получит собственный экземпляр переменной _номер. Таким образом, все булыжники смогут вести себя по-разному и располагаться в разных местах. Спрайт «дорога» у нас будет выполнять ещё одну дополнительную функцию — отсчитывать и ограничивать время игры. Для этого предусмотрен отдельный скрипт. Проверьте, как работает наш проект сейчас. Стало интереснее! Теперь нужно добавить игровые бонусы и противников. Выберите жёлтую звёздочку Star1 в библиотеке спрайтов, дайте новое имя — бонус. Создайте локальную переменную _положение и соберите набор скриптов (рис. 5.51). 218 ГЛАВА 5
Рис. 5.51. Скрипты для спрайта «бонус» Добавьте из библиотеки спрайтов сердитую букашку Ladybug2, переименуйте в Бука. Создайте локальные переменные _положение и _скорость. Обратите внимание, в нашем проекте уже существует другая переменная (в другом спрайте) с именем _положение, но поскольку обе переменные локальные, всё будет работать правильно, никаких ошибок не возникнет. Соберите скрипты для Буки по рис. 5.52. Осталось найти в библиотеке и добавить в проект очень серьёзную летучую мышь Bat1. Дайте ей имя Мышь. Создайте локальные переменные _положение и _скорость. Обратите внимание, скрипты этой летуньи очень похожи на скрипты Буки (рис. 5.53). Можно облегчить себе работу и использовать хитрость — скопировать их, а затем подправить. Ухватите мышью (компьютерной!) за заголовок нужный скрипт и «бросьте» на значок спрайта Мышь (ужасная путаница, но что поделаешь!). На первый взгляд ничего не произойдёт, изображение скрипта вернётся назад. Но копия всё-таки появилась, в этом можно убедиться, щёлкнув по спрайту Мышь. Скопируйте два скрипта и создайте ещё один, обеспечивающий анимацию движений Мыши. Внимательно проверьте, что исправлено и добавлено всё необходимое. Учтите, что при таком копировании иногда Новые горизонты. Проекты продвинутого уровня для энтузиастов 219
возникают странности, например, меняется знак операции (в результате вместо сложения производится вычитание). Для надёжности приходится удалять блоки суммы/разности и вытаскивать их на рабочее поле заново. Рис. 5.52. Скрипты для спрайта Бука Что же, пора проверить работу программы, запустите её. Попробуйте поиграть и не расстраивайтесь, если не сумеете с первого раза набрать больше пяти очков. Сложно, но интересно! Проект готов. Хотя если подумать, готов ли? Не забывайте, что это всего лишь заготовка, шаблон, который можно усложнять, видоизменять и дополнять по собственному выбору как угодно! Научите Дино перепрыгивать через сердитую Буку? 220 ГЛАВА 5
Рис. 5.53. Скрипты для спрайта Мышь Вот и подошла к концу глава 5. Очень надеемся, что вам понравились продвинутые проекты и новые умения, которые вы приобрели. Мы узнали, что... • Существует множество дополнений — расширений для программы mBlock, позволяющих реализовывать разнообразные проекты в блочной среде программирования. • Существуют разные режимы управления режимами работы портов микроконтроллера Arduino, и с помощью команд расширения AdvancedArduino этими режимами можно управлять. • Есть очень много электронных компонентов и плат расширения, которые можно подключать к Arduino для создания проектов. Новые горизонты. Проекты продвинутого уровня для энтузиастов 221
Научились... • Устанавливать расширения для среды mBlock (на примере Advanced Arduino Extension). • Подключать и использовать в проектах модули с RGB-светодиодом и модули на базе нескольких светодиодов WS2812B. • Использовать сервомотор. • Менять прошивку контроллера Arduino. • Использовать локальные и глобальные переменные. А также получили множество полезных навыков в области программирования, что обязательно окажется полезным при реализации ваших будущих игровых (и не только) проектов! 222 ГЛАВА 5
Заключение Вот и подошло к концу наше первое путешествие в мир технических самоделок. Вы научились программировать в средах Scratch и mBlock, использовать микроконтроллеры и датчики для создания оригинальных электронных устройств, почувствовали себя в роли отладчика и те́стера компьютерных программ. Надеемся, вам понравилось! И впереди вас ждёт выбор пути, которым будет интереснее двигаться дальше. Вас увлекли дизайн и разработка компьютерных игр? Продолжайте экспериментировать, придумывать и создавать новые игровые программы, рисуйте забавные иллюстрации, костюмы для персонажей, придумывайте сценарии поведения, осваивайте профессиональные среды разработки. Вам понравилось создавать новые электронные устройства и программировать их по своему усмотрению? Перед вами распахнуты двери огромного мира электроники, в котором можно выбрать массу возможностей для творчества! Создание движущихся роботов, в том числе летающих и плавающих, разработка станков с программным управлением, новых «умных вещей» — лишь часть выбора. Но главное, чем бы вы ни занялись в дальнейшем, — творите, создавайте новое, заглядывайте за горизонты приобретённых знаний. Ведь только так создаётся будущее! ЗАКЛЮЧЕНИЕ 223
Полезные книги 1. Голиков Д. Scratch для юных программистов. — СПб.: БХВ-Петербург, 2017. 2. Голиков Д. 40 проектов на Scratch для юных программистов. — СПб.: БХВПетербург, 2018. 3. Платт Ч. Энциклопедия электронных компонентов. Том 1. Резисторы, конденсаторы, катушки индуктивности, переключатели, преобразователи, реле, транзисторы. — СПб.: БХВ-Петербург, 2017. 4. Платт Ч. Энциклопедия электронных компонентов. Том 2. Тиристоры, аналоговые и цифровые микросхемы, светодиоды, ЖК-дисплеи, аудиокомпоненты. — СПб.: БХВ-Петербург, 2017. 5. Платт Ч., Янссон Ф. Энциклопедия электронных компонентов. Том 3. Датчики местоположения, присутствия, ориентации, вибрации, жидкости, газа, света, тепла, звука и электричества. — СПб.: БХВ-Петербург, 2017. 6. Платт Ч. Электроника для начинающих. — 2-е изд. — СПб.: БХВ-Петербург, 2017. 224 ПОЛЕЗНЫЕ КНИГИ
Приложение. Содержание электронного архива Электронный архив можно скачать по ссылке https://zip.bhv.ru/ 9785977509527.zip или найти на странице книги на сайте издательства по адресу www.bhv.ru. Архив содержит распределённые по главам 1–4 файлы всех проектов, описанных в книге, и дополнительные материалы. В каталоге Глава 2\Дополнительно даны два проекта интерактивных компьютерных игр: Dog Basketball (Собачка с мячом. Используем потенциометр) и SpaceShips (Космический тир. Используем кнопочную сборку). Фрагмент проекта «Собачка с мячом». Используем потенциометр. Программируем вращение баскетбольного мяча Давайте придумаем игру, в которой будем плавно менять скорость движения персонажа с помощью ползунка (слайдера — от английского слова slider) пропорционального потенциометра. В реальной жизни нам часто приходится регулировать какие-либо параметры, например, громкость звука в колонках. И, как правило, проще всего решить подобную задачу именно с помощью потенциометра. Сюжет новой игры будет несложен. Весёлая собачка бегает влево-вправо, играет с мячом, подбрасывая его носом, мяч подлетает, вращается в воздухе и отскакивает от стен, потолка и пола (границы сцены). Внимание! Дальнейшее описание проекта можно найти в электронном архиве. СОДЕРЖАНИЕ ЭЛЕКТРОННОГО АРХИВА 225
Приступим к основной части проекта — программированию спрайта баскетбольного мяча (Basketball). Добавьте его из библиотеки спрайтов и убедитесь, что точка центра находится там, где положено, в центре мяча. Мяч в игре будет вращаться. Двигать мы его будем с помощью команд изменения координат. За перемещение по горизонтали отвечает команда , по вертикали — . Нам понадобятся следующие переменные: • ВС_мяча — вертикальная скорость мяча; • ГС_мяча — горизонтальная скорость мяча; • вращ_мяча — скорость вращения мяча. Создайте эти три переменные. Они могут быть локальными, нам не придётся их использовать нигде за пределами спрайта Basketball. Отображение значений лучше отключить, сняв соответствующие галочки. Далее соберите из блоков первый вариант скрипта (рис. П1), задачами которого будут: • установка начального положения и размера спрайта; • инициализация трёх переменных случайными значениями при старте программы; • повторяющееся в цикле перемещение по горизонтали и вертикали, а также поворот мяча в соответствии со значениями переменных; • повторяющееся в цикле изменение вертикальной скорости (при движении вверх мяч будет двигаться всё медленнее и медленнее, при движении вниз — всё быстрее и быстрее). Подходящие значения для всех параметров таковы: начальная вертикальная скорость от 3 до 7, начальная горизонтальная скорость от –9 до 9, начальная скорость вращения мяча от –20 до 20, изменение вертикальной скорости –0.3 (можете поэкспериментировать и использовать другие значения). Проверьте, что получилось, запуская программу снова и снова. Мяч летит очень правдоподобно, но при достижении края сцены застревает там. Теперь добавим четыре блока проверки для определения, не коснулся ли мяч верхнего, нижнего или бокового края сцены, и для соответствующей 226 ПРИЛОЖЕНИЕ
Рис. П1. Скрипт спрайта Basketball. Версия 1 смены вертикальной или горизонтальной скорости. Это будет моделировать отскок от пола, потолка или стен. Когда мяч отскакивает, его скорость слегка уменьшается. Будем использовать коэффициент 0.9 или –0.9 в зависимости от направления движения. Нам очень пригодится встроенная функция abs (абсолютное значение). Она совершает простую операцию — убирает знак, то есть всегда возвращает положительное значение числа или выражения (если указать в качестве параметра функции плюс пять, получим плюс пять, а если минус три, получим плюс три). Все встроенные функции «прячутся» в блоке (рис. П2). Рис. П2. Встроенные функции СОДЕРЖАНИЕ ЭЛЕКТРОННОГО АРХИВА 227
Рис. П3. Полный набор скриптов спрайта Dog1 228 ПРИЛОЖЕНИЕ
Добавим спрайту мяча дополнительный скрипт, обрабатывающий ситуацию касания носа собачки. Задача такова: проверять, не касается ли мяч лилового цвета (выбирать цвет, указывая на объект, в данном случае — на нос собачки, вы уже умеете). Если же касание произошло, нужно присвоить новые значения переменным (вертикальная скорость, горизонтальная скорость, скорость вращения) и чуть подождать (0.3 секунды), позволив мячу отлететь подальше. Догадываетесь, почему мы используем отдельный цикл? Правильно, потому что он будет прокручиваться в собственном темпе (периодически будет возникать пауза длительностью 0.3 секунды). Всё, игра готова (рис. П3 и П4), можно приглашать друзей! Осталось навести лоск — добавить фоновую картинку и звуки событий. Попробуйте это сделать сами. Только помните, что на сцене не должно быть объектов, имеющих тот же цвет, что и нос собачки, поскольку мяч будет отскакивать и от них. Приятной игры! Рис. П4. Экран игры «Собачка с мячом» СОДЕРЖАНИЕ ЭЛЕКТРОННОГО АРХИВА 229