Вы находитесь на странице: 1из 67

ɧɚ Arduino

Электронный
домашний
питомец
А. А. Салахова

КОНСТРУИРУЕМ
РОБОТОВ
на Arduino®
Arduino
Электронный
домашний
питомец
Электронное
издание

Лаборатория знаний
Москва
2018
УДК 373.167
ББК 32.97
С16

С е р и я о с н о в а н а в 2016 г.
Ведущие редакторы серии Т. Г. Хохлова, Ю. А. Серова
Салахова А. А.
С16 Конструируем роботов на Arduino○ . Электронный доң
R

машний питомец [Электронный ресурс] / А. А. Салахова. Ҹ


Эл. изд. Ҹ Электрон. текстовые дан. (1 файл pdf : 68 с.). Ҹ
М. : Лаборатория знаний, 2018. Ҹ (РОБОФИШКИ). Ҹ
Систем. требования: Adobe Reader XI ; экран 10".
ISBN 978ң5ң00101ң607ң6
Стать гениальным изобретателем легко! Серия книг «РОБОң
ФИШКИ» поможет вам создавать роботов, учиться и играть
вместе с ними.
Вы соберёте на платформе Arduino и запрограммируете
настоящего электронного питомца, с которым можно играть
в разные игры, кормить, когда он проголодается, лечить, если
он заболеет, купать, словом, ухаживать за ним, как и за живым
котёнком или щенком.
Для технического творчества в школе и дома, а также
на занятиях в робототехнических кружках.
УДК 373.167
ББК 32.97

Деривативное электронное издание на основе печатного аналога:


Конструируем роботов на Arduino○R . Электронный домашний
питомец / А. А. Салахова. Ҹ М. : Лаборатория знаний, 2018. Ҹ
64 с. : ил. Ҹ (РОБОФИШКИ). Ҹ ISBN 978ң5ң00101ң157ң6.

В соответствии со ст. 1299 и 1301 ГК РФ при устранении ограничений, установленных


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

ISBN 978ң5ң00101ң607ң6 c Лаборатория знаний, 2018



Здравствуйте!

Издание, которое вы держите сейчас в руках, — это не просто описание


и практическое руководство по выполнению конкретного увлекательно-
го проекта по робототехнике. И то, что в результате вы самостоятель-
но сумеете собрать своими руками настоящее работающее устройство,
конечно, победа и успех!
Но главное — вы поймёте, что такие ценные качества характера,
как терпение, аккуратность, настойчивость и творческая мысль, прояв-
ленные при работе над проектом, останутся с вами навсегда, помогут
уверенно создавать своё будущее, стать реально успешным человеком,
независимо от того, с какой профессией свяжете жизнь.
Создавать будущее — сложная и ответственная задача. Каждый день
становится открытием, если он приносит новые знания, которые затем
могут быть превращены в проекты. Особенно это важно для тех, кто
выбрал дорогу инженера и технического специалиста. Знания — это
база, которая становится основой для свершений.
Однако технический прогресс зависит не только от знаний, но и от
смелости создавать новое. Всё, что нас окружает сегодня, придумано
инженерами. Их любопытство, желание узнавать неизведанное и кон-
струировать то, чего никто до них не делал, и создаёт окружающий
мир. Именно от таких людей зависит, каким будет наш завтрашний
день. Только идеи, основанные на творческом подходе, прочных знани-
ях и постоянном стремлении к новаторству, заставляют мир двигаться
вперёд.
И сегодня, выполнив этот проект и перейдя к следующим, вы сде-
лаете очередной шаг по этой дороге.

Успехов вам!

Команда Программы «Робототехника:


инженерно-технические кадры инновационной России»
Фонда Олега Дерипаска «Вольное Дело»

3
Дорогой друг!

Если ты добрался до платформы Arduino, значит, тебе действительно


быть инженером! Ты прошёл большой путь в робототехнике и решил
перейти на новый уровень — создавать роботов на Arduino! Теперь всё
будет совершенно серьёзно! Тайны настоящего роботоконструирования
ждут именно тебя!
У тебя проблема — родители не разрешают завести дружелюбного
щенка или пушистого тёплого котёнка? Они говорят, что питомец —
это большая ответственность, что на его шерсть может быть аллергия
у твоей младшей сестрёнки, что тебе трудно будет уделять питомцу
достаточно внимания? Докажи им, что тебе всё по плечу! Отбрось ар-
гумент про шерсть — на электронного питомца не бывает аллергии!
Всего за пару часов ты соберёшь на платформе Arduino и запрограмми-
руешь настоящего электронного питомца, испытывающего голод, спо-
собного заболеть, скучающего или, наоборот, довольного и здорового.
Если тебя продолжат уверять, что модель животного требует намно-
го меньше внимания, ведь ей не страшен холод или жара, неважно, до-
статочно ли света и тому подобное, ты сможешь разубедить спорщиков.
«Электронный» не значит «виртуальный». В отличие от распростра-
нённых японских игрушек на состояние твоего подопечного, благодаря
электронным датчикам, будут оказывать влияние условия окружающего
мира! Например, тебе придётся следить, чтобы забытое открытое окно
не навредило твоему электронному другу. А в качестве приятного бо-
нуса ты узнаешь много нового о японской культуре и даже выучишь
несколько японских слов и выражений.
Интересно? Тогда вперёд!

4
Электронные
и виртуальные питомцы

Япония по праву считается одной из передовых стран в области высо-


ких технологий. Электронные устройства прочно вошли во все сферы
жизни японцев. Если современного европейца не удивить робопылесо-
сом или умной кофеваркой, то для жителей Страны восходящего солн-
ца привычно иметь в доме электронного (в виде отдельного устройства
с датчиками) или виртуального (в виде программы) питомца.
Появление таких необычных «братьев меньших» объясняется тремя
причинами: теснотой японских жилищ, нехваткой времени и желанием
улучшить настроение и снизить уровень стресса. В Японии практически
не держат дома собак, а самый популярный живой питомец — это кро-
хотная птичка под названием японская амадина (рис. 1). Амадины от-
личаются неприхотливостью и встречаются только в неволе. В отличие
от своих родственников (зебровых амадин или амадин Гульда), которые
в последние годы стали популярны в России, эти крохи не требу-
ют специального ухода, хорошо уживаются и не дерутся между собой.
В своем желании иметь дома антистресс японцы пошли ещё дальше —
они придумали искусственных питомцев! Теперь, если хозяин почему-то
сильно задержится, от этого не будет зависеть чья-то жизнь!
Электронные питомцы-роботы исполняют заложенную в них про-
грамму и требуют реального взаимодействия (погладить, накормить,
кинуть палочку и так далее). Один из них — ро-
бот-пёс Aibo (рис. 2), выпущенный компанией Sony
в 1999 году. Его название переводится как «друг,
приятель». а также может быть сокращением ан-
глоязычного Artificial Intelligence RoBOt — робот
с искусственным интеллектом.
Электронный пёс умеет ходить, распознавать
предметы, команды хозяина и лица людей. Осу-
ществляется это путём обработки информации от
встроенных датчиков: видеокамеры, микрофона, ин-
фракрасного датчика расстояния. В последней мо-
дели добавлен беспроводный доступ в Интернет.
Собака изображает шесть эмоций в зависимости от
ситуации, например «обижается», если на неё гром- Рис. 1. Японская амадина

5
Рис. 2. Кибернетическая собака Рис. 3. Тамагочи ID (изображение взято
Aibo с сайта производителя)

ко кричат. Кроме того, Aibo может развиваться, запоминая привычки


хозяина. Способности робота становятся доступными постепенно и со-
вершенствуются день ото дня, если у питомца включён режим «щен-
ка», либо открыты сразу — для режима «взрослого» пса.
У игрушки предусмотрены 20 степеней свободы, делающих её пове-
дение разнообразным. Если этих функций недостаточно, хозяину доста-
точно дописать редактируемую программу. Благодаря этой особенности
робопсы были постоянными участниками различных робототехнических
фестивалей и соревнований. Однако, как признались создатели Aibo,
основной их целью был не выпуск игрушки, а отработка программ-
ного обеспечения и алгоритмов искусственного интеллекта. Программа
по изображению эмоций и регулированию поведения в зависимости
от социального окружения (людей, других роботов и так далее) была
настолько хороша, что с помощью Aibo изучали поведение настоящих
собак и взаимодействие с ними. В 2006 году, когда эксперименты за-
кончились и цель проекта была достигнута, производство закрыли.
Игрушка тамагочи, выпущенная в 1996 году, является виртуальным
питомцем, так как не имеет датчиков (рис. 3). Это название быстро
стало нарицательным для всех виртуальных питомцев. Игра заключа-
лась в уходе за питомцем от момента его вылупления из яйца до самой
смерти от старости при хороших навыках игрока.
Виртуальные питомцы были так популярны, что для них даже ор-
ганизовали «детские сады»! Занятые взрослые и школьники отдавали
своих тамагочи специальному человеку, чтобы он кормил и присматри-
вал за питомцами. Плохой уход и отсутствие внимания влияли на ха-
рактер тамагочи — делали его злым на взрослом уровне.

6
Мы объединим оба вида электронных питомцев в одном! Ты скон-
струируешь устройство, реагирующее на изменения условий внешнего
мира, внутри которого будет жить виртуальный питомец. Он будет об-
ладать следующими реакциями:

Причина Реакция
Взаимодействие с окружающим миром и реакция питомца
Простуда или перегрев. Ухудшение
Температура (ниже или выше нормы)
здоровья
Низкая освещённость Засыпание в темноте
Ухудшение настроения в шумной об-
Шум
становке
Виртуальные функции и реакции
Недостаточное кормление Голод
Недостаток внимания или порицание Ухудшение настроения
Недостаток здоровья Смерть питомца

Каждую потребность надо будет удовлетворять путём изменения ус-


ловий окружающей обстановки или виртуального кормления, прививки
или игры.
Эмоции твоего электронного питомца будут отображаться символьны-
ми мордочками на основе каомодзи («као» — лицо, «модзи» — знак) —
японских смайликов. Когда появились первые программы для обмена
текстовыми сообщениями через Интернет, японцы решили, что европей-
ских смайликов недостаточно для точного выражения эмоций.
Дело в том, что в Европе эмоции изображаются в основном раз-
личными формами рта, а в Стране восходящего солнца особое вни-
мание уделяется взгляду. Каомодзи состоят из иероглифов и симво-
лов двухбайтовых и более кодировок. К сожалению, знаковые дисплеи
и Arduino поддерживают лишь однобайтовую кодировку ASCII. Однако
ты можешь самостоятельно составить символьные рисунки, похожие на
каомодзи, из набора известных и часто используемых тобой символов.
Множество японских смайликов можно найти на специальном русско-
язычном сайте: http://kaomoji.ru/
Ты пройдёшь путь японских и других мировых компаний — изгото-
вителей электронных питомцев. Тебя ждёт увлекательный и творческий
процесс создания питомца с уникальным характером. Ты готов сделать
питомца собственными руками?
Если да, то вперёд!

7
Оборудование: °
• Компьютер (минимальные требования): • Несколько старых газет.
Windows XP, Windows Vista, Windows 7, • Миска или тарелка, в которую могут
Windows 8, Windows 8.1, Windows 10 поместиться экран МЭЛТ и UNO.
(32/64 bit)/Linux Mint, Ubuntu, Fedora/ • Пищевая плёнка.
Mac OS X; оперативная память не менее • Кисточка.
512 Мб, процессор — 1,1 ГГц (или бы- • Карандаш.
стрее); свободное место на диске — • Линейка.
200 Мб. • Блюдце или тарелка для размешивания
• Среда программирования Arduino IDE. массы папье-маше.
• Плата Arduino UNO. • Гуашь или другие краски.
• Плата расширения Troyka Shield. • Ножницы или канцелярский нож.
• Макетная плата BreadBoard Mini (170 • Пинцет.
точек).
• Текстовый экран МЭЛТ 20 u 4.
• Аналоговый термометр (Troyka Module).
• Датчик освещённости (Troyka Module).
• ИК-приёмник (Troyka Module). Обозначения
• ИК-пульт.
• Аналоговый датчик уровня шума с тре- 1. Скетч — программа или под-
мя контактами или датчик уровня шума программа, которую обрабатывает
с четырьмя контактами (любой Arduino- Arduino.
совместимый). 2. Скетчбук — проект Arduino, со-
• Соединительные провода с двумя кон- держащий один или несколько скет-
цами типа «штекер», 5 шт. (2 чёрных, чей (подпрограмм).
2 красных, 1 оранжевый). 3. 5 V (5 вольт) — обозначение на-
• Соединительные провода с концами пряжения питания платы.
типа «штекер и гнездо», 12 шт. (6 крас- 4. 3,3 V (3,3 вольта) — обозначение
ных и 6 зелёных). альтернативного напряжения платы
• Соединительные тройные провода (по конкретным выходам).
(шлейфы) с двумя концами типа «гнез- 5. GND (от англ. «ground» — зем-
до» (входят в комплект датчиков осве- ля) — заземление электрических эле-
щённости Troyka Module), 3 шт. ментов.
• Кабель USB (A-B) для подключения 6. // — обозначение в программе
Arduino к компьютеру. однострочных комментариев, в кото-
• Импульсный блок питания для мо- рых приводится пояснительная ин-
бильных устройств (2 A) или внешний формация.
аккумулятор типа PowerBank (необяза- 7. /* текст */ — обозначение в про-
тельно). грамме комментариев из нескольких
°
• Клей ПВА. строк.

8
Arduino — платформа с открытой аппаратной архитектурой. Это зна-
чит, что подробное описание самой платы, её компонентов, а также все
электрические схемы, то есть спецификация, находятся в свободном до-
ступе. Спецификация позволяет любому производителю создать копию
продуктов для платформы, тем самым делая их доступными большему
количеству людей, а также создавать улучшенные, более эффективные
версии плат и модулей или новые совместимые устройства.
Для своего проекта ты можешь использовать модули, аналогичные
указанным в списке, но других производителей.

9
Этап 1. Общий план
действий

Прежде чем твой питомец начнёт радовать тебя и твоих близких, тебе
придётся хорошо поработать — выполнить несколько этапов сборки и
программирования. Пусть это будет электронный питомец в виде за-
бавного котёнка с кличкой Томодачи (что значит по-японски «друг»).
Детали его внешности ты можешь изменить самостоятельно в процессе
создания.
Сейчас мы кратко расскажем тебе о пути, который ты должен прой-
ти, чтобы куча компонентов, перечисленных под заголовком «Оборудо-
вание», превратилась в электронного друга.
Во-первых, необходимо собрать электронную составляющую. Для
начала тебе нужно подготовить основу устройства, к которой будут
подключаться все остальные компоненты. Она состоит из трёх плат:
платы Arduino UNO, платы расширения Troyka Shield с дополнитель-
ными портами и макетной платы. К готовой основе ты подключишь
датчик освещённости и аналоговый термометр, выполненные в удобном
формате Troyka Module. Благодаря этим датчикам питомец будет знать,
не пора ли ему ложиться спать и достаточно ли тепло в комнате. Затем
ты подключишь к плате Arduino UNO ещё один полезный датчик —
приёмник инфракрасного сигнала. Через него ты будешь управлять
своим питомцем с помощью ИК-пульта. Не помешает и датчик уровня
шума, чтобы питомец мог слышать. Завершится сборка электронной ча-
сти устройства подключением текстового экрана. А чтобы проверить,
правильно ли ты выполнил сборку и исправны ли компоненты, потре-
буется установить программное обеспечение, а также подготовить и за-
пустить тестовую программу.
Рассмотри общую схему будущего устройства (рис. 4). Попробуй до-
гадаться, для чего используется каждый компонент?
Как ты думаешь, какую плату не видно на схеме?
Попробуй мысленно представить поэтапное подключение устройства.
Теперь начинай его собирать. Для этого внимательно рассмотри ри-
сунки следующих этапов и прочитай подписи к ним. В случае затруд-
нений обращайся за помощью к взрослым.

10
Рис. 4. Общая схема устройства

Во-вторых, твоей киске потребуется корпус — это будет его тело,


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

11
Этап 2. Сборка
электронного питомца

ШАГ 1. СБОРКА ОСНОВЫ УСТРОЙСТВА

Компоненты:
• плата Arduino UNO, 1х;
• плата расширения Troyka Shield, 1х;
• макетная плата BreadBoard Mini на 170
точек, 1х.

1. Возьми плату Troyka Shield и


установи её поверх платы Arduino
UNO так, чтобы её штырьки во-
шли в соответствующие гнёзда на
UNO.

2. Убедись, что перемычка рядом с


изображением матрёшки на плате
Troyka Shield соединяет V2 и 5V.
При таком положении перемычки
5V плата будет работать от напряже-
ния 5 В, которое и требуется для
наших компонентов.

12
3. Теперь рассмотри макетную пла-
ту BreadBoard Mini для прото-
типирования. На ней буквами и
числами обозначены различные
шины1. Макетная плата позволяет
соединять одновременно несколь-
ко компонентов без пайки.

4. Сними защитный слой с клей-


кой поверхности макетной платы
и установи её на плату Troyka
Shield над областью макетной
платы для пайки. Они идеально
совпадают. Теперь ты сможешь
легко соединять отдельные компо-
ненты проекта на достаточно ком-
пактном пространстве.

Макетные платы делятся на два типа: 1

1) макетные платы для прототипирования без пайки;


2) макетные платы для пайки.
Прототипирование (англ. «рrototyping») — это процесс быстрой
«черновой» сборки устройства. Зачастую при прототипировании про-
вода не припаиваются, а внешний корпус отсутствует. Такая сборка
требует мало времени и усилий, но обеспечивает работу макетируемой
системы. Прототипирование позволяет собрать достаточно сложные
многокомпонентные схемы, которые легко исправлять или улучшать,
вводя новые компоненты или новые устройства.
Прототипирование с пайкой обеспечивает надёжность соединения
компонентов. Однако исправление ошибок проектирования или улуч-
шение сопровождаются трудностями перепайки, риском ожога или
вдыхания вредных веществ при неумелом обращении с паяльником.
К тому же для работы требуется специально оборудованное место. При
1
Шина — это электронный канал из проводников, связывающий несколько входов и выходов.

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

ШАГ 2. ПОДКЛЮЧЕНИЕ ДАТЧИКА ОСВЕЩЁННОСТИ


И ТЕРМОМЕТРА

Компоненты:
• датчик освещённости (Troyka Module),
1х;
• аналоговый термометр (Troyka Module),
1х;
• тройной провод (шлейф) с концами
типа «гнездо», 2х.

Датчик освещённости приспособлен для лёгкого и быстрого подклю-


чения к плате Troyka Shield — в нём учтена разница между рабочим
напряжением фоторезистора и напряжением, поступающим с платы
Arduino UNO. Датчик вырабатывает
аналоговый сигнал1, который подаёт-
ся на аналоговый вход UNO.
Кстати! Для лёгкого запоминания мож- На плате Troyka Shield аналого-
но воспользоваться ассоциацией «Сиг- вые входы A0–A5 расположены над
нал-Вольтаж-Грунт». названием платы. Используются сле-
дующие стандартные обозначения:
S — сигнал (через этот контакт идёт информация), V — питание, G —
земля. Аналогичные контакты имеются и на самом датчике.

1. Подключи к датчику тройной


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

Готово!
1

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

14
2. Второй конец тройного провода
подключи к аналоговому входу
А0 на Troyka Shield, соблюдая
аналогичную цветовую схему.

Датчик освещённости подключён!

3. Так же подключи модуль термо-


метра. Он тоже является анало-
говым датчиком Troyka Module.
Жёлтый сигнальный провод тер-
мометра подключи к аналогово-
му входу А1 на Troyka Shield,
используя знакомое тебе правило
S-V-G.

Ура! Аналоговый термометр тоже


подключён и готов к работе!

ШАГ 3. ПОДКЛЮЧЕНИЕ ИК-ПРИЁМНИКА

Компоненты:
• ИК-приёмник (Troyka Module), 1х;
• тройной провод с концами типа «гнез-
до», 1х.

Как ты уже убедился, подключать датчики типа Troyka Module очень


просто. Готовые модули существуют не только для аналоговых, но и
для цифровых периферийных устройств.

15
Возьми идущий в комплекте с
датчиком тройной провод с кон-
цами типа «гнездо». Соедини им
соответствующие контакты ИК-
приёмника и цифрового порта
№ 0 (Digital 0) на плате расши-
рения Troyka Shield, руковод-
ствуясь правилом S-V-G.

Кстати, плата Arduino UNO поддерживает подключение периферий-


ных устройств с двумя типами напряжения, применяемого в автоматике
и компьютерной технике. Основным напряжением платы является 5 В,
однако некоторые датчики работают от 3,3 В. Поскольку это напряже-
ние является дополнительным, для него отведены контакты № 8–13,
дополнительный GND, AREF и SDA, SCL рядом с цифровыми кон-
тактами второй группы. По умолчанию эти контакты также работают
на основном напряжении платы, но могут быть переключены в режим
дополнительного напряжения путём перестановки перемычки (джампе-
ра). Перемычка расположена рядом с изображением матрёшки, и мы
уже упоминали её при установке Troyka Shield на Arduino UNO.

ШАГ 4. ПОДКЛЮЧЕНИЕ ДАТЧИКА УРОВНЯ ШУМА

Компоненты:
• аналоговый датчик уровня шума с тре-
мя контактами или датчик уровня шума
с четырьмя контактами, 1х;
• красный провод с концами типа «ште-
кер», 1х;
• чёрный провод с концами типа «ште-
кер», 1х;
• оранжевый провод с концами типа
«штекер», 1х.

Ты можешь выбрать любой датчик типа Troyka Module или любой


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

16
1. Установи плату датчика уровня
шума на макетную плату Bread-
Board Mini так, чтобы его выводы
заняли гнёзда с разными номера-
ми, то есть не попали на одну
шину. Например, наш датчик с
четырьмя выводами займёт кон-
такты J1-J4 макетной платы.

На датчике над каждым контактом указано его назначение.

Встречающиеся обозначения Назначение

A0, A, Analog Аналоговый выход датчика (передаёт


значение от 0 до 255 условных единиц)

–, G, GND Земля

+ или VCC, V, 5 V Питание с напряжением 5 В

D0, D, Digital (только на датчиках Цифровой выход датчика (передаёт 0,


с четырьмя контактами) если уровень шума ниже порогового)

Чувствительность датчика настра-


ивается с помощью потенциометра,
Кстати! Здесь условные единицы — это
расположенного на плате датчика. 256 градаций (уровней), различаемых при
Потенциометр — это регулируемый изменении напряжения от 0 до 5 В. Таким
делитель электрического напряжения. образом,
Он состоит из резистора с подвиж- 5В
1 у. е. 0,01953125 В.
ным отводным контактом. 256
Резистор — это компонент, кото- Если в будущем в своей программе ты
рый изменяет сопротивление R элек- захочешь не использовать условные еди-
трической цепи. Потенциометр рабо- ницы, а выводить на экран напряжение
тает как резистор, номинал которого на аналоговом входе, то запомни это зна-
можно менять. чение.

17
2. Чёрным проводом с концами типа «штекер» соедини любой контакт
на макетной плате, расположенный на той же шине (с таким же но-
мером), что и контакт G датчика, и контакт GND на плате Troyka
Shield.

3. Красным проводом с концами типа


«штекер» соедини любой контакт
на макетной плате, расположен-
ный на той же шине (с таким же
номером), что и контакт + датчи-
ка, и контакт 5 V на плате Troyka
Shield.

Осталось подключить основной информационный контакт, через ко-


торый и будут передаваться данные, то есть сигнальный провод.

4. Оранжевым проводом с конца-


ми типа «штекер» соедини любой
контакт на макетной плате, распо-
ложенный на той же шине (с та-
ким же номером), что и контакт
A0 датчика, и аналоговый вход А2
на плате Troyka Shield. Здесь тебе
понадобится стандартная группа
контактов аналоговых входов пла-
ты Arduino.

Ну вот, все датчики, которые будут обеспечивать твоего питомца ин-


формацией из окружающего мира (устройства ввода), подключены.
Ты молодец! Давай подключим ещё экран — устройство вывода для
взаимодействия питомца с тобой.

18
ШАГ 5. ПОДКЛЮЧЕНИЕ ЭКРАНА

Компоненты:
• текстовый (знакосинтезирующий) экран
МЭЛТ 20 u4, 1х;
• красный провод с одним концом типа
«гнездо» и одним концом типа «ште-
кер», 6х;
• зелёный провод с одним концом типа
«гнездо» и одним концом типа «ште-
кер», 6х;
• чёрный провод с двумя концами типа
«штекер», 1х;
• красный провод с двумя концами типа
«штекер», 1х;
• импульсный блок питания/Power Bank
и USB-кабель или батарейка типа «Кро-
на» и соответствующий ей провод, 1х.

1. Начнём с подключения экрана. Тебе предстоит создать соединитель-


ный шлейф. В отличие от установки прямо на плату гибкий шлейф
из двенадцати проводов позволит удобно расположить экран в кор-
пусе устройства в будущем. По красным проводам с одним концом
типа «гнездо» и одним типа «штекер» мы будем подавать питание
на МЭЛТ или выполнять заземление, а по зелёным — подавать ин-
формацию (data).

19
Тебе понадобятся две шины на макетной плате. Одна из них будет
выполнять роль шины питания («+»), другая — шины земли («–»).
DATA-провода будут подключаться непосредственно к цифровым
портам Troyka Shield.
Экран имеет 16 контактов. Около первого контакта стоит 1, около
последнего — 16. Если модель твоего экрана немного отличается,
то ты найдёшь рядом с контактами указанную нумерацию, соответ-
ствующую схеме дисплея.
Проверь, правильно ли ты выполнил подключение, сверяясь со схе-
мой выше.

№ Шина Цвет Краткое описание


контакта или цифровой провода функций
экрана порт
Земля знакосинтезатора, подающего знаки
1 Шина GND («–») Красный
на дисплей
Шина питания
2 Красный Питание знакосинтезатора
(«+»)
Равноценна сигналу «Логический нуль»
3 Шина GND («–») Красный (LOW). Контрастность (регулирует чёт-
кость отображаемых знаков)
Адресный сигнал (сообщает плате Arduino
4 № 4 (Digital 4) Зелёный
UNO, что экран подключён)
Равноценна сигналу «Логический нуль»
(LOW); устанавливает режим «всегда пи-
сать» последовательного порта, роль ко-
5 Шина GND («–») Красный
торого исполняет экран, то есть порт не
будет ожидать ввода информации, а будет
только выводить её
Сигнал разрешения доступа данных к по-
6 № 5 (Digital 5) Зелёный
следовательному порту
11 № 10 (Digital 10) Зелёный
Линии передачи данных (по ним инфор-
12 № 11 (Digital 11) Зелёный мация от платы Arduino UNO поступает
13 № 12 (Digital 12) Зелёный на экран)
14 № 13 (Digital 13) Зелёный
Шина питания Питание подсветки (необязательно, но по-
15 Красный
(«+») лезно при плохой освещённости)
16 Шина GND («–») Красный Земля подсветки

20
2. Итак, ты подключил экран к шинам на макетной плате. Теперь нуж-
но соединить эти шины с платой расширения Troyka Shield. На
макетной плате одна шина уже подключена к разъёму 5V платы
Troyka Shield. Красным проводом с двумя концами типа «штекер»
соедини шину питания экрана на макетной плате и шину, к которой
подключено питание для датчика уровня шума.

3. Аналогично чёрным проводом с двумя концами типа «штекер» со-


едини шину земли экрана на макетной плате и шину, подключён-
ную к разъёму GND платы Troyka Shield.

4. Осталось немного — подключить питание к основной плате Arduino


UNO, от которой оно поступит к датчикам и экрану. USB-кабе-
лем соедини USB-выход твоего PowerBank и USB-порт на плате
Arduino UNO. Теперь для включения питомца будет достаточно
включить портативный блок питания. Arduino можно запитать и от
компьютера, и от блока питания для зарядки мобильного телефона
или планшета.

Ну вот, аппаратная часть питомца готова. Теперь нужно снабдить его


мозгами!

21
Этап 3. Установка
программного обеспечения

Для программирования платы Arduino необходимо установить на ком-


пьютере специальную среду разработки программ, которая называется
Arduino IDE. Это программное обеспечение распространяется бесплат-
но, поэтому ты без проблем можешь скачать себе установочный файл,
перейдя на официальный сайт Arduino: https://www.arduino.cc/en/
Main/Software
В перечне справа выбери операционную систему, установленную на
твоём компьютере.

Если у тебя установлена ОС Windows, но нет прав администратора


(например, родители ограничили учётную запись), кликни по второй
строке.
На странице загрузки тебе предложат сделать пожертвование разра-
ботчикам среды. Если ты хочешь скачать установщик без взноса, клик-
ни на Just Download.

22
Если у тебя нет компьютера или ты хочешь, чтобы среда програм-
мирования для роботов была всегда с собой, то ты можешь найти бес-
платные приложения в Google Play или App Store, например Arduino
Droid. Если же ты программируешь на школьном компьютере, то мо-
жешь воспользоваться веб-версией среды программирования, доступной
по адресу: http://editor.arduino.cc/
Программы, написанные в редакторе кода среды Arduino IDE, на-
зываются скетчами (от англ. «sketch» — набросок). Они сохраняются
в собственном формате — .ino. Ино-
гда проекты содержат несколько под-
программ, которые хранятся в одной
папке проекта — скетчбуке (от англ. Знаете ли вы, что… C++ — это не просто
«sketchbook» — книга набросков). один из самых популярных языков про-
Программы тебе предстоит писать граммирования. Благодаря тому что с его
непосредственно на языке програм- помощью удобно обращаться напрямую
к аппаратной части, на этом языке пишут
мирования Wiring, который являет-
операционные системы.
ся облегчённой (для программиста)
версией языка C++.

23
Этап 4. Первый запуск
и проверка оборудования

1. Подсоедини Arduino UNO с по-


мощью USB-кабеля к компьютеру.
Основные кнопки:
2. Запусти среду Arduino IDE. Долж-
Компилировать (собирать для дан- но появиться такое окно програм-
ного микропроцессора) программу мы:
для проверки на наличие ошибок.

Компилировать программу и за-


грузить её на подключённое
устройство (Arduino сразу же за-
пустит полученную программу).

Создать новый скетч (среда от-


кроет новую вкладку, в качестве
названия будет использована теку-
щая дата).

Открыть сохранённый ранее скетч.

Сохранить открытый скетч. Не за-


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

24
3. Если название подключённого устройства не отображается или
отображается неверно, выбери плату и порт вручную:

4. Прежде чем подготовить программу, убедись, что всё оборудование


подсоединено правильно и работает подсветка экрана.

5. Для написания скетча нужно подключить специальные библиоте-


ки. Скачай их по ссылкам: https://github.com/arduino-libraries/
LiquidCrystal/archive/master.zip и https://github.com/z3t0/Arduino-
IRremote/zipball/master

6. Добавь скачанные файлы в среду с помощью инструмента импорта


.ZIP-библиотек:

25
7. Для проверки компонентов перепиши приведённый ниже скетч в
поле ввода. Что значат конкретные команды и функции, ты узнаешь
на этапе программирования, а пока требуется проверить физические
компоненты.

#include <LiquidCrystal.h>
#include <IRremote.h>

LiquidCrystal lcd (4, 5, 10, 11, 12, 13);


IRrecv irrecv(0);
decode_results results;

void setup() {
irrecv.enableIRIn();
lcd.begin(20, 4);
pinMode(1, INPUT);
lcd.setCursor(0, 1);
lcd.print("System Test");
delay(1000);
}

void loop() {
lcd.clear();
lcd.print("Term: ");
lcd.print(analogRead(A1) / (6.8));

lcd.setCursor(0, 1);
lcd.print("Light: ");
lcd.print(0.512 * (1024 - analogRead(A0)));
lcd.print("lx \0");

lcd.setCursor(0, 2);
lcd.print("Sound: ");
lcd.print(analogRead(A2));
lcd.print("points \0");

lcd.setCursor(0, 3);
if (irrecv.decode(&results))
{
lcd.print("Button code: ");
lcd.print(results.value);
}

delay(1000);
}
Для проверки оборудования:
1) Загляни в правый нижний угол окна программы. Если название
устройства отображается, нажми кнопку загрузки. Если названия нет,
проверь подключение кабеля.

26
2) Далее появится диалог сохране-
ния скетча. Дай ему имя testing и
сохрани в удобной для тебя папке Кстати! Обрати внимание на переменные.
в памяти компьютера. Скетч будет Среди программистов правилом хорошего
тона является написание переменных на
скомпилирован1 и загружен на под- английском языке со строчной буквы, сле-
ключённое устройство. Если компиля- дующие слова набираются без пробела с
ция не удалась, проверь правильность заглавной буквы. Не набирай русские сло-
написания переменных и синтаксис. ва латинскими буквами!
3) Посмотри на экран. На нём дол-
жны отображаться данные. Сравни их
с показателями домашнего термометра и данными из таблицы освещён-
ности2 (приблизительно). Показания в твоём помещении должны быть
примерно такими:

Место Освещённость, лк

Лестница или коридор с аварийным освещением 50–70

Комната 150–250

Класс, рабочее место 250–350

Учебная аудитория (технология) 270

Учебная аудитория (русский язык, математика) 300

Компьютерный класс 350

4) Проверь, изменяются ли показания от датчика уровня шума при


воспроизведении громких звуков в непосредственной близости от него.
Если значения меняются незначительно, отрегулируй чувствительность
путём поворота потенциометра на датчике.
5) Нажми любую кнопку пульта. Посмотри, какое значение появи-
лось на экране. Нажми другую кнопку — надпись должна измениться.
6) Отсоедини USB-кабель. Теперь проверь, как твой гаджет работа-
ет с батарейным отсеком или мобильным блоком питания. Это раз-

1
Компиляция — это процесс перевода программы, написанной на языке программирования, по-
нятном человеку, на язык, понятный компьютеру, и «упаковка» его в файл, обрабатываемый
микроконтроллером.
2
СанПиН 2.2.1./2.1.1.1278-03 «Гигиенические требования к естественному, искусственному
и совмещённому освещению жилых и общественных зданий» и СНиП 23-05-95 «Естественное
и искусственное освещение».

27
умно, так как не всегда удобно оставлять гаджет включённым в сеть
ПК, если это не домашний сервер. Подключи штекер блока питания
к гнезду питания Arduino UNO.
При подключении блока питания должна снова включиться програм-
ма тестирования. Если этого не произошло, проверь, правильно ли под-
ключён блок или заряжен ли мобильный аккумулятор.
Отлично! Устройство готово, его компоненты работают нормально.
Настало время сделать для него корпус. Вперёд, инженер!

28
Этап 5. Изготовление
корпуса устройства

Перейдём к самому интересному! Ты уже создал программу и основ-


ное устройство, с которым можно играть или доверить в качестве те-
ста младшему брату или сестре перед покупкой настоящего кота или
собаки. Давай сделаем твоё устройство красивее!
Есть несколько вариантов создания крутого и, главное, уникального
корпуса для твоего питомца. Ты можешь сделать его из папье-маше,
фетра или переделать плюшевую игрушку. Какой бы вариант ты ни
выбрал, необходимо придерживаться следующих правил:
1. Провод питания должен выходить наружу.
2. Ничто не должно загораживать фоторезистор датчика освещённо-
сти, чтобы твой питомец не жил в непрекращающейся ночи.
3. Экран необходимо закрепить, чтобы тебе не приходилось постоян-
но разбирать корпус и поправлять шлейф.

ШАГ 1. ИЗГОТОВЛЕНИЕ ФОРМЫ ИЗ ПАПЬЕ-МАШЕ

Мы выбрали вариант с папье-маше, потому что он доступен даже малы-


шам и требует минимума материалов, совсем недорогих. Одни плюсы!

Тебе понадобятся: Это интересно! Технологию, очень схожую


• несколько газет; с папье-маше, применяли китайские воен-
• миска или тарелка, в которой может ные мастера древности при изготовлении
лёгких доспехов. Они спрессовывали боль-
поместиться собранная конструкция;
шое количество слоёв бумаги и покрывали
• пищевая плёнка;
их сверху лаком. В результате получался
• кисточка и клей ПВА; очень прочный материал, который выдер-
• карандаш; живал скользящие удары меча (от прямого
• линейка; рубящего зачастую не спасали и металли-
• блюдце или тарелка для клея; ческие латы).
• гуашь или другие краски;
• ножницы или канцелярский нож;
• пинцет.

29
1. Подготовь рабочее пространство. Нехорошо, если твои школьные
тетради или учебники будут испачканы краской и клеем.

2. Переверни большую миску дном


вверх. Миска — это наша форма.
Оберни её пищевой плёнкой. Без
этого шага можно обойтись, одна-
ко благодаря ему будет намного
удобнее снимать готовое изделие
с формы-миски. А теперь сделаем
её дубликат из нового материала.

3. Возьми старую ненужную газету


и порви её или порежь на кусоч-
ки, похожие на квадратики разме-
ром примерно 1,5 u 1,5 см. Особен-
но не старайся — неровные края
пойдут будущему изделию только
на пользу. Будь аккуратен, чтобы
газетные обрывки не разлетались
по всей комнате или кабинету.
Сложи получившиеся кусочки в
одну кучку.

4. Налей клей в блюдце, чтобы дно


полностью им покрылось. Это са-
мый простой шаг.

5. Возьми пинцетом кусочек газеты из кучки и опусти его в клей.


Когда бумага насквозь пропитается клеем, прилепи её к миске по-
верх плёнки.

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


покроют миску четырьмя–пятью плотными слоями.

30
7. Нашей кошке нужны ушки. Из остатков газеты сделай два неболь-
ших конуса, набей их изнутри папье-маше и приклей к заготовке
на макушке. Обклей ушки в два слоя поверху.

8. Теперь пусть заготовка сушится. Обычно хватает 12 часов, но в за-


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

9. Ну вот, заготовка высохла. При-


подними оставшиеся снаружи
края плёнки и сними копию ми-
ски. А можно просто перевернуть
изделие и вытащить миску. При
желании ты можешь ещё сформи-
ровать лапки котёнка.

ШАГ 2. ВЫРЕЗАНИЕ ОТВЕРСТИЙ В КОРПУСЕ

Необходимо подготовить отверстия для дисплея и датчика освещённости.

1. Выбери подходящее место на макушке перевёрнутой формы. Про-


делай ножницами дырку для датчика освещённости. На этапе деко-
рирования её можно чем-то украсить.

2. Для установки дисплея вырежи прямоугольное отверстие размером


9,5 u 4 см под чёрную рамку дисплея, сама плата будет скрыта вну-
три «питомца».

3. Сзади наметь ещё одно отверстие для подачи питания через USB-
кабель.

31
4. Аккуратно вырежи размеченное
отверстие ножницами или канце-
лярским ножом. Отлично! Оста-
лось совсем немного.

5. Подровняй канцелярским ножом


края отверстий и низ заготовки,
срежь лишнее.

ШАГ 3. ДЕКОРИРОВАНИЕ КОРПУСА

1. С помощью кисточки раскрась питомца гуашью. Нарисуй ему мор-


дочку, добавь детали. Красить лучше в несколько слоёв, тогда цвета
сохранят яркость.

2. Аккуратно вставь дисплей в предназначенное для него отверстие.


Точно так же поступи с датчиком освещённости. Кабель питания
протащи внутрь через его отверстие. Остальное спрячь внутри.

Ура! Твой питомец приобрёл облик!


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

32
Этап 6. Создание
программы
для устройства

Логика программы
Сначала нужно понять, что требуется от устройства. Частично мы это
обсуждали на первом этапе. При запуске твой питомец должен выво-
дить на экран приветствие. Затем должна появиться мордочка, соот-
ветствующая его состоянию: питомец всем доволен, он замёрз или пе-
регрелся, его раздражает шум, он заболел, и заставка окончания игры.

При оценке состояния питомца будут использоваться три основных


показателя: сытость, здоровье (в том числе гигиена) и настроение. Они
зависят от внешних факторов, включая течение времени. Зададим, что
показатели уменьшаются на 1% каждые 10 секунд.
Возможны такие реакции питомца на показатели окружающей среды:
• если в помещении показатель освещённости меньше допустимо-
го значения в люксах, питомец засыпает;
• если показание датчика температуры не соответствует норме,
то выводится соответствующее оповещение (холодно или жарко);
• если показание датчика уровня шума превышает установленное,
питомец возмущается.

33
Для удовлетворения потребностей необходима функция кормления —
осуществляет повышение показателя сытости, незначительное уменьше-
ние здоровья (гигиены) при нажатии заданной кнопки на пульте.
Не обойтись также без функции купания в ванне (улучшение здо-
ровья, незначительное уменьшение сытости), выдачи лакомства (по-
вышает сытость, уменьшает здоровье, потому что сладкое есть вредно),
лечения (улучшение здоровья, снижение настроения).
Если показатель настроения питомца меньше 50%, он отказывается
принимать лекарство и ванну. Для повышения показателя настроения
доступна игра «Камень, ножницы, бумага». В случае победы пи-
томца или ничьей у питомца повышается настроение, а в случае побе-
ды пользователя — уменьшается.
Для игровой составляющей добавлена функция наказания, кото-
рая снижает настроение (в дальнейшем эта функция может быть рас-
ширена для влияния на новый показатель «ответственность»).
Дополнительно реализуются функции вывода информации:
о помещении (освещённость, температура, шум) и о состоянии питомца
(сытость, здоровье, настроение). Показания потребностей должны быть
ограничены диапазоном 0–100%. Освещённость записывается в люксах,
температура — в градусах по Цельсию, уровень шума — в трёх града-
циях (тихо, нормально, шумно). Команды передаются от ИК-пульта на
ИК-приёмник, постоянно ожидающий приёма команд.
• Если питомец очень голоден (показатель сытости 0%), то показа-
тель здоровья уменьшается (питомец мучается от голода).
• Уменьшение показателя настроения до 0% вызывает уменьшение
показателя здоровья (питомец хандрит).
• Уменьшение показателя здоровья до 0% приводит к окончанию игры.
Для удобства разделим функции на большие категории и выне-
сем их в подпрограммы. Прежде чем приступить к составлению про-
граммы на языке блок-схем или к её написанию, лучше составить её
модель. Программисты, разработчи-
ки баз данных и прочие ИТ-специ-
алисты применяют для этого свои
Это интересно! Приветствие — один из специфические стандарты и языки,
обязательных компонентов при написании но для твоего маленького проек-
чат-ботов, то есть программ, ведущих диа-
лог с пользователем. Ведущие разработ-
та достаточно составить примерные
чики чат-ботов, основываясь на статисти- схемы. Главное, чтобы на каждом
ке, утверждают, что во многом отношение этапе были видны основные состав-
пользователя закладывается именно при ляющие.
приветствии. По этой же причине многие Скетчбук tomodachi будет состо-
мониторы, телевизоры и другие устройства ять из нескольких скетчей-подпро-
выводят перед работой свой логотип — это
грамм, включая одноимённый основ-
приветствие.
ной скетч:

34
Скетч tomodachi (друг) —
основная подпрограмма

Скетч face (мордочка) —


подпрограмма, которая управляет
отображением эмоций

Проект (скетчбук)
tomodachi

Скетч game (игра) —


подпрограмма, в которой прописана
игровая часть

Скетч keyboard (клавиатура пульта) —


подпрограмма, в которой собраны
все функции, вызываемые нажатием
кнопок пульта

Теперь рассмотрим содержимое каждой подпрограммы подробнее.

1. В первом скетче — основной под-


программе tomodachi будут объяв-
ляться глобальные переменные и Знаете ли вы, что... Глобальная перемен-
функции, а также основные функ- ная — это переменная, доступ к которой
ции для работы Arduino: setup — открыт из любой функции любой подпро-
граммы. Локальная переменная существу-
функция установки, работающая
ет только внутри функции, в которой она
только при запуске устройства, и объявлена.
loop — функция повтора, являю-
щаяся основной функцией про-
граммы.
По сути, в этом скетче будут со-
держаться заголовки, ссылающие-
ся на основное содержание, рас-
положенное в других скетчах.

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

setup — функция установки,


tomodachi — основная
работающая только при запуске
подпрограмма
устройства

loop — функция повтора,


являющаяся основной функцией
программы

2. Второй скетч face (он самый простой) управляет выражением мор-


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

face emotions

Emotions (эмоции) — отображение различных эмоций с помощью


символьного рисунка на экране устройства. Таких рисунков семь:
1) питомец доволен;
2) питомец замёрз;
3) питомцу жарко;
4) питомцу не нравится шум;
5) питомец заснул;
6) питомец заболел;
7) конец игры.

3. В третьей подпрограмме (скетч game) всего две функции — основ-


ная функция трёхжестовой игры Sansukumi_ken и вспомогательная
choise — «выбирающая».

36
Sansukumi_ken

game

choise

4. И последняя подпрограмма (скетч keyboard) описывает девять


функций, которые вызываются при расшифровке сигнала, получае-
мого ИК-приёмником от ИК-пульта:
1) info — функция, выводящая на экран информацию о состоянии
окружающей среды;
2) whatDay — «смысловое» продолжение функции info, показывает
словесную характеристику окружающей среды;
3) pet (питомец) — тоже функция вывода информации, но уже о
состоянии самого питомца;
4) feed — функция, реализующая виртуальное кормление питомца;
5) bath (ванна) — функция виртуальных гигиенических процедур
(для повышения здоровья);
6) cookie (печенье) — функция, позволяющая передать питомцу ла-
комство;
7) tablet (таблетка) — функция для передачи заболевшему питомцу
лекарства;
8) punishment (наказание) — наказание питомца за плохое поведе-
ние;
9) proc — вспомогательная функция, регулирующая показатели па-
раметров в пределах 0–100.

ШАГ 1. ЗАПУСК ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ


ARDUINO IDE

1. Запусти программную среду Arduino IDE.

2. В открывшемся окне нажми кнопку «Новый» .

37
ШАГ 2. СОСТАВЛЕНИЕ ПРОГРАММЫ ДЛЯ ПИТОМЦА

Основная подпрограмма Tomodachi


В поле ввода начинаем составлять код программы для Arduino.
Начни с самого проекта (скетчбука), который сохрани как файл
tomodachi.ino. Для этого в контекстном меню во вкладке «Файл» вы-
бери пункт «Сохранить как…»:

Мы выбрали название tomodachi не случайно. С японского языка


tomodachi переводится как «товарищ» или «друг». Ты же делаешь сво-
его электронного друга!

1. Подключи к скетчбуку необходи-


мые библиотеки:
Знаете ли вы, что... Библиотека — это на-
бор специальных функций, часто исполь- #include <LiquidCrystal.h> /*Библиотека
зуемых для определённых целей. Их пол- для работы с текстовым экраном.*/
ностью описывает разработчик библиотеки. #include <IRremote.h> /*Библиотека для
Пользователь может вызвать функцию, работы с ИК-пультом.*/
указав лишь её название, без прописыва-
ния всего алгоритма. Если используются
команды только из стандартной библиоте-
2. Теперь тебе требуется объявить
ки, эту библиотеку не объявляют. особые объекты, взаимодействие
с которыми описано в только что
подключённых библиотеках:

38
LiquidCrystal lcd (4, 5, 10, 11, 12, 13); /*Экран МЭЛТ и контакты Arduino UNO,
к которым подключены его информационные провода.*/
IRrecv irrecv (0); /*Объект типа «ИК-приёмник», подключённый к цифровому
порту № 0.*/
decode_results results; /*Декодированный ИК-сигнал будет храниться
в переменной results.*/

3. Переходи к выделению памяти и инициализации глобальных пере-


менных для хранения показателей состояния твоего питомца:

int satiety = 100; //Сытость.


int health = 100; //Здоровье.
int mood = 100; //Настроение.
int timer = 0; //Время после включения в миллисекундах.

Показатели состояния питомца будут находиться в диапазоне целых


чисел от 0 до 100, поэтому достаточно использования целочислен-
ного типа int.

4. Объяви все функции, которые будут использоваться в проекте.


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

void info(float a, int b, int c); /*Функция вывода информации о помещении.


Она «требует» на входе показания температуры в виде числа с плавающей
точкой (float) и целочисленные (int) показания температуры и уровня шума.*/

void pet(); /*Функция, которая будет выводить на экран данные о состоянии


питомца.*/

Далее объяви функции взаимодействия с питомцем:

void feed (); //Кормление.


void tablet(); //Лечение.
void bath(); //Принятие ванны.
void cookie(); //Лакомство.
void punishment(); //Наказание.

39
Не кажется ли тебе, что мы что-то упустили? Да, правильно, тре-
буется указать ссылку на функцию игры:

void Sansukumi_ken();

Ты удивляешься, что за странные слова? Это всего лишь название


игры «Камень, ножницы, бумага», написанное на японском языке,
потому что в Россию и на Запад она пришла из Китая именно че-
рез Японию. Мы ещё об этом поговорим.
А вот как понять, что нравится или не нравится питомцу? Очень
просто — по выражению его мордочки! Добавь функцию эмоций,
на вход которой будут поступать данные об окружающей среде
и показатели состояния животного:

void emotion (float one, int two, int three, int four, int five, int six);

И наконец, функция, регулирующая значения показателей состо-


яния питомца, ведь ты же не хочешь превращать своего питомца
в зомби с функционированием при –50% здоровья.

void proc();

Переходим к описанию самых важных функций программы!

5. Функция установки (setup) присутствует в любой программе на


языке Wiring. Она является обязательным элементом и отрабатыва-
ет только один раз сразу после включения устройства. Почему она
важна? Эта функция оповещает микроконтроллер считывать или
подавать сигнал на цифровые порты. Кроме того, в setup описыва-
ются стартовые состояния для различных периферийных устройств,
например экрана.

/*ФУНКЦИЯ УСТАНОВКИ*/
void setup() {
Serial.begin(9600); /*Запуск последовательного порта. Он понадобится
для отладки и просмотра результатов действия программы
в режиме реального времени на экране твоего компьютера.*/

Теперь создай зёрнышко. Нет, это не ошибка. Дело в том, что


Arduino, как и любой другой компьютер, не способен выдать по-на-
стоящему случайное число — оно всегда выбирается по алгоритму,
берущему за основу некоторое число — зерно (seed). Если ты за-
пустишь функцию создания такого «случайного» числа очень мно-

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

randomSeed(100);

Назначать роль цифровому порту № 0 не требуется, потому что он


уже был объявлен как объект типа IRrecv, то есть «ИК-приёмник».
Осталось запустить приём и включить дисплей:

irrecv.enableIRIn(); // Запуск приёма команд по ИК-приёмнику.


lcd.begin(20, 4); /*Запуск взаимодействия с дисплеем размером
20 символов u 4 строки.*/
lcd.setCursor(4, 1); /*Установка курсора в положение 4-й символ на первой
строке (нумерация строк с нуля), чтобы создать отступ.*/
lcd.print("TOMODACHI 1.0 \0"); //Вывод на экран текста приветствия.
delay(1000); //Задержка в 1 секунду, чтобы успеть прочесть приветствие.
}

Фразы, выводимые на дисплей,


Знаете ли вы, что… Язык Wiring — это
следует заканчивать знаком окон-
язык высокого уровня, нацеленный на вза-
чания строки: \0 имодействие с человеком и программами.
Wiring — это язык объектно- Он позволяет использовать функции и
ориентированного программиро- процедуры, которые удобны человеку, то
вания (ООП) и одновременно есть работать на высоком (программном
язык процедурного программиро- уровне). При этом он способен обращать-
ся напрямую к аппаратным компонентам,
вания (ПП).
то есть содержит команды низкого уровня.
Как язык ООП Wiring работает Это очень удобно!
с объектами, объединяемыми по
общему признаку, например по
принадлежности к одной аппаратной категории или компоненту. Ты
с этим встречаешься, когда обозначаешь все экраны как объекты типа
lcd. Это работает и наоборот: если ты создашь конкретный объект
типа lcd, то к нему можно применить все функции из библиотеки
<LiquidCrystal.h>. Такое свойство объектов называется наследованием.
Свойство языка Wiring как языка ПП иллюстрируется наличием
нескольких скетчей в одном проекте, то есть вынесением функций
в подпрограммы.

6. Переходим к работе со второй обязательной функцией — функцией


повтора (loop). Она, как ясно из названия, постоянно повторяется,
пока устройство получает питание. Все основные функции и коман-
ды вызываются в ней.

41
/*ФУНКЦИЯ ПОВТОРА */
void loop() {
lcd.clear(); //Очистка дисплея.

Давай соберём информацию с подключённых датчиков.


1) Начнём с аналогового термометра:

float x = analogRead(A1); /*Считывание значения с аналогового входа А1


в переменную х.*/
x = x / (6.8); /*Осуществление перевода из абстрактных уровней в градусы по
Цельсию.*/

2) Разберёмся с датчиком освещённости. Он тоже использует уров-


ни, но, как уже упоминалось при сборке, освещённость (Е) принято
измерять в люксах, поэтому произведём дополнительный расчёт:

int y = analogRead(A0); //Снятие показания с датчика освещённости на А0.


int E = 0.512 * (1024-y); //Перевод значения в люксы.

Число 0,512 подставляется в формулу для определения освещённо-


сти E только для датчика Troyka Module. Если у тебя другой дат-
чик, у него будет другое число (смотри в характеристиках датчика
на сайте производителя).

Итак, осталась «вишенка на торте». Какой датчик пока не был за-


действован? Правильно, датчик уровня шума. Поскольку мы ис-
пользуем слово «уровень», оставим значение в стандартных услов-
ных единицах:

int z = analogRead(A2);

7. Теперь займёмся описанием взаимодействия с питомцем, ведь пока


что он только проводил измерения и не проявлял никакой ответ-
ной активности. Для этого нужно расшифровать данные, если они
поступили на ИК-приёмник:

/*РЕАКЦИИ НА НАЖАТИЕ КНОПОК ПУЛЬТА*/


if (irrecv.decode(&results)) // Если данные о нажатии пришли, то:
{
//если нажали кнопку CH, то показать информацию:
if (results.value == 0xFF629D) { /*где после знака сравнения записан код кнопки
в шестнадцатеричном формате.*/
info(x, E, z); /*Вызов функции вывода информации с передачей в неё показа-
ний температуры, освещённости и уровня шума.*/
};

42
Как видишь, реакция на кнопку прописывается несложно, достаточ-
но лишь выписать коды кнопок заранее:

Кнопка Код в 16-ричном Кнопка Код в 16-ричном


ИК-пульта формате ИК-пульта формате

CH- 0xFFA25D 200+ 0xFFB04F

CH 0xFF629D 1 0xFF30CF

CH+ 0xFFE21D 2 0xFF18E7

VOL- 0xFFE01F 3 0xFF7A85

VOL+ 0xFFA857 4 0xFF10EF

PLAY/PAUSE 0xFFC23D 5 0xFF38C7

EQ 0xFF906F 6 0xFF5AA5

PREV 0xFF22DD 7 0xFF42BD

NEXT 0xFF02FD 8 0xFF4AB5

0 0xFF6897 9 0xFF52AD

100+ 0xFF9867

Значения кода для твоего пульта могут различаться! Чтобы узнать


коды своего пульта, после получения сигнала просто выведи зна-
чение results в последовательный порт с помощью команды Serial.
println(results.value, HEX);
Теперь допиши случаи, когда были нажаты остальные кнопки для
вызова задуманных функций:

//Если нажали «CH+», то выполняется кормление.


if (results.value == 0xFFE21D) {
feed ();
};
//Если нажали «Play», то запускается игра.
if (results.value == 0xFFC23D) {
Sansukumi_ken();
};
//Если нажали «EQ», то даётся лекарство.
if (results.value == 0xFF906F) {
tablet();
};
//Если нажали «Prev», то питомца помыли.
if (results.value == 0xFF22DD) {
bath();
};

43
//Если нажали «Next», то даётся лакомство.
if (results.value == 0xFF02FD) {
cookie();
};
//Если нажали «CH-», то применяется наказание.
if (results.value == 0xFFA25D) {
punishment();
};
//Если нажали «0», то выводится состояние.
if (results.value == 0xFF6897) {
pet();
};

Осталось подготовить питомца к приёму последующей команды с


пульта:

irrecv.resume(); // Принимаем следующую команду.


};

8. Давай пропишем изменение состояния питомца с течением време-


ни, ведь время тоже характеристика внешнего мира. Помни, что
в программе 1000 — это 1000 мс 1 секунда.

timer = int(millis() / 1000); /*Перевод показаний таймера в секунды, чтобы


было легче читать.*/
if (timer % 10 == 0) { //Если значение кратно 10 секундам, то:
satiety = satiety - 1; //уменьшить сытость на 1%,
health = health - 1; //уменьшить здоровье на 1%,
mood = mood - 1; //уменьшить настроение на 1%.

Чтобы сделать поведение более реалистичным, свяжи показатели


между собой:

if (satiety <= 0)health = health - 5; /*Если сытость меньше или равна 0, убавить
на 5% здоровье,*/
if (mood <= 0) health = health - 2; /*если настроение ниже или равно 0,
убавить на 2% здоровье.*/
};

9. Ты почти закончил функцию loop. У твоего питомца прописаны


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

emotion(x, E, z, health, satiety, mood); /*Вызов отображения мордочки


в соответствии с параметрами.*/
delay(1000); //Пауза в 1 секунду, чтобы успеть увидеть выражение мордочки.
lcd.clear(); //Очистка дисплея для дальнейшей работы.

44
Для удобства отладки можно добавить ещё две строчки, которые
выведут показания в процентах в последовательный порт:

String how = "satiety: " + String(satiety) + "%, mood: " + String(mood) + "% and
the health-level is " + String(health) + "%."; /*Сбор всех показаний
в одну строку.*/
Serial.println(how); //Вывод строки.
} //Конец функции loop().

Ура! Ты закончил основную подпрограмму!

Подпрограмма face (мордочка)


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

Назови вкладку face.

11. Займись функцией emotion. Она будет сама выводить на экран


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

void emotion (float one, int two, int three, int four, int five, int six) {

На вход функции для последующей обработки передаётся шесть


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

Абстрактная переменная Фактическое значение


one Температура
two Освещённость
three Уровень шума
four Здоровье
five Сытость
six Настроение

45
12. Раз речь зашла о температуре, реализуй реакцию своего электронно-
го друга на её изменения. Для этого пригодится знакомый оператор
выбора if.

if (one < 15.0) { //Если температура опустилась ниже 15 qС, то:


lcd.clear(); // очистка экрана для дальнейшей работы,
lcd.print(" ^____^ \0"); //вывод «ушек»,
lcd.setCursor(0, 1); //перевод курсора на следующую строку,
lcd.print(" ( X X )\0"); //вывод «глаз»,
lcd.setCursor(0, 2); //перевод курсора на третью строку,
lcd.print(" . Y . There is icily! \0"); //вывод «носа» и сообщения: «Здесь ледник!»,
lcd.setCursor(0, 3); //перевод курсора на четвёртую строку,
lcd.print(" O \0"); //вывод «рта»,
four = four - 35; //зависимость здоровья от «замерзания» питомца,
six = six - 20; //зависимость настроения от «замерзания» питомца.
};

13. Отлично! Дай своему питомцу передохнуть — пропиши состояние


Томодачи при нормальной температуре:

if (one >= 15.0 && one <= 30.0) {//Если температура в пределах нормы, то:
lcd.clear(); //очистка экрана для дальнейшей работы,
lcd.print(" (]____[)\0"); //вывод «ушек»,
lcd.setCursor(0, 1);
lcd.print(" ( o o ) Meow-meow \0"); //вывод «глаз» и сообщения: «Мяу-мяу»,
lcd.setCursor(0, 2);
lcd.print(" = Y = \0"); //вывод «носа»,
lcd.setCursor(0, 3);
lcd.print(" U \0"); //вывод довольной «улыбки».
};
Пока температура нормальная, показатели настроения и здоровья не
уменьшаются.

14. Существует ещё одна ситуация, связанная с температурой, — её по-


вышенное значение.

if (one > 30.0) { //Если питомцу «жарко», то:


lcd.clear();
lcd.print(" (]____[)\0"); // вывод «ушек»,
lcd.setCursor(0, 1);
lcd.print(" ( T T ) Hot! \0"); // вывод «глаз» и сообщения: «Жарко!»,
lcd.setCursor(0, 2);
lcd.print(" * Y * \0"); //вывод «носа»,
lcd.setCursor(0, 3);
lcd.print(" o \0"); // вывод возмущённого «рта»,
four = four - 35; //зависимость здоровья питомца от «перегрева»,
six = six - 20; //зависимость настроения питомца от «перегрева».
};

46
Теперь ты учёл всё, что касается температуры. Пора переходить
к эмоциям, связанным с изменением других показателей.

15. Второй хорошо знакомый тебе показатель — это освещённость.


Питомец, конечно, не должен учитывать соответствие показаний
и ГОСТов (пусть стандарты знает его хозяин-человек). Если темно,
то питомец спит.

if (two < 60) { //Если полумрак или ночь, то:


lcd.clear();
lcd.print(" (]____[)\0"); // «ушки»,
lcd.setCursor(0, 1);
lcd.print(" ( — - ) Z-z-z...\0"); //закрытые «глаза» и сопение,
lcd.setCursor(0, 2);
lcd.print(" = Y = \0"); // «нос»,
lcd.setCursor(0, 3);
lcd.print(" w \0"); // «рот» с опущенной губой.
four = four + 15; //Сон полезен для здоровья!
six = six + 10; //Для настроения сон тоже полезен.
};

16. Последний показатель из внешнего мира, влияющий на эмоции пи-


томца, — это уровень шума. Хотя твой друг непривередлив, ему не
нравится слишком шумная обстановка:

if (three > 450) { //Если шумно, то:


lcd.clear();
lcd.print(" (]____[)\0"); // «ушки»,
lcd.setCursor(0, 1);
lcd.print(" ( V V ) There is so loud!\0"); /*зажмуренные «глаза» и сообщение:
«Здесь так шумно!»*/
lcd.setCursor(0, 2);
lcd.print(" = Y = \0");
lcd.setCursor(0, 3);
lcd.print(" O \0");
six = six - 25;
};

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


влияют на эмоции электронного друга. На вход функции emotion
в виде четвёртого параметра подавался показатель здоровья.

Итак, рассмотрим варианты. Если питомцу стало совсем плохо, то…


будет ещё хуже:

47
if (four == 0) { /*Если здоровье
равно 0, то:*/ 1
lcd.clear(); Это интересно! Минутка вредных советов!
lcd.print(" (]____[)\0"); Чтобы сделать «смерть» питомца оконча-
lcd.setCursor(0, 1); тельной (до очередного нажатия кнопки
lcd.print(" ( x x ) R.I.P.\0"); /*Друг, Reset), можно «запустить» вывод про-
прощай!*/ щальной мордочки в цикл while (true),
lcd.setCursor(0, 2); который выполняется бесконечно. Наибо-
lcd.print(" > Y < \0"); лее вредный вариант, который очень не
lcd.setCursor(0, 3); любят программисты и который пришёл
lcd.print(" . \0"); в наши дни из старых версий ассембле-
delay(100000); /*Долгая пауза, ра1 и дней, когда ещё циклы были чем-
чтобы игра окончилась.*/ то невероятным, — это применение меток
}; и оператора goto.

Добавь дополнительное состояние, связанное с пониженным здоро-


вьем, чтобы успеть спасти своего питомца:

if (four < 30) { //Если показатель здоровья меньше 30%, то:


lcd.clear();
lcd.print(" (]____[)\0");
lcd.setCursor(0, 1);
lcd.print(" ( > < ) feel bad \0"); /*Вывод сообщения, что питомец себя плохо
чувствует*/
lcd.setCursor(0, 2);
lcd.print(" = Y = \0");
lcd.setCursor(0, 3);
lcd.print(" o \0");
};

18. А ты помнишь, какие виртуальные показатели влияют на эмоции


твоего друга, кроме здоровья? Правильно, сытость и настроение:

if (five < 30) { // Если показатель сытости менее 30%, то:


lcd.clear();
lcd.print(" (]____[)\0");
lcd.setCursor(0, 1);
lcd.print(" ( O O ) feed me! \0"); //просьба покормить питомца.
lcd.setCursor(0, 2);
lcd.print(" * Y * \0");
lcd.setCursor(0, 3);
lcd.print(" 0 \0");
};

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

48
19. Признайся, как ты себя ведёшь при плохом самочувствии? Не хо-
чешь ничего делать и аппетит пропадает? У твоего электронного
друга характер похожий:

if (six < 30) { //Если показатель настроения ниже 30%, то:


lcd.clear();
//вывод недовольной, ворчливой мордашки.
lcd.print(“ (]____[)\0”);
lcd.setCursor(0, 1);
lcd.print(“ ( _ _ ) \0”);
lcd.setCursor(0, 2);
lcd.print(“ = Y = \0”); Кстати! Для быстрого ввода можно ис-
lcd.setCursor(0, 3); пользовать буквы латиницы, схожие с бук-
lcd.print(“ . \0”); вами кириллицы.
};
} // Закрывающая скобка тела функции.

Ура! Ты закончил графическое оформление своей программы-питом-


ца. Теперь смело переходи к описанию функции игры.

Чтобы изменить надписи в проекте, воспользуйся таблицей:

Кириллица Код Кириллица Код

Б \A0 б \B2

латинская
В в \B3
буква B

Г \A1 г \B4

Д \E0 д \E3

Ё \A2 ё \B5

Ж \A3 ж \B6

З \A4 з \B7

И \A5 и \B8

Й \A6 й \B9

латинская
К к \BA
буква K

49
Окончание таблицы
Кириллица Код Кириллица Код
Л \A7 л \BB

латинская
М м \BC
буква М

латинская
Н н \BD
буква H

П \A8 п \BE

латинская
Т т \BF
буква T

латинская
У A9 у
буква у

Ф \AA ф \E4

Ц \E1 ц \E5

Ч \AB ч \С0

Ш \AC ш \С1

Щ \E2 щ \E6

Ъ \AD ъ \С2

Ы \AE ы \С3

Э \AF э \C5

Ю \B0 ю \C6

Я \B1 я \C7

Знак градуса \DF ь \C4

Подпрограмма game (игра)


20. Создай новый скетч-вкладку под названием game.

21. Первым делом создадим основную функцию данного скетча — игру.


Функция не будет возвращать никакого значения — все необходи-
мые изменения происходят в течение времени её работы. Значит,
требуется тип void:

void Sansukumi_ken () {

50
Это название нам уже знакомо. Оно означает целый класс жесто-
вых игр Sansukumi-ken, в который входит игра «Камень, ножницы,
бумага».
Давай реализуем простую игру, известную с детства каждому.
С чего она начиналась? Правильно, с боевой готовности!

22. Сделай вывод отсчёта до старта игры:

for (int i = 3; i >0; i--) { //Отсчёт от 3 до 1.


lcd.clear();
lcd.print(i);
delay(1000);
};

lcd.clear();
lcd.print(“Let’s go! \0”); //Сообщение: «Начнём!»
lcd.setCursor(0, 1);
lcd.print(“I am first. \0”); //Вывод предупреждения, что первым ходит питомец.
delay(3000);
lcd.clear();

Пусть первый ход делает твой друг, он это заслужил.

23. Пропишем ход для питомца и тебя. Выбор жеста в игре будет ос-
новываться на генерации псевдослучайных чисел. Тебе понадобится
задать границы выбора, где первое число включается, а второе нет,
то есть x  [a, b). Вместо описания процесса выбора используем
функцию choice(), которую опишем позднее.

int tomo = random(1, 4); //Псевдослучайное число из [1,4) для питомца.


lcd.print(“I have \0”); // «У меня…»
choise(tomo); //Вызов функции выбора для питомца.

Аналогично будет выглядеть часть, где описывается твой ход:

int master = random(1, 4); // Псевдослучайное число из [1,4) для хозяина.


lcd.print(“You choose \0”); // «Ты выбрал…»
choise(master); //Вызов функции выбора для хозяина.

На самом деле в этих строках спряталось неявное преобразо-


вание типов данных! Дело в том, что в результате выполнения
random() получается число с плавающей точкой (тип данных float),
но оно записывается в ячейку типа int и вся дробная часть числа
«отбрасывается».

51
24. Теперь опишем все возможные си-
туации, которые могут возникнуть
Знаете ли вы, что... Размещением с по-
вторениями из n элементов по k называет-
в игре. Самое время вспомнить
ся упорядоченная (n, k)-выборка с возмож- комбинаторику! Итак, у тебя воз-
ными повторениями элементов, которая можны три жеста (камень, ножни-
определяется по формуле: цы, бумага) и столько же вариан-
^  n .
An
k
k тов у Томо. Порядок выпадения
случаев важен, потому что первым
ходит питомец. Вы вдвоём можете
выбрать одинаковый жест. Значит, необходимо найти число размеще-
ний с повторениями.
У нас n 3 — это количество жестов, а k = 2 — количество игроков.
Получаем:

^23 32 9.


A

Итого будет 9 различных ситуаций, которые будут делиться на три


большие категории:

Питомец (tomo) Хозяин (master) Итог игры


Камень Ножницы
Ножницы Бумага Питомец выиграл
Бумага Камень
Камень Бумага
Ножницы Камень Хозяин выиграл
Бумага Ножницы
Камень Камень
Ножницы Ножницы Ничья
Бумага Бумага

Отлично! Теперь напиши в виде кода:

//Когда выигрывает питомец:


if ((tomo == 1 && master == 2) || (tomo == 2 && master == 3) || (tomo == 3
&& master == 1))
{
lcd.print("Nya! ^^ \0"); //питомец радуется,
mood = mood + 30; //увеличивается показатель настроения.
};

52
//Когда выигрывает хозяин:
if ((tomo == 1 && master == 3) || (tomo == 2 && master == 1) || (tomo == 3
&& master == 2))
{
lcd.print("You win o(T_To) \0"); //питомец расстроен, он проиграл,
mood = mood - 10; //уменьшается настроение.
};
//Когда выходит ничья:
if ((tomo == 1 && master == 1) || (tomo == 2 && master == 2) || (tomo == 3
&& master == 3))
{
lcd.print("The friendship wins! \0"); // «Победила дружба!»
mood = mood + 10; //Настроение поднимается.
};

25. Остались дополнительные команды. Внеси их в функцию и закрой


скобки:

proc(); //Выравнивание показателей (в пределах от 0 до 100 %).


delay(5000); //Пауза, чтобы успеть прочитать надпись на экране.
lcd.clear(); //Очистка экрана.
}

26. Каким образом происходит выбор, ты уже написал. Осталось опи-


сать словесно соответствие номера случая и жеста. На самом деле
ты мог описать эти случаи раньше, и создание лишней функции не-
обязательно, однако позволит закрепить результат. Рассмотри при-
ведённую функцию:

void choise (int player) {

В качестве параметра на её вход подаётся какое-то абстрактное це-


лое число — выбор игрока.

27. Опиши непосредственно случаи выбора. Ранее для обозначения си-


туаций выбора мы использовали оператор ветвления if. На этот раз
удобнее использовать его брата — оператор switch, то есть переклю-
чатель. В скобках в качестве аргумента подаётся параметр, зависи-
мость от которого будет определяться. Внутри оператора содержат-
ся «контейнеры» под названием case (в переводе с англ. — случай).
После слова case указывается значение аргумента. Каждый случай,
кроме последнего, заканчивается оператором прерывания break, ко-
торый служит сигналом прекращения проверки остальных случаев
и выхода из switch.

53
Оператор switch всегда содержит случай по умолчанию (default).
Это позволяет в ситуациях, когда значение переменной не входит
в перечисленный список случаев, избежать ошибки выполнения
программы. Данный случай напоминает поведение второй части
оператора if-else.

switch (player) { //Выбор зависит от значения переменной player.


case 1: //В случае если player=1:

lcd.print("a stone.\0"); // «камень».

break; //Если было попадание в этот случай, выход из оператора switch.


case 2: //В случае если player=2 :
lcd.print("scissors.\0"); // «ножницы».
break;
case 3: //В случае если player=3 :
lcd.print("paper.\0"); // «бумага».
break;
default: //Случай по умолчанию:
lcd.print("something.\0"); // «что-то».
};

28. До конца скетча осталось две команды и одна скобка:

delay(3500);
lcd.clear();
}

Подпрограмма game закончена! Вспомни схемы. Остался последний


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

Подпрограмма keyboard (пульт)


29. Создай новую вкладку с названием keyboard. Теперь у тебя должно
быть четыре вкладки:

54
30. Первая функция, которая понадобится твоему питомцу, — это вывод
информации об окружающей среде. Почему? Конечно, ради пользы!
Существует правильная пословица: «Кто не работает, тот не ест».
Ты, например, трудишься в школе, а питомец… пусть тоже работает
по мере его возможностей.
На вход в качестве аргументов подай показания с датчиков, то есть
некоторое число с плавающей точкой для показаний термометра и
целые — для уровней освещённости и шума.
Функция lcd.print() одновременно может выводить аргумент только
одного типа.

void info(float a, int b, int c) {


lcd.print("\xF8"); //Вывод специального символа — градусника.
lcd.print("Therm:"); //Вывод строки для температуры.
lcd.print(a); //Вывод вещественного числа.
lcd.print("\0"); //Вывод невидимого символа окончания строки.

lcd.setCursor(0, 1); //Перевод каретки на следующую строку.

lcd.print("\xEE"); //Символ лампочки.


lcd.print("Lighting:");
lcd.print(b); //Вывод целого числа.
lcd.print(" lx \0"); //Вывод строки.

lcd.setCursor(0, 2); //Перевод каретки на третью строку (нумерация с 0).

lcd.print("\xED"); //Символ динамика.


lcd.print("Noise level:"); //Уровень шума.
if (c < 300) { //Если уровень низкий, то:
lcd.print("quiet"); // «тихо».
};
if ((c >= 300) && (c < 450)) { //Для средних показателей:
lcd.print("fine"); // «нормально».
};
if (c >= 450) { //Если уровень высокий, то:
lcd.print("loud"); // «шумно».
};
lcd.print("\0");

Добавь питомцу собственное мнение! Чтобы не было так скучно


и формально, используй обозначения уровня как «мнения» питомца
об окружающем мире:

lcd.setCursor(0, 3); //Перевод каретки.


whatDay(a, b, c); //Вызов функции анализа обстановки на основе температуры,
уровня шума и освещённости.
delay(6000); //Пауза, чтобы успеть прочесть.
}

55
31. Свой корм Томо получит заслуженно! На самом деле мы пошутили:
еда всегда заслужена питомцем, особенно живым. Он же дарит тебе
любовь и радость — это и есть его работа.
Функция кормления feed() выглядит следующим образом:

void feed () {
if (satiety < 100) { //Если не сыт, то:
satiety = satiety + 35; //увеличить сытость при кормлении.
}
else { //Иначе (если сыт) будет переедание, а это вредно,
health = health - 5; //уменьшить здоровье.
};
lcd.print("Chomp-chomp-chomp...\0"); //Питомец некультурно чавкает.
proc(); //Проверка на границы показателей (0–100%).
}

32. Здоровье твоего друга может ухудшиться, поэтому надо заранее


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

void tablet () {
if (mood > 80) { //Если настроение хорошее (выше 80%), то питомец согласен
принять лекарство.
health = health + 15; //Повышение здоровья.
lcd.print("Mr-r. I am fine now \0"); // «Мр-р. Я теперь в порядке.»
}
else { //Если настроение плохое, то:
lcd.print("NO!I do not want! \0"); // «НЕТ! Не хочу!»
};

delay(4000);
lcd.clear();
proc();
}

33. Принимать лекарство — кардинальная мера. Лучше не доводить пи-


томца до критического состояния. В этом поможет соблюдение ги-
гиены, например принятие ванны (bath).
Капризный характер проявится и на этом шаге:

void bath() {
if (mood > 50) { /*Если настроение среднее или выше среднего, то он согласен
мыться:*/
health = health + 10; //увеличение здоровья,

56
mood = mood + 10; //улучшение настроения.
lcd.print("*shining like the sun* \0"); // «*Сияет, как солнышко*»
}
else { //Если настроение скверное, то питомец капризничает:
lcd.print("NO!I do not want! \0");// «НЕТ! Не хочу!»
};

delay(4000);
lcd.clear();
proc();
}

34. Сурова жизнь без радостей. В чём радость, друг? В печеньках! До-
бавь функцию передачи своему питомцу виртуального лакомства.
Не забудь, чтобы он тебя поблагодарил за угощение.

void cookie() {
mood = mood + 20; //Улучшение настроения.
satiety = satiety + 5; //Увеличение сытости.
health = health - 5; //Сладкое есть вредно!
lcd.print("Thank You!I like it.\0"); // «Спасибо! Мне нравится.»
delay(4000);
lcd.clear();
proc();
};

35. Кажется, наши предки что-то говорили о методе «кнута и пряника».


У нас пусть будет печенье. Реализуешь первую часть для особо не-
послушных электронных питомцев?

void punishment() { // «Punishment» переводится как «наказание».


mood = mood - 15; //Ухудшение настроения.
lcd.print("*Сrying*\0"); // «*Плачет*».
delay(4000);
lcd.clear();
proc();
};

36. Какую ещё важную информацию надо знать? Показатели питомца!


Пусть они будут выводиться на экран при вызове функции pet().

void pet() {
// Здоровье.
lcd.print("Health: ");
lcd.print(health);
lcd.print("% \0");

lcd.setCursor(0, 1);

57
// Сытость.
lcd.print("Satiety: ");
lcd.print(satiety);
lcd.print("% \0");

lcd.setCursor(0, 2);

//Настроение.
lcd.print("Mood: ");
lcd.print(mood);
lcd.print("% \0");

delay(4000);
lcd.clear();
};

Осталось дописать всего две дополнительные функции, вызываемые


ранее в программе.

37. Начни с функции «мнения» питомца об окружающей среде. Она


будет называться «Какой день?», то есть whatDay.
В качестве аргументов подай показания с датчиков, чтобы питомец
мог сориентироваться.

void whatDay (float therm, int llvl, int sound) {


if (therm > 20.0) { //Если температура выше 20 qC, то
lcd.print("a warm "); // «тёплый».
}
else { //иначе —
lcd.print("a cold "); // «холодный».
};
if (sound < 300) { //Если уровень шума меньше 300 у. е., то
lcd.print("quiet "); // «тихий»,
}
else { //иначе —
lcd.print(" loud "); // «шумный».
};
if (llvl > 200) { //Если уровень освещённости больше 200 лк, то
lcd.print("day"); // «день».
}
else { //иначе —
lcd.print("evening"); // «вечер».
};
}

58
38. Настало время описать функцию, которая вызывалась фактически
в каждой из других функций, — обновление показаний соответствен-
но границам 0–100%. Если показания становятся выше 100% в ре-
зультате твоих действий, их надо понизить до 100%. Нельзя также
допускать отрицательные значения.

void proc(){
//Ограничения сверху:
if (satiety > 100) satiety = 100;
if (mood > 100) mood = 100;
if (health > 100) health = 100;
//Ограничения снизу:
if (satiety <= 0) satiety = 0;
if (mood <= 0) mood = 0;
if (health <= 0) health = 0;
};

Молодец! Ты закончил писать программный код. Теперь дело за малым!

Нажми кнопку , чтобы проверить, не допустил ли ты ошибок.


Исправь их, если они есть.
Если ошибок нет, нажми кнопку . Назови скетч tomodachi.ino,
если сохранение по какой-либо причине не было сделано ранее.
Умница! Ты закончил программировать! Переходим к загрузке и те-
стированию.

59
Этап 7. Загрузка программы
и её тестирование

ШАГ 1. ЗАГРУЗКА ПРОГРАММЫ В МОДУЛЬ ARDUINO UNO

1. Подключи Arduino UNO к компьютеру с помощью USB-кабеля.


Убедись, что программная среда обнаружила устройство.

2. Нажми кнопку , чтобы произвести проверку, скомпилировать и


отправить программу на устройство.

ШАГ 2. ТЕСТИРОВАНИЕ

Программа запустится сразу же после загрузки. Питаться Arduino бу-


дет от компьютера.

1. Убедись, что при включении на экране появилось приветствие.


2. Накрой ладонью датчик освещённости — мордочка кота на экране
должна стать спящей.
3. На ИК-пульте нажми кнопку CH. Убедись, что информация, вы-
веденная на экран, верна. Для этого сравни показания на экране с
таблицей норм освещённости и показаниями домашнего термометра.
4. Проветри помещение или перенеси питомца ближе к отопительному
прибору. Убедись, что показания датчика температуры и показания
уровня освещённости при изменении окружающей среды тоже из-
менились.
5. Проверь показания уровня шума. Поднеси динамик своего смарт-
фона или плеера к датчику шума и включи на полную громкость.
Должна появиться недовольная мордочка, жалующаяся на шум.
6. Кнопкой 0 на пульте вызови на экран информацию о состоянии
питомца. Затем нажми кнопку «+». Снова проверь информацию.
Показание сытости должно было измениться.
Проделай аналогичные манипуляции с командами «Ванна» (Prev),
«Лакомство» (Next), «Наказание» («–») и «Лекарство» (EQ). Про-
верь, насколько изменяются показания на экране или на мониторе
последовательного порта после каждой команды.

60
7. Запусти режим игры кнопкой Play. Проверь, правильно ли Томо
отображает победителя и изменяется ли показатель его настроения
в случае победы, проигрыша и ничьей.

8. Оставь питомца на некоторое время одного. Засеки время. Затем


проверь показания сытости, настроения и здоровья. Они должны
уменьшаться на 1% каждые 10 секунд.

Что-то не получается? Не расстраивайся. Возможно, ты пропустил


знак или произошла ошибка в среде Arduino IDE. Проверь код и по-
втори попытку.
Работает? Ура! Данные и кошачья мордашка выводятся на экран!
Теперь у тебя есть собственный электронный питомец! Не забывай
кормить его, давать лекарство, если он заболеет, и ухаживай за ним.
И не забывай играть, ведь это нравится вам обоим :)
Ну как, ты уже почувствовал себя всемогущим творцом кибернети-
ческих животных? Программирование — это мир, в котором тебя ничто
не ограничивает. Да-да, ты можешь совершенствовать своего питомца
до бесконечности или до тех пор, пока он не возглавит восстание ма-
шин. Чего же ты ждёшь?
Вперёд!

61
Этап 8. Совершенствование
игры

В начале книги мы упоминали каомодзи — японские символьные смай-


лики. Во время программирования ты заново познакомился с люби-
мой во всём мире игрой «Камень, ножницы, бумага», действия которой
производятся с помощью трёх жестов рукой. Твой электронный друг
играет в неё по собственным правилам, немного отличающимся от при-
нятых, чтобы упростить алгоритм.
Эта игра не была изначально японской. В Страну восходящего
солнца она попала лишь в XVIII веке от соседа — Китая. Именно
в китайской, оригинальной версии считалка, по которой необходимо
было «выкидывать» жест, оканчивалась на знакомое всем с детства
«Цу-е-фа!», по смыслу аналогичное японскому: «Janken-poi!»
В нашей стране в эту игру были введены дополнительные пред-
меты-жесты: карандаш, огонь, вода и бутылка лимонада. Кроме того,
названия и окончания считалки тоже значительно изменялись в зави-
симости от региона нашей необъятной Родины. Если вы хотите узнать,
откуда приехал новичок, спросите его, как называлась игра там, где он
жил раньше, или же попросите сказать окончание детской кричалки
про «жадину-говядину». Возможно, даже твои родители знают разные
версии.
Вернёмся к нашему японскому tomodachi. Ты можешь научить его
(и себя) другим вариантам игры категории «Камень, ножницы, бумага»,
например «Лисья игра» или «Игра мушки» (дословно «Игра насекомо-
го»). В первой игре, появившейся в 1774 году и наиболее популярной
среди трёхжестовых игр, сюжет основан на традиционном японском
эпосе: сказочная лиса-оборотень может съесть деревенского старосту, а
староста может навредить охотнику, который в свою очередь охотится
на проворную лису.
«Игра мушки» — самая старая из этих игр, именно она пришла из
Китая. В ней описываются непростые гастрономические взаимоотноше-
ния слизняка, лягушки и змеи. Положение пальцев в жестах ты мо-
жешь найти на рисунке 1809 года (рис. 5). Змея ест лягушку, лягушка
питается слизняком, который ядовит и способен убить змею. Изначаль-
но в игре была ядовитая многоножка, которая по недоразумению была
заменена слизняком.

62
Рис. 5. Жесты в «Игре мушки». Слева направо:
слизняк, лягушка, змея (взято с сайта wikipedia.org)

Ты можешь сам придумать жестовую игру. Теперь тебе всегда будет


с кем в неё сыграть, ведь рядом твой электронный друг!
Можно реализовать и другие виды игр! Вспомни свою любимую
игру из детства и напиши заготовку для алгоритма — порядок действий
и условия выигрыша. Сделай их алгоритмом, определяемым един-
ственным образом и со строго определённым значением или отноше-
нием переменных. После этого останется лишь перевести алгоритм на
язык Arduino — Wiring, и ты сможешь играть со своим новым другом
бесконечно.

ИГРА _______________________________

Номер шага Действие

63
А теперь…
Ухаживай за своим электронным питомцем. Пусть он будет всегда в
хорошем настроении, здоровый и сытый. Постарайся, чтобы он не бо-
лел. Если твой электронный питомец будет счастлив и сыт всегда, твои
родители убедятся, что ты ответственный человек и тебе можно заве-
сти живого домашнего любимца!
А может быть, ты захочешь остаться с электронным другом. Допи-
ши ему новые игры, подари алгоритмы искусственного интеллекта (они
проще, чем кажется), усовершенствуй своего котёнка!

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

64
Содержание

Здравствуйте! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Дорогой друг! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

Электронные и виртуальные питомцы . . . . . . . . . . . . . . . . . . 5

Этап 1. Общий план действий . . . . . . . . . . . . . . . . . . . . . . . 10

Этап 2. Сборка электронного питомца . . . . . . . . . . . . . . . . . . 12


Шаг 1. Сборка основы устройства . . . . . . . . . . . . . . . . . . . . . . . 12
Шаг 2. Подключение датчика освещённости и термометра . . . . . . . 14
Шаг 3. Подключение ИК-приёмника . . . . . . . . . . . . . . . . . . . . . 15
Шаг 4. Подключение датчика уровня шума . . . . . . . . . . . . . . . . . 16
Шаг 5. Подключение экрана . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

Этап 3. Установка программного обеспечения . . . . . . . . . . . . . 22

Этап 4. Первый запуск и проверка оборудования . . . . . . . . . . . 24

Этап 5. Изготовление корпуса устройства . . . . . . . . . . . . . . . . 29


Шаг 1. Изготовление формы из папье-маше . . . . . . . . . . . . . . . . 29
Шаг 2. Вырезание отверстий в корпусе . . . . . . . . . . . . . . . . . . . . 31
Шаг 3. Декорирование корпуса . . . . . . . . . . . . . . . . . . . . . . . . . 32

Этап 6. Создание программы для устройства . . . . . . . . . . . . . . 33


Шаг 1. Запуск программного обеспечения Arduino IDE . . . . . . . . . 37
Шаг 2. Составление программы для питомца . . . . . . . . . . . . . . . . 38

Этап 7. Загрузка программы и её тестирование . . . . . . . . . . . . . 60


Шаг 1. Загрузка программы в модуль Arduino UNO . . . . . . . . . . . 60
Шаг 2. Тестирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

Этап 8. Совершенствование игры . . . . . . . . . . . . . . . . . . . . . 62

А теперь… . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
До новых встреч! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Минимальные системные требования определяются соответствующими требоваң
ниями программ Adobe Reader версии не ниже 11ңй либо Adobe Digital Editions
версии не ниже 4.5 для платформ Windows, Mac OS, Android и iOS; экран 10"

Учебное электронное издание


Серия: «РОБОФИШКИ»

Салахова Алёна Антоновна

КОНСТРУИРУЕМ РОБОТОВ НА ARDUINO○ . R

ЭЛЕКТРОННЫЙ ДОМАШНИЙ ПИТОМЕЦ


Для детей старшего школьного возраста
Ведущий редактор Т. Г. Хохлова
Руководитель проекта от издательства А. А. Елизаров
Научный консультант канд. пед. наук Н. Н. Самылкина
Ведущий методист В. В. Тарапата
Художники В. А. Прокудин, Я. В. Соловцова, И. Е. Марев, Ю. Н. Елисеев
Фотосъемка: И. А. Федянин
Технический редактор Т. Ю. Федорова
Корректор И. Н. Панкова
Компьютерная верстка: Е. Г. Ивлева
Подписано к использованию 27.04.18.
Формат 210×260 мм
Издательство «Лаборатория знаний»
125167, Москва, проезд Аэропорта, д. 3
Телефон: (499) 157ң5272
eңmail: info@pilotLZ.ru, http://www.pilotLZ.ru

Вам также может понравиться