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

Практические методы организации связей между физическими объектами

M akin g
T h in g s T a lk

2-еиздание
Arduino,
датчики и сети
обучение
для связи устройств на практике
33 ПРОЕКТА
СОЕДИНЕНИЯ
ГАДЖЕТОВ
МЕЖДУ СОБОЙ
И С ВНЕШНЕЙ
СРЕДОЙ

Маке:
m akezine.com
УДК 004.4
ББК 32.973.26
И26

ИгоТ.
И26 Arduino, датчики и сети для связи устройств: Пер. с англ. — 2-е изд. — СПб.: БХВ-Петербург, 2015. —
544 с.: ил.

ISBN 978-5-9775-3566-3

Рассмотрены 33 проекта на основе микроконтроллерной платы Arduino, в которых показано, как сде­
лать, чтобы электронные устройства могли обмениваться между собой данными и реагировать на коман­
ды. Показано, как изменить настройки домашнего кондиционера, «позвонив ему» со своего смартфона;
как создавать собственные игровые контроллеры, взаимодействующие по сети; как использовать устрой­
ства ZigBee, Bluetooth, инфракрасное излучение и обычное радио для беспроводного получения инфор­
мации от различных датчиков и др. Рассмотрены языки программирования Arduino, Processing и PHP.
Для широкого круга читателей

УДК 004.4
ББК 32.973.26

Группа подготовки издания:


Главный редактор Екатерина Кондукова
Зам. главного редактора Игорь Шишигин
Зав. редакцией Екатерина Капалыгина
Перевод с английского Сергея Таранушенко
Редактор Григорий Добин
Компьютерная верстка Людмилы Гауль
Корректор Зинаида Дмитриева
Оформление обложки Марины Дамбиевой

Authorized Russian translation of the English edition of Making Things Talk, 2nd Edition (ISBN 978-1-449-39243-7) © 2011 O'Reilly Media,
Inc. published by Maker Media, Inc.
This translation is published and sold by permission of O'Reilly Media, Inc., which owns or controls all rights to sell the same.

Авторизованный русский перевод английской редакции книги Making Things Talk, 2nd Edition (ISBN 978-1-449-39243-7) © 2011 O'Reilly
Media, изданной Maker Media, Inc. Все права защищены.
Перевод опубликован и продается с разрешения O'Reilly Media, Inc., собственника всех прав на публикацию и продажу издания.

Подписано в печать 30.11.14.


Формат 84x1081Аб. Печать офсетная. Уел. печ. л. 57,12.
Тираж 1500 экз. Заказ № 609
«БХВ-Петербург», 191036, Санкт-Петербург, Гончарная ул., 20.
Первая Академическая типография «Наука»
199034, Санкт-Петербург, 9 линия, 12/28

ISBN 978-1-449-39243-7 (англ.) © 2011 Maker Media, Inc.


ISBN 978-5-9775-3566-3 (рус.) © Перевод, оформление, издательство «БХВ-Петербург», 2015
ОГЛАВЛЕНИЕ

Предисловие............................................................................................................ 9
Для кого предназначена эта книга?........................................................................................................ 10
Что вам нужно знать?................................................................................................................................11
Содержание книги....................................................................................................................................12
Покупка деталей........................................................................................................................................13
Использование примеров кода...............................................................................................................14
Использование примеров схем...............................................................................................................14
Благодарности за первое издание.......................................................................................................... 15
Примечания ко второму изданию...........................................................................................................18

Глава 1. Средства................................................................................................... 23
Все начинается с прикосновения............................................................................................................ 24
Все дело в импульсах............................................................................................................................... 25
Компьютеры всех видов и размеров...................................................................................................... 25
Хорошие привычки..................................................................................................................................26
Инструментарий....................................................................................................................................... 28
Работа с командной строкой................................................................................................................... 39
Работа с осциллографом..........................................................................................................................66
Важность физического интерфейса........................................................................................................ 67

Глава 2. Простейшая сеть.....................................................................................69


Компоненты для проектов этой главы.................................................................................................... 70
Уровни согласования............................................................................................................................... 72
Установка соединения на нижних уровнях............................................................................................ 74
Отправка сообщений: уровень приложений........................................................................................80
Проект 1. Управление яркостью светодиода с клавиатуры.......................................................... 80
Сложные преобразования.......................................................................................................................84
Проект 2. «Мартышкин пинг-понг» (Monski Pong).........................................................................84
Управление потоком данных.................................................................................................................. 97
Проект 3. Беспроводной «Мартышкин пинг-понг»........................................................................99
Проект 4. Переговоры по Bluetooth.............................................................................................. 104
Заключение.............................................................................................................................................108

Глава 3. Более сложная се ть ...............................................................................111


Компоненты для проекта этой главы....................................................................................................112
Сетевые топологии и сетевые адреса................................................................................................... 113
Аппаратные и сетевые адреса............................................................................................................... 115
Клиенты, серверы и протоколы управления связью...........................................................................120
Проект 5. Сетевой кот (Cat Cam).....................................................................................................128
Заключение.............................................................................................................................................152
6 Оглавление

Глава 4.«Глянь, мама, здесь нет компьютера!»


Микроконтроллеры в Интернете...................................................................... 155
Компоненты для проектов этой главы.................................................................................................. 157
Введение в сетевые модули......................................................................... .........................................158
Проект 6. Привет, Интернет! Веб-сервер цвета дня....................................................................160
Приложение встроенного сетевого клиента........................................................................................169
Проект 7. Сетевой измеритель качества воздуха........................................................................ 169
Инструменты для программирования и диагностирования встроенных модулей..........................182
Заключение.............................................................................................................................................189

Глава 5. Связь в режиме реального (почти) времени.................................... 191


Компоненты для проекта этой главы................................................................................................... 192
Интерактивные системы и цепи обратной связи................................................................................ 194
Протокол TCP: сокеты и сеансы............................................................................................................. 195
Проект 8. Сетевой пинг-понг......................................................................................................... 196
Клиенты................................................................................................................................................... 198
Заключение.............................................................................................................................................221

Глава б. Беспроводная свя зь .............................................................................223


Компоненты для проектов этой главы.................................................................................................. 224
Почему не вся связь беспроводная?.................................................................................................... 227
Два типа беспроводной связи: инфракрасная и радио...........................................................................228
Проект 9. Инфракрасное управление цифровой камерой........................................................ 233
Принцип работы радио......................................................................................................................... 236
Проект 10. Дуплексная радиосвязь...............................................................................................239
Проект 11. Приемопередатчики Bluetooth...................................................................................253
Выбор и приобретение радиоустройств.............................................................................................. 264
А как насчет Wi-Fi?.................................................................................................................................. 265
Проект 12. Привет, Wi-Fi!................................................................................................................ 265
Диагностирование Wi-Fi.........................................................................................................................267
Заключение.............................................................................................................................................269

Глава 7. Бессеансовые сети.................................................................................271


Компоненты для проектов этой главы.................................................................................................. 272
Сеансы и сообщения.............................................................................................................................. 275
Кто там? Широковещательные сообщения.......................................................................................... 276
Запросы для радиомодулей ХВее......................................................................................................... 280
Проект 13. Предупреждение о токсических испарениях в мастерской.....................................282
Направленные сообщения.................................................................................................................... 298
Проект 14. Беспроводная ретрансляция данных солнечной панели.........................................300
Заключение.............................................................................................................................................310

Глава 8. Как узнать местонахождение (почти) чего угодно......................... 313


Компоненты для проектов этой главы.................................................................................................. 314
Сетевое и физическое местонахождение........................................... 317
Определение расстояния............................................. 322
Проект 15. Пример инфракрасного дальномера............................. 323
Проект 16. Пример ультразвукового дальномера....................................................................... 325
Оглавление 7

Проект 17. Определение уровня полученного сигнала с помощью радиомодуля ХВее........ 328
Проект 18. Определение уровня полученного сигнала с помощью радиомодуля Bluetooth.. 331
Определение местонахождения методом трилатерации...................................................................333
Проект 19. Чтение последовательного протокола GPS................................................................334
Определение направления.................................................................................................................... 343
Проект 20. Определение направления с помощью цифрового компаса...................................343
Проект 21. Определение положения в пространстве с помощью акселерометра................... 347
Заключение.............................................................................................................................................355

Глава 9. Идентификация.....................................................................................357
Компоненты для проектов этой главы.................................................................................................. 358
Физическая идентификация.................................................................................................................. 362
Проект 22. Распознавание цветов с помощью веб-камеры........................................................ 364
Проект 23. Обнаружение лиц с помощью веб-камеры................................................................369
Проект 24. Распознавание двумерных штрихкодов с помощью веб-камеры........................... 373
Проект 25. Чтение тегов RFID в Processing.....................................................................................379
Проект 26. RFID и бытовая автоматизация....................................................................................382
Проект 27. Твиты от RFID.................................................................................................................391
Сетевая идентификация.........................................................................................................................416
Проект 28. Геокодирование по IP-адресу..................................................................................... 418
Заключение.............................................................................................................................................423

Глава 10. Сети мобильной телефонной связи и физический мир............... 425


Компоненты для проектов этой главы.................................................................................................. 426
Одна большая сеть..................................................................................................................................428
Проект 29. Возвращение сетевого кота (Cat Cam 2)..................................................................... 432
Проект 30. Телефонируем термостату...........................................................................................453
Интерфейсы на основе текстовых сообщений.................................................................................... 461
Приложения для операционных систем мобильных телефонов....................................................... 464
Проект 31. Мобильный регистратор личных биометрических данных.....................................470
Заключение.............................................................................................................................................485

Глава 11. Снова о протоколах............................................................................487


Компоненты для проектов этой главы.................................................................................................. 488
Как установить соединение?................................................................................................................. 489
Текст или двоичный код?....................................................................................................................... 493
Протокол MIDI.........................................................................................................................................496
Проект 32. Развлекаемся с MIDI.................................................................................................... 497
Протокол DMX512 .................................................................................................................................. 503
Структура и синтаксис текстовых протоколов..................................................................................... 504
Принцип REST..........................................................................................................................................507
Проект 33. Развлекаемся с REST.................................................................................................... 510
Заключение.............................................................................................................................................513

Приложение. Где брать компоненты и прочее?.............................................515


Компоненты.............................................................................................................................................516
Аппаратное обеспечение...................................................................................................................... 521
Программное обеспечение...................................................................................................................529

Предметный указатель.......................................................................................533
ПРЕДИСЛОВИЕ 4i
Несколько лет тому назад Нил Гершенфельд
(Neil Gershenfeld) написал толковую книгу,
названную им «Когда вещи начинают думать».
В ней он рассматривает мир, в котором обыденные вещи
и устройства наделены вычислительными
способностями, то есть мир сегодняшний.
В частности, там обсуждаются последствия обмена между
такими устройствами информацией о наших
с вами личностях, возможностях и действиях. Книга
хорошая, но ее название, на мой взгляд, — неудачное.
Я бы назвал ту книгу «Когда вещи начинают
общаться», поскольку, давайте признаем это, даже
самые захватывающие идеи чего-либо стоят лишь
тогда, когда их обсуждаешь с кем-то другим.
И моя книга — «Чтобы вещи общались» — рассказывает,
как создавать вещи, способные общаться друг
с другом, и как предоставить людям возможность
использовать эти вещи для общения между собой.
10 Предисловие

Компьютерные специалисты вот уже около двух де­ В реальном мире мы окружены разного рода элект­
сятков лет используют термин объектно-ориенти­ ронными объектами: радиочасами, тостерами, мо­
рованное программирование для обозначения спо­ бильными телефонами, плеерами, детскими (и не
соба разработки программного обеспечения, в кото­ только детскими) игрушками и т. п. Чтобы самому
ром программы и подпрограммы рассматриваются создать полезное электронное устройство, требуют­
как объекты. Подобно физическим объектам, они ся серьезные усилия и значительный объем знаний,
обладают свойствами и поведением, унаследован­ а чтобы обеспечить подобные устройства возмож­
ными ими от прототипов — объектов, от которых ностью общаться друг с другом, может понадобить­
они происходят. Каноническая форма любого про­ ся знаний еще вдвое больше. Но так быть не должно.
граммного объекта — код, описывающий его тип. И сейчас появилась возможность собирать электрон­
Программные объекты позволяют с легкостью со­ ные устройства из простых модулей. При условии,
четать их между собой различными новыми спо­ что вы разбираетесь в интерфейсах таких модулей,
собами. Программный объект можно использовать можно собрать из них что угодно. Этот подход мож­
раз за разом, если известен его интерфейс — на­ но рассматривать как объектно-ориентированное
бор свойств и методов, посредством которых его оборудование1. Основным условием работоспособ­
создатель позволяет осуществлять к нему доступ ности названного подхода является понимание
(а также, если доступна соответствующая справоч­ того, как устройства взаимодействуют друг с дру­
ная информация). Способ, которым объект делает гом, — независимо от конкретного устройства,
то, что он делает, не играет роли, при условии, что будь то тостер, программа электронной почты
на выходе всегда получается один и тот же резуль­ на вашем ноутбуке или сетевая база данных. Все
тат. Программные объекты наиболее эффективны такие компоненты можно свести воедино, если
тогда, когда они понятны применяющему их разра­ определить, каким способом они смогут общаться.
ботчику и хорошо взаимодействуют с другими про­ Эта книга и представляет собой руководство по
граммными объектами. ряду способов, методов и инструментов, обеспечи­
вающих реализацию такого общения.

1 В оригинале: «object-oriented hardware».

и Для кого п р ед н азн ачена эта книга?


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

Основными инструментами, потребными нам для десятилетие микроконтроллеры и средства для их


изучения материала книги, будут персональные ком­ программирования прошли путь от устройств для
пьютеры, веб-серверы и микроконтроллеры — кро­ посвященных к распространенным, легко исполь­
шечные компьютеры, встроенные во все возраста­ зуемым инструментам. С устройствами, которые
ющее число повседневных устройств. За последнее десять лет тому назад ставили в тупик аспирантов,
Предисловие 11

сегодня легко обращаются учащиеся начальных тите, чтобы ваше устройство могло обмениваться
школ. В течение этого времени мы с моими колле­ информацией с другими подобными устройствами,
гами обучали людей с самым разнообразным об­ созданными вами или другими самоделкиными,
разованием и родом занятий (очень немногие из данная книга вам в этом поможет. Она также будет
которых были программистами) применению этих полезной и для программистов со знанием сетей
устройств для расширения диапазона физических и веб-служб, которые хотят приобщиться к програм­
действий, которые компьютеры могут восприни­ мированию встроенных сетей.
мать и интерпретировать и на которые способны
реагировать. Но если вы из тех, кому нравится разбираться во
всех тонкостях технологий, в этой книге вы, воз­
В последнее время люди, использующие микро­ можно, не найдете того, чего ищете. В ней нет под­
контроллеры в своих устройствах, проявляют все робных примеров кода для Bluetooth или стеков
большее желание наделить эти устройства возмож­ TCP/IP, а также диаграмм цепей для микросхем
ностями не только воспринимать окружающий мир контроллеров Ethernet. Рассматриваемые в книге
и управлять им, но также сообщать другим подоб­ компоненты устройств являют собой компромисс
ным устройствам о том, что они воспринимают между простотой, гибкостью и стоимостью. Они
и чем управляют. Если вы скомпоновали что-либо как раз и воплощают ранее обозначенное объектно-
на базе BASIC Stamp2 или Lego Mindstorms3 и хо­ ориентированное оборудование, требуя сравнитель­
но небольшого объема проводных соединений и ко­
2 Микроконтроллер с небольшим специализированным интер­ да. То есть предназначены для того, чтобы позво­
претатором BASIC (PBAIC), встроенным в ROM.
3 LEGO Mindstorms — конструктор (набор сопрягаемых дета­
лить вам достичь конечной цели — наделить вещи
лей и электронных блоков) для создания программируемого ро­ возможностью общаться между собой — наиболее
бота. (http://ru.wikipedia.org/wiki/LEGO_Mindstorms). быстрым и легким способом.

(кй Что вам нуж но знать?


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

Многие специалисты, начав программировать ми­ чтобы побыстрее добраться до более интересного
кроконтроллеры, творят чудеса с несколькими дат­ для вас материала.
чиками и парой сервоприводов, но при этом могут
иметь весьма ограниченный опыт в области взаи­ Если вы никогда ранее не имели дело с микрокон­
модействия между микроконтроллером и другими троллерами, то прежде, чем приступать к работе
программами на персональном компьютере. Точно с этой книгой, вам следовало бы получить опреде­
так же, многие опытные сетевые и мультимедиа ленные начальные знания в означенной области. Для
программисты никогда не экспериментировали ни этого рекомендуется прочитать мою предыдущую
с каким оборудованием, включая микроконтрол­ книгу «Physical Computing: Sensing and Controlling
леры. Если вы принадлежите к какой-либо из упо­ the Physical World»4 (издательство Thomson), ко­
мянутых категорий, эта книга для вас. Поскольку торую я написал совместно с Даном О’Саливаном
материал книги предназначен для читателей с са­ (Dan O'Sullivan). В этой книге дается введение
мым разнообразным опытом, некоторые темы, в основы электроники, микроконтроллеров и ди­
в зависимости от вашего личного опыта, могут по­ зайна физического взаимодействия.
казаться вам чересчур простыми. В таком случае 4 «Физические вычисления. Восприятие и управление матери­
пропускайте материал, с которым вы уже знакомы, альным миром».
12 Предисловие

Кроме того, вам понадобятся базовые знания про­ реализовывать с ее помощью весьма сложные про­
граммирования. Если у вас нет никакого опыта екты. Среда Processing используется в этой книге в
в этой области, то я рекомендую ознакомиться со тех случаях, когда требуется выполнять программи­
средой программирования Processing, информа­ рование в графическом интерфейсе.
цию о которой можно найти на веб-сайте www.
processing.org. Там же можно загрузить и саму сре­ Книга содержит примеры кода на нескольких язы­
ду и сопутствующие ей инструменты и материалы. ках программирования. Эти примеры достаточно
Среда программирования Processing достаточно простые, так что, если вам не подходит язык, на
простая, чтобы в ней обучались программированию котором они написаны, с помощью комментариев
люди, которые никогда раньше этим не занимались, в коде вы можете переписать их на язык, с которым
но в то же самое время достаточно мощная, чтобы вам более удобно работать.

м Сод ерж ание книги


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

• Глава 1. Здесь рассматриваются основные ин­ программ для отправки через Интернет данных
струменты программирования, используемые о физических действиях у вас дома.
в книге, и приводится пример программы «Здрав­
ствуй, мир!» для каждого из них. • Глава 4. Создаем первое встроенное устрой­
ство. Получаем дополнительный опыт по под­
• Глава 2. Введение в основные базовые понятия, ключению к Сети с помощью средств консоли
необходимые для придания вещам способности командной строки, а также подключаем микро­
общения друг с другом. Рассматриваются харак­ контроллер к веб-серверу, используя настольный
теристики, которые должны быть оговорены компьютер или ноутбук в качестве посредника.
прежде всего, а также показано, как разделение
этих понятий в уме помогает в поиске и устране­ • Глава 5. Следующий шаг в изучении подклю­
нии проблем. В качестве примера взаимодейст­ чений к Сети — рассмотрение сокетных соеди­
вия, обеспечиваемого посредством модема, нений, которые позволяют более длительное
приведены инструкции по созданию простого взаимодействие. Здесь мы напишем серверную
проекта одноранговой последовательной связи программу, к которой можно подключиться
между микроконтроллером и персональным с любого устройства, имеющего доступ в Сеть.
компьютером на основе радиоканала Bluetooth. Подключение к этой программе осуществляется
Предоставляется информация о протоколах дан­ как из командной строки, так и с микроконтрол­
ных, модемных устройствах и схемах адресации. лера, — чтобы научиться понимать, как разные
типы устройств могут подключаться друг к дру­
• Глава 3. Введение в более сложную сеть — гу через один и тот же сервер.
Интернет. Обсуждаются устройства, необходи­
мые для ее построения, а также основные вза­ • Глава 6. Введение в беспроводную связь. Пре­
имодействия между этими устройствами. Рас­ доставляются некоторые характеристики беспро­
сматриваются сообщения, лежащие в основе водной связи, включая ее возможности и огра­
некоторых из наиболее распространенных про­ ничения. Создаем несколько небольших проек­
цедур, выполняемых ежедневно в Интернете, тов, позволяющих сказать «Здравствуй, мир!»
и приводятся инструкции по отправке таких со­ через эфир несколькими разными способами.
общений. Описано создание первого комплекта
Предисловие 13

• Глава 7. Рассматривается подход к реализации • Глава 9. Рассматривается вопрос идентифика­


связи, существенно отличающийся от исполь­ ции в физическом и сетевом пространстве. Из­
зования сокетов, рассмотренных в главе 5. Этот лагаются несколько методов для генерирова­
подход использует управляемые сообщения­ ния однозначных сетевых идентификаторов на
ми протоколы — такие как протокол 1ЮР для основе физических характеристик. Некоторое
Интернета или ZigBee и 802.15.4 для беспровод­ внимание уделено тому, как определять характе­
ных сетей. В отличие от модели клиент-сервер, ристики сетевых устройств.
которой посвящены предыдущие главы, здесь
мы учимся обмениваться информацией между • Глава 10. Рассмотрены сети мобильной теле­
одноранговыми сетевыми объектами по одному фонной связи, поясняется, что можно делать
сообщению за раз. сейчас с мобильными телефонами и телефон­
ными сетями.
• Глава 8. Рассмотрены несколько инструментов
для определения местонахождения предметов • Глава 11. Представлен более подробный обзор
в физическом пространстве (геолокации), при­ разных типов протоколов, рассмотренных в этой
ведены некоторые размышления о взаимосвя­ книге, с описанием инфраструктуры, потребной
зи между физическим расположением объекта для их дальнейшего использования.
и сетевыми взаимодействиями.

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

Jameco (http://jameco.com), Digi-Key (www.digikey. с кем-либо о заказываемых деталях и получить


com) и Famell (www.farnell.com) — розничные по­ о них как можно больше информации. Скорей всего,
ставщики деталей электроники, предлагающие во на другом конце телефонной линии у большинства
многом одинаковый ассортимент деталей. А такие розничных поставщиков деталей найдутся люди,
поставщики, как Maker Shed (www.makershed.com), которые будут рады вам помочь. Номера телефонов
SparkFun (www.sparkfun.com) и Adafruit (http:// в приложении представлены для тех поставщиков,
adafruit.com), предлагают специализированные для которых они имелись.
компоненты, наборы и пакеты для быстрой и лег­
кой реализации популярных проектов. Полный От редакции русского издания
список поставщиков дается в приложении. Если не­
В России достаточно обширный ассортимент элек­
обходимо заменить какую-либо деталь, которая вам
тронных деталей, компонентов, оборудования и
хорошо известна, делайте это без колебаний.
инструментов предлагается фирмами «Амперка»
Учитывая, что покупка деталей через Интернет (www.amperka.ru), «Линуксцентр» (www.linuxcenter.
не представляет никаких трудностей, вы можете ги) и «Чип и Д ип» (http://chipdip.ru).
посчитать достаточным общаться с продавцами
исключительно через средства их веб-сайтов. Тем Бонус о т ф ^
не менее, не стоит пренебрегать возможностью де­ Специально для читателей этой книги «Амперка»
лать это по телефону. Особенно в случаях, когда предлагает особое кодовое слово МТТ14, которое
у вас отсутствуют какие-либо знания в области ^даст вам скидку при оформлении заказа онлайн. ^
определенного проекта, будет полезным поговорить
14 Предисловие

М И спо л ьзо ван и е пр и м ер ов кода


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

Например, использование нескольких фрагментов имя автора, издателя и ISBN книги. Например:
кода из этой книги в своей программе разрешения «Making Things Talk: Practical Methods for Connecting
не требует, но для продажи или распространения Physical Objects, by Tom Igoe. Copyright 2011
диска CD-ROM с примерами из книг издательства O’Reilly Media, 978-1-4493-9243-7»5. Если вы по­
O'Reilly разрешение требуется. Цитирование теста дозреваете, что использование вами примеров кода
из этой книги, включая код, разрешения не требует, может выходить за рамки принципа добросовестно­
но включение значительного объема кода из книги го использования или данных ранее разрешений, то
в документацию своего продукта требует разре­ можете уточнить этот вопрос электронной почтой
шения. по адресу peraiissions@oreilly.com.
Мы будем благодарны за предоставление ссылки на
источник при цитировании материалов из этой кни­ 5 Выходные данные настоящего перевода этой книги на русский

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

йй И сп о л ьзо ван и е п р и м ер о в схем


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

Впрочем, хотя определенный дух исследования Необходимо также иметь в виду, что проекты и схе­
приветствуется, все же необходимо соблюдать мы в этой книге предназначены только для познава­
должную предосторожность и не предпринимать тельных целей. Такие частности, как регулирование
никаких рискованных действий при реализации мощности, автоматический сброс, экранирование
проектов из книги. Каждый набор инструкций от радиопомех и подобные моменты, которые необ­
создавался с учетом требований безопасности — ходимо учитывать, чтобы электронное устройство
игнорируйте инструкции по безопасности на свой можно было сертифицировать для рынка, в этой
собственный страх и риск. Обязательно убедитесь книге не рассматриваются. Если вы хотите разра­
в том, что у вас имеется достаточный уровень зна­ ботать продукт для использования кем-то еще, кро­
ний и опыта для работы над проектом безопасным ме вас самих, полагаться только на информацию из
образом. этой книги будет недостаточным.
Предисловие 15

й£ Б лагод арн ости за п ер во е издание


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

Я свыше десяти последних лет работал в Программе важными знаниями, и его идеи весьма значительно
интерактивных телекоммуникаций6 на факульте­ повлияли на книгу. Дан Шифман перечитал много
те искусств Tisch7 Нью-Йоркского университе­ черновиков книги и дал по ним полезные отзывы.
та — месте, где мне посчастливилось участвовать Он также подсказал мне много отличных примеров
в оживленном и задушевном общении со многи­ кода.
ми талантливыми людьми. И книга моя основана
на наработках курса «Сетевые объекты», который Мои коллеги Марианна Петит (Marianne Petit),
я преподавал там в течение нескольких лет. Я наде­ Нэнси Хэкинджер (Nancy Heckinger) и Жан-Марк
юсь, что изложенные в ней идеи представляют дух Гутье (Jean-Mark Gauthier) поддерживали меня на
этого заведения и смогут передать вам мое чувство протяжении всей работы над книгой, ободряя и во­
удовлетворенности от работы в нем. одушевляя, подменяя меня на работе при необхо­
димости и предоставляя вдохновляющий пример
Основатель факультета Ред Бёрнз (Red Bums) ока­ своей собственной работой.
зывает мне поддержку с самого начала моей работы
в этой области. Она потакает заоблачным полетам Сделать возможной эту книгу помогли также и
моей фантазии, но, когда требуется, решительно все остальные члены преподавательского состава
возвращает меня на землю. Она проверяет каждый Программы интерактивных телекоммуникаций.
мой проект, чтобы удостовериться, что я использую В частности, Джордж Агудоу (George Agudow),
технологию не ради самой технологии, но для того, Эдуард Гордон (Edward Gordon), Мидори Ясуда
чтобы с ее помощью предоставлять людям новые (Midori Yasuda), Меган Демарест (Megan Demarest),
возможности. Нэнси Льюис (Nancy Lewis), Роберт Райан (Robert
Ryan), Джон Дуэйн (John Duane), Марлон Иване
Мой коллега Дан О’Саливан, который сейчас воз­ (Marlon Evans), Тони Ценг (Tony Tseng) и Глория
главляет программу, познакомил меня с физически­ Сед (Gloria Sed) стоически выносили мои безумства
ми вычислениями, а затем великодушно разрешил по части физических вычислений и сетевых объек­
мне совместно с ним преподавать эту дисциплину тов и делали возможной мою работу, работу других
и формировать ее роль в Программе интерактив­ членов преподавательского состава, а также и сту­
ных телекоммуникаций. Он замечательный со­ дентов. Исследователи Карлин Mo (Carlyn Maw),
ветник и сотрудник и постоянно давал мне советы Тод Голубек (Todd Holoubek), Джон Шиммель (John
и оценивлл мою работу. Большинство глав этой Schimmel), Дория Фэн (Doria Fan), Давид Нолен
книги берут начало в длинных беседах с Даном. Их (David Nolen), Питер Керлин (Peter Kerlin) и Майкл
отражение прослеживается по всей книге, что толь­ Ольсон (Michael Olson) в течение нескольких по­
ко сделало ее лучше. следних лет помогали преподавательскому составу
и студентам реализовать идеи, под влиянием кото­
Клэй Ширки (Clay Shirky), Дэниель Розин (Daniel рых были созданы проекты, вошедшие в эту кни­
Rozin) и Дан Шифман (Dan Shiftman) также тесно гу. Преподаватели Патрик Дуайер (Patrick Dwyer),
сотрудничали со мной в этом проекте. Клэй бла­ Майкл Шнайдер (Michael Schneider), Грег Шакар
госклонно наблюдал, как в моем офисе вырастали (Greg Shakar), Скотт Фицджеральд (Scott Fitzgerald),
кучи деталей, и любезно отрывался от своей соб­ Джэми Аллен (Jamie Allen), Шан Вэн Эвери (Shawn
ственной работы, чтобы выразить мнение о моих Van Every), Джеймс Ту (James Tu) и Раффи Крикорян
идеях. Дэниель Розин также делился ценными (Raffi Krikorian) использовали на своих уроках ин­
6 В оригинале: «Interactive Telecommunications Program». струменты из этой книги или предоставили свои
7 В оригинале: «Tisch School of the Arts». методики для проектов, изложенных в ней.
16 Предисловие

Студенты Программы интерактивных телекомму­ не пострадало ни одно животное, хотя одно из них
никаций расширили границы возможного в этой пришлось задабривать с помощью кошачьей мяты.
области, и их работа отражена во многих проектах.
В конкретных случаях я называю имена, но, в об­ Кэйси Рис (Casey Reas) и Бен Фрай (Ben Fry) сде­
щем, хочу поблагодарить всех студентов, которые лали возможной программную часть этой книги,
прослушали мой курс «Сетевые объекты», за то, создав платформу Processing. Без Processing реали­
что они помогли мне самому подробно разобраться зация программной части сетевых объектов была
в этом предмете. Особенно велико участие студен­ бы намного труднее. Также было бы невоз^ жно
тов 2006 и 2007 годов, так как им пришлось зани­ создание простого, элегантного программного ин­
маться по первым черновым версиям этой книги, терфейса для Arduino и Wiring101. Аппаратную часть
и они обнаружили в них несколько важных ошибок. этой книги сделали возможной создатели Arduino
и Wiring: Массимо Банци (Massimo Banzi), Джанлука
Несколько человек внесли значительный вклад в эту Мартино (Gianluca Martino), Давид Квартиелес
книгу в форме кода, идей или работы. Джефф Смит (David Cuartielles) и Давид Меллис (David Mellis) —
(Geoff Smith) дал курсу его название: «Сетевые по части Arduino, а также Эрнандо Барраган
объекты» и познакомил меня с понятием объектно- (Hernando Barragan) — по Wiring и Николас Замбет-
ориентированного оборудования. Джон Шиммель ти (Nicholas Zambetti), соединивший обе эти плат­
показал мне, как выполнять вызовы HTTP с по­ формы. Мне повезло работать с ними.
мощью микроконтроллера. Дан О'Саливан предо­
ставил серверный код, лежащий в основе всего Хотя я старался упоминать в книге многих по­
моего серверного кода. Благодаря совету Дана ставщиков деталей, Натан Сидл (Nathan Seidle) из
Шифмана по стилю кодирования, улучшилась чи­ «SparkFun» заслуживает особого упоминания. Без
таемость моего кода Processing. Роберт Фалуди него эта книга не была бы такой, какой она есть.
(Robert Faludi) предоставил большое количество В то время, как я годами говорил об объектно-
фрагментов кода, улучшил читаемость примеров ориентированном оборудовании, Натан и ребята из
кода ХВее, а также исправил много ошибок в нем. «SparkFun» потихоньку воплощали его в жизнь.
Макс Уитни (Max Whitney) помогла мне наладить
Я также хочу сказать спасибо команде поддержки
работу связи Bluetooth и сделать кровать для кош­
фирмы «Lantronix» — они всегда предоставляли
ки (несмотря на ее аллергию на представителей се­
качественные продукты и превосходную поддерж­
мейства кошачьих). Денис Кроули (Dennis Crowley)
ку. Гарри Моррис (Garry Morris), Гэри Марре (Gary
разъяснил мне возможности и ограничения двумер­
Marrs) и Дженни Эйзенхауэр (Jenny Eisenhauer)
ных штрихкодов. Крис Хиткоут (Chris Heathcote)
оказал значительное влияние на мое понимание всегда бодро и любезно отвечали на мои бесконеч­
геолокации. Дарел Бишоп (Durrell Bishop) помог ные запросы по электронной почте и телефонные
мне разобраться с идентификацией объектов. Майк звонки.
Кунявски (Mike Kuniavsky) и слушатели семинара
Идеи для проектов этой книги я заимствовал
«Аппаратные наброски»8, проводившегося в 2006
у своих коллег со всего мира из обсуждений на се­
и 2007 годах, помогли мне увидеть эту работу, как
минарах и простых встречах. Мои благодарности
часть большего сообщества, а также познакомили
членам преподавательского состава и студентам,
меня со многими новыми инструментами. Коту
с которыми я работал в программе «Интерактивный
по имени Лапша9 пришлось смириться со множе­
дизайн» в Королевском художественном коллед­
ством разных глупостей, чтобы мы могли сделать
же11, в программе «Цифровые СМИ и искусство»
для него кровать и снять фотографии. Сразу же
в Калифорнийском университете в Лос-Анджелесе12,
надо оговориться, что при подготовке этой книги
в программе «Интерактивный дизайн» в Колледже
8 В оригинале: «Sketching in Hardware». архитектуры и дизайна Осло, в Институте интер-
9 В оригинале: «Noodles». По всей видимости, в кличке кота
нашло свое отражение увлечение автора фильмом «Однажды 10 Еще одно микроконтроллерное устройство наподобие Arduino.
в Америке», где герой Роберта де Ниро носит эту же кличку. — 11 В оригинале: «Royal College of Art».
Ред. 12 В оригинале: «University of California at Los Angeles».
Предисловие 17

активного дизайна Ивреи13 и в Институте интерак­ Салкинду (Neil Salkind), который его продолжил,
тивного дизайна Копенгагена14. а также всей команде поддержки «Студии Б». На­
конец, спасибо моей семье и друзьям, которым
Источником вдохновения для этой книги послужи­
приходилось выслушивать мои восторженные раз­
ли многие проекты сетевых объектов. Я выражаю
глагольствования и жалобы отчаяния в ходе работы
свою благодарность авторам этих проектов, чьи ра­
над книгой. Я очень люблю всех вас.
боты используются в качестве примеров: Туан Анх
Т. Нгуен (Tuan Anh Т. Nguyen), Джоо Йоун Паек
(Joo Youn Раек), Дория Фэн (Dona Fan), Маурисио Мы хотим знать ваше мнение
Мело (Mauricio Melo) и Джейсон Кауфман (Jason
Если у вас есть какие-либо замечания или во­
Kaufman). Тарик Корула (Tarikh Korula) и Джош
просы по этой книге, вы можете задать их из­
Руки-Ли (Josh Rooke-Ley) — авторы «Необычайных
дателю по следующему адресу:
проектов». Джин-Йо Мок (Jin-Yo Мок), Алекс Байм
(Alex Beim), Эндрю Шнайдер (Andrew Schneider), O'Reilly Media, Inc.
Гилад Лотан (Gilad Lotan), Анжела Пабло (Angela 1005 Gravenstein Highway North
Pablo), Моуна Андраос (Mouna Andraos), Сонали
Сридхар (Sonali Sridhar) и Сара Йохансон (Sarah Sebastopol, CA 95472
Johansson), а также Франк Ланц (Frank Lantz) (800) 998-9938 (тел. в США или Канаде)
и Кевин Славин (Kevin Slavin) — авторы проекта (707) 829-0515 (тел. международный
«Территория/Код». или местный)
(707) 829-0104 (факс)
Богатый опыт позволил мне получить сотрудниче­
ство с журналом «МАКЕ». Основатель журнала, Список опечаток, примеры и дополнитель­
Дэйл Докерти (Dale Dougherty), поддерживал все ная информация по книге содержится на ее
мои идеи, с пониманием относился к возникав­ веб-сайте по адресу: www.makezine.com/go/
шим задержкам и проявлял благосклонность, когда MakingThingsTalk.
я хотел попробовать что-то новое. Он никогда не
говорил «нет», не предложив при этом приемле­ Оставить комментарий или задать технические
мой альтернативной версии проекта (которая часто вопросы по книге можно электронной почтой
оказывалась лучшей, чем забракованная). Брайан по адресу: bookquestions@oreilly.com.
Джепсон (Brian Jepson) сделал все и больше своих
Maker Media — подразделение издательства
редакторских обязанностей в реализации всех про­
«O'Reilly Media», полностью посвященное
ектов, предлагая модификации, выполняя отладку
расширяющемуся обществу изобретательных
кода, помогая с фотографиями и иллюстрациями
людей, которые верят, что если что-то можно
и предоставляя всеобщую поддержку. Сказать, что
вообразить, его можно сделать. Подразделение
эта книга была бы невозможной без его помощи,
состоит из журналов «МАКЕ», «CRAFT»
было бы большим преуменьшением — лучшего ре­
и «Maker Faire», а также серии книг «Hacks»,
дактора нельзя было бы и пожелать. Спасибо Нэнси
и поощряет дух «сделай сам» посредством
Котари (Nancy Kotary) за тщательную вычитку ру­
предоставления инструкций и созидательной
кописи книги. Кейти Уилсон (Katie Wilson) сделала
поддержки.
все, чтобы эта книга выглядела и читалась намного
лучше, чем я когда-либо мог надеяться. Также спа­ Дополнительную информацию о «Maker
сибо Тиму Лиллису (Tim Lillis) за иллюстрации. Media» можно получить здесь:
В общем, спасибо всей команде журнала «МАКЕ».
• «МАКЕ»: www.makezine.com
Спасибо моим агентам: Лауре Левин (Laura Lewin), • «CRAFT»: www.craftzine.com
которая привела процесс в действие, и Нилу • «Maker Faire»: www.makerfaire.com
13 В оригинале: «Interaction Design Institute Ivrea». • «Maker SHED»: www.makershed.com
14 В оригинале: «Copenhagen Institute of Interaction Design». V _______________ __ ________________ J
18 Предисловие

i£ П рим ечания ко втор ом у изданию


Две новые тенденции побудили меня переписать эту книгу: развитие движения за открытое
оборудование и рост культуры прямого участия, в том числе и в деле создания интерактивных
устройств. Это хорошо видно на примере быстрого увеличения круга пользователей Arduino,
в частности, и числа участников движения за открытое оборудование, в целом. Последствия этих
тенденций все еще в процессе оценки, но одно ясно — объектно-ориентированное оборудование
и физические вычисления становятся повседневной реальностью. В настоящее время электрони­
кой занимается намного больше людей, чем я мог бы вообразить в 2005 году.

Прежде чем любая технология может быть принята за пределы созданных нами моделей. Эта надежда
в общее использование, она должна занять место во была воплощена в жизнь посредством множества
всеобщем воображении. Люди без каких бы то ни производных плат, шилдов, побочных продуктов
было знаний технологии должны иметь хоть какое- и вспомогательных устройств, которые стали до­
нибудь представление о том, что это за технология ступными в течение нескольких последних лет.
и для чего ее можно использовать. До 2005 года Чудесно видеть, сколько народу не просто создает
я тратил много времени, объясняя людям, что та­ электронные устройства, которые могут модифици­
кое физические вычисления, и что я имел в виду ровать другие люди, но делает это таким образом,
под «сетевыми объектами». В настоящее время все что для этого не требуется профессиональная под­
знают, например, контроллеры Wii или Kinect как готовка.
устройства, которые расширяют диапазон физиче­
ских воздействий человека, доступный для воспри­ Развитие шилдов и библиотек для Arduino оказа­
ятия компьютерами. Сегодня также трудно найти лось столь значительным, что второе издание книги
несетевое электронное устройство. можно было бы написать почти без необходимости
выполнять какое бы то ни было программирование
Понимание широкими массами этих понятий вы­ или создавать схемы заново. Почти для каждого
зывает большое удовлетворение, но что еще более проекта в книге существует уже готовый шилд или
захватывающе, так это видеть все большее распро­ библиотека. Однако сборка устройств из готовых
странение использования устройств на их основе. деталей позволяет получить только определенный
Люди не просто пользуются своими устройствами уровень знаний, поэтому я попытался все же по­
Kinect для игр, а встраивают их в интерфейсы, по­ казать здесь некоторые из принципов, лежащих
могающие лицам с ограниченными физическими в основе электронных коммуникаций и физических
возможностями. Они не просто играются с кон­ интерфейсов. В тех случаях, когда существует про­
троллером Wii, а применяют его для управления стое аппаратное решение, я его приводил, но так­
музыкальными инструментами. Люди привыкли же показывал содержащуюся в нем схему. Самые
к тому, что они могут менять целевое использова­ лучшие библиотеки кода и схемные решения осно­
ние своих электронных устройств, и делают это. ваны на подходе, который я называю «стеклянным
ящиком». Под этим я имею в виду, что для работы
Когда я стал членом проекта Arduino, то надеялся, они скрывают все непривлекательные подробно­
что Arduino может стать чем-то более легким для сти и предоставляют удобный интерфейс, но при
самостоятельного модифицирования, чем бытовые этом позволяют, кому хочется, заглянуть вовнутрь
электронные устройства того времени, но в то же и увидеть, что в них происходит. Более того, они
самое время будет не таким трудным в освоении, хорошо сконструированы, и жуткие подробности
чем микроконтроллерные системы. Я полагал, что не выглядят такими уж и жуткими при их близком
хорошим подходом к достижению этой цели станет рассмотрении. Я надеюсь, что это издание книги
метод открытых источников, так как он позволил бы выполнит поставленную перед ним цель таким же
принципам платформы Arduino распространиться самым образом.
Предисловие 19

Справка по программному команде Arduino. Робота с Массимо Банци, Давидом


Квартиелесом, Джанлукой Мартино и Давидом
обеспечению Меллисом продолжает быть приятной, стимули­
Со времени, когда я начал работу над этим издани­ рующей и наполненной сюрпризами. Мне повезло
ем, в платформу Arduino было внесено несколько сотрудничать с ними.
существенных изменений. В частности, Arduino
IDE15 тогда находилась в стадии бета-разработки, Руководство Программы интерактивных комму­
но к моменту выхода книги будет доступна вер­ никаций в университете Нью-Йорка продолжает
сия 1.0. Если вы уже знакомы с Arduino, убеди­ оказывать мне поддержку во всей моей профес­
тесь, что вы загрузили версию 1.0 бета 1 или более сиональной работе. Весь этот проект с книгой был
позднюю версию IDE. Для этой книги использова­ бы невозможным без участия в нем моих коллег по
лась версия Arduino 1.0 бета 1, которая доступна этой программе. Как всегда, Дан О'Саливан продол­
по адресу http://code.google.eom/p/arduino/wiki/ жал давать мне ценные советы по многим проектам.
Arduinol. Конечная версия 1.0 будет доступна Даниель Шифман и Шан Вэн Эвери предоставили
на странице загрузок веб-сайта www.arduino.ee. помощь с версиями Processing для персонального
Периодически проверяйте этот сайт на наличие по­ компьютера и для Android. Марианна Петит, Нэнси
следних обновлений. Исходный код для книги мож­ Хэкинджер, Клэй Ширки и Марина Зурков (Marina
но загрузить из хранилища gitHub по адресу https:// Zurkow) оказали важную моральную поддержку.
github.com/tigoe/MakingThingsTalk2, а извещения Ред Бёрнз, как всегда, продолжает подавать мне
об изменениях в коде публикуются в блоге www. пример того, как наделять людей новыми возмож­
makingthingstalk.com. ностями, обучая их понимать технологии, которые
управляют их жизнями.

Справка по оборудованию Команда постоянных исследователей и адъюнкт-


профессоров Программы интерактивных комму­
Чтобы сконцентрироваться на коммуникации меж­
ду физическими устройствами, я выбрал в качестве никаций продолжает, как всегда, меняться и, тоже
как всегда, оказывать мне неоценимую помощь.
базовой аппаратной схемы для этого издания пла­
Для этого издания мне помогали с примерами,
ту Arduino Uno. Все проекты из этой книги будут
работать с Arduino Uno (при условии использова­ проверяли проекты и заменяли меня в Программе
ния соответствующих вспомогательных устройств интерактивных коммуникаций такие славные ре­
и шилдов). Несколько проектов были разработа­ бята, как Мустафа Багдатли (Mustafa Bagdatli),
ны на специальных моделях Arduino — таких как Каролина Браун (Caroline Brown), Джеремайя
Джонсон (Jeremiah Johnson), Мередит Хэссон
Arduino Ethernet или Arduino LilyPad, поскольку их
форм-фактор оказался наиболее подходящим. Но (Meredith Hasson), Леша Ходгсон (Liesje Hodgson),
даже эти проекты были проверены на Arduino Uno. Крейг Капп (Craig Карр), Ади Маром (Adi Marom),
Ариэль Неварес (Ariel Nevarez), Поль Ротман
Любой микроконтроллер, совместимый с Arduino
Uno, должен исполнять приведенный здесь код (Paul Rothman), Итай Бенджамин (Ithai Benjamin),
и сопрягаться с этими схемами. Кристиан Серрито (Christian Cerrito), Джон Диматос
(John Dimatos), Шиовай Фенг (Xiaoyang Feng),
Кейси Кинцер (Kacie Kinzer), Занна Марш (Zannali
Благодарности за второе издание Marsh), Кори Меншер (Corey Menscher), Мэт Паркер
(Matt Parker) и Тым Твилман (Tymm Twillman).
Круг людей, которые делают эту книгу возможной,
продолжает увеличиваться.
Члены преподавательского состава Томас Герхардт
(Thomas Gerhardt), Скотт Фицджеральд (Scott
Изменения во втором издании были в нема­
Fitzgerald), Рори Наджинт (Rory Nugent) и Дастин
лой мере вызваны работой моих партнеров по
Робертс (Dustyn Roberts) привнесли мой материал
15 Integrated Development Environment — интегрированная среда в куре «Введение в физические вычисления».
разработки.
20 Предисловие

Роберт Фалуди остается моим источником для все­ ко многим разработанным им чертежам деталей.
го, связанного с компанией «Digi International» и их Спасибо Джорджио Оливеро (Giorgio Olivero)
семейством радиоплат ХВее. и Джоди Калкин (Jody Culkin) за рисунки, добав­
ленные в это издание.
Мои благодарности Антуанетте ЛаСорса (Antoinette
LaSorsa) и Лил Тролструп (Lille Troelstrup) из орга­ Мои благодарности Давиду Бойхану (David Boyhan),
низации «Adaptive Design Association» за разреше­ Джоди Калкин, Заку Ивланду (Zach Eveland)
ние использовать дизайн их качающейся платфор­ и Габриэле Гутиерес (Gabriela Gutierrez) за чтение
мы, проект которой рассматривается в главе 5. частей рукописи и озвучивание своих мнений и ре­
комендаций.
Многие люди из списка рассылки наших разработ­
чиков и преподавателей внесли свой вклад в разви­ Также спасибо Киту Кейси (Keith Casey) из
тие платформы Arduino. В частности, Микал Харт «Twilio», создателю Amarino Бонифазу Кауфману
(Mikal Hart), Майкл Марголис (Michael Margolis), (Bonifaz Kaufmann), Андреасу Горанссону (Andreas
Адриан МакЮэн (Adrian McEwen) и Лимор Фрид Goransson) за его помощь по Android, а также Кэйси
(Limor Fried) оказали большое влияние на эту кни­ Рис и Бену Фрай за создание версии Processing
гу, работая над ключевыми библиотеками связи — для Android и за их отзывы и советы по разделу на
такими как SoftwareSerial, Ethernet и TextFinder, а Android.
также присылая личные советы и дружелюбные от­
веты на многие из моих вопросов. Книга Майкла Новый материал в этом издании дополнен и но­
Марголиса «Рецептурный справочник по Arduino»16 выми проектами. За это спасибо Бенедетте Пиан-
(издательство O'Reilly) также послужила в качестве танелле (Benedetta Piantella), Джастину Даунзу
справочного материала для некоторых фрагментов (Justin Downs) из «Groundlab», а также создателям
кода, опубликованных мной здесь. Спасибо Райану «SIMbalink» Мередит Хэссон, Ариэлю Неваресу
Маллигану (Ryan Mulligan) и Александру Бревигу и Нахане Шеллинг (Nahana Schelling). Спасибо
(Alexander Brevig) за их библиотеки, адаптирован­ Тимо Арналлу (Timo Amali), Элнару Сниву Марти-
ные версии которых использованы в этой книге. нуссену (Elnar Sneve Martinussen) и Йорну Кнутсену
(Jom Knutsen) (веб-сайт: www.nearfield.org) за их
Владельцы компании «Adafruit» Лимор Фрид и Фи­ помощь и сотрудничество по RFID. За напомина­
липп Торроне (Phillip Torrone) в течение всей моей ние, каким быстрым может быть протокол DMX-
работы над книгой снабжали меня своими советами 512 и как легко им пользоваться, спасибо Даниэлю
и критикой и оказывали поддержку. Вообще, компа­ Хиршману (Daniel Hirschmann). Спасибо Мустафе
нии «Adafruit» и «SparkFun» — это для меня основ­ Багдатли за его совет по проекту «Каменное лицо»,
ные источники деталей, поскольку их продукты а Франциске Gilbert (Frances Gilbert) и Джейку за их
отличаются отличной и надежной работой. Кроме роль в проекте «КотоКам 2». Антон Чехов, примите
того, Натан Сидл из «SparkFun» продолжает быть мои извинения, и спасибо Тали Падану за комиче­
одним из моих основных критиков и советчиков. скую идею.

Второе издание книги имеет лучшую графику бла­ Спасибо Джиане Гонсалес (Giana Gonzalez),
годаря системе Fritzing. Это средство открытого Юнгхуи Киму (Younghui Kim), Дженифер Магнолфи
доступа для создания электронных схем можно (Jennifer Magnolfi), Джин-Йо Мок (Jin-Yo Мок),
загрузить на веб-сайте http://fritzing.org — Рето Мэту Паркеру (Matt Parker), Эндрю Шнайдеру
Веттач (Reto Wettach), Андре Кнориг (Andre Knorig) (Andrew Schneider), Гиладу Лотану (Gilad Lotan),
и Джонатан Коэн (Jonathan Cohen) создали замеча­ Анжеле Пабло (Angela Pablo), Джеймсу Барнетту
тельный инструмент для разработки схем и плат. (James Barnett), Моргану Ноэлю (Morgan Noel),
Также спасибо Райану Оуэнсу (Ryan Owens) из кошке Лапше и кукле Мартышкину за проекты мо­
«SparkFun» за предоставление мне первого доступа делирования.
16 «Arduino Cookbook».
Предисловие 21

Как всегда, спасибо команде журнала «МАКЕ»,


особенно моему редактору и сотруднику Брайану
Джепсону. Благодаря его терпению и настойчиво­
сти второе издание книги увидело свет. Благодарю
технического редактора Скотта Фицджеральда, ко­
торый также помог собрать воедино все части кни­
ги. То, что в этой книге есть часть про Интернет,
это заслуга Скотта. Спасибо моему агенту Нилу
Салкинду и всем из «Студии Б».

В последние недели работы над этим изданием


книги несколько близких друзей пришли мне на
помощь и сделали возможным то, с чем я бы не
смог справиться своими собственными силами.
Зак Ивланд (Zach Eveland), Денис Хэнд (Denise
Hand), Джэнифер Магнолфи, Клайв Томпсон (Clive
Thompson) и Макс Уитни (Max Whitney) днем и ве­
чером помогали мне нарезать, паять, монтировать
и собирать многие из последних проектов, а также
составляли мне компанию, покуда я работал над
материалом книги. Джо Хобайка (Joe Hobaica) по­
жертвовал несколько дней на управление производ­
ством для завершения книги. Он организовал фото­
документирование большинства новых проектов,
спланировал мой поток работ, вел список задач, по­
купал разные детали, проверял связность, а также
напоминал мне, когда спать и есть. Все эти люди
напомнили мне, что работу над наделением вещей
способностью общаться друг с другом лучше всего
выполнять, общаясь с друзьями.
Глава 1 4'-

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

« Happy Feedback Machine*1, созданная Туаном Анхом Т. Нгуеном


(Tuan Anh Т. Nguyen)
Основное удовольствие, получаемое от взаимодействия с этим устройством, дает
щелкание тумблерами и вращение ручек. Огоньки и звуки, которые оно при этом
производит, — вторичны, и большинство людей, в него играющих, запоминают
свои ощущения, а не его поведение.

1 Это название можно приблизительно перевести так: «Машина удовольствия на основе обратной
связи». — Ред.
24 Глава 1

(Ий Все н ачи нается с п р и ко сн о вен и я


Все рассматриваемые в этой книге объекты — как осязаемые, так и неосязаемые — демон­
стрируют определенное поведение. Программные объекты отправляют и получают сообще­
ния, хранят данные или делают и то, и другое. Физические объекты двигаются, светятся или
издают звуки. Первый вопрос, который нужно задать об объекте, — что он делает? А следую­
щий вопрос — каким образом принудить объект делать то, что он должен делать? Или, иными
словами, какой у этого объекта интерфейс?

Интерфейс объекта состоит из трех компонентов. выдающие предсказуемый вывод. К сожалению,


Первый компонент — физический интерфейс. Это не все программные интерфейсы столь просты, как
то, что мы трогаем: ручки, тумблеры, ключи, а так­ нам бы хотелось, поэтому будьте готовы к опреде­
же и датчики, которые реагируют на наши действия. ленному экспериментированию, чтобы программ­
Элементы, которые соединяют объекты, также яв­ ные объекты делали то, что они должны делать.
ляются частью физического интерфейса. Любая При изучении нового программного интерфейса
сеть объектов начинается и заканчивается физи­ будет полезно применять к нему такой же мыслен­
ческим интерфейсом. И хотя некоторые объекты ный подход, как и к физическому интерфейсу. Не
в сети (например, программные объекты) не обла­ пытайтесь сразу же использовать все имеющиеся
дают физическим интерфейсом, люди создают умо­ функции, а сначала изучите действие каждой из
зрительные модели работы системы на основе того них по отдельности. Мы же не начинаем учиться
или иного физического интерфейса. Компьютер играть на пианино сразу с разучивания фуги Баха...
есть нечто намного большее, чем просто комплект Так и здесь — изучение программного интерфейса
из клавиатуры, мыши и экрана, но он представля­ не начинается с разработки на нем полноценного
ется нам состоящим именно из этого, потому что приложения, а продвигается постепенно, с изуче­
как раз эти устройства мы видим и трогаем. В си­ ния одной функции за другой. Эта книга содержит
стему можно заложить всякого рода замечательные большое число проектов. И если какая-либо из
функции, но если эти функции не очевидны в про­ функций проекта окажется вам непонятной, напи­
явлениях, которые люди могут видеть, слышать или шите простую программу с использованием только
трогать, они никогда не будут к ним обращаться. этой функции, чтобы разобраться с ней, после чего
Возможно, вы вспомните часы в видеомагнитофо­ возвращайтесь к работе над всем проектом.
нах, постоянно мигавшие на отметке 12:00, потому
что никто не мог разобраться, как их установить. Наконец, третий компонент — электрический ин­
Следовательно, из-за некачественного физического терфейс, состоящий из импульсов электрической
интерфейса страдает вся система. энергии, пересылаемых от одного устройства к
другому и несущих закодированную в них инфор­
Следующий компонент интерфейса — программ­ мацию. Если только вы не разрабатываете новые
ный интерфейс: команды, посылаемые объектам, объекты или соединения между ними, вам никогда
чтобы вызвать их реакцию. В ряде проектов мы бу­ не придется иметь дело с этим интерфейсом. Но
дем разрабатывать свой программный интерфейс, если вы такую разработку осуществляете, то что­
в некоторых — использовать уже существующий. бы знать, как согласовывать объекты с небольшими
Наилучшие программные интерфейсы это те, ко­ различиями в их электрических интерфейсах, вам
торые имеют простые, единообразные функции, нужно разбираться в них достаточно серьезно.
Средства 25

и Все дело в им пульсах


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

Последовательные протоколы — такие как RS-232, информацией по проводному и8В-соединению


USB и IEEE 1394 (который также называется между мышью и компьютером тоже осуществля­
FireWire и i.Link) — используются для подключе­ ется с помощью электроимпульсов. Да и сетевые
ния к компьютерам принтеров, приводов жестких соединения также реализуются посредством пере­
и оптических дисков, клавиатур, мышей и прочих дачи по проводам электрических импульсов. Для
периферийных устройств. Сетевые протоколы — более протяженных расстояний и в целях увели­
такие как Ethernet и стек протоколов TCP/IP — слу­ чения пропускной способности линий вместо ме­
жат для соединения многих компьютеров посред­ таллических проводов могут использоваться воло­
ством сетевых хабов (концентраторов), роутеров конно-оптические кабели, информация по которым
(маршрутизаторов) и коммутаторов. Протокол связи передается в виде световых импульсов. А когда
обычно определяет скорость обмена сообщениями, реализовать физическое соединение неудобно или
компоновку данных в сообщении и синтаксис об­ невозможно, обмен информацией осуществляется
мена данными. Протокол для физических объектов посредством радиосигналов с использованием со­
также определяет электрические характеристики ответствующих приемопередатчиков2. При этом
и иногда даже физическую форму соединителей. значение передаваемых сигналов данных не зави­
Однако протоколы не уточняют, что передается сит от носителя, по которому они передаются.
от объекта к объекту, — команды для выполнения Одну и ту же последовательность импульсов мож­
объектом каких-либо действий полагаются на про­ но передать как по металлическим проводам или
токолы так же, как построение грамотных фраз волоконно-оптическим кабелям, так и по радиока­
в тексте книги опирается на качественную грам­ налам. Учитывая, что все обмены сообщениями на­
матику языка. чинаются с последовательности импульсов (и что
где-то есть руководство, описывающее последова­
Тем не менее у всех протоколов, от простейшего тельность этих импульсов), мы можем работать
для обмена сообщениями между микросхемами с любой встретившейся на нашем пути системой
до наиболее сложного сетевого, есть один общий связи.
аспект — все они имеют дело с импульсами элек­
тричества. Цифровые устройства обмениваются
2 Как следует из названия, приемопередатчик представляет со­
информацией, передавая электрические импульсы бой радиоустройство, позволяющее как передавать, так и при­
(сигналы) по связывающему их соединению. Обмен нимать радиосигналы.

и Ком пью теры всех видов и р азм еро в


В этой книге мы встретимся, по крайней мере, с четырьмя разными типами компьютеров,
сгруппированными по их физическим интерфейсам. Самый знакомый из них — это персональ­
ный компьютер. Будь это настольный компьютер или ноутбук, персональный компьютер имеет
клавиатуру, экран и мышь, и вы, скорее всего, пользуетесь ими каждый рабочий день. Эти три
элемента — клавиатура, экран и мышь — составляют физический интерфейс персонального
компьютера.
26 Глава 1

Второй тип компьютера, рассматриваемый в этой может иметь клавиатуру, монитор и мышь. Различие
книге, — микроконтроллер, не обладающий физи­ заключается в том, что хотя сетевой сервер может
ческим интерфейсом, посредством которого люди делать все, что и обычный персональный компью­
могут непосредственно с ним взаимодействовать. тер, его основной задачей является осуществление
Это всего лишь электронная микросхема с контак­ обмена данными по сети. Большинство пользовате­
тами ввода и вывода, которые могут издавать и при­ лей не думают о серверах как о физических устрой­
нимать электрические импульсы. Взаимодействие ствах, поскольку взаимодействуют с ними только
с микроконтроллером осуществляется с помощью по сети, используя свои локальные компьютеры
трехшаговой процедуры: в качестве интерфейса. При этом следует иметь
в виду, что наиболее важным интерфейсом сервера
1. Ко входам микроконтроллера подключаются для пользователей является его программный ин­
датчики для преобразования разных типов энер­ терфейс.
гии: движения, тепловой, звуковой — в элект­
рическую энергию. Четвертая группа компьютеров это такой себе вине­
грет: мобильные телефоны, музыкальные синтеза­
2. К выходам микроконтроллера подключаются дви­ торы, контроллеры двигателей и т. п. Некоторые из
гатели, динамики и другие устройства для пре­ них обладают полноценным физическим интерфей­
образования электрической энергии в физичес­ сом, другие оснащены минимальным физическим,
кое действие. но развитым программным, у большинства же
имеется урезанный интерфейс обоих типов. Хотя
3. Создается и исполняется программа, опреде­ обычно мы не думаем о таких устройствах, как
ляющая, как изменения на входах воздействуют о компьютерах, в действительности они являются
на выходы. таковыми. И если рассматривать такие устройства,
как объекты с интерфейсами, которыми можно ма­
Иными словами, физический интерфейс микрокон­ нипулировать, будет легче понять, как все они об­
троллера определяется самими пользователями. мениваются информацией, независимо от их конеч­
ного назначения.
Третий тип компьютера, с которым мы будем иметь
дело в этой книге, — сетевой сервер. Это, в принци­
пе, тот же самый настольный компьютер, и он даже

йй Х о р о ш и е пр и вы чки
Взаимодействие сетевых объектов в чем-то схоже с личными отношениями. Основная пробле­
ма и тех, и других заключается в том, что посылая сигнал, мы никогда полностью не можем
быть уверены в том, понимает ли получатель, что мы хотим этим сигналом сказать. Кроме того,
сущ ествует бесчисленное множество вариантов потери сигнала или искажения его значения
при передаче.

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

отношениях или в сетевых), нужно следовать не­ информацией между объектами. Всегда сначала
скольким очень простым правилам: проверьте связь между объектами, отправив про­
стое сообщение типа «Здравствуй, мир!», прежде
• слушайте больше, чем говорите; чем продолжать реализовывать более сложные
аспекты проекта. Держите процедуру для отправки
• никогда не полагайте, что на другом конце услы­
этого сообщения под рукой на случай, если снова
шали именно то, что вы сказали;
потребуется проверить связь между объектами.
• предварительно договоритесь о правилах обме­
на информацией; Неправильный подход к обмену сообщениями —
только одна оплошность, которую можно совер­
• просите уточнить неясные сообщения.
шить. Для большинства проектов в этой книге по­
требуется создавать физический, программный
Слушайте больше, чем говорите и электрический компоненты интерфейса. Одной
из самых распространенных ошибок, совершаемых
Самый лучший способ произвести хорошее первое при разработке подобных гибридных проектов, яв­
впечатление и поддерживать добрые отношения — ляется предположение, что все проблемы находятся
это быть хорошим слушателем. Слушать — задача в одном месте. Довольно часто я ломал голову над
более трудная, чем говорить. Говорить можно в лю­ программной частью, пытаясь решить проблему
бое время, когда нам угодно, но так как мы не знаем, с передачей сообщения, чтобы только потом обна­
когда другой человек может сказать что-либо, нам ружить, что получающее устройство даже не было
нужно слушать все время. Применительно к сете­ подключено или было не готово получать сообще­
вым отношениям это означает, что создавать нужно ния. Не полагайте также, что проблемы со связью
такие программы, которые большую часть време­ находятся в том элементе системы, с которым вы
ни ожидают сообщения, а отправляют сообщения лучше всего знакомы. Как раз наоборот, очень часто
только тогда, когда это необходимо. Отправлять они находятся в элементе, с которым вы знакомы
сообщения на постоянной основе часто легче, чем менее всего и, соответственно, подсознательно из­
только тогда, когда нужно, но это может вызывать бегаете искать их в нем. В случае проблем с про­
всякого рода проблемы. Ограничить отправку со­ хождением сообщения, вспомните о каждом звене
общений обычно не сложно, и полученные выгоды в цепочке от отправителя к получателю и проверьте
намного превосходят затраты. каждое из них. А затем проверьте те звенья, кото­
рые вы пропустили при первой проверке.
Никогда не предполагайте
Слушатель не всегда слышит то, что, как вы думае­ Установите правила обмена
те, вы ему говорите. Иногда причиной этого явля­ информацией
ется неверное толкование услышанного, в других
же случаях это следствие проблем с приемом. Если В хороших личных отношениях вырабатывается об­
просто полагать, что наше сообщение было полу­ щий язык, основанный на общем жизненном опы­
чено без каких бы то ни было сложностей, и про­ те. Мы стараемся наилучшим образом выразить
должать действовать по этому предположению, мы что-либо, чтобы наш спутник по жизни был наи­
получим кучу проблем. Не следует также сначала более восприимчив к этому, а также вырабатываем
и до конца разрабатывать всю логику системы и все быстрый способ для выражения понятий, которые
шаги, через которые должны проходить сообщения, приходится повторять регулярно. Качественный
а затем собрать и тестировать всю систему сразу. обмен данными также полагается на общие спосо­
бы изложения ситуации, которые называются про­
Конечно, продумать всю систему заранее было бы токолами. Иногда может создаваться специальный
неплохо, но создавать и тестировать ее следует не­ протокол для всех объектов системы, в других же
большими шагами. Большинство ошибок при раз­ случаях могут использоваться уже существую­
работке таких проектов происходит при обмене щие протоколы. При работе с уже существующим
28 Глава 1

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

й£ И н стр ум ен тар и й
Учитывая, что в дальнейшем вы будете иметь дело с физическими, программными
и электрическими интерфейсами объектов, вам потребуются «физические» инструменты, про­
граммное обеспечение и компьютерное оборудование.

«Физические» инструменты О поставщиках деталей


В этой книге упоминаются несколько поставщиков де­
Если вам ранее приходилось работать с электрони­ талей. Я покупаю свои детали у разных поставщиков —
кой или микроконтроллерами, у вас, скорее всего, в зависимости от того, кто из них может предложить
уже имеются некоторые инструменты. На рис. 1.1 самую качественную версию детали по самой низкой
показаны инструменты и приспособления, наибо­ цене. Но иногда легче просто сразу покупать весь нуж­
ный комплект деталей у одного поставщика, который
лее часто применяемые для реализации проектов из имеет в наличии их все, вместо того, чтобы искать
этой книги. Такие, вполне обычные, инструменты в обширном справочнике того или иного поставщика,
можно приобрести у многих поставщиков (кое-кто предлагающего какую-то одну деталь по более низкой
из них упомянут в табл. 1.1). В пояснениях, приве­ цене. Упомянутые в табл. 1.1 поставщики ни в коем
случае не являются обязательными, и вы можете сво­
денных под рис. 1.1, также упомянуты некоторые
бодно покупать детали у любого другого поставщика.
поставщики этих инструментов с указанием номера Более полный список поставщиков приводится в при­
позиции инструмента по каталогу поставщика. ложении.
Средства 29

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

О российских поставщиках деталей


В России достаточно обширный ассортимент элек­ А ь Бонус от фирмы «Амперка»
тронных деталей, компонентов, оборудования и Специально для читателей этой книги «Амперка»
инструментов предлагается фирмами «Амперка» предлагает особое кодовое слово МТТ14, которое
(www.amperka.ru), «Линуксцентр» (угупу. даст вам скидку при оформлении заказа онлайн.
linuxcenter.ru) и «Чип и Дип» (http://chipdip.ru).

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

1. Паяльник. Лучше всего использовать паяльник сред­ которая может повредить чувствительные к статиче­
ней ценовой категории. Дешевые паяльники быстро скому электричеству детали типа микроконтроллеров.
выходят из строя, но качественный паяльник наподо­ Поставщики: «Амперка» (http://amperka.ru): АМР-
бие Weller WLC-100 замечательно подходит для ра­ Х149; 1ашесо (http://jameco.com): 146595; РагпеП
боты с электронными деталями небольшого размера. (www.farnell.com): 1568159; Яас1ю811аск (Шр://гайк>-
Не пользуйтесь так называемыми паяльниками хо­ shack.com): 640-2801 и 640-2078.
лодной пайки. При их работе иногда возникает искра,
30 Глава 1

2. Припой. Лучше всего использовать припой 21-23 «Амперка»: TOL01241P; SparkFun: TOL-10244 (v2);
AWG3. Если есть возможность, пользуйтесь бес- Seeed Studio (www.seeed-studio.com): TOL114C3M;
свинцовым припоем, который менее вреден для здо­ Maker SHED (www.makershed.com): MKSEEED11.
ровья. Поставщики: «Амперка»: АМР-Х150; Jameco:
10. Источник постоянного тока 9-12 В. Он будет ну­
668271; Famell: 419266; RadioShack: 640-0013.
жен вам постоянно. Не обязательно покупать его
3. Отсос для удаления припоя. Инструмент, полезный в магазине — можно использовать блок питания от
для демонтажа схем. «Амперка»: АМР-Х154; Jameco: какого-либо электронного устройства. В обязатель­
305226; SparkFun (www.SparkFun.com): TOL-00082; ном порядке определите полярность разъема, чтобы
Famell: 3125646. не подать питание обратной полярности на какой-
нибудь компонент и не сжечь его. Большинство
4. Инструмент для снятия изоляции, кусачки, длин­ устройств в проектах используют разъем питания
ногубцы. Все эти инструменты необходимы для ра­ постоянного тока, в который вставляется штекер
боты с проволокой. Не пользуйтесь их версией «три с внутренним диаметром 2,1 мм и внешним —
в одном», так как она создаст вам много проблем. 5,5 мм (см. позицию 11), поэтому ваш источник
Хорошие инструменты этого типа не столь дорогие, питания должен быть оснащен разъемом таких же
чтобы на них экономить. размеров. «Амперка»: EN1000S (3-12 В, 1000 мА);
Jameco: 170245 (12 В, 1000 мА); Famell: 1176248
• Инструмент для снятия изоляции: Jameco:
(12 В, 1000 мА); SparkFun: TOL-00298; RadioShack:
159291; Famell: 609195; SparkFun: TOL-00089;
273-355 (9 В, 800 мА).
RadioShack: 640-2129A.
И. Разъем (штекер) источника питания с внутрен­
• Кусачки: «Амперка»: 1PK-501A; Jameco:
ним диаметром 2,1 мм и внешним — 5,5 мм. Эта де­
161411; Famell: 3125397; SparkFun: TOL-00070;
таль требуется для подключения микроконтроллера
RadioShack: 640-2043.
или макетной платы к источнику постоянного тока.
• Длинногубцы: Jameco: 35473; Famell: 3127199; Размер разъема наиболее употребим для источников
SparkFun: TOL-00079; RadioShack: 640-2033. питания, которые подойдут к схемам проектов, рас­
5. Мини-отвертка. Приобретите комбинированную сматриваемых в этой книге. «Амперка»: АМР-Х042;
Jameco: 159610; Digi-Key (www.digikey.com): СР-
отвертку: с крестообразным и плоским жалами. Она
024A-ND; Famell: 3648102.
будет вам постоянно нужна. «Амперка»: 8РК-2061;
Jameco: 127271; Famell: 4431212; RadioShack: 640- 12. Разъем для батарейки типа «Крона» и сама бата­
1963. рейка. Эти детали пригодятся, когда нужно запитать
проект от батарейки. «Амперка»: AMP-W003; Spark­
6. Защитные очки. Рекомендуется пользоваться ими
Fun: PRT-09518; Adafruit (http://adafruit.com): 80;
при пайке, сверлении и выполнении прочих по­
Digi-Key: CP3-1000-ND и 84-4K-ND; Jameco: 28760
добных операций. SparkFun: SWG-09791; Famell:
и 216452; Famell: 1650675 и 1737256; RadioShack:
1696193.
270-324 и 274-1569.
7. «Третья рука». Это приспособление намного облег­ 13. USB-кабели. Для проектов из этой книги нужны
чает удержание деталей при пайке и прочих операци­ будут USB-кабели как типа А-на-В (стандартный
ях. «Амперка»: АМР-Х156; Jameco: 681002; Famell: USB-кабель), так и типа А-на-мини-В (USB-кабель,
1367049. используемый для цифровых камер). «Амперка»:
8. Мультиметр. Не обязательно покупать дорогой AMP-W004; SparkFun: CAB-00512, САВ-00598;
инструмент. Достаточно будет такого, который по­ Famell: 1838798, 1308878.
зволяет измерять напряжение, ток, сопротивление 14. Тестовые проводники с разъемами типа «кроко­
и электропроводность. «Амперка»: АМР-Х032; дил». Удерживать несколько деталей при измере­
Jameco: 220812; Famell: 7430566; SparkFun: TOL- нии параметров схемы задача не из легких — эти
00078; RadioShack: 22-182. проводники намного облегчают ее. Jameco: 10444;
9. Осциллограф. Профессиональные осциллографы RS (www.rs-online.com): 483-859; SparkFun: CAB-
достаточно дорогие, но DSO Nano стоит всего лишь 00501; RadioShack: 278-016.
около $100, его будет вполне достаточно для работы. 15. Переходник USB/TTL-Serial. Преобразовывает
3 AWG, American Wire Gauge System — американская систе­ USB-сигнал в сигнал TTL. Переходники для ис­
ма оценки проводов (стандарты на их диаметр). Подробности пользования на макетных платах, наподобие пока­
см. здесь: ЬЦр://ги^1к1реб1а.ог§Лу1к1/Американский_калибр_ занного здесь модуля FT232, дешевле, чем бытовые
проводов. устройства, и более удобны для использования в рас­
Средства 31

сматриваемых в этой книге проектах. «Амперка»: 20. Беспаечная макетная плата. Иметь несколько та­
А000059; SparkFun: ВОВ-00718; Arduino Store (store, ких плат под рукой не помешает. Лично мне нравятся
arduino.cc): A000014. платы с двумя длинными шинами с каждой стороны,
что позволяет подключить питание и землю на обе­
16. Модуль микроконтроллера. На рисунке показан их сторонах. «Амперка»: АМР-Х003; Jameco: 20723
микроконтроллер Arduino Uno. В США его можно (2 шины с каждой стороны); Famell: 4692810; Digi-
приобрести в магазинах SparkFun и Maker SHED Key: 438-1045-ND; SparkFun: PRT-00137; RadioShack:
(http://store.arduino.cc/ww/), а также у многих меж­ 276-002.
дународных дистрибьюторов. Информацию для сво­
его региона см. на веб-сайте http://arduino.cc/en/ 21. Светодиоды для трассировки сигналов. Для разра­
Main/Buy. ботчика аппаратных устройств светодиоды то же са­
мое, что и распечатки для разработчика программно­
17. Регулятор напряжения. Регуляторы напряжения го обеспечения. Они позволяют быстро определить
сглаживают меняющееся входное напряжение в ров­ наличие напряжения между двумя точками и путь
ное (более низкое) выходное напряжение. Наиболее прохождения сигнала. Поэтому всегда следует иметь
применяемое напряжение питания для проектов под рукой несколько таких компонентов. «Амперка»:
в этой книге: 5 В и 3,3 В. Будьте осторожны при ис­ AMP-X009-R4; Jameco: 3476; Famell: 1057119; Digi-
пользовании незнакомых регуляторов. Ознакомьтесь Key: 160-1144-ND; RadioShack: 278-016.
с их техническими характеристиками, чтобы знать 22. Сопротивления (резисторы). Для реализации про­
назначение их выводов. ектов из этой книги вам понадобятся резисторы раз­
• 3,3 В. «Чип и Дип»: 9020002518; Digi-Key: 576- личных номиналов. Наиболее применяемые номина­
1134-ND; Jameco: 242115; Famell: 1703357; RS: лы перечислены в табл. 1.1.
534-3021. 23. Штыревые разъемы. Эти разъемы будут вам нуж­
• 5 В. «Амперка»: АМР-Х065; Digi-Key: ны все время. Не помешает иметь под рукой также
LM7805CT-ND; Jameco: 51262; Famell: 1703357; несколько разъемов гнездового типа. «Амперка»:
RS: 298-8514. АМР-Х013; Jameco: 103377; Digi-Key: А26509-20-
ND; Famell: 1593411.
18. Транзистор TIP120. Транзисторы функционируют
как цифровые переключатели, позволяя управлять 24. Аналоговые датчики (переменные сопротивления).
высокими токами или напряжениями с помощью на­ Существует большое множество аналоговых дат­
много меньших токов или напряжений. Существует чиков для измерения разных физических свойств.
много разных типов транзисторов, но для проектов Упомянутые здесь являются самыми простыми из
в этой книге используются транзисторы TIP 120. аналоговых датчиков, и их легко встраивать в проб­
ные схемы. Датчики изгиба и силы давления удобны
Обратите внимание, что внешне этот транзистор вы­
для проверки схем и/или программ.
глядит точно так же, как и регулятор напряжения ря­
дом с ним (поз. 17). Иногда электронные компоненты • Датчики изгиба. «Амперка»: АМР-Х127;
с разным функционалом упаковываются в одинако­ Jameco: 150551; Images SI (www.imagesco.com):
вые физические корпуса, поэтому, чтобы определить FLX-01.
назначение компонента, нужно проверить маркиров­ • Датчики силы давления. «Амперка»: АМР-
ку на его корпусе. «Чип и Дип»: 47667; Digi-Key: X I26; Parallax (www.parallax.com): 30056;
TIP120-ND; Jameco: 32993; Famell: 9804005. Images SI: FSR-400, 402, 406, 408.
19. Шилды для прототипов. Это платы расширения 25. Кнопки. Для проектов в этой книге хорошо подой­
для модуля микроконтроллера Arduino, которые дут два типа кнопок. Первый — предназначенные
представляют собой пластины с решеткой монтаж­ для монтирования на печатные платы (подобные
ных отверстий, в которые можно впаивать компо­ применяемым на платах Arduino и Wiring), которые
ненты. Такие платы используются для создания про­ в наших проектах на макетных платах используются
тотипов своих схем. Можно, однако, использовать в основном как кнопки сброса. Второй — предназна­
и макетные платы (также здесь показаны) — они ченные для монтирования в панелях, которые слу­
удобны для быстрой реализации прототипов про­ жат в качестве элементов интерфейса для конечных
ектов. «Амперка»: А000082; Adafruit: 51; Arduino пользователей. Но, в принципе, можно использовать
Store: А000024; SparkFun: DEV-07914; Maker SHED: практически любой вид кнопок.
MSMS01. • Для монтирования на печатных платах.
• Макетные платы для прототипных шилдов. «Амперка»: AMP-X026-Y; Digi-Key: SW400-ND;
«Амперка»: АМР-Х008; SparkFun: PRT-08802; Jameco: 119011; SparkFun: СОМ-00097.
Adafruit: входит в комплект платы; Digi-Key: • Для монтирования на панелях. «Чип и Дип»:
923273-ND 48828; Digi-Key: GH1344-ND; Jameco: 164559PS.
32 Глава 1

26. Потенциометры. Потенциометры необходимы для 29. Конденсаторы. Для реализации проектов из этой
настройки параметров проектов. «Амперка»: АМР- книги вам понадобятся конденсаторы различных
Х021; 1атесо: 29081; БрагкРип: СОМ-09939; ЯБ: номиналов. Наиболее применяемые номиналы пере­
91А1А-В28-В15Ь; ЯаёюЗИаск: 271-1715; РатеИ: числены в табл. 1.1.
1760793.
27. Кабели ЕШегпе^ Для проектов потребуется пара
сетевых кабелей. «Амперка»: АМР-Х050; Батесо:
522781; ЯасИоЗЬаск: 55010852.
ГА Новые аппаратные компоненты
В следующих главах рассматриваются некото­
28. Провода черного, красного, синего и желтого цве­
рые аппаратные компоненты, которые появи­
та. Для монтажа на беспаечной макетной плате лучше
всего подойдет провод стандарта 22 А \¥в. Запаситесь,
лись, когда работа над этим изданием книги
по крайней мере, тремя цветами, и всегда используйте уже велась, — это плата Arduino Ethernet, шилд
красный для плюса питания, а черный — для общего. Arduino Wi-Fi, беспроводной шилд, RFID-шилд,
Немного организованности в использовании прово­ адаптер RS232/USB и ряд других. К этому мо­
дов может быть очень полезно. менту упомянутые в табл. 1.1 поставщики радио-
• Черный — Батесо: 36792.
деталей еще не назначили им номер, поэтому та­
кие компоненты нужно искать по их названию.
• Синий — Батесо: 36767.
К тому времени, когда эта книга попадет вам
• Зеленый— Батесо: 36821. в руки, поставщики должны уже иметь их в на­
• Красный — Батесо: 36856; ЯаИюБИаск: 278-1215. личии.
• Желтый— Батесо: 36919. V ___________________________________ J
• Разные цвета — «Чип и Дип»: 40119;
Яа^оБИаск: 276-173.

Та блиц а 7.7. Распрост раненны е компонент ы


для проект ов по элект ронике
Код, полное имя и веб-сайт поставщика:
АМР — «Амперка» (http://amperka.ru) К — ЯБ (www.rs-online.com)
СНВ — «Чип и Дип» (http://chipdip.ru) 3 — 1ашесо (http://jameco.com)
В — Digi-Key (http://digikey.com) Е — РатеИ (www.farnell.com)

К о м п о н ен т , н о м и н а л К о д п о ст а в щ и к а и н о м е р д е т а л и
Сопротивления
100 £2 А М Р — AM P-R100R -10, D — 100QBK-ND, J — 690620, F — 9337660,
R — 707-8625
220 а А М Р — AM P-R220R-10, D — 220QBK-ND, J — 690700, F — 9337792,
R — 707-8842
470 Q А М Р — AM P-R470R-10, D — 470QBK-ND, J — 690785, F — 9337911,
R — 707-8659
1К A M P — A M P -R 1K -10,D — 1.0KQBK, J — 29663, F — 1735061,
R — 707-8669
10 К А М Р — AM P-R10K-10, D — 10KQBK-ND, J — 29911, F — 9337687,
R — 707-8906
22 К CHD — 40844, D — 22KQBK-ND, J — 30453, F — 9337814,
R — 707-8729
Средства 33

Таблица 1.1 (продолжение)

К ом понент , н о м и н а л К од п о ст а в щ и к а и н о м е р д е т а л и
100 к АМ Р — АМР-11100К-10, Б — ЮОКдВК-ЫБ, Л — 29997, Е — 9337695,
И — 707-8940
1м С1ГО — 51741, Б — ЕОМдВК-ИБ, Л — 29698, Е — 9337709,
И — 131-700
Конденсаторы
0,1 рр керамический АМ Р — АМР-СС104-10, Б — 399-4151 -N0, Л — 15270, Е — 3322166,
И — 716-7135
1 |ИР электролитический С1ГО — 31890, Б — Р 10312-ЫБ, Л — 94161, Е — 8126933, И — 475-9009
10 рр электролитический АМ Р — АМР-СЕ 10и-10, Б — Р11212-ЫО, Л — 29891, Е — 1144605,
Я — 715-1638
100 рр электролитический О ГО — 16360, Б — Р10269-ЫБ, Л— 158394, Е — 1144642,
К — 715-1657
Регуляторы напряжения
3,3 В ОГО — 9020002518, Б — 576-1134-ЫБ, Л — 242115, Е — 1703357,
И — 534-3021
5В АМ Р — АМР-Х065, В — ЬМ7805СТ-МБ, Л — 51262, Е — 1860277,
К — 298-8514
Аналоговые датчики
Изгиба АМ Р — АМР-Х127, Б — 905-1000-ЫБ, Л — 150551, Я — 708-1277
Давления АМ Р — АМР-Х126, Б — 1027-1ООО-ИБ, Л — 2128260
Светодиоды
Т1, зеленый, прозрачный АМ Р — АМР-Х009-С, Б — 160-1144-ЫБ, Л — 34761, Е — 1057119,
И —-247-1662
Т1, красный, прозрачный АМ Р — АМР-Х009-Я, Б — 160-1665-МБ, Л — 94511, Е — 1057129,
Я — 826-830
Транзисторы
2И2222А А М Р — АМР-Х035-5, Б — Р2Ш 222АС08-КБ, Л — 38236, Е — 1611371,
Я — 295-028
Т1Р120 С Н В — 47667, В — Т1Р120-КБ, Л — 32993, Е — 9804005
Диоды
1N4004-11 АМ Р — АМР-Х045-5, Б — Ш4004-ЕЗ, Л — 35992, Е — 9556109,
Я — 628-9029
3,3 В стабилитрон (Ш5226) АМ Р — АМР-Х051, В — Ш5226В-ТРСТ-15ГО, Л — 743488, Е — 1700785
Кнопки
Для печатных плат АМ Р — АМР-Х026-У, В — 8\¥400-ЫБ, Л— 119011, Е — 1555981
Для панелей С Н В — 48828, Б — СН1344-Ш , Л — 164559Р8, Е — 1634684,
Я — 718-2213
34 Глава 1

Табли ца 7.7 (окончание)

К о м п о н ен т , н о м и н а л К од п о ст а в щ и к а и н о м е р д е т а л и
Беспаечные макетные платы
разные АМР — АМР-Х003, В —- 438-1045-ND, J — 20723, 20600, F — 4692810
Монтажный провод
красный В — С211711-1ОО-ЫЭ, 3 --3 6 8 5 6 , F — 1662031
черный В — С2117В-1ОО-КБ, 3 -- 36792,F 1662027
синий J — 36767, F — 1662034
желтый J — 36920, F — 1662032
Потенциометр
10 К АМР — АМР-Х021, Б —-29081
Штыревые разъемы
Прямые штырьки АМР — АМР-Х013, В —- A26509-20-ND, J — 103377, S — PRT-00116
Штырьки под прямым углом С Н В — 929136020, В — - S1121E-36-ND, S — PRT-00553
Гнездовые разъемы C H D — 362520493, S — PRT-00115
Разъем для батареи «Крона»
9В А М Р — AMP-W003, D - - 2238K-ND, J — 101470PS, S — PRT-00091

Программные продукты

Среда Processing
В этой книге используется многоцелевая программ­
ная среда, носящая название Processing. Она осно­ If fl
вана на платформе Java и предназначена для тех
пользователей, которые хотят реализовывать свои
проекты без необходимости подробно изучать про­
граммирование. Среда Processing — весьма полез­ 1
j s|
ный инструмент для объяснения понятий програм­
мирования, поскольку для осуществления значи­
тельных действий: создания сетевого соединения,
подключения к внешнему устройству через после­
довательный порт, управление камерой — требует­
ся сравнительно небольшой объем кода Processing.
Этот бесплатный инструмент с открытым исходным
кодом можно загрузить с веб-сайта www.processing.
org.

Поскольку среда Processing основана на Java, в


программы Processing можно включать классы и Рис. 1.2. Окно редактора кода среды Processing
Средства 35

методы Java. Среда может исполняться под Мае в качестве исходного кода для создания таких при­
OS X, Windows и Linux. Существуют также вер­ меров в любой среде, которой вы отдаете предпо­
сии Processing для Android и JavaScript, так что чтение.
это довольно-таки разносторонняя среда. Если
по какой-либо причине вам не нравится рабо­ Загрузив и установив среду Processing на своем ком­
тать в среде Processing, можно использовать пьютере, запустите ее на выполнение. Откроется
примеры кода и комментарии из этой книги окно, наподобие показанного на рис. 1.2.

И~Тепер^ нашу println(«Здравствуй, мир !»);


первую программу в Processing.
Введите следующий текст в окно
редактора, а затем нажмите кноп­
ку Run (Исполнить) — самую
левую кнопку на панели инстру­
ментов Processing.

# # Не ахти какая программа, но это класси- содержит каких-либо примочек, отвлекающих вни­
■ ■ ческая первая программа в любом язы­ мание. Панель инструментов редактора состоит из
ке. Исполнение этой программы выводит текст кнопок для запуска и остановки исполнения скет­
Здравствуй, мир! в текстовом поле внизу окна ре­ чей, открытия существующих скетчей, сохранения
дактора. Как видим, ничего сложного. скетчей и экспортирования скетчей в апплеты Java.
Кроме того, скетчи можно экспортировать в виде
Программы Processing называются скетчами (sketch), автономных приложений. Файлы скетчей по умол­
и все данные скетча сохраняются в файле с име­ чанию сохраняются в подпапке Processing папки
нем скетча. Редактор Processing весьма прост и не Документы, но их можно сохранять в любой папке.

Ш~Дале^^ более /*
сложную программу, которая де­ Программа рисования треугольников

монстрирует некоторые основ­ Контекст: Processing

ные структуры программирова­


Рисует треугольник при отпущенной левой кнопке мыши.
ния Processing.
Очищает окно рисования при нажатии левой кнопки мыши.
*/

à Контекст
использования кода
// объявляем переменные
float redValue = 0 ; // переменная для красного цвета
Все примеры кода в этой кни­ float greenValue = 0 ; // переменная для зеленого цвета
ге сопровождаются коммен­ float blueValue = 0; // переменная для синего цвета
тариями, указывающими кон­
текст, в котором они должны // метод setup () исполняется один раз в начале программы:

использоваться: Processing,
void setup() {
режим Android Processing,
size (320, 240); // устанавливаем размер окна рисования
Arduino, PHP и т. п.
V ____________________ _____ __________ J background(0); // устанавливаем черный фон окна рисования
fill (0) ;// задаем цвет для заполнения фигур (0 = черный)
smooth(); // рисуем фигуры со сглаженными кромками
36 Глава 7

11 Метод draw() исполняется непрерывно, пока открыто окно


// рисования.
// Он обновляет окно, а также выполняет любые
// запрограммированные в нем действия:

void draw() {

// Выбираем произвольные значения красной, зеленой и синей


// составляющих цвета:
redValue = random(255);
greenValue = random(255);
blueValue = random(255);

// задаем цвет линии:


stroke(redValue, greenValue, blueValue);

// рисуем при отпущенной левой кнопке мыши (игнорируя все


// обычные правила):
if (mousePressed == false) {
// рисуем треугольник
triangle(mouseX, mouseY, width/2, height/2,pmouseX,
pmouseY);
}
// очищаем окно рисования при нажатии левой кнопки мыши:
else {
background(0);
fill (0) ;
}
}

Любая программа Processing должна содержать Синтаксис программ в среде Processing близок по
два метода (процедуры): setup о и draw о. Метод стилю синтаксису языка С. Так же, как и перемен­
setup () исполняется один раз в начале программы, ные, все функции в нем тоже имеют тип данных.
устанавливая все начальные условия, — такие как Многие функции имеют тип данных void, то есть
размер окна апплета, начальные значении! перемен­ они не возвращают никаких значений в результа­
ных и т. п. А метод draw () — основной цикл про­ те исполнения. Все строки кода должны заканчи­
граммы, исполняющийся непрерывно, пока откры­ ваться точкой с запятой, а блоки кода заключаются
то окно апплета. в фигурные скобки. Условные операторы (if-then),
Для переменных Processing нужно задавать тип их операторы цикла (for-next) и комментарии также
данных. В приведенной здесь программе перемен­ используют синтаксис языка С. За исключением
ные redValue, greenValue И blueValue — плаваю­ цикла for-next, все эти операторы продемонстри­
щего типа, то есть они могут содержать числа рованы в приведенной ранее программе.
с плавающей запятой. Другие распространенные
типы данных переменных, с которыми нам придет­
ся работать, это:
• int — целочисленные значения;
• boolean — значения true И false;
• string — текст;
• bytes.
Средства 37

□ Пример цикла for-next демон- for (int myCounter = 0; myCounter <=10; myCounter++) {
стрируется в следующем фраг­ println(myCounter);
менте кода. Попробуйте создать }
свой скетч с использованием
этого цикла. Для создания нового
скетча выполните команду New
в меню File среды Processing.

Пользователям BASIC
Если вы никогда не использовали цикл for-next в стиле С, этот пример может показать­
ся вам чем-то страшным. В действительности, ничего сложного в нем нет. Все, что при­
веденный здесь код делает, это сначала устанавливает значение переменной myCounter,
а затем исполняет заключенные в фигурные скобки инструкции до тех пор, пока это зна­
чение остается меньшим или равным 10. Инструкция myCounter++ указывает программе
добавить единицу к значению myCounter при каждом прохождении цикла. Эквивалентный
код в BASIC выглядит следующим образом:
for myCounter = 0 to 10
Print myCounter
next

# # Processing — удобный язык для экспери- Кроме указанных, существует и множество других
■ ш ментирования, так как позволяет очень бы­ книг по Processing, так что вы сможете выбрать ту,
стро создавать интерактивную графику. Он также которая вам больше подходит.
может служить в качестве простого введения в про­
граммирование на языке Java. Если вы уже знаете
этот язык, то можете вставлять код Java непосред­ Приложения удаленного доступа
ственно в программы Processing. Возможности Одним из наиболее эффективных инструментов,
Processing можно расширять с помощью библиотек которым мы будет пользоваться для отладки проек­
кода. В этой книге мы будем часто пользоваться тов из этой книги, является программа удаленного
двумя библиотеками кода для Processing: библио­ доступа, позволяющая получить доступ к консоли
текой последовательных ресурсов и библиотекой командной строки удаленного компьютера. Если
сетевых ресурсов. вам никогда раньше не приходилось работать с ин­
Дополнительную информацию по синтаксису терфейсом командной строки, это средство может
Processing легко найти в руководстве по этому поначалу оказаться неудобным, но привыкнуть
языку, которое можно загрузить с веб-сайта www. к нему несложно. Умение работать с интерфейсом
processing.org. Узнать больше о программиро­ командной строки особенно важно для захода на
веб-серверы, так как работа со сценариями РНР,
вании в Processing можно из книги «Processing:
используемыми для этого, как раз осуществляется
A Programming Handbook for Visual Designers and
через консоль командной строки.
Artists»4 (издательство MIT Press), написанной соз­
дателями этого языка Кэйси Рисом и Беном Фрайем, Дело в том, что большинство поставщиков веб­
или из их более короткой книги «Getting Started with хостинга используют Linux, BSD, Solaris или дру­
Processing»5 (издательство O'Reilly). Также можно гую UNIX-подобную операционную систему. По­
воспользоваться отличной книгой для начинаю­ этому, для работы с веб-сервером на такой системе
щих «Learning Processing»6 (издательство Morgan приходится подключаться к нему с помощью консо­
Kaufmann), написанной Даниэлем Шифманом. ли командной строки.

4 «Processing: Справочник по программированию для визуаль­ Примечание


ных конструкторов и творческих личностей». Если вы уже знаете, как создавать документы РНР
5 «Основы работы с Processing». и HTML и загружать их на веб-сервер, раздел «РНР»
6 «Изучаем Processing» (см. далее) можно пропустить.
38 Глава 1

Хотя командная строка предоставляет наиболее операционных систем. Для работы с программой
прямой способ работы с РНР, некоторые предпо­ OpenSSH под Linux или Mac OS X нужно сначала
читают косвенный способ, создавая текстовые запустить программу эмуляции командной строки
файлы на своем компьютере, а затем загружая их этих ОС и выполнить в ней команду ssh, которая
на удаленный компьютер. В зависимости от огра­ программу OpenSSH и запустит. В Mac OS X про­
ничений вашего веб-хостинга, это может оказаться грамма эмуляции командной строки называется
единственной доступной вам опцией, — впрочем, Terminal и находится в подкаталоге Utilities каталога
на рынке есть много недорогих хостинговых ком­ Applications. В Linux эмулятор командной строки мо­
жет называться xterm, rxvt, Terminal или Konsole.
паний, предлагающих полный доступ к веб-серверу
из командной строки. Но даже если вы предпочи­
таете работать с веб-сервером таким образом, для Программы ssh и telnet
некоторых проектов в этой книге командная строка Программа ssh — это более современная версия старой
является единственным вариантом, поэтому весьма программы удаленного доступа для UNIX, называю­
щейся telnet. Программа ssh обеспечивает более высо­
полезно получить некоторое представление о ней
кий уровень безопасности, зашифровывая отправляе­
уже сейчас. мые данные, таким образом защищая их на случай пе­
рехвата. В программе telnet шифрование отправляемых
Для компьютеров Windows существует несколько данных не применяется. Для связи между компьютерам
программ для удаленного доступа, но мы будем следует использовать программу ssh всегда, когда это
возможно. Иногда в этой книге используется програм­
пользоваться программой PuTTY (www.puttyssh. ма telnet, но это лишь по той причине, что только эта
org). Процедура установки несложная — загрузите программа может обеспечить требуемую для данного
с веб-сайта программы установщик Windows для примера функциональность. Программу telnet можно
нее и запустите его на исполнение. рассматривать как старого приятеля — возможно он
не самый популярный во дворе, возможно иногда он
говорит слишком много и невпопад, но он всегда был
На компьютерах под Mac OS X и Linux для уда­
на твоей стороне и ты знаешь, что ему можно доверять,
ленного доступа можно использовать програм­ когда все другие подвели тебя.
му OpenSSH, которая входит в состав обеих этих

Установка соединения SSH i

Mac OS X и Linux Windows


Откройте программу терминала. Обычно прило­ Запустите программу PuTTY (рис. 1.3).
жение терминала предоставляет простое тексто­
вое окно с приветствием наподобие следующего: Введите имя своего веб-сервера в поле Host
Name, установите переключатель SSH в разделе
Last login: Wed Feb 22 07:20:34 on ttypl Connection type и нажмите кнопку Open.
ComputerName:~ username$
Когда программа выполнит подключение к уда­
Чтобы подключиться к требуемому веб-серверу, ленному компьютеру, будет выведен запрос вве­
выполните в командной строке команду: сти пароль. Введите пароль (вводимый текст не
будет отображаться) и нажмите клавишу <Enter>.
ssh имя_пoльзoвaтeля@myhost.сот

Разумеется, вместо параметров имя пользовате-


ля и myhost.com введите свое имя пользователя
и адрес веб-сервера соответственно.
Средства 39

32 Session
Logging
Terminal
Keyboard
Bell } ............................
Features
& Window
Appearance
Behaviour
Translation
Selection
k ° toufS Default Settings
& Connection
Data
Proxy
Telnet
Rlogm
i+! SSH
Serial

Рис. 1.3. Главное окно программы PuTTY

а Работа с ком андной стр о к о й


Установив соединение с удаленным веб-сервером, Это рабочая папка вашей учетной записи на серве­
вы увидите примерно такое сообщение: ре. На многих веб-серверах такая папка содержит
вложенную папку, которая называется public_html
Last login: Wed Feb 22 08:50:04 2006 from
216.157.45.215 или www и содержит файлы веб-сайта. Файлы, на­
[useridOmyhost ~]$ ходящиеся в домашней папке (то есть файлы вне
папок public_html или www), недоступны для про­
Это значит, что вам доступна командная строка смотра посетителями веб-сайта.
удаленного компьютера, и любая введенная вами
команда на этом компьютере будет выполнена. Для
начала узнаем, в какой папке мы находимся. Для Организация папок и файлов на веб-сервере
этого выполним следующую команду: О точной организации папок и файлов в вашей домаш­
ней папке нужно проконсультироваться с администра­
pwd
цией хостинга.
Эта команда состоит из первых букв фразы print
working directory, которая означает «напечатать ра­ Для вывода списка файлов папки служит команда
бочую папку». Она указывает компьютеру отобра­ is (list):
зить имя и путь текущей папки. (Многие команды
UNIX весьма кратки — чтобы их легче было вво­ Is -i .
дить. С другой стороны, аббревиатурные команды
труднее запомнить.) В ответ сервер выведет путь Точки в конце команды
и имя текущей папки:
Точка в конце команды означает «текущая папка», а две
/home/igoe точки — «родительская папка текущей папки».
40 Глава 1

Параметр -1 означает list long, то есть требова­ Для возврата в домашнюю папку к команде cd до­
ние выводить подробный список. В результате ис­ бавляется параметр ~ (тильда):
полнения этой команды выводится примерно такой
cd ~
ответ:

total 44
Возвратиться в домашнюю папку можно, просто
drwxr-xr-x 13 igoe users 4096 Apr 14 11:42 выполнив команду cd без параметров.
public_html
drwxr-xr-x 3 igoe users 4096 Nov 25 2005 share
Чтобы перейти во вложенную папку, эта папка ука­
зывается после родительской папки через косую
Это список всех файлов и вложенных папок, содержа­ черту — / (слеш):
щихся в текущей папке, с указанием их атрибутов. cd pubiic_html/cgi-bin

• В первом элементе строки указываются разре­ Чтобы указать абсолютный путь из главной папки
шения для действий с данным объектом: чтение, сервера (которая называется root — корневая), в на­
изменение или исполнение. чале пути файла ставится такая же косая черта — /.
• Во втором элементе указывается количество Пути без косой черты в их начале называются от­
ссылок на данный файл из других областей си­ носительными.
стемы — эта информация в большинстве случа­
Для создания новой папки служит команда mkdir
ев не особо требуется.
(make directory):
• В третьем элементе указывается владелец объ­
mkdir имя_папки
екта, а в четвертом — группа владельцев.
• В пятом элементе указывается размер объекта, Эта команда создает новую папку в текущей папке.
а в шестом — дата и время последнего изме­ При просмотре содержимого пустой папки (каковой
нения. будет вновь созданная папка) с помощью команды
is -la выводятся только две строчки:
• Наконец, в последнем элементе указывается имя
объекта. drwxr-xr-x 2 tqi6023 users 4096 Feb 17 10:19 .
drwxr-xr-x 4 tqi6023 users 4096 Feb 17 10:19
В среде UNIX все файлы, имена которых начина­
ются с точки, в общем случае не отображаются. Это
Первая строчка, с одной точкой в конце, — это
требуется для некоторых особых файлов — таких,
ссылка на данную папку, а вторая, с двумя точками
например, как файлы управления доступом, кото­
в конце, — ссылка на родительский каталог. Такие
рые рассматриваются далее. Чтобы просмотреть
две ссылки будут находиться в любой папке, и уда­
содержимое папки, включая ее скрытые файлы, с
лить их нельзя.
командой is нужно использовать параметр -1а:
Чтобы удалить папку, служит команда rmdir (remove
Is -la
directory) с указанием папки, подлежащей удале­
нию:
Для перехода в другую папку служит команда cd
(change directory — изменить каталог). Например, rmdir имя_папки
перейти в папку public_html можно, выполнив сле­
Удалить можно только пустую папку, поэтому
дующую команду: перед удалением папки нужно удалить все ее со­
держимое — как файлы, так и вложенные папки.
cd public_html
Команда rmdir выполняется немедленно, без за­
Чтобы переместиться на один уровень выше в проса на подтверждение удаления, поэтому нужно
иерархии папок, выполняется следующая команда: быть осторожным в ее использовании. Не следует
также удалять какие бы то ни было папки или фай­
cd .. лы, которые вы не создавали.
Средства 41

Управление доступом к файлам Создание, просм отр и удаление


Выполните команду is -1 , чтобы вывести список файлов
файлов текущей папки, и рассмотрите поближе раз­
Для работы с файлами полезными будут еще две про­
решения для файлов. Например, обозначение:
граммы командной строки: nano и s. Программа
drwx------- nano — это текстовые r tf ^ Э то очень про­
означает, что данный объект является папкой (d — стой редактор, поэтому для объемных работ будет
directory), и создавший ее пользователь (который лучше редактировать текст на своем компьютере
также называется владельцем) может просматри­ с помощью другого, более удобного редактора, а за­
вать или читать ее (г — read), записывать в нее тем загружать готовый текст на сервер. Но для не­
(w — write), а также исполнять ее (х — execute). больших правок прямо на сервере nano незаменим.
Рассмотрим другой пример, разрешения: Чтобы создать с помощью nano новый файл, выпол­
ните следующую команду:
-rw-rw-rw
nano имя_файла.txt
Тире вначале означает, что данный объект является
файлом (а не папкой), и что владелец файла, груп­ Откроется окно редактора (рис. 1.4).
па владельцев (обычно владелец является членом Все команды для работы в nano вводятся с кла­
этой группы), а также любой другой, кто имеет до­ виатуры совместно с клавишей <Ctrl>. Например,
ступ к файлу, может просматривать его и выполнять для выхода из программы нужно нажать комбина­
запись в него. Первая группа rw- задает разреше­ цию клавиш <Ctrl>+<X>. Наиболее употребляемые
ния владельца, вторая — группы, а третья — всех команды перечислены в нижней части окна редак­
остальных. Владелец объекта может изменить его тора.
разрешения с помощью команды chmod:
Насколько редактор nano удобен для быстрого соз­
chmod go-w имя_файла дания и редактирования небольших текстовых фай­
Параметры команды указывают пользователей, ко­ лов, настолько для чтения таких файлов хорошо
торых затрагивает данная команда, и изменяемые подходит редактор less. Этот редактор отображает
разрешения. В приведенном примере мы удаляем текстовый файл по одному экрану за раз. Для про­
разрешения на запись (-w) для группы (д — group) смотра текстового файла в less нужно просто вве­
владельцев файла и всех других (о — others), кроме сти имя этого редактора, а за ним имя требуемого
владельца файла. А в следующем примере мы при­ файла:
сваиваем права записи и исполнения для группы и
less имя_файла.txt
других пользователей:
В результате содержимое файла будет выводиться
chmod до +wx имя_файла
поэкранно, с приглашением в виде двоеточия (:)
Как мы уже поняли, в параметрах команды chmod в конце экрана. Нажатие клавиши пробела выводит
буква и означает пользователя (user), д — группу следующий экран текста. Чтобы завершить работу
(group), а о — прочие (others). Мы также знаем, программы, нажмите клавишу <q>. Определенно,
что буква г означает разрешения чтения (read), w— похвастаться никакими крутыми наворотами less не
записи (write), а х — исполнения (execute). Знак + может, но со своей основной задачей — просмотром
(плюс) означает присвоение разрешений, а знак - длинных файлов — он справляется «на отлично».
(минус) — лишение их. Будьте осторожны, чтобы
С помощью редактора less можно также просматри­
случайно не лишить разрешений самого себя (поль­
вать вывод других команд и почти любой програм­
зователя). Кроме того, выработайте привычку не
мы командной строки, используя для этого опера­
предоставлять доступа к файлам для групп и про­
тор канала | (pipe operator). Например, следующая
чих, если только в этом нет необходимости, — на
команда передает вывод команды is для просмотра
крупных поставщиках услуг веб-хостинга иметь
соседями по серверу сотни других пользователей — в редакторе less:
обычное дело. ls -la . I less
42 Глава 7

H ello . This i s a f i l e w ritte n in nano,


To c lo s e t h is f U e and save i t , type c o n tr o l-x .

The most common commands are at the bottom of the screen .


The A ch aracter i s shorthand for the co n tro l key.

I
I

[p Read 6:Hnes}
3 Get Help WriteOut SQ Read F ile I S Prev Page M Cut Text |j§ Ctir Pos Рис. 1.4. Окно текстового
53 e x it 35 J u s t ify SB Where Is g | Next Page 31 UnCut Txt B To S p ell
редактора nano

Удалить любой файл можно с помощью команды m исполняются на веб-сервере. Серверные сценарии
(remove): (server-side scripts) — это программы, расширяю­
щие возможности веб-сервера за пределы простого
rm имя_файла
предоставления статических HTML-страниц. Они
Подобно команде rmdir, команда m не выводит за­ позволяют пользователю получить доступ к базам
проса на подтверждение удаления файла, поэтому данных посредством браузера, сохранять данные
нужно быть осторожным в ее использовании. веб-сеанса в текстовый файл, отправлять почтовые
сообщения с веб-браузера и многое другое. Для
Оболочка UNIX содержит много других команд, но большинства проектов в этой книге вам нужно иметь
рассмотренных здесь для начала будет вполне до­ учетную запись веб-хостинга. Если у вас уже есть та­
статочно. Список наиболее употребляемых команд кая запись, она, скорее всего, предоставляет возмож­
оболочки можно получить, выполнив в термина­ ности РНР. Если же нет, то при выборе поставщика
ле команду help, а информацию об определенной (провайдера) веб-хостинга убедитесь, что ваша учет­
команде — В Ы П О Л Н И В команду man имя_команды. ная запись будет иметь такие возможности.

Чтобы завершить сеанс связи с сервером и закрыть Чтобы начать работать с РНР, нужно установить со­
подключение, выполните команду logout. единение с вашей учетной записью на веб-хостинге,
используя программу ssh, как это было показано
Дополнительную информацию по работе с команд­ в предыдущем разделе. Некоторые веб-хостинги
ной строкой в UNIX- и Linux-системах можно по­ не предоставляют возможности ssh-подключения,
черпнуть в книге «UNIX Operating System» (изда­ так что проверьте, предоставляет ли ваш провай­
тельство O’Reilly), авторы Джерри Пик (Jerry Peek), дер веб-хостинга такую услугу. Если нет, подыщите
Грейс Тодино-Гонгет (Grace Todino-Gonguet) и Джон другого провайдера веб-хостинга, разрешающего
Стренг (John Strang). ssh-подключение, чтобы обрести гибкость, предо­
ставляемую возможностью работы с веб-сервером
с помощью командной строки.
PHP
Большинство серверных программ в этой книге Итак, подключившись к веб-серверу, выполните
написаны на языке РНР. Язык РНР — один из са­ следующую команду:
мых распространенных языков сценариев, которые php -v
Средства 43

Сервер должен ответить сообщением, подобным код и сохраните файл под именем hello.php в пап­
следующему: ке public_html (или эквивалентной домашней папке
вашего веб-сайта — например, www или web/public,
РНР 5.3.4 (eli) (built: Dec 15 2010 12:15:07)
в зависимости от веб-сервера вашего хостинга) на
Copyright (с) 1997-2010 The PHP Group
своем веб-сайте:
Zend Engine v2.3.0, Copyright (c) 1998-2010
Zend Technologies
<?php
echo «<html><head></headxbody>\n»;
Полученное сообщение содержит информацию о вер­
echo «hello world!\n»;
сии РНР, установленной на веб-сервере. Код для
echo «</body></html>\n»;
проектов в этой книге писался под РНР5, поэтому ?>
для исполнения наших проектов на веб-сервере
должна быть установлена эта или более поздняя Затем в командной строке выполните следующую
версия РНР. Язык РНР, как уже отмечалось, по­ команду:
зволяет создавать веб-страницы, которые выводят
результаты поиска в базах данных, отправляют со­ php hello.php

общения другим серверам, отправляют сообщения


электронной почты и многое другое. Результат исполнения этой команды должен быть
следующим:
Большинство сценариев РНР не исполняются не­
<htmlxheadx/headxbody>
посредственно из командной строки. Вместо этого
hello world!
веб-серверу (самым распространенным из которых
</bodyx/html>
является Apache) отправляется запрос на предостав­
ление файла сценария РНР. Для этого следует вве­
Теперь откройте этот файл в браузере. Для этого
сти адрес требуемого документа в адресную строку
в строку адреса браузера введите адрес вашего веб­
веб-браузера и нажать клавишу <Enter>. Веб-сервер
сайта, косую черту И И М Я файла: www.example.com/
исполняет сценарий в запрошенном файле и отправ­
hello.php, Где www.example.com — URL (адрес) ваше­
ляет запрашивающему браузеру результаты испол­
го веб-сайта. Полученная от веб-сервера страница
нения.
будет выглядеть примерно так (рис. 1.5).
Вопрос исполнения сценариев РНР более подробно
рассматривается в главе 3. А пока давайте создадим
пару простых рабочих PHP-программ. Откройте
текстовый редактор, скопируйте в него следующий

Рис. 1.5. Результат


исполнения первого
сценария РНР
hello world! в браузере
il
44 Глава 1
--------------------------------------- ------------------------ II завершаем HTML:
Причины неудачи echo «</body></html>\n»;
Если вместо вывода, показанного на рис. 1.5, вы­ ?>
водится исходный код РНР-сценария, возможно,
что РНР-файл был открыт как локальный файл, Чтобы просмотреть результаты выполнения этого
а не как файл серверного сценария. В таком слу­ сценария, введите в строку адреса браузера адрес
чае URL в адресной строке браузера будет начи­ вашего веб-сайта, косую черту и имя файла: www.
наться с file://, вместо необходимого http://. example.com/time.php, где w w w .example.com — URL

Другой причиной может стать то, что ваш веб­ вашего веб-сайта. В результате исполнения этого
сервер не настроен для работы с РНР. Еще сценария в браузере выводится следующий текст:
одной причиной может быть использование
Здравствуй, мир!
веб-сервером другого расширения для файлов Сегодняшнее число: 2014-04-13 11:32:08
сценариев РНР — например, php4. Обратитесь
к поставщику вашего веб-хостинга за дополни­
Как можно видеть, эта программа использует пере­
тельной информацией.
менную $date и вызывает встроенную функцию РНР
date (), которая присваивает значение этой перемен­
Как вы могли заметить, при просмотре файла РНР ной. В РНР типы данных переменных объявлять не
в браузере на экран выводится HTML-текст. Код требуется. Имя переменной должно начинаться со
РНР можно совмещать с кодом HTML в одном фай­ знака $, а переменная может содержать целое чис­
ле. Для этого блок кода РНР, вставляемый в код ло, число с плавающей точкой или строку. Так же,
HTML, нужно выделить тегами <? и ?>, которые как и в Processing, в РНР используется С-подобный
обозначают начало и окончание блока кода РНР. СИНТаКСИС, ПОЭТОМУ Операторы УСЛОВИЯ if-then,
Если при попытке открыть сценарий РНР в брау­ циклы и комментарии будут выглядеть знакомыми.
зере выводится сообщение об ошибке, спросите у
системного администратора веб-сервера, нет ли у
них каких-либо дополнительных требований, что­ Переменные в РНР
бы сценарии РНР, например, находились на сервере
в особых папках, или не требуются ли какие-нибудь Переменные в РНР обрабатываются несколько по-
специальные разрешения для файлов РНР. иному, чем в Processing или Arduino. В последних
двух средах переменным можно присваивать лю­
Теперь рассмотрим более сложный РНР-сценарий. бые имена — при условии, что не используются
Сохраните файл с этим кодом в папке public_html ва­ слова, которые являются командами. Кроме того,
шего веб-сервера под именем time.php: переменная объявляется указанием ее типа перед
именем при первом ее использовании. В РНР ука­
<?php зывать тип переменной не требуется, но нужно,
/* чтобы ее имя начиналось со знака $, как это можно
Date printer
Контекст : РНР
было видеть в предыдущем сценарии РНР. Там пе­
ременной $date присваивается строковое значение
Выводит дату и время в странице HTML. посредством функции date ().
*/
// Получаем и форматируем дату: В РНР существует несколько функций для проверки
$date = date("Y-m-d h:i:s\t"); состояния переменных. Например, функция isset о
II выводим начало страницы HTML:
проверяет переменную на присвоение ей значения,
echo "<htmlxheadx/headxbody>\n" ; а функции is_booi(), is_int() и is_string() прове­
echo "Здравствуй, мир!<Ьг>\п"; ряют на наличие в переменной значения определен­
/ ! Добавляем дату: ного типа — булева, целого или строкового, соот­
echo "Сегодняшнее число: $date<br>\n"; ветственно.
Средства 45

PHP также содержит три важных встроенных пере­ Инструменты для работы
менных, называемых переменными среды, — их
необходимо знать: $_r e q u e s t , $_g e t и $_p o s t . Эти через последовательны й порт
переменные предоставляют результаты исполнения
Рассмотренные в предыдущем разделе программы
запроса HTTP. Сценарии РНР могут вызываться как эмуляции терминала позволяют получать доступ
из форм HTML, так и пользователем, вводом в стро­ к удаленным компьютерам через Интернет, но этим
ку адреса (URL) сценария с последующей строкой их возможности не исчерпываются. Прежде чем
переменных. Но в любом случае результаты испол­ получило широкое распространение взаимодей­
нения сценария возвращаются в переменных среды. ствие между компьютерами по сети с помощью
Переменная $_с е т возвращает результат для сце­ стека протоколов TCP/IP, для доступа к удаленным
компьютерам использовались модемы, подключен­
нариев, вызванных с помощью запроса HTTP g e t ,
ные к последовательному порту компьютера. В те
переменная $_p o s t возвращает результаты запросов далекие времена на заре развития компьютерных
HTTP p o s t , а переменная $_r e q u e s t — результаты коммуникаций многие пользователи через модем­
запросов любого типа. ный доступ подключались к доскам объявлений
и с помощью системы меню программ эмуляции
Так как запросы HTTP могут содержать несколь­ терминала оставляли сообщения, загружали файлы
ко разных фрагментов информации (например, и обменивались сообщениями с другими пользова­
поля типичной веб-формы), все переменные сре­ телями тех же досок объявлений.
ды имеют тип «массив». Чтобы получить опреде­
В настоящее время последовательный порт ком­
ленный элемент такой переменной, его необхо­ пьютера в основном служит для подключения
димо запросить по его имени. Например, если за­ к компьютеру периферийных устройств. Через по­
полняемая веб-форма содержит поле с названием следовательный порт осуществляется и обмен дан­
Name, заполняемое в него значение будет сохранено ными между компьютером и микроконтроллером
в элементе переменной $_r e q u e s t , называющемся в области программирования микроконтроллеров.
$_r e q u e s t [ 'Name ' ]. Если форма была составлена по­
В проектах из этой книги для подключения микро­
контроллера к последовательному порту компьюте­
средством запроса HTTP p o s t , э т о значение также
ра используются программы терминала.
МОЖНО получить ИЗ элемента $_POST [ 'Name ' ]. Кроме
рассмотренных переменных среды существуют Существует большое число терминальных программ,
и другие, разговор о которых пойдет позднее, но эти как платных, так и бесплатных. Одной из таких про­
три являются наиболее полезными для получения грамм является замечательная бесплатная програм­
информации от клиента, будь то веб-браузер или ма CoolTerm, разработанная Роджером Майером
микроконтроллер. Далее в книге мы рассмотрим (Roger Meier), загрузить ее можно с веб-сайта http://
freeware.the-meiers.org. Программа работает как
эти переменные более подробно, а также увидим их
на компьютерах под Mac OS X, так и под Windows,
применение. в общем, это сейчас моя самая любимая програм­
ма. Если вы решите воспользоваться ею, поступите
Дополнительную информацию по РНР, включая правильно и сделайте пожертвование, так как автор
хорошие учебные пособия, можно получить на разрабатывал ее в свое свободное время.
веб-сайте этого языка по адресу www.php.net. Для
более глубокого изучения РНР можно порекомендо­ Для пользователей Windows хорошей альтернати­
вать книгу Давида Склара (David Sklar) «Learning вой может стать программа PuTTY, поскольку она
способна открывать как последовательные терми­
РНР 5» (издательство O’Reilly).
налы, так и терминалы ssh. Программа PuTTY рабо­
тает и на компьютерах под Linux. На компьютерах
под Linux и Mac OS X можно пойти и другим пу­
тем — использовать классическую программу GNU
screen, исполняющуюся в окне терминала. Но эта
программа обладает меньшей функциональностью,
чем программа CoolTerm.
46 Глава 7

Подключение к последовательному
порту в Windows Кто п о л учи т порт?
Прежде всего, вам нужно знать имя последова­
тельного порта, к которому подключен микрокон­ Только одно приложение может одновременно
троллер. Для этого откройте диспетчер устройств, работать с последовательном портом. Иными
выполнив в консоли командной строки коман­ словами, если последовательный порт открыт
ду devmgmt.msc. Развернув раздел П орты (С О М одной программой, никакая другая программа
и L P T ) диспетчера устройств, вы увидите все не будет иметь к нему доступа, пока первая
устройства, подключенные к компьютеру через по­ программа не завершит свою работу с этим
следовательные и параллельные порты, названия портом. Когда программа пытается открыть по­
последовательных портов там имеют вид COMI, следовательный порт, она запрашивает исклю­
COM2 и т. д. чительный контроль над ним. При этом она или
выполняет запись в специальный файл, назы­
Посмотрите, к какому последовательному порту вающийся файлом блокировки, или просит опе­
подключен микроконтроллер Arduino, а затем запу­ рационную систему выполнить эту запись от ее
стите программу PuTTY. Выберите раздел Session имени. Завершив работу с последовательным
в левой панели программы и в области Connection портом, программа снимает блокировку. Иногда
type правой панели установите переключатель при сбое программы, работающей с последо­
Serial, а затем введите имя порта, к которому под­ вательным портом, порт остается заблокиро­
ключен микроконтроллер Arduino, в текстовое ванным и недоступным для других программ.
поле Serial line. Пример этих настроек показан на В таких случаях единственным способом раз­
рис. 1.6, а. блокировать последовательный порт будет пере­
загрузка системы, что снимает все блокировки.
Затем выберите раздел Serial (в самом низу левой Впрочем, можно и подождать, пока операцион­
панели) и удостоверьтесь, что значение поля Serial ная система сама не осознает, что блокировку
line to connect to в правой панели совпадает с име­ порта нужно снять. Во избежание этой про­
нем порта подключения Arduino. Далее настройте блемы всегда закрывайте последовательный
последовательную линию на скорость 9600 бод порт при переключении с одного приложения,
(поле Speed (baud)), 8 битов данных (поле Data использующего его, на другое. В этом отноше­
bits), 1 остановочный бит (поле Stop bits), без про­ нии пользователи 1лпих и Мах ОБ X должны
верки четности (значение None в поле Parity) и без выработать привычку всегда закрывать окно
управления потоком данных (значение None в поле сеанса работы с последовательным портом,
Flow control). Пример этих настроек показан на нажав комбинацию клавиш <Ог1>+<А>, а за­
рис. 1.6, 6. тем — <От1>+<\>. Пользователям \Vindows
следует прерывать подключение, закрыв окно
Теперь нажмите кнопку Open, в результате чего программы РиТТУ. Если не закрывать подклю­
откроется окно терминала последовательного под­ чение должным образом, вам придется каждый
ключения. Все, что вы введете в это окно, будет от­ раз перезагружать компьютер.
сылаться на последовательный порт, а все данные,
поступающие на последовательный порт, — выво­
диться в это окно.I

I Запустите программу для обмена данными


Если на подключенном к последовательному порту
микроконтроллеру Arduino не исполняется программа
для обмена данными с последовательным портом (как
ее запустить, мы узнаем далее), никакие данные в окно
выводиться не будут.
Средства 47

Рис. 1.6/ б. Настройка параметров


последовательного соединения
48 Глава 7

Подключение к последовательному Подключение к последовательному


порту в Mac OS X порту в Linux
Запустите программу CoolTerm (рис. 1.7) и щелкни­ Эта процедура подключения может быть использо­
те мышью по значку Options. вана как в Mac OS X, так и в Linux. Откройте окно
терминала и выполните следующую команду:
В открывшемся диалоговом окне Connection
Options выберите из раскрывающегося списка Port
Is /dev/tty.* # — для Mac OS X
Is /dev/tty* # — ДЛЯ Linux
последовательный порт, к которому подключен ми­
кроконтроллер Arduino. Имена портов в Mac OS X В результате исполнения этой команды в термина­
представлены в формате вида: ле будет выведен список последовательных портов,
/dev/tty.usbmodem241241 доступных в системе. Имена последовательных
портов в Mac OS X и Linux имеют формат вида:
Чтобы узнать наверняка, к какому порту подсоеди­
нен микроконтроллер Arduino, проверьте список /dev/tty/usbmodem2 41221
портов при отсоединенном устройстве, а затем — Выберите необходимый последовательный порт
при подсоединенном. Порт, появившийся в списке
и выполните команду:
после подсоединения микроконтроллера, и будет
его портом. Чтобы открыть порт и подключить к screen номер_порта скорость_обмена
нему микроконтроллер, нажмите кнопку Connect
на панели инструментов главного окна программы. Например, чтобы открыть последовательный порт
Чтобы отключить микроконтроллер и закрыть порт, в Mac OS X для подключения к микроконтроллеру
нажмите кнопку Disconnect. Arduino со скоростью 9600 битов в секунду, выпол­
няется команда:
Любители острых ощущений из числа пользовате­
screen /dev/tty.usbmodem241241 9600
лей Mac OS X, с учетом того, что эта система осно­
вана на UNIX, могут вместо использования про­
Соответствующая ей команда в Linux должна иметь
граммы CoolTerm подключить микроконтроллер
вид:
к последовательному порту, следуя приведенным
далее инструкциям для Linux. screen /dev/ttyUSBO 9600

Рис. 1.7. Окно программы CoolTerm


Средства 49

В результате выполнения такой команды окно тер­ клонов Arduino. В целом, клоны Arduino исполь­
минала очищается, устанавливается подключение зуются для решения обширного диапазона задач.
микроконтроллера к последовательному порту и Многие из них вполне совместимы с Arduino, и про­
все, что вводится в терминал, отправляется на от­ граммировать их можно непосредственно из среды
крытый последовательный порт. При этом вводи­ IDE Arduino. Ряд клонов располагают своими соб­
мый текст на экране не отображается, но инфор­ ственными средами IDE и будут работать только
мация, получаемая на последовательный порт от с некоторыми проектами из этой книги. Есть и та­
микроконтроллера, выводится на экране в виде кие клоны, которые имеют совместимую физиче­
символов ASCII. Чтобы закрыть последовательный скую конструкцию, но для их программирования
порт, нажмите комбинацию клавиш <Ctrl>+<A>, применяются другие языки.
а затем — <Ctrl>+<\>.
Рассматриваемые далее проекты прошли серьезное
В следующем разделе мы рассмотрим, как взаимо­ тестирование на платах Arduino и, при возможно­
действовать с микроконтроллером через последо­ сти, на классической плате Wiring. И хотя суще­
вательный порт с помощью соответствующей про­ ствуют некоторые различия между кодами для плат
граммы связи. Arduino и Wiring, код для одной из этих плат, как
правило, будет работать и на другой. Что же ка­
сается применения кода Arduino на клонах, то об
этом следует узнавать у производителя конкретно­
Аппаратное обеспечение
го клона. Многие из них очень активно участвуют
в форумах Arduino и будут рады предоставить не­
Arduino, Wiring и подобные обходимую помощь.
микроконтроллеры
Среды ГОЕ для плат Arduino и Wiring очень похожи
Для проектов в этой книге в основном используется друг на друга. Эти бесплатные среды программиро­
микроконтроллерный модуль Arduino. Этот модуль вания с открытым исходным кодом можно загрузить
(а также другой микроконтроллерный модуль — с их веб-сайтов — соответственно: www.arduino.cc
Wiring) был разработан в Институте интерактив­ и www.wiring.org.co.
ного дизайна итальянского города Иврея (Ivrea)
в 2005 году. Оба модуля основаны на одном и том Аппаратное обеспечение для обоих модулей так­
же семействе микроконтроллеров ATmega от Atmel же является открытым, и его можно приобрести
(www.atmel.com), и для программирования обоих у различных онлайновых розничных поставщи­
применяется особый «диалект» языка C/C++. Этот ков, указанных на этих сайтах. А те, кому нравится
«диалект» основан на языке Processing, так же, как создавать устройства своими собственными рука­
и используемая обоими модулями среда IDE7. ми, могут загрузить схемы печатных плат модулей
В частности, в средах IDE для Arduino и Wiring ис­ и инструкции по их сборке. Однако, все же, лучше
пользуются некоторые элементы языка Processing— приобрести уже готовый модуль, так как это будет
такие как методы setup () и loop ()8, функция шар () намного быстрее и для большинства людей намно­
и другие. го надежней. На рис. 1.8 показаны некоторые из до­
ступных плат Arduino (и одна плата Wiring).
Когда готовился первый вариант этой книги, су­
ществовала одна версия платы Wiring, четыре или Одно из самых лучших качеств плат Arduino
пять версий платы Arduino и почти никаких клонов. и Wiring — это то, что они работают одинако­
В настоящее время существует несколько моделей вым образом с платформами Windows, Mac OS X
Arduino, две новые модели Wiring и множество и Linux. Такое в области микроконтроллерных сред
разработки случается нечасто.
7 IDE, Integrateci development environment — интегрированная
среда разработки.
8 Метод draw () языка Processing изначально назывался Другим положительным моментом этих устройств
loop (). является расширяемость их сред. Точно так же, как
50 Глава 1

в программы на Processing можно включать клас­ А для знакомства с Arduino можно рекомендовать
сы и методы Java, в программы, созданные в сре­ замечательную книгу «Getting Started with Arduino»9
дах IDE для Wiring и Arduino, можно вставлять код (издательство O’Reilly), написанную Массимо
C/C++, написанный на разновидности языка С — Банци (Massimo Banzi).
AVR-C. Дополнительную информацию по этому
вопросу можно найти на сайтах модулей. 9 «Введение в Arduino».

Ш илды A rd u in o
Одной из особенностей плат Arduino, благодаря Информация о технических характеристиках
которой с ними так легко работать, являются мо­ шилдов доступна на веб-сайте www.arduino.cc.
дули расширения, называемые шилдами (shield), Если у вас есть опыт создания печатных плат,
которые позволяют добавлять к основному моду­ попробуйте сделать свой собственный шилд. Вы
лю Arduino дополнительные функциональности. можете обнаружить, что это довольно занима­
Шилды, созданные сторонней компанией или тельно.
частным разработчиком, существуют для боль­
шинства задач. Вам нужен синтезатор MIDI? До недавнего времени шилды для плат Arduino
Есть такой шилд. Нужен вывод NTSC-видео? были физически несовместимы с платами Wiring.
Такой шилд также имеется. Требуется Wi-Fi Но компания Rogue Robotics (www.roguerobotics.
или Ethernet? И такие шилды есть (и широко ис­ com) только что начала предлагать адаптер для
пользуются в проектах этой книги). На рис. 1.9 плат Wiring, который позволяет подключать к ней
показаны примеры нескольких готовых шилдов шилды для плат Arduino.
и макетных плат для разработки собственных.
Однако будьте осторожны! Не каждый шилд со­
Увеличивающаяся доступность шилдов стала вместим с каждой платой. Рабочее напряжение
одним из главных факторов в распространении некоторых плат клонов отличается от напряже­
плат Arduino. Шилды качественной разработки и ния плат Arduino, поэтому они могут быть несо­
с детальной документацией позволяют создавать вместимыми с шилдами, работающими на напря­
различные проекты людям, не имеющим вообще жении 5 вольт. Если вы используете микрокон­
никакого опыта работы с электроникой. Для од­ троллер иной, нежели Arduino, проверьте, что его
них проектов в этой книге мы возьмем уже го­ технические характеристики позволяют исполь­
товые шилды, а для других — соберем свои соб­ зовать его с требуемыми шилдами. Эту информа­
ственные. цию можно получить у производителя платы.

Наиболее часто в книге используются следующие


шилды: шилд Ethernet, позволяющий подклю­
чать микроконтроллер к Интернету через сеть
Ethernet; шилд для беспроводной связи, позво­
ляющий подключать микроконтроллер к радио­
модулям ХВее компании Digi и другим радиомо­
дулям с такими же характеристиками; макетные
шилды для разработки специальных схем.
Средства 51

Рис. 1.8. Разновидности плат Arduino, а также плата Wiring:


I . LilyPad Arduino. 2. Arduino Uno SMD. 3. Arduino Fio. 4. Arduino Pro Mini. 5. Arduino Mini.
6. Arduino Nano. 7. Arduino Mega 2560.8. Arduino Uno. 9. Плата Wiring. 10. Arduino Pro.
I I . Arduino Ethernet. 12. Arduino Bluetooth. 13. Arduino Buemilanove

Рис. 1.9. Несколько примеров


шилдов Arduino:
1. Шилд Arduino
для разработки прототипов.
2. Шилд Adafruit
для разработки прототипов.
3. Шилд Arduino Ethernet.
4. ШилдТткеггКИ: DMX.
5. Шилд Arduino для
беспроводной связи.
6. Комбинация платы Arduino
и беспаечной макетной платы
(изготовитель — Adafruit).
7. Шилд microSD компании
SparkFun.
8 . Шилд драйвера двигателей
компании Adafruit.
9. Шилд для музыкальных
инструментов компании
SparkFun
52 Глава 1

Д р уги е м и кроконтр о ллер ы


Хотя примеры в этой книге сосредоточены на на их основе. В частности, наиболее распростра­
использовании плат Arduino, существует мно­ ненными микроконтроллерами на рынке люби­
го других микроконтроллерных платформ, ко­ тельской электроники являются микроконтрол­
торые можно применить для выполнения та­ леры Basic Stamp (BS) и Basic Stamp 2 (BS-2)
ких же заданий. Несмотря на различия между компании Parallax (www.parallax.com). С ними
микроконтроллерными платформами, некото­ легко работать, и они предоставляют те же основ­
рые принципы являются общими для них всех. ные функциональности, что и Arduino, и Wiring.
Микроконтроллеры — это, по существу, неболь­ Но в языке PBASIC, используемом для их про­
шие компьютеры. Они взаимодействуют с внеш­ граммирования, отсутствует возможность пере­
ним миром, подавая последовательности положи­ дачи параметров функциям, что усложняет про­
тельных и отрицательных напряжений на выводы граммирование многих примеров из этой книги.
и получая подобные последовательности на вхо­ У микроконтроллеров PICAXE компании
дах. Большинство микроконтроллеров также спо­ Revolution Education (www.rev-ed.co.uk) среда
собны определять наличие переменного напряже­ разработки во многом подобна среде PBASIC для
ния на некоторых своих контактах ввода/вывода. микроконтроллеров Basic Stamp, но они пред­
Все микроконтроллеры могут взаимодействовать ставляют собой менее дорогой вариант для начала
с другими компьютерами с помощью той или работы с микроконтроллерами, чем модули Basic
иной формы цифровой связи. Далее приводится Stamp. Микроконтроллеры PICAXE, как и Stamp,
краткий обзор нескольких других микроконтрол­ могут применяться в проектах из этой книги, но
леров, доступных на рынке в настоящее время. ограниченные возможности их языка программи­
рования усложняют это применение.
8-разрядные контроллеры
Микроконтроллеры PIC и AVR
Микроконтроллеры Atmel, на которых основа­
ны как платы Arduino, так и Wiring, являются Модули Arduino и Wiring основаны на микро­
8-разрядными микроконтроллерами. Это означа­ контроллерах AVR компании Atmel, а модули
ет, что они могут обрабатывать данные и инструк­ Basic Stamp и PICAXE — на микроконтроллерах
ции порциями размером в 8 битов (разрядов). PIC компании Microchip (www.microchip.com).
Благодаря низкой стоимости, 8-разрядные микро­ Среды программирования всех этих модулей
контроллеры получили широкое распростране­ представляют собой по сути оболочки для соот­
ние. Они могут очень эффективно воспринимать ветствующих микроконтроллеров, значительно
информацию об определенных аспектах физиче­ упрощающие работу с ними. Чтобы работать
ского мира и управлять устройствами на основе с этими микроконтроллерами без соответствую­
этой информации. Скорость, с которой микрокон­ щей среды программирования, вам потребуется
троллеры могут воспринимать базовую информа­ аппаратное устройство программирования, под­
цию о физических характеристиках, значительно ключаемое к компьютеру, а также соответствую­
превышает скорость, с какой эту информацию щая среда программирования и компилятор.
могут воспринимать люди. Микроконтроллеры
используются практически во всех повседневных Хотя сами микроконтроллеры недорогие (от $1
электронных устройствах — от радиочасов до до $10 за штуку), приобретение всего необхо­
холодильников и автомобилей. димого оборудования для их программирова­
ния может обойтись вам в хорошую копеечку.
Кроме микроконтроллеров Atmel, существует Кроме того, вам придется затратить довольно
много других 8-разрядных микроконтроллеров, значительное время на обучение пользованию
прекрасно подходящих для разработки устройств этими инструментами, так как уровень знаний,
Средства 53

Д р уги е м и кр о ко н тр о ллер ы (окончание)


как аппаратного, так и программного обеспече­ рядного процессора (ARM Cortex-МЗ) является
ния, необходимый для пользования ими, намного плата Mapple компании LeafLabs. Эта плата имеет
выше, чем для других инструментов, рассматри­ такой же форм-фактор, как и плата Arduino Uno,
ваемых в этой книге. и программируется на языке C/C++, подобно пла­
там Arduino и Wiring. Кроме упомянутых здесь
плат, в ближайшем будущем на рынок ожидается
32-разрядные контроллеры
поступление еще нескольких других.
В вашем персональном компьютере, скорей всего,
установлен 64-разрядный процессор, а в мобиль­ Все возрастающая легкость использования
ном телефоне — 32-разрядный. Эти процессоры 32-разрядных процессоров сулит захватываю­
могут выполнять более сложные задачи — такие щие возможности для разработчиков физических
как многозадачность и управление записью и вос­ интерфейсов, хотя и не обязательно в области
произведением мультимедиа. базового ввода/вывода. Уже восьмиразрядные
микроконтроллеры могут обнаруживать про­
Вначале 32-разрядные процессоры были доволь­ стые физические изменения и управлять выво­
но дорогими и сложными в программировании, дом с разрешением, превышающим возможности
но в последние пару лет эта ситуация быстро человеческого восприятия. Но такие сложные
менялась, и теперь на рынке присутствуют не­ возможности, как распознавание жестов, много­
сколько доступных 32-разрядных микроконтрол- задачность, упрощенное управление памятью
лерных платформ. Одним из примеров таких и взаимодействие с устройствами с помощью та­
микроконтроллеров является плата BeagleBoard ких же методов и библиотек, как и персональные
компании Texas Instruments (http://beagleboard. компьютеры, — все это даст значительный эффект.
org), содержащая почти все необходимые эле­ 32-разрядные процессоры предоставляют разра­
менты простого персонального компьютера: ви­ ботчикам физических интерфейсов возможность
деовыход HDMI, разъемы для подключения USB- использовать или преобразовывать библиотеки
устройств, SD-карт, запоминающих устройств кода и инфраструктуры, разработанные на сер­
большого объема и многое другое. Управление верах и персональных компьютерах. В этом и за­
этой платой осуществляется облегченной верси­ ключается особая важность этих процессоров.
ей операционной системы Linux. Другим приме­
ром платы на основе 32-разрядного процессора Все эти возможности только начинают реализо­
является плата Netduino. Эта плата поддержи­ вываться, и их описание может с легкостью за­
вает шилды для Arduino, но для ее программи­ полнить книгу, а то и несколько. Но базовые сен­
рования используется версия с открытым кодом сорные возможности и сетевая связь вполне под
платформы программирования .NET корпорации силу 8-разрядным микроконтроллерам, поэтому
Майкрософт. Еще одной платой на основе 32-раз- внимание этой книги сконцентрировано на них.

Ф Ф Подобно всем микроконтроллерам, модули разъем. Сейчас мы пока будем подавать электропи­
Н И Arduino и Wiring являются, по сути, просто тание на модуль через и8В-разъем. Но для многих
небольшими компьютерами. И подобно любому проектов желательно отсоединить модуль от ком­
компьютеру, они оснащены возможностями ввода пьютера после завершения их программирования.
и вывода, разъемом питания и портом связи для В таких случаях электропитание платы будет осу­
взаимодействия с другими устройствами. Питание ществляться с помощью отдельного источника пи­
на эти модули можно подавать или от отдельного тания.
источника питания, или от компьютера через USB-
54 Глава 1

На рис. 1.10 показаны вводы и выводы платы сброса. Мы будем постоянно обращаться к указан­
Arduino Uno. Другие модули Arduino и плата Wiring ным компонентам платы, так как они составляют
подобны Arduino Uno. основу для всех проектов в этой книге.

Модули Arduino оснащены компонентами, стан­


дартными для большинства микроконтроллеров: Начало работы
аналоговыми входами, цифровыми входами/выхо-
дами и контактами питания и «земли». Некоторые Так как процессы установки драйверов для плат
из контактов ввода/вывода могут использоваться Arduino и Wiring похожи, мы рассмотрим здесь
и для последовательной связи. Ряд других контак­ установку программного обеспечения только для
тов могут использоваться для широтно-импульсной Arduino. Пользователи плат Wiring могут следо­
модуляции10 (ШИМ). Платы Arduino u Wiring осна­ вать этим инструкциям, лишь заменяя в них слово
щены также разъемом USB, который подключен «Arduino» на «Wiring». Загрузите требуемое про­
к контроллеру USB/RS-232. Это позволяет микро­ граммное обеспечение с соответствующего сайта
контроллеру взаимодействовать с компьютером и следуйте приведенным далее инструкциям для
через USB-nopm. Платы также несут колодку его установки. Но прежде обязательно проверьте
разъемов для программирования микропрограмм­ на сайтах наличие возможных обновлений к этим
ного обеспечения микроконтроллера (чем мы ни­ инструкциям.
когда не будем заниматься в этой книге) и кнопку

10 Способ эмулирования аналогового напряжения, при очень


быстром включении и отключении напряжения на контакте.

Контакты 0-13: цифровые


вводы/выводы
Контакты 3, 5, 6, 9, 10,11 :
аналоговые выводы (ШИМ)
Общий
K u s £ rT а—
вход ("земля" ///, у / \\\ \ Передача
I Прием
/
232ч
*1 ,# J i\ . 1 /
_Контакты 0, 1:
USB ^последовательная связь

Кнопка
/с б р о с а
Регулятор
напряжения, Микроконтроллер
5В^
Входное
напряжение, 9-15 В
постоянного тока
I

Сброс ^ Контакты А0-А5:


(коснуться общего /"'общ ий \ аналоговые вводы
для сброса) /" ("земля”) Соединен напрямую (также могут функционировать,
напряжения со входом напряжения как ци* Р 08ые вводы/выводы)
9-15 В пост, тока

Рис. 1.10. Функциональные части платы Arduino


Средства 55

установки драйверов не происходит, копия драй­


Обновление программного
веров находится во вложенной папке drivers папки
обеспечения
приложения среды разработки Arduino и их можно
Программное обеспечение для Arduino и Wiring установить оттуда обычным способом.
часто обновляется. В этой книге описывается
работа с версией 1.0 как для Arduino, так и для Если у вас плата Arduino Uno или более новой вер­
Wiring. Но к тому времени, когда она попадет сии, откройте панель управления, щелкните по
к вам, ПО может измениться, поэтому проверяй­ ссылке Система и безопасность, затем по ссыл­
те сайты Arduino и Wiring на предмет последних ке Система, а далее (в левой панели окна) — по
обновлений. ссылке Диспетчер устройств. В окне диспетчера
у ......... .......................................................... J устройств разверните раздел Порты (СОМ и LPT),
щелкните правой кнопкой по элементу Arduino
UNO (СОМхх) и в открывшемся контекстном меню
выберите опцию Обновить драйверы (Update
Установка на Mac OS X Driver Software). В открывшемся диалоговом окне
Распакуйте загруженный файл, выполнив на нем Обновление драйверов — Arduino Uno (COMbar)
двойной щелчок мышью. Полученный после рас­ щелкните по ссылке Выполнить поиск драйве­
паковки образ диска содержит приложение Arduino ров на этом компьютере (Browse my computer for
и установщик драйверов FTDI USB/RS-232. Driver software). В следующем окне нажмите кноп­
Перетащите приложение в каталог Arduino. Если у ку Обзор (Browse) и в открывшемся окне Обзор
вас Arduino Uno или более новая плата, драйверы папок перейдите в папку, содержащую файл драй­
FTDI вам не потребуются, но они необходимы для веров для Arduino Uno ArduinoUNO.inf, и выберите
платы Duemilanove или более старых плат Arduino, этот файл. Из этой точки Windows самостоятельно
а также для платы Wiring. В любом случае, неза­ выполнит установку драйверов.
висимо от того, какая у вас плата, установить эти
драйверы не повредит. Запустите установщик на
исполнение и следуйте выводимым инструкциям. Установка на Linux
Установив среду разработки Arduino, можно при­
Версия программной среды Arduino для Linux за­
ступать к работе над проектами.
висит от используемого дистрибутива Linux. Под­
робную информацию об этом для нескольких
дистрибутивов Linux можно найти на веб-сайте
w w w .arduino.cc/playground/L earning/L inux.
Установка на Windows 7 Пользователи Ubuntu имеют возможность уста­
Распакуйте загруженный файл в любую папку, но новить среду программирования Arduino с по­
лучше всего в папку Program Files. Затем устано­ мощью Ubuntu Software Center, выбрав в нем раз­
вите драйверы для платы. Драйверы нужно уста­ дел Science and Engineering, затем Electronics,
навливать, независимо от того, какая у вас плата: а в нем — Arduino IDE.
Arduino Uno, или более старая плата Arduino, или
плата Wiring.

Подсоедините плату Arduino к разъему USB ком­


пьютера и предоставьте Windows обнаружить но­
вое устройство и начать процесс установки драй­
веров для него. Для платы Duemilanove или более
ранней нужно установить драйверы FTDI. Эти
драйверы должны установиться автоматически из
Интернета при подсоединении платы к компьюте­
ру. Если по какой-либо причине автоматической
56 Глава 1

Д о кум ен ти р уй те свою р а б о ту

Эта книга изобилует принципиальными схема­ принципиальных схем, поскольку позволяет


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

• Adobe Illustrator (www.adobe.com/products/ Рисунок 1.1011 был создан с помощью всех этих
illustrator.html). Это непревзойденный графи­ трех программ, в нем совмещена работа Джоди
ческий редактор, хотя он несколько дороговат Калкин и Джорджио Оливеро с несколькими
и требует времени, чтобы научиться хорошо фрагментами рисунков Андре Кнорига (Andre
им пользоваться. Для этого графического ре­ Knorig) и Джонатана Коэна (Jonathan Cohen),
дактора также существует много бесплатных сделанных в программе Fritzing. К этому рисунку
библиотек символов электронных компонен­ мы будем в процессе работы часто возвращаться.
тов, которые можно загрузить из Сети.
Неплохо также записывать то, что вы делаете,
• Inkscape (www.inkscape.org). Инструмент
и делиться своими записями с другими, чтобы
для редактирования векторной графики с от­
они могли воспользоваться вашим опытом. Лично
крытым исходным кодом. Хотя он и не имеет
я пользуюсь тремя средствами для создания за­
столь развитого пользовательского графиче­
меток: блогами на платформе Wordpress (www.
ского интерфейса, как Adobe Illustrator, это
wordpress.org), размещенными на веб-сайтах
совсем неплохой редактор. Большинство схем
w w w .m akingthingstalk.com ,http://tigoe.net/blog
в этой книги были созданы с помощью про­
и http://tigoe.net/pcomp/code, хранилищем github
грамм Adobe Illustrator и Inkscape.
(https://github.com/tigoe) и стопкой тетрадок
• Fritzin g (www.fritzing.org). Программа с Maker's Notebook (www.makershed.com, артикул
открытым исходным кодом Fritzing пред­ №9780596519414).
назначена для разработки, документирова­
ния и обмена электронными проектами. Это 11 Имеется в виду рисунок из оригинального издания с ан­
хороший инструмент для обучения чтению глийскими надписями в выносках. — Ред

Теперь мы готовы работать с Arduino. Подсоедините


модуль к порту USB компьютера и щелкните двой­
ным щелчком по значку Arduino IDE, чтобы запу­
стить приложение. Откроется окно редактора кода
(рис. 1.11).
Средства 57

'O u n c fB u t t ‘' л! *

'■■' ; . !&■' ’■*•:■'•. V,


■*l • P 1 f1'к"\ I V,« /I
31 •pг i n11n( щ ш r tin t ton ) ;

Рис. 1.11. Среда программирования Arduino.


Среда программирования Wiring точно такая же, только другого цвета

Изменения в версии 1.0


среды Arduino IDE
Пользователи предыдущих версий среды разра­ конфликтов с Processing, где используется расшире­
ботки Arduino обнаружат некоторые изменения ние pde. В среде Wiring 1.0 продолжается использо­
в версии 1.0 — в частности, несколько измени­ ваться расширение pde. Кроме того, в Arduino 1.0
лась панель инструментов. На рис. 1.12 сравнива­ можно загружать скетчи с помощью внешнего ап­
ются панели инструментов Arduino 0022 (до 1.0), паратного программатора, который выбирается
Arduino 1.0 и Wiring 1.0. в опции Программатор (Programmer) меню Сервис
(Tools).
Файлы скетчей версии Arduino 1.0 сохраняются
с расширением ino вместо pde с тем, чтобы избежать
58 Глава 1

Рис. 1.12. Панели инструментов


для сред разработки Arduino 0022 {а),
Arduino 1.0 (б) и Wiring 1.0 (в)

Среда программирования Arduino основана на язы­


ке Processing, на панели инструментов окна среды
расположены кнопки Создать (New), Открыть
(Open) и Сохранить (Save). Также здесь находит­
ся кнопка для проверки скетча, называющаяся
Проверить (Verify), и кнопка Загрузить (Upload).
Нажатие кнопки Проверить выполняет компили­
рование программы, чтобы проверить на наличие
ошибок синтаксиса, а кнопки Загрузить — компи­
лирует код и загружает его в модуль микроконтрол­
лера. Кроме того, у правого края панели инстру­
ментов расположена кнопка Монитор порта (Serial
Monitor), которая управляет возможностью получе­
ния данных последовательной связи из модуля при
отладке.

Рис. 1.13. Подключение светодиода к разъему платы


Arduino для исполнения программы «Мигалка». Если
программа должна исполняться больше, чем несколько
минут, вставьте в цепь последовательный резистор
номиналом в 220 Ом
Средства 59

/* Мигалка
Ш Пишем код
Контекст : Arduino
Создадим, наконец, нашу первую
программу: Мигает светодиод, подключенный к контакту 13, каждые полсекунды.

Соединения:
Контакт 13: на анод (+) светодиода (катод (-) светодиода
заземляется)

*/

int LEDPin = 1 3 ;

void setup() {
pinMode(LEDPin, OUTPUT); // определяем контакт 13,
// как вывод
}

void loop () {
digitalWrite(LEDPin, HIGH); // включаем светодиод на
// контакте 13
delay(500); // ждем полсекунды
digitalWrite(LEDPin, LOW); // выключаем светодиод
delay(500); // ждем полсекунды

Для исполнения программы подключите анод На компьютерах под Windows имя последователь­
(длинную ножку) светодиода к контакту 13 (+), а ка­ ного порта имеет формат вида: сомх, где х — какая-
тод (короткую ножку) — к контакту GND (общий), либо цифра. Например: сом5.
как показано на рис. 1.13.
Примечание
Затем введите код в редактор. После чего выберите На компьютерах под Windows номера портов с СОМ 1
в меню Сервис опцию Плата (Board) и выбери­ по COM4 обычно зарезервированы для встроенных по­
те из списка свою плату, а затем в списке в опции следовательных портов, независимо от того, есть они
в действительности на компьютере или нет.
Последовательный порт (Serial Port) — последо­
вательный порт платы. На компьютерах под Мае
Выбрав версию платы и последовательный порт, на­
OS или Linux имя последовательного порта имеет
жмите кнопку Проверить, чтобы скомпилировать
формат вида:
код программы. После успешного завершения ком­
/dev/tty.usbmodem241241 пилирования в строке сообщений внизу окна редак­
тора выводится сообщение Компилирование вы­
Но для более старых версий платы Arduino, а также полнено (Done compiling). Теперь нажмите кнопку
для платы Wiring, формат будет иметь вид: Загрузить, чтобы загрузить скомпилированный код
/dev/tty.usbserial-lBl
в микроконтроллер. Загрузка займет несколько се­
кунд. По завершении загрузки в заголовке панели
Здесь буквы и цифры после тире будут немного раз­ сообщений внизу окна редактора выводится со­
ными при каждом подключении платы. общение Загрузка выполнена, а в самой панели
60 Глава 1

сообщений отображается следующее сообщение Связь по последовательному порту


подтверждения:
Одной из самых распространенных задач, которую
Размер скетча в двоичном коде: выполняет микроконтроллер в проектах этой книги,
1 084 байт (из 32 256 байт максимум)
является отправка данных через последовательный
(Binary sketch size: 1010 bytes
канал связи, чтобы, например, предоставить ин­
(of a 32256 byte maximum))
формацию с датчика программе управления на ком­
Размер скетча в двоичном коде:
пьютере или получить от программы команду для
1 084 байт (из 32 256 байт максимум) управления двигателем, светодиодом или другим
устройством. Независимо от того, с каким устрой­
После загрузки скетча в микроконтроллер, подклю­ ством взаимодействует микроконтроллер, он дела­
ченный ранее к микроконтроллеру, светодиод нач­ ет это с помощью одинаковой процедуры и команд.
нет мигать. Вот мы и создали микроконтроллерный Сначала для последовательного порта устанавли­
эквивалент программы «Здравствуй, мир!». вается правильная скорость. Затем выполняется
чтение байтов, поступающих в порт с устройства,
Как получить помощь? запись байтов в порт для отправки в устройство или
попеременно обе эти операции, в зависимости от
Если по какой-либо причине программа не работает
должным образом, вам может потребоваться посторон­ подключенного устройства и выполняемой задачи.
няя помощь. Много учебных пособий вы можете найти
в разделе Learning веб-сайта Arduino (www.arduino.
cc/en/Tutorial). Кроме того, на форумах Arduino (www. Реализация последовательной связи в Arduino
arduino.ee/forum) и Wiring (http://forum.wiring.co) Если вы ранее работали с модулем Basic Stamp или ком­
полно людей, которые с удовольствием окажут вам не­ пилятором PicBasic Pro, реализация последовательной
обходимую помощь. связи в Arduino будет для вас сначала непривычной.
В языке PBasic и компиляторе PicBasic Pro контакты
для последовательной связи и скорость обмена опреде­
ляются при каждой отправке сообщения. Для Wiring
и Arduino для последовательного обмена всегда приме­
няются одни и те же контакты, а скорость обмена уста­
навливается в начале программы. Этот подход не столь
гибкий, как предоставляемый PBasic, но он имеет свои
преимущества, которые мы вскоре увидим.

О послед овательн ом п ор те
Последовательный порт, связанный с модулем Никогда не отсоединяйте устройство в процессе
Arduino или Wiring, в действительности является использования им последовательного порта —
программным драйвером, который загружается сначала нужно прекратить работу программы,
при каждом подсоединении модуля к компью­ использующей этот последовательный порт.
теру. При отсоединении модуля драйвер деак­ В противном случае сбой приложения вам обе­
тивируется, и последовательный порт удаляется спечен, с хорошей возможностью сбоя всей опе­
из списка доступных портов. Номер порта также рационной системы, в зависимости от качества
может быть другим при каждом подсоединении программного драйвера.
модуля. На компьютерах под Windows это может
быть другой номер COM-порта, а на компьюте­
рах под Mac OS меняется буквенно-цифровой код
в конце номера порта.
Средства 61

Ш Пишем код
Простой последовательный обмен
Наша следующая программа для Контекст : Arduino
Arduino ожидает поступления Мониторит последовательный порт; увеличивает полученный
данных через последовательный байт
порт. Она увеличивает получен­ на единицу и отправляет его обратно.
ное значение на единицу и от­ Также мигает светодиод, подключенный к контакту 13,
каждые полсекунды.
правляет результат обратно. Она
также регулярно мигает свето­
диодом (подключенным так же,
int LEDPin = 13; // вместо контакта 13 можно
как и в предыдущем примере), // использовать
информируя о нормальном ходе // любой контакт цифрового
выполнения: // ввода-вывода
int inByte = 0; // переменная для хранения полученных
// данных
long blinkTimer = 0; // отслеживает время, прошедшее после
// последнего выключения светодиода
int blinklnterval = 1000; // период включения/выключения —
// одна секунда

void setup() {
pinMode(LEDPin, OUTPUT) // определяем контакт 13, как
// вывод
Serial.begin(9600); // задаем скорость обмена
// последовательного
// порта в 9600 бит/сек
}

void loop() {
// Если есть входящие данные:
if (Serial.available () > 0 ) {
// Считываем первый байт:
inByte = Serial.read();
// Увеличиваем значение на единицу и отправляем
// обратно:
Serial.write(inByte+1);

// Одновременно мигаем светодиодом.


// Включаем светодиод по истечению полсекунды:
if (millis() - blinkTimer >= blinklnterval / 2) {
digitalWrite(LEDPin, HIGH); // включаем светодиод
// на контакте 13
}
// Спустя полсекунды выключаем светодиод и сбрасываем
// таймер :
if (millis() - blinkTimer >= blinklnterval) {
digitalWrite(LEDPin, LOW); // выключаем светодиод
blinkTimer = millis(); // сбрасываем таймер
}
62 Глава 1

Сначала скомпилируйте программу и загрузите ее в Введите любую букву в строку ввода и нажмите
микроконтроллер. Затем нажмите кнопку Монитор кнопку Послать (или клавишу <Еп1ег> на клавиа­
порта (кнопка у правого края панели инструмен­ туре). Модуль ответит следующей по порядку бук­
тов). Откроется окно монитора порта (рис. 1.14). вой алфавита. Все правильно — модуль обработал
Установите скорость обмена в 9600 бод, выбрав со­ полученный символ, увеличил его значение А8СП
ответствующее значение в раскрывающемся списке на единицу и вывел его в окне монитора порта.
в правом нижнем углу этого окна.

Рис. 1.14. Окно монитора порта


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

ЩЩХЩщ

111
тж

lip
Шт

ир
Шт

Подсоединение компонентов Базовые схемы


к плате
В проектах этой книги очень часто используются
Кроме контактов ввода/вывода платы Arduino две базовые схемы: цифровой ввод и аналоговый
и Wiring не оснащены никакими другими разъема­ вывод. Если у вас уже есть опыт в области разра­
ми, поэтому для построения схем устройств ввода/ ботки микроконтроллерных устройств, эти схемы
вывода (датчиков и приводов) нам потребуется бес- должны быть вам знакомы. Когда нам нужно за­
паечная макетная плата. На рис. 1.15 показан при­ мерить значение датчика, можно применить одну
мер использования такой платы для подключения из этих схем. Даже если в конечном проекте за­
к модулю Arduino компонентов электронной схемы. действован специальный датчик, эти схемы можно
использовать в качестве заполнителей, просто для
того, чтобы видеть любые изменяющиеся значения
данных, поступающих с датчика.
Средство 63

Цифровой ввод Аналоговый ввод


Цифровой ввод микроконтроллера — это всего Схема на рис. 1.17 называется делителем напряже­
лишь выключатель, подсоединенный к источнику ния. В этой схеме напряжение делится между дву­
напряжения и контакту цифрового ввода микрокон­ мя сопротивлениями, одно из которых постоянное,
троллера. Такой контакт подсоединяется к массе а другое — переменное. Номинал напряжения
через сопротивление высокого номинала (ЮкОм (в точке соединения сопротивлений) определяет­
будет достаточно). Это сопротивление называется ся соотношением номиналов сопротивлений. Если
сопротивлением утечки или согласующим сопро­ эту точку подключить к микроконтроллеру, запро­
тивлением. Другим вариантом будет подключение граммированному как аналого-цифровой преобра­
выключателя к общему, а резистора — к положи­ зователь и оснащенному соответствующим устрой­
тельному контакту источника питания. В этом ством вывода, мы сможем наблюдать изменение
случае сопротивление называется нагрузочным. напряжения при изменении номинала переменного
Нагрузочное сопротивление и сопротивление утеч­ сопротивления. Переменное сопротивление может
ки предоставляют соответственно положительный быть любого типа: фотосопротивление, термистор,
или отрицательный источник опорного напряжения датчик давления, датчик изгиба и т. п.
для контакта цифрового ввода. Когда выключатель
смонтирован, как показано на рис. 1.16, замыкание На рис. 1.18 показан тип переменного сопротив­
его контактов подает высокий логический уровень ления, которое называется потенциометром. По­
(положительное напряжение) на контакт ввода. При тенциометр представляет собой постоянное сопро­
другой схеме — подается низкий уровень. тивление, по проводящей поверхности которого

Рис. 1.15. Подключение электронных компонентов к модулю Arduino с помощью беспаечной макетной платы.
Питание (+5 В и общий) подается от модуля на крайние ряды гнезд макетной платы. Таким образом, все датчики
и приводы имеют общее питание с модулем. Сигнальные и управляющие контакты каждого датчика и привода
подключаются к соответствующим контактам ввода/вывода. В этом примере две кнопки подключены к контактам
2 и 3 цифрового ввода
64 Глава 1

К плюсу Входное напряжение

К общему

К цифровому вводу
микроконтроллера

К цифровому вводу
микроконтроллера

а б

Рис. 1.16. Цифровой ввод на микроконтроллер: вид макетной платы (а); принципиальная схема (6)

Входное напряжение
К плюсу -
К общему -

К аналоговому вводу К цифровому вводу


микроконтроллера микроконтроллера

Рис. 1.17. Делитель напряжения в качестве источника аналогового сигнала для подачи на микроконтроллер:
вид макетной платы (а); принципиальная схема (б)
Средства 65

К плюсу —
К общему — «

К аналоговому вводу ; ' Г Ш >1Н 11М 1Я ' ' Входное напряжение


микроконтроллера
^ 1|8

К цифровому вводу
Потенциометр м ------------
микроконтроллера

а б

Рис. 1.18. Потенциометр, используемый в качестве источника аналогового сигнала для микроконтроллера:
вид макетной платы (а); принципиальная схема (б)

скользит контактный ползунок. При перемещении


ползунка происходит изменение сопротивления Ознакомьтесь с техническими
между выводом ползунка и каждым из выводов характеристиками компонентов
сопротивления. В принципе, потенциометр — это В проектах этой книги задействовано много ва­
два переменных сопротивления в одной упаковке. риантов модулей и компонентов. Например, как
Если один из его выводов подключить к плюсу, а можно видеть на рис. 1.8, существует несколько
второй — к общему, то при перемещении ползунка вариантов модуля Arduino. Также есть, по край­
напряжение на нем будет меняться. ней мере, три версии модуля адаптера FTDI
USB/TTL-Serial, который нам понадобится
В последующих проектах мы изучим много других в проектах последних глав книги. Существуют
схем, но эти две являются основой, на которой зиж­ даже несколько вариантов регуляторов напря­
дутся все остальные. жения, участвующих в проектах этой книги.
Поэтому обязательно ознакомьтесь с техниче­
Специальные схемы и модули скими характеристиками любого используемо­
В книге рассматриваются несколько специальных го вами компонента или модуля, так как ваша
схем и модулей — таких как Bluetooth Mate и ра­ версия может отличаться от версии, показанной
дио ХВее. Эти устройства позволяют передавать в книге.
последовательные данные с использованием бес­ __________________________________________ J
проводных каналов. Мы также создадим несколько
своих схем для специальных проектов. Все эти схе­
мы будут собраны на макетной плате, но их мож­
но собрать любым способом, который вам удобен.
Например, если у вас есть опыт работы с печатны­
ми платами, и вы предпочитаете собирать схемы
таким образом, тогда так их и собирайте.
66 Глава 1

U Работа с осц и лло гр аф ом


Большинство проектов из этой книги содержат схе­
мы, которые отслеживают меняющееся во времени
напряжение. Независимо от выполняемой микро­
контроллером операции: будь то отслеживание со­
стояния цифрового или аналогового ввода, управле­
ние скоростью электродвигателя или отправление
данных на персональный компьютер — он или счи­
тывает, или генерирует изменяющееся во времени
напряжение. Частота событий, с которыми работает
микроконтроллер, настолько высокая, что она на­
ходится вне диапазона человеческого восприятия.
Например, при последовательном обмене, который
мы только что рассмотрели, импульсы электри­
ческого тока подаются со скоростью 10 000 раз в Рис. 1.19. Отслеживание последовательного потока
секунду. Эти колебания тока невозможно опреде­ данных на осциллографе DSO Nano
лить с помощью мультиметра. Для этого требуется
осциллограф.

Осциллограф — это прибор для визуального наблю­ выборки до 1 МГц, что более чем достаточно для
дения изменений электрического сигнала во време­ замера большинства проектов последовательного
ни. Для удобства наблюдения мы можем изменять обмена. На рис. 1.19 показано отображение осцил­
характеристики осциллографа — такие как чув­ лографом Nano вывода «Здравствуй, мир!» с микро­
ствительность измерения напряжения (в вольтах на контроллера Arduino. Каждый блок между верти­
единицу деления вертикальной шкалы) и интервала кальными линиями представляет собой один бит
отсчета времени (в секундах, миллисекундах или данных. По вертикальной оси измеряется напря­
микросекундах на единицу деления горизонталь­ жение, а по горизонтальной — время. В представ­
ной шкалы). Также допускается и настраивать спо­ ленном изображении разрешение горизонтальной
соб отображения сигнала — его можно отображать шкалы равно 200 микросекунд на деление шкалы,
в реальном времени, начиная и останавливая ото­ а вертикальное — 1 вольт на деление шкалы. Один
бражение, когда требуется, или же улавливать его щуп осциллографа подсоединен к общему контакту
при пересечении напряжением определенного по­ платы Arduino, а второй — к цифровому контакту 1,
рогового значения, которое называется триггером. являющемуся контактом последовательной пере­
дачи.
Еще сравнительно недавно осциллографы были не
по карману большинству любителей, то в настоящее Кроме недорогих аппаратных осциллографов, су­
время на рынке имеется в наличии ряд недорогих ществует много программных — как бесплатных,
моделей. Хорошим примером таких осциллографов так и платных. Программные осциллографы прини­
может служить DSO Nano, поставляемый компани­ мают измеряемый сигнал на аудиовход компьютера
ей Seeed Studio (рис. 1.19). и после обработки его специальной программой
отображают на мониторе. Но с этим видом осцил­
При стоимости около $100 этот осциллограф станет лографов существует опасность подачи слишком
хорошим приобретением для любителя-энтузиаста высокого напряжения на вход, что может вывести
электроники. Хотя он и не обладает всеми возмож­ из строя компьютер. По этой причине предпочти­
ностями профессионального осциллографа, однако тельней использовать аппаратные осциллографы.
вполне позволяет измерять изменения напряжения Но если вы все же хотите попробовать программ­
в вольтах за время в секундах, а также устанавли­ ный осциллограф, в Сети можно найти большое
вать триггеры напряжения для захвата моменталь­ число таковых для любой операционной системы.
ного снимка экрана. Осциллограф имеет частоту
Средства 67

И Важ н ость ф и зи че ск о го и н тер ф ей са


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

Но даже если вы создаете проекты для самих себя, разумную физическую компоновку органов управ­
вряд ли вам захочется постоянно в них что-то ис­ ления для этих действий. Вы не можете диктовать
правлять. Надо понимать, что для людей, исполь­ людям, что думать о ваших устройствах, но должны
зующих ваш проект, важны прежде всего те его показать им, как взаимодействовать с этими устрой­
части, которые они могут видеть, слышать и к ко­ ствами посредством их физических компонентов.
торым могут прикасаться. Все внутреннее устрой­ Иногда вам, может быть, придется нарушать обще­
ство не имеет никакого значения, если физический принятые нормы разработки элементов управления,
интерфейс не работает должным образом. Поэтому чтобы создать интересную игру или чтобы объект
не уделяйте все свое время, не концентрируйтесь выглядел более «волшебным». Но такие нарушения
излишне на общении устройств, не оставляя ничего должны быть осознанными. Всегда думайте в пер­
на общение с людьми. И предварительно подробно вую очередь о том, что ожидает от вашего устрой­
обдумайте, что человек сможет увидеть и почув­ ства пользователь (рис. 1.20).
ствовать, взяв в руки ваше устройство, и что он с
Учитывая в конструкции своего устройства возмож­
ним сможет сделать.
ное поведение пользователя, вы можете устранить
Некоторые аспекты, которые очень важны для лю­ некоторые проблемы, которые трудно решаются ме­
дей, легко упустить из виду. Например, во многих тодом машинных вычислений, но легко поддаются
случаях сетевой обмен между устройствами может человеческому интеллекту. В конечном счете, самая
занимать довольно длительное время. Да, устрой­ важная причина, по которой мы оснащаем вещи
ства, которые оснащены экраном, подтверждают возможностью общения друг с другом, — это дать
ввод и информируют пользователя о ходе выпол­ больше поводов для общения друг с другом людям.
нения задачи с помощью разного рода индикаторов
выполнения. И хотя физические объекты, с которыми
мы работаем в наших проектах, такими индикатора­
ми выполнения не оснащены, они должны каким-то
образом предоставлять информацию о том, что они
делают. Этого можно достичь с помощью, напри­
мер, проигрывания простой мелодии или мигания
светодиодом в ходе сетевого обмена.
Какой именно способ индикации хода выполнения
того или иного процесса использовать — это ваше
решение, но обязательно предоставьте хоть какой-
нибудь такой способ для индикации невидимых
действий своих устройств.
Не стоит также забывать о простых вещах — вклю­
чите в схему выключатель питания и/или кноп­
ку сброса и индикатор питания. Конструируйте
устройство таким образом, чтобы было без проблем
понятно, где у него верх, а где низ. Обеспечьте, что­
бы физические элементы управления были вполне
на виду и чтобы ими можно было легко пользовать­
ся. Продумайте последовательность действий, кото­ Рис. 1.20. Вот примерно так должно выглядеть
рые пользователь может предпринять, и обеспечьте устройство, к которому приятно прикоснуться
Глава 2

ПРОСТЕЙШАЯ СЕТЬ

Самая простая сеть — это соединение двух объектов один


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

44 «Молниеносный» оркестр Джу Йон Паэка (2006)


Это музыкальное устройство позволяет управлять видео и музыкой с по­
мощью обычных застежек-молний. Застежки подсоединены к микрокон­
троллеру проводящими нитками, и микроконтроллер взаимодействует с ком­
пьютером по последовательному интерфейсу, воспроизводя видео и звук,
управляемые движением замочков застежек. Фото предоставлено Джу Йон
Пажом До о Уош Раек).
70 Глава 2

4z Ком поненты для п р о е кто в этой главы


Код поставщ ика П роект 1. Управление яркостью
трехцветного светодиода
Россия
с клавиатуры
• АМ Р — «Амперка» (http://am perka.ru)
• CHD — «Чип и Дип» (http://chipdip.ru) ►
►Модуль Arduino, 1 шт. Желательно исполь­
• LC — «Линуксцентр» (www.linuxcenter.ru) зовать Arduino Uno или его разновидности, но
проект должен работать и на других версиях
США и Европа Arduino и совместимых платах.
• А — Arduino Store (http://store.arduino.cc/w w /) AMP: А000066, http://amperka.ru/product/ar-
• AF — Adafruit (http://adafruit.com ) duino-uno
• D — Digi-Key (www.digikey.com ) LC: 1с8192, http://www.linuxcenter.ru/shop/
ops_hard/arduino/arduino_uno/
• F — Famell (www .farnell.com )
D: 1050-1019-ND, J: 2121105, SF: DEV-09950,
• J — Jameco (http://jam eco.com )
А: А000046, AF: 50, F: 1848687, RS: 715-4081,
• MS — Maker SHED (www .m akershed.com ) SS: ARD132D2P, MS: MKSP4
• RS — RS (w ww .rs-online.com ) ►
►Трехцветный диод с общим катодом, 1 шт.
• SF — SparkFun (www .sparkfun.com ) Это, по сути, три светодиода в одном: красного,
• SS — Seeed Studio (ww w .seeedstudio.com ) зеленого и синего цвета.
AMP: АМР-Х012, http://amperka.ru/product/
rgb-led-5mm
D: 754-1492-ND, J: 2125181, SF: СОМ-00105, F:
8738661, RS: 713-4888

►Персональный компьютер, 1 шт.

►Необходимые переходники для последователь­
ной связи между микроконтроллером и компью­
тером. Все, что требуется в этом плане для мо­
дулей Arduino и Wiring, — это лишь обычный
USB-кабель. Для других микроконтроллеров
возможно потребуется адаптер USB/TTL и разъ­
ем для подключения к макетной плате.

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

Рис. 2.1. Компоненты для проектов этой главы: 1. Компоновочный корпус. 2. Модуль Bluetooth Mate.
3. Трехцветный светодиод. 4. Кнопки. 5. Резистивные датчики изгиба. 6. Шилд для прототипов.
7. Разъем для батарейки типа «Крона» с гнездовым разъемом на другом конце.
Понадобится также достаточное количество штырьковых контактов для интерфейсных модулей
Простейшая сеть 71

Проект 2. «Мартышкин пинг-понг» П роект 3 . Беспроводной


(Monski Pong) «Мартышкин пинг-понг»

►Модуль Arduino, 1 шт. Желательно исполь­ ►
►Завершенный проект «Мартышкин пинг-
зовать Arduino Uno или его разновидности, но понг» из проекта 2,1 шт.
проект должен работать и на других версиях

►Батарейка на 9 В и переходник с разъемом
Arduino и совместимых платах.
питания для нее, 1 шт.
AMP: А000066, http://amperka.ru/product/ar-
AMP: AMP-W003, http://amperka.ru/product/
duino-uno
krona-21mm-cable
LC: 1с8192, http://www.linuxcenter.ru/shop/
D: 2238K-ND, J: 101470, SF: PRT-09518, F:
ops_hard/arduino/arduino_uno/
1650675
D: 1050-1019-ND, J: 2121105, SF: DEV-09950, А:
А000046, AF: 50, F: 1848687, RS: 715-4081, SS: ►
►Гнездовой разъем питания: 2,1 мм внутрен­
ARD132D2P, MS: MKSP4 него диаметра, 5,5 мм внешнего. Если разъем
для батареи уже содержит этот разъем, то эта

►Резистивные датчики изгиба, 2 шт.
деталь не нужна.
AMP: АМР-Х127, http://amperka.ru/product/
AMP: АМР-Х042, http://amperka.ru/product/
flex-resistor-55mm
21mm-jack
D: 905-1000-ND, J: 150551, SF: SEN-10264, AF:
D: CP-024A-ND, J: 159506, F: 1737256
182, RS: 708-1277, MS: JM150551

►Модуль Bluetooth Mate, 1 шт.

►Выключатели, 2 шт. В наличии в любом ма­
газине радиодеталей. Возьмите любой, который АМР (альтернатива): АМР-Х143, http://amper-
вам больше всего понравится. ka.ru/product/hc-06-bluetooth-module
CHD: 48828, D: GH1344-ND, J: 315432, SF: SF: WRL-09358 или WRL-10393
СОМ-09337, F: 1634684, RS: 718-2213, MS: ►
►Компоновочный корпус для микроконтрол­
JM315432 лера, батареи и радиоплаты, 1 шт.

►Сопротивления по 10 К, 4 шт.
AMP: AMP-R10K-10, http://amperka.ru/prod- П роект 4. Переговоры
uct/resistor
по Bluetooth
D: 10KQBK-ND, J: 29911, F: 9337687, RS: 707-
8906 ►
►Модуль Bluetooth Mate (такой же, как для

►Беспаечная макетная плата, 1 шт. проекта 3), 1 шт.

AMP: АМР-Х003, http://amperka.ru/product/ АМР (альтернатива): АМР-Х143, http://amper-


breadboard-half ka.ru/product/hc-06-bluetooth-module
D: 438-1045-ND, J: 20723 или 20601, SF: PRT- SF: WRL-09358 или WRL-10393
00137, F: 4692810, AF: 64, SS: STR101C2M или ►
►Переходник USB/TTL-Serial типа FTDI, 1 шт.
STR102C2M, MS: MKKN2 Подойдет версия как на 5 В, так и на 3,3 В, пере­

►Персональный компьютер, 1 шт. ходник может быть в виде кабеля или платы.

►Необходимые переходники для последователь­ SF: DEV-09718 или DEV-09716, AF: 70 или 284,
ной связи между микроконтроллером и компью­ А: А000059, MS: MKAD22, D: TTL-232R-3V3
тером. Как и для предыдущего проекта. или TTL-232R-5V

►Небольшая мягкая игрушка по имени Мар­
тышкин, 1 шт. (или две — если вы захотите
играть вдвоем).
72 Глава 2

Рис. 2.2.
а — кабель USBATL-Serial типа FTDI.
Такой кабель очень удобен для подключения
к компьютеру разных последовательных устройств.
Через него на устройство может даже подаваться
питание от компьютера, к которому оно подключено.
Кроме кабеля также применяются адаптерные платы
USB/TTL-Serial;
6 — плата Arduino USB/Serial;
в — адаптер FTDI Basic компании SparkFun;
г — адаптер FTDI Friend компании Adafruit.
Для всех этих плат дополнительно требуется кабель
USB-A/Mini-B (наподобие кабеля, который поставляется
с большинством цифровых камер). К линиям передачи
и приема этих плат подключены светодиоды,
что полезно при диагностировании проблем со связью.
В отличие от других переходников, для адаптера
Arduino драйверы устанавливать не требуется. На
машинах под Mac OS X и Linux плата поддерживается
средствами этих ОС, а на машинах под Windows
используются те же самые драйверы, что и для Arduino
Uno. Фотографии предоставлены компаниями SparkFun
в г
и Adafruit.

йй У р овн и со гл асо ван и я


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

• Физический. Каким образом вводы и выводы • Уровень данных. Как осуществляется син­
каждого устройства соединяются с другими? хронизация битов? Сколько битов считывается
Сколько необходимо соединений между двумя за раз: 8, 9, 10 или больше? Обозначаются ли
устройствами для обмена сообщениями? группы битов в начале и в конце специальными
битами?
• Электрический. Какие уровни напряжения ис­
пользовать для представления битов данных? • Уровень приложений. Как организовываются
группы битов для создания сообщений? Каков
• Логический. Какое логическое значение имеет порядок обмена сообщениями для того, чтобы
высокий уровень напряжения: 0 или 1? Схема, что-то сделать?
когда высокий уровень напряжения представ­
ляет логическую 1, а низкий — 0, называется Это упрощенная версия модели организации сете­
п о л о ж и т е л ь н о й , а когда значения уровней ин­ вого обмена, называющаяся моделью OSI1. В дей­
вертированы — о т р и ц а т е л ь н о й . Мы увидим
1 OSI, Open Systems Interconnect — взаимодействие открытых
примеры обоих типов логики в последующем систем (ВОС). Семиуровневая модель протоколов передачи дан­
материале. ных, утвержденная ISO (стандарт ISO-7498) в 1984 г., для обе­
спечения взаимодействия открытых систем.
Простейшая сеть 73

ствительности сетевые задачи никогда нельзя так устройствами — это всего лишь электрические им­
четко разделить, но четкое представление различий пульсы. Принцип последовательной связи заклю­
между концептуальными уровнями значительно чается в изменении уровней напряжения электриче­
облегчит диагностирование проблем со связью. ского соединения между передатчиком и приемни­
Подобное мышление в терминах уровней дает нам ком с определенной частотой. Каждый отдельный
исходную точку для поиска причины возникнове­ интервал времени представляет бит информации.
ния проблемы и способ исключить из подозревае­ Чтобы отправить значение 0 или 1 очередного бита,
мых те части системы, которые не могут быть этой отправитель меняет уровень напряжения, а получа­
причиной. тель определяет уровень полученного сигнала: вы­
сокий или низкий. Отправитель и получатель могут
Какой сложной ни была бы сеть, никогда не за­ согласовывать скорость отправления битов двумя
бывайте о том, что связь между электронными способами (рис. 2.3).

Асинхронная передача данных


Передатчик Приемник

< ----- ------------ Направление данных ТХ


RX (Прием)
(Передача)

ТХ Направление данных ----------------->-


RX (Прием)
(Передача)

Общий Общий

Синхронная передача данных


Master Slave
(Ведущий) (Ведомый)

Выбор Выбор
схемы схемы

Выход Направление данных ----------------- >► Выход


ведущего, ведущего,
вход ведомого вход ведомого
Вход ведущего, .........- ..... - Направление данных Вход ведущего,
выход выход
ведомого ведомого
Направление сигнала
Сигнал Сигнал
синхронизации ^
синхронизации синхронизации


Тактовые
импульсы
ОВ

Рис. 2.3. Типы последовательной связи


74 Глава 2

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

£ ( Устан овка соед инения на ниж них у р о в н я х


Мы уже знакомы с одним примером последовательного обмена данными — между микро­
контроллером и персональным компьютером. В частности, в главе 1 мы подключили модуль
Arduino к персональному компьютеру через порт USB. Если вам ранее приходилось работать
с другими микроконтроллерами, например, Basic Stamp компании Parallax, вы подключали его
к компьютеру с помощью адаптера RS-232/USB или использовали компьютер старой модели,
оснащенный 9-контактным разъемом последовательного порта RS-232. Для такого простого под­
ключения требуются два последовательных протокола.

Первый — это протокол, понимаемый микрокон­ • Уровень приложений. На этом уровне мы от­
троллером, он называется последовательный TTL. правляем один байт от ПК на Arduino и обраба­
Этот протокол можно разбить на следующие кон­ тываем его, a Arduino отправляет один байт об­
цептуальные уровни: ратно на ПК.

• Физический. Определяет контакты, используе­ Но это еще не все. Импульсы напряжения не идут
мые контроллером для обмена данными. В мо­ на ПК напрямую. Сначала они поступают на TTL/
дуле Arduino данные принимаются на контакт О USB микросхему на плате, которая преобразовы­
цифрового ввода/вывода, а отправляются с кон­ вает последовательные TTL-сигналы в последова­
такта 1. тельные USB-сигналы.

• Электрический. Определяет импульсы напря­ Для сигналов USB применяется соответствующий


жением 5 В и О В для представления битов дан­ протокол, который во многом отличается от прото­
ных. В некоторых микроконтроллерах вместо кола последовательного обмена TTL. Он разбивает­
5 В применяется напряжение 3,3 В. ся на следующие концептуальные уровни:

• Логический. Высокий уровень напряжения • Электрический. Сигнал на линии Data- всегда


(5 В) представляет логическое значение 1, а низ­ противоположен сигналу на линии Data+, в ре­
кий — логическое значение 0. зультате чего сумма напряжений этих сигналов
всегда равна нулю. Эта особенность использует­
• Уровень данных. Обмен данными обычно осу­ ся приемником для проверки на наличие ошибок
ществляется со скоростью 9600 битов в секунду. электрического сигнала — для этого он склады­
Для представления одного символа требуется вает напряжения обеих линий. Если полученная
один байт, который содержит 8 битов данных, сумма не равна нулю, приемник отбрасывает
а также стартовый и столовый биты (которые этот сигнал.
мы никогда не будем использовать).
Простейшая сеть 75

=я® о USB как н еи счер паем ы й и сто чн и к


п о след о вательн ы х п о р то в

Одно из замечательных качеств микроконтрол­ (www.iogear.com). Большинство подобных потре­


леров — это их низкая стоимость, что позволяет бительских моделей представляют собой адапте­
не особенно ограничивать себя в их количестве. ры USB/RS-232, поскольку разъем RS-232 (о нем
Например, для проекта с большим числом дат­ чуть далее) был стандартным разъемом компью­
чиков можно или разработать сложную програм­ теров для последовательного обмена данными до
му, чтобы один микроконтроллер мог выполнять введения технологии USB. Адаптеры USB/RS-232
опрос всех датчиков, или же дать каждому дат­ не могут работать напрямую с устройствами,
чику свой собственный микроконтроллер. А если использующими для последовательного обмена
информацию с этих датчиков нужно передать данными технологию TTL.
в персональный компьютер, поначалу может по­
казаться, что будет легче использовать для этого Компания FTDI производит кабель-переходник
один микроконтроллер, по причине ограниченно­ USB/TTL-Serial с разъемом для макетных плат,
го количества последовательных портов. Но, бла­ который удобно использовать для подсоедине­
годаря шине USB, количеством доступных после­ ния устройств, оснащенных последовательным
довательных портов можно не озабочиваться. интерфейсом технологии TTL. Его можно при­
обрести в магазинах фирм Maker SHED, SparkFun,
Если микроконтроллер оснащен портом USB или Adafruit и многих других. Кабель доступен в двух
адаптером USB/TTL, его можно подсоединить версиях: 5 В и 3,3 В. Компании Arduino, SparkFun
к любому разъему USB компьютера, и он будет и Adafruit производят адаптерные платы USB/
распознаваться операционной системой ком­ TTL-Serial с такой же самой распиновкой разъема
пьютера как еще один последовательный порт. TTL. Адаптерная плата FTDI Basic Board компа­
Например, если к компьютеру подсоединить три нии SparkFun оснащена светодиодами, которые
модуля Arduino через USB-хаб, в операционной мигают при передаче данных. Адаптерная пла­
системе появятся три новых последовательных та компании Adafruit называется FTDI Friend.
порта. На машинах под Mac OS X они будут ото­ Адаптерная плата компании Arduino использует
бражаться примерно так: другую микросхему, но распиновка ее разъема
TTL та же самая, как и у остальных плат. Любую
/dev/tty.usbmodem2 41441 из этих адаптерных плат USB/TTL-Serial можно
/dev/tty.usbmodem241461 использовать для всех проектов в этой книге. Вы
/dev/tty.usbmodem2 41471 могли видеть эти адаптерные платы на рис. 2.2
в начале главы, а на рис. 2.4 показаны кабель USB/
А на машинах под Windows — как, например, TTL-Serial типа FTDI и распиновка его разъема
СОМ8, СОМ9, СОМЮ. TTL.
Платы Arduino оснащены встроенным USB/TTL-
Serial адаптером, но другие микроконтроллерные
модули и устройства обычно такого адаптера не
имеют. Преобразователь USB/TTL-Serial можно
приобрести по цене в диапазоне от $15 до $40.
В частности, приличные модели продаются в ма­
газинах Keyspan (www.keyspan.com) и IOGear
76 Глава 2

• Логический. Логическое значение 1 представ­ Операционная система использует эти байты


ляется сигналом напряжения +5 В (на линии для того, чтобы сопоставить аппаратное обеспе­
Data+) или -5 В (на линии Data-), а логическое чение устройства с библиотекой программного
значение 0 — сигналом напряжения О В. обеспечения драйвера, который другие програм­
мы могут использовать для обмена данными
• Уровень данных. Уровень данных модели про­ с этим устройством.
токола USB более сложный, чем соответству­
ющий уровень протокола последовательного • Физический. Шина USB состоит из двух прово­
обмена TTL. В USB скорость обмена данными дов для передачи данных: Data+ и Data- и двух
может достигать 480 мегабит в секунду. Один проводов питания (+5 В и общий).
символ представляется одним байтом, который
содержит 8 битов данных, а также стартовым и Все это управление прозрачно для пользователя,
стоповым битами. Несколько устройств USB под так как контроллер USB компьютера передает ему
управлением ПК могут использовать для обме­ только те байты, которые предназначены для него.
на данными одну и ту же пару проводов. Набор Микросхема преобразователя USB/TTL на плате
проводов для обмена сигналами называется ши­ Arduino представляет себя операционной системе
ной. Поскольку к одной шине может быть под­ компьютера, как последовательный порт, и отправ­
соединено несколько устройств, операционная ляет данные через разъем USB с выбранной пользо­
система присваивает каждому из этих устройств вателем скоростью (9600 битов в секунду в примере
однозначный адрес и обеспечивает обмен дан­ в главе 1).
ными между каждым подсоединенном к шине
устройством и его соответствующим приложе­ Если вы используете микроконтроллерный модуль
нием на компьютере.• BASIC Stamp или другой микроконтроллерный мо­
дуль с интерфейсом иным, чем USB, он, скорее все­
• Уровень приложений. На уровне приложения го, оснащен 9-контактным разъемом для подклю­
преобразователь USB/TTL на плате Arduino от­ чения к компьютеру или к адаптеру USB/RS-232.
правляет операционной системе компьютера не­ Распиновка этого разъема показана на рис. 2.5.
сколько байтов, чтобы идентифицировать себя.

Распиновка разъема TTL


кабеля USB/TTL типа FTDI

Общий GND Черный


Готовность к передаче (С1еаг4о-зепс1) CTS Коричневый
Используется для подачи питания на V cc Красный
устройство от иЗВ-порта компьютера
К контакту ИХ (прием) микроконтроллера TX Оранжевый
К контакту ТХ (передача) микроконтроллера RX Желтый
Запрос на передачу (ЯедиезМо-зепс!) R TS Зеленый

Рис. 2.4. Кабель USB/TTL-Serial типа FTDI.


Кроме линий передачи, приема и питания он также имеет линии для аппаратного управления обменом данных,
называющиеся RTS (Request-to-send, запрос на передачу) и CTS (Clear-to-send, готовность к передаче).
Некоторые устройства используют эти линии для управления потоком последовательных данных
Простейшая сеть 77

Этот разъем называется DB-9 или D-sub-9 и пред­ RS-232? Это возможно благодаря тому, что уровня
ставляет собой штатный разъем для другого после­ сигнала последовательного TTL: от 0 до 5 В — как
довательного протокола: RS-232. Протокол RS-232 раз достаточно, чтобы попасть в зону чувствитель­
был стандартом для последовательного интерфейса ности RS-232, а также благодаря возможности ме­
компьютера до протокола USB, и все еще встреча­ нять полярность битов при их отправке или полу­
ется на некоторых специализированных перифе­ чении на микроконтроллере. Интерфейс RS-232 не
рийных устройствах. обременен накладными расходами адресации, как
протокол USB, поэтому с ним легче работать. К со­
Этот протокол состоит из следующих концептуаль­ жалению, этот протокол также чрезвычайно уста­
ных уровней: рел и очень редко используется, поэтому адаптеры
USB/TTL-Serial получают все большее распростра­
• Физический. Данные в разъеме RS-232 компью­ нение для программаторов микроконтроллеров.
тера принимаются на контакт 2, а передаются с А так как платы Arduino оснащены встроенным
контакта 3. Контакт 5 — «земля». преобразователем USB/TTL-Serial, их можно на­
• Электрический. Данные в стандарте RS-232 прямую подсоединять к разъему USB компьютера.
передаются двумя уровнями напряжения: +5 —
+12 В и -5 ...-1 2 В. Если вам повезет, вам никогда не придется думать
о таком смешении протоколов, и вы сможете просто
• Логический. Высокий уровень напряжения использовать для выполнения этой задачи соответ­
+ 5 — +12 В) представляет логическое значе­ ствующие преобразователи. Но нам везет не всегда,
ние 0, а низкий -5... -12 В) — логическое зна­ поэтому будет полезно немного знать о внутреннем
чение 1. Эта схема называется отрицательной механизме этих протоколов. Например, одной из
(или инвертированной) логикой. самых распространенных проблем при установ­
• Уровень данных. Такой же самый, как и в про­ ке связи между последовательным устройством
токоле TTL — 8-битовый байт данных с допол­ и персональным компьютером является преобразо­
нительными стартовым и стоповым битами. вание последовательных сигналов TTL устройства
в стандарт USB или RS-232. В этом отношении
Спрашивается, как же подключать некоторые ми­ представляет интерес микросхема МАХ3232 ком­
кроконтроллеры — например, BASIC Stamp или пании Maxim Technologies (www.maxim-ic.com),
ВХ-24, непосредственно к последовательному порту которая взаимно преобразовывает сигналы TTL

9 8 7 6

/о о о о \
(о о о о о)
5 4 3 2 1
USB тип А USB тип В RS-232
1: +5 В
USB тип Mini В 2: Прием (ПК)
2: Данные- 1: +5 В 3: Передача (ПК)
3: Данные+ 2: Данные- 1 2 3 4 5 5: Земля (ПК)
4: Земля 3: Данные+ [ Г .,..М..Ж,Ж.*,ЛИ....Р)
4: ID
5: Земля

Рис. 2.5. Распиновка разъемов USB и RS-232


78 Глава 2

Рис. 2.6.
а — плата с микросхемой МАХ3232;
Разъем TTL
кабеля USB/TTL б— принципиальная схема
типа FTD1 применения этой микросхемы.
Микросхема МАХ3232 весьма
полезна, когда нужно обеспечить
взаимодействие устройства
с последовательным
ТИ-интерфейсом и персонального
компьютера с последовательным
портом [^-232. Эта же
принципиальная схема применима
и для микросхемы МАХ232
Разъем
ОВ-9

а
Простейшая сеть 79

и 118-232. На вход микросхемы подается сигнал что ее название стало именем нарицательным для
118-232, а на выходе снимается сигнал ТТЬ (3,3 В всех преобразователей ТТЪ/118-232, будь они про­
или 5 В), и наоборот. Напряжение ТТЬ-сигнала изводства М а х т или нет. Микросхема МАХ232
определяется напряжением питания микросхемы — выдает сигнал ТТЬ уровнем только в 5 В, в то вре­
3,3 В, если подается питание в 3,3 В, и 5 В — если мя как уровень сигнала микросхемы МАХ3232 на­
питание 5 В. На рис. 2.6, а показана плата с микро­ ходится в диапазоне от 3,3 до 5 В. Учитывая, для
схемой МАХ3232, а на рис. 2.6, б — принципиаль­ питания электроники напряжение 3,3 В начинает
ная схема применения этой микросхемы. заменять 5 В, всегда полезно иметь под рукой ми­
кросхему, которая может работать с обоими этими
Предшественницей микросхемы МАХ3232 была напряжениями.
микросхема МАХ232. Собственно, применение этой
микросхемы было настолько распространенным,

И сп о л ьзо ван и е платы A rd u in o


в кач естве ад аптера U SB /TTL-Serial

Платы Arduino оснащены встроенным адаптером Затем подсоедините требуемое последовательное


USB/TTL-Serial для обеспечения последователь­ устройство таким образом:
ной связи с персональным компьютером. Выход
передачи (TX) этого адаптера подсоединен к кон­ • контакт приема устройства — к контакту О
такту приема (RX) платы и наоборот. Это означа­ платы Arduino;
ет, что можно обойти микроконтроллер и исполь­
зовать плату Arduino в качестве адаптера USB/ • контакт передачи устройства — к контакту 1
TTL-Serial. Иногда эта возможность может быть платы Arduino.
полезной — например, когда нужно прямое взаи­
модействие с радиомодулем Bluetooth в проекте, Теперь наше устройство может обмениваться
рассмотренном в этой главе далее. Чтобы приме­ данными напрямую с адаптером USB/TTL-Serial
нить эту возможность, или осторожно извлеките на плате Arduino, обходя микроконтроллер. Когда
микроконтроллер из гнезда, или же загрузите в же снова нужно использовать микроконтроллер,
него скетч, который ничего не делает: просто отсоедините устройство и загрузите тре­
буемый скетч.
void setup() {}
void loop() {}
80 Глава 2

йй О тп р авка сообщ ени й: у р о в е н ь прилож ений


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

" Проект 1

Управление яркостью светодиода с клавиатуры

В этом примере мы будем управлять микроконтроллером нажатием клавиш клавиатуры ком­


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

и 11 (рис. 2.7). Подогните ножку катода как требует­


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

►Трехцветный (RGB) светодиод с общим ножки, так как это создаст короткое замыкание.
катодом, 1 шт.
Подсоединив светодиод к плате, просверлите в тен­

►Модуль микроконтроллера Arduino, 1 шт. нисном мячике небольшое отверстие — чуть боль­
шего диаметра, чем диаметр светодиода. Наденьте

►Персональный компьютер, 1 шт.
мячик на светодиод, как показано на рис. 2.8.

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

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

Для любого приложения, каким бы простым оно ни


было, требуется протокол связи. Даже такая простая
Протокол
задача, как просьба включить свет, требует, чтобы Смонтировав нашу схему, нужно решить, как взаи­
как отправитель, так и получатель команды знали, модействовать с микроконтроллером для управле­
как сказать «включить свет». ния светодиодами. Для этого нам нужен протокол
связи, который для этой задачи будет очень про­
Для этого проекта нам потребуется маленькая раз­
стым:
ноцветная лампочка. Мы сможем управлять яр­
костью и цветом этой лампочки командами с ком­ • чтобы выбрать цвет светодиода для управле­
пьютера. Такой лампочкой нам послужит трех­ ния, посылаем первую букву требуемого цвета
цветный светодиод, который в действительности в нижнем регистре: г, д, ь;
представляет собой три светодиода в одной упа­
• чтобы задать яркость выбранного светодиода,
ковке: красный, зеленый и синий. Каждый из этих
посылаем цифру от о до 9.
светодиодов имеет свой собственный вывод анода
(положительный) и один общий вывод катода (от­ Например, чтобы задать яркость 5 для красного све­
рицательный). Вставьте катод (это будет самый тодиода, 3 — для зеленого и 7 — для синего (по
длинный вывод из четырех) в гнездо «земли» мо­ шкале от 0 до 9) посылаем следующий код:
дуля Arduino, а остальные три вывода в гнезда 9, 10 г5дЗЬ7
Простейшая сеть 81

Рис. 2.7. Подключение


трехцветного светодиода
к плате Arduino. Вывод
катода подогнут, чтобы он
не касался вывода анода,
подсоединенного к гнезду 11.
Теоретически, аноды к плате
AREF

— Reset GND
следует подключать через
— +3 3V D13
резистор, чтобы ограничить
— +5V D12 -ф ток, протекающий через
— Gnd D11/PWM светодиоды. Но на


Gnd

Vin
D10/PWM

D9/PWM
Ф практике я оставлял эту
\\ схему работающей без
Модуль
D8
-Ф сопротивлений и без каких
Arduino D7 бы то ни было отрицательных
D6/PWM последствий ни для Arduino,
— Analogo D5/PWM ни для светодиода. Если
A1 D4
вы не уверены, что ваше
A2 D3/PWM
оборудование настолько
A3 D2

A4 Digital1/TX
стойкое, подключите каждый
A5 DigitalO/RX анод через 200-омное
сопротивление

Рис. 2.8. Светодиод


с надетым на него теннисным
мячиком, чтобы рассеивать
свет

Вот и весь протокол, простой до предела. Но нам


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

Блок-схема такой программы показана на рис. 2.9.


82 Глава 2

Рис. 2.9. Блок-схема программы управления светодиодом

□ Пишем код
Управление трехцветным светодиодом
Контекст : Arduino

Программа управляет трехцветным светодиодом, чьи выводы г


(красный), д (зеленый) и Ь (синий) подсоединены к контактам 11, 9
и 10, соответственно.
*/

ш Прежде всего нужно задать // Константы для хранения номеров контактов


константы для хранения номеров // вывода:
контактов, а также задать пере­ const int greenPin = 9;
менную для хранения номера const int bluePin = 10;

контакта текущего светодиода и const int redPin = 11;

переменную для хранения значе­


int currentPin = 0 ; // текущий контакт для задания яркости
ния яркости:
int brightness = 0 ; // текущий уровень яркости

Ш Метод setup () запускает про­ void setup() {


цедуру последовательной пере­ // инициируем последовательную передачу:

дачи данных и задает контакты Serial.begin(9600);

вывода на выводы светодиода:


// задаем контакты вывода:
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);


Простейшая сеть 83

Ш В основном цикле все зависит void loop () {


от наличия байтов для чтения: // если буфер содержит последовательные данные,
// считываем байт :
if (Serial.available() > 0) {
int inByte = Serial.read () ;
// реагируем на значения 'r', 'g', 'b' или '0' по '9'.

О При наличии входящих дан- // игнорируем любые другие значения :

ных нам нужно что-либо пред­ if (inByte == 'г') {


принимать только для несколь- currentPin = redPin;
ких значений. Получив одно из }
if (inByte == fg ’) {
требуемых значений, используем
currentPin = greenPin;
операторы ±f, чтобы задать номер }
контакта и значение яркости:
if (inByte == 'b') {
currentPin - bluePin;
}

Ш Наконец, задаем на текущем if (inByte >= ’O ’ && inByte <= ’9 ’) {


выбранном контакте (светодио­ // сопоставляем значение входящего байта

де) требуемый уровень яркости с // диапазону команды analogReadO :


П О М О Щ Ь Ю метода апа1одЮг^е (): brightness = map(inByte, '0f, '9', 0, 255);
// устанавливаем заданную яркость на выбранном контакте:
analogWrite(currentPin, brightness);
}
}
}

Загрузите этот скетч в Arduino, а затем откройте мо­


нитор порта, щелкнув по соответствующему значку
в панели инструментов окна редактора (рис. 2.10).

В строке ввода окна монитора порта введите сле­


дующую команду и нажмите кнопку Отправить:
г9

Теннисный мячик должен подсветиться красным


цветом. Теперь попробуйте команду:

r2g7
Красный цвет притухнет, и мячик подсветится зеле­
ным. Далее введите:
д0Г0Ь8 ЙИ ННН[
Мячик подсветится синим цветом. Вуаля! Мы соз­
дали последовательно управляемый разноцветный
светильничек. Рис. 2.10. Открытие окна монитора порта
84 Глава 2

Если выводимые цвета не соответствуют вводимым 'г' — 114, а для цифры '0' — 48. Заключая символ
с клавиатуры, вы, вероятно, приобрели светодиод в одинарные кавычки, мы даем указание микрокон­
не той модели, что указана в списке деталей про­ троллеру использовать не сам символ, а его значе­
екта, поэтому у него другая цоколевка. Эта пробле­ ние ASCII. Например, вот эту линию кода:
ма легко решается корректировкой постоянных для
номеров контактов в скетче. brightness = map(inByte, 'O', '91, 0, 255);
можно заменить вот этой:
Для управления светодиодом не обязательно требу­ brightness = map(inByte, 48, 57, 0, 255);
ется окно Монитор порта среды Arduino. Для этого
можно использовать любую программу, которая об­ так как в ASCII символ ‘0’ представляется значени­
ладает возможностью управления последователь­ ем 48, а символ ‘9’ — значением 57. Применение
ным портом. Одной из такой программ является символов в одинарных кавычках вместо их зна­
Processing. После завершения следующего проекта чений ASCII не является обязательным для рабо­
попробуйте разработать свой собственный контрол­ тоспособности программы, но делает код более
лер светодиода в этой программе. удобочитаемым. В первой линии только что приве­
денного примера мы в целях сопоставления исполь­
Кстати, вы не обратили внимание на то, что значе­ зуем символы ASCII для представления значений,
ния переменных в программе указываются в оди­ а во второй — значения ASCII этих символов. Наша
нарных кавычках? Это потому, что мы используем книга содержит примеры, в которых используются
значения ASCII для этих переменных. Протокол оба эти подхода. Более подробную информацию об
ASCII сопоставляет числовые значения символам ASCII см. в разд. «Что такое ASCII?» далее в этой
букв и цифр. Например, значение ASCII для буквы главе.

йй Слож ны е п р ео б р азо в ан и я
В предыдущем проекте мы управляли микроконтроллером с компьютера, используя для этого
очень простой протокол. На этот раз микроконтроллер будет управлять анимацией на ком­
пьютере. Протокол связи для этого проекта также будет более сложным.

Ч с Проект 2

«Мартышкин пинг-понг» (Monski Pong)


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

Требуемые компоненты ►
►Модуль микроконтроллера Arduino, 1 шт.

►Резистивные датчики изгиба, 2 шт. ►
►Персональный компьютер, 1 шт.


►Выключатели, 2 шт. ►
►Необходимые переходники для последова­
тельного обмена данными между микрокон­

►Сопротивления по 10 К, 4 шт. троллером и компьютером.

►Беспаечная макетная плата, 1 шт. ►
►Небольшая мягкая игрушка мартышка, 1 шт.
Простейшая сеть 85

Рис. 2.11. Представление мыши


Вывод - 4 значения:
в виде объекта данных
координата X, 10 битов
координата У, 10 битов
кнопка 1, 1 бит
кнопка 2, 1 бит

Ввод: движение по оси X ---------Кнопки ввода


----------------- ►

Что компьютер делает с полученными от мыши клейкой ленты или кабельных стяжек, как показано
данными, зависит от приложения. В нашем при­ на рис. 2.13.
ложении небольшая мягкая игрушка мартышка бу­
дет играть в пинг-понг, размахивая своими руками. Разместите датчики изгиба таким образом, чтобы
Она также сможет выполнять сброс игры нажатием диапазоны их движения были бы по возможно­
кнопки и подавать мяч нажатием другой кнопки. сти одинаковыми. Их также следует закрепить на
какой-нибудь прочной подложке, чтобы они удер­
Подсоедините длинные провода к датчикам изгиба
живались друг относительно друга в устойчивом
таким образом, чтобы датчики можно было вшить
положении. Для этого хорошо подойдет отрезок
в руки мартышки без необходимости помещать ми­
гибкой проволоки для моделирования. Убедитесь,
кроконтроллер на ее коленях. Используйте гибкие
чтоб оба датчика изгиба были направлены лицевой
провода — например, старый телефонный провод.
стороной в одну и ту же сторону, так как при из­
Длина около 60 сантиметров будет достаточной.
гибе в разные стороны они дают разные показания.
Затем подсоедините длинные провода к кнопкам Хорошо заизолируйте места соединения проводов
и установите их в кусок пенопласта или упаковоч­ с датчиками изгиба, так как набивка игрушки может
ного картона, пока не определитесь с конечным кор­ при движении генерировать статическое электри­
пусом для электроники. Пометьте кнопки «Сброс» чество. Для этого хорошо подойдет клей для горя­
и «Подача». Подключите датчики к микроконтрол­ чего склеивания.
леру, как показано на рис. 2.12.
В общем, прежде чем начинать работать над про­
Прорежьте небольшое отверстие под мышками граммой, обеспечьте стабильное и надежное кре­
у мартышки, чтобы вставить датчики изгиба ей пление датчиков и электрических соединений.
в руки. Но если вам жалко резать мартышку, датчики Диагностирование проблем намного труднее при
можно прикрепить к ее рукам снаружи с помощью ненадежных электрических соединениях.
86 Глава 2

AHI ?
К +5 В макетной платы ♦5 V GNU
К "земле” макетной платы Gnd 0 )3
К "земле” (минусу) батареи G nd m ?
К +9 В батареи •f 9 V D U /P W M
D iO /P W V s
Сопротивление 15 К
D 9 /P W V 1
датчика изгиба
DA
Модуль Arduino

и/
Сброс ж Ж Подача
D 6 /P V V G О о
юш А п 'л Щ ф L Ó /P W V I

Ai iA1 JOKU

ЛА D 3 /P W M -^s/S/Sr"
A3 U3
A /W f
АЛ юна
c

~ ~

юна Ab D ìg ìt^ iO /H X

Рис. 2.12. Монтажная (о ) и принципиальная (б) схемы проекта «Мартышкин пинг-понг».


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

Рис. 2.13. Чтобы получать надежные данные от датчиков


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

/*
ШПишем код ______ Считыватель показаний датчиков
Теперь выполните в Arduino сле­ Контекст : Arduino
дующий код, чтобы проверить
работу датчиков изгиба: Считывает показания с двух аналоговых входов
и двух цифровых входов и выводит их значения.

} Подключения:
В окне монитора порта среды
Аналоговые датчики — к контактам аналогового ввода
Arduino (или другой используе­ 0 и 1
мой вами программы терминала Кнопки — к контактам цифрового ввода 2 и 3
последовательной связи с уста­
новленной скоростью обмена */
9600 битов в секунду, как мы
делали в главе 1) должен выво­ const int leftSensor = 0; // аналоговый ввод
диться поток данных следующе­ // для левой руки
го вида: const int rightSensor = 1; // аналоговый ввод
// для правой руки
284.284.1.1, const int resetButton = 2; // цифровой ввод
285.283.1.1, // для кнопки сброса
286.284.1.1, const int serveButton = 3; // цифровой ввод
289.283.1.1, // для кнопки подачи
int leftValue = 0; // показания датчика
Как и было запрограммировано, // левой руки
значения показаний разделены int rightValue = 0; // показания датчика
запятыми, а каждый набор по­ // правой руки
казаний выводится отдельной int reset = 0; // данные кнопки сброса
строкой. int serve = 0 ; // данные кнопки подачи
void setup () {
// настраиваем последовательное соединение:
Serial.begin(9600);
// настраиваем цифровые вводы:
pinMode(resetButton, INPUT);
pinMode(serveButton, INPUT);

void loop () {
// считывает показания аналоговых датчиков:
leftValue = analogRead(leftSensor);
rightValue = analogRead(rightSensor);

// считывает показания цифровых датчиков :


reset = digitalRead(resetButton);
serve = digitalRead(serveButton);
// выводим результаты на экран:
Serial.print(leftValue);
Serial.print(«,»);
Serial.print(rightValue);
Serial.print(«,»);
Serial.print(reset);
88 Глава 2

№ Serial.print(«,»);
// выводим на экран последнее показание датчика
II с помощью
// функции printlin(), чтобы каждый набор
/ / и з четырех показаний был на отдельной строке :
Serial.println(serve);

Ш Теперь попробуйте заменить 1 // выводим результаты на экран:


фрагмент кода, который выводит Serial.write(leftValue);

на экран результаты, следующим Serial.write(44);


Serial.write(rightValue);
кодом:
Serial.write(44);
Результаты исполнения этого кода Serial.write(reset);
будут выглядеть в окне Монитора Serial.write(44);
порта наподобие следующих: // выводим на экран последнее показание датчика
// с помощью функции printlin(), чтобы каждый набор
.,р ,, / / и з четырех показаний был на отдельной строке:
Serial.write(10);
(,А,, Serial.write(13);

М,, Serial.write(serve);

М к Возвратите прежний код


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

j# Что же здесь происходит? В первоначаль- и «новая строка» соответственно, а значение 44 —


i
print
Ш ном примере используется метод serial,
о, который выводит на экран показания дат­
символу запятой. Эти значения и посылаются меж­
ду значениями показаний датчиков в модифициро­
чиков в виде их значений кода ASCII, а модифици­ ванном коде. Источником загадочных символов яв­
рованный КОД С ПОМОЩЬЮ метода Serial.write о ляются переменные показаний датчиков (leftvaiue,
выводит на экран «сырые» двоичные значения. rightValue, reset И serve). В третьей Строке ВЫВОДа,
Монитор порта (или другая программа терминала когда значение показаний второго датчика равно 65,
последовательной связи) предполагает, что каждый мы видим символ ’А’, так как этому символу ASCII
полученный ею байт является символом ASCII, соответствует значение 65.
поэтому в модифицированном коде он отобража­
ет символы ASCII соответственно их «сырым» Полный список значений ASCII для каждого симво­
двоичным значениям. Например, значения 13 и 10 ла можно найти на сайте www.asciitable.com.
соответствуют символам ASCII «возврат каретки»
Простейшая сеть 89

Что тако е A SCII?

Код ASCII2 был создан в 1967 году Американским информацию о формате его отображения. Эти
обществом стандартов3 (которое теперь называ­ символы называются символами управления
ется Американским национальным институтом и занимнот первые 32 значения набора ASCII
стандартов4), как средство, которое позволило бы (ASCII 0-32). Доступные 128 значений ASCII
обмениваться текстовыми сообщениями любым позволяют представить все буквы, цифры и зна­
компьютерам, независимо от их операционной ки препинания английского алфавита, а также
системы. Этот код присваивает каждой букве, управляющие символы. Но этих значений недо­
цифре и знаку препинания латинского алфавита статочно для представления букв неанглийских
однозначное число. Любой вводимый с клавиа­ алфавитов, а имеющиеся символы управления
туры символ преобразовывается в строку чисел не предоставляют достаточных возможностей
и передается к месту назначения, где эта строка управления выводом для графических пользо­
чисел преобразовывается обратно в исходные вательских интерфейсов. Поэтому в настоящее
символы. Кроме букв, цифр и знаков препинания, время вместо ASCII в качестве нового стандарта
значения ASCII также присвоены некоторым не­ для обмена текстовыми сообщениями использу­
печатаемым символам, применяющимся для фор­ ется более обширный код, который называется
матирования страницы, — например операциям Unicode и является надмножеством ASCII. А для
перехода на новую строку ; ги возврата каретки форматирования вывода применяются языки раз­
(к началу строки), коюрые имеют значения ASCII метки — например, PostScript или HTML. Но код
10 и 13 соответственно. Таким образом, вместе ASCII все еще продолжает употребляться в опре­
с сообщением можно передавать дополнительную деленных приложениях.
2 ASCII, American Symbolic Code for Information Interchange —
американский стандартный код для обмена информацией.
3 «American Standards Association».
4 «American National Standards Institute».

При наличии такого выбора возникает вопрос: как и далее в этой главе мы увидим, почему это пра­
форматировать значения показаний датчиков, как не­ вильный выбор.
структурированные («сырые») двоичные значения
или как А8СН? Это зависит от возможностей систе­ Если вы еще этого не сделали, восстановите код
мы, получающей данные, а также от возможностей программы «Считыватель показаний датчиков»
системы, через которые они проходят транзитом. к исходному варианту и проверьте, что она работает
Программам для персональных компьютеров часто должным образом. Добившись стабильной отправ­
бывает легче разбираться с неструктурированными ки микроконтроллером данных от датчиков на тер­
двоичными значениями. Но многие сетевые про­ минал, можно отправлять эти данные в программу,
токолы, используемые в этой книге, основаны на которая отображает их в виде игры в настольный
А8СП. Кроме того, символы А8СП могут читаться теннис. Эта программа должна исполняться на ком­
людьми, вследствтг з чего данные оказывается более пьютере, к которому подключена плата Arduino.
удобно передавать с помощью этого кода. Для про­ Для создания этой программы хорошо подойдет
екта «Мартышкин пинг-понг» мы воспользуемся среда Processing.
А8СП-форматированием (первоначальным кодом)
90 Глава 2

/*
т Пишем код___ ______ Последовательный считыватель строк
Создайте приложение Processing Контекст: Processing
и введите в него следующий код:
*/
import processing.serial.*; // импортируем библиотеку Processing
// для работы с последовательным
// обменом

Serial myPort; // Переменная последовательного порта


String resultstring; // строчная переменная для результатов

void setup () {
size (480, 130); // устанавливаем размер окна апплета
println(Serial.list() ); // Выводим на экран все доступные
// последовательные порты

// Берем номер порта со списка портов.


/ / Н а моем компьютере порт модуля Arduino обычно первый порт
// в списке, поэтому я открываю Serial.list () [0].
// Измените 0 на номер последовательного порта,
// к которому подключен ваш микроконтроллер:
String portName = Serial.list ()[0];
// открываем последовательный порт:
myPort = new Serial(this, portName, 9600);

// считываем байты в буфер, пока не дойдем до символа


// перевода строки (ASCII 10):
myPort.bufferUntil('\n');

void draw() {
// задаем цвет фона и заливки для окна апплета:
background(#044f6f);
fill (#ffffff );
// show a string in the window:
if (resultstring != null) {
text(resultstring, 10, height/2);

// Метод serialEvent() исполняется автоматически


/ / в программе каждый раз, когда в буфер записывается байт
/ / с о значением, определенным в методе bufferUntil()
// в процедуре setup ():

void serialEvent(Serial myPort) {


// считываем данные из последовательного буфера:
String inputstring = myPort.readStringUntil('\n’);

// отбрасываем символы возврата каретки и перевода строки


// из строки ввода:
inputstring = trim(inputstring);
// очищаем переменную resultstring:
resultstring = ►►
Простейшая сеть 91

ш 11 разделяем входную строку по запятым и преобразовываем


// полученные фрагменты в целые числа:
int sensors[] = int(split(inputstring,
// добавляем значения к строке результата:
for (int sensorNum = 0; sensorNum < sensors.length; sensorNum++) {
resultstring += «Sensor « + sensorNum + «: «;
resultstring += sensors [sensorNum] + <<\t>>;
}
// вьгоодим результат на экран:
println(resultstring);

Ч П о П акеты данны х, заго ло вки ,


полезны е н агр узки и «хвосты »
Теперь, когда мы добились передачи данных от одного устройства (микроконтроллера на мартышке)
к другому (компьютеру, исполняющему программу Processing), рассмотрим более внимательно по­
следовательность байтов, которую мы передаем. Обычно, эта последовательность имеет следующую
структуру (поля разделены запятой, ASCII 44):

Датчик левой Датчик правой Кнопка сброса Кнопка подачи Символ возврата каретки,
руки (0-1023) руки (0-1023) (0 или 1) (0 или 1) символ перевода строки
1-4 байта 1-4 байта 1 байт 1 байт 2 байта

Части этой последовательности разделены бай­ сообщения отсутствует, эту роль играет «хвост»
том со значением АБСП 44, то есть запятой. Мы сообщения, отделяя одно сообщение от следую­
только что создали еще один протокол передачи щего.
данных. Байты значений датчиков и разделяющие
их запятые — это полезная нагрузка, а символы В сетевом окружении постоянно отправляется
возврата каретки и перевода строки — «хвост». множество сообщений, подобных этому. Каждая
Запятые служат разделителями. Этот протокол не отдельная группа байтов сообщения называется
имеет заголовка, но многие другие протоколы — пакетом и состоит из заголовка, полезной нагруз­
имеют. ки и, обычно, «хвоста». Для каждой отдельной
сети существует максимальный размер пакета.
Заголовок — это последовательность байтов, ко­ В нашем примере размер пакета определяется
торая идентифицирует следующие за ней данные, размером буфера на персональном компьютере
а также может содержать описание этих данных. для накопления последовательных данных. Среда
В сетевом окружении, где одно и то же сообще­ Processing может работать с содержимым буфера
ние может быть получено многими устройства­ размером в несколько тысяч байтов, так что наш
ми, заголовок может содержать адрес отправите­ 16-байтовый пакет не представляет для нее ни­
ля или получателя или и то, и другое. Таким обра­ какой сложности. Сообщения намного большего
зом, любое устройство может сначала прочитать размера нам пришлось бы разделять на несколько
только заголовок, чтобы определить, нужно ли пакетов, а затем собирать исходное сообщение из
ему читать все сообщение. Некоторые заголовки полученных пакетов. В таком случае заголовок
могут быть весьма простыми — как один байт по­ пакета может содержать его номер, чтобы полу­
стоянного значения, указывающий на начало со­ чатель знал, как упорядочить полученные пакеты
общения. В нашем примере, в котором заголовок для восстановления исходного сообщения.
92 Глава 2

Отвлечемся на время от создания


кода и протестируем уже имею­
щийся скетч. Обязательно за­
кройте окно М онитор порта (или
последовательный порт, если вы
используете другую програм­
му терминала последовательной
связи), чтобы освободить после­
довательный порт компьютера.
Теперь выполните нашу програм­
му. Если она не содержит ника- Рис. 2.14. Вывод программы в окне апплета
ких ошибок, то должна вывести
в консоль и в окно апплета спи-
сок значений датчиков, пример
которого показан на рис. 2.14.

Ш Теперь мы можем исполь- float leftPaddle, rightPaddle; // переменные для значений


зовать эти данные, чтобы играть // датчиков изгиба
int resetButton, serveButton; // переменные для кнопок
в пинг-понг. Прежде всего, до­
int leftPaddleX, rightPaddleX; // горизонтальные позиции ракеток
бавьте несколько переменных
int paddleHeight = 50; // вертикальный размер ракеток
в начало скетча Processing — пе­ int paddleWidth = 10; // горизонтальный размер ракеток
ред методом setup о , и откоррек­ float leftMinimum = 120; // минимальное значение левого
тируйте этот метод для установ­ // датчика изгиба
ки размера окна и инициализа­ float rightMinimum = 100; // минимальное значение правого
ции некоторых переменных (до­ // датчика изгиба
float leftMaximum = 530; // максимальное значение левого
бавленный код выделен жирным
// датчика изгиба
шрифтом). float rightMaximum = 500; // максимальное значение правого
// датчика изгиба
Числа с плавающей запятой
void setup() {
В качестве переменных для диапа­ size (640, 480); // устанавливаем размер окна апплета
зона действия ракеток в этом при­
мере используются числа с плава­ String portName = Serial.list()[0];
ющей запятой, поскольку в резуль­
// открываем последовательный порт:
тате деления чисел целого типа
myPort = new Serial(this, portName, 9600);
также получается целое число.
Например, в результате деления
целых чисел 480/400 получится 1, // считываем байты в буфер, пока не дойдем до символа
а не 1,2. Точно так же частное от // перевода строки (ASCII 10):
деления целых чисел 400/480 бу­ myPort.bufferUntil(1\n ');
дет 0, а не 0,833. Соответственно, // инициализируем значения датчиков:
деление двух целых чисел оди­ leftPaddle = height/2;
накового порядка величины дает rightPaddle = height/2;
бесполезные для нас результаты. resetButton = 0;
Имейте это в виду при использо­ serveButton = 0;
вании функций масштабирования
наподобие тар (). // инициализируем горизонтальные позиции ракеток:
leftPaddleX = 50;
rightPaddleX = width - 50;

// рисуем фигуры без окантовки:


noStroke();

►►
Простейшая сеть 93

Ш Теперь заменим метод void seriaiEvent(Serial myPort) {


seriaiEvent оследующей верси­ // считываем данные из последовательного буфера:
ей, которая помещает получен­ String inputstring = myPort.readStringUntil('\n');
ные значения в переменные дат­
чиков: // отбрасываем символы возврата каретки и перевода строки
// из строки ввода:
inputstring = trim(inputstring);
// очищаем переменную resultstring:
resultstring =

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


// полученные фрагменты в целые числа:
int sensors[] = int(split(inputstring, ','));
// если получены все строки значений датчиков, используем их:
if (sensors.length — 4) {
// масштабируем данные датчиков изгиба к диапазону ракеток:
leftPaddle = map(sensors[0], leftMinimum, leftMaximum, 0,
height);
rightPaddle = map(sensors[1], rightMinimum, rightMaximum, 0,
height);

// присваиваем значения кнопок соответствующим переменным:


resetButton = sensors[2J;
serveButton = sensors[3];

// добавляем значения к строке результата:


resultstring += «left: «+ leftPaddle + «\tright:
« + rightPaddle;
resultstring += «\treset: «+ resetButton + «\tserve:
« + serveButton;
}
j

Ш Наконец, модифицируем ме­ void draw’() {


тод draw о, добавив в него код // задаем цвет фона и заливки для окна апплета:
для рисования ракеток (новый | background(#044f6f);
код выделен жирным шрифтом). j fill (#ffffff) ;

!
// рисуем левую ракетку:
rect(leftPaddleX, leftPaddle, paddleWidth, paddleHeight);

// рисуем правую ракетку:


rect(rightPaddleX, rightPaddle, paddleWidth, paddleHeight) ;
}
94 Глава 2

0 £ Ракетки могут не двигаться до тех пор, пока Выставив положения датчиков в руках мартышки,
■ ■ не поступят данные от датчиков изгиба, то снова выполните программу и наблюдайте за дан­
есть, пока мы не согнем их. В зависимости от того, ными левого и правого датчиков, сгибая ее руки.
как датчики изгиба физически прикреплены к ру­ Запишите максимальное и минимальное значения
кам мартышки и до какой степени можно сгибать для каждой руки. Затем присвойте эти значения
ее руки, диапазон значений датчиков изгиба будет переменным leftMinimum, leftMaximum, rightMinimum
разным. Функция шар о сопоставляет диапазонам и leftMaximum метода setup (). Когда эти переменные
значений датчиков изгиба диапазоны движений настроены должным образом, при движении рук
ракеток, но диапазоны датчиков изгиба нужно еще мартышки движения ракеток должны покрывать
определить. Для этого важно, чтобы датчики изгиба всю высоту экрана.
были вставлены в руки мартышки, так как для тон­
кой настройки системы нам необходимо иметь их
в том месте, в котором они будут использоваться.

Ш Наконец, настало время до­ int ballSize = 10; // размер мячика


бавить в программу теннисный int xDirection = 1; // горизонтальное направление движения
мячик. Мячик будет перемещать­ // мячика влево: -1, вправо: 1

ся слева направо по диагонали. int yDirection = 1; // вертикальное направление движения


// мячика вверх: -1, вниз: 1
При столкновении с верхним или
int xPos, yPos; // горизонтальное и вертикальное
нижним краем экрана мячик от­ // положение мячика
скакивает и изменяет вертикаль­
ное направление движения. При
достижении левого или право­
го края мячик возвращается в
центр. При касании одной из
ракеток мячик отскакивает и из­
меняет горизонтальное направ­
ление движения. Для всего это­
го нам потребуется пять новых
переменных вверху программы,
непосредственно перед методом
setup() :

Ш В конце метода setup о нам // инициируем позицию мячика в центре окна:


нужно задать мячику начальную xPos = width/2;
позицию в центре окна: yPos = height/2;

Ш Теперь добавим в конце про­ void animateBall() {


граммы два метода: animateBall() // если мячик движется влево:
И resetBall о . Эти методы ВЫЗЫ- if (xDirection < 0) {
ваются из метода draw (): // если мячик находится слева от левой ракетки
if ((xPos <= leftPaddleX)) {
// если мячик находится между верхом и низом
// левой ракетки:
i f ((leftPaddle - (paddleHeight/2) <= yPos) &&
(yPos <= leftPaddle + (paddleHeight /2))) {
// изменяем направление горизонтального движения
// на обратное: ►►
Простейшая сеть 95

01 xDirection =-xDirection;

// если мячик движется вправо:


else {
// если мячик справа правой ракетки
if ((xPos >= ( rightPaddleX + ballSize/2))) {
// если мячик находится между верхом и низом правой ракетки:
i f ((rightPaddle - (paddleHeight/2) <=yPos) &&
(yPos <= rightPaddle + (paddleHeight /2))) {

// изменяем направление горизонтального движения


// на обратное:
xDirection =-xDirection;

// if the ball goes off the screen left:


if (xPos < 0) {
resetBall();

// если мячик выходит за пределы окна справа:


if (xPos > width) {
resetBall();
}
// не даем мячику выйти за верхний или нижний предел окна
if ((yPos - ballSize/2 <= 0) || (yPos +
ballSize/2 >=height)) {
// изменяем направление вертикального движения мячика
/ / н а обратное:
yDirection = -yDirection;
}
// обновляем местонахождение мячика:
xPos = xPos + xDirection;
yPos = yPos + yDirection;

// рисуем мячик:
rect(xPos, yPos, ballSize, ballSize);

void resetBall() {
// возвращаем мячик обратно в центр окна:
xPos = width/2;
yPos = height/2;

►►
96 Глава 2

Ш Мы уже почти готовы за­ boolean balllnMotion = false; / / мячик движется?


пустить мячик в движение. Но ! int leftScore = 0;
сначала нужно позаботиться о int rightScore = 0;
кнопках сброса и подачи мячика.
Добавьте еще одну переменную
в начале кода (непосредственно !
перед методом setup о со всеми
другими объявлениями перемен­
ных) для отслеживания, движет­
ся ли мячик. Также добавьте еще
две переменных для ведения
счета:

Ш Теперь все готово, чтобы / / вычисляем местонахождение мячика и прорисовываем его:


запустить мячик в движение. if (balllnMotion == true) {
Мячик должен двигаться только animateBall () ;
с подачи. Этот код нужно раз­ }
местить в конце метода draw о .
/ / если нажата кнопка подачи, запускаем мячик в движение:
Первый оператор if о запускает
if (serveButton == 1) {
мячик в движение при нажатии ;
balllnMotion = true;
кнопки подачи. Второй оператор }
if о перемещает запущенный
мячик. Наконец, третий оператор // если нажата кнопка сброса, обнуляем счет
if () возвращает мячик обратно / / и запускаем мячик в движение :
в центр окна и обнуляет счет при if (resetButton == 1) {
нажатии кнопки сброса: leftScore = 0;
rightScore = 0;
balllnMotion = true;
}

Ш Модифицируйте метод / если мячик выходит за пределы окна слева:


animateBall (), Чтобы увеличи­ if (xPos < 0) {
вать счет, когда мячик выходит rightScore++;
resetBall ();
за пределы окна слева или справа
}
(добавленный код выделен жир- ;
/ / если мячик выходит за пределы окна справа:
ным шрифтом): if (xPos > width) {
leftScore++;
resetBall ();
}

Ш Для вывода счета, добавьте int fontsize = 3 6 ; / / размер шрифта для отображения счета
новую глобальную переменную
перед методом setup ():

Ш Добавьте две строки кода / / создаем шрифт из третьего шрифта, доступного системе:
в конце метода setup о , чтобы PFont myFont = createFont(PFont. list ( ) [2], fontSize);
инициализировать шрифт: textFont(myFont);

£П Наконец, добавьте две строки / / выводим счет на экран :


кода в конце метода draw о для text(leftScore, fontSize, fontSize);
отображения счета: text(rightScore, width-fontSize, fontSize);
Простейшая сеть 97

Все. Теперь мы можем играть


в мартышкин пинг-понг. Процесс
игры показан на рис. 2.15. Чтобы
сделать игру более увлекатель­
ной, возьмите вторую мягкую
игрушку и вставьте один из дат­
чиков изгиба в нее — тогда мож­
но будет играть вдвоем.

Рис. 2.15. Результат скетча


«Мартышкин пинг-понг»

н У пр авлен и е потоком д ан ны х
Возможно, вы заметили, что ракетки на экране не всегда движутся плавно вслед за руками
Мартышкина. Иногда ракетки могут застывать на долю секунды, а иногда двигаться с отстава­
нием от руки мартышки. Причиной этому — асинхронная связь между компьютером и микро­
контроллером.

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

Ш Для этого сначала добавьте while (Serial.available() <= 0) {


Следующий КОД В МеТОД startup () // отправляем начальное сообщение
скетча. Исполняя этот код, Serial.println("hello");
Arduino посылает сообщение до }
тех пор, пока не получит ответ от
Processing:

Ш Затем поместите весь метод void loop () {


loop () из программы Arduino // проверяем, есть ли доступный байт для
(программа «Считыватель пока- // чтения в последовательном буфере:
заний датчиков» в начале разд. if (Serial.available() > 0) {
Проект 2. «Мартышкин пинг- / / считываем данные из последовательного
понг») в оболочку оператора if, / / буфера:
как показано здесь (добавленный / / значение байта не имеет значения,
код выделен жирным шрифтом): / / а только факт его наличия:
int inByte = Serial.read ();
/ / остальная часть старого кода
/ / основного цикла идет сюда
// ...
}
}
Ш[ Следующим шагом мы доба­ void serialEvent(Serial myPort) {
вим выделенный жирным код в // rest of the serialEvent goes here
конец метода serialEvent () СКвТ- myPort.write ( '\ r ') ; // посылаем символ

ча Processing «Мартышкин пинг- // возврата каретки

понг»: }

Теперь ракетки должны двигаться намно- Изменение в скетче Processing находится в конце
Ш го более плавно. Наше решение работает метода serialEvent (). ЭТОТ дополнительный КОД
следующим образом: микроконтроллер посыла­ отправляет байт обратно микроконтроллеру, кото­
ет строку «hello» до тех пор, пока он не получит рый, получив новый байт, отправляет другой пакет
какие-либо данные, после чего начинает исполнять данных, и цикл снова повторяется. Таким образом,
основной цикл. Этот цикл считывает полученный последовательный буфер на стороне Processing ни­
байт просто для того, чтобы очистить последова­ когда не заполняется и всегда содержит самые по­
тельный буфер, отправляет свои данные один раз, следние показания датчиков.
а затем ожидает прибытия других данных. Если
цикл ничего не получает, он также ничего и не от­ Значение полученного микроконтроллером байта
правляет. несущественно. Этот байт служит лишь сигналом
от скетча Processing, извещающим микроконтрол­
Тем временем среда Processing запускает свою про­ лер, когда скетч готов получать новые данные.
грамму, ожидая входящие данные. Когда программа Несущественно и сообщение «hello», посылаемое
получает любую строку, оканчивающуюся симво­ микроконтроллером, поскольку оно лишь служит
лом НОВОЙ строки, вызывается метод serialEvent (), триггером для Processing для отправления первона­
как это делалось и раньше. Программа считывает чального байта, поэтому Processing просто игнори­
строку и, если она содержит запятые, разбивает рует его. Такой метод управления потоком данных
строку по запятым, извлекая значения датчиков, иногда называется методом рукопожатия или вы­
и это тоже делалось раньше. Если строка не содер­ зова и ответа. Этот метод может быть полезен для
жит запятых (например, если это строка «hello»), обеспечения надежного обмена при передаче паке­
программа Processing ничего с ней не делает. тов данных.
Простейшая сеть 99

v Проект 3

Беспроводной «Мартышкин пинг-понг»


Игра «Мартышкин пинг-понг» могла бы быть еще более занимательной, если бы сам Мартыш­
кин не был привязан к компьютеру кабелем иБВ. Этот проект ликвидирует проводное соеди­
нение между микроконтроллером и персональным компьютером и вводит новые сетевые по­
нятия: «модем» и «адрес».

Приобретите адаптер Bluetooth


Требуемые компоненты
Если ваш компьютер не оснащен встроенной функцио­
нальностью Bluetooth, вам потребуется соответствую­
щий адаптер. Такой адаптер можно приобрести в боль­ ►
►Завершенный проект 2 «Мартышкин пинг-
шинстве компьютерных магазинов. понг», 1 шт.

►Батарейка на 9 В и переходник для нее, 1 шт.
Bluetooth: многоуровневый сетевой ►
►Гнездовой разъем питания, 2,1 мм внут.
протокол диаметра, 5,5 мм внешн. диаметра, 1 шт.
В этом проекте используется новое оборудова­ ►
►Модуль Bluetooth Mate, 1 шт.
ние— модуль Bluetooth. Этот модуль оснащен

►Компоновочный корпус, 1 шт.
двумя интерфейсами. Первый — это асинхронный
последовательный порт, который может взаимодей­
ствовать с микроконтроллером через два контакта: подобные используемому в этом проекте модулю.
RX (прием) и ТХ (передача). А второй — это радио­ Такие устройства реализуют профиль Bluetooth
приемопередатчик, использующий протокол связи SPP5. Другие устройства Bluetooth реализуют иные
Bluetooth. Такой приемопередатчик функционирует профили протокола: беспроводная гарнитура —
как модем, преобразовывая данные между протоко­ аудиопрофиль HSP6, а беспроводные мыши и кла­
лом Bluetooth и обычным асинхронным последова­ виатуры— профиль HID7. Поскольку устройство
тельным протоколом. Bluetooth может поддерживать несколько профилей
протокола Bluetooth, существует и протокол обна­
Модуляция и демодуляция ружения сервисов8, с помощью которого радио­
устройства обмениваются информацией о поддер­
Первые цифровые модемы преобразовывали сигна­ живаемых ими возможностях Bluetooth.
лы данных в аудиосигналы, которые передавались по
телефонной линии. Преобразование цифровых данных
С учетом того, что протокол Bluetooth стандарти­
в аудио называется модуляцией, а обратное преобразо­
вание — демодуляцией. Теперь такие модемы встре­ зован, разработчику не требуется заниматься боль­
чаются редко, но их потомки работают повсюду — от шинством деталей по установлению и удержанию
приставок к телевизору, которые преобразовывают подключения, что позволяет ему уделять все вни­
сигнал между телевизионным кабелем и подключени­ мание обмену данными. В этом плане протокол
ем к Интернету, до модемов, которые преобразовывают
Bluetooth подобен протоколам RS-232 и USB, ко­
цифровые данные в ультразвуковые импульсы для при­
менения в морских исследованиях. торые позволяют разработчику игнорировать боль­
шинство частностей электрического подключения
Многоуровневый протокол связи Bluetooth при­ микроконтроллера к персональному компьютеру,
зван заменить проводные соединения для некото­ позволяя ему концентрироваться на задаче обмена
рых приложений. Поэтому протокол разделен на данными.
несколько подпротоколов для потенциальных при­
5 SPP, Serial Port Profile — профиль последовательного порта.
ложений, которые называются профилями. Самые 6 HSP, Headset Profile — профиль наушников.
простые устройства Bluetooth — это устрой­ 7 HID, Human Interface Device — интерфейс «человек-машина».
ства для последовательного обмена данными, 8 Service Discovery Protocol.
100 Глава 2

Сопряжение компьютера окошко будет содержать, среди прочих, значок Blue­


с модулем Bluetooth tooth Devices (Устройства Bluetooth) (рис. 2.16).
Щелкните по этому значку и в открывшемся контек­
Чтобы беспроводное соединение между компьюте­ стном меню выберите опцию Добавить устройство.
ром и модулем Bluetooth заработало, нужно устано­
вить между ними сопряжение. Для этого откройте Система выполнит поиск новых устройств, по за­
на компьютере панель управления Bluetooth, по­ вершению которого будет выведен список обна­
зволяющую организовать поиск новых устройств руженных устройств, который должен содержать
Bluetooth. устройство под названием FireFly-XKY, где XXX
означает серийный номер вашего модуля Bluetooth.
Для Mac O S X Если поблизости компьютера не находится никаких
других устройств Bluetooth, это будет единственный
На машине под Mac OS X выполните команду меню модуль Bluetooth. На запрос ввести код сопряжения
Apple menu | System Preferences, а затем выбери­
устройства, введите 1234. По завершению процеду­
те опцию Bluetooth. Убедитесь, что функциональ­
ры сопряжения устройства в список последователь­
ность Bluetooth включена и может быть обнаруже­ ных портов будет добавлен новый порт. Запомните,
на, а затем щелкните на опции Show Bluetooth sta­
а лучше запишите номер этого порта (например,
tus in the menu bar (Отображать статус Bluetooth СОМ 14), так как он нам понадобится немного
в панели меню). Щелкните по значку + внизу спи­ позже.
ска устройств, чтобы запустить помощник установ­
ки Bluetooth. Компьютер выполнит поиск устройств
и обнаружит устройство, называющееся FireFly-
XXX (модуль Bluetooth Mate Gold) или KN42-XXX
(модуль Silver), где XXX означает серийный номер
модуля Bluetooth. Если к компьютеру не подклю­
чено никаких других устройств Bluetooth, это бу­
дет единственный модуль Bluetooth. Выберите это
устройство и в следующем окне щелкните на оп­ а
ции Passkey Options. Затем выберите опцию Use
a Specific Passcode и введите 1234 . Нажмите кноп­
ку Continue. Будет создан последовательный порт
и установлено подключение. В списке последо­
вательных портов программы CoolTerm, среды
Arduino или среды Processing этот порт будет обо­
значен как FireFly-X\X-SPP или RN42-JCOT-SP.

Для Windows 7
На машинах под Windows 7 разные компьютеры мо­
гут иметь разные модули Bluetooth. Если же ваш ПК
не имеет встроенного модуля Bluetooth, то можно
подключить к нему любой адаптер Bluetooth, под­
Рис. 2.16. Значок Bluetooth Devices (Устройства
держивающий стек Windows Bluetooth, каковыми Bluetooth) в области уведомлений панели задач
являются большинство Bluetooth USB-адаптеров. Windows:
Установите драйверы устройства, следуя прила­ а — английская версия; б — локализованная.
гаемым к нему инструкциям, а затем щелкните на Чтобы постоянно отображать этот значок в области
значке Show Hidden Icons (Отображать скрытые уведомлений, щелкните по ссылке Customize
значки). Это небольшой треугольник в левом краю (Настроить) и выберите опцию Показать значок
области уведомлений панели задач. Открывшееся и уведомления для него
Простейшая сеть 101

Для Ubuntu Linux


доступных устройств Bluetooth, по завершению ко­
Возможности диспетчера Bluetooth для Ubuntu Linux торого отобразит список обнаруженных устройств,
несколько ограниченны, поэтому будет лучше уста­ включающий ваш модуль Bluetooth под названием
новить вместо него диспетчер BlueMan (Bluetooth FivoFily-XXX или RN42-AXY, где XXX подразумевав
Manager). Для этого откройте Центр приложений ет серийный номер вашего модуля Bluetooth. На за­
Ubuntu, введите В строку поиска BlueMan и уста­ прос кода для сопряжения устройства введите 1 2 3 4 .
новите эту программу. После установки BlueMan Когда устройство будет добавлено, щелкните по
откройте панель управления Система. В ней, кро­ значку Настройка — откроется окно с запросом,
ме панели управления Bluetooth по умолчанию, желаете ли вы подключиться к последовательному
должен находиться значок диспетчера Bluetooth порту. Нажмите кнопку Вперед — и отобразится
Manager. Откройте диспетчер Bluetooth Manager. номер последовательного порта для вашего модуля
Программа выполнит сканирование на наличие Bluetooth: /dev/rfcommO.

Настройка программы «Мартышкин


пинг-понг»
После установления сопряжения компьютера с мо­ Отключите модуль Bluetooth от платы Arduino, пре­
дулем Bluetooth к нему можно подключаться, как и жде чем загружать модифицированный скетч, так
к последовательному порту. Запустите скетч «Мар­ как он будет мешать загрузке. После загрузки но­
тышкин пинг-понг» на выполнение и просмотри­ вого кода модуль Bluetooth можно снова подсоеди­
те список последовательных портов. Этот список нить к плате Arduino. Никаких других изменений
должен содержать порт вашего модуля Bluetooth. кода не требуется.
Присвойте НОМер ЭТОГО ПОрТа Переменной portName
в методе setup о: Итак, подсоедините модуль Bluetooth к макетной
String portName = Serial.list () [0];
плате проекта «Мартышкин пинг-понг», как по­
// открываем последовательный порт: казано на рис. 2.17. Подключите разъемы питания
myPort = new Serial(this, portName, 9600); модуля к соответствующим разъемам питания ма­
Например, если последовательный порт устройства кетной платы (то есть VCC модуля — к +5 В пла­
Bluetooth идет в списке девятым, модифицируйте ты, а общий контакт модуля — к общему платы).
присвоение значения переменной так: Соедините контакты ТХ и RX модуля Arduino с кон­
тактами RX и ТХ модуля Bluetooth, соответственно.
portName = Serial.list()[8]
Подсоедините батарейку (рис. 2.18), и модуль нач­
Затем измените скорость передачи данных: нет работать.
myPort = new Serial(this, portName, 115200);
Теперь Мартышкин может играть в пинг-понг, не
будучи привязанным к компьютеру. Когда програм­
J É k Перезапустите программу Processing ма Processing устанавливает соединение с модулем
Если после этого подключить или отключить Bluetooth, на нем загорается зеленый светодиод.
какие-либо последовательные устройства, вклю­
чая Arduino, нужно будет остановить, а затем Если вы не модифицировали код программ Arduino
снова запустить программу Processing, так как и Processing, как рассматривалось в разд. «Управ­
число последовательных портов станет другим. ление потоком данных» ранее в этой главе, у вас
У , - ... .. J могут быть проблемы с установлением подключе­
ния по беспроводной связи. В таком случае снача­
Кроме ТОГО, нужно изменить строку Serial.begin () ла реализуйте эти правки в коде. После этого игра
в скетче Arduino: «Мартышкин пинг-понг» должна работать как
Serial.begin(115200); и раньше, но теперь без проводов.
102 Глава 2

! '! !i

il

A R EF
Reset GND
+3 3V D13
К +5 В макетной платы -------- +5V D12
К +5 В макетной платы -------- Gnd D11/PWM
К +5 в макетной платы -------- Gnd D10/PWM
К +9 В батареи -------- Vin D9/PWM
+5У Сопротивление 15 К D8
датчика изгиба Модуль Arduino

D7 Подач
Сброс
D6/PWM О О
Analogo D5/PWM
A1 D4 10 К
A2 D3/PWM -Л Л Л л
A3 D2 ■ЛЛЛг'
A4 Digital 1/TX 10 к -=± =-

A5 DigitalO/RX

R TS
RX
TX
Модуль BlueSMiRF
Vcc
CTS
Gnd

Рис. 2.17. Макетная плата проекта «Мартышкин пинг-


понг» с подсоединенным модулем Bluetooth (а) Рис. 2.18. Если ваш переходник на батарейку «Крона»
и принципиальная схема соединений (б). не имеет разъема питания, как у переходника,
Смонтировав схему, просверлите отверстия в корпусе поставляемого магазинами, указанными в списке
для кнопок и проводов, ведущих к датчикам изгиба, источников деталей для проектов, вам нужно будет
и установите макетную плату, модуль Arduino самому припаять требуемый разъем питания
и батарейку в корпус к переходнику, как показано на этом рисунке
Простейшая сеть 103

Завершающие ш трихи: упорядочиваем и закры ваем


Желательным сделать проект «Мартышкин пинг- Это та же самая схема, что и на рис. 2.17, только
понг» аккуратным и компактным. Для этого смон­ более аккуратная и меньших размеров, что позво­
тируйте схему проекта на макетном шилде, как по­ ляет заключить ее в корпус. А для корпуса отлично
казано на рис. 2.19. подойдет небольшой контейнер для пищевых про­
дуктов (рис. 2.20).

Рис. 2.19. Сборка проекта


«Мартышкин пинг-понг»
на макетном шилде
НИИ

З и К
!Я||Н 1
ШКШш

ш
шшш ■
шЯШШШШ
шШШЯш
ЩШЯт
1 |1 |;
11111ШИИММЯ"
111

Рис. 2.20. Проект


«Мартышкин пинг-понг»
в завершенном виде
104 Глава 2

4 с Проект 4

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

Модуль Bluetooth — это, по сути, модем в том


смысле, что он преобразовывает сигнал из одно­ Требуемые компоненты
го типа среды связи в другой: последовательный
TTL-сигнал, передаваемый по проводам, в после­ ►
►Модуль Bluetooth Mate, 1 шт.
довательный Bluetooth-сигнал, передаваемый по ►
►Преобразователь USB/TTL-Serial
радио, и наоборот. Задача модема состоит в том, типа FTDI, 1 шт.
чтобы установить соединение с другим модемом,
согласовать условия обмена данными, а затем разо­
рвать соединение. Для этого модему требуется два завершается символом ASCII для возврата каретки.
рабочих режима: командный режим, в котором об­ Модем отвечает на полученную команду сообще­
мен ведется с модемом, и режим данных, в кото­ нием ок, за которым следует информация, которая
ром обмен ведется через модем. В этом отношении от него ожидается.
модемы Bluetooth ничем не отличаются от любых
других модемов. Модуль Bluetooth Mate не использует формат
команд a t , но имеет похожий протокол, и все его
Многие модемы Bluetooth (а также другие устрой­ команды тоже основаны на коде ASCII.
ства связи) используют набор команд на основе
набора, первоначально разработанного для теле­ Как и обычный модем, модуль Bluetooth Mate рабо­
фонных модемов, — так называемого командного тает в командном режиме и режиме данных. Пере­
протокола Hayes АТ. Все команды в командном про­ ключение из режима данных в командный режим
токоле Hayes (и, соответственно, также и в команд­ осуществляется командой $$$.
ном протоколе Bluetooth) посылаются в символах
ASCII. Все использующие этот протокол устрой­ На все полученные команды командного режима
ства работают как в командном режиме, так и в ре­ (которые состоят из коротких строк) модем отве­
жиме данных. Для переключения из режима данных чает строкой а о к . Чтобы вывести модем Bluetooth
в командный режим в протоколе Hayes применяется из командного режима и переключить его в режим
строка +++. Все команды протокола имеют общую данных, посылается строка —- \г (где \г — возврат
структуру. Каждая команда, посылаемая управляю­ каретки, символ ASCII 13). В режиме данных все
щим устройством (таким, как микроконтроллер данные посылаются модему по радиоканалу, а по­
или персональный компьютер) модему, начинает­ лучаемые модемом данные передаются устройству,
ся со строки ASCII a t , за которой следует короткая к которому он подсоединен, по физическому после­
строка из набора букв и цифр, представляющая довательному соединению.
собственно команду, а за ней — ее параметры (если
таковые имеются), разделенные запятыми. Команда
Простейшая сеть 105

Управление модулем Bluetooth


Подсоедините модуль Bluetooth к разъему преоб­ и перейдет в командный режим. Чтобы убедиться,
разователя (адаптера) USB/TTL-Serial, как пока­ что модуль работает и находится в командном ре­
зано на рис. 2.21. Обратите внимание: поскольку жиме, нажмите клавишу <Enter>. Модуль ответит
модуль Bluetooth и TTL-Serial разъем преобразова­ символом знака вопроса: ?
теля имеют одинаковую конфигурацию контактов,
при подсоединении модуля к преобразователю кон­ Чтобы вывести на экран список всех команд, введите
такты приема и передачи на модуле и разъеме пре­ символ н и нажмите клавишу <Enter>. Список всех
образователя необходимо соединять наперекрест. команд для этого модуля также доступен на веб-сайте
Подсоединив модуль к преобразователю, подклю­ www.SparkFun.com или www.rovingnetworks.com
чите его кабель к порту USB компьютера. (модуль Bluetooth Mate Gold использует приемопе­
редатчик RN-41 компании Roving Networks, а модуль
Для этого проекта нужна программа терминала Bluetooth Mate Silver — их же приемопередатчик
последовательной связи, которая может одновре­ RN-42). Несколько команд модуля мы рассмотрим
менно открыть два порта: один последователь­ здесь. Каждый изготовитель модемов Bluetooth «за­
ный порт нужен для проводного подключения шивает» в них свой собственный набор команд —
к модулю Bluetooth через адаптер USB/TTL-Serial, к сожалению, все они разные. Тем не менее, все они
а второй — для беспроводного подключения через имеют одинаковую основную структуру, подобную
модуль Bluetooth. Поэтому монитор порта среды структуре команд, рассматриваемых здесь.
Arduino нам не подойдет.
Итак, в настоящий момент наш модуль находится
Для машин под Mac OS X и Windows для этой цели в командном режиме. Первое, что следует узнать
хорошо подойдет программа CoolTerm. А для ма­ о модуле, — это его параметры: введите команду d
шин под Ubuntu Linux можно использовать про­ и нажмите клавишу <Enter>. Будет выведен список
граммы GNU screen или PuTTY. Определившись параметров приемопередатчика, который выглядит
с программой терминала, откройте в ней подклю­ примерно так:
чение к адаптеру USB/TTL-Serial со скоростью
***Settings***
115 200 битов в секунду.
ВТА=000666112233
После включения питания модуля Bluetooth Mate BTName=FireFly-7256
он находится в режиме данных. Чтобы переклю­ Baudrt(SW4)=115K
чить его в командный режим, нужно послать ему Parity=None
Mode=Slav
следующую команду:
Authen=0
$$$ Encryp=0
PinCod=1234
Модуль ответит такой строкой:
Bonded=0
CMD Rem=N0NE SET

Преобразователь
Модуль Bluetooth Mate USB/TTL-Serial
FT232RL

Рис. 2.21. Подсоединение модуля Bluetooth Mate к преобразователю USB/TTL-Serial FT232RL.


Модуль Bluetooth Mate предусматривает подсоединение через кабель-переходник FTDI, поэтому у него такая же,
как и у преобразователя, конфигурация контактов. Соответственно, при подсоединении его к преобразователю
напрямую контакты приема и передачи на модуле и разъеме преобразователя необходимо соединять наперекрест
106 Глава 2

Первый в списке параметров — адрес устройства


Bluetooth. Этот параметр используется при установ­ Особенность модуля Bluetooth Mate
лении соединения с устройством. Производители
устройств Bluetooth согласовали стандартную схе­ Модуль Bluetooth Mate не может инициировать
му адресации, поэтому каждое устройство имеет подключение к компьютеру, если предваритель­
однозначный адрес. Следующие далее параметры но не было выполнено его сопряжение с ком­
содержат информацию о конфигурации приемопе­ пьютером. Дело в том, что приемопередатчики
редатчика: скорость передачи в бодах, включена ли Bluetooth не могут инициировать последова­
аутентификация и ПИН-код. тельное подключение, если они не были пред­
варительно сопряжены с устройством. Приемо­
Вы, наверное, уже обратили внимание на то, что передатчики Bluetooth рассматриваются более
вводимый с клавиатуры текст не отображается на
подробно в главе 6.
экране. Это потому, что вводимые символы про­
граммой терминала последовательной связи от­
правляются прямо на последовательный порт, ми­ Получив список доступных устройств Bluetooth,
нуя экран. Но модуль Bluetooth Mate может отобра­ попробуем подключиться к устройству, представ­
жать вводимые символы — для этого нужно про­ ляющему наш компьютер. Как уже упоминалось
сто выполнить команду +\г. Эта команда включает ранее, для установки такого подключения модуль
и отключает режим эха. Отображение вводимого Bluetooth должен быть уже заранее сопряжен с ком­
текста весьма полезно при вводе команд. пьютером. Если такое сопряжение еще не было вы­
полнено, сделайте это сейчас. Описание процедуры
Теперь, когда вам известна некоторая информация сопряжения подробно описано в предыдущем про­
о вашем модуле Bluetooth, можно дать ему инструк­ екте (см. разд. «Сопряжение компьютера с моду­
цию предоставить список всех других устройств лем Bluetooth»).
в пределах досягаемости. Чтобы послать этот за­
прос, выполните команду i. Спустя несколько се­ Затем нужно открыть последовательный порт на
кунд модуль возвратит список устройств, обнару­ компьютере, к которому подключен его приемопе­
женных в радиусе его покрытия, который выглядит редатчик Bluetooth.
примерно так:
Для Mac OS X

Inquiry, COD=0 На компьютерах под Mac OS X это будет порт


Found 9
Bluetooth PDA-Sync. Откройте другое окно в про­
0010C694AFBD,,1C010C
грамме терминала последовательной связи и под­
0023125C2DBE,tigoebook,3A010C
ключитесь к этому порту на скорости обмена в
0017F29F7A67,screenl,102104
115 200 битов в секунду.
002241CE2E79,residents,380104
002241D70127,admints Mac mini,380104
Для Windows 7
0014519266B8,ERMac,102104 Для машин под Windows 7 щелкните на значке
002241CE7839,VideoMac05, 380104 Отображать скры ты е значки в области уве­
E806889B12DD,,A041C домлений панели задач, в открывшемся окошке
00236CBAC2F0,Fred Mac mini,302104 (см. рис. 2.16) щелкните по значку Устройства
Inquiry Done Bluetooth и выберите в контекстном меню опцию
О ткры ть параметры. В открывшемся диалого­
Идентификатор устройства состоит из нескольких вом окне П араметры Bluetooth выберите вклад­
разделенных запятыми частей. Первая часть иден­ ку П арам етры и установите флажки Разрешить
тификатора устройства — это его однозначный устройствам Bluetooth обнаруживать этот ком­
адрес. За адресом следует имя устройства, если пьютер и Разреш ить устройствам Bluetooth под­
таковое имеется, и завершает строку класс устрой­ ключаться к этому ПК. Затем выберите вкладку
ства. Имена устройств не обязательно должны быть CO M -порты. Здесь вы увидите список двух пор­
однозначными, но адреса — должны, посколь­ тов СОМ для нашего модуля Bluetooth: исходящий
ку только они и используются для подключения и входящий. Но мы не станем задействовать эти
устройства. порты, поскольку при этом Windows будет пытаться
Простейшая сеть 107

установить подключение, тогда как нам нужно, что­ компьютера, но даже на одном компьютере он так­
бы это делал модем Bluetooth. Поэтому добавим же хорошо демонстрирует принципы управления
новый входящий порт, а затем откроем этот порт установкой связи в Bluetooth.
в программе терминала последовательной связи со
скоростью 115 200 битов в секунду. Модуль находится в режиме передачи данных, и
можно обмениваться сообщениями между окнами.
Для Ubuntu Linux Чтобы выйти из режима данных (например, чтобы
На машинах под Ubuntu Linux диспетчер Bluetooth проверить состояние модема), введите следующую
Manager не поддерживает привязку последова­ команду:
тельного порта к подключению Bluetooth, поэтому $$$\г
вам нужно будет сделать подключение исходящим
с компьютера, как это описывалось ранее в разд.
Встретили символ \ г — нажмите клавишу
«Сопряжение компьютера с модулем Bluetooth».
А когда сопряжение будет осуществлено, процеду­ <Enter>
ра отправления и получения данных и переключе­ Символы \г здесь обозначают нажатие клавиши
ние модуля Bluetooth Mate с командного режима <Enter>. Не вводите эти символы с клавиатуры!
в режим данных будет осуществляться так же, как
и для других платформ. Эта команда возвращает модем в командный режим,
в котором можно давать ему команды и получать от
Открыв последовательный порт на компьютере, него ответы. Чтобы возвратиться в режим данных,
переходим обратно к окну с последовательным под­ выполните команду:
ключением к модулю Bluetooth и отправляем сле­
--- \г
дующую команду:
С, адресЛг Чтобы разорвать соединение, переключитесь в ко­
мандный режим и выполните команду к\г.
где параметр адрес — это адрес Bluetooth компью­
тера, который мы узнали ранее. Когда установится А чтобы подключиться к другому устройству, опять
подключение, на модуле Bluetooth Mate загорится же переключитесь в командный режим и повторите
светодиод и можно будет обмениваться сообщения­ всю процедуру.
ми между окнами (рис. 2.22).
Поскольку эти команды представляют собой про­
Этот эксперимент можно сделать еще более по­ сто текстовые строки, их можно с легкостью ис­
казательным, соединив с помощью Bluetooth два пользовать для управления модулем Bluetooth из

Q Bluetooth Mate Q Com puter's Bluetooth

й
hi there
C, 002241CE3F79

у |

a t , , , __ ЧГ" * p $

Приемо­
Радиоканал передатчик
Bluetooth Bluetooth
компьютера Рис. 2.22. Блок-схема
взаимодействия модуля
Bluetooth Mate
с последовательным портом
Bluetooth компьютера
108 Глава 2

программ для микроконтроллера — устанавливать и обмен данными. Тогда строка данных, настроен­
и разрывать с их помощью подключения и вы­ ная ранее для передачи показаний датчиков проек­
полнять обмен данными. Кроме того, раз все эти та «Мартышкин пинг-понг» в режиме ASCII, будет
команды представляют собой наборы символов работать без проблем с модулем Bluetooth и в на­
АБСН, неплохо также в режиме А8СН выполнять стоящем проекте.

й й Заклю чен и е
Проекты, рассмотренные в этой главе, поясняют несколько понятий, являющихся центральны-
ми для всех типов сетевого обмена данными.

• Прежде всего, запомните, что обмен данными опишет всю передаваемую информацию. Это и
основан на последовательности уровней согла­ станет вашим пакетом данных. Полезно офор­
шений. Первым идет физический уровень, затем мить такой пакет дополнительной информацией:
электрический, логический, уровень данных и, заголовком, разделителями и «хвостом», чтобы
наконец, уровень приложений. Имейте эти уров­ облегчить чтение последовательности.
ни в виду при разработке и диагностировании
своих проектов, так как это облегчит вам задачу • Четвертое: рассмотрите поток данных и отыщи­
локализации проблем. те способы обеспечения плавности потока с наи­
меньшим возможным переполнением буферов
• Второе: помните, что последовательные дан­ или ожиданием данных. Простой подход типа
ные можно передавать как в формате А8СН, так «вызов-ответ» может сделать поток данных на­
и в формате неструктурированных («сырых») много более плавным.
двоичных данных. Который из этих двух ме­
тодов выбрать, зависит как от возможностей, • Наконец, изучите модемы и другие устройства,
так и от ограничений соединенных устройств. связывающие объекты на концевых узлах ваше­
Например, передавать неструктурированные го соединения. Вам нужно понимать их схемы
двоичные данные может быть нежелательно, адресации и все используемые ими командные
если, например, модемы или ваша среда про­ протоколы, чтобы учитывать их сильные и сла­
граммирования оптимизированы под передачу бые аспекты в планировании и избавиться от
данных в формате А8СН. тех составляющих, которые усложняют вашу
задачу. Независимо от количества соединяемых
• Третье: при подготовке проекта подумайте о со­ устройств — двух или двух сотен— применяют­
общениях, которые нужно передавать, и создай­ ся одни и те же принципы.
те протокол данных, который должным образом

► ► JitterBox. Автор Габриель Барсия-Коломбо (Gabriel Barda-Colombo)


JitterBox•9— это интерактивный автоматический проигрыватель видео, созданный на базе старинного радио
40-х годов прошлого столетия, реставрированного в первозданном виде. Его особенность — маленькая прое­
цируемая фигурка, которая танцует под музыку. Танцовщица подстраивает ритм своих движений под музыку,
которую выбирает пользователь, вращая ручку радио, соединенную с потенциометром, подключенным к ми­
кроконтроллеру Arduino, который в зависимости от положения потенциометра выбирает ту или иную песню
из репертуара 40-х годов прошлого столетия. Эти песни связаны с видеоклипами, которые воспроизводятся
с помощью цифрового проектора. В JitterBox заключена танцовщица Раян Маерс (Ryan Myers).

9 JitterBox (по аналогии с jukebox) — автоматический проигрыватель грампластинок.


Глава 3 <-

БОЛЕЕ СЛОЖНАЯ СЕТЬ

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


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

а Сетевые цветы Дории Фэн (Doria Fan), Маурисио Мело


(Mauricio Melo) и Джейсона Кауфмана (Jason Kaufman)
С помощью устройства личной связи «Сетевой цветок» можно послать кому-
либо светоцветовое анимированное сообщение. Устройство подключено
к сети и управляется с веб-сайта, через который пользователь и посылает ему
соответствующие команды.
112 Глава 3

4z Ком поненты для пр оекта этой главы


Код поставщ ика США и Европа
Россия • А — Arduino Store (http://store.arduino.cc/ww)
• AF — Adafruit (http://adafruit.com)
• АМР — «Амперка» (http://amperka.ru)
• D — Digi-Key (www.digikey.com)
• CHD — «Чип и Дип» (http://chipdip.ru)
• F — Famell (www.farnell.com)
• LC — «Линуксцентр» (www.linuxcenter.ru)
• J — Jameco (http://jameco.com)
• MS — Maker SHED (www.makershed.com)
• RS — RS (www.rs-online.com)
• RSH — RadioShack (www.radioshack.com)
• SF — SparkFun (www.sparkfun.com)
• SS — Seeed Studio (www.seeedstudio.com)

Проект 5. Сетевой кот


►Резистивные датчики давления серии 400 » Беспаечная макетная плата, 1 шт.
компании Interlink (vmw.interlinkelec.com), AMP: АМР-Х003, http://amperka.ru/product/
2-4 шт. В проекте использовались датчики мо­ breadboard-half
дели 402, но любой датчик серии 400 будет ра­
D: 438-1045-ND, J: 20723 или 20601, SF: PRT-
ботать должным образом.
00137, F: 4692810, AF: 64, SS: STR101C2M или
АМР: АМР-Х126, http://amperka.ru/product/ STR102C2M, MS: MKKN2
force-resistor-6mm

►Персональный компьютер, 1 шт.
D: 1027-1000-ND, J: 2128260, SF: SEN-09673

►Веб-камера, 1 шт.

►Сопротивление 1К, 1 шт. Любое. ►
►Кот, 1 шт. Если у вас нет кота, подойдет и пес.
АМР: AMP-R1K-10, http://amperka.ru/product/ ►
►Подстилка для кота, 1 шт.
resistor
» Кусок фанеры или толстого картона, 2 шт.
D: 1.0KQBK-ND, J: 29663, F: 1735061, RS: 707- размером приблизительно в размер подстилки
8669 для кота.

►Модуль Arduino, 1 шт. Желательно исполь­ ►
►Провод для монтажа накруткой.
зовать Arduino Uno или его разновидности, но
D: K445-ND, J: 22577, S: PRT-08031, F: 150080
проект должен работать и на других версиях
Arduino и совместимых платах. ►
►Инструмент для монтажа накруткой.
АМР: А000066, http://amperka.ru/product/ J: 242801, F: 441089, RSH: 276-1570, S: TOL-
arduino-uno 00068
LC: 1с8192, http://www.linuxcenter.ru/shop/ops_ ►
►Штыревые разъемы.
hard/arduino/arduinouno/ AMP: АМР-Х013, http://amperka.ru/product/
D: 1050-1019-ND, J: 2121105, SF: DEV-09950, pin-headers
А: А000046, AF: 50, F: 1848687, RS: 715-4081, D: A26509-20-ND, J: 103377, S: PRT-0011, F:
SS: ARD132D2P, MS: MKSP4 1593411
Более сложная сеть 113

Рис. 3.1. Новые компоненты для проекта этой главы: 4. Инструмент для монтажа накруткой (компонент
1. Резистивные датчики давления серии 402 компании для снятия изоляции провода, показанный на рисунке
Interlink. слева от инструмента, устанавливается в ручку).
2. Провод для монтажа накруткой диаметром 30 AWG. Понадобится также достаточное количество
3. Штырьковые (или длинные гнездовые) контакты для штырьковых контактов для интерфейсных модулей
монтажа накруткой.

йй Сетевы е то п о л о ги и и сетевы е адреса


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

Сетевые топологии: сообщениями между обычными узлами сети через


него. Такая сеть называется звездообразной (рис. 3.2,
как связываю тся объекты? посредине). Этот подход работает прекрасно, пока
Организация физических соединений сети зависит исправен центральный контроллер. Кроме того, чем
от способа маршрутизации этих сообщений. Проще больше рабочих узлов подсоединено к узлу контрол­
всего здесь — физически соединить все объекты лера, тем выше на него нагрузка, и тем быстрее он
сети напрямую друг с другом. Тогда сообщения должен обрабатывать сообщения. Третьей альтерна­
можно будет отправлять напрямую от одного узла тивой будет соединить узлы сети цепочкой в кольцо
сети другому. Проблема при таком подходе состоит (рис. 3.2, справа). Такая организация сети уменьшает
в том, что с возрастанием количества узлов стреми­ количество соединений, однако любое сообщение
тельно возрастает количество соединений и услож­ может идти только в двух направлениях. При этом
няется их топология (рис. 3.2, слева). Несколько бо­ сообщению может потребоваться много времени на
лее простой альтернативой будет использовать один прохождение большей части кольца, чтобы добрать­
центральный узел {контроллер) и выполнять обмен ся до наиболее удаленного узла.
114 Глава 3

44 Рис. 3.2. Три типа сетевой


топологии:
полносвязная (слева),
звездообразная (в центре)
и кольцевая (справа)

Прямое соединение
узлов Топология
"Кольцо"

На практике (включая Интернет) лучше всего рабо­


тают сети многоуровневой звездообразной тополо­
гии (рис. 3.3). С ^ Ц Э

К каждому центральному узлу нижнего уровня (по­ \ О


/ \ )
казаны в виде более светлого кружка) подсоедине­
но несколько обычных узлов (показаны в виде не­
закрашенных кружков). А каждый из центральных
о
С Г \ / \ /О
узлов нижнего уровня соединен с одним или более
центральным узлом высшего уровня (показаны в о
виде более темных кружков). Каждый из централь­
ных узлов высшего уровня может быть соединен
о ^ /Ч ^
с одним или более узлом этого же уровня, что по­
зволяет сообщениям проходить от одного конечно­
°? > СГ'1'О
го узла к другому несколькими разными путями.
Такая система основана на множественных связях
ж Рис. 3.3. Многоуровневая звездообразная сеть
между центральными узлами, но избегает запу­
танности, вызываемой соединением всех объектов
друг с другом.
подсоединить к сети снова при восстановлении ра­
В случае неработоспособности одного из централь­ ботоспособности их центрального узла.
ных узлов, сообщения направляются в обход его.
Самыми слабыми точками здесь являются цен­ Если для своего проекта вы используете Интернет,
тральные узлы нижнего уровня. Если какой-либо можно с уверенностью основывать свои расчеты
из них выйдет из строя, вся зависящие от него кон­ на этой топологии. Но если вы создаете свою соб­
цевые узлы потеряют доступ к сети. Но при неболь­ ственную сеть, то будет полезным сравнить все эти
шом количестве концевых узлов, подсоединенных модели, чтобы выбрать ту из них, которая лучше
к центральным узлам нижнего уровня, такая по­ всего удовлетворяет вашим требованиям. Для про­
теря работоспособности оказывает минимальное стых систем можно без проблем использовать одну
воздействие на всю сеть в целом. Конечно же, если из сетевых моделей, показанных на рис. 3.2, сэко­
из строя выходит центральный узел, от которого номив себе время и усилия. На подобных моделях
зависит ваше устройство, это воздействие будет базируются некоторые проекты книги, описанные
казаться вам совсем не минимальным, тем не ме­ далее, но для оставшейся части этой главы мы бу­
нее, остальная часть сети будет продолжать рабо­ дем работать с многоуровневой моделью, исполь­
тать, а потерявшие связь узлы можно с легкостью зующей Интернет.
Более сложная сеть 115

Н И Р Модемы, хабы , ком м утаторы и м арш рутизаторы


Для соединения узлов сети Интернет, показанных сообщения, — они просто передают их в обоих
на рис. 3.3, используются разные типы устройств. направлениях. Все подключенные к хабу устрой­
Наиболее распространенными устройствами ства получают все проходящие через него сообще­
связности Интернета являются модемы, хабы ния, и каждый отфильтровывает из этого общего
(концентраторы), коммутаторы и маршрутиза­ потока сообщений те, которые предназначены для
торы (роутеры). В зависимости от организации него. Хабы стоят недорого и удобны в использо­
вашей сети, вам может быть уже знакомо одно вании, но они не предоставляют никаких возмож­
или несколько из таких устройств. Рассматривать ностей управления трафиком данных.
подробно различия между этими устройствами
нет необходимости, но дать базовые определения Коммутатор имеет сходство с хабом, но предо­
следует. ставляет больше возможностей управления про­
ходящим через него потоком данных. В частно­
Модем — устройство, которое преобразовывает сти, коммутатор передает сообщения, поступаю­
сигнал из одного типа в другой и соединяет одно щие в него от подключенных к нему устройств,
устройство с другим. В качестве примера можно только тем устройствам, которым они адресова­
назвать кабельный или DSL-модем, поставляю­ ны. Подключенные к коммутатору устройства не
щий Интернет в вашу квартиру. Этот модем полу­ «видят» сообщения, которые им не адресованы.
чает на входе цифровые данные от вашего домаш­
него компьютера или сети, преобразовывает их Модемы, хабы и коммутаторы обычно не име­
в сигнал, который можно передавать по телефон­ ют своих сетевых адресов (но большинство ка­
ной линии или коаксиальному кабелю, и передает бельных и Б8Ь-модемов такие адреса имеют).
его модему на другом конце линии, подключен­ Маршрутизаторы же имеют свои сетевые адреса
ному к сети вашего поставщика услуг Интернета. и видимы другим устройствам сети. Они также
Под это определение также попадают устройства могут маскировать подсоединенные к ним устрой­
Bluetooth, с которыми мы познакомились в гла­ ства от всей остальной сети. Маршрутизатор при­
ве 2, так как они преобразовывают электрические сваивает своим устройствам частные сетевые
сигналы в радиосигналы и наоборот. адреса, имеющие значение только для других
подключенных к нему устройств, и передает дан­
Хабом называется устройство, которое объеди­ ные от своих устройств и к своим устройствам
няет (мультиплексирует) сигналы от несколь­ так, как будто бы это данные самого маршрути­
ких устройств и передает их в восходящем на­ затора. Маршрутизатор также может присваивать
правлении остальным устройствам сети. Для 1Р-адреса устройствам, не имеющих таковых при
хабов не имеет значения, кому предназначены первоначальном подключении к маршрутизатору.

А п п ар атн ы е и сетевы е адреса


Независимо от сетевой модели: простой, полносвязной, многоуровневой или любой проме­
жуточной — для доставки данных от одного узла сети к другому требуется какая-либо система
адресации устройств. При создании своей собственной модели сети с нуля нужно создавать
и необходимую для нее систему адресации. Но для проектов из этой книги мы будем полагать­
ся на существующие сетевые технологии и воспользуемся схемами адресации этих технологий.
Так, в проектах с Bluetooth в главе 2 в качестве схемы адресации мы использовали протокол
Bluetooth. Для подключения устройств Интернета служит протокол IP1. Поскольку большин­
ство подключенных к Интернету устройств полагаются также и на протокол Ethernet, мы тоже
будем использовать этот протокол.

IP, Internet Protocol — протокол Интернета.


116 Глава 3

D escription f i e r i e k R T L S W b fR T L 8 l0 3 E Fantik
P fcyacat A d d ress CS-0A-ASMJ2-1E-B6
DH CP E n a b le d Y es
IP v4 A ddress 128122151254

‘F'v4 S u b n e t M ask 2 5 5 2 5 5 .2 5 5 0
L e a s e O b ta in e d S a tu rd a y N o v e m b e r 20 - 2 0 1 0 4 4Q 4i
L e a s e Expires S a tu rd a y . N overjrber 2 0 2 0 1 0 7 4 0 4 '.
?Pv4 D efauS G a te w a y 1 2 3 .1 2 2 151 1
IP v4 D H C P -Server 1 2 S 122 253 5 2
IP v4 D N S S erv ers 1 2 3 1 2 2 2 5 3 .5 2
128 1 2 2 12 8 .2 4
IP v4 W IN S S e v e r
N etB IO S o v e r T cp tp c n Y es
bnfc-tocsS IP v £ A ddress feSO 6 d 3 a f e d B W 2 tiJ c 6 M l
iP vS D efault G a te w a y
IP v 6 D N S S a v e r

а б
Рис. 3.4. Диалоговые окна параметров сетевого подключения для машин под Мае ОБ X (а) и \М пс!о \л/5 (б)

IP-адрес устройства может меняться при переме­ адаптера имеют аппаратные адреса, и посмотреть
щении из одной сети в другую, но его аппаратный пример такого адреса можно на любом из них.
адрес, или МАС2-адрес, жестко запрограммирован Нажмите кнопку Advanced для любого адаптера,
в память устройства и никогда не меняется. МАС- чтобы открыть вкладку Ethernet — здесь мож­
адрес устройства представляет собой уникальный но посмотреть МАС-адрес адаптера, или вкладку
идентификационный код, который присваивает­ TCP/IP — здесь можно посмотреть IP-адрес адап­
ся устройству его изготовителем и отличает дан­ тера, если компьютер подключен к сети.
ное устройство от всех других устройств Ethernet
на планете. Адаптеры Wi-Fi являются разновид­
ностью Ethemet-адаптеров и также имеют аппарат­ Для W indows 7
ные адреса. На машинах под Windows 7 откройте панель управ­
ления (например, выполнив команду Пуск | Панель
Узнать IP-адрес и МАС-адрес своего компьютера управления), а в окне панели управления щелкните
можно следующим образом. по ссылке Сеть и Интернет. В открывшемся окне
щелкните по ссылке Центр управления сетями
и общим доступом, а в левой панели открывшегося
Для Mac OS X окна — по ссылке Изменить параметры адапте­
ра. Открывшееся окно Сетевые подключения со­
На машине под Mac OS X откройте панель управ­
держит значки всех сетевых подключений компью­
ления сетью, выполнив последовательность команд
тера. Щелкните правой кнопкой мыши по значку
меню Apple Location | Network Preferences. Эта
Локальное сетевое подключение (для встроен­
панель содержит список доступных сетевых интер­
ного адаптера Ethernet) или Беспроводное сете­
фейсов, посредством которых ваш компьютер мо­
вое подключение (для адаптера Wi-Fi) и выберите
жет подключаться к Интернету. Скорее всего, ваш в контекстном меню опцию Состояние. В открыв­
компьютер оснащен, как минимум, встроенным шемся окне состояния подключения нажмите кноп­
Ethemet-адаптером и интерфейсом AirPort. Оба эти ку Сведения, чтобы открыть окно, содержащее,
2 MAC, Media Access Control — управление доступом к среде среди прочих параметров, IP-адрес подключения
передачи. и МАС-адрес адаптера.
Более сложная сеть 117

Для иЬигии Ыпих Возьмем, например, компьютер с 1Р-адресом


217.123.152.20. Маршрутизатор, к которому под­
Для машин под ЦЬипШ Ыпих щелкните в меню ключен этот компьютер, будет, скорее всего, иметь
Система, затем последовательно выберите опции адрес 217.123.152.1. Значение каждого октета мо­
Настройки | Сетевые подключения. Откроется жет находиться в диапазоне 0—255, но некоторые
окно, содержащее список сетевых интерфейсов. адреса по соглашению резервируются для специ­
Выберите здесь вкладку требуемого типа сетево­ альных целей. Маршрутизатор обычно имеет адрес
го подключения (то есть проводное, беспроводное ххх.ххх.хххл . Подсеть этого маршрутизатора для
и т. п.), на ней требуемое подключение, а затем на­ нашего примера будет иметь диапазон адресов
жмите кнопку Изменить, чтобы просмотреть пара­ 217.123.152.ххх. Иногда маршрутизатор может
метры подключения. обслуживать подсеть большего размера или даже
группу подсетей, каждая из которых имеет свой
На рис. 3.4 показаны окна параметров сетевых
собственный маршрутизатор. Такой маршрутизатор
подключений для машин под Мае 0 8 X (а) и
подсети может иметь адрес 217.123.1 .1.
Windows (б).
Каждый из маршрутизаторов управляет доступом
Независимо от используемой операционной системы,
к сети определенного количества подключенных
МАС-адрес и 1Р-адрес имеют следующие форматы:
к нему компьютеров. Количество компьютеров, ко­
• аппаратный адрес состоит из шести групп торыми маршрутизатор может управлять, опреде­
шестнадцатеричных чисел — например: ляется его маской подсети. Типичная маска подсе­
00 : 1 1 : 2 4 : 9 Ь :Г З : 70; ти ВЫГЛЯДИТ так: 255.255.255.0.
• 1Р-адрес состоит из четырех групп десятичных
Максимальное количество узлов, которые может со­
чисел — например: 192.168.1 .20.
держать определенная подсеть, можно определить
Чтобы отправлять и получать данные, необходимо по значению последних октетов ее маски подсети.
знать 1Р-адрес, а чтобы получить 1Р-адрес в неко­ Этот вопрос легче рассматривать, представляя зна­
торых сетях, необходимо знать аппаратный адрес. чения октетов битами. Четыре байта (октета) содер­
Поэтому, начиная работать над новым проектом, жат 32 бита. Каждый бит, удаленный из маски под­
всегда узнайте оба адреса для всех устройств, кото­ сети, добавляет один узел к максимальному количе­
рые вы планируете использовать. ству узлов этой подсети. По сути, чтобы определить
максимальное количество узлов подсети, нам нуж­
Улица, город, область, страна: но отнять значение маски этой подсети от его мак­
симального значения 255.255.255.255. Например,
структура 1Р-адресов подсеть с маской подсети 255.255.255.255 может
Почтовые адреса можно разбить по уровням со содержать только один узел — сам маршрутизатор.
все возрастающей подробностью, начиная с наи­ Если последний октет маски подсети 0, эта под­
более подробного (номер дома и название улицы) сеть может содержать, кроме самого маршрутиза­
и кончая наиболее общим (страна). Подобно по­ тора, максимум 255 узлов. Подсеть с маской под­
чтовым адресам, 1Р-адреса также имеют несколько сети 255.255.255.192 может поддерживать 63 узла
уровней. Наиболее подробная часть 1Р-адреса — плюс маршрутизатор (255 - 192 = 63). Но так как
последняя, в ней указывается адрес данного ком­ определенное количество адресов подсети резер­
пьютера. Предшествующие части 1Р-адреса опре­ вируется для специальных целей, в действитель­
деляют подсеть, к которой подключен компьютер. ности количество поддерживаемых узлов подсети
Маршрутизатор находится в той же самой подсети, будет несколько меньшим. В табл. 3.1 приводятся
что и подключенный к нему компьютер, и его 1Р- еще несколько примеров значений маски подсети
адрес такой же, за исключением последней части. и соответствующего максимального количества
поддерживаемых узлов.
Группы 1Р-адреса называются октетами, каж­
дый из которых подобен части почтового адреса.
118 Глава 3

Таблица 3.7. Со от но ш ени е между значением предоставляет IP-адреса, так что вам об этом бес­
м аски подсет и и м аксим альны м количест вом покоиться не нужно.
поддерж иваемых узл о в эт о й подсет и
Однако в проекте, рассматриваемом в этой главе,
Маска подсети
нам не придется работать с большим количеством
Максимальное количество
узлов подсети, включая узлов Интернета, и наши устройства не будут иметь
маршрутизатор (учитывая имен, а только IP-адреса. Вот на такой случай нам
зарезервированные адреса) и нужно эти числовые IP-адреса знать.
255.255.255.255 1 (т о л ь ко са м м а р ш р у т и з а т о р )

255.255.255.192 62 Коммутация пакетов


255.255.255.0 254 для пересылки сообщ ений по сети
255.255.252.0 1022 Так каким же образом сообщение от одного устрой­
255.255.0.0 65 534 ства сети пересылается другому? Этот процесс
можно сравнить с пересылкой, скажем, велосипеда
Понимание особенностей организации IP-адресов по почте. Для целого велосипеда потребуется слиш­
облегчит вам управление потоком посылаемых и ком большой ящик, а в разобранном виде его можно
принимаемых сообщений. Обычно все это выпол­
отправить по частям в нескольких ящиках меньших
няется прозрачно для пользователя используемым
размеров. Что-то подобное происходит и при пере­
программным обеспечением: браузерами, клиен­
сылке сообщений по сети, где на уровне Ethernet (ко­
тами электронной почты и т. п. Но при разработке
своих сетевых объектов необходимо знать о схеме торый также называется канальным уровнем) сооб­
IP-адресации хотя бы то, что здесь поясняется, что­ щение разбивается на более или менее одинаковые
бы можно было определить маршрутизатор и узлы, части, называемые пакетами, и к каждому пакету
находящиеся за ним. прикрепляется заголовок, содержащий его номер.
При пересылке велосипеда по частям мы наносим
адрес получателя и отправителя на каждый из со­
Преобразование числовы х держащих его части ящиков. То же самое делается
адресов в имена и с пакетами, где на уровне IP к ним прикрепляется
еще один заголовок, содержащий адреса получаю­
Вы, наверное, думаете, что все эти адреса вам во­
щего и отправляющего узлов. Отправляя ящики с
все ни к чему, так как для Интернета мы использу­
частями велосипеда, перевозчик может поместить
ем имена веб-сайтов типа www.makezine.com или
www.archive.net. Это в действительности так, и их в разные грузовики, чтобы оптимально исполь­
обычному пользователю никогда не требуется рабо­ зовать емкость каждого грузовика. Подобное про­
тать с числовыми IP-адресами, чему он, несомнен­ исходит с пакетами сообщения на транспортном
но, бесконечно рад. За это ему нужно благодарить уровне. Этот сетевой уровень отвечает за обеспе­
специальный протокол DNS3, который сопоставля­ чение доставки пакетов к их точке назначения. Для
ет имена веб-сайтов их числовым IP-адресам. Этот транспортировки пакетов по сети Интернет приме­
протокол реализуется специальными компьюте­ няются два основных протокола: TCP6 и UDP7. Мы
рами, называющимися серверами DNS4, которые рассмотрим эти протоколы более подробно далее в
отслеживают, какие имена сопоставлены каким этой книге. Основная разница между ними состоит
числовым адресам. Окно настройки сетевого адап­ в том, что протокол TCP предоставляет средства,
тера содержит, среди прочих, поле для ввода адреса гарантирующие доставку пакетов, но, вследствие
сервера DNS. Но обычно компьютеры настроены этого, работает более медленно, чем протокол UDP.
для получения этого адреса от маршрутизатора Протокол UDP не гарантирует доставку пакетов, но
с помощью протокола DHCP5, который также зато доставляет их быстрее.
3 DNS, Domain Name System — доменная система именования. 6 TCP, Transmission Control Protocol — протокол управления
4 DNS, Domain Name Server — сервер доменных имен. передачей.
5 DHCP, Dynamic Host Control Protocol — протокол динамиче­ 7 UDP, User Datagram Protocol — протокол передачи дейта­
ского конфигурирования узлов. грамм пользователя.
Более сложная сеть 119

Ч астн ы е и о б щ ед о ступ н ы е IP-адреса


В Интернете не все объекты доступны всем дру­ Мой компьютер, адрес которого в домашней сети
гим объектам. Иногда для того, чтобы обеспечить 192.168.1.45, запрашивает веб-страницу на уда­
поддержку большего числа устройств, маршру­ ленном веб-сервере. Этот запрос сначала отправ­
тизатор скрывает адреса подключенных к нему ляется маршрутизатору моей домашней сети. Для
объектов, отправляя их исходящие сообщения в узлов домашней сети маршрутизатор имеет част­
сеть таким образом, как будто бы это сообщения ный адрес 192.168.1.1, но для узлов со стороны
самого маршрутизатора. В схеме 1Р-адресации Интернета он представляет общедоступный адрес
определенные диапазоны адресов зарезервирова­ 66.187.145.75. Маршрутизатор передает запрос
ны для использования в качестве частных — на­ конечному адресату со своего общедоступного
пример, все адреса в диапазонах 192.168.ххх.ххх, адреса, сопроводив его инструкцией, чтобы от­
10.ххх.ххх.ххх И 172.16.ххх.ххх — 172.31.ххх. вет посылался на этот же общедоступный адрес.
ххх.Первый из этих диапазонов адресов обычно Получив ответ от веб-сервера, маршрутизатор
задействован маршрутизаторами локальных до­ передает его на мой компьютер по его частному
машних сетей. Если вы пользуетесь маршрутиза­ адресу. Таким образом, благодаря частным сете­
тором, то все узлы (устройства) вашей домашней вым адресам и маскам подсети, множественные
сети будут иметь адреса в этом диапазоне. Но устройства могут сообща пользоваться одним
сообщения, посылаемые этими устройствами во общедоступным 1Р-адресом, что значительно
внешнюю сеть, будут выглядеть так, как будто увеличивает общее количество объектов, которые
бы они были отправлены с общедоступного 1Р- можно подключить к Интернету.
адреса маршрутизатора. Рассмотрим, как это ра­
ботает, на примере моей домашней сети.

Каждый маршрутизатор посылает исходящие паке­ но при этом пакеты иногда теряются. Впрочем,
ты другому подключенному к нему маршрутизато­ в целом этот механизм обеспечивает доставку сооб­
ру. Если маршрутизатор подключен к нескольким щений с достаточной надежностью, и пользователи
восходящим маршрутизаторам8, он отправляет па­ могут не беспокоиться о потерянных пакетах.
кеты тому из них, который наименее занят. Таким
образом, разные пакеты одного сообщения могут Проверить доступность узла назначения можно
отправляться на разные восходящие маршрутиза­ С П О М О Щ Ь Ю утилиты командной строки ping. Эта
торы, которые также могут отправлять эти пакеты утилита отправляет запросы указанному узлу сети
разным своим восходящим маршрутизаторам. В ре­ и фиксирует поступающие ответы.
зультате пакеты могут пересылаться к узлу назначе­
ния разными маршрутами, содержащими различное Для работы с утилитой откройте консоль командной
количество сегментов (маршрутизаторов) сети. По строки на машинах под Windows, а на машинах под
прибытию пакетов в узел назначения получающий Mac OS X и Linux/UNIX — программу терминала.
маршрутизатор удаляет их заголовки и собирает из
пакетов исходное сообщение. Описанный метод На машинах под Mac OS X и Linux выполните сле­
пересылки сообщений по частям (пакетам) по не­ дующую команду:
скольким разным маршрутам называется коммута­ ping -с 10 127.0.0.1
цией пакетов. Таким образом достигается наиболее
эффективное использование каждого сетевого пути, На машинах под Windows команда имеет такой
формат:
8 Восходящий маршрутизатор — маршрутизатор, которому наш
маршрутизатор отправляет исходящие сообщения. ping -п 10 127.0.0.1
120 Глава 3

Эта команда посылает несколько запросов (количе­ Таким образом мы получаем хорошее представле­
ство запросов определяется параметром -с в Мае ние о качестве маршрута к узлу назначения на осно­
OS X/Linux и -п в Windows) на адрес 127.0.0.1. ве количества достигнувших его пакетов и времени,
Каждый полученный ответ содержит информацию затраченного им для этого. Утилита ping предо­
о времени, затраченном на доставку запроса узлу ставляет удобный способ быстро узнать, доступен
назначения и получение соответствующего ответа: или нет определенный узел в Интернете, а также
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64
насколько качественным является маршрут к это­
time=0.166 ms му узлу. Далее мы будем использовать устройства,
64 bytes from 127.0.0.1: icmp_seq=l ttl=64 не имеющие физического интерфейса, на котором
time=0.157 ms можно было бы наблюдать за их деятельностью,
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 и утилита ping окажется весьма кстати для провер­
time=0.182 ки их работоспособности.
После отправки и получения всех 10 пакетов выво­
дится сводка для всех запросов наподобие следую­ Адрес локального узла
щей (для Windows 7): Адрес 127.0.0.1 — это специальный адрес, называю­
-- 127.0.0.1 ping statistics -- щийся кольцевым адресом (loopback address) или адре­
сом локального узла (localhost address). Сообщения, по­
10 packets transmitted, 10 packets received, 0%
сылаемые по этому адресу, отправляются компьютером
packet loss
самому себе. Вместо числовой формы адреса можно
round-trip min/avg/max/stddev = использовать слово localhost. С помощью этого адре­
0.143/0.164/0.206/0.015 ms са можно выполнять тестирование многих сетевых
приложений даже при отсутствии реального сетевого
i подключения.

I I Клиенты , сер вер ы и пр отоколы уп р авл е н и я связью


Теперь, когда у нас есть представление об организации Интернета, давайте разберемся, как
осуществляется деятельность в этой сети. Например, каким образом сообщение электрон­
ной почты доставляется своему адресату? Или как ввод адреса в строку адреса браузера или
щелчок по ссылке доставляет соответствующую веб-страницу на компьютер? Все это делается
посредством обмена сообщениями между сетевыми объектами, использующими только что
описанную систему их транспортировки. Разобравшись с основными принципами работы этой
схемы, в дальнейшем на этот аспект можно будет не обращать внимания, а концентрироваться
на сообщениях.

Принцип доставки веб-страниц


На рис. 3.5 показана блок-схема маршрута доставки где-то в Интернете. В данном случае сервер — это
веб-страниц на компьютер пользователя. программа, которая предоставляет сервисы дру­
гим программах в Сети. Компьютер, на котором
Браузер пользователя посылает запрос страницы исполняется серверная программа, также называ­
веб-серверу, а веб-сервер отправляет запрошенную ется сервером, и от него ожидается, что он будет
страницу браузеру. По какому маршруту из несколь­ находиться в Сети и будет доступным на посто­
ких возможных осуществляется передача запроса и янной основе, чтобы его сервисы не прерывались.
страницы не играет роли, при условии, что такой Веб-сервер предоставляет доступ к файлам HTML,
маршрут существует. Сам веб-сервер представляет изображениям, аудиофайлам и другим элементам
собой программу, исполняющуюся на компьютере веб-сайта для клиентов со всех уголков Интернета.
Более сложная сеть 121

Клиенты — это программы, которые пользуются Более подробно процедура запроса и предоставле­
услугами, предоставляемыми сервером. Например, ния веб-страницы выглядит таким образом:
клиент браузер устанавливаем подключение к сер­
1. Введите URL: http://www.makezine.com/index.
веру, чтобы запросить веб-страницу. Серверная
html в строку адреса своего браузера.
программа принимает подключение и доставляет
клиентской программе (то есть браузеру) файлы, 2. Программа браузера устанавливает контакт с этим
адресом на порту 80.
представляющие запрошенную веб-страницу, за­
вершая обмен. 3. Серверная программа принимает подключение.
4. Программа браузера запрашивает конкретный файл:
Серверный компьютер разделяет свой IP-адрес со index.html.
всеми исполняющимися на нем серверными про­ 5. Серверная программа находит запрошенный файл в
граммами, присваивая каждой такой программе но­ локальной файловой сие* ме и передает его по под­
мер порта. Например, программе веб-сервера при­ ключению браузеру. Серверная программа закрывает
подключение.
сваивается номер порта 80, и все запросы, посту­
пающие на этот порт, направляются веб-серверу. А 6. Браузер считывает полученный файл, исследует его
программе сервера электронной почты присваива­ на предмет других файлов, необходимых для отобра­
жения страницы (типа таблиц стилей, изображений,
ется номер порта 25, и все запросы на этот порт на­
мультимедиа и т. п.), и повторяет процесс запроса
правляются уже ему. Любая программа может взять для получения файлов этих ресурсов. Получив все
управление любым неиспользуемым портом, но необходимые файлы, браузер удаляет ненужную ин­
порт может управляться только одной программой. формацию заголовков и отображает страницу.
В этом отношении сетевые порты во многом по­
добны последовательным портам. Многие нижние Все запросы браузера к серверу, как и все ответы
номера портов присвоены распространенным про­ сервера браузеру (за исключением изображений,
граммам, таким как программы электронной почты, аудио- и видеофайлов), представляют собой про­
пересылки файлов (FTP), telnet и веб-браузерам. стые строки текста. Увидеть этот процесс в действии
Высокие номера портов или отключаются, или можно, выполнив его в окне терминала. Откройте
оставляются открытыми для специальных прило­ программу терминала, как мы делали для примера
жений (одно из которых мы скоро создадим сами). с утилитой ping, рассмотренного ранее. На маши­
нах под Windows 7 используйте программу PuTTY.
122 Глава 3

т Пишем код telnet www.google.com

Итак, откройте программу тер­ Г Т \


минала, введите в командную ш ж Версия telnet для Windows
строку следующий код и нажми­ Версия telnet, используемая в Windows, не очень удобна. Например,
те клавишу <Enter>: если не установлена опция locaiecho, вводимый текст не отобра­
Соответственно — на компью­ жается на экране, не отображаются и информационные сообще­
тере под Windows в програм­ ния сервера Trying. .. И Connected. Поэтому более удобно ПОЛЬ-
ме PuTTY откройте подключе­ зоваться программой PuTTY (http://www.chiark.greenend.org.
ние к www.google.com, port 80, uk/~sgtatham/putty).
Connection type: Raw.
Сервер должен ответить следую­
щим образом:
Trying 64.233.161.147...
Connected to www.1.google.com.
Escape character is 'A]*.

□ Выполнив подключение к сер­ GET /index.html НТТР/1.1


веру, введите следующий текст: Host: www.google.com
Connection: Close

После ввода последней строки нажмите клавишу


<Enter> дважды. На это сервер должен дать ответ
наподобие следующего:
НТТР/1.1 200 ОК
Date: Mon, 18 Jul 2011 00:04:06 GMT Выход из telnet
Cache-Control: private, max-age=0 Если программа telnet не закрывается самостоятельно,
Content-Type: text/html; charset=ISO-8859-l нажмите комбинацию клавиш <Ctrl>+<]>, чтобы воз­
Server: gws вратиться в режим приглашения telnet, и выполните
Connection: Close команду quit.

j# ,# После заголовка вы увидите целую кучу кода HTTP. Заголовок HTTP содержит информацию, со­
ш Ш HTML, содержимое которого даже близко не общающую браузерам, какие типы файлов будут
похоже на то, что выводится для страницы Google следовать, кодировку этих файлов и многое другое.
в окне обычного браузера. Это HTML-содержимое Конечному пользователю эта информация никогда
домашней страницы веб-сайта Google. Именно не требуется, но она очень полезна для управления
так браузеры и веб-сервер взаимодействуют друг потоком данных между клиентом и сервером.
с другом — с помощью текстового протокола HTTP9.
Префикс http:// в начале каждого веб-адреса предпи­ Для демонстрации ее применения возвратимся к на­
сывает браузеру использовать этот протокол при вза­ шему примеру РНР из главы 1. Он все еще должен
имодействии с удаленным сервером. Содержимое, находиться на вашем веб-сервере по адресу www.
предшествующее коду HTML, является заголовком example.com/time.php (где www.example.com —
9 HTTP, Hypertext Transfer Protocol — протокол передачи
адрес вашего веб-сервера). Давайте попробуем по­
гипертекста. лучить этот файл от сервера из командной строки.
Более сложная сеть 123

ЕЭ Пишем код _ __ __ | <?php


/* Date page
Слегка модифицируйте програм- |
Контекст: РНР
му РНР, удалив строки, которые I Выводит на экран дату */
выводят HTML-код: I
J
Теперь подключитесь к своему | // Получаем и форматируем дату:
$date = date("Y-m-d h:i:s\t");
веб-браузеру с помощью утили- ]
// Добавляем дату:
ты telnet на порт 80 и запросите |
echo "< $date >\n";
этот файл. Не забудьте указать I
Host в запросе, как показано pa- |
нее в примере запроса страницы j
Google. Полученный от сервера j
ответ должен быть намного ко- j
роче. !

# # Хотя веб-страница, полученная таким обра- В этом примере вместе с запросом посылаются два
ш Ш зом, не столь аккуратна, как открытая с по­ параметра: name и аде, значения которых tom и 14 со­
мощью браузера, запрошенную дату из полученных ответственно. К строке запроса можно добавлять
данных можно очень легко извлечь, воспользовав­ любое количество параметров, просто разделяя их
шись программой Processing или даже программой с помощью символа амперсанда (&).
микроконтроллера. Для этого нужно просто прочи­
тать все содержимое между символами < и >. Язык РНР имеет предопределенные переменные,
позволяющие получать доступ к этим параметрам
Кроме простого запроса файлов в запросы HTTP и другим аспектам взаимодействия между клиен­
можно вставлять параметры. Если по запрашивае­ том и сервером. Например, переменная $_r e q u e s t ,
мому адресу находится программа (например, файл, пример использования которой показан далее, воз­
содержащий сценарий РНР), она может исполь­ вращает параметры, содержащиеся в запросе после
зовать эти параметры. Чтобы вставить параметры знака вопроса. Другие предопределенные перемен­
в запрос, добавьте в конец запроса знак вопроса, ные содержат информацию о браузере и операцион­
а после него — требуемые параметры. Пример до­ ной системе клиента, операционной системе серве­
бавления параметров показан в следующей строке ра, файлах, которые клиент пытается загрузить на
кода: сервер, и о многом другом.
http ://www.example.сот/get-parameters.
php?name=tom&age=14

□ Пишем код <?php


/*
Следующий сценарий РНР счи­ Считыватель параметров
тывает все посланные ему в за­ Контекст: РНР
просе переменные и выводит их
на экран. Считывает и выводит на экран параметры,
отправленные командой HTTP GET.
Сохраните файл этого сцена­
*/
рия на своем веб-сервере под
названием get-parameters.php, // выводим на экран все переменные
а затем просмотрите этот файл foreach ($_REQUEST as $key => $value)
в браузере по адресу (URL), фор­ {
мат которого был показан ранее echo <<$key: $value<br>\n»;
(при необходимости изменив путь }
к файлу к требуемой папке): ?> »
124 Глава 3

SU Этот запрос должен возвра­


тить страницу со следующим со­
держимым:
name : tom
age: 14

И т а к о й запрос также можно от­ НТТР/1.1 200 ОК


править на веб-сервер с помощью Date: Thu, 15 Mar 2007 15:10:51 GMT
утилиты telnet или программы Server: Apache
PuTTY, как мы это делали ра­ X-Powered-By: PHP/5.1.2
нее, не забудьте добавить стро­ Vary: Accept-Encoding
ку параметров ?name=tom&age=14 | Connection: close
в конце аргумента для g e t , то
Content-Type: text/html; charset=UTF-8
есть строка запроса должна вы-
глядеть так:
name: tom<br>
GET /get-parameters. age: 14<br>
php?name=tom&age=14)

В ответ на этот запрос веб-сервер


должен возвратить содержимое ,
(включая заголовок HTTP), по­
добное следующему:

Ш Поскольку РНР является язы­ <?php


ком программирования, с его по­ /*
мощью можно выполнять более Проверщик возраста
сложные задачи, чем простой вы­ Контекст: РНР
вод на экран значений перемен­
ных. Загрузите на свой веб-сервер Сценарий ожидает от запроса HTTP два параметра:
файл со следующим сценарием, name (текстовая строка)
а затем выполните запрос этого аде (целое число)
файла с такой же строкой пара­ Возвращает персонализированное сообщение, содержимое

метров, как и для предыдущего которого зависит от возраста (значение параметра аде).

сценария, то есть: */

?name=tom&age=l4 // считываем все параметры и присваиваем их значения


Теперь измените значение па­ // локальным переменным:
раметра аде на число большее, foreach ($_REQUEST as $key => $value)
чем 21. {
if ($key == "name") {
$name = $value;
}
if ($key == "age") {
$age = $value;
}
}



Более сложная сеть 125

DT if ($age < 21) {


echo "<р> $name, Вы еще слишком молоды, чтобы
употреблять спиртное.</р>\п";
} else {
echo "<р> Привет, $name. Вы достаточно взрослый,
чтобы опрокинуть рюмочку,
echo "но проявляйте при этом благоразумие.</р>\п";
}
?>

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

Операторы H TTP GET и PO ST


Способность сервера отвечать на параметры, по­ Команда p o s t обычно служит для получения дан­
сылаемые в запросе HTTP, открывает перед нами ных из веб-форм. Параметры для команды p o s t до­
разнообразные возможности. Например, можно бавляются не в конце адреса, как для команды g e t ,
создать сценарий, который, в зависимости от тех а в конце всего запроса HTTP. Кроме параметров
или иных условий, позволяет выбрать адрес, по ко­ полезной нагрузки, для запроса p o s t необходимо
торому отправить сообщение электронной почты, добавить пару служебных параметров — таких как
или выбрать вариант такого сообщения. Для этого тип и размер содержимого. Для подготовки запроса
просто нужно добавить параметры в конце адреса p o s t требуется выполнить несколько больший объ­
(URL) запроса, прочитать их значения как сценарий ем работы, но этот метод очень полезен для скры­
РНР, а затем использовать эти значения для уста­ тия передаваемых параметров. Кроме того, убирая
новки соответствующих переменных программы их из адреса, мы также делаем адрес более акку­
отправки сообщений электронной почты. ратным и легким для запоминания. В отличие от
адреса запроса g e t с его хвостом параметров, адрес
Метод отправки переменных в адресе запроса по­ запроса p o s t в ы г л я д и т следующим образом:
сле знака вопроса называется g e t , и является одной
из четырех команд HTTP. Остальные три команды: http://www.example.c/get-parameters.php
post, put и d e l e t e . Но так как многие браузеры не

поддерживают команды p u t и d e l e t e , т о на данном А параметры для запроса доставляются методом


этапе мы будем применять только команды g e t и POST.
POST.
126 Глава 3

| POST /age checker.php HTTP/1.0


Ш Пишем код !
j Host: example.com
Подключитесь к своему веб-сер­ Connection: Close
веру с помощью утилиты telnet на
Content-Type : application/x-www-form-urlencoded
порт 80 и запросите файл сцена­
Content-length: 16
рия проверщика возраста. Но на ►► Размер содержимого определяется длиной^
этот раз сделайте это с помощью строки пате=^от&аде=14 плюс символ перевода
name=tom&age=14 строки. Если имя длиннее или короче, чем три
метода p o s t :
буквы, или возраст больше или меньше, чем две
Вы получите такой же самый цифры, измените значение длины содержимого
(^соответствующим образом.
ответ, как и при использовании
метода g e t , но теперь все пара­
метры можно поместить в одном
месте — в конце запроса.

ш Теперь внесите в сценарий if (±sset($name) && isset($age) ) {


пару изменений. Сначала поме­ if ($age < 21) {
стите блок кода, который узнает echo "<p> $name, Вы еще слишком молоды,
имя и проверяет возраст и в дру­ чтобы употреблять спиртное.</р>\п";
гой оператор а , как показано да­ } else {
лее (новый код выделен жирным echo «<р> Привет, $name. Вы достаточно взрослый,
шрифтом): чтобы опрокинуть рюмочку,
echo "но проявляйте при этом благоразумие.</р>\п";

}
?>
А после закрывающего тега РНР <html>
добавьте следующий HTML-код <body>
в файл age_checker.php: <form action=»age_checker.php» method=»post»
enctYpe=»application/x-www-form-urlencoded»>
Загрузив модифицированный та­ Name: Cinput type=»text» name=»name» / X b r >
ким образом файл в браузер, мы Age: Cinput type=»age» name=»age» />
увидим форму, показанную на Cinput type=»submit» value=»Submit» />
рис. 3.6. c/form >
c/b o d y >
Добавленный оператор if обеспе­ C/html>
чивает отображение сообщения
о возрасте только при условии,
что были введены значения для
параметров имени и возраста.
А форма HTML снова вызывает
этот сценарий, когда введены
значения параметров, применяя Tom, You're not old enough to drink.
запрос HTTP p o s t . Name:
Age: ( Swfemrt)

Р и с З.б. Форма сценария РНР для проверки возраста (по понятным


причинам текст в окне браузера выведен на языке оригинала)
Более сложная сеть 127

С1 Принцип работы электронной ПОЧТЫ


Обмен сообщениями электронной почты также Для отправки сообщений электронной почты при­
осуществляется с помощью модели клиент-сервер. меняется протокол SMTP101. Одновременно с ним
В этом процессе принимают участие четыре прило­ используются два протокола для получения сооб­
жения: программы электронной почты отправителя щений: протокол POP11и протокол IMAP12. Подобно
и получателя, а также серверы электронной почты протоколу HTTP, это текстовые протоколы. Язык
отправителя и получателя. Программа почты отпра­ РНР обладает замечательной функциональностью
вителя добавляет к отправляемому сообщению за­ для отправки и получения сообщений электронной
головок, содержащий информацию, указывающую, почты, позволяющей применять его в качестве по­
что это сообщение электронной почты, отправите­ средника между любыми локальными приложения­
ля и получателя сообщения и его тему. Затем про­ ми — такими, как приводимый далее в этой главе
грамма почты связывается с сервером почты от­ скетч Processing или некоторые микроконтроллер-
правителя, который пересылает сообщение серверу ные приложения, которые рассматриваются в книге
электронной почты получателя. Когда получатель далее.
проверяет свою почту, его программа почты связы­
вается с его сервером почты и загружает все новые 10 SMTP, Simple Mail Transport Protocol — простой протокол
пересылки (электронной) почты.
сообщения. Оба сервера электронной почты посто­
11 POP, Post Office Protocol — протокол почтового офиса.
янно находятся в онлайновом режиме, ожидая но­ 12 IMAP, Internet Message Access Protocol — протокол доступа
вых сообщений для всех своих пользователей. к (электронной) почте в Интернете.

Д П иш ем код <?php
/*
Далее приводится сценарий РНР Отправитель почты
для отправки сообщений элек­ Контекст: РНР
тронной почты. Сохраните этот
сценарий на своем веб-сервере Отправляет сообщение эл. почты.
в файле mailer.php и просмотрите */
его в браузере, как и предыдущий
сценарий. // Устанавливаем значения переменных для отправки
Просмотр этого файла в браузере // сообщения. Измените значения параметров "to" и "from"
должен дать два результата: / / н а действительные адреса эл. почты.
$to = "you@example.com"; // измените на
• первый — в окне браузера
// действительный
выводится следующее сооб­
// адрес эл. почты
щение:
$subject = "Здравствуй, мир!";
Я отправил на: you@exaiiple.com
От : you@example.com $from = "От: you@example.com"; // измените на
Здравствуй, мир ! // действительный
// адрес эл. почты
Привет, как дела? $message = "Привет, как дела?";
• второй — на почтовый ящик,
указанный в сценарии, при­ // Отправляем сообщение
ходит следующее сообщение mail($to, $subject, $message, $from);
эл. почты:
От : <you@example.com> // Выводим извещение в браузере:
Тема: Здравствуй, мир! echo "Я отправил на: ". $to . «<Ьг>»;
Дата: May 8, 2013 2:57:42 РМ echo $from . «<Ьг>»;
EDT
echo $subject. «<br><br>»;
Кому: <you@example.com>
echo $message;
Привет, как дела? ?>
128 Глава 3

Проверьте, что ваш веб-сервер настроен должным ляет собой ничего сложного. Поэтому, кроме при­
образом для отправки сообщений электронной по­ менения таких сценариев для предоставления веб­
чты. Если вы пользуетесь услугами веб-хостинга, страниц, отправлять сообщения по электронной
настройки для электронной почты входят в настрой­ почте можно и с их помощью. При условии, что
ки вашей учетной записи. Кроме того, также убеди­ в вашем распоряжении есть программа, поддержи­
тесь, что адрес from: такой же, что и тот, с которого вающая команды g e t или p o s t , вы можете приме­
почтовый сервер будет отправлять сообщение. Это нять РНР или другие серверные языки программи­
обычно означает, что сообщения можно отправлять рования для отправки сообщений во многих разных
только со своего домена. Например, если ваше до­ приложениях в Интернете.
менное имя example.com, вы не сможете отправ­
лять сообщения с адреса cat@ohaikitteh.com. Теперь, когда мы знакомы с основными понятиями
запросов HTTP и отправки электронных сообщений,
Как можно видеть, отправка сообщений электрон­ мы можем применить их на практике в проекте.
ной почты с помощью сценариев РНР не представ­

~ П роект 5

Сетевой кот (Cat Cam)


Людям весьма просто просматривать веб-страницы или работать с электронной почтой, по­
тому что для нас сущ ествуют физические компьютерные интерфейсы, очень хорошо взаимо­
действующие с нашими руками: клавиатура отлично подходит для работы с ней пальцами,
а мышь удобно помещается в ладонь. Но, например, для кота отправить сообщение электрон­
ной почты — задача не из легких. В этом проекте мы попытаемся исправить такую дискрими­
нацию котов, одновременно демонстрируя создание нашего первого физического интерфейса
для Интернета.
Если у вас есть кот, вы знаете, какими коты мо­
Требуемые компоненты гут быть симпатичными, когда, свернувшись клу­

►Резистивные датчики давления серии 400 бочком. они дремлют в уютном для них месте.
компании Interlink, 2-А шт. Представив своего любимца, беззаботно мурлыка­
ющего во сне, мы можем снять неприятный осадок,

►Сопротивление 1 К, 1 шт. оставленный последним разговором с начальни­

►Модуль Arduino, 1 шт. ком. А увидеть его не просто в своем воображении,

►Беспаечная макетная плата, 1 шт. а хотя бы на экране монитора (не забывайте при
этом о начальнике), — это принесло бы еще боль­

►Персональный компьютер, 1 шт. шее облегчение. И как было бы приятно, если бы

►Веб-камера, 1 шт. ваш кот мог бы сообщить вам по электронной по­

►Кот, 1 шт. чте, что он ложится вздремнуть! Наш пятый проект
сделает это возможным.

►Подстилка для кота, 1 шт.

►Кусок фанеры или толстого картона, 2 шт.,
размером приблизительно в размер
подстилки для кота.

►Провод для монтажа накруткой.

►Штыревые разъемы.
Более сложная сеть 129

t*—4 J )

Рис. 3.7. Схема подключения


кота к сети

Система работает следующим образом: под подстил­ Этот проект реализуется несколькими блоками:
кой для кота вмонтированы играющие роль датчи­
ков давления измерительные сопротивления, подсо­ 1. Создаем скетч Arduino для чтения показаний датчи­
единенные к микроконтроллеру. Микроконтроллер ков под подстилкой для кота и отправки полученных
подключен к персональному компьютеру, к компью­ показаний по последовательному каналу связи в про­
грамму Processing.
теру подключена и веб-камера. Когда кот ложится
на подстилку, его вес изменяет показания датчиков. 2. Создаем скетч Processing для чтения данных последо­
Это активирует микроконтроллер, который посы­ вательного канала связи и вызова сценария РНР для
лает сигнал персональному компьютеру, который отправки сообщения электронной почты, когда возни­
кает такая необходимость.
в свою очередь делает снимок подстилки с котом
на веб-камеру и отправляет его на веб-сервер с по­ 3. Создаем сценарий РНР для отправки сообщений элек­
мощью сценария РНР. Затем программа вызывает тронной почты.
другой сценарий РНР, который отправляет вам со­ 4. Создаем веб-страницу для размещения снимков с веб­
общение электронной почты, информируя вас о том, камеры.
что ваш кот находится в особенно располагающем
5. Создаем другой сценарий РНР для получения загру­
для снятия напряжения положении. Графическая
зок изображения для веб-страницы.
блок-схема системы показана на рис. 3.7.
6. Модифицируем скетч Processing для снятия новых
снимков и загрузки их с помощью второго сценария
РНР.
130 Глава 3

6 6 Установка датчиков
в подстилку для кота
Прежде всего, нам нужно изыскать способ опреде­ Не стоит использовать для этого очень толстую
ления того момента, когда кот находится на своей или твердую деревянную доску. Нам нужно толь­
подстилке. Для этого проще всего разместить под ко что-то достаточно твердое, чтобы обеспечить
подстилкой датчики давления, чтобы они обна­ сравнительно жесткую поверхность для монтажа
руживали вес ложащегося на подстилку кота. Как датчиков давления. Прикрепите датчики давления
это конкретно сделать, зависит от имеющихся у вас по углам одной из пластин основания, а затем нало­
в наличии датчиков давления. Для этой цели хоро­ жите сверху другую пластину. Скрепите обе пла­
шо подойдут резистивные датчики давления ком­ стины по краям с помощью клейкой ленты таким
пании Interlink серии 400. Закрепите датчики на образом, чтобы верхняя пластина могла смещаться
какой-либо твердой основе — например, пластине вниз, когда на нее ступает кот, и нажимать на дат­
из мазонита, фанеры или жесткого картона. чики давления на нижней пластине. Если скрепить
обе пластины слишком плотно, верхняя будет всег­
Некоторые датчики давления имеют длинную и тон­ да нажимать на датчики давления, а если слишком
кую форму — например, датчики компании Interlink свободно, то пластины станут ездить одна по дру­
серии 408. Но такие датчики не очень распростра­ гой, что может не понравиться коту. Если чувстви­
нены, поэтому легче будет приобрести небольшие тельность датчиков слишком низкая, прикрепите на
круглые датчики — например, компании Interlink нижней стороне верхней пластины напротив датчи­
серии 400 или 402 (рис. 3.8). Чтобы использовать ков резиновые подкладки, чтобы они надавливали
эти датчики или подобные им датчики давления не­ на датчики. Если пластины для монтажа датчиков
большого размера других компаний, нужно создать окажутся слишком гибкими, прикрепите одну или
из них панель большей площади. Для этого вы­ две резиновые прокладки в центре панели, чтобы
режьте две пластины фанеры или жесткого карто­ уменьшить прогиб. На рис. 3.9 показаны этапы соз­
на чуть меньшего размера, чем подстилка для кота. дания такой панели.

Рис. 3.8. Поскольку резистивные датчики давления при пайке легко пережечь, вместо пайки я применил монтаж
накруткой проводом диаметром 30 A\NG. Инструменты для монтажа накруткой стоят недорого и не требуют
особого умения для пользования ими, но создают надежное соединение. Подсоединив провода к датчикам
давления, я изолировал соединения с помощью термоусадочного кембрика (кембриковая изоляция на рисунках
не показана)
Более сложная сеть 131

Рис. 3.9. Этапы создания панели датчиков:


а — резиновая подкладка на нижней стороне верхней пластины, концентрирующая давление на датчике;
б — крепление датчика на нижней пластине;
в — все четыре датчика подключены параллельно.
Обязательно изолируйте соединения перед тем, как скреплять панели. Соединитель проводов
отдатчиков — просто пара штырьковых разъемов.
132 Глава 3

A R EF
Reset GND
K13V D13
»5V D12
Gnd D ll/PW M
Gnd D10/PWM
Vin D9/PWM
DB
Arduino
Modute
Лtorce-sensing D7
resistors
D6/PWM
Analogo D5/PWM
Al D4
A2 D3/PWM
A3 D2
A4 Digit a ll/T X
A5 DigilaiO /RX

Рис. 3.10. Схема подключения датчиков давления к микроконтроллеру:


а — макетная; б — электрическая.
Поскольку все датчики давления соединены параллельно, у них всех только два соединения.
Эта схема достаточно простая, и их общий провод можно просто припаять через сопротивление
к штырьковому разъему для соединения на «землю»
Более сложная сеть 133

Теперь присоедините к датчикам давления длинные


провода, чтобы они доставали до ближайшего места, Г~А
J lm Номинал сопротивления
^
где можно разместить модуль микроконтроллера. В зависимости от диапазона номиналов дат­
чиков давления и веса кота, для делителя на­
Мы используем несколько датчиков, чтобы опреде­
пряжения может потребоваться сопротивление
лять давление под подстилкой на большой площа­
более высокого номинала. Если сопротивление
ди, но достаточно, чтобы только один из них срабо­
номиналом 1 К не дает хороших показаний, по­
тал, при этом — безразлично какой. Подсоедините
пробуйте сопротивление номиналом 4,7 К или
провода от датчиков к аналоговому вводу микро­
10 К. На рисунке показано сопротивление номи­
контроллера параллельно, используя схему делите­
налом 1 К.
ля напряжения, как показано на рис. 3.10. Эта схема
сводит все четыре ввода от датчиков в один.
v_____________________J

Ш Тестирование
Собрав панель датчиков кота Считыватель показаний аналоговых датчиков

и подсоединив ее к микроконт­ Контекст : Arduino


роллеру, выполните следующий
код на модуле Arduino, чтобы Считывает аналоговые показания датчиков на ввод
проверить работу датчиков: Analog 0 и выводит на экран результат в виде
десятичного значения в формате ASCII.
Чтобы просмотреть результаты,
откройте монитор порта на ско­
Подключения:
рости 9600 битов в секунду. Затем
поставьте кота на панель датчи­ Датчика давления на ввод Analog 0

ков и наблюдайте за изменением */


выводимого на экран значения
показаний от панели. Удерживать void setup()
кота на панели может оказаться {
нелегкой задачей, так как коты // открываем последовательный порт на скорости 9600
обычно себе на уме. Попробуйте
// битов в сек.
положить на панель датчиков
Serial.begin(9600);
какое-нибудь кошачье лакомство
или кошачью мяту, чтобы убе­
дить кота оставаться на ней хоть
какое-то время. Убедившись, что void loop ()
система работает должным обра­ {
зом, то есть показания от панели // считываем аналоговый ввод:
значительно меняются, когда кот int sensorValue = analogRead(АО);
находится на ней, можно перехо­
дить к реализации следующего
// выводим аналоговое значение на экран как десятичное
этапа проекта.
// число в формате ASCII:
Serial.println(sensorValue, DEC);

}
134 Глава 3

т Подключение /*
Последовательный считыватель строк
Теперь нам нужно передать по Контекст: Processing
последовательному каналу свя­
зи показания панели датчиков Считывает строку символов до тех пор, пока не получает
давления программе Processing, символ перевода строки (ASCII 10), после чего
преобразовывает полученную строку в число.
чтобы затем отправить сообще­
ние электронной почты и акти­ */
вировать веб-камеру для фото­
import processing.serial.*;
графирования кота на подстилке.
Этот скетч должен выглядеть для Serial myPort; // Переменная последовательного порта
вас знакомо, так как он похож на float sensorValue = 0 ; // Значение показания датчика давления
тот, с помощью которого мы счи­ float xPos = 0 ; // Горизонтальная позиция на графике
тывали значения датчиков изгиба
в проекте «Мартышкин пинг- void setup() {
понг» в главе 2. size (400,300);
// Выводим на экран все доступные последовательные
Мы не хотим, чтобы Processing
// порты
отправляла сообщения постоян­
println(Serial.list());
но, так как в этом случае мы бу­
дем получать по несколько тысяч / / Я знаю, что на моем компьютере Мае первым портом
сообщений — все время, пока // в списке последовательных портов всегда идет порт
кот сидит на подстилке. Что нам // для Arduino, поэтому я открываю Serial.list()[0].
нужно, так это определить, что / / Н а своем компьютере откройте соответствующий порт,
кот находится на подстилке, от­ // используя вывод метода Serial.list() для его
править одно сообщение и не де­ // определения. Порты в этом списке перечислены,
лать более ничего до следующего // начиная с порта, соответствующего параметру [0].
возвращения кота на подстилку. myPort = new Serial(this, Serial.list () [0], 9600);
Но при этом, если кот сойдет с
подстилки и сразу же на нее вер­ // Считываем байты в буфер, пока не дойдем до символа
нется, мы тоже не хотим пред­ // перевода строки (ASCII 10):
принимать никаких действий. myPort.bufferUntil('\n');

Нам также нужно определить, // Задаем начальный фон и плавную прорисовку:


как датчики реагируют на на­ background(#543174);
хождение кота на подстилке. Это smooth();
можно сделать двумя способами.
Первый — заставить кота захо­
дить и сходить с подстилки по void draw () {
команде, но это будет трудно без // Здесь ничего не происходит
значительной взятки в виде ко­
шачьих лакомств или любимой
игрушки. Второй — взвесить void serialEvent (Serial myPort) {
кота и заменить его грузом такого // Получаем строку ASCII:
String inString = myPort.readStringUntil('\n');
же веса. Использование живого
кота имеет то преимущество, что
if (inString != null) {
можно видеть, что происходит,
// Удаляем непечатаемые символы:
когда он переминается с лапы inString = trim(inString);
на лапу, подготавливает под­ // Преобразовываем в int и сопоставляем высоте экрана:
стилку, расцарапывая ее когтями, sensorValue = float (inString) ;
и т. п. А преимущество замени­ sensorValue = map(sensorValue, 0, 1023, 0, height);
теля кота состоит в том, что не println(sensorValue);
нужно никого уговаривать, что­
бы завершить проект.
Более сложная сеть 135

Ш У совер шенствование I float prevSensorValue = 0; // Предыдущее значение


// показания датчика давления
Если система считывания датчи- ! float lastXPos = 0; // Предыдущая горизонтальная
ков давления работает должным 3 // позиция
образом, при нахождении кота на I
подстилке значения показаний |
панели датчиков не должны ме- ]
няться более, чем на несколько
единиц. Весьма полезно предста- }
вить показания панели датчиков ]
графически, чтобы четко было
видно разницу. Для этого нужно
добавить несколько дополни­
тельных переменных в список
в начале программы Ргосезп^:

Ш Затем добавим новый метод, void drawGraph (float prevValue, float currentValue) {
называющийся drawGraph () : // Отнимаем значения от высоты окна, чтобы большие
// значения отображались выше на экране:
float yPos = height - currentValue;
float lastYPos = height - prevValue;

// Рисуем цветную линию:


stroke(#C7AFDE);
line(lastXPos, lastYPos, xPos, yPos);

/ / В конце экрана возвращаемся в начало:


if (xPos >= width) {
xPos = 0 ;
lastXPos = 0;
Установите связь
background(#543174) ;
no Bluetooth
}
Настроив последовательное со­ else {
единение между компьютером и // Увеличиваем горизонтальную позицию:
микроконтроллером, весьма по­
xPos++;
лезно установить между ними
связь по Bluetooth — как в про­ // Сохраняем текущую позицию графика для следующего
екте «Мартышкин пинг-понг» из // прохода:
главы 2. Работать над проектом lastXPos = xPos;
будет легче, когда компьютер не
привязан проводами к подстилке
для кота.

ш Наконец, добавьте следую­ println(sensorValue);


щий КОД В метод serialEvent о sensorValue = map(sensorValue, 0, 1023, 0, height);
сразу после кода для вывода на drawGraph(prevSensorValue, sensorValue);

экран значения панели датчиков // Сохраняем текущее значение для следующего раза:

(добавляемый код выделен жир­ prevSensorValue = sensorValue;

ным шрифтом):
136 Глава 3

Ф 0 Запустив программу на исполнение, вы панели датчиков относительно изменений между


В В должны увидеть на экране график значений двумя требуемыми нам состояниями небольшие, их
показаний панели датчиков давления, пример кото­ можно игнорировать. Значения показаний панели
рого показан на рис. 3.11. датчиков давления предоставляют нам достаточно
информации, чтобы начать определять их, как со­
Когда кот укладывается на свою подстилку, линия бытие нахождения кота. Требуемое нам событие —
графика должна резко идти вверх, а когда слезает когда кот садится на подстилку, и значение показа­
с нее — возвращаться к исходному положению. ний датчиков давления значительно возрастает. Для
Между этими двумя крайними положениями также этого нужно выбрать пороговое значение между
будет много небольших колебаний, которые следует двумя крайними состояниями датчиков. Когда зна­
отфильтровать. Однако если изменения показаний чение показаний датчиков поднимается до уровня
порогового значения или превышает его, мы име­
ем в наличии наше первое событие. Когда значе­
ние показаний панели датчиков падает ниже уров­
ня порогового значения, это означает, что кот слез
с подстилки, — вот мы получили и второе наше со­
бытие.

Но не следует реагировать на все события, гак как


наш кот может оказаться непоседливым и посто­
янно то ложиться на подстилку, то слезать с нее.
Поэтому, отправив первое сообщение, не следу­
ет сразу отправлять второе, даже если кот слез с
подстилки и снова на нее улегся. Нужно выбрать
разумный интервал, который должен истечь после
Рис. 3.11. Вывод программы графического первого срабатывания системы, прежде чем снова
отображения значений панели датчиков давления реагировать на присутствие кота на подстилке.

Ш Для хранения порогового зна­ int threshold = 250 // Если показания датчика выше
чения показаний панели датчи­ // этого числа, кот находится на
ков добавьте следующую новую // подстилке.
переменную в список перемен­
ных в начале программы. А само
пороговое значение установите
выше значения, показываемого
панелью датчиков, когда кота на
подстилке нет:
ш Затем вставьте следующий drawGraph(prevSensorValue, sensorValue);
КОД В метод serialEvent () Сразу
после метода агаъ^гарМ) (до­ if (sensorValue > threshold ) {
бавляемый код выделен жир­ // Если значение последнего показания было шоке
ным шрифтом). А также удалите // порогового, значится кот только что зашел на
или закомментируйте в методе // подстилку.
эег1а^ещ :() линию кода, кото­ if (prevSensorValue <= threshold) {
рая выводит на экран значение println(«Кот на подстилке»);
показаний датчиков: sendMail() ;
}
} ►

Более сложная сеть 137

else {
// Если значение показания датчиков меньше
// порогового, а предыдущее значение было выше,
// значит кот только что сошел с подстилки,
if (prevSensorValue > threshold) {
println("KoT вне подстилки") ;
}
}
Ш Наконец, добавим в нашу void sendMail() {
программу метод для отправки println(«Здесь отправляется сообщение эл. почты.»)
сообщения электронной почты.
На данном этапе этот метод будет }
просто имитировать отправку со­
общения, выводя на экран соот­
ветствующее сообщение. Далее
в этой главе мы заполним его ко­
дом для отправления настоящего
сообщения электронной почты.
А пока что добавьте только вот
этот код в конец программы:

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

Д Упрощение
Отправляя сообщение электрон­ int currentTime = 0; // Текущее время в виде одной цифры
ной почты, программа долж­ int lastMailTime = 0 ; // Время последнего отправления

на сохранить время отправки. // сообщения эл. почты


int mailInterval =60 ; // Минимальное количество секунд
Добавьте в начале программы
// между сообщениями
переменную для этого значения,
String mailUrl = «http://www.example.com/cat-script.php»;
а также еще несколько перемен­
ных для хранения связанных зна­
чений:

Ш Добавьте в начале метода void draw() {


draw о линию кода для постоян­ currentTime = hour() * 3600 + minute() * 60 + second();
ного обновления значения пере­
менной currentTime (выделена
жирным шрифтом):
138 Глава 3

т Теперь модифицируем метод void sendMail() {


эепс!Ма11 о следующим образом // Время, прошедшее после отправления последнего сообщения:
(добавленный код выделен жир­ int timeDifference = currentTiroe - lastMailTixne ;
ным шрифтом):
if ( timeDifference > mailInterval) {
Убедившись, что программа ра­ String [] mailScript = loadstrings (znailUrl) ;
ботает как следует, присвойте пе­ pr intin («Результаты сценария отправления сообщения:») ;

ременной та 111ггьегуа1 требуемое println (mailScript) ;

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


// Сохраняем текупдоо минуту для следующего раза:
между отправлением сообщений
lastMailTixne = currentTime;
электронной почты.
}

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

Кот на подстилке
Результат сценария отправления сообщения: The file «http://www.example.com/cat-script.php» is missing
or inaccessible, make sure the URL is valid or that the file has been added to your sketch and is
readable.

(Отсутствует или недоступен Файл "http://www.example.com/cat-script.php", проверьте правильность URL


и что файл был добавлен в скетч и может быть прочитан.)

В данном случае скетч отправляет запрос g e t HTTP для вызова сценария РНР, который пока отсутствует.
Мы создадим этот сценарий в следующем разделе.

О тправка сообщ ения от кота


Среда Processing не имеет библиотек для работы с можно также использовать команду p o s t ,н о э т о бу­
электронной почтой, поэтому для отправки наше­ дет несколько посложней. Мы позже рассмотрим,
го сообщения нам придется призвать на помощь как это сделать.
РНР. Для запросов g e t HTTP Processing использу­
ет команду loadstring о . С помощью этой команды Создайте файл со следующим РНР-сценарием и
мы можем также вызывать из Processing сценарии сохраните его на своем веб-сервере под названием
РНР или адреса (URL) веб-страниц. Для этой цели cat-script.php.

<?php
/*
Отправитель сообщений эл. почты
Контекст : РНР

Отправляет сообщение эл. почты, если значение переменной


sensorValue выше порогового значения.
*/ ►

Более сложная сеть 139

т // Создаем сообщение:
$to = «you@example.com»; // Измените этот адрес эл. почты
// на действительный
$эи1дес1: = «Кот»;
$теззаде = «Кот на подстилке на http://www.example.com/
са^ат»;
$:£гот = «cat@example.com»; // Измените этот адрес эл. почты
/ / н а действительный

// Отправляем сообщение
mail($to, $subject, $message, «From: $from>>);
// Отвечаем среде Processing:
echo «ТО: « .$to;
echo «\nFROM: « .$from;
echo «\nSUBJECT:» .$subject;
echo «\n\n» .$message . "\n\n";

Протестируйте этот сценарий в браузере. Вызов


его из браузера должен отправить сообщение элек­ М к . Частота отправки сообщений
тронной почты на указанный в сценарии адрес. Теперь, когда мы отправляем сообщения элек­
Некоторые серверы электронной почты разрешают тронной почты из программы, нужно очень
отправлять сообщения только с адреса электронной осторожно отнестись к частоте их отправки.
почты пользователя. В таком случае замените адрес Вовсе нежелательно забить почтовый ящик не­
са!@ехатр1е.сот адресом электронной почты вашей сколькими тысячами сообщений только потому,
учетной записи на веб-сервере, где исполняется что мы случайно вызвали команду для отправки
этот сценарий. сообщений в бесконечном цикле.

Убедившись, что сценарий работает должным об­ Кот на подстилке


разом, возвращаемся обратно к скетчу Processing. Результат сценария отправки сообщения:
Проверьте еще раз, что значению переменной [0] "ТО: you@example.com"
maiiuri присвоен URL сценария РНР, и запустите [1] "FROM: cat@example.com"
скетч на исполнение. Теперь, когда кот заберется на [2] "SUBJECT:Кот"
свою подстилку, скетч вызовет сценарий отправки [3] ""

сообщения электронной почты, и вы должны полу­ [4] "Кот на подстилке на http://www.example,


сот/cat cam"
чить сообщение от своего кота. При этом на консоль
[5] ""
также будет выведено следующее сообщение:

Итак, у нас есть кое-какой конкретный результат: мы можем отправлять сообщения электронной почты при
наступлении физического события — когда кот залег на свое спальное место. В следующем разделе мы
сделаем нашего кота знаменитостью Интернета с помощью веб-камеры.
140 Глава 3

Создание веб-страницы для размещения снимков с веб-камеры

СИ Настало время создать веб-страницу для раз- <html>


мещения на ней снимков кота, снятых веб-камерой. <head>
Сделайте снимок кота, сохраните его в файле <title>Cat Cam</title>
catcam.jpg и загрузите этот файл на веб-сервер <meta http-equiv=»refresh» content=»5»>
в папку, в которой находится РНР-сценарий. Затем </head>
<body>
пропишите этот файл в файле веб-страницы index,
<center>
html в той же самой папке.
<h2>Cat Cam</h2>
<img src=»catcam.jpg»>
Далее приводится код HTML для такой страницы,
</center>
которая автоматически обновляется в браузере каж­
</body>
дые пять секунд, — это задано в метатеге в заголов­
</html>
ке документа. Вы можете добавить в эту страницу
любые подробности, но оставьте метатег на своем
месте.

Ш Усовершенствование <html>
<head>
Кроме того, что она доволь­
<title>Cat Cam</title>
но простая, наша веб-страница
<script type=»text/javascript»>
также не очень смышленая, так
function refresh() {
как при обновлении она переза­
var refreshTime = 5 * 1000; // 5000 ms
гружается полностью. Страницу
var thislmage = «catcam.jpg»; // Местонахождение
можно сделать немного умнее,
// изображения
перезагружая только входящее
var today = new Date(); II Текущее время
в нее изображение. Для этого нам
// Добавляем время в конец строки изображения,
потребуются теги CSS13 и немно­
// чтобы создать однозначный URL:
го кода JavaScript:
document.images["pic"].src=thisImage+"?"+today;
// Перезагружаем, если изображения загружены:
13 CSS, Cascading Style Sheets — каскад­
ные (иерархические) таблицы стилей. if(document.images) {

ШГ Эта страница более слож­ window.onload=refresh;


ная, чем первая, — в ней переза­ }
гружается только изображение, // Если время истекло, перезагружаем изображение
а остальные элементы страницы t=setTimeout('refresh()',refreshTime);

остаются прежними.
</script>
</head>
<body onload=»refresh()»>
<center>
<h2>Cat Cam</h2>
<img src=»catcam.jpg» id=»pic»>
</center>
</body>
</html>
Более сложная сеть 141

Теперь, когда у нас есть веб-страница для размеще­


ния снимков отдыхающего кота, мы можем авто­
матизировать процесс создания снимков и загруз­
ки их на веб-сервер. Для этого нам сначала нужно
создать сценарий РНР для загрузки изображений.
Затем следует подправить скетч Processing для соз­
дания снимков и загрузки их на веб-сервер с по­
мощью этого сценария РНР. Конечный результат
работы этих двух программ показан на рис. 3.12.

Рис. 3.12. Независимо от того, с помощью какого кода


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

Загрузка файлов
на веб-сервер с помощью РНР
Итак, на следующем шаге мы создадим сценарий представляет собой массив, каждый из элементов
для загрузки изображений на сервер. Язык РНР со­ которого содержит какое-либо свойство файла.
держит предопределенную переменную $_f i l e s , В частности, эта переменная позволяет получить
которая позволяет получить информацию о лю­ такую информацию о файле, как его имя, размер
бом файле, который пользователь пытается загру­ и тип. Эта информация будет полезна для сцена­
зить с помощью HTTP. Подобно рассмотренной риев, которые работают только с файлами формата
ранее переменной $_r e q u e s t , переменная $_f i l e s 1РЕО меньше определенного размера.

<?php
Ш Пишем код
if (isset($_FILES)) {
Далее приводится сценарий РНР print_r ($_FILES) ;
с формой HTML, который за­ }
гружает файл на веб-сервер. На ?>
этом этапе сценарий РНР не вы­
полняет никакой важной работы, <html>
а просто показывает результа­ <body>
ты выполнения запроса HTTP.
Сохраните этот сценарий на <foriti action=»save2web.php» method=»post»
веб-сервере в файле с названием enctype=»multipart/form-data»>
save2web.php.
<label for=»file»>Filename :</label>
<input type=»file» name=»file» id=»file» />
<br />
<input type=»submit» name=»submit» value=»Upload>> />
</form>

</body>
</html> ►

142 Глава 3

Запросив этот файл в браузере, мы получим от сервера простую форму с кноп- |


кой для выбора файла и кнопкой для загрузки выбранного файла. Выберите на j
своем компьютере файл изображения JPEG и загрузите его. При успешной за- j
грузке сервер должен отобразить в браузере строку наподобие следующей: j
|
Array ( [file] => Array ( [name] catcam.jpg [type] => image/jpeg [tmp_ j
name] => /tmp/phpoZT3BS [error] => 0 [size] => 45745 ) ) I

Эта строка — содержимое переменной $_f i l e s .

□ Теперь замените часть преды­ <?php


дущего кода РНР (между тегами if (isset($_FILES)) {
<?php и ?>) следующим кодом: // Сохраняем параметры файла в переменных:
$fileName = $_FILES [’file'] [’name'];
$fileTempName = $_FILES [’file'] [’tmp__name'];
$fileType = $_FILES ['file'] [’type'];
Этот сценарий удостоверяется,
$fileSize = $_FILES['file']['size'];
что загружаемый файл имеет
$fileError = $_FILES ['file'] ['error'];
формат 1РЕв и размером не пре­
вышает 100 Кбайт. Если файл // Если файл типа JPEG и меньше 100 Кбайт, продолжаем:
проходит эту проверку, сценарий if (($fileType = «image/jpeg») && ($fileSize < 100000)) {
сохраняет его в той же самой пап­ // Если ошибка с файлом, выводим ее на экран:
ке, где находится сам сценарий. if ( $fileError > 0) {
echo «Return Code: « . $fileError . "<br />";
Загрузив на веб-сервер файл }
изображения 1РЕС с помощью // Если с файлом все в порядке, выводим на экран
приведенного сценария, мы смо­ // информацию о файле:
жем увидеть этот файл в папке else {
сценария. При обновлении окна echo "Upload: " . $fileName . «<br />»;
браузера со страницей index.html, echo «Type: « . $fileType . «<br />»;
которую мы создали ранее, за­ echo «Size: « . ($fileSize / 1024) . « Kb<br />»;
груженное изображение должно
echo «Temp file: « . $fileTempName . «<br />»;
отобразиться на этой странице.
// Если файл уже существует, удаляем предыдущую версию:
if (file_exists ($fileName)) {
unlink ($fileName);

// Перемещаем файл из временной папки


/ / в указанную:
move_uploaded_file ($fileTempName, $fileName);
echo "Загруженный файл сохранен как: ".$fileName;

}
// Если файл не JPEG или слишком большой, сообщаем об этом:
else {
echo "Файл не JPEG или слишком большой.";

}
?>
Более сложная сеть 143

Захват и загрузка изображений с помощью Processing

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

Для Mac O SX
Если вы работаете на компьютере под Mac OS X, написания книги). Наконец, нужно изменить на­
то вам для этого делать ничего не придется. Ви­ стройки совместимости для Processing. Для это­
деобиблиотека Processing работает с программой го щелкните на значке приложения Processing
QuickTime, которая входит в комплект поставки та­ и в открывшемся контекстном меню выберите
кого компьютера. Убедитесь в этом, открыв какое- опцию Свойства, а в окне свойств — вкладку
либо приложение для работы с видео, — например, Совместимость. Установите на этой вкладке фла­
Photo Booth, и если все работает должным образом, жок Запустить программу в режиме совмести­
тогда можно приступать к программированию. мости с: и выберите в связанном раскрывающемся
списке опцию Windows ХР (пакет обновления 3).
Нажмите кнопку Применить, а затем кнопку ОК,
Для Windows 7
чтобы закрыть окно. Теперь все готово для про­
Пользователям Windows 7 нужно установить про­ граммирования. Команда разработчиков Processing
игрыватель QuickTime, если он еще не установлен. надеется устранить этот недостаток в будущем,
Загрузить установочный файл можно по адресу возможно, к тому времени, когда вы читаете эти
http://www.apple.com/quicktime. Запустите про­ строки.
цесс установки двойным щелчком по значку фай­
ла установки и следуйте выводимым инструкциям.
Для Linux
Кроме того, надо установить библиотеку WinVDIG,
которая позволяет среде Processing подключаться Ну, а пользователям Ubuntu на этот раз не повезло.
к веб-камере через QuickTime. Загрузить эту би­ Видеобиблиотека Processing в настоящее время в
блиотеку можно по адресу http://www.eden.net. Linux не поддерживается, хотя разработчики и при­
nz/7/20071008/. Выберите версию 1.0.1 библиоте­ ветствовали бы решения для этого.
ки, так как это самая стабильная версия (на момент

Ш Пишем код /**


Захват и загрузка изображений
Следующий скетч выводит изо­
Контекст: Processing
бражение с веб-камеры на экран
*/
компьютера. Если вы видите себя
(или своего кота), система рабо­
import processing.video.*; // Импортируем видеобиблиотеку
тает должным образом. Capture myCam; // Веб-камера ►

144 Глава 3

ш void setup () {
size (640, 480); // Задаем размер окна монитора

// Выводим список веб-камер компьютера:


println(Capture.list ());

// Используем для захвата веб-камеру по умолчанию


// со скоростью 30 кадр/сек. :
шуСаш = new Capture(this, width, height, 30);
}

void draw () {
// Если есть данные с камеры:
if (шуСаш.available ()) {
myCam.read (); II Считываем изображение с камеры :
set(0, 0, myCam); // Выводим изображение с камеры на экран:
}
}

И Теперь модифицируем этот void draw () {


скетч, добавив в него код для вы­ // Если есть данные с камеры:
вода на экран метки времени (до­ if (myCam.available()) {
myCam.read (); // Считываем изображение с камеры:
бавленный код выделен жирным
шрифтом): set(0, 0, myCam); // Выводим изображение с камеры на экран:

//Получаем время в виде сороки:


String timeStanp = nf(hour(), 2) + «:» + nf (minute(), 2)
+ «:» + nf (second() , 2) + « « + nf (day(), 2) + «-»
+ nf (month () , 2) + «-» + nf (year (), 4) ;

// Рисуем тень для текста времени:


fill (15);
text(timestamp, 11, height - 19);
// Выводим основной текст времени:
fill(255);
text (timeStaxnp, 10, height - 20) ;
}
}

□ Продолжим модификацию import processing.video.*; / / Импортируем видеобиблиотеку


скетча, добавив в его верхнюю Capture myCam; / / Веб-камера
String fileName = «catcam.jpg»;
часть глобальную переменную
для имени файла, а в нижнюю — // Здесь находятся методы setup () и draw ()
метод для сохранения в формат
.ГРЕв файла изображения с веб­ void keyReleased() (
камеры при нажатии любой кла­ PImage img = get ();
img.save (fileName);
виши (добавляемый код выделен
}
жирным шрифтом):
Более сложная сеть 145

ШГ Сохраните скетч, запустите


его на исполнение и нажмите
любую клавишу. Теперь про­
верьте папку, в которой сохранен
файл скетча, — в нем должен по­
явиться файл изображения 1РЕв,
созданный скетчем. Пример та­
кого изображения показан на
рис. 3.13.

Рис. 3.13. Изображение, захваченное скетчем


с веб-камеры

G F Теперь нам нужно добавить import processing.net.*;


метод, который может выполнять
запросы p o s t HTTP. Для этого String pictureScriptUrl = "/save2web.php";
понадобится сетевая библиотека String boundary = "--- H4rkNrF";
Processing. Подобно библиотеке Client thisClient;
для последовательной связи, эта
библиотека расширяет основные
функциональности Processing. Но
если библиотека для последова­
тельной связи добавляет возмож­
ности для работы с последователь­
ными портами, сетевая библиотека
добавляет возможности для созда­
ния сетевых подключений и не­
скольких других глобальных пере­
менных. Добавьте следующий код
перед методом setup ():

Ш Теперь нам требуется метод void postPicture() {


для формулирования и отправки // Загружаем сохраненное изображение в массив байтов:
самого запроса p o s t . Д л я э т о г о byte[] thisFile =loadBytes (fileName) ;
нужно открыть новое подклю­
чение клиента client к серверу, // Открываем новое подключение к серверу:
а затем отправить запрос. В этом thisClient = new Client(this, «www.example.com», 80);
методе содержимое запроса разби­ // Осуществляем запрос POST HTTP:
то на три части: 1 — все, что пред­ thisClient.write(«POST « + pictureScriptUrl + «
шествует файлу, 2 — сам файл, ко­ HTTP/1.l\n»);
торый загружается в массив байтов thisClient.write(«Host: www.example.com\n»);
и 3 — окончание запроса, которое // Информируем сервер о том, что запрос POST отправляется
следует за файлом. Добавьте этот // несколькими частями, и посылаем уникальную
метод в конец скетча: // строку-разделитель этих частей:
146 Глава 3

thisClient.write(«Content-Type: multipart/form-data;
boundary=>>) ;
thisClient.write(boundary + "\n" );

// Формируем начало запроса:


String requestHead =»\n— » + boundary + «\п»;
requestHead +=»Content-Disposition: form-data; name=\»file\»;

requestHead += <<filename=\»» + fileName + «\»\п»;


requestHead +=»Content-Type: image/jpeg\n\n»;

// Формируем конец запроса:


String tail ="\n— " + boundary + "— \n\n";

Ш Разобравшись с тремя частя­ // Подсчитываем общую длину запроса, включая заголовок


ми запроса, подсчитаем общее // запроса, файл и «хвост» запроса, и отправляем это значение:
количество байтов, сложив раз­ int contentLength = requestHead.length() + thisFile.length
мер двух строк и массива байтов. + tai1.length();
thisClient.write(«Content-Length: « + contentLength +
Далее отправим значение разме­
«\n\n»);
ра содержимого, а затем и само
содержимое. Наконец, закрыва­
// Отправляем заголовок запроса, файл и «хвост»:
ем подключение, остановив кли­
thisClient.write(requestHead);
ента.
thisClient.write(thisFile);
thisClient.write(tail);
// close the client:
thisClient.stop();

□ Наконец, вставляем вызов void keyReleased() {


только что созданного метода в PImage img = ge t ();
метод keyReleased () (добавлен­ img. save (fileName);
ный код выделен жирным шриф­ postPicture();
том):

Сохраните скетч и запустите его на исполнение. Теперь при нажатии любой клавиши захваченное веб­
камерой изображение не только сохраняется на локальном компьютере, но также загружается сценарием
8ауе2\л/еЬ.рИр в папку са1сат вашего веб-сервера.
Более сложная сеть 147

= ® а А натом ия со ста в н о го за п р о са p o s t

Формы HTML, которые используют протокол HTTP для загрузки файлов, создаются посредством за­
проса P O S T совместно с содержимым особого типа: muitipart/form-data, чтобы сервер знал, как обра­
батывать полученное содержимое. Каждый элемент формы посылается отдельной частью, отделенной
уникальной строкой. Рассмотрим, что получает сервер от созданного нами ранее сценария (рис. 3.14):

►► Boundary (разделитель)— любая


л ji
POST /catcam/save2web.php HTTP/1.1 ________
строка, но должна быть уникальной. ]
Host: www.example.com
Content-Type: multipart/form-data; boundary=--- H4rkNrF
Предшествует каждой части__________ Jj
Content-Length: 40679

----- H4rkNrF
Content-Disposition: form-data; name="submit"
» Значение для этой части
)
I
Upload
----- H4rkNrF
Content-Disposition: form-data; name==,,file";: filename="catcam.jpg"
Content-Type: image/jpeg \
►► Content-Disposition— определяет эту часть.
^ Для файлов также содержит локальный путь к файлу
[actual bytes of the file go here]

-H4rkNrF—
■С ► ► Конечный разделитель с двумя дополнительными дефисами

Рис. 3.14. Составной запрос P O S T

Собираем все части вместе


Наконец настало время сложить воедино скетч значение показаний превышает пороговое значе­
Processing, который считывает последовательный ние, значит кот находится на подстилке и скетч
порт и вызывает сценарий отправки сообщений делает снимок. Если прошло установленное время
электронной почты, со скетчем, осуществляющим с момента снятия последнего снимка, текущий сни­
захват изображения веб-камерой и вызов сценария мок загружается на веб-сервер. Если значение по­
для загрузки изображения на веб-сервер. Работа казаний датчиков только что превысило пороговое
объединенного скетча представлена блок-схемой значение и прошел заданный период времени по­
на рис. 3.15. сле отправки последнего сообщения электронной
почты, скетч отправляет сообщение, информирую­
Весь этот процесс приводится в действие показа­ щее вас о том, что кот только что забрался на под­
ниями панели датчиков давления, поступающим по стилку.
последовательному каналу связи. Если полученное
148 Глава 3

Рис. 3.15. Блок-схема скетча Cat Cam

□ Пишем код
Cat webcam uploader/emailer
Начнем с объединения списков Контекст: Processing
глобальных переменных обоих
скетчей в один общий список, Отслеживает показания датчиков при получении значения,
который будет иметь следующий превышающего пороговое, делает снимок, загружает снимок
вид: на веб-сервер и отправляет извещение по электронной почте.
*/

// Импортируем необходимые библиотеки Processing:


// network, serial, video:
import processing.serial.*;
import processing.video.*;
import processing.net.*; ►►
Более сложная сеть 149

ш Serial myPort; // Последовательный порт


float sensorValue = 0; // Значение датчика давления
float prevSensorValue = 0 ; // Предыдущее значение
// показания датчика давления
int threshold = 250; // Пороговое значение

int currentTime = 0 ; // Текущее время в виде одной цифры


int lastMailTime = 0 ; // Минута последнего отправления
// сообщения эл. почты
int maillnterval = 6 0 ; // Минимальное кол. секунд
// между сообщениями
String mailUrl = "http://www.example.com/cat-script.php";
int lastPictureTime = 0 ; // Минута последней загрузки снимка
int picturelnterval = 10; // Минимальное кол. секунд
// между снимками

Capture myCam; // Библиотечный экземпляр


// capture веб-камеры
String fileName = «catcam.jpg»; // Имя файла для снимка

// папка на веб-сервере для размещения сценария для снимка:


String pictureScriptUrl = <</save2web.php>>;
String boundary = «--- H4rkNrF»; // Строчный разделитель
// для запроса POST

Client thisClient; // Экземпляр сетевой библиотеки

ET Теперь объединяем методы void setup() {


setup о следующим образом: size ( 4 0 0 , 3 0 0 ) ;
// Выводим на экран все доступные последовательные порты
println(Serial.list());

// Я знаю, что на моем компьютере Мае первым портом в списке


// последовательных портом всегда идет порт для Arduino,
// поэтому я открываю Serial.list()[0]. На своем компьютере
// откройте соответствующий порт, используя вывод метода
// Serial.list() для его определения. Порты в этом списке
// перечислены, начиная с порта, соответствующего параметру [0]/
myPort = new Serial(this, Serial.list () [0], 9600);

// Считываем байты в буфер, пока не дойдем до символа


// перевода строки (АЭСИ 10) :
туРогб .Ьи££египбИ ('\п');

// Задаем начальный фон и плавную прорисовку:


background(#543174);
smooth();

// Выводим список веб-камер компьютера:


println(Capture.list());

// Используем для захвата веб-камеру по умолчанию со


// скоростью 30 кадр/сек.:
myCam = new Capture(this, width, height, 30);
) ►

150 Глава 3

ш Метод draw о выводит изо­ void draw () {


// Составляем одно число из текущего часа, минуты и секунды:
бражение с веб-камеры на экран
currentTime = hour() * 3600 + minute() * 60 + second();
и добавляет к нему метку вре­
мени: if (myCam.available() == true) {
// Выводим изображение с камеры на экран:
myCam.read();
set(0, 0, myCam);

// Получаем время в виде строки:


String timeStamp = nf(hour(), 2) + «:» + nf(minute(), 2)
+ «:» + nf (secondo, 2) + « « + nf(day(), 2) + «-»
+ nf (month (), 2) + «-» + nf(year(), 4);

// Рисуем тень для текста времени:


fill (15) ;
text(timeStamp, 11, height - 19);
// Выводим основной текст времени:
fill (255);
text(timeStamp, 10, height - 20);

ш Основное действие проис­ void serialEvent (Serial myPort) {


ходит В методе serialEvent (), // Получаем строку ASCII:
String inString = myPort.readStringUntil('\n');
как показано в блок-схеме на
рис. 3.15. Если значение показа­ if (inString != null) {
ний панели датчиков давления // Удаляем непечатаемые символы:
превышает пороговое значение, inString = trim(inString);
скетч делает снимок. Каждые // Преобразовываем в int и сопоставляем высоте экрана:
sensorValue = float (inString) ;
пять секунд скетч загружает
sensorValue = map(sensorValue, 0, 1023, 0, height);
снимок. Если значение показа­
ний датчиков только что изме­ if (sensorValue > threshold ) {
нилось, скетч вызывает метод if (currentTime - lastPictureTime > picturelnterval) {
зепсЗМаИ ()! PImage thisFrame = get();
thisFrame.save (fileName) ;
postPicture ();
lastPictureTime = currentTime;

// Если значение последнего показания было ниже порогового,


// значит кот только что залез на подстилку,
if (prevSensorValue <= threshold) {
printIn(«cat on mat»);
sendMail();

else {
// Если значение показания датчиков меньше
// порогового, а предыдущее значение было выше,
// значит кот только что слез с подстилки,
if (prevSensorValue > threshold) {
printIn(«cat not on mat»);



Более сложная сеть 151

от // Сохраняем текущее значение для следующего раза:


prevSensorValue = sensorValue;

Ш Метод sendMaii () проверяет, void sendMaii() {


прошло ли достаточно времени // Время, прошедшее после отправки последнего сообщения:
int timeDifference = currentTime - lastMailTime;
после последней отправки со­
общения, прежде чем отправлять if ( timeDifference > mailInterval) {
другое сообщение. Затем он с по­ String[] mailScript = loadStrings(mailUrl);
мощью функции loadStrings () println(«results from mail script:»);
вызывает сценарий cat-mail, println(mailScript);

php, чтобы отправить запрос g e t


// Сохраняем текущую минуту для следующего раза:
HTTP: lastMailTime = currentTime;

}
т Наконец, метод postpicture о void postPicture() {
берет последний сохраненный // Загружаем сохраненное изображение в массив байтов:
снимок и загружает его на веб­ byte[] thisFile =loadBytes (fileName) ;
сервер, вызывая сценарий
// Открываем новое подключение к серверу:
save2web.php с помощью запро­
thisClient = new Client(this, «www.example.com», 80);
са POST HTTP: // Осуществляем запрос POST HTTP:
thisClient.write(«POST « + pictureScriptUrl + «
HTTP/1.l\n»);
thisClient.write(«Host: www.example.com\n»);
// Информируем сервер о том, что запрос POST отправляется
// несколькими частями, и посылаем уникальную
// строку-разделитель этих частей:
thisClient.write(«Content-Type: multipart/form-data;
boundary=»);
thisClient.write(boundary + "\n");

// Формируем начало запроса:


String requestHead =»\n— » + boundary + «\п»;
requestHead +=»Content-Disposition: form-data; name=\»file\»;

requestHead += <<filename=\»» + fileName + «\»\п»;


requestHead +=»Content-Type: image/jpeg\n\n»;

// Формируем конец запроса:


String tail ="\n\n— " + boundary + "— \n\n";

// Подсчитываем общую длину запроса, включая заголовок


// запроса, файл и хвост запроса, и отправляем это значение:
m t contentLength = requestHead.length() + thisFile.length +
tail.length();
thisClient.write(«Content-Length: « + contentLength + «\n\n») ;

// Отправляем заголовок запроса, файл и хвост:


thisClient.write(requestHead);
thisClient.write(thisFile);
thisClient.write(tail);
152 Глава 3

Последняя проверка
Чтобы проверить работу этого кода, откройте стра­ сценария отправки сообщения электронной по­
ницу Cat Cam в браузере, а затем запустите скетч на чты должен вывести в консоли другое сообщение.
исполнение. При запуске скетча он должен сделать Проверьте, изменяется ли снимок на веб-странице,
снимок и загрузить его на сервер. Несколько се­ когда кота на подстилке нет. Изменений быть не
кунд спустя страница Cat Cam должна обновиться, должно, а должен отображаться последний сни­
отображая только что загруженный снимок. Затем мок — до тех пор, пока кот снова не заберется
нужно как-то заставить кота зайти на свою подстил­ на подстилку. Метка времени на снимке даст вам
ку или, если это не удастся, положить на нее груз, представление, когда кот был на подстилке послед­
соответствующий весу кота. Скетч должен сделать ний раз.
другой снимок и загрузить его, а затем отправить
сообщение электронной почты. Проверьте свой по­ Если все работает, как описано, вздохните с облег­
чтовый ящик на предмет такого сообщения. чением и полюбуйтесь своей работой.

Пока кот находится на подстилке, скетч будет де­ Поздравляем, вы только что создали свой пер­
лать снимки и загружать их на веб-сервер каждые вый подключенный к Интернету проект. Теперь
несколько секунд. Понаблюдайте в течение мину­ вы и ваш кот можете постоянно быть на связи. На
ты или около того, чтобы загрузилось несколько рис. 3.16 показан внешний вид завершенного про­
снимков, а затем уберите кота с подстилки. Вызов екта в моей реализации.

С £ Закл ю чен и е
Полагаю, после прочтения этой главы у вас появилось базовое понимание структуры Интер­
нета и принципов работы сетевых приложений.

Интернет, по сути, — это сеть сетей, состоящая из Теперь, когда вы понимаете, насколько просто об­
многих уровней. Для успеха сетевой транзакции мениваться такими сообщениями, у вас скоро бу­
должен существовать, по крайней мере, один на­ дет возможность отправлять их без участия персо­
дежный маршрут в Интернете от клиента к серве­ нального компьютера. В следующей главе мы под­
ру. Клиентское и серверное приложения посылают ключим микроконтроллер к Интернету напрямую
друг другу текстовые сообщения о файлах, кото­ с помощью аппаратного интерфейса Е Л е п ^ для
рыми они хотят обменяться, передавая сообщения микроконтроллера.
и файлы через сетевые порты. Для взаимодействия
с любым сервером необходимо знать его протокол
связи. Когда этот протокол известен, можно обмени­
ваться текстовыми сообщениями между клиентом
и сервером посредством сеанса telnet, выполняя
соответствующие команды. Можно также разрабо­
тать программу для персонального компьютера или
микроконтроллера, отправляющую такие же самые
команды, как мы это сделали в проекте «Сетевой
кот».
Более сложная сеть 153

а б

Рис. 3.16. Завершенный проект «ложа» для кота (а)


и часть панели датчиков (6), которая находится под
подстилкой. Электроника размещена в бамбуковом
ящичке для ювелирных украшений (в), под стиль
остальной мебели. Кабель иБВ подсоединен
к компьютеру. В обязательном порядке основательно
обезопасьте все провода, чтобы кот случайно
их не погрыз
в
Глава 4

«ГЛЯНЬ, МАМА,
ЗДЕСЬ НЕТ КОМПЬЮТЕРА!»
МИКРОКОНТРОЛЛЕРЫ В ИНТЕРНЕТЕ

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


дания проекта наподобие подключенного к Сети места отдыха для
кота из главы 3, — «Замечательно!» А как бы это сделать без подклю­
чения к компьютеру? Подсоединять м икроконтроллер к настольному
компьютеру или даже ноутбуку лиш ь для того, чтобы он мог подклю­
чаться к Интернету, очень неудобно, и хотелось бы как-то обойтись
без этого. В конце концов, как мы видели в той же главе 3, протоколы
управления связью Интернета — это всего лиш ь текстовы е строки,
а микроконтроллеры м огут обмениваться короткими текстовыми
строками без каких бы то ни было проблем. Так что, подключить ми­
кроконтроллер к Интернету без компьютера вполне возможно.
В этой главе мы рассмотрим, как это делается с помощью устройства,
которое нисколько не сложнее, чем радиомодем Bluetooth,
с которым мы познакомились в главе 2.

а Необычные проекты
Устройство YBox (http://uncommonprojects.com/site/play/ybox-2) доставляет RSS-
рассылки на ваш телевизор, используя для этого Ethemet-модуль последовательно­
го порта XPort и микросхему Propeller. Фотография предоставлена организацией
Uncommon Projects.
156 Глава 4

Ф £ В течение нескольких последних лет на которой работает компьютер веб-хостинга ва­


Ш 11 рынке появилась линейка коммерческих шего провайдера Интернета. Домашние систе­
устройств, которые могут подключаться к Интер­ мы безопасности состоят из объединенных в сеть
нету, не требуя для этого участия персонального и взаимодействующих друг с другом микроконтрол­
компьютера. Такие компании, как D-Link, Sony, леров, один из которых может взаимодействовать
Axis и др., изготавливают камеры наблюдения, с центральным сервером по обычным телефонным
оснащенные сетевым интерфейсом, — как Ethernet, линиям с помощью модема.
так и Wi-Fi. Компании Ceiva, eStarling и др. пред­
лагают оснащенные адаптерами Wi-Fi видеорамки, Все эти устройства осуществляют передачу данных
способные загружать изображения непосредствен­ по сети. Простейшие из них могут обрабатывать
но из Интернета и пригодные для использования одну транзакцию за раз, запрашивая информацию
в качестве картин. Компания Ambient Devices из­ у сервера, а затем ожидая ответа, или отправляя
готавливает разного рода светящиеся табло и дис­ простое сообщение в ответ на какое-либо простое
плеи, которые подключаются к Сети и меняют вы­ событие. Другие могут обрабатывать множествен­
водимое на них изображение в зависимости от по­ ные потоки данных одновременно, позволяя вам
ступающей на них информации: данных фондовой бороздить просторы Сети и в то же самое время
биржи, сводок погоды и пр. Приставки кабельного смотреть телевизор. Чем больше вычислительные
телевидения представляют собой небольшие ком­ возможности устройства, тем более сложные зада­
пьютеры, которые могут одновременно маршрути­ ния оно может выполнять. Но многие приложения
зировать потоки аудио, видео и прочих цифровых не требуют больших вычислительных возможно­
данных. Более того, операционная система таких стей, так как реализуют всего лишь одну или две
приставок может быть разновидностью той же са­ функции.
мой операционной системы Linux, под управлением

Рис. 4.1. Новые компоненты для проектов этой главы:


1. Шилд Arduino Ethernet — этот шилд включает модуль Power over Ethernet1.
2. Фотодатчики.
3. Красный, зеленый и синий светофильтры.
4. Вольтметр. Вообще-то, подойдет любой, но для лучшего эффекта желательно найти вольтметр как можно
постарее.
5. Понадобится также достаточное количество штырьковых контактов для интерфейсных модулей.
1 Power over Ethernet (РоЕ) — технология, позволяющая передавать удаленному устройству электрическую энергию вместе с данны­
ми через стандартную витую пару сети Ethernet.
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 157

С Ком поненты для п р о е кто в этой главы


Код поставщика США и Европа
Россия • А — Arduino Store (http://store.arduino.cc/ww)
• AF — Adafruit (http://adafruit.com)
• АМР — «Амперка» (http://amperka.ru) • D — Digi-Key (www.digikey.com)
• CHD — «Чип и Дип» (http://chipdip.ru) • F — Famell (www.farnell.com)
• LC — «Линуксцентр» (www.linuxcenter.ru) • J — Jameco (http://jameco.com)
• MS — Maker SHED (www.makershed.com)
• RS — RS (www.rs-online.com)
• SF — SparkFun (www.sparkfun.com)
Проект б. Привет, Интернет!
• SS — Seeed Studio (www.seeedstudio.com)
Веб-сервер цвета дня
П роект 7. Сетевой измеритель

►Плата Arduino Ethernet, 1 шт. В качестве аль­ качества воздуха
тернативы подойдет плата с Ethemet-шилдом,
совместимая с Arduino Uno (см. главу 2). ►
►Плата Arduino Ethernet, 1 шт. В качестве аль­
AMP: А000068, http://amperka.ru/product/ar- тернативы подойдет плата с Ethemet-шилдом,
совместимая с Arduino Uno (см. главу 2).
duino-ethernet
AMP: А000068, http://amperka.ru/product/ar-
А: А000050, SF: DEV-09026, J: 2124242, А: duino-ethernet
А000056, AF: 201, F: 1848680 А: А000050, SF: DEV-09026, J: 2124242,

►Устройство с Ethernet-подключением к Ин­ А: А000056, AF: 201, F: 1848680
тернету, 1 шт. Ваш домашний маршрутизатор, ►
►Устройство с Ethernet-подключением к Ин­
скорее всего, имеет разъемы Ethernet на задней тернету, 1 шт. Ваш домашний маршрутизатор,
панели. Если вы подключили свой компьютер скорее всего, имеет разъемы Ethernet на задней
панели. Если вы подключили свой компьютер
к Интернету через сеть Ethernet, то должны
к Интернету через сеть Ethernet, то должны
знать, где находятся эти разъемы. знать, где находятся эти разъемы.

►Сопротивления по 10 К, 3 шт. ►
►Беспаечная макетная плата, 1 шт.
AMP: AMP-R10K-10, http://amperka.ru/prod- AMP: АМР-Х003, http://amperka.ru/product/
uct/resistor breadboard-half
D: 438-1045-ND, J: 20723 или 20601, SF: PRT-
D: 10KQBK-ND, J: 29911, F: 9337687, RS: 707- 00137, F: 4692810, AF: 64, SS: STR101C2M или
8906 STR102C2M, MS: MKKN2

►Фотодатчики (светочувствительные резисто­ ►
►Вольтметр, 1 шт. По возможности, постарайтесь
ры), 3 шт. найти хорошо сохранившийся старый вольтметр.
AMP: АМР-Х016, http://amperka.ru/product/ldr В идеале желательно иметь вольтметр с диапазо­
ном измерений максимум 0-5 В или 0-10 В.
D: PDV-P9200-ND, J: 202403, SF: SEN-09088, CHD: 9000142464, SF: TOL-10285, F: 4692810,
F: 7482280, RS: 234-1050 RS: 244-890

►Беспаечная макетная плата, 1 шт. ►
►Светодиоды, 4 шт.
AMP: АМР-Х003, http://amperka.ru/product/ AMP: AMP-X009-R4, http://amperka.ru/prod-
breadboard-half uct/led-5mm
D: 160-1144-ND или 160-1665-ND, J: 34761 или
D: 438-1045-ND, J: 20723 или 20601, SF: PRT- 94511, F: 1015878, RS: 247-1662 или 826-830,
00137, F: 4692810, AF: 64, SS: STR101C2M или SF: СОМ-09592 или СОМ-09590
STR102C2M, MS: MKKN2 ►
►Сопротивления по 220 Ом, 4 шт.

►Светофильтры, 3 шт.: красный, зеленый и си­ AMP: AMP-R220R-10, http://amperka.ru/prod-
ний. Эти детали можно приобрести в магазинах uct/resistor
осветительного оборудования или фототехники. D: 220QBK-ND, J: 690700, F: 9337792, RS: 707-8842
158 Глава 4

йй Введение в сетевы е модули


Для микроконтроллера можно написать программу, которая будет управлять всеми этапами
сетевого обмена: от установления физического и логического подключения до управления
сетевой адресацией и до согласования протоколов, таких как SMTP или HTTP. Это возможно
благодаря библиотеке кода, которая охватывает все уровни, необходимые для установления
сетевых подключений, и называется сетевым стеком, или стеком протоколов TCP/IP. Однако
для выполнения этой задачи намного легче воспользоваться модулем сетевого интерфейса.

На рынке представлено много таких модулей в са­ с которыми мы познакомились в главе 2, но в них
мых разных ценовых и функциональных категориях. используется другой протокол последовательной
Подобно тому, как можно выбрать микроконтрол- передачи данных. Начинать знакомство с сетевыми
лерную платформу, обладающую определенными модулями удобно как раз с таких модемов, и я ши­
техническими характеристиками, также можно вы­ роко использовал их в первом издании этой книги.
брать и сетевой контроллер определенного уровня Но в данном издании мы будем работать с модуля­
и диапазона функциональностей. Некоторые моду­ ми Ethernet, которые оснащены синхронным после­
ли — например, процессоры RabbitCore компании довательным интерфейсом. Эти модули так легко
Rabbit Semiconductor — поставляются с исходным использовать, как модули TTL-Serial/Ethemet, но
кодом для стека протоколов TCP/IP, который поль­ они не занимают асинхронный последовательный
зователь может модифицировать под свои требова­ порт микроконтроллера. Это означает, что такой
ния, чтобы запрограммировать модуль самостоя­ порт можно использовать для отладки или взаимо­
тельно. Другие, например Beagle Board, представ­ действия с другими устройствами.
ляют собой полноценные одноплатные компью­
теры с сетевыми возможностями. Эти устройства Для подключения Arduino к Интернету есть два
обладают мощными вычислительными возможно­ варианта. Первый — с помощью платы Arduino
стями и предоставляют для опытных сетевых про­ Ethernet, которая представляет собой плату Arduino
граммистов удобную среду программирования. Но со встроенным модулем Ethernet. На этой пла­
к таким устройствам сложно подсоединять датчики те разъем USB, которым оснащены стандартные
и приводы, и для людей, не имеющих опыта сете­ платы Arduino, заменен разъемом Ethernet. Для
вого программирования, кривая обучения работы с программирования такой платы также требуется
ними очень крутая. адаптер USB/TTL-Serial типа FTDI. По второму ва­
рианту можно использовать шилд Ethernet — пла­
Есть и другие устройства — такие, как модули ту расширения для обычных модулей Arduino. На
XPort, XPort Direct, MatchPort и WiPort компании рынке представлены несколько вариантов такой
Lantronix — они оснащены встроенным в них ми­ платы. Шилд Arduino Ethernet оснащен микро­
кропрограммным обеспечением стека протоколов схемой W5100 контроллера Ethernet с поддержкой
TCP/IP и предоставляют пользователю какой-либо работы в Интернете, разработанный компанией
интерфейс: последовательный, telnet или веб-ин­ WIZnet. Шилд этот, как и плата Arduino Ethernet,
терфейс. Работать с этими устройствами намно­ имеет разъем для карты памяти SD. Шилд Adafruit
го легче. Веб-интерфейс предоставляет доступ Ethernet или также оснащен микросхемой W5100,
к устройству через браузер персонального ком­ или с ним может использоваться упомянутый ра­
пьютера, интерфейс telnet — через telnet-сервер нее модуль TTL-Serial/Ethemet компании Lantronix.
компьютера, а последовательный интерфейс — С проектами из этой главы будет работать плата
с микроконтроллера. Такими последовательными Arduino Ethernet, шилд Arduino Ethernet и шилд
интерфейсами являются модемы, преобразовываю­ Adafruit Ethernet с микросхемой W5100. Эти платы
щие последовательные сигналы формата TTL-Serial показаны на рис. 4.2. Но модуль Lantronix с ними
в формат Ethernet (TTL-Serial/Ethemet). Эти модемы работать не будет.
работают во многом подобно модемам Bluetooth,
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 159

Рис. 4.2. Плата Arduino


Ethernet (слева),
шилд Arduino Ethernet
(по центру)
и шилд Ethernet
с модулем
Power-over-Ethernet
(справа).
Для проектов Ethernet
из этой книги можно
использовать любую
из этих плат

в }з Введение в и н тер ф ей с SPI


Шилд Ethernet и плата Arduino Ethernet взаимо­ • выход ведущего, вход ведомого (MOSI,
действуют со своими контроллерами Ethernet, Master Out, Slave In) — по этой линии веду­
используя разновидность последовательного син­ щее устройство посылает данные ведомому
хронного обмена данными, называющегося ин­ устройству на каждый импульс тактирования;
терфейсом SPI2. Интерфейс SPI вместе с другим • вход ведущего, выход ведомого (MISO,
последовательным синхронным протоколом — Master In, Slave Out) — по этой линии ведо­
I2C3, который иногда также называется интерфей­ мое устройство посылает данные ведущему
сом TWI4, — представляют собой два наиболее устройству на каждый импульс тактирования.
распространенных последовательных протокола, Если ведомому устройству нет надобности
с которыми вам когда-либо придется иметь дело. посылать данные ведущему, вывод MISO от­
Ключевой особенностью всех последователь­ сутствует;
ных синхронных протоколов является управляю­ • выбор ведомого (SS, Slave Select) или выбор
щее устройство, которое генерирует регулярные схемы (CS, Chip Select) — поскольку к шине
импульсы — сигналы тактирования (синхро­ может быть подключено несколько ведомых
низации) — на одном из контактов и осущест­ устройств, каждое из них имеет контакт для
вляет обмен данными по каждому импульсу. его выбора ведущим устройством. Чтобы вы­
Преимущество последовательного синхронного брать определенное ведомое устройство, ве­
протокола состоит в том, что он позволяет под­ дущее устройство устанавливает низкий уро­
ключить к шине несколько устройств под управ­ вень на этом контакте. Если на этом контакте
лением одного главного контроллера. Но при этом установлен высокий уровень, устройство от­
каждый протокол реализует шину по-своему. ключено от шины.
Интерфейс SPI реализуется тремя или четырьмя В библиотеке SPI для Arduino для линии MOSI
линиями между устройством контроллером (или используется вывод 11, для MISO — вывод 12,
ведущим устройством) и периферийным (или ве­ а для сигнала тактирования — вывод 13. По умол­
домым) устройством (рис. 4.3): чанию для сигнала Выбор схемы применяется
вывод 10, но можно также использовать и другие
• сигнал тактирования (Clock) — вывод, на
выводы, как мы далее увидим. Например, к шине
который ведущее устройство подает регуляр­
SPI платы Arduino Ethernet и шилда Ethernet под­
ные сигналы тактирования;
ключено два устройства: микросхема WIZnet
и карточка памяти SD. Оба эти устройства под­
2 Serial Peripheral Interface — последовательный интерфейс
периферийных устройств. ключены к выводам 11, 12 и 13 для сигналов
3 Inter-Integrated Circuit — шина данных для связи интеграль­ MISO, MOSI и тактирования, соответственно.
ных схем. Для сигнала выбора схемы в модуле WIZnet ис­
4 Two-Wire Interface — двухпроводной интерфейс. пользуется вывод 10, а в карточке SD — вывод 4.
160 Глава 4

Ведущий Рис. 4.3. Схема


интерфейса SPI

П роект 6

Привет, Интернет! Веб-сервер цвета дня


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

Требуемые компоненты

►Плата Arduino Ethernet, 1 шт. ►
►Фотодатчики (светочувствительные
резисторы), 3 шт.

►Модуль Arduino, 1 шт., шилд Arduino
Ethernet, 1 шт. ►
►Беспаечная макетная плата, 1 шт.

►Устройство с Ethemet-подключением ►
►Светофильтры, 3 шт.: красный, зеленый
к Интернету, 1 шт. и синий.


►Сопротивления по 10 К, 3 шт.
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 161

Установка соединения
Если вы используете плату Arduino Ethernet, про­
сто вставьте ее в адаптер USB/TTL-Seriai и она ото­
бразится в списке последовательных портов, как
и обычная плата Arduino. Питание на плату будет
подаваться через адаптер USB/TTL-Serial как через
обычный кабель USB. Плата Arduino Ethernet про­
граммируется, как и обычная плата Arduino, соот­
ветственно в меню Сервис | Плата среды Arduino
выберите плату Arduino Uno или Arduino Ethernet.

Шилд Ethernet, как и многие другие шилды для


Arduino, очень легко подключается к контролле­
ру, его просто нужно вставить в соответствующие
разъемы. Шилд, как и Ethemet-модуль, исполь­
зует выводы 10, 11, 12 и 13 для взаимодействия
с контроллером Ethernet, а выводы 4, 11, 12 и 13 —
для взаимодействия с карточкой SD, поэтому эти
выводы нельзя использовать для других целей.
Подсоедините Ethernet модуль к маршрутизатору
с помощью кабеля Ethernet. На рис. 4.4 показано
подключение шилда Arduino Ethernet к микрокон­
троллеру Arduino.

Поскольку плата Arduino Ethernet взаимозаменяема


Рис. 4.4. Подсоедините шилд Arduino Ethernet
с шилдом Ethernet, соединенным с обычной платой
к микроконтроллеру Arduino, просто вставив штыревые
Arduino, в дальнейшем любое из этих устройств мы выводы первого в соответствующие гнезда второго
будем называть просто модуль Ethernet.

Для определения цвета окружающего освещения какие применяются для вывода данных на по­
мы воспользуемся тремя фотодатчиками, накрыв следовательный порт Мы создадим два типа про­
каждый из них отдельным светофильтром: крас­ граммных объектов: сервер и клиент. Как и обыч­
ным, зеленым и синим. Эти фильтры можно при­ ные серверы, наш сервер ожидает подключений от
обрести во многих магазинах осветительного или удаленных устройств в Интернете и позволяет им
фотографического оборудования или в магазинах подключиться к модулю Ethernet. Так же, подобно
художественных материалов. Но не обязательно ис­ обычным клиентам, наш клиент инициирует под­
пользовать специальные фильтры — можно взять ключение к удаленным устройствам, отправляет
любой прозрачный пластик соответствующего цве­ запросы, и принимает ответы от них. Как серверу,
та. В этом вопросе научного подхода не требуется. так и клиенту можно передавать и получать от них
Подсоединение фотодатчиков к модулю Ethernet данные, используя команды read () ,write () ,print ()
показано на рис. 4.5. и printin (), присущие библиотеке Serial. Так же,
как и в библиотеке Serial, в библиотеке Ethernet есть
команда available о , которая применяется для про­
Принцип работы библиотеки Ethernet
верки на наличие новых данных от соответствую­
Для начала нам нужно создать пару простых про­ щего сервера или клиента. А для объекта-клиента
грамм, используя библиотеку Ethernet для Arduino. имеется команда connected о , которая определяет,
Эта библиотека позволяет управлять модулем подключен ли клиент к удаленному серверу. Эти
Ethernet посредством методов, подобных тем, команды нам пригодятся в дальнейшем, когда мы
162 Глава 4

A R EF
Reset GND
+3.3V D13
+5V D12

+5V Gnd D11/PWM


Gnd D10/PWM
L / 1\J t 1
V V IVI

Vin D9/PWM
D8
Модуль Arduino

D7
D6/PWM
Analogo D5/PWM
A11
n D4
A2 D3/PWM
A3 D2
A4 Digitali/TX
A5 DigitalO/RX

10 К

Рис. 4.5. Схема RGB-сервера: монтажная (а) и принципиальная (б).


Монтаж деталей одинаковый для платы Arduino Ethernet и для модуля Arduino с шилдом Ethernet.
Обратите внимание на три цветных светофильтра на фотодатчиках
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 163

попытаемся подключиться к удаленному серверу, другим. Например, если локальный адрес маршру­
чтобы получить данные. Но пока мы начнем с про­ тизатора: 192.168.1.1, ЕШете^модулю можно при­
стого скетча сервера. своить 1Р-адрес 192.168.1.20 — при условии, что
этот адрес еще не используется каким-либо другим
Однако прежде, чем приступать к написанию про­ устройством, подключенным к маршрутизатору.
граммы, нам надо уточнить основные параметры,
с которыми наш модуль Ethernet будет подклю­ Когда маршрутизатор присваивает 1Р-адреса под­
чаться к Интернету. Как и в проекте главы 3, нам ключенным к нему устройствам, он маскирует
понадобится МАС-адрес устройства. Как вы долж­ часть адресного пространства, чтобы устройствам
ны помнить, это аппаратный адрес контроллера присваивались адреса только в той же самой под­
Ethernet. Этот шестибайтовый номер нанесен на сети, к которой принадлежит сам маршрутизатор.
обратной стороне платы модуля Arduino Ethernet Например, если маршрутизатор будет присваи­
в шестнадцатеричном формате. Если наклейка вать своим устройствам только адреса в диапазоне
с номером по какой-либо причине отсутствует, плате 192.168.1.2— 192.168.1.254, он тем самым маскиру-
можно присвоить свой номер или же один из общих ет три первые группы номера (октеты). Эта маска
номеров из рассматриваемых далее примеров. Нам называется маской подсети. В настройках сетевого
также нужно знать IP-адрес маршрутизатора (назы­ адаптера персонального компьютера маска указы­
вающийся IP-адресом шлюза, поскольку маршрути­ вается следующим образом: 255.255.255.0.В таком
затор является шлюзом к остальному Интернету), же самом формате мы укажем маску подсети и для
а также IP-адрес, который наш модуль Ethernet бу­ нашего модуля ЕЛетеЕ
дет использовать в подсети маршрутизатора.
Определившись с 1Р-адресом маршрутизатора
IP-адрес нашего Ethemet-модуля будет схож с IP- и ЕШеше^модуля, МАС-адресом ЕШете^модуля
адресом маршрутизатора одинаковыми первыми и маской подсети, мы готовы двигаться дальше.
тремя октетами, но последний октет должен быть

Ш Пишем код Веб-сервер


Для управления модулем Ethernet Контекст : Arduino
нам сначала нужно включить */
в наш скетч библиотеки SPI и
Ethernet. Надо также определить #include <SPI.h>
и инициализировать переменную #include <Ethernet.h>
для хранения экземпляра сер­
вера. Сервер будет работать на Server server(80);
порту 80, стандартном для веб­
серверов. // Вместо выделенных жирным шрифтом значений укажите
// значения для ваших устройств и сети
Кроме того, нам следует опре­ byte mac[] =- { 0x00, ОхАА, ОхВВ, OxCC, OxDE, 0x01
делить и инициировать четыре IPAddress gateway(192,168,1,1);
переменные для МАС-адреса IPAddress subnet(255,255,255,0);
ЕШеше^модуля, 1Р-адреса IPAddress i p (192,168,1,20);

Е&ете^модуля, 1Р-адреса шлюза


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

164 Глава 4

алее определяем метод j void setup()


setup о , в котором запускаем ] {
модуль Ethernet и сервер, а так- ! // Запускаем модуль Ethernet и сервер:
же открываем последовательное ] Ethernet.begin(mac, ip, gateway, subnet);
подключение на случай необ- j server.begin();

ходимости отладки. I Serial.begin(9600);

Ш В главном цикле сервер все \ void loop()


время ожидает подключения от I {
удаленного клиента. После под- ] // Ждем подключений от клиентов
ключения сервер ожидает от кли- ] Client client = server.available();

ента запрос НТТР (как подробно | if (client) {


while (client.connected()) {
рассматривалось в главе 3). Цикл I
if (client.available()) {
не содержит кода для ответа кли- \
char thisChar = client.read();
енту на этот запрос, но при этом |
Serial.write(thisChar);
показывает нам, что клиент за- I
прашивает: I
// Закрываем подключение:
client.stop();

Jp Ф Запустите этот скетч на исполнение с мо- Большая часть параметров запроса HTTP не пред­
Ш В дулем Ethernet, подсоединенным к марш­ ставляет для нас никакого интереса, но пара пара­
рутизатору, и открытом окне монитора порта. метров из них все же весьма полезны: первая стро­
Затем запустите веб-браузер и откройте в нем IP- ка, в которой мы видим, что запрашивает клиент,
адрес модуля Arduino. В данном примере это адрес а также конечная часть, где клиент посылает пу­
http://i92.i68.1.20, но вам нужно будет ввести стую строку, чтобы завершить запрос. Здесь первая
в строку адреса браузера IP-адрес вашего модуля строка показывает, что клиент запрашивает глав­
Arduino. В окне браузера не появится никакого от­ ную страницу в корневой папке сервера, обозна­
вета на запрос HTTP, но мы увидим в окне монито­ ченной символом косой черты в команде g e t : g e t /.
ра порта, что запрос дошел до скетча сервера. Это В нашем случае возвращается только один резуль­
то содержимое, которое видел сервер, когда мы де­ тат, но позже мы создадим более сложный сервер,
лали запрос HTTP в главе 3. Типичный запрос будет который исследует эту часть запроса и возвратит
выглядеть следующим образом: в зависимости от запроса разные результаты.
GET / HTTP/1.1
Но на данном этапе мы не будем усложнять свою
Host: 192.168.1.1
Connection: keep-alive
задачу и просто исследуем конец запроса (см. фраг­
Accept: application/xml,application/xhtml+xml,text/
мент кода далее). Там мы найдем символ перевода
html;q=0.9,text/plain;q=0.8,image/png,*/*;q^0.5
строки (\п или ASCII 10), за ним символ возврата
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X каретки (\г или ASCII 13), а затем еще один пере­
10_6_5; en-US) AppleWebKit/534.10 (KHTML, like Gecko) вод строки. На рис. 4.6 показана блок-схема работы
Chrome/8.0.552.215 Safari/534.10 этого кода.
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 165

Ш Г Теперь изменим главный void loop ()


цикл, добавив в него код, выде­ {
ленный жирным шрифтом, после // Ждем подключений от клиентов
Client client = server.available();
Serial.write(thisChar) I
if (client) {
Serial.println(«Got a client»);
String requestLine = «»;

while (client.connected()) {
if (client.available()) {
char thisChar = client.read();
// Полученные перевод строки и пустая линия
// запроса означают конец запроса:
if (thisChar = '\n' && lineLength < 1) {
// Посылаем стандартный заголовок ответа HTTP:
makeResponse(client);
break;
}
// Перевод сороки или возврат каретки означает,
// что мы в конце сороки:
if (thisChar == '\n' || thisChar = ’\r') {
lineLength = 0;
> »
166 Глава 4

DI else {
// Для любого другого символа, увеличиваем
// длину сороки:
lineLength++;
}

}
// Даем браузеру время, чтобы получить данные:
delay(1);
// close the connection:
client.stop();

ш Прежде чем этот скетч можно void makeResponse(Client thisClient) {


будет запустить на выполнение, thisClient.print(«НТТР/1.1 200 OK\n»);
в его конец следует добавить ме­ thisClient .print («Content-Type: text/html\n\n>>) ;
тод шакеКезропзе (), создающий thisClient.print("Привет от Arduino!</headxbody>\n") ;
строку для отправки клиенту: thisClient.printIn("</body></html>\n");
}

0 dt Теперь, когда мы введем IP-адрес модуля к любому другому содержимому, которое мы хо­
В В Arduino в строку адреса браузера, сервер тим предоставить пользователю, будь то данные
возвратит страницу. Пусть это самая простенькая физических датчиков или какие-либо данные из
страница, но она отвечает всем требованиям насто­ Интернета. Насколько сложным его сделать, зави­
ящей веб-страницы, и наш веб-браузер не видит ни­ сит от ваших намерений, требований и возможно­
какой разницы между нашим сервером на Arduino и стей. Но, научившись креативно использовать воз­
любым другим «настоящим» веб-сервером. В метод можности операторов print о и printino, вы об­
makeResponse о МОЖНО добавить КОД HTML ДЛЯ лю­ ретете широкий диапазон методов динамического
бого содержимого, даже ссылки на изображения и генерирования веб-интерфейса для модуля Arduino
содержимое, находящееся на других серверах. Наш посредством шилда Ethernet.
сервер Arduino можно рассматривать, как портал

Ш Например, выведем на экран void makeResponse(Client thisClient) {


состояния аналоговых вводов. thisClient.print(«HTTP/1.1 200 OK\n»);
Для этого добавим следующий thisClient.print(«Content-Type: text/html\n\n»);
код (выделен жирным шрифтом) thisClient .print («<htmlxhead>»);
thisClient.print(«<title>Hello from Arduino</title></
В метод makeResponse ()!
headxbody>\n») ;

// Выводим значение каждого контакта аналогового ввода:


for (int analogChannel = 0; analogChanne1 < 6;
analogChannel++) {
thisClient.print(«analog input «) ;
thisClient.print (analogChannel);
thisClient.print(« is « ) ;
thisClient.print(analogRead(analogChannel));
thisClient.print(«<br />\п»);
}
thisClient .println ("</bodyx/html>\n") ;
} ►►
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 167

Ш Перезагрузив страницу в веб­ thisClient .print («Content-Type: text/html\n\n>>) ;


браузере, мы увидим на ней со­ thisClient.print (
стояние аналоговых вводов. Но "<htmlXheadXmfita http-equiv=\"refresh\" content=\"3\">") ;
как сделать, чтобы постоянно
отображать обновленные состоя­
ния этих вводов? Для этого
можно использовать методы из
проекта Cat Cam, рассмотрен­
ного в главе 3. Измените в ме­
тоде makeResponse () Строку кода,
которая формирует заголовок
HTML, следующим образом (до­
бавленный код выделен жирным
шрифтом):

О В ответе сервера можно вы­ thisClient .print («Content-Type: text/html\n\n>>) ;


полнять разного рода действия. thisClient.print (
Воспользуемся этими возможно­ «<htmlxhead><meta http-equiv=\»refresh\» content=\»3\»>») ;
стями для задействования наших thisClient.print("<title>npHBep от Arduino</titleX/head>») ;
трех фотодатчиков, присоеди­ // Задаем тег цвета фона страницы:

ненных к аналоговым вводам. thisClient.print ("<body bgcolor=#");

Для этого снова добавим в метод // Считываем показания трех аналоговых датчиков:

makeResponse () КОД — на ЭТОТ раз


int red =analogRead(AO) /4;
int green = analogRead(Al)/4;
для возврата страницы, цвет фона
int blue = analogRead(A2) /4 ;
которой устанавливается в зави­
// Отображаем показания одной строкой в шестнадцатеричном формате:
симости от значений показаний
thisClient.print (red, HEX) ;
этих фотодатчиков (добавленный thisClient. print (green, HEX) ;
код выделен жирным шрифтом): thisClient. print (blue, HEX) ;
// Закрываем тег:
Испытайте ваш «цветной» сер­ thisClient.print (">") ;
вер, освещая фотодатчики светом // Закрашиваем фон HTML-страницы:
разного цвета. thisClient. print ("Цвет освещения на Arduino —#") ;
thisClient. print (red, HEX) ;
thisClient.print (green, HEX) ;
thisClient.println(blue, HEX) ;
// Закрываем страницу:
thisClient.println («</bodyX/html>\n») ;
}
168 Глава 4

П ред о ставлен и е д о ступ а из И нтернета


к у стр о й с тв у с частны м IP-адресом
До сих пор все наши интернет-проекты работа­ IP-адресу маршрутизатора по этому порту будут
ли лишь на локальной подсети или же только от­ перенаправляться к частному IP-адресу модуля
правляли данные наружу и ожидали ответа. Это Ethernet по заданному для него порту. Обратите
наш первый проект, в котором устройство должно внимание, что маршрутизатор может резервиро­
быть видимым из Интернета без каких бы то ни вать некоторые порты для специальных целей.
было ограничений. Пока же к нему можно об­ Например, нельзя перенаправить порт 80, так как
ращаться из его же локальной сети, но если оно маршрутизатор использует этот порт для своего
подключено к вашему домашнему маршрутизато­ собственного интерфейса. Поэтому нужно будет
ру и имеет частный 1Р-адрес, оно не будет видимо задать более высокий порт — например, 8080.
для других устройств вне вашей домашней сети.
По умолчанию веб-браузеры направляют свои за­
Чтобы преодолеть это препятствие, нам нужно,
просы на порт 80, но запрос можно направить на
чтобы один из портов маршрутизатора пересылал любой порт, указав его номер в конце адреса сер­
входящие сообщения и запросы подключения на­ вера, как показано в следующем примере:
шему шилду ЕЙтетеЕ
http://www.myserver.com:8080/
Для этого откройте интерфейс администри­
Таким же образом осуществляется доступ че­
рования вашего маршрутизатора и найдите в
рез публичный адрес маршрутизатора к наше­
нем элементы управления под названием Port
му модулю Ethernet. Например, если публичный
forwarding или Port mapping. Интерфейс управ­
IP-адрес вашего маршрутизатора 203.48.192.45,
ления маршрутизатора зависит от конкретного
то для доступа к вашему серверу Arduino в
изготовителя и модели маршрутизатора, но обыч­
строку адреса веб-браузера нужно ввести адрес
но эти настройки имеют одно из таких названий.
http://203.48.192.56:8080.
Лучше всего, если перенаправленный (forwarded)
порт маршрутизатора будет таким же, что и от­ На рис. 4.7 и 4.8 показаны настройки nej' "направ­
крытый порт модуля Ethernet. Поэтому настройте ления порта на маршрутизаторе Apple AirPort
маршрутизатор, чтобы его порт 80 подключался Express и беспроводном маршрутизаторе Linksys,
к порту 80 шилда Ethernet (если такая настрой­ соответственно. На маршрутизаторе Linksys на­
ка на вашем маршрутизаторе вообще возмож­ стройки перенаправления порта находятся на
на). После выполнения этой настройки все вхо­ вкладке Advanced.
дящие запросы для подключения к публичному

Рис. 4.7. Вкладка Advanced маршрутизатора Apple Рис. 4.8. Настройки перенаправления портов
AirPort Express для настроек перенаправления портов на беспроводном маршрутизаторе Linksys
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 169

ШП рилож ение в стр о е н н о го се те во го клиента


Теперь, когда наш сервер готов, пора создавать клиента. Мы создадим его в этом проекте
в виде веб-экстрактора. Наш проект берет данные существующего веб-сайта и использует их
для воздействия на физический вывод. Концептуально он похож на устройства таких компа­
ний, как Ambient Devices или Nabaztag5, но это будет полностью ваше собственное творение.

Проект 7

Сетевой измеритель качества воздуха


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

Принцип работы проекта показан на рис. 4.9: мик­


роконтроллер создает сетевое подключение к сце­ Требуемые компоненты
нарию РНР через шилд Ethernet. Сценарий РНР
подключается к другой веб-странице, считыва­ ►
►Плата Arduino Ethernet, 1 шт.
ет с нее число и отсылает его микроконтроллеру. ►
►Шилд Arduino Ethernet, 1 шт.,
Микроконтроллер использует полученное число, и модуль Arduino, 1 шт.
чтобы переместить индикаторную стрелку вольтме­

►Устройство с Ethemet-подключением
тра. Подключение осуществляется к веб-странице
к Интернету, 1 шт.
AIRNow — Агентства по охране окружающей сре­
ды США, w ww .airnow.gov. На этой веб-странице ►
►Беспаечная макетная плата, 1 шт.
предоставляются данные о качестве воздуха во

►Вольтметр, 1 шт.
многих городах США. По завершению проекта
вы сможете получить информацию о качестве воз­ ►
►Светодиоды, 4 шт.
духа в своем городе (при условии, что вы живете

►Сопротивления по 220 Ом, 4 шт.
в США) по показанию вольтметра, устанавливае­
мому данными с этой веб-страницы.

Управление вольтметром
можно получить среднее напряжение. Чем выше
с помощью микроконтроллера
отношение времени включенного состояния к вре­
Прежде всего нам нужно генерировать с помощью мени отключенного для каждого импульса, тем
микроконтроллера изменяющееся напряжение для выше среднее напряжение. Этот метод называется
управления вольтметром. Микроконтроллеры не широтно-импульсной модуляцией (ШИМ). Чтобы
приспособлены выводить аналоговые сигналы, но сигнал ШИМ отображался в виде аналогового на­
они могут генерировать высокочастотные после­ пряжения, время реакции схемы, получающей им­
довательности импульсов, отфильтровав которые пульсы, должно быть намного более медленным,

5 Ambient Devices, Nabaztag — производители так называемых устройств окружения (ambient devices). Устройства окружения пред­
ставляют собой новый вид устройств бытовой электроники, которые применяются для предоставления текущей информации, варьи­
рующейся от прогноза погоды до сообщений о ситуации на дорогах и биржевых котировок.
170 Глава 4

Рис. 4.9. Блок-схема сетевого


Микроконтроллер устанавливает измерителя качества воздуха
напряжение на вольтметре, используя ШИМ

чем частота импульсов. Например, если подавать Подсоединив положительный вывод вольтметра
сигнал ШИМ на светодиод, будет казаться, что он к выводу микроконтроллера, а отрицательный —
тускнеет, так как человеческий глаз не способен к общему, мы увидим, что подаваемый на вывод ми­
уловить импульсы, включающиеся и выключающи­ кроконтроллера ШИМ сигнал хорошо отображает­
еся чаще, чем 30 раз в секунду. А аналоговые инди­ ся положением индикаторной стрелки. На рис. 4.10
каторы напряжения на изменяющееся напряжение показана принципиальная и монтажная схемы для
реагируют медленно, поэтому хорошо подходят проекта.
для визуального отображения сигналов ШИМ.
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 171

Рис. 4.10. Монтажная (а)


и принципиальная (б) схемы
t I I подключения вольтметра к сети.
Показанный на принципиальной
схеме контроллер Ethernet может
находиться как на плате Arduino
Ethernet, так и на шилде Ethernet
Светодиоды
Зеленый
у / Желтый
/ у / Красный
Синий

Reset GND
+3 3V CLK
+5V Контроллер MOSI
Gnd Ethernet MISO
Gnd E th .S S
Vin
S D card S S

A REF
Reset GND
+3 3V D13
+5V D12
Gnd D11/PWM
Gnd D10/PWM
Vin D9/PWM
D8
~ © “3 _
Модуль Вольтметр
Arduino
D7
D6/PWM

Analogo D5/PWM

A1 D4

A2 D3/PWM

A3 D2

A4 Digitali/TX

A5 DigitalO/RX Ф^ ф # фР

б Светодиоды
172 Глава 4

саг Следующая программа вы­


полняет проверку, реагирует ли Проверка вольтметра
вольтметр на подаваемый на него Использует команду analogWrite() для управления вольтметром.
сигнал: Контекст : Arduino

Диапазон значений переменной */


рш1Уа1ие нужно откорректировать const int meterPin = 9;
в зависимости от чувствитель­
ности вашего вольтметра. Вольт­ int pwmValue = 0 ; // Значение, подаваемое на вольтметр
метры, которые использовались
в разработке этого проекта, име­ void setup () {
ли разные диапазоны измерений. Serial.begin(9600);
Диапазон измерений вольтметра,
указанного в списке деталей, был
0—5 В, и значения этой перемен­ void loop() {
ной в программе охватывают весь // Перемещаем стрелку вольтметра с самого нижнего
его диапазон. Но мой старинный / / в самое верхнее положение:
вольтметр имеет диапазон из­ for (pwmValue = 0; pwmValue < 255; pwmValue ++) {
мерений 0—3 В, поэтому мне analogWrite(meterPin, pwmValue);
пришлось ограничить верхний Serial.println(pwmValue);
предел переменной рш\Уа1ие зна­ delay(10);
чением 165, при котором стрелка }
отклонялась в максимально воз­ delay(1000);
можное положение. Определите // Сбрасываем значение сигнала к нулю и берем паузу:
минимальное и максимальное analogWrite(meterPin, 0) ;
значения переменной рш1Уа1ие |
delay(1000);
для своего вольтметра экспери- ;
ментальным путем. Эти значения |
потребуются позже для сопостав- I
ления показаний качества возду- ;
ха шкале вашего вольтметра.

/ / Сценарий PHP
В Я для чтения веб-страницы
Теперь нам нужно получить данные с веб-страницы нужно будет установить на вашем веб-хосте. Доступ
AIRNow в формате, распознаваемом микроконт­ к этому веб-хосту микроконтроллер осуществляет,
роллером. Микроконтроллер может считывать ко­ открывая к нему ТСР-подключение, используя в ка­
роткие строки символов ASCII, преобразование честве шлюза Интернета контроллер Ethernet.
которых в соответствующие двоичные числа — до­
вольно простая задача. Микроконтроллер также
может выполнить анализ текста веб-страницы, хотя Как установить РНР на свой компьютер?
это будет уже несколько более сложной задачей. Приведенный здесь сценарий также можно установить
Но для решения таких задач как раз и был создан на компьютере в домашней сети. При условии, что
микроконтроллер находится в той же самой сети, он
язык РНР. Далее приводится сценарий РНР, кото­ сможет подключиться к этому компьютеру и запросить
рый считывает веб-страницу AIRNow, извлекает этот сценарий РНР. Информацию о том, как установить
из нее значение индекса AQI6 и создает более про­ РНР на свой компьютер или как найти поставщика
стую сводную страницу, которая легко поддается услуг веб-хостинга, предоставляющего возможности
РНР, см. по адресу www.php.net/manual/en/tutorial.
чтению микроконтроллером. Этот сценарий РНР php#tutorial.requirements.

6 AQI, Air-Quality Index — показатель качества воздуха.


«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 173

Рис. 4.11. Форматирование


страницы AIRNow позволяет
с легкостью извлекать из нее
данные. Сценарий РНР для
этого проекта уровень озона
не учитывает

На рис. 4.11 показана страница AIRNow для горо­ Разработчики страницы изменили ее формат?
да Нью-Йорка (http://airnow.gov/7actionRairnow. Одной из самых серьезных проблем в создании прило­
local_city& zipcode=10003& subm it=G o). жений, извлекающих данные из веб-страниц, является
Форматирование страницы AIRNow делает ее хо­ возможность того, что разработчики страницы могут
рошо поддающейся для извлечения из нее нужных изменить ее формат. В таком случае ваше приложение
прекратит работать, и вам придется откорректировать
данных. Число показателя AQI четко обозначено его код. Собственно говоря, такое развитие событий
в тексте, и если удалить все сопутствующие теги имело место в промежутке между первым и вторым
HTML, оно будет находиться на одной строке кода, изданием данной книги. По этой причине извлечение
всегда следуя за строкой Current Conditions. данных из веб-сайта лучше поручить сценарию PHR
Модифицировать код РНР более удобно, чем перепро­
граммировать микроконтроллер.

<?php
Ш Доставка страницы
/*
Следующий сценарий РНР от­ AIRNow Web Page Scraper
крывает веб-страницу AIRNow Контекст : PHP
и выводит ее на экран построч­ */
но. Команда fgetsso считывает
строки текста страницы и удаля­ // Определяем переменные:

ет из них все теги HTML. // инь страницы, содержащей данные показателя качества
// воздуха для г. Нью-Йорка
$url =
'http://airnow.gov/index.cfm?action=airnow.
showlocal&cityid=164';

// Открываем файл, заданный в URL, для чтения:


$filePath = fopen ($url, "г") ;
174 Глава 4

Ш Сохраните этот сценарий на // Выполняем, пока не дойдем до конца файла:


своем веб-сервере, а затем от­ while (!feof ($filePath) )

кройте его в браузере. В резуль­ {


// Считываем по одной строке за раз и удаляем из считанной строки
тате исполнения сценария в окне
/7 все теги HTML и РНР:
браузера должен отобразиться
$line = fgetss ($filePath, 4096);
текст страницы AIRNow без изоб­
echo $line;
ражений и тегов разметки HTML.
}
В таком виде этот текст не очень
// Обработка завершена, закрываем файл:
читаем, но если просмотреть ис­ fclose ($filePath) ;
ходный код страницы (выбрав
?>
последовательно команды меню
браузера Вид | Средства раз­
работки | Исходный код), то
он становится более понятным.
Прокрутите страницу вверх, пока
не найдете следующие строки:
Current Conditions
Air Quality Index (AQI)
observed at 17:00 EST
45

Это есть тот текст, который нам


нужен.

Ш Извлечение // Следует ли проверять значение на текущей считываемой строке:


$checkForValue = false;
Чтобы извлечь необходимые дан­
ные из этих строк, нам нужно // Значение показания качества воздуха:
добавить в наш сценарий пару $airQuality = -1;
переменных — так что добавь­
те следующий код в команду
fopen():

Ш Затем замените команду echo // Если текущая строка содержит текст «Current Conditions»,
$line; в программе следующим // тогда следующая строка, содержащая целое число, представляет
кодом: // качество воздуха:
if (preg_match('/Current Conditions/', $line)) {
В этом блоке кода команда preg_
$checkForValue = true;
match () используется для обнару­
}
жения строки текста, совпадаю­
щей с указанным шаблоном, ко­
торым в данном случае является
TeKCT Current Conditions. Когда
мы видим эту строку, то понима­
ем, что следующая строка, содер­
жащая целое число, как раз и бу­
дет той, что нам требуется. Когда
сценарий РНР находит эту стро­
ку, он присваивает переменной
$checkForVaiue значение true. и
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 175

Ш Теперь добавьте следующий if ($checkForValue == true && (int)$line > 0){


блок кода после кода, который $airQuality = (int)$line;
мы только что добавили: $checkForValue = false;

Этот код выполняет проверку,


равно ли значение переменной
$checkForValue З н а чению true,
а также, содержит ли текущая
строка только целое число и ни­
чего более. Если да, то програм­
ма считывает следующую строку
текста и преобразовывает ее в
целочисленное значение. Так что
действительное целочисленное
значение будет получено только
тогда, когда программа дойдет до
строки, содержащей значение ка­
чества воздуха.
I f f Наконец, добавьте следую­ echo «Air Quality:». $airQuality;
щий код в конец сценария после // Обработка завершена, закрываем файл:
цикла while. Этот код В Ы ВОДИТ foiose ($filePath) ;
на экран показатель качества воз­
духа и закрывает подключение
к веб-сайту.
Теперь результат исполнения
этого сценария будет выглядеть
в браузере следующим образом:
Air Quality: 43

Вот мы и получили короткую строку текста, с которой может работать наш микроконтроллер. Даже если
сценарий не возвращает результата, значение -1 укажет нам, что не было выполнено подключение.

1 Считываем сценарий РНР,


используя микроконтроллер
Теперь нам нужно запросить сценарий РНР через программы: Processing, Arduino или иной язык дру­
Интернет, используя модуль Ethernet. На этот раз мы гого микроконтроллера — последовательность ша­
будем применять этот модуль в качестве клиента, а гов во всех случаях будет одна и та же:
не сервера. Но прежде чем начать программировать,
нужно продумать последовательность сообщений. 1. Открываем подключение к веб-серверу.
Использование модуля Ethernet в качестве сетевого 2. Отправляем запрос HTTP GET.
клиента очень похоже на использование в этой роли
Processing. В обоих случаях нам нужно знать пра­ 3. Ждем ответа.
вильную последовательность сообщений, которые 4. Обрабатываем ответ.
требуется отправить, и формат ответов на эти со­ 5. Выжидаем соответствующий интервал и повто­
общения. Кроме того, нам надо создать программу ряем процедуру.
для управления обменом сообщений. Независимо
от используемой платформы для написания этой Блок-схема этой процедуры показана на рис. 4.12.
176 Глава 4

Рис. 4.12. Блок-схема


программы Arduino для
отправки запроса HTTP
GET и обработки ответа

Основные решения (операторы if в коде) обозна­ воздуха, программа считывает его и устанавлива­
чены ромбами, а исполняющие методы — пря­ ет соответствующее напряжение на вольтметре.
моугольниками. Разметка логики всей программы В случае проблемы с установлением подключения,
в такой блок-схеме поможет вам быть в курсе того, программа повторяет попытку через две минуты.
что происходит в любой точке программы. Это так­ Поскольку программа является не сервером, а кли­
же поможет увидеть, какие методы зависят от того, ентом, у этого проекта нет веб-интерфейса.
имеет или нет определенное условие значение true
(истина). Библиотека TextFinder
В схеме этого проекта также используются под­ Для этого скетча нам потребуется библиотека
соединенные к контактам ввода/вывода светодиоды TextFinder для Arduino, разработанная Майклом
для наблюдения за состоянием программы. Один Марголисом (Michael Margolis). Библиотека Text­
светодиод указывает, когда подключение выполне­ Finder позволяет выделить текстовую подстроку из
но, другой — когда разорвано, третий — когда по­ входящего потока байтов. Она может использовать­
лучено действительное показание, и четвертый — ся как для приложений Ethernet, так и для приложе­
выполнение микроконтроллером сброса. ний последовательной связи, как мы увидим далее.
Программа проверяет сценарий РНР каждые две ми­ Загрузите эту библиотеку с адреса www.arduino.cc/
нуты. Если в наличии есть новое значение качества playground/Code/TextFinder, распакуйте и сохра­
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 177

ните папку TextFinder в папке libraries папки скет­ тека TextFinder отобразится в списке Скетч |
чей Arduino. (На машинах под Mac OS X папкой Импортировать библиотеку.
библиотек по умолчанию будет Documents/Arduino/
Разработчики Arduino рассматривают возможность
libraries/, на машинах под Windows 7 — Мои до- включения библиотеки TextFinder в версию среды
KyMeHTbi\Arduino\libraries, а на Ubuntu L in u x ------/ разработки Arduino 1.0, если это случится, устанав­
Documents/Arduino/libraries/.) Если папки библиотек ливать ее не понадобится. Поэтому предваритель­
не существует, создайте ее сами, а затем скопируй­ но проверьте раздел Reference веб-сайта Arduino
те в нее папку библиотеки TextFinder. Закройте, (www.arduino.ee) на предмет последних обнов­
а затем снова запустите среду Arduino, и библио­ лений.

Ш Подключение ___ /*
AirNow Web Scraper
Начнем программу с включения Контекст: Arduino

в нее библиотек SPI и Ethernet — */


так же, как и в предыдущем про­ #include <SPI.h>
екте. Затем определим контакты #include <Ethernet.h>
#include CTextFinder.h>
вывода и зададим минимальное
и максимальное значения для const int connectedLED = 2; // Указывает подключение TCP
вольтметра, определенные экс­ const int successLED = 3; // Указывает успешное чтение
периментальным путем ранее, const int resetLED = 4; // Указывает сброс Arduino
const int disconnectedLED = 5; // Указывает подключение к серверу
а также время между запросами const int meter P m = 9; // Управляет вольтметром
HTTP. Все эти переменные име­ const int meterMin = 0; // Минимальный уровень вольтметра
ют тип целого числа (mt): const int meterMax = 200; // Максимальный уровень вольтметра
const int AQIMax = 200; // Максимальный уровень
// качества воздуха
const int requestlnterval = 10000; // Задержка между
// обновлениями на сервер

ВТДалее, инициализируем не­ byte mac[] = { 0x00, ОхАА, ОхБВ, OxCC, OxDE, 0x01 };
сколько переменных типа «мас­ IPAddress i p (192,168,1,20);<
► ► Вместо выделенных
сив» данными сетевой конфигу­ IPAddress server(208,201,239,101) ;< жирным шрифтом значений
рации для модуля. укажите значения для вашего
^устройства и сервера_______ ,

_ ------------------------
------------ —

Iш Наконец, нужно добавить гло­ // Инициализируем библиотеку клиента Ethernet


бальную переменную для класса Client client;
c l i e n t , а также несколько пере­ boolean requested; // Был ли сделан запрос
long lastAttemptTime = 0; // Время последнего подключения
менных, связанных с выполнени­
/ / к серверу
ем транзакции с сервером: int airQuality = 0 ; // Значение показателя А01
boolean meterlsSet = false; // Задано ли значение
// для вольтметра

ш Метод setup () запускает void setup() {


Ethemet-подключение и последо­ // Запускаем подключение Ethernet:
Ethernet.begin(mac, ip);
вательное подключение, задает
// Запускаем последовательное подключение:
все контакты светодиодов в каче­ Serial.begin(9600);
стве выводов, мигает светодио­ // Устанавливаем все контакты светодиодов состояния:
дом сброса и делает первую по­ pinMode(connectedLED, OUTPUT);
пытку подключиться к серверу: pinMode(successLED, OUTPUT);
pinMode(resetLED, OUTPUT);
pinMode(disconnectedLED, OUTPUT);
pinMode(meterPin, OUTPUT); ►

178 Глава 4

=Щи О пред елени е IP-адреса се те во го узла___________


В этом проекте используются не имена узлов, а их IP-адреса. Узнать IP-адрес сетевого узла можно
с помощью команды ping, которую мы рассматривали в главе 3. Например, если в консоли командной
строки выполнить команду:
ping -n 1 www.oreillynet.com

(для компьютеров под Linux используйте -с вместо -п), мы получим следующий ответ, содержащий
требуемый IP-адрес:
Обмен пакетами с www.oreillynet.com [208.201.239.100] с 32 байтами данных:
Ответ от 208.201.239.100: число байт=32 время=241мс TTL=37

Если команду ping отдать не удастся (некоторые поставщики услуг Интернета блокируют ее, так
как она может быть использована для неподобающих целей), можно вместо нее применить команду
nsiookup. Например, выполнение команды nsiookup googie.com возвращает следующий ответ:

Server: 8.8.8.8
Address: 8.8.8.8#53 ◄-------------- № nsiookup также возвращает адрес сервера DNS,
Non-authoritative answer: который она использовала
(Не заслуживающий доверия ответ:)
Name: google.com
Address: 173.194.39.165
173.194.39.169
173.194.39.164
173.194.39.167
173.194.39.168
173.194.39.163
173.194.39.161
173.194.39.166
173.194.39.160
173.194.39.162
173.194.39.174

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

т // Даем шилду Ethernet секунду для инициализации:


delay(1000);
// Мигаем светодиодом индикации сброса:
blink(resetLED, 3);
// Пытаемся подключиться:
connectToServer();

□ Метод b l i n k о , вызываемый J void blink(int thisPin, int howManyTimes) {


в методе setup о, мигает свето- | // Мигаем светодиодом индикации сброса:
диодом индикации сброса, чтобы 1 for (int blinks=0; blinks< howManyTimes; blinks++) {
проинформировать о скором за­ digitalWrite(thisPin, HIGH);
пуске основного цикла: \ delay(200);
digitalWrite(thisPin, LOW);
delay(200);



«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 179

Ш Метод loop о содержит всю void loop()


логику, представленную на {
// Если клиент подключен к серверу, сохраняем входящие байты
рис. 4.12. Если клиент подклю­
// в строку ввода:
чен к серверу, он отправляет за­ if (client.connected()) {
прос HTTP g e t .Если он отправил if (!requested) {
запрос, клиент использует библи­ requested = makeRequest();
отеку TextFinder для поиска в от­ }
else {
вете строки значения показателя
// Создаем экземпляр библиотеки TextFinder
качества воздуха, а затем задает // для поиска в ответе:
значение напряжения для пода­ TextFinder response(client);
чи на вольтметр. Если клиент не // Проверяем ответ сервера на содержание значения AQI:
подключен к серверу, он ожидает if (response .find («Air Quality:»)) {
// Преобразовываем оставшуюся часть в целое число:
две минуты, после чего повторя­
airQuality = response.getValue();
ет попытку подключения: // Выводим результат на вольтметр
meterlsSet = setMeter(airQuality);

}
}
else if (millis() - lastAttemptTime > requestlnterval) {
// Если клиент не подключен к серверу, ожидаем две минуты
// после последнего подключения и повторяем попытку
// подключения:
client.stop();
connectToServer();

// Устанавливаем светодиоды состояния :


setLeds();

Ш1 Метод loop о , как и метод void connectToServer() {


setup (), пытается подключить­ // Сбрасываем состояние вольтметра:
meterlsSet = false;
ся к серверу, используя метод
connectToServer (). Е С Л И методу
// Пытаемся подключиться и ожидаем миллисекунду:
удается установить подключе­ Serial.println(«connecting...»);
ние, он сбрасывает значение за­ if (client.connect(server, 80)) {
прашиваемой переменной, что­ requested = false;
бы основной цикл знал, что он }
// Запоминаем время этой попытки подключения:
может отправлять запрос: lastAttemptTime = millis();

IJJ Установив подключение, boolean makeRequest() {


клиент отправляет запрос HTTP // Делаем запрос HTTP GET. Замените выделенный жирным путь
g e t . Далее приводится код мето­ // действительным путем к сценарию РНР на вашем сервере,
да makeRequest о , в котором осу­ client.println("GET /~myaccount/scraper.php HTTP/1.l\n»);
ществляется этот запрос. Метод j // Замените выделенное жирным шрифтом имя сервера
возвращает значение true, уста­ // на действительное имя вашего сервера :
навливающее запрашиваемую client.print(«HOST:example.com\n\n");
переменную в главном цикле, // Обновляем состояние программы:
чтобы клиент не отправлял за­ client.println ();
прос повторно, пока он в под- ! return true;
ключенном состоянии: : > »
180 Глава 4

Ш На запрос методом
() сервер
makeRequest отвечает
следующим образом:
HTTP/1.1 200 OK
Date: Fri, 14 Nov 2010
21:31:37 GMT
Server: Apache/2.0.52 (Red Hat)
Content-Length: 10
Connection: close
Content-Type: text/html;
charset=UTF-8

Air Quality: 65

Ш Когда клиент найдет строку boolean setMeter(int thisLevel) {


со значением показателя каче­ Serial.println(«setting meter...»);
ства воздуха и преобразует бай­ boolean result = false;
ты в целое число, он вызывает // Сопоставляем результат рабочему диапазону шкалы вольтметра:
int meterSetting = map(thisLevel, 0, AQIMax, meterMin, meterMax);
метод setмeter (), чтобы устано­
// Выводим результат на вольтметр:
вить напряжение на вольтметре,
analogWrite(meterPin, meterSetting);
соответствующее полученному if (meterSetting > 0 ) {
результату. Вам нужно будет на­ result = true;
строить значение Аошах, чтобы }
отображать типичный максимум return result;
для вашего региона:
Ш Hy и последнее, что нужно void setLeds() {
сделать в главном цикле, — это // Светодиоды индикации подключения и отключения могут
установить состояние индика­ // использовать значение connected() клиента:
торных светодиодов, чтобы на­ digitalWrite(connectedLED, client.connected());
блюдать за ходом выполнения digitalWrite(disconnectedLED, !client.connected());
программы. Состояние каждого // Состояние светодиода индикации успеха зависит от
светодиода можно установить // исхода операции чтения:
с помощью значения свойства digitalWrite(successLED, meterlsSet);
client.connected () И переменной
meterlsSet:

Вот и вся программа. При выпол­


нении ее на микроконтроллере,
каждые десять минут будет по­
сылаться запрос HTTP g e t ,по ре­
зультатам которого на вольтметр
будет подаваться соответствую­
щее напряжение.

На рис. 4.13 показано, как выгля­


дит завершенный проект в сборе. ■

► ► Рис. 4.13. Завершенный проект


сетевого измерителя качества
воздуха
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 181

DNS и DHCP
В главе 3 мы узнали, что большинство устройств в сети Ethernet получают свой IP-адрес, используя
протокол DHCP, а устройства, подключенные к поставщику услуг Интернета, узнают адреса других
узлов — серверов и клиентов — посредством системы DNS. Протокол DHCP и систему DNS можно
также использовать и с библиотекой Ethernet Arduino. В этом нет ничего сложного — нужно просто
вставить МАС-адрес устройства в метод Ethernet .begin о , как в следующем примере:
byte m a c [] = { OxDE, OxAD, OxBE, OxEF, OxFE, OxED};
Ethernet.begin(mac) ;
Если сервер выделит IP-адрес, метод возвращает значение true или false — в противном случае.
Возвращенный адрес сохраняется в переменной Ethernet.locaiipо . С помощью протокола DHCP
М О Ж Н О получить И другую информацию, используя методы Ethernet.subnetMask () ,Ethernet.gatewayIP ()
И Ethernet.dnsServerIP().

Работа c DNS также не представляет ничего сложного. В частности, вместо предоставления команде
client.connect () числового адреса, мы даем ей соответствующую текстовую форму:
client.connect(«www.example.com», 80);
Недостаток использования DHCP и DNS состоит в том, что для них требуется сравнительно большой
объем оперативной памяти, поэтому предпочтительнее использовать соответствующие числовые адре­
са (если они известны).
Следующий пример демонстрирует, как запрашивать адрес с помощью протокола DHCP. Полученный
адрес выводится на экран.
/* DHCP
Контекст : Arduino
*/
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = {
0x00, OxAA, OxBB, OxCC, OxDE, 0x01};
IPAddress ip(192,168,1,20); // Адрес, который нужно использовать, если не удастся получить адрес в DHCP:

void setup() {
// Запускаем последовательное подключение:
Serial.begin(9600);
// Запускаем подключение Ethernet :
Serial.println("Запрашиваем IP-адрес в DHCP...");
if (!Ethernet.begin(mac)) {
// Если не получен DHCP-адрес, устанавливаем свой:
Ethernet.begin(mac, ip);

// Выводим байты IP-адреса, разделенные точками:


Serial.print("Получен следующий IP-адрес: ");
Serial.println(Ethernet.localIP());

void loop() {
}
Метод begin () полезно применять в любом скетче для работы с Ethernet, так как он использует DHCP,
если эта возможность доступна, а в противном случае устанавливает заданный вручную IP-адрес. Если
IP-адрес устанавливается вручную, в любом случае можно сэкономить на памяти, занимаемой програм­
мой, просто закомментировав строку i f о и соответствующую фигурную скобку, но оставив команду
внутри:
//if (!Ethernet.begin(mac)) {
// Если не получен DHCP-адрес, устанавливаем свой:
Ethernet.begin(mac, ip);
// }
182 Глава 4

йй И нструм енты для п р о гр ам м и р о ван и я


и д и агн о сти р о ван и я в стр о е н н ы х модулей
При установлении подключений в предыдущем разделе вам, может быть, пришлось столкнуть­
ся с некоторыми проблемами. Возможно, самым трудным аспектом их диагностирования было
то, что ни шилд Ethernet, ни сам микроконтроллер Arduino, не показывали никаких признаков
проблемы. Такая ситуация является нормой при работе со встроенными модулями собствен­
ной разработки. Чтобы помочь вам в решении подобных проблем, мы рассмотрим несколько
моментов, которые нужно учесть в таких случаях, а также несколько инструментов диагно­
стирования. Эти методы применимы как при работе с модулями Ethernet, так и с другими се­
тевыми или коммуникационными модулями. Мы будем постоянно использовать эти методы
в оставшемся материале книги. Они вам также пригодятся и в других ситуациях, в том числе и
не связанных с нашими проектами.

Три самые распространенны е Средства и методы


ошибки д иа гности рова н ия
Проверьте линии питания Убедившись, что устройство работает правильно,
нужно запрограммировать последовательность со­
Всегда полезно убедиться в правильном подключе­
общений, которые составляют наше приложение.
нии линий питания: плюса и минуса (общего). Этот
момент не представляет большой проблемы в слу­ В зависимости от требований приложения, эта по­
чае аккуратных готовых подключаемых модулей следовательность может быть довольно сложной,
наподобие шилда ЕЙ1егпе1;, которые можно подсо­ поэтому будет полезным иметь в наличии несколь­
единить только одним способом. Но даже с таки­ ко простых программ, чтобы убедиться, что все ра­
ми модулями можно неправильно вставить (или не ботает должным образом.
вставить) контактный штырек и не заметить этого. Весьма неплохо протестировать работоспособность
Если вам повезет, используемый модуль будет осна­ модуля на простом коде, если таковой поставляется
щен индикаторными светодиодами, загорающими­
с модулем. Как правило, солидные изготовители мо­
ся при правильной работе модуля. Но независимо
дулей связи поставляют со своими изделиями про­
от того, имеет модуль такие светодиоды или нет,
проверьте напряжение между плюсом и минусом стой начальный пример. Проверьте работу модуля с
(общим) питания, чтобы убедиться в правильности его помощью и держите его под рукой. Если что-то
подачи питания на устройство. не заладится, убедитесь с помощью этого примера,
что базовая связь все еще работает.
Проверьте соединения
При подсоединении модуля к микроконтроллеру Физические методы диагностирования
вручную довольно часто первая попытка получа­ Создаваемый нами нематериальный код иницииру­
ется неправильной. Убедитесь, что вы знаете на­ ет физические действия. Но это легко забыть, рабо­
значение каждого контакта, и дважды проверьте, тая с обменом информацией, как в рассмотренных
что контакт, с которого осуществляется передача, ранее проектах. Чтобы избежать многих проблем,
подсоединен к контакту, на который выполняется весьма полезно вставлять в программы код, по­
прием, и наоборот. В случае синхронной последо­ зволяющий визуализировать физические действия.
вательной связи, убедитесь, что подключена линия Тогда мы сможем увидеть, что наш код работает.
тактирующего (синхронизирующего) сигнала. В нашем последнем проекте в этой главе мы видели,
что когда клиент устанавливал или разрывал под­
Проверьте конфигурацию ключение, когда он делал успешный запрос и когда
Если вы уверены в правильности физических со­ выполнял сброс, об этом сигнализировали соответ­
единений, проверьте настройки устройства, чтобы ствующие светодиоды. Включение светодиода —
убедиться в их правильности. В частности, про­ это самое простое и надежное, что можно делать
верьте правильность введенного 1Р-адреса устрой­ в этом плане с микроконтроллером. Это даже бо­
ства, 1Р-адреса маршрутизатора и маски подсети. лее просто, чем отправка отладочного сообщения.
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 183

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

Использование последовательного При этом важно помнить, что последовательная


связь занимает время. Команды последовательной
обмена для диагностирования
связи в коде замедляют его исполнение. Микро­
Шилд Ethernet и плата Arduino Ethernet, кроме контроллеру нужно сохранить каждый полученный
удобства их физического форм-фактора, обладают бит информации, на что затрачивается время ис­
и другими, облегчающими с ними работу, возмож­ полнения программы. Хотя это время для каждого
ностями. Например, то обстоятельство, что они бита мизерное, оно может накапливаться и после
взаимодействуют с Ethemet-контроллером посред­ нескольких сотен байтов стать заметным. Поэтому
ством синхронной последовательной связи, озна­ не забудьте убрать из кода диагностические коман­
чает, что их последовательный порт можно исполь­ ды последовательного обмена, когда в них не будет
зовать для отправки сообщений, информирующих больше надобности.
о ходе исполнения программы, как это делалось

СЗ Используйте const boolean DEBUG = true;

отладочные команды
void setup() {
Одним из способов отладки яв­ Serial.begin(9600);
ляется использование перемен­
ной, которая изменяет поведение
программы, как показано в сле­ void loop() {
дующем коде. Если каждой от­ if (DEBUG) Serial.println(«Это отладочная команда»);
ладочной команде предшествует }
оператор условия if (d e b u g ), и х
все можно легко отключить, при­
своив переменной d e b u g значение
false.

US Объявляйте вызовы void connectToServer() {


методов if (DEBUG) Serial.print(«Исполняется метод
connectToServer()...»);
Код программы-клиента из про­ // Сюда вставляется остальной код метода
граммы показателя качества
воздуха содержит много разных
методов. Определить, вызывает­ void makeRequest() {
ся ли каждый из этих методов, if (DEBUG) Serial.print(«Исполняется метод
нелегко, поэтому в процессе диа­ makeRequest()...»);

гностирования будет полезно из­ // Сюда вставляется остальной код метода

вещать о вызове каждого метода.


Для этого нужно в начале каж­
boolean setMeter(int thisLevel) {
дого метода вставить оператор
if (DEBUG) Serial.print(«Исполняется метод setMeter()...»);
для вывода информирующего со­
// Сюда вставляется остальной код метода
общения, как показано в следую­
}
щем коде:
184 Глава 4

Ш Проверьте условные
операторы
В приложениях связи, подобных ! if (client.connected ()) {
рассмотренному в этом проекте,
if (DEBUG) Serial.print(«Подключились») ;
часто применяются множествен­
if ({requested) {
if (DEBUG) Serial.print(«Подключились, не загросили») ;
ные условия, которые влияют на 1
requested = makeRequest();
определенный результат. В про­
}
цессе работы легко совершить else {
ошибки, которые затрагивают эти if (DEBUG) Serial.print(«Не подключились»);
вложенные условные операторы. }
Поэтому следует проверять, что }
условия продолжают выполнять­
ся (когда вы думаете, что они 1
должны выполняться), выводя
соответствующие извещения, как
показано в следующем коде:

Ш Разделите код на части


Программисты любят эффек­ if (client.connect () ) {
тивность, поэтому они часто // Если подключились, докладываем по последовательной связи:
совмещают несколько команд Serial.println("Подключились") ;
в одну строку кода. Но иногда }
такое комбинирование может по­ else {
рождать проблемы. Например, // Если не удалось подключиться к серверу:
следующая строка кода пытается Serial.println("Подключиться не удалось");

выполнить подключение посред­ }


ством метода client.connect (),
а затем проверяет успех команды
подключения в условном опе­
раторе:

Ш У меня с этим кодом были ! client.connect ();


// Подключаемся
всяческие проблемы, пока я не от­ delay(l); // Ожидаем миллисекунду
делил часть попытки подключе­ if (client.connected()) {
ния от части проверки на успеш­ // Если подключились, докладываем по последовательной связи:
ность этой попытки. Похоже, Serial.println("Подключились");
что выполнять проверку успеха }
попытки подключения сразу же else {
после подключения было слиш­ // Если не удалось подключиться к серверу:
Serial.println("Подключиться не удалось");
ком рано. Небольшая пауза перед
проверкой стабилизировала про­ }
грамму. Далее приводится менее
эффективный, но рабочий код
этих попыток:
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 185

Ш Просто наблюдайте
Иногда будет полезным просто II Если подключены, сохраняем все входящие байты в строку
отойти на шаг назад от поиска ввода
(client.connected()) {
причины проблемы и просто по- 1£
if (client.available()) {
наблюдать за выводимым резуль- 1
char inChar = client.read();
татом, каким бы он ни был. Одним
Serial.write(inChar);
из методов, который я постоянно ;
употреблял при разработке этой
программы, было просто выво- }
дить на экран все, что получал
модуль ЕШетеЬ Несколько раз
этот подход показал мне, в чем
заключалась проблема. Иногда
проблема была с логикой кода, ,
а иногда я не обращал внимания
на какой-либо символ, посылае­
мый сервером в качестве состав­
ляющей протокола. Ощущение, ;
что вам в коде все уже хорошо
известно, может препятствовать
вам видеть то, что нужно видеть.
Поэтому постарайтесь понять,
что вы действительно получае­
те, — в отличие от того, что вы
думаете, будто вы получаете.

Создайте тестовую программу клиента


Легче всего проследить исполнение программы, последовательный порт, в порт Ethernet, и наоборот.
если вы можете пройти пошагово через после­ По сути, она делает из нашего модуля Arduino шлюз
довательность ее событий. Более сложные среды TTL-Serial/Ethemet. С помощью этой программы
разработки позволяют исполнять программу по можно подключиться к терминалу последователь­
одной строке кода. Среда Arduino не предоставля­ ной связи или к среде Processing (или к любой дру­
ет такой возможности, но она может связываться гой среде разработки, обладающей возможностями
с другими средами. Далее приводится программа, последовательной связи) для проверки подключе­
которая просто передает все, что она получает на ния Ethernet.

СЗТестирование /*
TTL-Serial/Ethernet
Контекст : Arduino
Что хорошего в этой программе,
*/
так это то, что она позволяет те­
стировать обмен сообщениями #include <SPI.h>
вручную или создав программу в #include <Ethernet.h>
среде на компьютере. Определив
// Вместо выделенных жирным шрифтом значений укажите значения
правильную последовательность, // для вашего устройства и сервера
ее можно преобразовать в код для byte mac[] = { 0x00, ОхАА, ОхВВ, OxCC, OxDE, 0x01 };
модуля Arduino: IPAddress i p (192,168,1,20);
IPAddress server(208,201,239,101); ►►
186 Глава 4

// Инициализируем библиотеку Ethernet клиента IP-адресом и портом


// сервера, к которому мы хотим подключиться (для HTTP по умолчанию
// используется порт 80):
Client client;

void setup() {
// Запускаем последовательное подключение:
Serial.begin(9600);
// Запускаем подключение Ethernet:
if (!Ethernet.begin(mac)) {
Serial.println(«Ошибка DHCP, конфигурируем вручную»);
// Выполняем настройку IP-адреса вручную:
Ethernet.begin(mac, ip);
}
// Даем шилду Ethernet секунду для инициализации:
delay(1000);
Serial.println("Все готово к работе.");
}
void loop() {
if (client.connected()) {
// Если подключились успешно, передаем байты от клиента
/ / н а последовательное подключение:
if (client.available()) {
char netChar = client.read();
Serial.write(netChar);
}
// Передаем байты от последовательного подключения клиенту:
if (Serial.available()) {
char serialChar = Serial.read();
client.write(serialChar);
}
}
else {
// Если были подключены, останавливаем клиента:
client.stop();
// Если не были подключены, и получаем символ С,
// пытаемся подключиться:
if (Serial.available()) {
char serialChar = Serial.read();
if (serialChar — 'C') {
connectToServer();
}
}

void connectToServer() {
// Пытаемся подключиться и ожидаем миллисекунду:
Serial.println(«Подключаемся...»);
if (client.connect(server, 80)) {
// Если подключились, докладываем по последовательной связи:
Serial.printIn("Подключились");

else {
// Если не удалось подключиться к серверу:
Serial.println("Подключиться не удалось");
client.stop();

} »
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 187

Ш Обмен данными __ /*
Проверщик запросов HTTP TTL-Serial/Ethernet
Далее приводится простой скетч Контекст: Processing
Processing, который взаимодей­ */
ствует по каналу последователь­
// Подключаем библиотеку Serial
ной связи с предыдущим скетчем import processing.serial.*;
Arduino, чтобы послать запрос
HTTP. При нажатии первой кла­ Serial myPort; // объект Serial
виши скетч посылает символ «с», int step = 0 ; // Индикатор шага в ходе исполнения
чтобы инициализировать под­ char linefeed = 10; // Символ перевода строки ASCII
ключение. Второе нажатие от­
void setup()
правляет запрос HTTP:
{
// Получаем список последовательных портов:
println(Serial.list ());
// Открываем последовательный порт, соответствующий
// нашему компьютеру:
myPort = new Serial(this, Serial.list () [0], 9600);
// Настраиваем объект последовательной связи сохранять текст
// в буфер до тех пор, пока не получит символ перевода строки:
myPort.bufferUntil(linefeed) ;

void draw ()
{
// Никаких действий здесь
}

void serialEvent(Serial myPort) {


// Выводим все получаемые по последовательному каналу строки
/ / н а монитор
print(myPort.readstring());

void keyReleased() {
// При нажатии любой клавиши делаем следующий шаг:
switch (step) {
case 0:
// Открываем подключение к требуемому веб-серверу:
myPort.write("С");
// Увеличивает счетчик шагов на единицу, чтобы следующее
// нажатие клавиши запускало следующий шаг:
step++;
break;
case 1:
// Отправляем запрос HTTP GET
// Вместо выделенных жирным шрифтом значений укажите
// значения для вашего сервера
myPort.write("GET /^nyaccount/index.html HTTP/1.1\n»);
myPort.write («HOST:xnyserver,com\n\n") ;
step++;
break;
}
} ►►
188 Глава 4

ÉL £ Используя этот скетч как основу, можно Однако не слишком углубляйтесь в технические
В В проработать всю логику обмена HTTP в подробности программы Processing на этом эта­
Processing, а затем преобразовать этот скетч в скетч пе — вам ведь еще придется в конечном итоге раз­
Arduino. бираться с подробностями микроконтроллерной
программы. Тем ее менее, при решении той или
Такой подход позволяет проверить логику выполне­ иной задачи весьма полезно увидеть сходства и раз­
ния приложения в среде, которая вам может быть личия между двумя применяемыми языками. Это
более знакомой. При этом устраняются сложности позволяет сконцентрироваться на логике, лежащей
микроконтроллерной среды, что позволяет вам в их основе.
сконцентрироваться на последовательности сооб­
щений и вызывающих их действий.

Создайте тестовую программу сервера


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

Ш Далее приводится такая сер­


верная программа в Processing, Тестовая серверная программа
которую можно исполнять на Контекст: Processing
своем персональном компьютере.
Программа сервера ожидает вхо­ Создает сервер, который ожидает подключения клиентов
дящие подключения и выводит и выводит на экран их сообщения. Также отправляет
последнему клиенту все, что вводится с клавиатуры.
на экран сообщения, посланные
*/
по установленным подключени­
ям. Обратно посылается ответ // Подключаем библиотеку Net:
HTTP и простая веб-страница: import processing.net.*;
int port = 8 0 ; // Порт, на который сервер ожидает
Для работы с этой программой // подключения
сначала проверьте, что ваш мо­ Server myServer; // Объект сервера
дуль Ethernet и персональный int counter = 0;
компьютер находятся в одной и
той же сети. Затем запустите эту void setup ()
программу на исполнение и под­ {
ключитесь к ней с браузера по myServer = new Server(this, port); // Запускаем сервер

URL http://localhost:80.

void draw()
Если такое подключение выпол­
няется успешно, это означает, {
// Получаем нового клиента, который посылает сообщение:
что программа работает. Далее
Client thisClient = myServer.available();
создайте программу клиент для
// Если сообщение не пустое, выводим его на экран:
Arduino, которая подключается
по IP-адресу вашего компьютера ►►
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 189

на порт 80. Вы сможете наблю­ if (thisClient != null) {


дать за обеими сторонами обмена // Считьюаем поступающие от клиента байты:
и определить местонахождение while(thisClient.available() > 0 ) {

проблемы. Если сообщения начи­ print(char(thisClient.read()));

нают поступать к этой програм­ }


// Отправляем ответ HTTP:
ме в правильной последователь­
thisClient.write(«HTTP/1.1 200 OK\r\n»);
ности, измените адрес в строке
thisClient.write («Content-Type: text/html\r\n\r\n>>);
подключения кода микрокон­
thisClient.write («<html><head><title>npMBeT</titlex/head>») ;
троллера на адрес веб-сервера,
thisClient .write («<Ьс^у>Привет, Клиент! « + counter);
к которому вы хотите подклю­ thisClient.write(«</body></html>\r\n\r\n»);
читься, — здесь также все долж­ // Отключаемся:
но работать как следует. Если же thisClient.stop();
проблема продолжает проявлять­ counter++;
ся, ее причиной, скорее всего,
является ваш веб-сервер. Свя­
житесь со своим поставщиком
услуг веб-хостинга и узнайте,
как получить доступ к средствам i l i . Измените номер порта
диагностики сервера, — особен­ Если программа не работает, измените номер порта на 8080 — он
но, к журналам ошибок вашего часто используется альтернативно порту 80 на многих веб-серверах.
веб-сервера. Используйте эти Если веб-сервер исполняется на вашем персональном компьютере,
средства для дальнейшей диаг­ может быть полезным изменить номер порта в этой программе.
ностики проблемы.

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

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

Однако представленная здесь модель имеет свои ограничения, и в главе 5 мы увидим, как преодолеть эти
ограничения с помощью другой модели. Но даже если вы не станете использовать эту модель, не забывайте
о средствах диагностирования, рассмотренных в этой главе. Создание и использование простых тестовых
программ на любой стороне обмена может значительно облегчить вашу жизнь. Такие тестовые программы
позволяют вам видеть, что должно происходить, а затем откорректировать то, что происходит в действи­
тельности, чтобы оно совпадало с требуемым.
Глава 5 а

СВЯЗЬ В РЕЖИМЕ РЕАЛЬНОГО


(ПОЧТИ) ВРЕМЕНИ

До сих пор больш инство рассм отренны х нами примеров сетевой


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

44 Музыкальный ящик Джин-Йо Мока (2004)


Музыкальный ящик подключен по Интернету к программе-композитору через мо­
дуль ТТЪ-8епа1/ЕЙ1егпе1;. Программа-композитор управляет лампочками на музыкаль­
ном ящике и звуками, которые он воспроизводит. Связь в режиме реального времени
между программой и ящиком дает возможность слушателю участвовать в процессе.
Фотография предоставлена Джин-Йо Моком (Лп-Уо Мок).
192 Глава 5

4^ Ком поненты для пр оекта этой главы


Код поставщ ика США и Европа
Россия • А — Arduino Store (http://store.arduino.cc/ww)
• AF — Adafruit (http://adafruit.com)
• АМР — «Амперка» (http://am perka.ru)
• D — Digi-Key (www.digikey.com)
• СЕГО — «Чип и Дип» (http://chipdip.ru)
• F — Famell (www.farnell.com)
• ЬС — «Линуксцентр» (www.linuxcenter.ru)
° J — Jameco (http://jameco.com)
• MS — Maker SHED (www.makershed.com)
• P — Pololu (www.pololu.com)
• RS — RS (www.rs-online.com)
• SF — SparkFun (www.sparkfun.com)
• SS — Seeed Studio (www.seeedstudio.com)

Рис. 5.1. Новые компоненты для проекта этой главы:


1. Семислойный гофрированный картон. 2. Трехкоординатный акселерометр. 3. Двухкоординатный джойстик.
4. Кнопка. 5. Застежка-липучка. 6. Корпус из картона для проекта. 7. Шаблон для корпуса проекта из картона
толщиной 1,5 мм. 8. Перфорированная печатная плата.
Потребуется также достаточное количество штырьковых контактов для интерфейсных модулей
Связь в режиме реального (почти) времени 193

Проект 8. Сетевой пинг-понг

Если делать два устройства...


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


►Плата Arduino Ethernet, 1 шт. В качестве аль­ J: 28017, SF: SEN-00692, AF: 163, RS: 726-3738,
тернативы подойдет плата с Ethemet-шилдом, P: 1247, MS: MKPX7
совместимая с Arduino Uno (см. главу 2). ►
►Перфорированная печатная плата, 1 шт.
AMP: А000068, http://amperka.ru/product/ar- AMP: AMP-BO 16, http://amperka.ru/product/
duino-ethernet proto-perfboard
А: А000050 D: V2018-ND, J: 616673, SS: STR125C2B,
SF: EV-09026, J: 2124242, А: А000056, AF: 201, F: 4903213, RS: 159-5420
F: 1848680 ►
►Светодиоды, 4 шт. Лучше всего использовать

►Устройство с Ethernet-подключением к Ин­ два светодиода, цвет которых имеет общепри­
тернету, 1 шт. Ваш домашний маршрутизатор, нятое значение: один большой красного цвета
скорее всего, имеет разъемы Ethernet на задней и один большой зеленого, а два других — лю­
панели. Если вы подключили свой компьютер бого цвета.
к Интернету через сеть Ethernet, то должны
AMP: AMP-X009-R4, http://amperka.ru/prod-
знать, где находятся эти разъемы.
uct/led-5mm

►Сопротивление 100 К, 1 шт. D: 160-1144-ND или 160-1665-ND, J: 34761 или
AMP: AMP-R100K-10, http://amperka.ru/prod- 94511, F: 1015878, RS: 247-1662 или 826-830,
uct/resistor SF: СОМ-09592 или СОМ-09590
D: 100QBK-ND, J: 690620, F: 9337660, RS: 707- ►
►Кнопка, 1 шт. Найдите прочную, которая вы­
8625 держит интенсивное использование.

►Сопротивления по 220 Ом, 3 шт. ►
►Корпус для проекта, 1 шт. Проявите изобрета­
тельность с материалами, которые можно найти
AMP: AMP-R220R-10, http://amperka.ru/prod-
в доме.
uct/resistor
D: 220QBK-ND, J: 690700, F: 9337792, RS: 707- ►
►Лист семислойного гофрированного картона,
8842 1 шт. (для клиента балансировочной доски).

►Двухкоординатный джойстик, 1 шт. (для кли­ ►
►Полоска застежки-липучки, 1 шт. Можно при­
ента джойстика). обрести в магазине швейных материалов или
хозяйственных товаров.
AMP: DFR0061, http://amperka.ru/product/
joystick-module
J: 2082855, SF: СОМ-09032, AF: 245, F: 1428461

►Акселерометр, 1 шт. (для клиента балансиро­
вочной доски). На схеме показан акселерометр
ADXL330, но подойдет практически любой дру­
гой акселерометр.
АМР (альтернатива): DRF0143, http://amperka.
ru/product/triple-axis-accelerometer
194 Глава 5

йй И н тер акти вн ы е систем ы и цепи о б р атн о й связи


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

Например, в приложении про сетевого кота в главе 3 Будет ли это звездообразная сеть, все участники
системе нет необходимости отвечать чаще, чем раз которой соединены друг с другом через централь­
в несколько секунд, поскольку время реагирования ный сервер? Или же это будет кольцевая сеть, со
пользователя на события не является критическим. всеми узлами, соединенными последовательно?
Нас вполне устраивает, что мы можем видеть кота, А возможно это будет сеть типа «многие-ко-
когда он отдыхает, — что может длиться в течение многим», где каждый объект имеет прямую связь
нескольких минут или часов. А вот чтобы полу­ со всеми другими объектами? Каждая из этих кон­
чить удовольствие от игры в мартышкин пинг-понг фигураций по-разному влияет на скорость реагиро­
(см. проект из главы 2), желательно довольно-таки вания цепи обратной связи. В звездообразной сети
быстрое время реагирования цепи обратной связи. концевые объекты не испытывают особой нагруз­
Если бы ракетка начинала двигаться через полсе­ ки, но центральный сервер, обслуживающий все
кунды или более после взмаха руки Мартышкина, эти узлы, загружен по максимуму. Все узлы кольце­
вряд ли бы мы получили от этого какое-либо удо­ вой сети нагружены более или менее одинаково, но
вольствие. Таким образом, время реакции цепи об­ для доставки сообщения на противоположный узел
ратной связи определяется наибольшим временем, кольца может потребоваться значительное время.
приемлемым для пользователя. Во взаимосвязанной сети нагрузка равномерно рас­
пределена на все узлы, но каждый узел должен под­
Любая система, требующая согласованности меж­
держивать большое число подключений.
ду действием и реакцией, должна иметь быструю
цепь обратной связи. Возьмем, например, системы В большинстве случаев, когда в обмене участвует
удаленного управления. Пусть, вы создаете робота, ограниченное количество объектов, обменом легче
который управляется по сети. В таком случае вам всего управлять с помощью центрального сервера.
понадобится не только быстрая сеть для системы Самыми распространенными программными при­
управления, но также и быстрая реакция камеры мерами таких серверов являются текстовый сервер
или датчиков на роботе (или в его среде), — тех, групповых дискуссий наподобие IRC1 или сервер
что предоставляют вам информацию о происходя­ мгновенного обмена сообщениями AOL. Серверные
щем с ним. Вам необходимо иметь возможность как программы, которые принимают входящие подклю­
быстро подавать роботу сигналы управления, так и чения клиентов и управляют обменом текстовых со­
видеть результаты его реакции на эти сигналы. Для общений между ними в режиме реального времени,
сетевых игр с активными действиями также требу­ часто называются серверами групповых дискуссий
ется скоростная сеть. Если ваша игровая консоль (chat servers). Программа Processing, которую мы
реагирует медленно, предоставляя другим игрокам напишем в этой главе, представляет собой разно­
с более высокой сетевой скоростью преимущество видность сервера групповых дискуссий. Сервер бу­
над вами, такая игра не принесет вам никакого удо­ дет ожидать новые подключения клиентов и управ­
вольствия. Для приложений подобного рода про­ лять обменом сообщениями всех подключающихся
токол обмена, который постоянно открывает и за­ к нему клиентов. Поскольку скорость прохождения
крывает подключения (подобно тому, как это делает сообщений по Интернету нельзя гарантировать, об­
протокол НТТР), будет не очень эффективен. мен сообщениями не может быть мгновенным. Но
при условии наличия быстрого сетевого подключе­
Когда между двумя объектами организовано взаим­
ния как для клиентов, так и для сервера, время реак­
но однозначное подключение, установить быструю
ции цепи обратной связи будет быстрее, чем время
цепь обратной связи легко. Но когда объектов не­
реакции человека.
сколько, эта задача становится труднее. Для начала,
нам нужно принять во внимание тип сетевой кон­
фигурации подключений между всеми объектами. 1 IRC, Internet Relay Chat — ретранслируемый чат Интернета.
Связь в режиме реального (почти) времени 195

йй П ротокол TCP: сокеты и сеансы


Работа каждого открытого подключения клиента к веб-серверу обеспечивается протоколом
TCP2. Протокол TCP определяет, каким образом объекты в Интернете открывают, удерживают и
закрывают подключение, которое будет связано с множественными обменами сообщениями.
Подключение, установленное между двумя объектами с помощью протокола TCP, называется
сокетом (socket). Сокет можно представить как канал, соединяющий два объекта. Сокет позво­
ляет передачу данных в обоих направлениях в течение всего времени удержания подключе­
ния. Для нормальной работы подключения обе стороны должны поддерживать его открытым.

Рассмотрим, например, обмен данными между же обеспечивает доставку утерянных пакетов, за­
веб-клиентом и сервером в проектах из двух пре­ прашивая их повторную передачу. Все это выпол­
дыдущих глав. Канал открывается, когда сервер няется прозрачно для пользователя стеком про­
подтверждает запрос связи клиента, и остается от­ токолов TCP/IP, реализованным библиотекой Net
крытым до тех пор, пока сервер не передаст запро­ в Processing, или микропрограммным обеспечени­
шенный файл. Если для страницы требуются много ем плат Arduino Ethernet, с которыми мы познако­
файлов — таких как изображения и таблицы сти­ мились в главе 4.
лей, для каждого из них открывается и закрывается
отдельное сокетное подключение. Сложность протокола TCP оправдывается при об­
мене критическими данными. Например, в сообще­
За кулисами сокетного подключения происходит нии электронной почты каждый байт — это символ
много событий. Объем данных, проходящих через пересылаемого текста. Пара байтов, утерянных при
подключение TCP, может составлять от нескольких передаче сообщения, могут содержать критически
байтов до нескольких терабайтов или более. Все эти важную информацию. Но функциональность про­
данные передаются отдельными пакетами, каждый верки и исправления ошибок протокола TCP не­
из которых пересылается по наилучшему маршруту сколько замедляет его работу, кроме того, чтобы
от пункта отправления до пункта назначения. отправить сообщения нескольким получателям,
нужно открыть отдельное сокетное подключение
О «наилучшем» маршруте к каждому из них.

Понятие наилучший маршрут довольно расплывча­ Однако в Сети также распространен и более про­
тое — аппаратура сети рассчитывает оптимальный
маршрут для разных пакетов и пунктов назначения по- стой тип протокола управления передачей — это
разному, учитывая разнообразные параметры — такие протокол UDP3. В то время как протокол TCP
как количество сегментов между конечными пунктами, обеспечивает связь с помощью сокетов и сеансов,
а также доступную пропускную способность и каче­ протокол UDP организует лишь обмен пакетами.
ство конкретного маршрута.
Более подробно этот вопрос рассматривается
в главе 7.
Период времени между открытием сокета и успеш­
ным его закрытием называется сеансом (session).
В течение сеанса программа, содержащая сокет, от­
слеживает состояние подключения (открыто или
закрыто) и номер порта, подсчитывает количество
отправленных и полученных пакетов, регистриру­
ет последовательность пакетов и обеспечивает их
представление в правильном порядке, даже если
пакеты прибывают в порядке произвольном, а так-

2 TCP, Transmission Control Protocol — протокол управления 3 UDP, User Datagram Protocol — протокол передачи дейтаграмм
передачей. пользователя.
196 Глава 5

П р о е к те

Сетевой пинг-понг
Сетевые игры предоставляют хорошую возможность изучить подключения режима реаль­
ного времени. Наш следующий проект представляет собой сетевую разновидность проекта
«Мартышкин пинг-понг» (Monsky Pong). Сервером будет программа Processing, а клиентами —
физические интерфейсы, подключаемые посредством модулей Arduino, оснащенных возмож­
ностями Ethernet. Экраны клиентов и сервера должны быть расположены вблизи друг от друга,
чтобы все могли их видеть. В данном случае мы используем сетевую связь потому, что она пре­
доставляет гибкость в работе с множественными подключениями, а не ради ее возможности
подключаться к удаленным расположениям.

Из проекта «Мартышкин пинг-понг» {глава 2) мы форму объекта клиента. Клиент может работать
уже знаем методы, требующиеся для перемещения с сервером, пока у него открыто ТСР-подключение
ракеток и шарика, так что некоторые фрагменты к серверу, и он в состоянии отправлять и принимать
приводимого здесь кода будут вам знакомы. Но так соответствующие сообщения в формате ASCII.
как этот проект более сложен, важно начать его К клиенту можно подсоединить любое устройство
с хорошего описания всей системы. Итак, система физического ввода, можно даже создать клиента,
работает следующим образом: который отправляет все свои сообщения автомати­
чески, без какого бы то ни было внешнего физиче­
• в игре участвуют две команды, каждая из кото­
ского ввода вовсе (хотя это было бы скучно). Далее
рых может иметь несколько игроков;
в этой главе мы рассмотрим несколько разных кли­
• каждый игрок может перемещать ракетку впе­ ентов, каждый из которых может подключаться
ред и назад (то есть влево и вправо). Ракетки к серверу и участвовать в игре.
находятся вверху и внизу экрана, а мячик пере­
мещается сверху вниз;
• игроки подключаются к игровому серверу по Тестовый chat-сервер
протоколу ТСР. При подключении к игре ново­ (сервер групповой дискуссии)
го игрока на экране появляется новая ракетка.
Новые подключения выполняются попеременно Прежде всего нам понадобится сервер. Для управ­
игроками верхней и нижней (это определяется ления выводом игры на экран требуется много кода,
расположением их ракеток на экране) команд. который не нужен нам в полном объеме на данном
При подключении игрока сервер отвечает стро­ этапе, поскольку мы только хотим удостовериться,
кой за которой следуют символы возврата что клиенты могут подключаться к серверу. Поэтому
каретки и перевода строки (обозначаются так: мы сначала создадим и испытаем простой сервер,
\г\п); обладающий всеми основными составляющими
для управления сетевой связью. Этот сервер будет
• клиент может посылать следующие команды:
ожидать подключения новых клиентов, а затем от­
• 1 — значение А8СН 108: движение влево; правлять им сообщения, вводя их в окно апплета,
• г — значение АЭСИ 114: движение вправо; которое открывается при исполнении программы.
• х — значение А8СН 120: отключение; Запустите программу сервера на исполнение и от­
• когда клиент посылает символ х, сервер отвеча­ кройте к нему подключение telnet. Если IP-адрес
ет строкой вуе\г\п, а затем закрывает сокетное вашего компьютера, например, 192.168.1.45, то
подключение. (поскольку сервер ожидает подключения на порт
Это и есть протокол связи для игры. Обратите вни­ 8080), такое подключение выполняется командой:
мание на то, что он никак не определяет физическую telnet 192.168.1.45 8080
Связь в режиме реального (почти) времени 197

Подключение к серверу с того же самого компью­ Для этого на компьютере под Mac OS X и Linux
тера, на котором он исполняется, осуществляется нажмите комбинацию клавиш <Ctrl>+<]>, введите
командами: команду:
telnet localhost 8080 mode character

или: а затем нажмите клавишу <Enter>. Для машин под


Windows вообще-то не требуется никаких специ­
telenet 127.0.0.1 8080
альных команд, но если окажется, что это не так,
После подключения к серверу все, что вводится нажмите комбинацию клавиш <Ctrl>+<]>, введите
в окно telnet, будет отображаться в панели отладчи­ команду:
ка сервера, а все, что вводится в окно апплета сер­ set mode stream
вера, будет отображаться в окне консоли клиента.
а затем нажмите дважды клавишу <Enter>.
Но чтобы сервер видел вводимые символы, нужно
нажимать клавишу <Enter> после каждого из них. Теперь каждый символ будет посылаться на сервер
Этот режим можно изменить после подключения. сразу же по его вводу.

02 Пишемм код
Тестовая серверная программа
Создание сервера начнем с объ­ Контекст:Processing
явления и определения пере­
менных. Основные переменные: Создает сервер, который ожидает подключения клиентов и выводит
экземпляр класса server, номер на экран их сообщения. Также отправляет последнему клиенту
порта для предоставления серви­ все, что вводится с клавиатуры.
са и массив ArrayList для отсле-
живания клиентов:
// Подключаем библиотеку Net:
import processing.net.*;

int port =8080; // Порт, на котором сервер


// ожидает подключения
Server myServer; // Объект сервера
ArrayList clients = new ArrayList(); // Список клиентов
Метод setup () запускает сервер:
void setup()

myServer = new Server(this, port);


}

r Л
Массивы типа R r r a y L i s t
В этой программе используется новый тип данных, с которым вы, возможно, еще не встречались:
ArrayList. Этот тип можно рассматривать как динамический массив. Количество элементов мас­
сива типа ArrayList не фиксировано, что позволяет добавлять к нему новые элементы в ходе
исполнения программы. Такой массив удобно использовать, когда заранее неизвестно количество
элементов, с которыми придется работать. В этом проекте мы не знаем, сколько у нас будет кли­
ентов, поэтому для их хранения мы используем массив типа ArrayList, добавляя в него каждого
нового подключившегося клиента. Массивы типа ArrayList также обладают некоторыми други­
ми полезными методами. Подробную информацию об использовании массивов ArrayList можно
найти на веб-сайте Processing по адресу www.processing.org.
V _________________________________________________________________ J ►

198 Глава 5

Ш Метод draw о ожидает новые | void draw()


сообщения от клиентов и выво- I {
дит их на экран. Если от клиен- | // Получаем нового клиента, который посылает сообщение:

та поступает сообщение «exit», J Client speakingClient = myServer.available ();

сервер отключает его и удаляет !


из списка клиентов: I if (speakingClient !=null) {
String message = trim(speakingClient.readstring());
I| // Выводим на экран, от кого сообщение и его содержимое:
println(speakingClient.i p () + «\t» + message);

if (message.equals(«exit»)) {
а myServer.disconnect(speakingClient);
Iа clients.remove(speakingClient);

1
а }
1 }
а
а }

□ Метод serverEvent о создает j void serverEvent(Server myServer, Client thisClient) {


сообщение, когда к серверу под- j println ("У нас новый клиент: " + thisClient.i p ());
ключается новый клиент. Метод j clients.add(thisClient);
извещает о новом клиенте и до- j }
бавляет его в список клиентов: j

СИ Наконец, метод keyReleased () 1 void keyReleased () {


отправляет любую нажатую на j myServer.write(key);
сервере клавишу всем подклю- | }
ченным клиентам: 1

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

Для отслеживания ввода пользователя клиенту Для информирования пользователя о действиях


необходимо следующее:• клиентского устройства требуется следующее:

• вход для получения сообщения о подключении. • вывод для информирования, подключен ли кли­
Тот же вход может быть использован, чтобы по­ ент к серверу;
лучить сообщение об отключении; • вывод для индикации нажатия кнопки подклю-
• вход для получения сообщения о движении чения/отключения;
влево; • вывод для индикации отправки сообщения
• вход для получения сообщения о движении о движении влево;
вправо. • вывод для индикации отправки сообщения
о движении вправо.
Связь в режиме реального (почти) времени 199

Желательно всегда оснащать клиент выводами выполнения соответствующего действия. Поэтому


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

Для этого проекта я собрал два кли­


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

> Вправо -|

Среднее Посылаем V
Посылаем Т положение Рис. 5.2. Логическая

1 блок-схема клиента
сетевого пинг-понга
200 Глава 5

Клиент № 1: клиент джойстика


Первый клиент — это довольно-таки обычный
игровой контроллер (рис. 5.3). Требуемые компоненты

►Плата Arduino Ethernet, 1шт.
Клиент оснащен джойстиком для управления
движениями влево и вправо и кнопкой для под­ ►
►Шилд Ethernet, 1 шт., и плата Arduino, 1 шт.
ключения и отключения от сервера. Он также ►
►Устройство с Ethemet-подключением
имеет четыре светодиода для индикации состояния к Интернету, 1 шт.
контроллера. Когда клиент подключен к серверу,
горит белый светодиод. Когда отправляется команда ►
►Сопротивление 100 К, 1 шт.
влево, зажигается красный светодиод, а когда ►
►Сопротивления по 220 Ом, 3 шт.
команда вправо — зеленый. Наконец, при нажатии

►Двухкоординатный джойстик
кнопки подключения/отключения горит желтый
(для клиента джойстика), 1 шт.
светодиод.
Клиент использует одну из координат двухкоор­ ►
►Акселерометр (для клиента
динатного джойстика в качестве главного ввода. балансировочной доски), 1 шт.
Джойстик содержит два потенциометра: один для ►
►Перфорированная печатная плата, 1 шт.
управления движением по вертикали, а другой —
по горизонтали. Нам нужен вывод только второго ►
►Светодиоды, 4 шт.
из них. Подключите вывод джойстика, помеченный ►
►Кнопка, 1 шт.
L/R, к +5 В источника питания, а вывод, помечен­
ный GND, — к отрицательному (общему). Вывод ►
►Корпус для проекта, 1 шт.
джойстика, помеченный L/R, подключите к ана­ ►
►Лист толстого картона (для клиента
логовому вводу 0 платы Arduino. Схемы клиента: балансировочной доски), 1 шт.
принципиальная и монтажные — показаны на
рис. 5.4-5.8 соответственно.

Светодиоды
Желтый ^ Белый Красный
- Зеленый

1______________ ,

Рис. 5.3. Клиент джойстика в варианте компоновки на беспаечной макетной плате. Обратите внимание на красный
и зеленый светодиоды для индикации движения влево и вправо. Цвет диодов следует морской традиции:
левая сторона — красный цвет, правая — зеленый.
Вы можете выбрать другие цвета при условии, что их значение будет понятно
Связь в режиме реального (почти) времени 201

Rosei CND
кЗЗУ с гк
•-5V Шилд MOS.
Gffd Ethernet м so
Orvi Qh SS
V»n
fD « rd 33

A Rtr
Rostt GMD
+3 'ì 'j D13
v liV DI2

bri D II PWM
'in i DiO-'PWW
Джойстик Vìn Г /Ь PV/M

л_ Модуль
Arduino Кнопка
'R D7
подключения/откл ючения
ев Ansioso
DS/TV M

A. 04
A2 U . ' V' M
A• 02
AA с .^ ь з ч т
Ab
Рис. 5.4. Принципиальная схема
клиента джойстика.
Монтажная схема
на перфорированной макетной
Светодиоды плате показана на рис. 5.5

Рис. 5.5. Монтажная схема клиента


джойстика на перфорированной
(беспаечной) макетной плате.
Обратите внимание, что
штырьковые контакты вставлены
в разъемы на плате Arduino только
в гнезда аналогового ввода, плюс
и минус питания и цифровые
гнезда 2 по 5. Остальные гнезда не
используются
202 Глава 5

Рис. 5.6. Паяные соединения на обратной Рис. 5.7. Монтаж контроллера джойстика: плата Arduino, шилд
стороне перфорированной макетной Ethernet и схема на перфорированной макетной плате. Для
платы монтажа кнопки и светодиодов на перфорированную макетную
плату используются гнездовые разъемы, что намного облегчает
задачу подгонки высоты светодиодов под корпус — откусывайте
их ножки понемногу, пока не будет достигнута требуемая высота

Рис. 5.8. Контроллер джойстика


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

Смонтировав схему контроллера джойстика, напи­ кнопка автоматически пропускает ток через све­
шите короткую программу для чтения его вводов тодиод, в результате чего мы получаем обратную
с помощью метода апа1одИеас1(). В качестве примера связь нажатия кнопки.
используйте программу для чтения датчиков проек­
Оба клиента смонтированы на перфорированных
та «Мартышкин пинг-понг» из главы 2 или проекта
макетных печатных платах. Использование перфо­
сетевого кота из главы 3. Отладив и запустив про­
рированных печатных плат вместо беспаечных плат
грамму чтения показаний контроллера джойстика,
позволяет делать схемы более прочными и мень­
заметьте значения показаний движений джойсти­
шего размера. С другой стороны, работать с ними
ка влево и вправо и сохраните их для применения
труднее, чем с беспаечными макетными платами.
в программе клиента.
На рисунках показана компоновка как для схемы на
Обратите внимание на особый монтаж кнопки под-
беспаечной плате (см. рис. 5.5), так и на перфоплате
ключения/отключения. Вместо согласующего рези­
с пайками (см. рис. 5.6), так что вы можете выбрать
стора в 10 К она соединена с «землей» резистором
тот способ монтажа, который вам более удобен.
номиналом в 100 Ом, подключенным последова­
тельно со светодиодом (см. рис. 5.4). В результате Для окончательной сборки контроллера вам потре­
при нажатии кнопки светодиод сразу загорается. буется корпус. Можно приобрести в магазине ра­
Для этого не нужно никакого кода — при нажатии диодеталей уже готовый корпус, а можно и сделать

Расстояния от края шаблона до


ближнего края отверстия для
соответствующего разъема
До разъема питания 1 87"

До разъема иЭВ 1 84"

До разъема Е Ш е п ^ 1 04"

_ \
Разъем Разъем |
ЕШегпе! ЦЭВ *
06"х07" ‘

Разъем -------
питания |
0 43" х 0 36"!______
Сделайте надсечки и согните по
пунктирным линиям

-у -
-ч-\

Рис. 5.9. Шаблон для корпуса


контроллера джойстика.
Отверстия
) диаметром 0,2"
для светодиодов Заготовку можно вырезать
\ о из плотного картона, а затем
( 3-3/16’ согнуть по линиям разметки
Отверстие V
диаметром 1,25" о и склеить. Размеры шаблона будут
для кнопки
V Г' зависеть от вашей сборки схемы
контроллера, поэтому измените их,
как требуется. Хотя на рисунке они
\
\ \ указаны точно, в действительности
Ч Х
Расстояния от края 4" размеры были взяты с готового
шаблона до центров 1 6" V -ч
отверстий 25 V ---------\ корпуса
204 Глава 5

его самому. Например, пенал для карандашей, ко­ резаку — отлично, а если нет, то, обладая твердой
торый можно приобрести в магазине канцтоваров, рукой, вполне приемлемый корпус можно сделать
хорошо подойдет для этой цели. Просверлите в и с помощью ножа для картона.
крышке отверстия для кнопки и светодиодов, вы­
Первые два прототипа шаблона корпуса контролле­
режьте отверстие большего размера для джойстика,
ра джойстика я сначала нарисовал от руки и вырезал
прорежьте отверстия в боковой стенке под разъемы
из бумаги, а затем из обычного картона. Конечную
платы Arduino и шилда Ethernet, и вы получите
версию заготовки из плотного картона я разметил
корпус для контроллера. А если вы умеете рабо­
и выкроил только после проверки посадки схемы на
тать с ножом для картона, то можете попробовать
черновых версиях. Сделайте неглубокие надсечки
сделать корпус из плотного картона. На рис. 5.8 по­
на внутренней части выкройки корпуса, чтобы ее
казан корпус, который я самостоятельно соорудил
было легче сгибать.
для своего контроллера, а на рис. 5.9 — шаблон для
его выкройки. Если у вас есть доступ к лазерному

□ Пишем код /*
Клиент джойстика
Программу клиента джойстика Контекст : Arduino
начнем с импорта необходимых
библиотек и настройки сетевого Эта программа позволяет Arduino управлять одной ракеткой
подключения для клиента. Это в игре в сетевой пинг-понг.
*/
подобно тому, как мы делали
для проекта измерителя качества
#include <SPI.h>
воздуха в главе 4, но для адреса
#include <Ethernet.h>
сервера укажите адрес своего
компьютера: // Вместо выделенных жирным шрифтом значений укажите значения
// для ваших устройств и сети
byte m a c [] = { 0x00, ОхАА, ОхВВ, ОхСС, OxDE, 0x01 };
IPAddress i p (192,168,1,20);

// IP-адрес компьютера, на котором будет исполняться сервер


// сетевого пинг-понга:
IPAddress server(192,168,1,100);

т Нам потребуется несколько const int connectButton = 2; // Кнопка подключения/отключения


констант для контактов ввода const int connectionLED = 3; // Светодиод индикации состояния
и вывода, левого и правого пре­ // подключения
дельных значений джойстика, const int leftLED = 4; // Светодиод индикации движения
а также минимального периода // влево
времени между сообщениями const int rightLED = 5; // Светодиод индикации движения
серверу. Кроме того, нам будут // вправо
нужны глобальные переменные const int left = 200; // Левое предельное значение
для клиента подключения, пре­ // джойстика
дыдущего состояния кнопки под­ const int right = 800; // Правое предельное значение
ключения и для отметки времени // джойстика
последнего сообщения, отправ­ const int sendlnterval == 20; // Минимальное время между
ленного серверу. // сообщениями на сервер
const int debouncelnterval = 15; // Для сглаживания ввода кнопки
Замените значения констант для Client client; // Экземпляр класса Client для
левого и правого предельных // подключения
значений джойстика значениями, mt lastButtonState = 0; // Предыдущее состояние кнопки
полученными при тестировании long lastTimeSent = 0; // Метка времени последнего
вашего джойстика: // сообщения серверу kk
Связь в режиме реального (почти) времени 205

Ш Метод setup о всего лишь от­ void setup ()


крывает последовательную связь {
и связь Ethernet и инициирует // Инициализируем последовательный порт и порт Ethernet:
контакты цифрового ввода/вы- Ethernet.begin(mac, ip);

вода: Serial.begin(9600);
// Инициализируем цифровые вводы и выводы:
pinMode(connectButton, INPUT);
pinMode(connectionLED, OUTPUT);
pinMode(leftLED, OUTPUT);
pinMode(rightLED, OUTPUT);
delay(1000); // Даем шилду Ethernet время дня инициализации
Serial.println("Выполняется запуск");

Ш Основной цикл начинает : void loop ()


работу с обновления значения {
переменной текущего времени, // Текущее время в миллисекундах:
которая используется для отсле­ long currentTime = millisO;
живания частоты отправки со­ // Проверяем, была ли нажата кнопка:

общений на сервер. Затем выпол­ boolean buttonPushed = buttonRead(connectButton) ;

няется проверка, была ли нажата


// Если кнопка была только что нажата:
кнопка подключения. Если была,
if (buttonPushed) {
значит клиент уже подключен,
// Если клиент подключен, отключаем его:
и выполняется отключение. Если I
if (client.connected()) {
же нет, то выполняется попытка
Serial.println(«Отключаемся...»);
подключения:
client.print(«х»);
client.stop();
} // Если клиент отключен, пытаемся подключиться:
else {
Serial.println(«Подключаемся...»);
client.connect(server, 8080);

мм Далее проверяем, подключил­ // Если клиент подключен и период отправки сообщения истек:
ся ли клиент к серверу и прошло if (client.connected() && (currentTime -
ли достаточно времени после по­ lastTimeSent > sendlnterval)) {
следней отправки сообщения на // Считываем показания джойстика и отправляем
сервер. Если да, то считываем // соответствующие сообщения:
показания джойстика, и если он int sensorValue = analogRead(АО);
находится в одном из крайних if (sensorValue < left) { // Движемся влево
положений, отправляем сообще­ client.print(«1»);
ние на сервер и включаем соот­ digitalWrite(leftLED, HIGH);
ветствующий светодиод. Если
джойстик находится в среднем
положении, выключаем свето­ if (sensorValue > right) { // Движемся вправо
диоды. Затем сохраняем текущее client.print(«г»);
время, как время отправки по­ digitalWrite(rightLED, HIGH);
следнего сообщения.
206 Глава 5

В зависимости от времени от­ // Если посредине, выключаем светодиоды:


зыва вашего сервера и чувстви­ if (left < sensorValue && sensorValue < right) {
тельности датчиков, вам может digitalWrite(rightLED, LOW);
потребоваться откорректировать digitalWrite(leftLED, LOW);
значение переменной зепбУа1ие. }
Вполне достаточно для началь­ // Сохраняем это время, как время отправки
ного значения этой переменной // последнего сообщения:
20 миллисекунд, но если окажет­ lastTimeSent = currentTime;
ся, что при большом числе кли­
ентов сервер начинает работать
медленно, увеличьте его:
ШВ завершение устанавливаем // Устанавливаем светодиоды подключения в зависимости
состояние светодиодов подклю­ // от состояния подключения:
чения на основе состояния под­ digitalWrite(connectionLED, client.connected());
ключения самого клиента:
И вот еще что. Мы не хотим от­ // Этот метод считывает состояние кнопки, чтобы установить,
ключаться или подключаться к // не изменилось ли оно только что с низкого на высокое,
// а также устраняет дребезг контактов кнопки:
серверу просто по наличию вы­
сокого уровня кнопки подключе­ boolean buttonRead(int thisButton) {
ния. Нам нужно отправлять со­ boolean result = false;
общение только тогда, когда сиг­ // Временное состояние кнопки:
нал от этой кнопки изменяется int currentState = digitalRead(thisButton);
с низкого на высокий, указывая, // Конечное состояние кнопки:
что игрок только что нажал ее. int buttonState = lastButtonState;
Проверка на переход с низкого на // Получаем текущее время для измерения интервала устранения
// дребезга контактов:
высокий уровень сигнала кноп­
long lastDebounceTime = millisO;
ки подключения осуществляет­
ся сверкой текущего состояния while ((millisO - lastDebounceTime) < debouncelnterval)
кнопки с ее предыдущим состоя­
нием. Метод для этой проверки // Считываем состояние кнопки в локальную переменную:
вызывается из главного цикла. currentState = digitalRead(thisButton);

Этот метод также устраняет дре­ // Если состояние изменилось вследствие электрического
безг контактов кнопки, проверяя // шума:
if (currentState != buttonState) {
в течение нескольких дополни­
// Сбрасываем таймер устранения дребезга контактов:
тельных миллисекунд, не изме­
lastDebounceTime = millisO;
нилось состояние кнопки по­ }
сле первоначального считывания
ее состояния. Дребезгом контак­ // Каким бы ни было текущее состояние уровня сигнала
тов называется ситуация, когда // кнопки, оно было таковым более длительное время,
// чем интервал для устранения дребезга контактов,
при замыкании или размыкании // поэтому берем его как действительное текущее
контактов кнопки они в течение // состояние кнопки:
некоторого времени вибрируют, buttonState = currentState;
смыкаясь и размыкаясь, пока не }
установятся в конечном положе­ // Если состояние сигнала кнопки изменилось и оно высокое:
нии. Чем дешевле выключатель, if(buttonState != lastButtonState && buttonState == HIGH) {
result = true;
тем выше его дребезг. Если ока­
жется, что ваша кнопка дает не­
сколько показаний при каждом // Сохраняем текущее состояние для следующего раза:
нажатии, увеличьте значение lastButtonState = buttonState;
переменной debounceInterval на return result;
несколько миллисекунд:
Связь в режиме реального (почти) времени 207

С 6 Клиент № 2: клиент балансировочной доски


Нашим вторым клиентом будет балансировочная сделайте две прорези длиной по 12 дюймов (30 см)
доска. Для генерирования управляющих сигналов и шириной в толщину картона. Ширина прорезей
становимся на доску и наклоняем ее вправо или вле­ в доске, показанной на рис. 5.10, составляет око­
во. Чтобы удерживать показания посредине, нужно ло дюйма (2,5 см). Каждая прорезь расположена
балансировать на доске таким образом, чтобы она на расстоянии 2,5 дюйма (5 см) от диаметра до­
оставалась параллельной поверхности, над которой ски (рис. 5.10). Склейте оба круга вместе, гофрами
находится. Наклон доски определяется акселероме­ одного круга перпендикулярно гофрам другого.
тром, вмонтированным в центр доски. Физическое
Далее вырежьте две дуги, как показано на рис. 5.11.
взаимодействие с этим контроллером значительно
Вклейте их в прорези балансировочной доски
отличается от взаимодействия с предыдущим. Для
и дайте клею просохнуть. Убедитесь, что доска
управления контроллером требуется более интен­
полностью просохла и имеет соответствующую
сивное воздействие, что, в свою очередь, требует
жесткость, прежде чем пробовать на ней балан­
большей физической сноровки от пользователя. Но
сировать.
с точки зрения сервера поведение этого клиента
идентично поведению предыдущего. Корпус для клиента балансировочной доски, как
уже ранее отмечалось, выполнен по подобию кор­
Конструкция нашей балансировочной доски осно­
пуса для клиента джойстика. Но на место джой­
вана на разработке Нью-Йоркской организации
стика вставлена кнопка, что позволило убрать вто­
Adaptive Design Association (http://adaptivedesign.
рое большое отверстие и сделать корпус короче.
org), которая занимается вовлечением людей —
Установите контроллер в центре балансировочной
семей и добровольцев-общественников — в соз­
доски, как показано на рис. 5.12.
дание безопасной и доступной мебели для детей
с ограниченными физическими возможностями. Код для клиента балансировочной доски также
Балансировочная доска — прекрасное средство, весьма подобен коду для клиента джойстика. Все,
помогающее им укрепить способность балансиро­ что в нем нужно изменить, — это значения для ле­
вать, пользование которым к тому же приносит удо­ вого и правого предельных значений. Определяем
вольствие. их аналогично определению соответствующих зна­
чений джойстика: ставим схему клиента на балан­
Физическая конструкция корпуса для схемы это­
сировочную доску, программируем Arduino на вы­
го клиента в значительной степени подобна кон­
вод значения аналогового ввода, наклоняем доску
струкции корпуса для клиента джойстика — можно
в обе стороны, записываем показания для каждой
использовать тот же самый шаблон с таким же раз­
стороны, а затем присваиваем эти значения пере­
мещением светодиодов. Только сделайте отверстие
менным l e f t и r i g h t . Все остальное остается тем
для джойстика меньше и установите в него кноп­
же самым. В этом и заключается прелесть простого,
ку, а отверстие для кнопки первого клиента не вы­
четкого протокола: тип физического ввода не имеет
резайте.
значения — при условии, что можно соотнести из­
Для создания самой балансировочной доски вам менения, регистрируемые датчиками, перемещени­
потребуется семислойный гофрированный картон ям влево и вправо и запрограммировать микрокон­
повышенной прочности. Приобрести его можно троллер на отправку соответствующих сообщений.
у многих поставщиков упаковочных материалов. Схемы клиента балансировочной доски: принципи­
Если найти семислойный гофрированный картон альная, монтажные, а также шаблон для выкройки
не представляется возможным, можно склеить вме­ корпуса, показаны на рис. 5.13-5.17.
сте три панели трехслойного гофрированного кар­
Весьма полезно попробовать сделать оба эти кли­
тона. В таком случае нужно следить за тем, чтобы
ента или клиентов своей разработки, чтоб посмо­
направление гофрирования смежных панелей было
треть, как разные физические интерфейсы объектов
перпендикулярно друг другу, — это повысит об­
могут воздействовать на производительность раз­
щую прочность.
ных клиентов, хотя их вывод и кажется для сервера
Вырежьте из картона два круга диаметром при­ одинаковым.
близительно 15 дюймов (40 см). В одном из них
208 Глава 5

44 Рис. 5.10. Основание


балансировочной доски.
Вырежьте два круга такого
размера, но сделайте прорези
для качалок только в одном из
них. Затем склейте оба круга
вместе, гофрами одного круга
12- перпендикулярно гофрам другого.
Разработка организации Adaptive
Design Association

44 Рис. 5.11. Качалка


балансировочной доски.
Таких деталей требуется две.
Разработка организации
Adaptive Design Association

44 Рис. 5.12. Балансировочная доска в действии.


Два диска из семислойного гофрированного картона
склеены с направлением гофрирования одного
перпендикулярно направлению гофрированиям
другого. Это делает доску более жесткой. Корпус
контроллера прикрепляется к доске с помощью
отрезка застежки-липучки
Связь в режиме реального (почти) времени 209

Светодиоды 44 Рис. 5.13. Монтажная


схема клиента
Желтый Белый Красный балансировочной
- Зеленый доски — версия монтажа
на беспаечной макетной
плате. Как можно видеть,
эта схема практически
такая же, как и для
клиента джойстика,
за исключением того,
что здесь использован
акселерометр вместо
джойстика

ж Рис. 5.14.
Принципиальная
схема клиента
балансировочной доски

Reset GND
+3 3V CLK
+5V Шилд MOSI
Gnd Ethernet MISO
Gnd Eth SS
Vin
SD card S S

AREF
Reset GND
+3 3V D13
+5V D12
Gnd D11/PWM
Gnd D10/PWM
селерометр
Акселе! Vin D9/PWM
ADXL330 +5V
ST
Модуль 08
Arduino Кнопка подключения/отключения
Z D7
Y D6/PWM
X Analogo D5/PWM
GND A1 D4
3 3V A2 D3/PWM
A3 D2
A4 Digital 1Л"Х
DigitalO/RX
ЮОО ^ 2200 ^ 2200 2200
A5

0** 0 * * 0 ^ 0 ^
^ L T ..... ^

Светодиоды
210 Глава 5

Рис. 5.15. Монтажная схема клиента балансировочной Рис. 5.16. Паяные соединения
доски на перфорированной макетной плате на обратной стороне
перфорированной макетной платы

Сервер
Задачи сервера сетевого пинг-понга можно разбить ракетки будут иметь еще одно важное свойство —
на две группы: 1) связанные с игрой — например, каждая ракетка будет связана с определенным кли­
перемещение ракеток и мячика и ведение счета и ентом. Конечно же, клиенты также имеют свойства,
2) связанные с отслеживанием новых клиентов. поэтому каждая ракетка будет наследовать 1Р-адрес
Чтобы эффективно управлять всеми этими разными от своего клиента. Все эти свойства выражаются в
задачами, мы применим объектно-ориентированный коде, который определяет ракетку как объект.
подход. Если вы никогда этим раньше не занима­
лись, разберемся сначала с некоторыми базовыми Ракетка также обладает характерным поведением —
понятиями. она перемещается вправо и влево. Это поведение мы
закодируем для ракетки в виде метода, называюще­
гося тсу^еРасШе (). Метод будет обновлять свойства
Анатомия объекта P la y e r ракетки, которые определяют ее местонахождение.
Другое поведение называется эЬомРаасПе о и прори­
Самое важное, что нужно знать об объектах, это то,
совывает ракетку на экране в ее текущей позиции.
что все они обладают свойствами и поведениями.
Мы увидим дальше, почему эти методы реализуют­
Свойства программного объекта во многом подоб­
ся отдельно друг от друга.
ны физическим свойствам. Например, ракетка для
пинг-понга имеет ширину и длину, а также местона­
хождение, которое можно выразить в виде ее гори­
зонтальной и вертикальной позиции. В нашей игре
Связь в режиме реального (почти) времени 211

Рис. 5.17. Шаблон для


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

V-4-----------
1/4 2 Э'16

2 1/4"

Д П иш ем к о д ________
Чтобы определить объект в среде public class Player {
Processing (или в Java), создается // Объявляем переменные объекта:
блок кода, который называется float paddleH, paddleV;
классом. Далее следует нача­ Client client;

ло класса, который определяет


игрока в сервере сетевого пинг-
понга:

Переменные, объявляемые в начале класса, называ­ рукторы. В частности, когда мы создавали новый
ются переменными экземпляра (instance variables). последовательный порт serial в Processing, мы вы­
Каждый новый экземпляр класса создает свои соб­ зывали метод конструктора для класса serial сле­
ственные копии этих переменных. Каждый класс дующим образом:
имеет метод конструктора, который вызывается,
чтобы создать объект. Мы уже применяли конст­ myPort = newSerial (this, portNum, dataRate)
212 Глава 5

Ш Далее приводится метод кон­ public Player (int hpos, int vpos, Client someClient) {
структора ДЛЯ класса Player. Он // Инициализируем локальные переменные экземпляра:
следует сразу же за объявлением paddiеН = hpos;
переменных. Как можно видеть,
paddleV = vpos;
этот метод всего лишь принима­
client = someClient;
ет значения, передаваемые ему
при создании нового экземпляра }
класса Player, и присваивает их
переменным этого экземпляра
(отдельного игрока) класса:

Ш Далее следуют два дру­ public void movePaddle (float howMuch) {


гих метода, упомянутых ранее: float newPosition = paddleH + howMuch;
movePaddle () И showPaddle (). Как // Ограничиваем расположение ракетки шириной окна:
видим, эти методы используют paddleH = constrain(newPosition, 0, width);

переменные экземпляра объекта


со­
(paddleH, paddleV И client) ДЛЯ
public void showPaddle() {
хранения позиции ракетки и про­
rect(paddleH, paddleV, paddleWidth, paddleHeight) ;
рисовки ее на экране:
// Отображаем адрес данного игрока над его ракеткой:
textSize(12);
text(client.i p (), paddleH, paddleV - paddleWidth/8 );

} // Эта фигурная скобка закрывает класс.

J# Вот И весь КОД ДЛЯ определения класса Player Теперь доступ К новому объекту Player и всем его
Я В (отдельного игрока). Поместите этот код переменным и методам можно получить посред­
в конце программы (как показано далее), как буд­ ством переменной newPlayer. (В действительности,
то бы это был любой другой метод. Новый объект новый объект Player хранится не в этой перемен­
класса Player создается следующим кодом: ной, а какой-то области памяти, доступ к которой
предоставляется переменной newPlayer.) Будьте
Player newPlayer = new Player(xPosition,
yPosition, thisClient) внимательны к этому аспекту программы.

Основная программа сервера


сетевого пинг-понга
Прежде чем приступать к написанию кода всего инициализацию, после чего управление передается
сервера, будет полезным создать блок-схему его ло­ методу draw о , который обеспечивает обновление
гики. На рис. 5.18 показана такая блок-схема основ­ экрана и ожидает подключения существующих кли­
ных действий и функций. ентов. При подключении нового клиента генериру­
ется сообщение serverEvent о, КОТОрое активирует
Простоты ради в блок-схему не включены кое- исполнение одноименного метода. Этот метод соз­
какие детали, но в ней ясно отображены основ­ дает новый объект Player. Метод draw () использует
ные взаимоотношения между методами, приво­ методы объектов Player для перемещения и прори­
дящими П р о г р а м м у В ДеЙСТВИе (setup (), draw о и совки соответствующих им ракеток.
serverEvent ()), И объектами ИГРОКОВ Player. Как И В
любой другой программе, метод setup () выполняет
Связь в режиме реального (почти) времени 213

Рис. 5.18. Блок-схема


действий и функций
программы сервера
сетевого пинг-понга
214 Глава 5

Ш нам прежде всего в програм- // Подключаем библиотеку Net:


import processing.net.*;
ме сервера нужно определить ее
переменные. Переменные сгруп­ // Переменные для управления клиентами:
пированы по типу применяемых int port =8080; // Порт, на который сервер ожидает
для отслеживания клиентов и по // подключения
типу используемых для управле­ Server myServer; // Объект сервера
ArrayList playerList = new ArrayListO; // Список клиентов
ния графикой игры:
// Переменные для управления игрой и прорисовки графики:
int ballSize = 10; // Размер мячика
int ballDirectionV = 2; // Горизонтальное направление движения
// мячика
// Влево — отрицательное,
// вправо — положительное
int ballDirectionH = 2; // Вертикальное направление движения
// мячика
// Вверх — отрицательное,
// вниз — положительное
int ballPosV, ballPosH; // Горизонтальное и вертикальное
// положение мячика
boolean balllnMotion = false; // мячик движется?

int topScore, bottomScore; // Счета верхней и нижней команд


int paddleHeight = 1 0 ; // Вертикальный размер ракеток
int paddleWidth = 8 0 ; // Горизонтальный размер ракеток
int nextTopPaddleV; // Позиция ракеток для следующего
// игрока, которого нужно создать
int nextBottomPaddleV;

boolean gameOver = false; // Игра не завершена?


long delayCounter; // Счетчик паузы после окончания
/ / игры
long gameOverDelay = 4000; // Пауза после каждой игры
long pointDelay = 2000; // Пауза после каждого очка

О Т Метод setup о устанавлива­ void setup() {


ет все начальные условия игры, // Задаем размер окна:
а затем запускает сервер: size (480, 640);
// Задаем частоту кадров:
frameRate(90);
// Устанавливаем выравнивание текста:
textAlign(CENTER);
// Рисуем фигуры без окантовки:
noStroke();
// Устанавливаем rectMode так, чтобы все размеры прямоугольников
// были относительно центра прямоугольника (см. справку по
// Processing):
rectMode(CENTER);

// Задаем все детали игры:


// Инициализируем счетчик паузы:
delayCounter = millisO;
// Инициализируем позиции ракетки для первого игрока.
// Позиции увеличиваются с каждым новым игроком:
nextTopPaddleV = 50;
nextBottomPaddleV = height - 50; ►►
Связь в режиме реального (почти) времени 215

1Д // Инициализируем позицию мячика в центре окна:


ballPosV = height / 2;
ballPosH = width / 2;

// Запускаем сервер:
myServer = new Server(this, port);

Q fiМетод draw о обновляет экран, void draw() {


используя метод drawGame(), И drawGame();
listenToClients();
ожидает сообщения от существу­
ющих клиентов, используя метод
listenToClients():

ш При подключении к серверу // Когда к серверу подключается новый клиент, создается


// сообщение ServerEvent.
нового клиента автоматически
void serverEvent(Server thisServer, Client thisClient) {
вызывается метод serverEvent () if (thisClient != null) {
библиотеки Net — скетч Pro­ // Проходимся по списку игроков playerList:
cessing должен содержать этот for (int p = 0; p < playerList.size(); p++) {
метод, чтобы реагировать на со­ // Берем следующий объект в массиве ArrayList
/ / и преобразовываем его в Player:
бытие. Метод использует нового
Player newPlayer = (Player)playerList.get(p);
клиента, чтобы создать новый
объект Player с помощью метода // Если клиент данного объекта Player совпадает
makeNewPlayer (). Далее ПРИВОДИТ­ // с клиентом, созданным событием serverEvent,
СЯ КОД метода serverEvent о : // тогда данный клиент уже является игроком, поэтому
// завершаем исполнение метода и выходим из него:
if (newPlayer.client == thisClient) {
return;

// Если клиент еще не Player, тогда создаем новый объект


// Player и добавляем его в список игроков playerList:
makeNewPlayer(thisClient);

т Разобравшись методами void makeNewPlayer(Client thisClient) {


draw() И serverEvent (), перейдем // Позиция ракетки для нового игрока:
к рассмотрению вызываемых int х = width/2;
ими методов. Лучше всего начать // Если нет игроков, добавляем к верху:
С создания НОВОГО объекта Player, int у = пех^орРабб1еУ;
поэтому первым рассмотрим ме­
тод makeNewPlayer(). /*
Получаем позицию последнего игрока в списке.
Новый объект Player добавля­
Если он в верхней команде, нового игрока добавляем
ется в нижнюю команду, если
в нижнюю команду, и наоборот. Если других игроков нет,
последний игрок был добавлен нового игрока добавляем в верхнюю команду.
в верхнюю команду, и наоборот.
*/
Позиции игроков каждой коман­ // Получаем размер списка?
ды отслеживаются с помощью 1п1 listSize = р1ауегЬ1з^з1ге () - 1;
переменных nextTopPaddleV И // Есть ли другие игроки:
nextBottomPaddleV: i f (listSize >= 0) { ►

216 Глава 5

ВТ // Получаем последнего игрока в списке:


Player lastPlayerAdded = (Player)playerList.get(listSize);
// Если последний игрок вверху, нового добавляем в низ:
if (lastPlayerAdded.paddleV == nextTopPaddleV) {
nextBottomPaddleV = nextBottomPaddleV - paddleHeight * 2;
у = nextBottomPaddleV;
}
// Если последний игрок внизу, нового добавляем в верх:
else if (lastPlayerAdded.paddleV == nextBottomPaddleV)

nextTopPaddleV = nextTopPaddleV + paddleHeight * 2;


у = nextTopPaddleV;
}
}
// Создаем новый объект Player с только что рассчитанной
// позицией и используя клиент, который создал событие
// serverEvent:
Player newPlayer = new Player(x, y, thisClient);
// Добавляем нового игрока (объект Player) в список playerList:
playerList.add(newPlayer);
// Объявляем нового игрока:
println("Y нас новый игрок: " + newPlayer.client.ip());
newPlayer.client.write(«hi\r\n»);
}

m После создания нового игро­ void listenToClients() {


ка (объект Player) нам нужно по­ // Получаем нового клиента, который посылает сообщение:
стоянно ожидать отправки этим Client speakingClient = myServer.available();
Player speakingPlayer = null;
игроком сообщений. Чем чаще
мы проверяем наличие сообще­
// Проходам по списку игроков playerList, чтобы определить,
ний, тем быстрее время реагиро­ // чей клиент отправил данное сообщение:
вания интерактивной цепи между for (int р = 0; р < playerList.size(); р++) {
датчиком и действием. // Берем следующий объект в массиве ArrayList
/ / и преобразовываем его в Player:
Сообщения от клиентов ожидает Player thisPlayer = (Player)playerList.get(p);
метод listenToClients (), КОТОрыЙ // Сравниваем клиента данного игрока thisPlayer с клиентом,
постоянно вызывается из метода // который отправил сообщение. Если они совпадают, тогда
draw о. Если от клиента посту­ // это тот клиент, который нам требуется,
if (thisPlayer.client == speakingClient) {
пают данные, этот метод пред­
speakingPlayer = thisPlayer;
принимает ответное действие.
break;
Сначала он проходит по списку
}
игроков, чтобы определить, нет
ли сообщений от их клиентов.
Затем он проверяет, не отправлял // Считываем сообщение клиента:
ли этот клиент игровые сообще­ if (speakingPlayer != null) {
ния (то есть: «1» для перемеще­ int whatClientSaid = speakingPlayer.client.read();
ния влево, «г» для перемещения /*
вправо или «х» для выхода). При Нас интересуют следующие сообщения клиента:
х = выход
получении любого из этих сооб­
1 = перемещение влево
щений программа реагирует на г = перемещение вправо
него соответствующим образом: V ►>
Связь в режиме реального (почти) времени 217

switch (whatClientSaid) {
// Если клиент говорит выход отключаем его
case Лх' :
// Говорим клиенту "до свидания":
speakingPlayer.client.write(«Ьуе\г\п»);
// Отключаем клиента от сервера:
println (speakingPlayer.client, ip () + <<\t logged out»);
myServer.disconnect(speakingPlayer.client) ;
// Удаляем объект Player клиента со списка
// игроков playerList:
playerList.remove(speakingPlayer);
break;
case '1':
// Если клиент говорит "1", перемещаем ракетку влево
speakingPlayer.movePaddle(-10);
break;
case'г':
// Если клиент говорит "г", перемещаем ракетку вправо
speakingPlayer.movePaddle(10);
break;

# Итак, мы рассмотрели, как сервер прини- выполнения ЭТОЙ задачи является метод drawGame (),
£ И мает новые подключения (используя метод
serverEvent ()), СОЗДаеТ НОВЫХ ИГрОКОВ В ВИДе объ-
который вызывается из метода draw (). Этот метод
выполняет четыре задачи:
ектов Player из новых клиентов (используя метод
• Проходится ПО списку игроков playerList И ПрО-
makeNewPlayer ()) И ОЖИДаеТ Сообщения (иСПОЛЬЗуя
рисовывает все ракетки в их самых последних
метод listenTociients о). Эти действия относятся к
позициях;
части взаимодействия между сервером и клиента­
ми. Кроме того, мы также рассмотрели, как класс • прорисовывает мячик и выводит счет;
player определяет все свойства и методы, связан­
• если игра завершена, выводит сообщение «Игра
ные с каждым новым игроком.
окончена» и делает паузу;
Теперь настало время рассмотреть методы для • после каждого розыгрыша мячика делает паузу,
управления графикой игры. Главным методом для а затем снова подает мячик.

Ш Прорисовка
Далее приводится код метода void drawGame() {
drawGame()!
background(0);

Мы видели раньше, что метод // Прорисовываем все ракетки


listenTociients о в действитель­ for (int р = 0; р < playerList.size(); р++) {
ности обновляет позиции раке­
Player thisPlayer = (Player)playerList.get(p)
ток, используя метод movePaddle ()
объекта Player. Но Метод // show the paddle for this player:
movePaddle () также не прОрИСО- thisPlayer.showPaddle();
вывает ракетки — это делается
методом showPaddle () ТОГО же
объекта Player каждого игрока.
По этой причине эти два метода
в данном объекте разделены. ►

218 Глава 5

// Вычисляем позицию мячика:


Ш Метод тсууеВаЫ о , также вы­
И (ЬаШпМо^оп) {
зываемый здесь, проверяет, стол­
гш^еВаИ () ;
кнулся ли мячик с ракеткой или
«стеной». Затем метод вычисля­ }
// Рисуем мячик:
ет новую позицию мячика, но не гесЬ(ЬаИРоэН, ЬаИРоэУ, Ьа11Э1ге, ballSize);
прорисовывает сам мячик, так
как его нужно прорисовывать, // Показываем счет:
даже если он не движется: з1кжБсоге();

О Если игра закончилась, про­ // Если игра закончена, показываем победителя:


грамма прекращает подавать мя­ if (gameOver) {
textSize(24);
чик и в течение четырех секунд
gameOver = true;
показывает победителя: text(«Игра закончена», width/2, height/2 - 30);
if (topScore > bottomScore) {
text("Выиграла верхняя команда!", width/2, height/2);
}
else {
text("Выиграла нижняя команда!", width/2, height/2);
}
}
// Делаем паузу после каждой игры:
if (gameOver && (millis() > delayCounter + gameOverDelay)) {
gameOver = false;
newGame();

ш После каждого выигранного // Пауза после каждого очка:


очка программа делает двухсе­ if (IgameOver && !ballInMotion && (millis() >
кундную паузу. Если после паузы delayCounter + pointDelay)) {
в игре нет минимум двух игро­
// Проверяем, что есть минимум два игрока:
ков, мячик больше не подается. if (playerList.size() >=2) {
Таким образом предотвращается balllnMotion = true;
исполнение игры, когда никто }
в нее не играет: else {
balllnMotion = false;
Этим закрывается сам метод textSize(24);
drawGame () . Он ВЫЗЫВаеТ неСКОЛЬ- text(«Ожидаем, пока не будет два игрока», width/2,
КО других методов: пкгсеВаПО, height/2 - 30);
// Обнуляем счет:
который вычисляет траекторию
newGame();
мячика, зИоиЗсоге (), который
отображает счет, И newGame (), КО-
торый сбрасывает текущую игру
и начинает новую. Эти методы
рассматриваются далее.

ш Сначала метод пкл^ева11() void moveBallO {


проверяет, не пресекает ли по­ // Проверяем мячик на контакт с ракетками:
зиция мячика ракетку какого- for (int р = 0; р < playerList.size(); р++) {
либо игрока. Для этого ему нуж­ // Берем игрока для проверки:
но пройти по списку игроков Player thisPlayer = (Player)playerList.get(р);
р1ауег!йзб и проверить для каж­
дого находящегося в нем игрока, // Вычисляем горизонтальные края ракетки:
не находится ли позиция мячика float paddleRight = thisPlayer.paddleH + paddleWidth/2;
где-либо в прямоугольнике его float paddleLeft = thisPlayer.paddleH - paddleWidth/2; w
Связь в режиме реального (почти) времени 219

ракетки. Если мячик действи­ // Проверяем мячик на нахождении в горизонтальной


тельно пресекается с ракеткой, // области ракетки:
направление его вертикального if ((ballPosH >= paddleLeft) && (ballPosH <= paddleRight)) {
движения изменяется на обрат­ // Вычисляем вертикальные края ракетки:
ное: float paddleTop = thisPlayer.paddleV - paddleHeight/2;
float paddleBottom = thisPlayer.paddleV + paddleHeight/2;
// Проверяем мячик на нахождении в горизонтальной
// области ракетки:
if ((ballPosV >= paddleTop) && (ballPosV <= paddleBottom)) {
// Изменяем вертикальное направление движения мячика
/ / н а обратное:
ballDirectionV = -ballDirectionV;
}
}
}

££| Если мячик выходит за верх- // Если мячик выходит за верхний предел окна:
ний или нижний предел окна, if {ballPosV < 0) {
одна из команд зарабатывает bottomScore++;
очко. Если одна из команд наби- ballDirectionV = int(random(2) + 1) * -1;
resetBall();
paci свыше шин очков, шра За­
}
канчивается:
// Если мячик выходит за нижний предел окна:
if (ballPosV > height) {
topScore++;
ballDirectionV = int(random(2) + 1);
resetBall();
}

// Если одна команда набирает свыше 5 очков, другая


// команда проигрывает:
if ((topScore > 5 ) || (bottomScore > 5)) {
delayCounter = millisO;
gameOver = true;
}

Ш Наконец, метод moveBallO // He даем мячику выйти за левый или правый предел окна
выполняет проверку на столкно­ if ((ballPosH - ballSize/2 <= 0) ||
(ballPosH +ballSize/2 >=width)) {
вение мячика с одной из сторон
// изменяем направление горизонтального движения
окна. В случае столкновения на­ // мячика на обратное:
правление горизонтального дви­ ballDirectionH = -ballDirectionH;
жения изменяется на обратное: }
// Обновляем местонахождение мячика:
ballPosV = ballPosV + ballDirectionV;
ballPosH = ballPosH + ballDirectionH;
}

□ Метод newGame () просто пере­ void newGame() {


запускает игру и обнуляет счет: gameOver = false;
topScore = 0;
bottomScore = 0;

> ►►
220 Глава 5

Ш Метод зЬсжБсоге () ВЫВОДИТ public void showScoreO {


счет на экран: textSize(24);
text(topScore, 20, 40);
text(bottomScore, 20, height - 20);
}

Ш Наконец, метод resetBall(), void resetBall() {


который вызывается из метода // Возвращаем мячик обратно в центр окна:
тсгуеВа11 о , устанавливает мячик ballPosV = height/2;

в исходную позицию в центре ballPosH = width/2;


balllnMotion = false;
окна после каждого очка:
delayCounter = millis ();
}

0 0 Ценность этого сервера заключается в том,


В В что ему, по сути, все равно, сколько к нему
подключается клиентов — все они смогут играть
в пинг-понг. В программе сервера также нет ничего,
ограничивающего время реагирования для любого
клиента, — сервер пытается обслужить каждого
игрока как можно быстрее. Весьма полезно выра­
ботать у себя привычку закладывать в программу |
такую возможность. Если время обслуживания не­
обходимо каким-либо образом ограничить, не по- Й
лагайтесь на сетевой сервер для выполнения этой
задачи. Всегда, когда это возможно, предоставьте
сети и серверу быть не слишком умными, но бы- |
стрыми и надежными, и пусть клиенты решают, |
как быстро они хотят доставлять свои данные. На I
рис. 5.19 показан снимок экрана окна сервера с дву­
мя игроками-клиентами.

Когда вы отладите программу, чтобы клиенты взаи­


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

Рис. 5.19. Экранный вывод скетча сервера сетевого


пинг-понга
Связь в режиме реального (почти) времени 221

Закл ю чен и е
Базовую структуру клиентов и сервера из проекта этой главы можно использовать всегда, ког­
да вы хотите создать систему, которая управляет одновременными подключениями несколь­
ких объектов сети. Основные задачи сервера состоят в ожидании подключения новых клиен­
тов, отслеживании уже подключенных клиентов, а также в обеспечении передачи сообщений
без ошибок соответствующим клиентам. Из них первостепенной задачей сервера должно быть
ожидание попыток подключения клиентов.

Приоритетной задачей клиента также должно быть Наконец, обязательно заложите надежный способ
ожидание сообщений от сервера, но он должен со­ протестировать систему. Такие простые инстру­
вмещать задачу ожидания ввода от сервера с задачей менты, как клиент telnet и тестовый сервер, сэко­
ожидания данных от устройств физического ввода. номят вам много времени при создании любого
Клиент должен всегда четко и быстро реагировать многопользовательского сервера и помогут быстрее
на локальный ввод, а также всегда показывать со­ завершить разработку игры и начать получать удо­
стояние сетевого подключения. вольствие от ее использования.
Протокол, используемый всеми объектами этой Теперь вы знакомы с примерами как асинхронного
системы для взаимодействия друг с другом, дол­ обмена данными между клиентом и сервером (си­
жен быть как можно более надежным и гибким. стема HTTP, глава 4), так и синхронного (chat-сервер
Предусмотрите возможность расширения диапа­ групповой дискуссии, разд. «Сетевой пинг-понг»
зона команд, так как никогда не известно заранее, в этой главе). Применяя эти инструменты, вы може­
когда может потребоваться добавить ту или иную те создать почти любое приложение с центральным
новую функциональность. Обязательно предусмо­ сервером и несколькими клиентами. В следующей
трите, где это необходимо, ответы от сервера — на­ главе мы отойдем от темы связи Ethernet и рассмот­
пример, «Привет» и «Пока». Сообщения сервера рим разные типы беспроводной связи.
должны быть четко выраженными и, в меру воз­
можностей, краткими.

44Исходные наброски
музыкального ящика
Джин-Йо Мока
Глава б 4 '-

БЕСПРОВОДНАЯ СВЯЗЬ
Если для вас, подобно больш инству людей, эта область представляет
интерес, при чтении предыдущих глав вы, наверное, постоянно
думали «А где же про беспроводную связь?» Возможно даже, что вам
так не терпелось разобраться с этим вопросом, что вы перепрыгнули
через весь предыдущий материал прямо сюда.
Если вы действительно это сделали, возвратитесь назад и прочитайте
весь пропущ енный материал! В частности, если вы не знакомы
с последовательным обменом данными между компьютерами
и микроконтроллерами, прежде чем работать с этой главой,
вам нужно обязательно изучить материал главы 2. А здесь
рассматриваются основы беспроводной связи между объектами —
мы познакомимся с двумя типами беспроводной связи, а затем
создадим несколько рабочих примеров.

В начале главы излагаются принципы работы беспроводной связи


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

44 Зиготы Алекса Байма (www.tangibleinteraction.com)


Это легкие, надутые воздухом резиновые шары, подсвечиваемые изнутри светодиода­
ми. Цвет подсветки шаров меняется в ответ на прикосновение к их поверхности. Шары
взаимодействуют с центральным компьютером посредством радиоканала ZigBee.
Соединенные сетью шары, летая над публикой, позволяют ей непосредственно воз­
действовать не только на сами шары, но также и на музыку, и на проецируемое видео.
Фотография предоставлена Алексом Баймом (Alex Beim).
224 Глава б

4Z Ком поненты для п р о е кто в этой главы


Код поставщ ика США и Европа
• А — Arduino Store (http://store.arduino.cc/ww)
Россия • AF — Adafruit (http://adafruit.com)
• D — Digi-Key (www.digikey.com)
• АМР — «Амперка» (http://amperka.ru)
• F — Farnell (www.farnell.com)
• CHD — «Чип и Дип» (http://chipdip.ru)
• J — Jameco (http://jameco.com)
• LC — «Линуксцентр» (www.linuxcenter.ru)
• MS — Maker SHED (www.makershed.com)
• RS — RS (www.rs-online.com)
• SF — SparkFun (www.sparkfun.com)
• SS — Seeed Studio (www.seeedstudio.com)

Проект 9. Инфракрасное управление цифровой камерой



►Модуль Arduino, 1 шт. Желательно исполь­ D: GH1344-ND, J: 315432, SF: СОМ-10302,
зовать Arduino Uno или его разновидности, но F: 1634684, RS: 718-2213
проект должен работать и на других версиях ►
►Сопротивление 220 Ом, 1 шт.
Arduino и совместимых платах.
AMP: AMP-R220R-10, http://amperka.ru/prod-
АМР: А000066, http://amperka.ru/product/ar- uct/resistor
duino-uno
D: 220QBK-ND, J: 690700, F: 9337792, RS: 707-
LC: 1с8192, http://www.linuxcenter.ru/shop/ 8842
ops_hard/arduino/arduino_uno/

►Сопротивление 10 К, 1 шт.
D: 1050-1019-ND, J: 2121105, SF: DEV-09950, А:
AMP: AMP-R10K-10, http://amperka.ru/prod-
А000046, AF: 50, F: 1848687, RS: 715-4081, SS:
uct/resistor
ARD132D2P, MS: MKSP4
D: 10KQBK-ND, J: 29911, F: 9337687, RS: 707-

►Инфракрасный светодиод, 1 шт.
8906
АМР: АМР-ХОЮ, http://amperka.ru/product/ir-led О Беспаечная макетная плата, 1 шт.
J: 106526, SF: СОМ-09469, F: 1716710, RS: 577-
AMP: АМР-ХООЗ, http://amperka.ru/product/
538, SS: MTR102A2B
breadboard-half

►Кнопка, 1 шт. Подойдет любая.
D: 438-1045-ND, J: 20723 или 20601, SF: PRT-
АМР: АМР-Х026-В, http://amperka.ru/product/ 00137, F: 4692810, AF: 64, SS: STR101C2M или
big-tactile-button STR102C2M, MS: MKKN2

Проект 10. Дуплексная радиосвязь



►Беспаечная макетная плата, 2 шт. ►
►Модуль Arduino, 2 шт. В качестве альтернати­
вы можно взять модуль Arduino Fio, который
АМР: АМР-ХООЗ, http://amperka.ru/product/
специально разработан для работы с модулем
breadboard-half
ХВее, но подойдут любые платы, совместимые
D: 438-1045-ND, J: 20723 или 20601, SF: PRT- с Arduino Uno.
00137, F: 4692810, AF: 64, SS: STR101C2M или
STR102C2M SF: DEV-10116
Беспроводная связь 225


►Радиомодули ХВее стандарта 802.15.4 компа­ • Конденсатор 1 пФ, 2 шт.
нии Digi, 2 шт. СШ): 49716, Л: 94161, Б: Р10312-Ш , Г:
AMP: АМР-Х124, http://amperka.ru/product/xbee 8126933,Вв: 475-9009
J: 2113375, SF: WRL-08664, AF: 128, F: 1546394, • Конденсатор 10 мкФ, 2 шт.
SS: WLS113A4M, MS: MKAD14
АМР: АМР-СЕ10и-10, http://am perka.ru/

►Шилд беспроводной связи Arduino, 2 шт. рп^ис1/е1ес1го1уВс-сарасиог
AMP: А000064, http://am perka.ru/product/ar- Л: 29891, Б: Р11212-Ш , Р: 1144605, Кв:
duino-wireless-shield 715-1638
А: А000064 или А000065 • Адаптерная плата для ХВее, 2 шт.
Вместо указанных шилдов можно использовать
I: 32403, вР: ВОВ-08276, АР: 127
и альтернативные: SF: WRL-09976, AF: 126, F:
1848697, RS: 696-1670, SS: WLS114A0P • Ш тыревой соединитель, 4 шт.

►Потенциометр, 2 шт. АМР: АМР-Х013, http://am perka.ru/prod-
AMP: АМР-Х021, http://am perka.ru/product/
ис^рш-Ьеайегя
potentiometer 1: 103377, Б: А26509-20Ш, вР: РКГ-00116,
J: 29082, SF: СОМ-09939, F: 350072, RS: 522- ¥: 1593411
0625 • Гнездовой разъем, 4 шт.

►USB-XBee адаптер, 1 шт. СШ): 362520493, «1: 2 037747, И: ЗМ9406-
AMP: DFR0174, http://am perka.ru/product/ N 0, Р: 1776193
xbee-usb-converter • Светодиоды, 6 шт.
J: 32400, SF: WRL-08687, AF: 247 АМР: АМР-Х009-Я4, http://am perka.ru/
Следующие комплектующие необходимы только, ргойисШ ей-5тт
если вы не используете шилды беспроводной Б: 160-1144-МЭ или 160-1665-ЫО, Л: 34761
связи Arduino: или 94511, Р: 1015878, Кв: 247-1662 или
* Регулятор напряжения 3,3 В, 2 шт. 826-830, вР: СОМ-09592 или СОМ-09590
CHD: 9020002518, J: 242115, D: 576-1134-ND,
SF: СОМ-00526, F: 1703357, RS: 534-3021

Проект 11. Приемопередатчики Bluetooth



►Модуль Arduino, 2 шт. Желательно исполь­ ►
►Беспаечная макетная плата, 2 шт.
зовать Arduino Uno или его разновидности, но
AMP: АМР-Х003, http://am perka.ru/product/
проект должен работать и на других версиях
breadboard-half
Arduino и совместимых платах.
D: 438-1045-ND, J: 20723 или 20601, SF: PRT-
АМР: А000066, http://am perka.ru/product/ar- 00137, F: 4692810, AF: 64, SS: STR101C2M или
duino-uno STR102C2M
LC: 1с8192, http://www.linuxcenter.ru/shop/ ►
►Светодиоды, 2 шт.
opshard /ard u in o /ard u in o u n o /
AMP: AMP-X009-R4, http://am perka.ru/prod-
D: 1050-1019-ND, J: 2121105, SF: DEV-09950, А:
uct/led-5mm
А000046, AF: 50, F: 1848687, RS: 715-4081, SS:
ARD132D2P, MS: MKSP4 D: 160-1144-ND или 160-1665-ND, J: 34761 или
94511, F: 1015878, RS 247-1662 или 826-830, SF:
COM- 09592 или COM-09590
226 Глава б


►Потенциометр, 2 шт. Подойдет любой аналого­ ►
►Сопротивление 10 К, 2 шт.
вый датчик.
AMP: AMP-R10K-10, http://amperka.ru/prod-
AMP: АМР-Х021, http://amperka.ru/product/ uct/resistor
potentiometer D: 10KQBK-ND, J: 29911, F: 9337687, RS: 707-
J: 29082, SF: СОМ-09939, F: 350072, RS: 522- 8906
0625 ►
►Переходник USB/TTL-Serial типа FTDI, 1 шт.

►Кнопка, 2 шт. Подойдут любые. Подойдет версия как на 5 В, так и на 3,3 В.
Переходник может быть в форм-факторе как ка­
AMP: АМР-Х026-В, http://amperka.ru/product/
беля, так и платы.
big-tactile-button
D: GH1344-ND, J: 315432, SF: СОМ-10302, F: AMP: А000059, http://amperka.ru/product/usb-
1634684, RS: 718-2213 serial-converter

►Сопротивление 220 Ом, 2 шт. SF: DEV-09718 или DEV-09716, AF: 70, A:
A000059, MS: MKAD22, SS: PRO101D2P, D:
AMP: AMP-R220R-10, http://amperka.ru/prod- TTL-232R- 3V3 или TTL-232R-5 V
uct/resistor

►Модуль Bluetooth Mate, 2 шт.
D: 220QBK-ND, J: 690700, F: 9337792, RS: 707-
8842 SF: WRL-09358 или WRL- 10393

Рис. 6.1. Новые компоненты для проектов этой главы:


1. Шилд беспроводной связи Arduino. 2. Адаптерная плата ХВее компании SparkFun.
3 .2-миллиметровые гнездовые разъемы. 4. Шилд Wi-Fi Arduino. 5. Модуль ХВее 802.15.4 компании Digi.
б. XBee-USB адаптер компании Adafruit. 7. Модуль ХВее Explorer компании SparkFun.
8. Инфракрасный светодиод. 9. Модуль Arduino Fio. 10. Штыревой соединитель.
Потребуется также достаточное количество штырьковых контактов для интерфейсных модулей
Беспроводная связь 227

Проект 12. Привет, Wi-Fi!



►Шилд Arduino Wi-Fi, 1 шт. ►
►Сопротивление 10 К, 3 шт.
АМР: А000058, http://amperka.ru/product/ar- AMP: AMP-R10K-10, http://amperka.ru/prod-
duino-wifi-shiel uct/resistor
А: А000058 D: 10KQBK-ND, J: 29911, F: 9337687, RS: 707-

►Модуль Arduino, 1 шт. Желательно исполь­ 8906
зовать Arduino Uno или его разновидности, но ►
►Фотодатчики (светочувствительные резисто­
проект должен работать и на других версиях ры), 3 шт.
Arduino и совместимых платах. AMP: АМР-Х016, http://amperka.ru/product/ldr
АМР: А000066, http://amperka.ru/product/ar- D: PDV- P9200-ND, J: 202403, SF: SEN-09088,
duino-uno F: 7482280, RS: 234-1050
LC: 1с8192, http://www.linuxcenter.ru/shop/ ►
►Беспаечная макетная плата, 1 шт.
opshard/arduino/arduinouno/ AMP: АМР-Х003, http://amperka.ru/product/
D: 1050-1019-ND, J: 2121105, SF: DEV-09950, А: breadboard-half
А000046, AF: 50, F: 1848687, RS: 715-4081, SS: D: 438-1045-ND, J: 20723 или 20601, SF: PRT-
ARD132D2P, MS: MKSP4 00137, F: 4692810, AF: 64, SS: STR101C2M или

►Устройство с Ethernet-подключением к Ин­ STR102C2M, MS: MKKN2
тернету, 1 шт. ►
►Светофильтры, 3 шт. По одному: красный, зе­
леный и синий. Эти детали можно приобрести
в магазинах осветительного оборудования или
фототехники.

Ш П очем у не вся св я зь бесп р о вод ная?


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

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


надежна, как проводная У находятся в зоне действия других
беспроводных устройств
У вас меньше возможностей контролировать ис­
точники помех. Физические провода можно изоли­ Сигнал, передаваемый радио и инфракрасными
ровать и экранировать, но канал радио или инфра­ устройствами, могут принимать все другие устрой­
красной связи полностью изолировать никогда не ства, имеющие соответствующие технические воз­
удастся, — всегда будет присутствовать та или иная можности. Иногда это означает, что передающие
форма помех, поэтому необходимо предусмотреть, устройства сами служат источниками помех для
чтобы все устройства вашей системы знали, что де­ связи между другими устройствами. Например,
лать в случае получения искаженного (или не полу­ устройства Bluetooth, большинство устройств Wi­
чения вовсе) сообщения от своих собеседников. Fi (стандарт 802.11b, g и п) и ZigBee (стандарт
228 Глава б

802.15.4) — все работают в одном и том же ча­ нормально на прием, но не на передачу, и вам мо­
стотном диапазоне: 2,4 ГГц (устройства стандарта жет быть так и не удастся выявить причину этой
802.1 In также работают в диапазоне 5 ГГц). Их кон­ проблемы. Поэтому, начиная разработку проектов
струкция предусматривает, что они не должны соз­ беспроводной связи, следует убедиться в работо­
давать друг другу излишних помех, но если боль­ способности устройств, используя регулируемый
шое количество устройств ZigBee будет работать сетевой источник питания, а уж затем обеспечить
в том же самом месте, что и, например, обширная устройство стабильным источником питания на ба­
сеть Wi-Fi, кто-то из них будет создавать помехи тареях.
для другого.
Устройства беспроводной связи генерируют
Беспроводная связь не означает беспроводного электромагнитную радиацию
питания
Надо также учесть, что каждое используемое нами
Устройства беспроводной связи так же требуют радиоустройство излучает электромагнитную энер­
электрического питания, как и проводные. А когда гию. Та же самая энергия, которая разогревает нашу
они находятся вдали от «розетки», их приходит­ пищу в микроволновке, пересылает наши файлы по
ся запитывать от батарей. Батареи увеличивают Интернету. И хотя результаты многих исследований
вес устройства, а емкость их весьма ограниченна. утверждают, что рабочие уровни излучаемой элек­
Отказ батареи при тестировании проекта может троэнергии используемых нами радиоустройств яв­
вызвать всякого рода ошибки, причиной кото­ ляются безопасными, зачем добавлять даже такие
рых можно ошибочно посчитать что-либо другое. небольшие излучения к излучениям от других ис­
Классическим примером этого является «таинствен­ точников, если в этом нет необходимости?
ная ошибка радиосвязи». Суть ситуации в том, что
радиоустройства обычно увеличивают потребление Сначала создайте проводную версию
электроэнергии при передаче. Это вызывает не­ Рассматриваемые в этой главе радио и инфракрас­
большое падение напряжения источника питания. ные приемопередатчики заменяют провода связи,
Если для радиоустройства не выполнена должным используемые в проектах из предыдущих глав. Но
образом развязка посредством подключения кон­ прежде чем оснащать любое приложение возмож­
денсатора между плюсом и минусом («землей») пи­ ностями беспроводной связи, важно сначала убе­
тания, падение напряжения может быть достаточно диться в работоспособности базового обмена дан­
большим, чтобы вызвать самопроизвольный сброс ными между устройствами по проводному каналу
радиоустройства. Оно будет функционировать связи.

йй Два типа беспроводной связи: инф ракрасная и радио


Большинству людей в своей жизни и работе приходится сталкиваться с двумя видами беспро­
водной связи: посредством инфракрасного излучения и посредством радиоволн. С точки зре­
ния пользователя или разработчика основная разница между ними состоит в их направлен­
ности.
Пульты дистанционного управления для телеви­ работать, используя отражение луча от промежу­
зоров обычно используют инфракрасную связь. точной поверхности, но такая связь весьма нена­
В отличие от радиосвязи, инфракрасная связь зави­ дежна. В конечном итоге, устройства инфракрасной
сит от ориентации передатчика и приемника, кото­ связи являются оптическими устройствами, поэто­
рые должны находиться на линии прямой видимо­ му приемник должен «видеть» излучаемый пере­
сти друг с другом и не иметь никаких препятствий датчиком сигнал. Устройства для запирания две­
на этой линии. Иногда инфракрасная связь может рей автомобилей и открытия гаражей, мобильные
Беспроводная связь 229

44 Рис. 6.2. Сигнал


из инфракрасного светодиода
распространяется в виде
направленного луча (слева),
а сигнал из радиоантенны —
во всех направлениях (справа)

телефоны и многие другие устройства использу­ устройства? Потому что сделать приемопередатчик
ют для создания канала связи радиоволны. Для их более сложно, чем любое из первых двух устройств
работы относительное расположение приемника по отдельности. В приемопередатчике необходимо
и передатчика роли не играет. В большинстве слу­ обеспечить, чтобы приемник не получал излучение
чаев они работают даже через стены. Иными слова­ своего же передатчика, иначе они будут мешать
ми, радиоустройства являются всенаправленными. друг другу и не смогут работать с другими устрой­
ствами. Для многих приложений дешевле исполь­
Таким образом, инфракрасная связь обычно при­ зовать пару передатчик-приемник и обрабатывать
меняется для приложений небольшого радиуса ошибки, просто передавая сообщение несколько
действия и при наличии прямой видимости между раз, пока приемник его не получит. Таким обра­
устройствами, а радиосвязь — для всех прочих зом работают, например, пульты дистанционного
приложений. Разница между направленной инфра­ управления телевизором. Это значительно снижает
красной связью и всенаправленной радиосвязью стоимость устройств.
показана на рис. 6.2.
Но в последнее время все чаще радиоустройства
выполняются в виде приемопередатчиков, исполь­
Передатчики, приемники зующих микроконтроллер для фильтрации помех
и приемопередатчики передатчика на собственный приемник. Все радио­
устройства Bluetooth, ZigBee и Wi-Fi реализуются
Как инфракрасные, так и радиосистемы использу­ таким способом. Однако раздельные передатчики
ют три общих типа устройств: передатчики, кото­ и приемники продолжают встречаться, посколь­
рые излучают сигнал, но не могут принимать его, ку, как уже утверждалось ранее, пара передатчик-
приемники, которые принимают сигнал, но не могут приемник дешевле, чем пара приемопередатчиков.
излучать его, и приемопередатчики, которые могут
делать и то, и другое. Можно задаться вопросом: При планировании своих проектов и приобрете­
почему просто не делать все устройства приемопе­ нии устройств для них имейте в виду эту разни­
редатчиками, поскольку это наиболее гибкий тип цу между парой приемник-передатчик и парой
230 Глава 6

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


вашему проекту двусторонняя связь или же можно все реже оснащаются инфракрасными портами.
обойтись односторонней? Для односторонней связи Тем не менее, инфракрасная связь продолжает ис­
разберитесь, что будет в случае сбоя связи. Сможет пользоваться как экономичный и энергоэффектив­
ли приемник продолжать работать, не посылая пе­ ный вариант связи для приложений дистанционно­
редатчику просьбу уточнить сообщение? Можно ли го управления.
решить эту проблему, отправляя сообщение до тех
пор, пока оно не будет получено? При положитель­ Протоколы передачи данных инфракрасных пуль­
ном ответе на эти вопросы вы, возможно, останови­ тов дистанционного управления большинства
тесь на варианте использования пары передатчик- устройств бытовой электроники у каждого произ­
приемник и сэкономите немного денег. водителя разные. Чтобы расшифровать их, необхо­
димо знать как несущую частоту, так и структуру
сообщений. Большинство коммерческих инфра­
красных устройств управления работают на частоте
Принцип работы
несущей волны от 38 до 40 кГц. Частота несущей
инфракрасной связи волны ограничивает скорость передачи данных на
ней, поэтому скорость передачи данных в инфра­
Устройства инфракрасной связи работают, испуская
красной связи обычно очень низкая — как прави­
на инфракрасном светодиоде импульсы инфракрас­
ло, от 500 до 2000 битов в секунду. Для передачи
ного излучения определенной частоты и получая
большого объема данных эта связь не подойдет, но
такие импульсы с помощью датчика инфракрасно­
для передачи значений нескольких кнопок управле­
го излучения. Это обычная последовательная связь,
ния телевизором вполне приемлема. В отличие от
реализуемая с помощью импульсов инфракрас­
протоколов последовательной связи, которые мы
ного излучения вместо импульсов электричества.
рассмотрели в этой книге ранее, не все протоколы
Поскольку существует множество распространен­
инфракрасной связи используют 8-битовый формат
ных источников инфракрасного излучения (солнце,
осветительные лампочки накаливания, любые ис­ данных. В частности, например, протокол Control-S
точники тепла и т. п.), необходимо делать различие компании Sony имеет три формата слова: 12-, 15-
между такими источниками и инфракрасным сиг­ и 20-битный. А широко используемый многими
налом данных. Для этого, прежде чем подавать по­ пультами дистанционного управления протокол RC5
следовательный вывод на излучающий светодиод, компании Philips использует 14-битный формат.
он подается на осциллятор. Создаваемая осцилля­
тором равномерная волна, которая называется несу­ Если вам нужна инфракрасная связь для дистанци­
щей волной, модулируется накладываемыми на нее онного управления, вы сэкономите много времени,
импульсами сигнала данных. Приемник принимает используя специальную микросхему модулирова­
любое инфракрасное излучение, но отфильтровы­ ния инфракрасного сигнала, вместо того, чтобы
вает все, что не вибрирует на частоте несущей вол­ создавать протокол самому. В этом отношении,
ны. Затем отфильтровывается и излучение несущей в Интернете есть много хороших сайтов, пред­
частоты, оставляя только сигнал данных. Таким об­ лагающих информацию о разных протоколах ин­
разом данные могут передаваться инфракрасным фракрасной связи. В частности, веб-сайт компании
излучением без воздействия на них инфракрасного Reynolds Electronics содержит много учебных посо­
излучения из других источников, если только часто­ бий и предлагает несколько полезных инфракрас­
та излучения этих источников не совпадает с часто­ ных модуляторов и демодуляторов. А на портале
той несущей волны. EPanorama (www.epanoraina.net/links/irremote.htinl)
имеется множество полезных ссылок на описания
Направленность инфракрасной связи сужает круг распространенных протоколов инфракрасной свя­
ее применения, но она дешевле, чем радиосвязь, зи. Существует также ряд Arduino-библиотек для
и требует меньше энергии. Однако по мере того, работы с инфракрасной связью по различным про­
как радиоустройства становятся дешевле, более токолам. Многие из них можно найти на игровой
Беспроводная связь 231

ШКак уви д еть и н ф ракрасн ы й свет?


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

На рис. 6.3 показан инфракрасный светодиод пульта дистанционного управления, просматриваемый


через веб-камеру, подключенную к персональному компьютеру. Слева — светодиод выключен, спра­
ва — включен.

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

площадке для Arduino по адресу http://arduino.cc/ данных. Инфракрасный модулятор можно создать
playground/Main/InterfacingWithHardware. Одну самостоятельно, используя универсальный таймер
из этих библиотек мы используем в нашем следую­ 555!, впрочем, на рынке также имеется достаточное
щем проекте. количество недорогих модулей для модулирования
и демодулирования инфракрасного сигнала.
Если вы создаете и передатчик, и приемник, то путь
ваш достаточно прямолинеен — вам всего лишь
нужен осциллятор, через который вы будете про­
1 Универсальный таймер 555 — аналоговая интегральная
пускать последовательные данные на излучающий
схема, устройство для формирования (генерации) одиночных
инфракрасный светодиод, и приемник, который и повторяющихся импульсов со стабильными временными
ожидает несущую волну и демодулирует сигнал характеристиками.
232 Глава 6

- S u М он и то р и н г и н ф р акр асн ы х си гн а л о в
Для расшифровки инфракрасного сигнала полез­
но использовать осциллограф (рис. 6.4). Если вы
не знаете, на каком протоколе работает ваш пере­
датчик, его можно попробовать расшифровать,
наблюдая за посылаемым передатчиком сигна­
лом. Подключите к источнику питания последо­
вательно инфракрасный фототранзистор, сопро­
тивление и обычный светодиод, как показано на
рис. 6.5. Теперь при освещении фототранзистора
инфракрасным светом будет загораться обычный
светодиод.
Рис. 6.4. Осциллограф может помочь
в исследовании инфракрасного сигнала

Требуемые компоненты

►Беспаечная макетная плата, 1 шт.

►Сопротивление 220 Ом, 1 шт.

►Фототранзистор. Номер детали Digi-key:
365-1068-ND, 1 шт.

►Светодиод, 1 шт.

►Батарейка или источник питания, 5 В или
меньше, 2 шт.

►Осциллограф, 1 шт. (на рис. 6.4 показан
осциллограф DSO Nano)
а
А для наблюдения за инфракрасным сигналом на
осциллографе, подсоедините один щуп к эмитте­
ру фототранзистора, а другой к минусу («земле»)
и облучайте фототранзистор пультом дистан­
ционного управления. Когда на осциллографе
проявится активность, настройте шкалу напря­
жения и времени, чтобы сигнал можно было
хорошо различать. Большинство осциллографов
автоматически отображают частоту измеряемого
сигнала. Установка осциллографа в режим одно­
разового триггера поможет вам захватить сам
сигнал. Когда вы можете увидеть временную
характеристику каждого импульса сигнала, то
сможете вычислить, как дублировать ее, генери­
руя свои импульсы на инфракрасном светодиоде.
Дополнительную информацию в этой области
можно найти во многих блогах по инфракрас­
ному дистанционному управлению с помощью
Arduino. Например, очень хорошее освещение
Рис. 6.5. Схемы для наблюдения за инфракрасным вопроса предлагается в блоге Кена Ширриффа
сигналом: монтажная (а) и принципиальная (б) (Ken Shirriff) на веб-сайте www.arcfn.com.
Беспроводная связь 233

$ Проект 9

Инфракрасное управление цифровой камерой


В этом проекте мы будем управлять цифровой камерой с помощью инфракрасного светодиода
и Arduino. Это самый простой проект инфракрасного управления, какой может быть.

Большинством цифровых зеркальных (SLR2) ка­


мер, доступных сегодня на рынке, можно управ­ Требуемые компоненты
лять дистанционно с помощью инфракрасной свя­ ►
►Модуль Arduino, 1 шт.
зи. Каждый тип камер использует несколько иной
протокол, но все они обычно имеют одинаковые ►
►Инфракрасный светодиод, 1 шт.
основные команды: спустить затвор, спустить за­ ►
►Кнопка, 1 шт.
твор после задержки и автоматическая фокусиров­

►Сопротивление 220 Ом, 1 шт.
ка. Себастьян Зетц (Sebastian Setz) разработал биб­
лиотеку Arduino, которая может посылать сигналы ►
►Сопротивление 10 К, 1 шт.
для наиболее распространенных фотокамер. Она ►
►Беспаечная макетная плата или шилд
была протестирована с камерами компаний Canon, для прототипов, 1 шт.
Nikon, Olympus, Pentax и Sony. Если у вас есть зер­
кальная камера одного из этих производителей, вы,
скорее всего, сможете управлять ею с помощью Загрузите библиотеку Multi Camera IR Control
этой библиотеки. с адреса http://sebastian.setz.name/arduino/my-
libraries/multi-camera-ir-control и скопируйте ее
Схема для проекта предельно простая. Подсоеди­ в подпапку библиотек папки скетчей Arduino.
ните один вывод кнопки к плюсу питания, а вто­ Если это первая устанавливаемая вами библиоте­
рой — к выводу 4 микроконтроллера (с сопро­ ка, то вам нужно будет создать папку библиотек
тивлением утечки номиналом в 10 К). К выводу 3 самому. Местонахождение этой папки см. в разд.
микроконтроллера подключите анод инфракрасно­ «Библиотека TextFinder» главы 4. Установив биб­
го светодиода, а его катод соедините с «землей». лиотеку, перезапустите приложение Arduino, и но­
Монтажная и принципиальная схемы проекта по­ вая библиотека MultiCameralrControl отобразится
казаны на рис. 6.6. в меню Скетч | Импортировать библиотеку.
Теперь все готово, чтобы начинать реализацию
2 SLR, Single Lense Reflex — однообъективная зеркальная камера. проекта.

ШГпишем код : /*
ИК управление камерой
Создание скетча начинаем с им­ Контекст : Arduino
порта библиотеки MultiCamerlr-
Control. Затем инициализируем Этот скетч управляет цифровой камерой с помощью ИК связи.

библиотеку, чтобы посылать сиг­ */


налы на вывод 3 микроконтрол­ // Включаем в код библиотеку для управления камерой:
лера, к которому подсоединен ! #include <multiCameraIrControl.h>
светодиод. Далее объявляем и
определяем несколько перемен­ const int pushButtonPin = 4;
ных для отслеживания состояния // Конфигурируем вывод 3 для управления ИК СД .
// Измените данный код согласно типу вашей камеры:
кнопки: Nikon camera(3);

// Переменные:
I int buttonState = 0 ; // Текущее состояние кнопки
! int lastButtonState = 0 ; // Предыдущее состояние кнопки ^
234 Глава б

A R EF
Reset GND
+3.3V D13
+5V D12
Gnd D11/PWM
Gnd D10/PWM
Vin D9/PWM
D8
Модуль
Arduino
D7 +5V
D6/PWM
Analogo D5/PWM Кнопка

A1 D4
A2 D3/PWM
A3 D2
220П ЮкО
A4 Digital1/TX
A5 DigitalO/RX
ик i
светодиод

Рис. 6.6. Монтажная (а) и принципиальная (б) схемы простейшего инфракрасного контроллера
Беспроводная связь 235

П м е т о д setup () инициализиру- j void setup (){


ет кнопку как устройство ввода: | // Инициализируем кнопку pushbutton как устройство ввода:
I pinMode(pushButtonPin, INPUT);

ш Код основного цикла ожида- j void loop(){


ет изменения состояния кнопки, j // Считываем контакт ввода кнопки:
Так как мы не хотим, чтобы ка- j buttonState = digitalRead(pushButtonPin);
мера постоянно делала снимки, I
то спускаем затвор только тогда, j // Сравниваем текущее состояние кнопки buttonState
// с п р е д ы д у щ и м состоянием.
когда состояние кнопки меняется |
// Если состояние изменилось, и оно высокое в данный момент,
с off на on. Для этого сравнива- j
// тогда кнопку только что нажали:
ем текущее состояние кнопки с j
if (buttonState != lastButtonState && buttonState == HIGH) {
предыдущим, сохраняя текущее j // Посылаем сигнал спуска затвора камеры:
состояние в качестве предыду­ camera.shutterNow();
щего в конце каждого цикла.
| // Сохраняем текущее состояние кнопки как ее последнее
1 // для следующего прохода по циклу.
| lastButtonState = buttonState;
! ;

Вот и вся программа. Теперь вы можете делать с н и м к и удаленно, наводя инфракрасный светодиод на ка-
меру (рис. 6.7). Но для этого вам может потребоваться включить в камере режим удаленного управления.
Чтобы узнать, как это делается, ознакомьтесь предварительно с инструкцией для своей камеры, так как эта
процедура различна для каждого типа камер.

Рис. 6.7. Это устройство


было создано
с использованием
только что описанного
подхода.
Микроконтроллер
Arduino в корпусе
улавливает
изменение показаний
инфракрасного датчика
и посылает камере
инфракрасный сигнал,
чтобы сделать снимок
236 Глава 6

йй П ринцип работы радио


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

Расстояние, на которое можно передавать радио­ кладывается на радиочастоту3. Эта радиочастота


сигнал, зависит от мощности сигнала, чувстви­ играет роль несущей волны, перенося наложенный
тельности приемника, типа антенны, а также от на нее аудиосигнал. В цифровой радиосвязи на не­
любых препятствий на пути сигнала. Чем сильнее сущую частоту накладываются цифровые сигналы,
исходный ток и чем чувствительнее приемник, тем поэтому на каждой стороне связи должно быть со­
больше может быть расстояние между передатчи­ ответствующее цифровое устройство для кодирова­
ком и приемником. Описанные ранее проводники ния и раскодирования этих сигналов. Иными слова­
с протекающим изменяющимся и индуцируемым ми, устройства цифровой радиосвязи по сути пред­
токами играют роль антенн. Антенной может быть ставляют собой модемы, преобразующие цифровые
любой проводник, но некоторые типы проводников данные в радиосигналы, а радиосигналы обратно
работают лучше, чем другие. На передачу сигнала в цифровые данные.
влияет много факторов, включая длину и форму ан­
тенны и частоту сигнала. Конструирование антенн
Радиопомехи
представляет собой отдельную область изучения,
поэтому рассмотреть этот предмет должным обра­ Хотя антенны, которые мы будем использовать для
зом здесь просто невозможно. Но можно привести проектов в этой главе, являются всенаправленны­
основное правило для длины прямой проволочной ми, радиоволны могут блокироваться препятствия­
антенны: ми, попадающимися на их пути, особенно метал­
лическими. Так, большой металлический лист не
Длина антенны = 5616 дюйма / частота в МГц =
позволит радиосигналу, поглощая или отражая его,
14 266,06 см / частота в МГц
пройти к находящемуся за ним приемнику. Это
Более подробную информацию по этому вопросу обстоятельство не только учитывается при проек­
следует искать в технических характеристиках кон­ тировании антенн, но также используется при раз­
кретного используемого вами радио. Документация работке радиочастотных экранов. Если разрезать
на то или иное радиоустройство часто содержит ин­ компьютерный кабель, то вы увидите, что прово­
струкции по созданию для него хорошей антенны. да в нем обернуты тонкой алюминиевой фольгой.
Это и есть радиочастотное экранирование. Целью
экранирования является защита передаваемых по
проводнику данных от воздействия и возможного
Аналоговая и цифровая искажения посторонними радиосигналами. Экран
радиопередача не обязательно должен быть из сплошного листа
металла. Металлическая оплетка, при условии до­
Как и со всем другим в области микроконтрол­
статочного плотного плетения, также хорошо бло­
леров, важно делать различие между аналоговой
кирует радиосигнал. Блокирующая эффективность
и цифровой радиосвязью. В аналоговой радиосвя­
зи берется аналоговый электрический сигнал (на­ 3 Наложение сигнала данных на несущую частоту называется
пример, аудиосигнал) и, чтобы его передать, на­ м од ул яц ией н есущ ей .
Беспроводная связь 237

конкретной экранирующей оплетки зависит от ча­ Особенно коварными источниками радиопомех


стоты, которую она должна блокировать. Возможно являются электрические двигатели и генераторы.
полностью предотвратить проникновение и из­ Принцип работы этих устройств также основан
лучение радиосигналов из помещения, закрыв его на индукции. Дело в том, что на валу электродви­
радиочастотным экраном и заземлив последний. гателя размещены магниты, а на статоре — про­
Такой экран и достигаемый с его помощью эффект волочные катушки. При пропускании переменного
называются клеткой Фарадея — по имени физика электрического тока через катушки генерируется
Майкла Фарадея, который первым продемонстри­ магнитное поле, которое попеременно притягивает
ровал и задокументировал его. и отталкивает магниты, заставляя вал, на котором
они закреплены, вращаться. Аналогично, при вра­
Иногда радиосвязь может блокироваться непредна­ щении каким-нибудь механическим устройством
меренными экранами. Если вы испытываете про­ вала с магнитами электрогенератора в его катуш­
блемы с прохождением радиосигнала, проверьте, ках наводится электрический ток. Таким образом,
нет ли между приемником и передатчиком какого- электрический двигатель или генератор по сути яв­
либо металлического предмета большой площади ляются своего рода радиопередатчиками, которые
типа бронедверей. Ненадежной может быть ино­ генерируют радиоволны на частоте своего враще­
гда и радиосвязь изнутри автомобиля, так как его ния. Только эти волны не несут никакой полезной
кузов действует в этом случае как клетка Фарадея. информации и представляют собой то, что мы на­
Размещение антенны снаружи автомобиля обычно зываем просто радиопомехами.
улучшает радиосвязь. Водные массы также блоки­
руют радиоволны. Эффект экранирования создает­ Существование множества различных источников
ся в большей или меньшей степени любым типом радиопомех обуславливает наличие множества
корпуса радиоустройства. способов помешать распространению полезного
радиосигнала. Поэтому при работе с радиоустрой­
Все электрические устройства, как побочный эф­ ствами важно иметь в виду все возможные источни­
фект их работы, излучают электромагнитные волны. ки радиопомех. Знание распространенных источни­
Любой протекающий по проводнику переменный ков радиопомех и способов защиты от них является
ток может генерировать радиосигнал, даже если это ценным инструментом при диагностировании про­
переменный ток, питающий электрические устрой­ блем радиосвязи.
ства у вас дома или на работе. Вот почему можно
слышать гудение в динамиках, если разместить их
провода параллельно проводу питания, — перемен­ М ультиплексирование
ный ток провода питания индуцирует переменный
ток в проводах динамика, а динамики воспроизво­ и протоколы
дят изменения в токе в виде звука. Точно так же на­ Передаваемый радиосигнал может быть принят лю­
водки переменного тока могут быть причиной про­ бым, кто обладает соответствующим приемником.
блем в работе беспроводной сети передачи данных Сигнал не удерживается в пределах провода, поэто­
вблизи микроволновой печи. Радио Wi-Fi работает му если два передатчики одинаковой частоты ра­
на частотах в гигагерцевом диапазоне, который ботают одновременно, они создают друг другу по­
часто называют микроволновым диапазоном, так мехи. В этом и состоит самый большой недостаток
как длина волны этих сигналов очень коротка по радиосвязи: приемник не может знать, кто отправил
сравнению с радиосигналами более низкой часто­ сигнал, который он получает. В противоположность
ты. Для приготовления пищи микроволновые печи этому, с проводным подключением мы можем быть
генерируют в этом диапазоне волны высокой мощ­ достаточно уверенны, что получаемый по кабелю
ности, которые вызывают очень быстрые колебания электрический импульс исходит от устройства на
молекул воды в пище, что, в свою очередь, вызы­ другом конце кабеля. С радиосвязью такой уверен­
вает ее нагревание. Определенная, хоть и малая, ности нет. Это можно сравнить с нахождением в
часть микроволновой энергии может просачиваться компании с завязанными глазами, когда у всех оди­
за пределы печи, что и является причиной всякого наковые голоса. Единственным способом узнать,
рода радиопомех вблизи микроволновых печей. кто с нами разговаривает, в такой ситуации была бы
238 Глава 6

договоренность, чтобы каждый присутствующий Мультиплексирование содействует более эффектив­


четко представлял бы себя в начале разговора и ни­ ной передаче, выделяя передатчикам их период вре­
кто не перебивал бы его в течение всего разговора. мени или частоту, но оно никоим образом не влияет
Иными словами, мы имеем в виду наличие опреде­ на содержимое передачи. Этим вопросом занима­
ленного протокола связи. ются протоколы связи. Точно так же, как в случае
проводных сетей, протоколы передачи и в радио­
И первое, что все в такой компании должны были связи играют важную роль. Протокол передачи дан­
бы согласовать, это кто когда и сколько говорит. То ных накладывается поверх мультиплексирования.
есть, каждый из присутствующих может занимать Например, Bluetooth, ZigBee и Wi-Fi — это ничего
наше внимание в течение определенного времени. более, чем просто протоколы сетевого обмена дан­
Иными словами, происходит распределение канала ными, наложенные поверх радиосигнала. Все эти
связи по времени. Распределение канала радиосвя­ три протокола с такой же легкостью можно было бы
зи называется мультиплексированием, и в данном реализовать и для проводной сети (и в некотором
случае — временным мультиплексированием (или смысле протокол Wi-Fi им был — в нем исполь­
уплотнением во времени). Каждому передатчи­ зуется тот же самый уровень TCP/IP, что и в сетях
ку предоставляется его временной интервал для Ethernet). Основы этих протоколов ничем не отлича­
передачи. ются от протоколов проводных сетей, что позволяет
разобраться в беспроводном обмене данными, даже
Работоспособность этой схемы, конечно же, зави­ если вы и не радиоинженер. Освежите свои знания
сит от синхронизации всех передатчиков. При от­ основ проводных сетей и методы их диагностиро­
сутствии синхронизации временное мультиплекси­ вания, поскольку мы будем их применять также
рование все еще может работать достаточно хоро­ и в проектах беспроводной связи. А рассматривае­
шо, только если все радиоустройства уделяют пере­ мые здесь методы — просто новые инструменты
даче намного меньше времени, чем приему. Иными в нашем наборе средств диагностирования. Они
словами, если конкретный передатчик передает нам понадобятся в последующих проектах.
каждую секунду лишь в течение нескольких мил­
лисекунд и если число передатчиков ограниченно,
то шансы наложения сообщений от двух разных Радиопередатчики, приемники
передатчиков сравнительно невысоки. Это общее и приемопередатчики
правило совместно с правилом требования уточне­
ния сообщения приемником может обеспечить до­ Каким критерием нам руководствоваться, решая,
статочно качественную радиосвязь. что применять: пару передатчик-приемник или же
пару приемопередатчиков? Проще всего ответить,
Но вернемся к нашей компании. Если бы каждый что если требуется обратная связь от устройства,
присутствующий в ней говорил голосом с другим которому ведется передача, нам нужна пара при­
тоном, мы могли бы различать каждого говоряще­ емопередатчиков. В большинстве случаев так оно
го по тону его голоса. В терминах радиосвязи это и есть. Более того, по мере того, как стоимость
называется мультиплексированием с разделением производства (и, соответственно, приобретения)
частот (или уплотнение по частоте). Это означает, приемопередатчиков продолжает снижаться, пары
что приемник должен быть в силах одновременно передатчик-приемник встречаются все реже и реже.
принимать на нескольких разных частотах. Но если
имеется координирующее устройство, которое вы­ На рынке имеется множество разнообразных при­
деляет частоты каждой паре передатчиков и прием­ емопередатчиков данных. Самые простые радио­
ников, то такой подход оказывается весьма эффек­ приемопередатчики на рынке подключаются на­
тивным. прямую к выводам последовательной передачи и
приема микроконтроллера. Все последовательные
В каждой системе цифровой радиосвязи применя­ данные, посылаемые на линию передачи, отправ­
ются разные комбинации временного и частотного ляются в виде радиосигнала, а все радиосигналы,
уплотнения. Но в большинстве случаев нам этим получаемые приемником, посылаются на линию
озабочиваться не придется, так как решением дан­ приема микроконтроллера. Такие приемопередат­
ного вопроса занимается само радиоустройство. чики легко подключить, но вам придется самому
Беспроводная связь 239

управлять всем процессом обмена данными. Если требуется освоить немного больше материала по
приемник пропустит бит данных, все сообщение части сетевых протоколов, но полученная отдача
будет искажено. А на качестве приема может от­ будет намного превышать столь небольшое усилие.
рицательно сказываться любое находящееся по­
близости радиоустройство, работающее в том же Самая большая разница между сетевыми радио­
самом частотном диапазоне. Конечно, при условии устройствами и простыми приемопередатчиками
использования только одной пары приемопередат­ заключается в том, что каждое сетевое устрой­
чиков и отсутствия радиопомех, такие устройства ство имеет свой однозначный адрес. Это означает,
обеспечивают достаточно качественную связь. Но что необходимо решать, осуществляется ли связь
подобные обстоятельства случаются не часто. с каким-либо конкретным устройством и с каким
именно, или же связь осуществляется со всеми дру­
В настоящее время большинство приемопередатчи­ гими устройствами сети.
ков на рынке реализуют сетевые протоколы, управ­
ляя обменом данных самостоятельно. Например, Вследствие усложнений сетевого управления, все
модем Bluetooth в проекте из главы 2 игнорировал сетевые радиоустройства обычно имеют два режи­
сигналы от других устройств Bluetooth, не связан­ ма работы: командный и данных (см. главу 2). При
ных с ним, а также выполнял проверку ошибок. рассмотрении протокола связи для сетевого радио­
Радиоустройства ХВее, которые мы задействуем устройства один из первых моментов, с чем следует
в следующем проекте, делают то же самое и многое разобраться, — это как переключать устройство из
другое, как мы увидим в главе 7. Для работы с ними командного режима в режим данных и наоборот.

^ Проект 10

Дуплексная радиосвязь
В этом проекте мы подсоединим радиоприемопередатчик и потенциометр к микроконтролле­
ру. Для создания канала связи потребуется две такие схемы. Каждый микроконтроллер будет
посылать сигнал другому, когда значение его потенциометра изменится больше, чем на 10 еди­
ниц измерения. Когда один из микроконтроллеров получает сообщение, он указывает на это
событие, зажигая светодиод. Каждое устройство также оснащено светодиодом для локальной
обратной связи.

Требуемые компоненты Вместо шилдов беспроводной связи или мо­


дулей Arduino Fio радиомодули ХВее можно

►Беспаечная макетная плата, 2 шт. подключить к платам Arduino, используя сле­
дующие компоненты:

►USB-XBee адаптер, 1 шт.
• Регулятор напряжения 3,3 В, 2 шт.

►Модуль Arduino, 2 шт. Хорошей альтернативой
• Конденсатор 1 мкФ, 2 шт.
будет модуль Arduino Fio, который специально
• Конденсатор 10 мкФ, 2 шт.
предназначен для работы с модулями ХВее.
• Адаптерная плата для ХВее, 2 шт.

►Радиомодули ХВее стандарта 802.15.4 компа­ • Штыревой соединитель, 4 шт.
нии Digi, 2 шт. • Гнездовой разъем, 4 шт.

►Шилд беспроводной связи Arduino, 2 шт. • Светодиод, 6 шт.
• Потенциометр, 2 шт.

Используемые в этом проекте радиоприемопере­ лишь немногими преимуществами спецификации


датчики реализуют протокол беспроводной сетевой 802.15.4. Эти протоколы предназначены для орга­
связи 802.15.4, на котором основана специфика­ низации взаимодействия между многими разны­
ция ZigBee. В этом проекте мы не воспользуемся ми устройствами по многоуровневой сетевой схе­
никакими преимуществами стандарта ZigBee и ме. Каждое устройство имеет однозначный адрес,
240 Глава 6

и при отправке сообщения необходимо указать радиоустройство, диагностика таких проблем мо­
адрес устройства, которому это сообщение предна­ жет представлять трудности. В связи с этим обстоя­
значено. Устройства также могут посылать широко­ тельством мы будем создавать этот проект поэтап­
вещательные сообщения, то есть сообщения, пред­ но. Сначала мы установим последовательную связь
назначенные для всех других устройств в радиусе с самим радиомодулем, чтобы задать его собствен­
действия. Этот вопрос рассматривается более под­
ный адрес и адрес устройства, которому будут от­
робно в главе 7. Но для данного проекта мы будем
правляться сообщения. Затем мы создадим про­
обмениваться сообщениями только между двумя
устройствами, для чего каждому из них будет пре­ грамму, которая отправляет сообщения с микрокон­
доставлен адрес другого. троллера при изменении значения потенциометра
и ожидает поступление сообщения на другое под­
Проблемы с беспроводной связью могут вызывать­ ключенное к компьютеру радио. Наконец, мы ор­
ся многими разными причинами, и поскольку для ганизуем обмен сообщениями между двумя микро­
обнаружения радиопередачи требуется рабочее контроллерами, используя для этого радиоканал.

Вы бор радиом одуля Х В ее


Компания Digi производит несколько версий Радиомодули ХВее компании Digi могут осна­
радиомодуля ХВее, и может быть непонятно, щаться антеннами разного типа. Но только два
как выбрать среди них наиболее подходящий варианта модуля — с проволочной антенной и
вам модуль. Наиболее популярны модули типа со встроенной антенной — не требуют дополни­
«точка-многоточка», которые позволяют посы­ тельных деталей, поэтому я рекомендую их для
лать как направленные, так и широковещатель­ наших проектов.
ные сетевые сообщения. Эти модули легче всего
организовать в сеть типа «звезда» (см. главу 3). Каталожные номера этих моделей следующие:
Так называемые решетчатые модули дополни­ • маломощный модуль Digi ХВее 802.15.4:
тельно позволяют организовывать многоуровне­ XB24-AWI-001 или ХВ24-АС1-001 (рис. 6.8,
вые решетчатые сети, но их труднее настраивать слева);
и работать с ними. Решетчатые сети подроб­
• модуль с расширенным радиусом действия
но рассматриваются в отличной книге Роберта
Digi Х В е е ^ О 802.15.4: XBP24-AWI-001 или
Фалуди «Building Wireless Sensor Networks» (из­
ХВР24-АС1-001 (рис. 6.8, справа).
дательство O’Reilly). Но для большинства люби­
тельских проектов организовывать решетчатую
сеть будет, пожалуй, чересчур, поэтому в данной
книге мы используем радиомодули типа «точка-
многоточка».

Базовая модель, маломощный модуль ХВее


802.15.4— самый дешевый и имеет номинальный
радиус действия около 300 метров. Заявленный
радиус действия более продвинутой модели
XBee-PRO 802.15.4 — около полутора киломе­
тров (на практике я никогда не получал больше,
чем 400 метров), но и потребляет больше энер­ Рис. 6.8. Модули радио ХВее 802.15.4: слева —
гии. Для проектов в этой книге можно взаимо­ маломощный модуль со встроенной антенной;
заменяемо использовать любую из этих моделей. справа — модуль расширенного радиуса действия
XBee-PRO со штыревой антенной. Ф о т о гр а ф и и
п р е д о ст а в л е н ы к о м п а н и е й D ig i In te rn a tio n a l
Беспроводная связь 241

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


для радиом одулей Х В ее
На рынке доступно самое разнообразное вспо­ • подключая модуль ХВее к микроконтрол­
могательное оборудование для радиомодулей леру — для этого нужна или адаптерная пла­
ХВее, поэтому решить, что именно вам требует­ та, на которой устанавливается модуль ХВее,
ся, может быть затруднительно. В проектах этой или шилд беспроводной связи для обычного
книги мы будем использовать радиомодули ХВее модуля Arduino (рис. 6.10). Можно также ис­
в основном тремя способами: пользовать модуль Arduino Fio (рис. 6.11), ко­
торый оснащен разъемом для установки моду­
• подключая модуль ХВее к компьютеру по­
ля радио ХВее;
средством адаптера USB/XBee. На рынке
предлагается много разных таких адаптеров. • подключая модуль ХВее самостоятельно —
На рис. 6.9 показаны две модели: адаптер для этого можно использовать обычную адап­
XBee/USB, поставляемый компаниями Adafruit терную плату для ХВее или адаптерную плату
и Parallax (слева) и адаптер ХВее Explorer про­ ХВее LilyPad (рис. 6.12). Адаптерные платы
изводства компании SparkFun (справа). Оба ХВее LilyPad и ХВее Explorer Regulated (но­
адаптера оснащены светодиодами для инди­ мер по каталогу SparkFun: WRL-09132), а так­
кации последовательной передачи и приема же адаптерный набор ХВее компании Adafruit
данных. Модель от компании Adafruit также (номер по каталогу Adafruit: 126) оснащены
оснащена светодиодами для индикации сопря­ встроенными регуляторами напряжения, что
жения устройства с определенной сетью и его позволяет использовать модуль ХВее с более
пребывания в режиме сна. Светодиод индика­ широким диапазоном источников питания.
ции режима сна подключен к выводу 13, на ко­
ш .. . ■..
тором устанавливается низкий уровень, когда
радио находится в режиме сна, и высокий, ког­
да устройство активно. Светодиод сопряжения
с сетью подключен к выводу 15. Этот светоди­
од мигает, когда радио сопряжено с сетью;

ж Рис. 6.11. Вспомогательные платы ХВее:


модуль Arduino Fio
ж Рис. 6.9. Вспомогательные платы ХВее: адаптер
XBee/USB (слева) и плата ХВее Explorer (справа)

44 Рис. 6.10. « Рис. 6.12.


Вспомогательные Вспомогательные
платы ХВее: шилд платы ХВее:
беспроводной адаптерная плата
связи Arduino ХВее LilyPad
242 Глава 6

О Шаг 1. Настройка модулей ХВее


Легче всего подключить модуль ХВее к персональ­ оснащенной разъемами, расстояние между контак­
ному компьютеру с помощью адаптера ХВее/и8В. тами которых подходит для разъемов радио ХВее
Со времени выхода первого издания этой книги (см. разд. «Выбор вспомогательного оборудования
популярность устройств ХВее возросла в экспо­ для радио ХВее» этой главы).
ненциальном масштабе, и сейчас для них доступны
разнообразные версии адаптеров (большинство по­ Вставьте радиомодуль ХВее в адаптер, подсоедини­
ставщиков компонентов любительской электроники те адаптер к разъему Ш В компьютера и откройте
предлагают свою версию). Это, по сути, обычные программу терминала последовательной связи.
адаптеры ивВ/ТТЬ-Зепа!, установленные на плате,

Установка радиомодуля ХВее на адаптерную плату


Штырьки разъемов платы радио­
модуля ХВее размещены на рас­
стоянии 2 мм друг от друга, что
меньше, чем стандартные рассто­
яния, вследствие чего плату ХВее
нельзя подсоединить к плате ми­
кроконтроллера напрямую. Эту
проблему можно решить, припа­
яв провода к штырькам платы или
установив модуль на адаптерную
плату. Такая адаптерная плата для
модуля радио ХВее предоставля­
ется компанией БраткРип (номер
по каталогу ВОВ-08276). Но пла­
та поставляется в виде набора
деталей, который нужно еще со­
брать. Для этого сначала впаяйте
в плату штырьковые разъемы для
установки адаптерной платы в
плату микроконтроллера. Затем
впаяйте гнездовые разъемы для
установки радиомодуля ХВее в
адаптерную плату. Чтобы обеспе­
чить точное сопряжение модуля
ХВее с адаптерной платой, пре­
жде чем впаивать гнездовые разъ­ ж Рис. 6.13. Адаптерная плата для радио ХВее на различных этапах
емы, рекомендуется надеть их на сборки.
штыревые разъемы платы радио­ Внизу: плата раздельно с разъемами.
модуля ХВее, а затем вставить их Вверху справа: плата с вмонтированными разъемами.
в адаптерную плату и только за­ Вверху слева: плата с установленным радио ХВее
тем припаять (рис. 6.13).
Беспроводная связь 243

Протокол управления модуля ХВее ожидает, чтобы Не нажимайте клавишу <Enter> и никакую другую
каждая команда завершалась только символом воз­ клавишу в течение минимум одной секунды после
врата каретки (\г, или ASCII 13). Но большинство ввода этой команды. Модуль ХВее должен возвра­
программ терминала последовательной связи по­ тить следующий ответ:
зволяют настраивать символ, который посылается
ок
при нажатии клавиши <Enter>.
Этот шаг подобен операции с модемом Bluetooth в
Для настройки этого символа в программе CoolTerm
главе 2, где мы вводили команду $$$, чтобы переве­
для Mac OS X и Windows нажмите кнопку O ptions,
сти устройство в командный режим. Радиомодуль
в левой панели открывшегося окна опций подклю­
ХВее также использует набор команд в стиле мо­
чения выберите опцию Terminal, а затем в правой
демов АТ, только в командный режим его перево­
части окна в разделе Enter K ey Em ulation устано­
дит команда +++. Секундная пауза после ввода этой
вите значение CR (рис. 6.14).
строки называется защитным интервалом (guard
В программе PuTTY для Windows и Ubuntu Linux time).
выберите в левой панели узел Term inal и в правой
части окна установите флажок Im plicit LF in every Если в течение 10 последующих после ответа моду­
CR (рис. 6.15). ля секунд ничего не вводить с клавиатуры, модуль
выйдет из командного режима. В таком случае вам
Настроив терминал последовательной связи, от­ нужно будет снова ввести команду +++, прежде чем
кройте порт и введите следующую команду: переходить к следующему шагу.
+++

Рис. 6.14. Окно опций программы CoolTerm. Чтобы применять эту программу для настройки радиомодуля
компании Digi (ХВее и пр.), установите в разделе Enter Key Emulation переключатель CR
244 Глава 6

Рис. 6.15. Меню настройки терминала


PuTTY. Чтобы применять эту программу
для настройки радиомодулей
компании Digi (ХВее и пр.), установите
флажок Implicit LF in every CR

Получив ответ ок от модуля ХВее, установите его сообщения. Убедитесь, что устройство находится
адрес. Протокол ХВее использует 16-разрядные в командном режиме (+++) и выполните команду:
или 64-разрядные адреса, поэтому адрес состоит
ATDL\r
из двух частей: старшего слова и младшего слова.
(В компьютерной терминологии два или больше Модуль должен ответить:
байтов, представляющие одно значение, иногда
называются словом.) Для этого проекта мы вос­ о
пользуемся 16-разрядной адресацией, что позволит Как можно видеть, по умолчанию адрес назначения
выбирать для модулей произвольные адреса. Для этих модулей равен 0. Но адрес назначения состоит
установки этого типа адреса нужно только младшее из двух слов, поэтому, чтобы узнать старшее слово,
слово. Введите следующий текст: выполните команду:
АТМУ1234\г
ATDH\r

Не забывайте, что \г означает здесь нажатие клави­ Установить адрес назначения можно также, выпол­
ши <ЕЩег>. Чтобы подтвердить установку адреса, нив следующую пару команд:
выполните команду:
ATDL5678\r
АТМУ\г ATDH0\r

Модуль должен ответить: Все такие радиоустройства также имеют код PAN4
ID. При этом все радиоустройства с одинаковым
1234
кодом PAN ID могут обмениваться данными друг
Затем установите адрес назначения, то есть адрес, с другом и игнорируют радиоустройства с иным
по которому устройство будет посылать свои 4 PAN, Personal Area Network — персональная сеть.
Беспроводная связь 245

кодом PAN ID. Установите код PAN ID для вашего Для радиомодулей можно использовать любые
радиомодуля, выполнив следующую команду: 16-разрядные адреса. В табл. 6.1 приводится кон­
фигурационная информация для взаимодействия
ATIDllllXr
двух радиомодулей ХВее (не забудьте выполнить
Модуль ХВее ответит на эту команду: команду ш после последней команды а т ю ).

ок
Таблица 6.1. Конф игурационная инф орм ация для
Выполнив последнюю команду настройки модуля, взаим одейст вия двух радиом одулей ХВее
необходимо отдать команду:
ATMY ATDL ATDH ATID
WR
Радио 1 1234 5678 0 1111
которая записывает заданные параметры в память
радиомодуля. Таким образом, эти настройки бу­ Радио 2 5678 1234 0 1111
дут сохранены даже после отключения его пита­
ния. Далее приводится пример выполнения этой Как вы, наверное, уже поняли, в одной строке мож­
команды: но указывать несколько команд, разделив их запяты­
ATIDllll,WR\r ми. Например, чтобы получить оба слова исходного
адреса модуля, выполните команду:
Настроив один из ваших радиомодулей, закрой­
те программу терминала последовательной связи ATDL, ЭН\г
и отсоедините плату от компьютера. Затем удали­ Модуль ХВее также возвратит два ответа одновре­
те радиомодуль ХВее из адаптера, вставьте другой менно. Так, например, чтобы задать два слова адре­
модуль и настройте его, следуя той же самой про­
са назначения и записать их в энергонезависимую
цедуре. Но для этого модуля укажите в качестве
адреса назначения исходный адрес первого модуля память модуля, введите следующую комбинацию
ХВее. Чтобы различать оба радиомодуля, пометьте команд:
их кусочками клейкой ленты. Вам придется встав­ АТЭЪ5678, БНО, Ш \ г
лять и вынимать их из адаптера USB/TTL-Serial
и микроконтроллера несколько раз, в процессе чего Модуль ответит на все три команды:
их можно легко перепутать (рис. 6.16). ок ок ок

Я ШМШ1ИИИ

ЯШ Л
ШШяЯВ

тшШ ш

Рис. 6.16. Радиомодули ХВее, помеченные кусочками клейкой ленты.


Теперь их перепутать трудно
246 Глава б

НИШ Ш илд бесп р о во д н о й свя зи A rd u in o


Шилды беспроводной связи для модуля Arduino, Однако при программировании микроконтролле­
которые можно применить в этом проекте, те­ ра Arduino лучше извлечь модуль ХВее из шилда,
перь поставляются несколькими компаниями. чтобы последовательная связь радиомодуля не
Первоначальный шилд Arduino для модуля ХВее, мешала загрузке программы.
который использовался для проектов, описанных
в первом издании книги, претерпел существен­ Для настройки радиомодуля ХВее на шилде с ис­
ную переработку. Теперь он называется шил- пользованием контроллера USB/TTL-Serial мо­
дом беспроводной связи для Arduino (поскольку дуля Arduino запрограммируйте модуль Arduino
другие радиоустройства с таким же посадочным следующим пустым скетчем:
разъемом могут работать с этим шилдом) и обла­ void setup()
дает несколькими полезными возможностями — {
такими как область для разработки прототипов, void loop()
слот для карты microSD, проект с которой будет {
рассмотрен далее в книге (карточка приобрета­ Затем установите переключатель шилда в поло­
ется отдельно от шилда), а также переключатель жение USB. В терминале последовательной свя­
для выбора подключения вывода последователь­ зи откройте подключение к последовательному
ной связи модуля ХВее. порту платы Arduino и выполните команды, при­
Когда этот переключатель установлен в положе­ веденные в разд. «Шаг 1. Настройка модулей
ние Micro (рис. 6.17), модуль ХВее будет подклю­ ХВее». Выполнив настройку радиомодуля ХВее,
чен для взаимодействия с микроконтроллером извлеките его из шилда, установите переключа­
ATMega платы Arduino. А при переключателе в тель обратно в положение Micro и выполните
положении USB модуль ХВее подключается для программирование модуля Arduino обычным
последовательной связи через контроллер USB/ образом.
TTL-Serial на плате Arduino в обход микрокон­
троллера. При этом положении переключателя
разъем USB/TTL-Serial платы Arduino можно ис­
пользовать для настройки модуля ХВее.

Рис. 6.17. Переключатель выбора режима связи установлен в положение Micro (левое)
Беспроводная связь 247

О Шаг 2. Программирование Радиоканал


микроконтроллера для работы
с модулем ХВее
Ну, хорошо. Теперь у нас есть два микроконтролле­
ра, подготовленные для взаимодействия друг с дру­
гом через радиомодули ХВее. На этом этапе мы
оставим один модуль ХВее подключенным к ком­
пьютеру посредством адаптера USB. На рис. 6.18
показана блок-схема подключения устройств на
этом шаге. Убедившись, что все работает должным
образом, на шаге 3 мы исключим персональный
компьютер и заменим его вторым модулем Arduino
с подсоединенным к нему радиомодулем ХВее.

► ► Рис. 6.18. Модуль ХВее № 1 подключен


к микроконтроллеру. Модуль ХВее № 2 подключен
через USB или последовательный порт к ПК.
Эта схема позволяет установить радиоканал
между ПК и микроконтроллером

На рис. 6.19 показан модуль ХВее, подсоединенный


к обычной плате Arduino с помощью шилда беспро­
водной связи Arduino. Это такая же схема, что и на
рис. 6.20 (см. далее), но без светодиода, подклю­
ченного к линии 9. Подключенные к радиомодулю
ХВее светодиоды встроены в шилд.

На рис. 6.20 показана монтажная (а) и принципиаль­


ная (б) схемы подключения модуля к плате Arduino
с помощью адаптерной платы вместо шилда.

Как можно видеть, питание на модуль ХВее подает­


ся через регулятор напряжения на 3,3 В. Линии по­
следовательного ввода/вывода модуля ХВее могут
выдерживать уровни сигнала до 5 В, но сам модуль
работает на 3,3 В. Модуль Arduino Uno и более но­
вые модели оснащены более мощным регулятором
напряжения 3,3 В, который может подавать питание
также и на модуль ХВее, но не помешает иметь вы­
деленный регулятор напряжения, как показано на
схеме (см. рис. 6.20, б).

Подключив модуль, можно программировать мик­


роконтроллер для отправки данных через радиомо­
дуль ХВее. В приведенной далее программе микро­
контроллер сначала настраивает для модуля ХВее Рис. 6.19. Модуль ХВее, подсоединенный к плате
его адрес назначения, а затем отправляет значение Arduino с помощью шилда беспроводной связи
аналогового показания на аналоговую линию 0, ког­ Arduino. Средний вывод потенциометра подсоединен
да это значение существенно изменяется. к аналоговой линии 0
248 Глава б

Рис. 6.20.
1
а — подключение модуля ХВее
к плате Arduino с помощью
адаптерной платы. Обратите
внимание, что в этой схеме
предполагается адаптерная плата
без регулятора напряжения,
который добавляется в схему
отдельным компонентом. Если
использовать адаптер ХВее Explorer
Regulated компании SparkFun
(номер по каталогу WRL-09132)
а или адаптерный набор
для ХВее компании Adafruit
(номер по каталогу 126),
отдельный регулятор напряжения
A R EF не потребуется, так как оба эти
Reset GND адаптера оснащены встроенными
+3 3V D13
регуляторами напряжения на 3,3 В;
+5V D12 б — принципиальная схема
Gnd D11/PWM
подключения модуля ХВее
к плате Arduino
Gnd D10/PWM
Vin D9/PWM
D8
Модуль
Arduino
D7
D6/PWM
Analogo D5/PWM
A1 D4
A2 D3/PWM
A3 D2
A4 Digital1/TX
A5 DigitalO/RX

Регулятор Радио модуль Xbee


напряжения
LDU17-a3V
------------------------- \
Out
V cc ADO/DIOO
r r TX AD1 / DI01

т RX AD2 / D I02
10mF 1pF
D 08 AD3 / D I03

RESET R T S /A D 6 /D I0 6 2200
PWMO / RSSI Ass’t / AD5 / D I05
-®-ЛЛЛл
PWM1 Vref
2200
SLP
NC
- t A W
DTR/DI8 CTS / DI07

GND AD4 / DI04

б
Беспроводная связь 249

const int sensorPin = AO; // Датчик ввода


const int analogLed = 3; // Светодиод, яркость которого
Сначала присвоим линиям ввода/ // меняется в зависимости
вывода имена и определим неко­ // от входящего значения
торые переменные для отслежи­ const int threshold = 10; // Пороговое значение для изменения
вания изменений в показаниях // показания датчика
потенциометра: int lastSensorReading = 0; // Предыдущее состояние датчика
String inputstring = ' /

В Т Далее, в методе s e tu p о на­ void setup() {


страиваем последовательную // Настраиваем последовательную связь:
связь, устанавливаем режим для Serial.begin(9600);

линии ввода/вывода и настраи­


// Настраиваем линию вывода:
ваем адрес назначения модуля
pinMode (analogLed, OUTPUT);
ХВее:
// Устанавливаем адрес назначения модуля ХВее:
setDestination();
// Мигаем светодиодом линии передачи ТХ, указывая,
// что программа вот-вот запустится:
blink(analogLed, 3);

и* Настройка радиомодуля void setDestination() {


ХВее выполняется в методе // Устанавливаем для радио командный режим:
s e t D e s t i n a t i o n () И ВЫГЛЯДИТ Т ак Serial.print("+++");
же, как мы это делали вручную // Ожидаем от радио ответа "ОК\г"
ранее, только сейчас мы даем ин­ char thisByte = 0;

струкции сделать это микрокон­ while (thisByte != '\r') {


if (Serial.available() > 0 ) {
троллеру:
thisByte = Serial.read();

// Устанавливаем адрес назначения, используя


// 16-разрядную адресацию.
// При использовании двух радиомодулей, адрес назначения одного
// из них должен быть адресом MY другого, и наоборот.
// Замените адрес назначения, выделенный жирным шрифтом,
/ / н а адрес назначения радиоустройства, подсоединенного
// к персональному компьютеру. Не заменяйте его на адрес
// радиоустройства, подсоединенного к микроконтроллеру.
Serial.print("ATDHO, DL5678\r»);
// Задаем адрес MY, используя 16-разрядную адресацию:
Serial.print(«АТМУ1234\г»);
// Задаем код PAN ID. Если ваши радиомодули будут работать
// в окружении многих других ХВее, нужно установить свой
// код PANID, чтобы отличить свои радиомодули от других.
Serial.print("ATIDllll\r");
// Переводим радиомодуль в режим данных:
Serial.print("ATCN\r");
250 Глава 6

ММ Метод blink о такой же, как void blink(int thisPin, int howManyTimes) {
и те, которые мы использовали // Мигает светодиод:
в предыдущих проектах этой for (int blinks=0; blinks< howManyTimes; blinks++)
digitalWrite(thisPin, HIGH);
книги. Он мигает светодиодом,
delay(200);
чтобы указать, что настройка за­
digitalWrite(thisPin, LOW);
вершена: delay(200);

ш Главный цикл обрабатывает void loop() {


данные, поступающие по после­ // Ожидаем данных, входящих по последовательному каналу:
if (Serial.available() > 0 ) {
довательному каналу, считывает
handleSerial();
показания потенциометра и от­
правляет данные при наличии
значительных изменений в зна­ // Считываем показания потенциометра:
чении показаний: int sensorValue = readSensor();

// Если есть данные для отправления, отправляем их:


if (sensorValue > 0 ) {
Serial.println(sensorValue, DEC);

}
Ш Из главного цикла вызывается void handleSerial() {
два Других метода: handleSerial () char inByte = Serial.read();
и readSensorо. Первый ожидает //
if (isDigit(inByte)){
и получает строки цифр АБСН
inputstring = inputstring + inByte;
и преобразовывает их в байты,
чтобы установить яркость свето­
диода на выводе ШИМ. Второй // Если получили символ ASCII перевода строки:
считывает значение показания if (inByte == '\n') {
потенциометра и проверяет вели­ // Преобразовываем строку в число:
чину изменения. Если изменение int brightness = inputstring.tolnt();
превышает установленное поро­ /7 Устанавливаем аналоговый вывод для светодиода:
говое значение, метод отправляет analogWrite(analogLed, brightness);
по радио новое значение. Далее // Очищаем входную строку для следующего значения:
inputstring = «»;
приводится код этих методов:
Serial.print(brightness);
Отсоедините линии приема
и передачи радиомодуля
Для программирования микрокон­ int readSensor() {
троллера следует отсоединить int result = analogRead(sensorPin);
линии приема и передачи радио­ // Высматриваем изменение после последнего показания,
модуля ХВее (если используется // большее, чем пороговое значение:
шилд Arduino, это можно сделать if (abs(result - lastSensorReading) > threshold) {
с помощью соответствующего пе­ result = result/4;
реключателя). Последовательная
lastSensorReading = result;
связь с модулем ХВее может от­
} else {
рицательно влиять на последова­
// Если изменение меньше порогового значения, возвращаем 0:
тельную связь микроконтроллера
с компьютером. Завершив про­ result = 0;
граммирование микроконтролле­ }
ра, линии передачи и приема мож­ eturn result;
но снова подсоединить.
Беспроводная связь 251

Обратите внимание, что в главном цикле мы Завершив программирование микроконтроллера,


не используем никаких команд стандарта АТ. задайте для адреса назначения модуля ХВее, под­
Это объясняется тем, что модуль ХВее автоматиче­ ключенного к компьютеру, адрес модуля ХВее, под­
ски переходит обратно в режим данных (который в ключенного к микроконтроллеру. (Если вы уже сде­
инструкции пользователя модуля ХВее называется лали это на предыдущем шаге, то снова делать это
режимом ожидания5) при выполнении команды не требуется.) Затем поверните ручку потенциоме­
ATCN В методе setDestination (). тра микроконтроллера. В окне программы терми­
нала последовательной связи должно отобразиться
Вспомните, что в режиме данных все данные, по­
примерно такое сообщение:
сылаемые модему типа АТ, рассматриваются как
обычные символы. Единственным исключением 120
является строка +++, при получении которой мо­ При вращении ручки потенциометра число это бу­
дем переключается в командный режим. Это такое дет меняться. В зависимости от используемой про­
же поведение, что и у модема Bluetooth, с которым граммы терминала последовательной связи, новое
мы работали в главе 2, а также у почти любого значение может отображаться поверх предыдуще­
устройства, реализующего протокол такого типа. го, так как мы не посылаем символа новой строки.
И это весьма полезное поведение, поскольку, когда
радиомодуль находится в режиме данных, мы мо­ Поздравляем, вы только что создали свой первый
жем отправлять данные без каких бы то ни было до­ беспроводной канал связи! Поиграйте с потенцио­
полнительных команд, предоставляя радиомодулю метром, пока вам это не надоест, а затем перейдите
самому исправлять все ошибки. к шагу 3.

5 От англ.: idle mode.

О Шаг 3. Двусторонняя беспроводная соответствующие адреса назначения, как это указа­


но в комментариях программы.
связь между микроконтроллерами
Запрограммировав оба микроконтроллера, вклю­
На том шаге не происходит ничего важного. Все, что
чите их питание и поверните ручку потенциометра
нам нужно здесь сделать, — это заменить микро­
несколько раз туда и обратно. В ответ на вращение
контроллером компьютер, к которому подключен
ручки потенциометра того микроконтроллера, к ко­
один из модулей ХВее. Для этого просто подсоеди­
торому он подсоединен, яркость светодиода, под­
ните этот модуль ХВее к плате Arduino, как пока­
ключенного к выводу 3 другого микроконтроллера,
зано на рис. 6.20, с помощью шилда беспроводной
должна то возрастать, то убывать.
связи Arduino.
Теперь мы обладаем возможностями дуплексной
Программы для обоих микроконтроллеров почти
беспроводной связи между двумя микроконтролле­
идентичны с единственной разницей — у модулей
рами. Это открывает широкое поле возможностей
ХВее будут разные адреса назначения. Программы
для всякого рода взаимодействий.
будут как посылать, так и принимать данные через
радиомодули. Вращение ручки потенциометра у
того микроконтроллера, к которому он подсоеди­
нен, вызывает отправку значений его показаний
другому микроконтроллеру. Когда этот микрокон­
троллер получает число в свой последовательный
порт, он использует его для задания яркости свето­
диода на выводе 3.
Сначала подключите второй модуль ХВее ко вто­
рому микроконтроллеру. Затем загрузите в оба
микроконтроллера представленную ранее про­ Рис. 6.21. Запитка модуля Arduino
грамму, обращая внимание на то, чтобы установить от батареи типа «Крона» на 9 В
252 Глава 6

з Б еспровод н ая м обильная св я зь
Теперь, когда мы обладаем возможностями бес­ Попутно отметим, что для программирования
проводной связи, мы можем сделать наш микро­ модуля Arduino Fie следует использовать адаптер
контроллер мобильным. Для этого питание на USB/TTL-Serial типа FTDI, как описано в г л а в е 2,
него нужно подавать от батареи. Стандартные или же программировать его по беспроводному
платы Arduino приспособить для этого не слож­ каналу связи, предоставляемому модулем ХВее.
но. Кроме того, существует несколько моделей Впрочем, для беспроводного программирования
плат Arduino (а также несколько их клонов), спе­ модуля Arduino Fio необходимо хорошее пони­
циально предназначенных для мобильного ис­ мание работы радиомодуля ХВее, поэтому луч­
пользования с питанием от батарей. ше сначала научиться программировать его по
проводному каналу. Дополнительную информа­
Самый простой способ запитать плату Arduino от
цию по программированию модуля Arduino Fio
батареи— подключить выводы батареи к соответ­
можно найти на сайте http://arduino.cc/en/Main/
ствующим линиям питания платы, как показано на
ArduinoBoard-FioProgramming.
рис. 6.21 (стр. 251). На линию Vin (Voltage input,
входное напряжение) можно подавать напряжение Для мобильного использования в одежде, мяг­
в диапазоне 6-15 В (плата Arduino Uno будет ких игрушках или элементах декора предназна­
работать даже на более низком напряжении — чены платы типа Arduino LilyPad. Они програм­
у меня одна из них работала на 3,7 В, но не всегда мируются с помощью адаптера USB/TTL-Serial
надежно). Провода от батареи можно просто вста­ типа FTDI. Существует пара моделей адаптеров
вить в гнезда Vin (+) и GND (-) платы Arduino, питания для плат LilyPad, в которые вставляют­
можно также сделать специальный переходник ся литий-полимерные батареи. Плата Arduino
для разъема батареи. LilyPad Simple оснащена разъемом для под­
ключения литий-полимерной батареи непосред­
Для проектов на модулях ХВее замечательно
ственно к плате (рис. 6.23).
подходит модуль Arduino Fio. Он оснащен поса­
дочным разъемом для модуля ХВее и разъемом Тем не менее, в процессе отладки не стоит запи­
для подключения литий-полимерных батарей тывать тестируемое устройство от батареи. Когда
напряжением 3,7 В (рис. 6.22). Разъем mini-USB заряд батареи падает, модули начинают работать
на модуле Arduino Fio используется не для вза­ неустойчиво, что сделает отладку невозможной.
имодействия компьютера с микроконтроллером, Лучше всего подавать питание на модуль микро­
а только для зарядки батареи. контроллера от сети через адаптер питания или
через USB-разъем от компьютера.

Рис. 6.22. Фрагмент модуля Arduino Fio с подсоеди­


ненным адаптером USB/TTL-Serial для программиро­ Рис. 6.23. Плата Arduino LilyPad Simple с разъемом
вания модуля и разъемом для подключения литий- для литий-полимерной батареи. Фотография
полимерных батарей (показан в верхнем левом углу) предоставлена компанией SparkFun
Беспроводная связь 253

Проект 11

Приемопередатчики Bluetooth
В главе 2 мы научились подключать микроконтроллер к персональному компьютеру с по­
мощью радиомодуля Bluetooth. В этом проекте мы рассмотрим, как установить подобным
образом, используя радиомодули Bluetooth, связь между двумя микроконтроллерами.

Как отмечалось в главе 2, технология Bluetooth из­


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

►Беспаечная макетная плата, 2 шт.
ной. Поэтому для нее требуется более тесная взаи­
мосвязь между устройствами, чем между устрой­ ►
►Адаптер USB/TTL-Serial, 1 шт.
ствами в только что рассмотренном проекте с ис­

►Модуль Arduino, 2 шт.
пользованием радиомодулей ХВее. В том проекте
радиомодуль посылает сообщение без какой бы то ►
►Модуль Bluetooth Mate, 2 шт.
ни было уверенности, получил приемник это сооб­

►Потенциометр или другой аналоговый
щение или нет. Сообщение также можно было от­
датчик, 2 шт.
правлять другому приемнику, всего лишь поменяв
адрес назначения. В противоположность этому, ра­ ►
►Светодиод, 2 шт.
диомодули Bluetooth, прежде чем посылать данные ►
►Сопротивление 220 Ом, 2 шт.
по определенному каналу, должны установить со­
ответствующее подключение. И они также должны ►
►Сопротивление 10 К, 2 шт.
разорвать существующее подключение, прежде чем ►
►Кнопка, 2 шт.
устанавливать взаимодействие с другим радиомо­
дулем по каналу Bluetooth. Преимущество техноло­
гии Bluetooth состоит в том, что она используется во
многих потребительских устройствах, вследствие компанией Roving Networks. Поэтому применяе­
чего предоставляет удобный способ подключения мый в них набор команд определен именно этой
микроконтроллерных проектов к персональным компанией-производителем. Модули Bluetooth дру­
компьютерам, телефонам и многим другим устрой­ гих изготовителей используют подобные наборы
ствам. Несмотря на все свои сложности, эта техно­ команд, которые могут выполнять сходные функ­
логия обеспечивает надежную передачу данных. ции, но их синтаксис будет иным. К сожалению,
производители радиомодулей Bluetooth еще не со­
Используемые в проекте модули Bluetooth Mate, по­ гласовали стандартный синтаксис команд для своих
ставляемые компанией SparkFun, изготавливаются устройств.

О Шаг 1. Схемы
Вместо сопряжения радиомодуля Bluetooth микро­ Так как процесс установления подключения
контроллера с радиомодулем Bluetooth компьютера, Bluetooth состоит из многих шагов, прежде чем
как мы делали в главе 2, в этом проекте мы будем создавать код, лучше всего сначала изучить и по­
сопрягать два модуля Bluetooth, подключенные нять этот процесс, используя программу терминала
к микроконтроллерам. После выполнения соответ­ последовательной связи. Впрочем, даже и в про­
ствующей настройки платы микроконтроллеров цессе программирования программа терминала
смогут взаимодействовать друг с другом по каналу последовательной связи будет полезным диагно­
Bluetooth. стическим инструментом. Взаимодействие двух
254 Глава 6

микроконтроллеров можно организовать с по­ Чтобы настроить плату Arduino для функциониро­
мощью адаптеров USB/TTL-Serial, используемых вания в качестве сквозного устройства USB/TTL-
в проекте 4 главы 2, но целью этого проекта являет­ Serial, сначала нужно запрограммировать в нее сле­
ся взаимодействие двух контроллеров по Bluetooth дующий пустой скетч:
без участия персонального компьютера между void setup()
ними. Поэтому, вместо использования адаптера {
IJSB/TTL-Serial для передачи данных на радиомо­ void loop()
дуль Bluetooth от компьютера, можно настроить для {
такой передачи саму плату Arduino. Таким образом, Запрограммированный таким скетчем микрокон­
когда вы будете готовы исключить персональный троллер не будет выполнять никаких операций,
компьютер на шаге 3 этого проекта, вам нужно бу­ поэтому можно использовать его контроллер USB/
дет только модифицировать скетч и слегка изме­ TTL-Serial для взаимодействия с радиомодулем
нить схему. Bluetooth.

Рис. 6.24.
а — пара Arduino/Bluetooth № 1: модуль Bluetooth взаимодействует с персональным компьютером через
контроллер USB/TTL-Serial платы Arduino. Обратите внимание, что линии приема (RX) и передачи (ТХ) платы
соединены с такими же линиями модуля Bluetooth. Такое подсоединение позволяет модулю Bluetooth Mate
взаимодействовать через адаптер USB/TTL-Serial платы Arduino с персональным компьютером,
а не с микроконтроллером платы;
б — пара Arduino/Bluetooth № 2: модуль Bluetooth взаимодействует с микроконтроллером Arduino. Когда нужно
организовать взаимодействие модуля Bluetooth с микроконтроллером платы Arduino, линии этих модулей
соединяются наперекрест, как и показано на рисунке
Беспроводная связь 255

Подсоедините модуль Bluetooth к микроконтролле­ Запрограммируйте в Arduino № 2 следующий скетч:


ру (мы будем называть их радио № 1 и Arduino № 1),
void setup() {
как показано на рис. 6.24, а. Затем подключите ми­ Serial.begin(115200);
кроконтроллер к компьютеру, запустите програм­
}
му терминала последовательной связи и откройте
в ней последовательное подключение к Arduino на void loop() {
скорости 115 200 битов в секунду. Serial.println("Привет, Bluetooth\");
}
Подсоедините второй модуль Bluetooth Mate ко вто­
рой Arduino, как показано на рис. 6.24, б. Мы будем Открыв подключение Bluetooth к этому радиомоду­
называть эту пару радио № 2 и Arduino № 2. Пока лю, мы получим повторяющееся сообщение:
что мы станем использовать вторую плату Arduino Привет, Bluetooth!
только для отправки простого сообщения, чтобы Привет, Bluetooth!
удостовериться в работоспособности всей схемы. Привет, Bluetooth!

В результате оба модуля Bluetooth подключены


к своим платам Arduino.

О Шаг 2. Знакомство с командами


Радиомодули Bluetooth Mate используют для управ­ Baudrt(SW4)=115К
ления и настройки набор команд, который имеет, как Parity=None
и радио ХВее, два режима: командный и данных. Mode =Slav
Сразу после включения питания и подключения Authen=0
к его последовательному интерфейсу (например, по­ Encryp=0
средством платы Arduino, как показано на рис. 6.24) PinCod=1234
модуль Bluetooth Mate находится в режиме данных. Bonded=0

Чтобы перевести его в командный режим, выпол­ Rem=NONE SET

ните команду:
Первая строка, которая начинается с текста в т а =,
$$$ представляет собой адрес радиомодуля в шест­
Модуль должен ответить строкой: надцатеричном формате. Запомните, а еще лучше,
запишите этот адрес, так как он нам вскоре потре­
CMD\r буется. Далее, проверьте состояние подключения
Все ответы радиомодуля завершаются символом радиомодуля, выполнив команду:
возврата каретки (\г). Ввод всех команд также сле­ GK\r
дует завершать нажатием клавиши <Enter>.
Модуль ответит следующим символом:
Когда радиомодуль находится в командном режиме,
о нем можно получить определенную базовую ин­ 0
формацию, выполнив команду:
Когда модуль подключен, на эту команду он ответит
D\r символом
Пример такой информации, включающей адрес ра­ 1
диомодуля, выглядит следующим образом:
Теперь проверим, доступны ли какие-нибудь дру­
***Settings***
гие радиомодули. Для этого выполним команду:
ВТА=000666112233
BTName=FireFly-7256 1\г
256 Глава 6

Устройство ответит списком доступных радиомо­ Когда радиомодули установят надежное подключе­
дулей: ние, на обоих модулях Bluetooth Mate должны заго­
Found 2 реться зеленые светодиоды индикаторов подключе­
442A60F61837,Tom Igoe...s MacBook Air,38010C ния, сами радиомодули перейдут в режим данных,
000666481ADF,RN42-1FDF, 1F00 а от модуля Arduino № 2 должно поступать непре­
Inquiry Done рывное сообщение:
Как можно видеть, каждое устройство в списке име­ Привет, Bluetooth!

ет другой адрес, имя и код устройства. Получить Привет, Bluetooth!


Привет, Bluetooth!
информацию только для устройства с определен­
ным кодом можно, выполнив команду: Подключение, конечно же, позволяет двусторонний
IN 0,001F00\r обмен данными, и все, что мы станем вводить в окно
терминала, будет отправляться модулю Arduino
(где 001F00 — код требуемого устройства). № 2. Но поскольку он не запрограммирован пока
Это полезная команда, когда требуется получить давать ответ, то мы ничего от него и не получим.
информацию только о других устройствах типа Чтобы закрыть подключение, радиомодуль нужно
Bluetooth Mate, находящихся в радиусе действия. сначала перевести в командный режим, выполнив
Команда i n , кстати, не выводит текстовые имена команду:
устройств, ограничиваясь только их адресами и ко­
дами. $$$\г

Теперь, когда нам известен адрес нашего второго Модуль ответит строкой:
радиомодуля Bluetooth (который должен был ото­ CMD
бразиться в списке, если радиомодуль был вставлен
во вторую плату Arduino), мы можем подключиться после чего мы выполняем команду :
к нему, выполнив команду: К\г

С, 000666481ADF\r. Подключение будет разорвано, и радиомодуль вы­


Замените адрес 000666481a d f адресом радиомоду­ ведет строку:
ля Bluetooth, подключенного к плате Arduino № 2. KILL
Радио № 1 ответит строкой:
Кроме только что рассмотренных, существуют
TRYING и другие команды, но эти — самые основные.

О Шаг 3. Подключение двух радиомодулей Bluetooth


Теперь, когда мы познакомились с приемами под­ Сначала определим адреса Bluetooth для обоих на­
ключения и отключения радиомодулей Bluetooth, ших радиоустройств. Мы уже знаем адрес одного
мы можем сделать это с помощью микроконтрол­ из них. Замените его вторым радиомодулем в схеме
леров. Для этого мы воспользуемся той же самой с переходником USB/TTL-Serial и определите его
монтажной схемой, но добавим в нее несколько до­ адрес, следуя процедуре, примененной для первого
полнительных компонентов. И будем на этот раз ра­ модуля. В процессе получения адресов радиомоду­
ботать на модуле Arduino № 2 вместо Arduino № 1. лей также внесите изменение в их конфигурацию,
Так что оставим пока первый Arduino в качестве выполнив команду:
преобразователя USB/TTL-Serial для радиомодуля
SO, ВТ\г
Bluetooth. Оставим открытой и его программу тер­
минала последовательной связи, чтобы можно было Это присвоит строке состояния значение вт, вслед­
наблюдать за происходящим. ствие чего при подключении или отключении
Беспроводная связь 257

радиомодулей они будут посылать соответствую­ Отсоедините от платы модуль Bluetooth Mate
щую информационную строку: При программировании платы Arduino рекомендуется
BTCONNECT\r отсоединить от нее модуль Bluetooth Mate, как мы это
делали в случае с другими устройствами последова­
или: тельной связи.
BTDISCONNECT\г
При первом нажатии кнопки приведенная далее про­
Теперь добавим в схему потенциометр и кнопку, грамма подключается к другому модулю Bluetooth
как показано на рис. 6.25. Mate по заданному адресу. При подключении про­
грамма посылает в виде строки ASCII значение по­
Так же, как и в примере с радиомодулем ХВее, сред­
тенциометра, заканчивающееся символом возврата
ний вывод потенциометра подключен к аналоговой
каретки.
линии ввода микроконтроллера, чтобы можно было
посылать его значения. Вместо потенциометра Так же, как и в проекте с радиомодулем ХВее, эта
к линии АО микроконтроллера можно подсоединить программа ожидает входящие строки ASCII и пре­
любой аналоговый датчик. Кнопка здесь использу­ образовывает их в значения ШИМ, чтобы управлять
ется для создания и разрыва подключения между яркостью светодиода, подсоединенного к линии 3.
двумя радиомодулями. Радиомодули Bluetooth су­ В программе используется библиотека TextFinder,
щественно отличаются от радиомодулей ХВее тем, с которой мы познакомились в главе 4. Если вы по
что прежде, чем они смогут взаимодействовать, какой-либо причине еще не установили эту биб­
нужно выполнить их сопряжение. лиотеку, сделайте это сейчас, следуя приведенным
в главе 4 инструкциям.

Ш Сначала определим констан- /


ты и переменные программы: Bluetooth Analog Duplex sender
Контекст : Arduino
*/

#include CTextFinder,h>

const int sensorPin = AO; // Датчик аналогового


// ввода
const int analogLed = 3; // Светодиод,
// изменяющий яркость
const int threshold = 20; // Пороговое значение
// для изменения
// показания датчика
const int debounceInterval = 15; I I Для сглаживания
// ввода кнопки
const int connectButton = 2; // Кнопка подключения/
// отключения
int lastButtonState = 0; // Предыдущее состояние
// кнопки
int lastSensorReading = 0; // Предыдущее состояние
// датчика
long lastReadingTime = 0; // Время предыдущего
// чтения датчика

// Адрес удаленного радио Bluetooth. Замените его адресом


// вашего удаленного радио.
String remoteAddress = «112233445566"; ►

258 Глава б

Рис. 6.25.
AREF Принципиальная (а )
Reset GND и монтажная (б)
+3 3V D13 схемы подключения
+5V D12 радиомодуля Bluetooth
Gnd D11/PWM Mate к плате Arduino.
Gnd D10/PWM Кнопка служит
Vin D9/PWM для подключения
и отключения
m D8
Модуль +5V
радиомодулей.
Arduino
D7 А* Кнопка подключения
и отключения
Эта схема похожа на
ранее рассмотренную
D6/PWM
Analogo D5/PWM
схему подсоединения
0-1 окп
A1 D4
к микроконтроллеру
модуля ХВее
A2 D3/PWM
(см. рис. 6.20)
A3 D2
A4 Digitali/TX
A5 DigitalO/RX

+5В
или + 3,3 В 2200

R TS
RX
Модуль TX
Bluetooth Mate vcc
CTS
Gnd
а
Беспроводная связь 259

□ String messagestring = I 99
П Сообщения, поступающие
! ! в последовательный порт

boolean connected = false; // Состояние подключения


boolean commandMode = false; // Состояние командного режима

TextFinder finder (Serial) ; // Для поиска


// в последовательном вводе

Ш Метод setup о, как обычно, void setup() {


задает состояния линий, ини­ // Настраиваем последовательную связь:
Serial.begin ( 1 1 5 2 0 0 ) ;
циализирует последовательную
связь и мигает светодиодом:
// Настраиваем линии вывода:
pinMode (analogLed, OUTPUT);

// Мигаем светодиодом линии передачи ТХ, указывая,


// что программа вот-вот запустится:
blink(analogLed, 3);

П Код в главном цикле ожидает void loop() {


входящие последовательные дан­ // Считываем входящие последовательные данные и исследуем их:
handleSerial();
ные и выполняет проверку, была
ли нажата кнопка. Если кнопка
// Проверяем, была ли нажата кнопка:
была нажата, выполняется под­ boolean buttonPushed = buttonRead(connectButton);
ключение или отключение, в за­
висимости от того, что требуется. // Если кнопка была только что нажата:
Если радиомодули подключены, if (buttonPushed) {
программа считывает аналого­ // Если клиент подключен, отключаем его:
if (connected) {
вые показания потенциометра
BTDisconnect();
и отправляет его значение в слу­
} // Если клиент отключен, пытаемся подключиться:
чае серьезного изменения. else {
BTConnect();
}

// Если подключен, берем показания датчика:


if (connected) {
// Текущее время в миллисекундах:
long currentTime = millisO;
// Если прошло достаточно времени после
// последнего считывания:
if (currentTime - lastReadingTime > debouncelnterval)
{
// Считываем показания аналогового датчика
// и делим на 4, чтобы получить диапазон 0-255:
int sensorValue = analogRead(АО)/4;
// Если последнее значение показания датчика
// значительно отличается от предыдущего,
// отправляем его:
if (abs(sensorValue - lastSensorReading) > threshold)
{
Serial.println(sensorValue, DEC);
} ►

260 Глава б

Е Г И // Обновляем время последнего считывания и последнее


// значение датчика:
lastReadingTime = currentTime;
lastSensorReading = sensorValue;
}
}
}
D3 Метод blink () такой же, что и void blink(int thisPin, int howManyTimes) {
в проекте с радиомодулем ХВее: for (int i=0; i< howManyTimes; i++) {
digitalWrite(thisPin, HIGH);
delay(200);
digitalWrite(thisPin, LOW) ;
delay(200);
}
}
0 1 Метод buttonRead () также // Этот метод считывает состояние кнопки, чтобы установить,
должен быть вам знаком — этот // не изменилось ли оно только что с низкого на высокое, а также
// устраняет дребезг контактов кнопки:
тот же метод, который использо­
вался в клиента сетевого пинг- boolean buttonRead(int thisButton) {
понга в проекте главы 5: boolean result = false;
/ / Временное состояние кнопки:
int currentState = digitalRead(thisButton);
/ / Конечное состояние кнопки:
int buttonState = lastButtonState;
/ / Получаем текущее время для измерения интервала устранения
/ / дребезга контактов:
long lastDebounceTime = millisO;

while ((millisO - lastDebounceTime) < debounceInterval) {


/ / Считываем состояние кнопки в локальную переменную:
currentState = digitalRead(thisButton);

// Если состояние изменилось вследствие электрического шума:


if (currentState != buttonState) {
/ / Сбрасываем таймер устранения дребезга контактов:
lastDebounceTime = millisO;
}
// Каким бы ни было текущее состояние уровня сигнала
// кнопки, оно было таковым более длительное время, чем
// интервал для устранения дребезга контактов, поэтому
// берем его, как действительное текущее состояние кнопки:
buttonState = currentState;
}
// Если состояние сигнала кнопки изменилось и высокое:
if(buttonState != lastButtonState && buttonState == HIGH) {
result = true;
}

/ / Сохраняем текущее состояние для следующего прохода:


lastButtonState = buttonState;
return result;
}
Беспроводная связь 261

Так как между радиомодулями установлено Это сообщение можно игнорировать, потому что за
подключение, необходимо отслеживать статус это­ ним всегда будет следовать сообщение c o n n e c t ,и л и ,
го подключения. Вследствие выполненных нами в случае проблемы с установкой подключения, сле­
ранее в этом шаге настроек (команда so, вт\г), когда дующее сообщение:
устанавливается новое подключение, прежде чем
CONNECT failed\r
перейти в режим данных, модуль Bluetooth Mate
посылает следующее сообщение: Ожидайте эти сообщения и используйте их для
отслеживания состояния подключения. Модуль
BTCONNECT\r
Bluetooth Mate переходит в режим данных сразу же
А при разрыве подключения модуль посылает после отправки любого из этих двух сообщений,
следующее сообщение и остается в командном что предоставляет хороший способ отслеживания
режиме: ЭТОГО режима. Методы BTConnect (), BTDisconnect ()
И handleSerial () ИСПОЛЬЗуЮТ ЭТИ СТрОКИ ДЛЯ СВОеЙ
BTDISCONNECT\r
работы описанным далее образом.
При попытке установить подключение модуль
Bluetooth Mate посылает следующее сообщение:
TRYINGXr

ЕЯ Метод втсоппес-м) проверяет void BTConnect() {


состояние подключения — ко­ // Если в режиме данных, посылаем $$$
мандный режим или режим дан­ if (!commandMode) {
ных — а затем пытается выпол­ Serial.print(«$$$»);
нить подключение. Если попытка // Ожидаем ответа
неудачная, модуль остается в ко­ if (findeг .find («CMD»)) {
мандном режиме: commandMode = true;
}
}
// Когда переключились в командный режим, отправляем команду
// на подключение:
if (commandMode) {
Serial.print(«С,» + remoteAddress + «\г»);
// Ожидаем ответа
finder.find («CONNECT»);
// Если сообщение = «CONNECT failed»:
if (finder.find («failed»)) {
connected = false;

else {
connected = true;
// Радио автоматически переходит в режим данных
// при подключении:
commandMode = false;
}



262 Глава 6

IIS Метод BTDisconnect () ПОХОЖ void BTDisconnect() {


// Если в режиме данных, посылаем $$$
на метод BTConnect (), но работа­
if (!commandMode) {
ет с точностью до наоборот. Он
Serial.print(«$$$»);
переводит модуль в командный // Ожидаем ответа:
режим и отправляет сообщение if (finder.find («CMD»)) {
отключения: commandMode = true;
}
}
// Когда переключились в командный режим, отправляем
// команду на отключение:
if (commandMode) {
// Пытаемся подключиться:
Serial.print("К,\r");
// Ожидаем сообщение об успешном отключении:
if (finder.find («BTDISCONNECT») ) {
connected = false;
// Радио автоматически переходит в режим данных
// при отключении:
commandMode = false;
}
}
}

0 1 Метод Ьапб1е5ег1а1 () также void handleSerial() {


ожидает текстовые сообщения, // Ожидаем строку сообщения
НО ОН не использует T e x t F i n d e r , // Если это «BTCONNECT» — connected = true;
// Если это «BTDISCONNECT» — connected = false;
так как ему нужно видеть одну
// Если это «CONNECT failed» — connected = false;
из трех разных опций. Объект
// Если это число, устанавливаем яркость светодиода,
T e x tF in d e r ВЫПОЛНЯеТ ТОЛЬКО
char inByte = Serial.read();
один проход по потоку последо­
вательных данных, поэтому мы // Добавляем любые буквенно-цифровые символы ASCII
не можем выполнить проверку // в строку сообщения:
на наличие второй строки, если if (isAscii(inByte)) {
messagestring = messagestring + inByte;
он не найдет первую.
}
Если обнаружено положительное // Обрабатываем сообщения «CONNECT» и «DISCONNECT»:
число, этот метод использует его if (messagestring == «BTDISCONNECT») {
для установки яркости светодио­ connected = false;
да, подключенного к линии 3: }
if (messagestring == «BTCONNECT») {
connected = true;
}

if (connected) {
// Преобразовываем строку в число:
int brightness = messagestring.tolnt();
// Устанавливаем аналоговый вывод для светодиода:
if (brightness > 0 ) {
analogWrite(analogLed, brightness);



Беспроводная связь 263

ИнакОНец, метод ЬагкПеБег1а1 () [ Если получили символ АБСII для возврата строки:
ЦпВуЪе == '\г') {
ожидает символ возврата ка­ // Очищаем входную строку для следующего значения:
ретки. При получении этого теззадеБ1:г:1пд = «»;
символа метод очищает строку }
теззадеБ1:г:1пд, Ч Т О б ы ПОДГОТОВИТЬ }
ее для получения следующего
сообщения:

0 В от и вся программа. Запустите ее на ис- светодиода соответственно введенным значениям:


S Ш полнение на микроконтроллере, присвоив
адрес для радиомодуля Bluetooth № 2 переменной
Например, введите следующие значения:
12\г
remoteAddress.При нажатии кнопки на первом 120\г
микроконтроллере, он подключится ко второму 255\г
и начнет посылать ему значения показаний по­ 1 *

тенциометра. В окне терминала последовательной


связи начальные сообщения должны выглядеть сле­ Светодиод должен сначала потускнеть, затем заго­
дующим образом: реться ярче, потом максимально ярко, а далее по­
тускнеть до минимума. В ответ должны возвратить­
BTCONNECT ся четыре значения показаний датчика. При повтор­
121
ном нажатии кнопки должно прийти следующее
132
сообщение:
После установления подключения с терминала мож­ ВТ01БС0ШЕСТ
но посылать значения показаний потенциометра,
и микроконтроллер будет устанавливать яркость Наигравшись с подключением и отключением и из­
менением яркости светодиода, перейдите к конеч­
ному шагу.

О Шаг 4. Подключение двух микроконтроллеров через Bluetooth


Если вы в процессе реализации этого проекта за­ выполните сброс обоих микроконтроллеров. При
мечали его сходство с проектом на радиомодулях нажатии кнопки на любом из них он будет пытаться
ХВее, то вы, наверно, уже догадываетесь, что будет подключиться к другому и начать обмен данными.
дальше. Правильно, подключение двух микрокон­ При повторном нажатии кнопки на любом из них
троллеров напрямую, без компьютера. Смонтируйте подключение между микроконтроллерами будет
такую же схему с радио Bluetooth для второго ми­ разорвано.
кроконтроллера, добавив кнопку и потенциометр
и поменяв местами подключение линий ТХ и RX. Теперь, когда у вас есть твердые базовые знания, вы
Затем измените адрес модуля Bluetooth в предыду­ можете модифицировать эту схему для применения
щем скетче на адрес первого радиомодуля и за­ радиомодулей Bluetooth в самых разнообразных си­
программируйте второй микроконтроллер. Потом туациях.
264 Глава 6

I I Вы бор и п р и о б р етен и е р а д и о у стр о й ств


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

Самое разумное — это покупать устройства для данные таких датчиков можно посылать беспровод­
своих проектов в комплекте. Пытаться согласовать ной связью на низкой скорости на стационарный
передатчик одного производителя с приемником микроконтроллер, который и будет посылать дан­
другого — напрашиваться на головную боль. В их ные по интерфейсу MIDI в конечное устройство на
технических характеристиках может утверждаться, более высокой скорости.
что они работают в одинаковом частотном диапа­
зоне, но этому нет никаких гарантий. Точно так же Примите также во внимание протоколы устройств,
попытка приспособить аналоговое радио, наподо­ которые уже есть в вашем распоряжении. Например,
бие тех, что применяются для мониторинга детей если вы разрабатываете объект для взаимодействия
или дешевой портативной рации, может показаться с мобильным телефоном или ноутбуком и при этом
недорогим и легким решением, но в конечном итоге будет использоваться только одно устройство, рас­
это будет стоить вам уйму времени и кучу потре­ смотрите возможность использования Bluetooth.
панных нервов. При выборе радиоустройства ищи­ Большинство ноутбуков и многие мобильные
те такое, которое может принимать последователь­ телефоны оснащены встроенным радиомодулем
ный вывод микроконтроллера. Вывод последова­ Bluetooth, поэтому вам понадобится приобре­
тельных данных большинства микроконтроллеров сти только один второй радиомодуль для проекта.
осуществляется на уровнях TTL, где ОВ обозначает Чтобы сделать ваш объект совместимым с команда­
логический 0, а +3,3 В или +5 В — логическую 1. ми, специфичными для имеющегося у вас устрой­
Преобразовать вывод TTL в уровни RS-232 доста­ ства, может потребоваться приложить определен­
точно просто, поэтому радиоустройства, которые ные усилия. Но если сконцентрироваться на этом
могут принимать такие сигналы на вводе, хорошо вопросе, вместо решения потенциальной проблемы
подходят для наших целей. уверенного радиоприема в случае использования
разношерстных радиоустройств, вы сэкономите
Рассмотрите скорость передачи данных, требуе­ себе массу времени.
мую для вашего приложения, — в частности, для
его беспроводной составляющей. Вам может
и не требоваться высокоскоростная беспроводная
связь. Одно из распространенных применений бес­
проводной связи в концертах или подобных пред­
ставлениях — это получение данных с датчиков на
исполнителе для управления MIDP-устройствами,
такими как синтезаторы или затемнители. Можно
подумать, что для этого нужны радиоустройства,
способные передавать данные со скоростью, от­
вечающей требованиям интерфейса MIDI. Однако

6 MIDI, Musical Instruments Digital Interface — цифровой интер­


фейс музыкальных инструментов. Рис. 6.26. Шилд Arduino Wi-Fi
Беспроводная связь 265

йй А как н а сч е т W i-Fi?
К этому моменту мы познакомились с работой наиболее простых радиоустройств для последо­
вательного обмена данными в проекте «передатчик-приемник» и с работой более продвинутых
радиоустройств в проектах с приемопередатчиками. Если вы подумываете о микроконтрол-
лерных сетях, то, наверное, вас интересует вопрос подключения своих проектов к Интернету
и друг к другу с использованием Wi-Fi. Это возможно, но требует принять во внимание возмож­
ные осложнения.

До недавних пор применение Wi-Fi было не особен­ В настоящее время на рынке имеется несколько ре­
но распространено в микроконтроллерных проектах шений Wi-Fi. Компания SparkFun поставляет шилд
по двум причинам: стоимость и энергопотребление. WiFly, а компания Digi только что объявила о до­
Имевшиеся на рынке модули микроконтроллер-Wi­ ступности Wi-Fi-версий своих модулей ХВее. На
Fi были более дорогими, чем эквивалентные при­ подходе и шилд Arduino Wi-Fi, предназначенный
емопередатчики, реализующие другие протоколы для легкого внедрения в существующие проекты
связи. Но эта ситуация начинает меняться. Первые Ethernet с учетом незначительных изменений в их
модули Wi-Fi зачастую имели высокое энергопотре­ коде. Далее приводится краткое введение в приме­
бление, но и это также начинает меняться в лучшую нение Wi-Fi в связи с микроконтроллерами.
сторону.

Проект 12

Привет, Wi-Fi!
Помните тот сервер цвета дня, который мы создали в проекте 6 (см. главу 4)1 Здесь мы переде­
лаем его, используя шилд Arduino Wi-Fi. При этом большая часть кода и схема останутся точно
такими же. Изменения затронут лишь уровень физической связи.

Установка соединения
Шилд Wi-Fi (рис. 6.26) взаимодействует с платой
Arduino посредством интерфейса SPI точно так же, Требуемые компоненты
как и шилд Ethernet. Поэтому смонтируйте схему,
как и на рис. 4.5, но замените шилд Ethernet шил- ►
►Шилд Arduino Wi-Fi, 1 шт.
дом Wi-Fi.

►Модуль микроконтроллера Arduino, 1 шт.

~ “ \ ►
►Устройство с Ethemet-подключением
Шилд Arduino Wi-Fi к Интернету, 1 шт.
Показанный на рис. 6.26 шилд Arduino Wi-Fi ►
►Сопротивление 10 К, 3 шт.
продукт новый, поэтому его программный ин­
терфейс может меняться по мере его доработки. ►
►Фотодатчики (светочувствительные рези­
Последние обновления по шилду Wi-Fi, библи­ сторы), 3 шт.
отеке Wi-Fi и примеры по их использованию ►
►Беспаечная макетная плата, 1 шт.
можно найти в разделе Hardware веб-сайта

►Светофильтры, 3 шт.
^ http://arduino.cc._______________ ___________
266 Глава 6

Чтобы установить сетевое подключение, нам нуж­ Маршрутизаторы WEP могут хранить до четырех
но знать имя сети Wi-Fi (SSID1), к которой мы ключей — для указания конкретного из них исполь­
хотим подключиться, а также тип используемой зуется индекс ключа. В большинстве случаев мы
в сети системы шифрования. Это та же самая ин­ будем использовать индекс ключа 0. Далее приво­
формация, которая требуется для подключения дится несколько типичных примеров комбинаций
любых беспроводных устройств Wi-Fi к маршру­ WEP и WPA:
тизатору Wi-Fi. Шилд Wi-Fi может подключаться
как к открытым сетям, так и к сетям, защищенным WPA network name: noodleNet

шифрованием WEP (как 40-, так и 128-разрядным), WPA password: m30ws3rs!

WPA или WPA2. Для подключения к сетям, защи­


WEP network name: sandbox
щенным шифрованием WPA и WPA2, требуется со­
WEP key index: 0
ответствующий пароль. Для подключения к сетям,
WEP 40-bit key: 1234567890
защищенным шифрованием WEP, нужно предоста­
вить ключ и индекс ключа.
WEP network name: sandbox
WEP key index: 0
Не используйте шилд Wi-Fi с платой Arduino
WEP 128-bit key: 1A2B3C4D5E6FDADADEEDFACE10
Ethernet или шилдом Ethernet!
Шилд Wi-Fi нельзя использовать с платой Arduino Если вы пользуетесь домашним маршрутизатором
Ethernet или шилдом Ethernet, так как все эти три моду­ Wi-Fi, то, скорее всего, вы или кто-либо из членов
ля используют одну и ту же линию SPI выбора схемы. вашей семьи, выполняли его настройку, поэтому
вам эта информация должна быть знакома. Если же
Ключ WEP представляет собой строку шестнадца­
вы подключаетесь к маршрутизатору своей школы
теричных цифр, которая используется в качестве
или какой-либо другой организации, уточните па­
пароля. Длина 40-битных ключей WEP составляет
раметры подключения у сетевого администратора.
10 символов ASCII, а 128-битных — 26 символов.
Получив требуемую информацию доступа к сети
7 SSID, Service Set Identifier — сетевой идентификатор. Wi-Fi, можно приступать к программированию.

И Настройка WPA Wi-Fi веб-сервер цветов дня


Прежде всего следует вставить Контекст : Arduino

рассмотренную только что сете­


вую информацию в переменные, #include <SPI.h>
чтобы можно было выполнить #include <WiFi.h>
подключение. Но нам также бу­ // Вместо выделенных жирным шрифтом значений укажите значения
дут необходимы и глобальные // для вашей сети.
переменные server И lineLength char ssid[] = "myNetwork»; // Имя (SSID) вашей сети Wi-Fi
char password[] = «seeretpassword»; // Пароль для подключения
из скетча RGB (см. скетч веб­
// к сети Wi-Fi
сервер из проекта 6 главы 4). int status = WL_IDLE_STATUS; // Состояние радио Wi-Fi

Server server(80);
int lineLength = 0 ; // Длина .линии входящего текста

□ Настройка WEP j char ssid[] = «myNetwork»; // Имя (SSID) вашей сети Wi-Fi
j char keyIndex = 0 ; // Сети WEP могут иметь несколько
Если в вашей сети Wi-Fi исполь­ | // ключей.
зуется шифрование WPA, конфи­ j // 128-битный ключ WEP для подключения к сети:
гурационные переменные зада­ | // Вместо выделенных жирным шрифтом значений укажите значения
| // для вашей сети. Если ваш маршрутизатор имеет больше одного
ются следующим образом: ] // индекса ключа, используйте индекс 0.
| char key[] = "FACEDEEDDADA01234567890ABC";
i int status = WL_IDLE_STATUS; // Состояние радио Wi-Fi
Беспроводная связь 267

Ш Метод setup о отличается от void setup() {


этого метода в скетче из проек­ // Инициализируем последовательную связь:
та 6, так как мы устанавливаем Serial.begin(9600);
подключение Wi-Fi вместо обыч­
ного проводного подключения Serial.println("Пытаемся подключиться к сети...");

Ethernet. Если метод устанавли­ // Пытаемся подключиться, используя шифрование WPA:


status = WiFi.begin(ssid, password);
вает подключение, выводится
имя сети. В противном случае,
// Или же используем следующую линию кода в случае
останавливаем исполнение про­
// 128-битного шифрования WEP
граммы. Шилд Wi-Fi по умолча­ // status = WiFi.begin(ssid, keylndex, key);
нию использует протокол DHCP,
поэтому в коде делать что-либо Serial.print("SSID: ");
для получения IP-адреса по Serial.println(ssid) ;
DHCP не требуется:
// Если не удалось подключиться, останавливаемся здесь:
Остальная часть скетча точно та­ if ( status != WL_CONNECTED) {
кая же, как и в скетче из проек­ Serial.println("Не удалось подключиться к сети WiFi");
та 6, и можно просто скопировать while(true);
код оттуда. Для Wi-Fi, так же как }
и для Ethernet, библиотечные ин­ }
терфейсы Client И Library те же
самые, что позволяет с легкостью
переключаться между Ethernet
и Wi-Fi.

йй Д и а гн о сти р о в а н и е W i-Fi
Шилд Wi-Fi предоставляет нам не только возможность создавать беспроводные сетевые про­
екты, но также и несколько других полезных функций для диагностирования состояния под­
ключения. Прежде чем приступать к работе над проектом Wi-Fi, неплохо выполнить несколько
диагностических тестов, чтобы проверить качество подключения. Подобно любому другому
беспроводному подключению, подключение Wi-Fi невидимо, поэтому в поисках и устранении
причин проблем с ним легко запутаться, диагностируя что-то совсем другое, когда проблема
заключается всего лишь в отсутствии подключения.
Независимо от используемого вами модуля Wi-Fi, Модули Wi-Fi для микроконтроллеров не под­
при попытке подключения к микроконтроллеру у держивают корпоративные сетевые протоколы
вас, скорее всего, возникнут какие-либо пробле­ наподобие шифрования WPA2.
мы. Далее приводится описание нескольких наи­
• Некоторые публичные сети используют пор­
более распространенных проблем, которые следует
тал авторизации, на котором нужно выполнить
устранить в первую очередь.
вход в сеть, прежде чем можно будет получить
• Если вы пытаетесь подключиться к сети школы полный доступ к сети. Подключение к таким
или учреждения, где вы не контролируете марш­ сетям сопряжено с трудностями, так как необ­
рутизатор Wi-Fi, уточните предварительно всю ходимо запрограммировать микроконтроллер
требуемую сетевую информацию и убедитесь, (а не модуль Wi-Fi!) на выполнение сначала
что ваш модуль Wi-Fi может с ней работать. запроса HTTP на портале авторизации, предоста-
268 Глава 6

вив информацию для входа. Будет лучше ис­ // Выводим номер и имя каждой обнаруженной сети:
пользовать сеть без портала авторизации, если for (int thisNet = 0; thisNet<numSsid;
thisNet++) {
есть такая возможность.
Serial.print(thisNet);
• Некоторые устройства Wi-Fi, включая шилд Serial.print(«) Network: «);
Arduino Wi-Fi, не могут видеть сети Wi-Fi со Serial.println(WiFi.SSID(thisNet));
скрытым SSID. Если возможно, обеспечьте пу­ }
бличную видимость вашей сети при включен­
А это скетч для определения уровня сигнала сети
ном шифровании.
после подключения к ней:
• Поскольку модуль Wi-Fi не предоставляет ин­ // Выводим уровень принимаемого сигнала:
терфейса для получения обратной связи об long rssi = WiFi.RSSIO;
ошибках, сравните его конфигурацию с конфи­ Serial.print(«RSSI:»);
гурацией компьютера, мобильного телефона Serial.println(rssi);
или другого устройства, которое успешно под­
ключается к данной сети. Оба эти скетча весьма полезны при диагностирова­
нии сетей Wi-Fi. В зависимости от среды вашей бес­
Далее приводится два фрагмента диагностического проводной сети и ее конфигурации, она может не
кода для шилда Arduino Wi-Fi, которые также могут всегда обеспечивать стабильную работу. Поэтому
вам пригодиться: скетч для сканирования доступ­ полезно заключить весь код главного цикла loop о
ных сетей и скетч для определения уровня сигнала в оператор if, который проверяет текущее состоя­
сети, к которой выполнено подключение. ние подключения к сети:
Сначала скетч для сканирования на доступные сети void loop() {
Wi-Fi: if ( status == WL_CONNECTED) {
// Вся работа цикла выполняется здесь
// Сканируем на доступные сети Wi-Fi
} else {
byte numSsid = WiFi.scanNetworks();
// Информируем пользователя об
отсутствии подключения
// Выводим список обнаруженных сетей:
}
Serial.print(«SSID List:»);
Serial.println(numSsid);
}
Беспроводная связь 269

йЁЗакл ю чен и е
Беспроводная связь в некоторых аспектах значительно отличается от проводной. Вследствие
осложнений, связанных с природой беспроводной связи, нельзя рассчитывать на прохожде­
ние сообщений, как в случае с проводной связью, поэтому нужно определиться со способами
решения подобных проблем.
Если вы выберете вариант наиболее дешевого ре­ а в случае радиосвязи помехи создаются всеми ти­
шения, то сможете реализовать только однонаправ­ пами источников электромагнитного излучения:
ленный беспроводный канал, использующий пару от микроволновых печей до электрогенераторов и
передатчик-приемник, и вам придется передавать мобильных телефонов. Для обеспечения достав­
сообщение по нескольку раз подряд, надеясь, что ки данных можно написать свой код для проверки
в конечном итоге оно будет получено. на ошибки, но все чаще беспроводные протоколы,
такие как Bluetooth и ZigBee, позволяют разработ­
Вложив чуть больше финансов, вы можете реали­ чику не заморачиваться с этим, поскольку модули,
зовать дуплексное соединение, когда каждая сто­ которые реализуют эти протоколы, содержат и код
рона может запрашивать данные у другой стороны для исправления ошибок.
и подтверждать их получение. В настоящее время
дуплексная связь является фактически стандар­ Так же, как мы начали изучение сетей, реализуя
том — вследствие минимальной разницы в цене простую — один к одному — сеть в главе 2, в этой
с парой передатчик-приемник и все уменьшающей­ главе мы начали изучение беспроводных сетей с
ся доступностью этого типа оборудования. рассмотрения простой пары узлов. В следующей
главе мы обсудим одноранговые сети, в которых от­
Независимо от выбранного вами типа беспровод­ сутствует центральный контроллер, и каждый узел
ной связи нужно быть готовым к помехам, кото­ которых может взаимодействовать с любым другим
рые сопутствуют всем типам беспроводной связи. узлом сети. Будет рассмотрены как проводные, так
В случае инфракрасной связи помехи создаются све­ и беспроводные сети Ethernet.
том от лампочек накаливания и источников тепла,
Глава 7 41
БЕССЕАНСОВЫЕ СЕТИ

Сетевые подключения, с которыми мы имели дело до сих пор


в этой книге, были в основном выделенными подключениями
между двумя объектами. Для последовательной связи требуется
управление последовательным портом, а для подключений почты,
браузера и telnet — сетевой порт. Во всех этих случаях присутствует
устройство, которое предоставляет порт (обычно это делает сервер),
и устройство, запрашиваю щее доступ к порту (так называемый
клиент). Классическим примером этого подхода был проект 8
сетевого пинг-понга в главе 5, где сервер обрабатывал все
взаимодействия между другими устройствами-клиентами.
В этой главе мы рассмотрим, как организовать прямое
взаимодействие любого сетевого устройства с любым другим
сетевым устройством или одновременно с несколькими другими
сетевыми устройствам и.

44 Туфли-дирижеры Эндрю Шнайдера (Andrew Schneider)


Туфли обмениваются данными с мультимедийным компьютером по радиомодулю
ХВее. При выполнении танцевальных па скорость и ритм танцора управляют воспро­
изведением музыки компьютером.
272 Глава 7

4$ Ком поненты для п р о е кто в этой главы


Код поставщ ика ►
►Радиомодуль ХВее стандарта 802.15.4 компа­
нии Digi, 1 шт.
Россия AMP: АМР-Х124, http://amperka.ru/product/
• АМР — «Амперка» (http://amperka.ru) xbee
J: 2113375, SF: WRL-08664, AF: 128, F: 1546394,
• CHD — «Чип и Дип» (http://chipdip.ru)
SS: WLS113A4M, MS: MKAD14
• LC — «Линуксцентр» (www.Iinuxcenter.ru) ►
►Регулятор напряжения 3,3 В, 1 шт.
CHD: 9020002518, J: 242115, D: 576-1134-ND,
США и Европа SF: СОМ-00526, F: 1703357, RS: 534-3021
• А — Arduino Store (http://store.arduino.cc/ww) ►
►Адаптерная плата для ХВее, 1 шт.
• AF — Adafruit (http ://adafr uit.com) J: 32403, SF: BOB-08276, AF : 127
• D — Digi-Key (www.digikey.com) ►
►Штыревой соединитель, 2 шт.
• F — Famell (www.farnell.com) AMP: АМР-Х013, http://amperka.ru/product/
• J — Jameco (http://jameco.com) pin-headers
• MS — Maker SHED (www.makershed.com) J: 103377, D: A26509-20ND, SF: PRT-00116, F:
1593411
• P — Pololu (www.pololu.com)

►Гнездовой разъем, 2 шт.
• PX — Parallax (www.parallax.com)
CHD: 362520493, J: 2037747, D: 3M9406-ND, F:
• RS — RS (www.rs-online.com) 1776193
• SF — SparkFun (www.sparkfun.com) ►
►Конденсатор 1 мкФ, 1 шт.
• SS — Seeed Studio (www.seeedstudio.com) CHD: 31890, J: 94161, D: Р 10312-ND, F: 8126933,
RS: 475-9009
Базовый адаптер для радиомодуля ХВее ►
►Конденсатор 10 мкФ, 1 шт.
В нескольких проектах этой главы используются радио­
модули ХВее. И в каждом таком проекте предусмотре­ AMP: AMP-CE10U-10, http://amperka.ru/prod-
но применение готовых адаптеров, таких как шилд uct/electrolytic-capacitor
беспроводной связи Arduino, адаптерная плата ХВее J: 29891, D: P11212-ND, F: 1144605, RS: 715-
Explorer Regulated компании SparkFun или адаптерная
плата LilyPad ХВее. Если по какой-либо причине вы 1638
предпочтете не задействовать эти адаптеры, то можете ►
►Светодиод, 2 шт.
собрать свою базовую адаптерную плату для радиомо­
дуля ХВее на беспаечной макетной плате. Варианты AMP: AMP-X009-R4, http://amperka.ru/prod-
принципиальной и монтажной схем этой платы показа­ uct/led-5mm
ны на рис. 7.5, 7.6, 7.8 и 7.14, а далее приводится спи­
сок деталей для нее: D: 160-1144-ND или 160-1665-ND, J: 34761 или
94511, F: 1015878, RS: 247-1662 или 826-830,

►Беспаечная макетная плата, 1 шт. SF: СОМ-09592 или C0M-09590

►Сопротивление 220 Ом, 2 шт.
AMP: АМР-ХООЗ, http://amperka.ru/product/
breadboard-half AMP: AMP-R220R-10, http://amperka.ru/prod-
D: 438-1045-ND, J: 20723 или 20601, SF: PRT- uct/resistor
00137, F: 4692810, AF: 64, SS: STR101C2M или D: 220QBK-ND, J: 690700, F: 9337792, RS: 707-
STR102C2M, MS: MKKN2 8842
Бессеансовые сети 273

Проект 13. Предупреждение о токсических испарениях в мастерской


►Базовый адаптер для радиомодуля ХВее, SF: DEV-09026, J: 2124242, A: 139, AF: 201,
2 шт. Его описание приведено ранее. F: 1848680

►Регулятор напряжения 5 В, 1 шт. ►
►Шилд беспроводной связи Arduino, 1 шт. В ка­
AMP: АМР-Х065, http://amperka.ru/product/ честве альтернативы подойдет описанный ранее
voltage-regulator-17805 базовый адаптер для радиомодуля ХВее.
J: 51262, D: LM7805CT-ND, SF: СОМ-00107, F: AMP: А000064, http://amperka.ru/product/ar-
1860277, RS: 298-8514 duino-wireless-shield

►Источник постоянного тока 9-12 В, 1 шт. А: А000064 или А000065.
Подойдет как батарейка, так и сетевой источник Альтернативы: SF: WRL-09976, AF: 126, F:
питания. 1848697, RS: 696-1670, SS: WLS114A0P
AMP: EN1000S, http://amperka.ru/product/ ►
►Игрушка мартышка-цимбалист, 1 шт. Я ис­
wall-plug-la пользовал игрушку Charlie Chimp, приобретен­
J: 170245, SF: T0L-00298, AF: 63, F: 636363, Р: ную в компании Aboyd Company (www.aboyd.
1463 com), номер по каталогу: АВС 40-1006.

►Датчик газа производства компании Hanwei, Об источнике питания
1 шт. Компания Hanwei выпускает широкий
Если для вашей игрушки требуется источник пита­
диапазон датчиков газа, и многие розничные ния напряжением 3 В (например, две батарейки клас­
поставщики, указанные в этой книге, имеют их са D), регулятор напряжения на 3,3 В будет не нужен.
в наличии. Датчик MQ-7 обнаруживает угарный Но при этом необходимо обеспечить достаточную для
газ, MQ-3 — алкоголь, MQ-6 — пропан и род­ радиоустройств силу тока. Если собранные согласно
ственные ему газы, a MG811 — углекислый газ. приведенным схемам и инструкциям радиоустройства
Все они основаны на сходных принципах рабо­ функционируют неустойчиво, причиной может быть
«захват» всего энергопитания двигателем игрушки.
ты, так что, выберите тот, который вас больше
В таком случае для схемы радиоустройства следует ис­
всего интересует. пользовать отдельный источник питания.
АМР: SENO 127, SEN0128 или SEN0134, http://
amperka.ru/collection/gas ►
►Потенциометр, 1 шт.
SF: SEN-08880, SEN-09404, или SEN-09405, AMP: АМР-Х021, http://amperka.ru/product/
P: 1480, 1634, 1633, 1481, 1482, или 1483, PX: potentiometer
605-00007, 60500008, 605-00009, 605-00010, или J: 29082, SF: СОМ-09939, F: 350072, RS: 522-
605-00011 0625

►Адаптерная плата для датчика газа, 1 шт. ►
►Пара Дарлингтона, NPN TIP120,1 шт.
Распиновка датчиков Hanwei не дружит со стан­ CHD: 47667, D: TIP120-ND, J: 32993, F: 9804005
дартными макетными платами, и эта плата при­
звана их примирить. Компании Pololu и SparkFun ►
►Силовой диод 1N4004,1 шт.
предлагают свои варианты платы. AMP: АМР-Х045-5, http://amperka.ru/product/
SF: ВОВ-08891, Р: 1479 или 1639 rectifier-diode

►Сопротивление 10 К, 1 шт. D: 1N4004-E3 mm23GI-ND, J: 35992, F: 9556109,
RS: 628-9029
AMP: AMP-R10K-10, http://amperka.ru/prod-
uct/resistor ►
►Сопротивление 1 К, 1 шт.
D: 10KQBK-ND, J: 29911, F: 9337687, RS: 707- AMP: AMP-R1K-10, http://amperka.ru/product/
8906 resistor
►►Плата Arduino Ethernet, 1шт. А: А000050. В ка­ D: 1.0KQBK-ND, J: 29663, F: 1735061, RS: 707-
честве альтернативы подойдет совместимая с Ar­ 8669
duino Uno (см. главу 2) плата с Ethemet-шилдом. ►
►Конденсатор 100 мкФ, 1 шт.
AMP: А000068, http://amperka.ru/product/ CHD: 563371684, J: 158394, D: P10269-ND, F:
arduino-ethernet 1144642, RS: 715-1657
274 Глава 7

Проект 14. Беспроводная ретрансляция данных солнечной панели



►Адаптер USB/XBee-Serial, 1 шт. AMP: АМР-Х035-5, http://amperka.ru/product/
bipolar-transistor
АМР: DFR0174, http://amperka.ru/product/
xbee-usb-converter J: 178618, D: 2N3906D26ZCT-ND, SF: СОМ-
00522, F: 1459017, RS: 294-328
J: 32400, SF: WRL-08687, AF: 247, РХ: 32400
» Солнечная панель, 1 шт.

►Базовый адаптер для радиомодуля ХВее,
1 шт. Его описание приведено ранее. Он и ста­ SF: PRT-07840, Р: 1691
нет основой для схемы с солнечной панелью. ►
►Плата Arduino Ethernet, 1шт. А: А000050.

►Регулятор напряжения 5 В, 1 шт. В качестве альтернативы подойдет совмести­
мая с Arduino Uno (см. главу 2) плата с Ethemet-
АМР: АМР-Х065, http://amperka.ru/product/ шилдом.
voltage-regulator-17805
AMP: А000068, http://amperka.ru/product/ar-
J: 51262, D: LM7805CT-NB, SF: СОМ-ООЮ7, F:
duino-ethernet
1860277, RS: 298-8514
SF: DEV-09026, J: 2124242, A: 139, AF 201, F:

►Электролитический конденсатор 4700 мФ,
1848680
3 шт.

►Шилд беспроводной связи Arduino, 1 шт. В ка­
CHD: 177404095, J: 199006, D: P10237-ND, честве альтернативы подойдет описанный ранее
F: 1144683, RS: 711-1526 базовый адаптер для радиомодуля ХВее.

►Монитор напряжения МАХ8212, 1 шт. Бес­ AMP: А000064, http://amperka.ru/product/ar-
платный образец можно заказать у компании duino-wireless-shield
Maxim (www.maxim-ic.com).
А: А000064 или А000065. Альтернативы: SF:
CHD: 8958297444 (SMD-версия), D: WRL-09976, AF: 126, F: 1848697, RS: 696-1670,
МАХ8212CPA+-ND, F: 1610130 SS: WLS114A0P

►Сопротивление 10 К, 1 шт. ►
►Разъем для батарейки «Крона» 9 В, 1 шт.
АМР: AMP-R10K-10, http://amperka.ru/prod- AMP: AMP-W003, http://amperka.ru/product/
uct/resistor krona-21mm-cable
D: 10KQBK-ND, J: 29911, F: 9337687, RS: 707- D: 2238K-ND, J: 101470, SF: PRT-09518, F:
8906 1650675

►Сопротивление 100 К, 3 шт. ►
►Батарейка «Крона» 9 В, 1 шт. Можно также
АМР: AMP-R100K-10, http://amperka.ru/prod- использовать три или четыре батарейки клас­
uct/resistor са АА, если у вас есть для них соответствующий
держатель. В принципе, подойдет любая бата­
D: 100KQBK-ND, J: 29997, F: 9337695, RS: 707- рейка или набор батареек, выдающие напряже­
8940 ние в диапазоне 5-12 В.

►Сопротивление 4,7 К, 1 шт.

►Адаптер ХВее LilyPad, 1 шт. Требуется для
АМР: АМР-4К7-10, http://amperka.ru/product/ радиоретранслятора. В качестве альтернативы
resistor можно использовать адаптерную плату ХВее
D: CF14JT4K70CT-ND, J: 691024, F: 735033, Explorer Regulated (см. далее) или описанный
RS: 707-8693 ранее базовый адаптер для радиомодуля ХВее.

►Сопротивление 1 К, 1 шт. AMP: DEV-08937, http://amperka.ru/product/
lilypad-xbee
АМР: AMP-R1K-10, http://amperka.ru/product/
resistor SF: DEV-08937
D: 1.0KQBK-ND, J: 29663, F: 1735061, RS: 707- ►
►Адаптерная плата ХВее Explorer Regulated,
8669 1 шт. Альтернатива для адаптера ХВее LilyPad.

►Транзистор NPN 2N3906,1 шт. SF: WRL-09132
Бессеансовые сети 275

Рис. 7.1. Новые компоненты для проектов этой главы:


1. Игрушка Charley Chimp. 2. Транзистор 2N3906.3. Монитор напряжения МАХ8212.4. Датчик газа компании Hanwei.
5. Адаптерная плата для датчика газа. 6. Настроечный потенциометр. 7. Солнечная панель.
Потребуется также достаточное количество штырьковых контактов для адаптерных плат

йй Сеансы и сообщения
До сих пор большинство проектов связи из этой книги работали, открывая выделенное под­
ключение между двумя узлами для всего периода обмена данными. Такой тип связи называется
связью на основе сеансов (session-based). Но иногда требуется более свободный обмен сообще­
ниями между объектами, когда участники обмена могут меняться на ходу или даже отправлять
сообщения целой группе узлов, если ситуация того требует. Для этого нужен протокол, осно­
ванный на сообщениях.

Сеансы по сравнению запросить подключение к другому устройству.


В ответ на запрос подключения другое устройство
с сообщениями открывает сетевой порт, создавая таким образом под­
В главе 5 мы познакомились с протоколом ТСР, кото­ ключение. По установлению подключения выполня­
рый используется для реализации большого объема ется обмен данными, по завершению которого под­
обмена данными в Интернете. Для взаимодействия ключение закрывается. Вся эта последовательность
с помощью протокола ТСР одно устройство должно «запрос — подключение — обмен — закрытие»
276 Глава 7

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


обмен данными с несколькими устройствами, с для того же сегмента локальной сети, к которому
каждым из них нужно установить и поддерживать принадлежит отправляющий узел. Для отправки
сеанс. Сеансы являются характерным признаком сообщений по этому адресу знать адрес подсети не
обмена данными по протоколу TCP. требуется. Этот адрес может быть полезен для вы­
полнения таких задач, как определение находящих­
Но не все сетевые взаимодействия основаны на
сеансах. В Интернете используется еще один про­ ся в подсети узлов.
токол — UDP1. Пользуясь протоколом UDP, мы Преимущество протокола UDP состоит в более вы­
создаем сообщение, даем ему адрес назначения, от­ сокой скорости перемещения его данных, так как
правляем и забываем о нем. для них не выполняется проверка на правильность
В отличие от основанного на сеансах протокола их передачи. Кроме того, он позволяет сменить
TCP, протокол UDP характеризуется сообщениями. устройство назначения в ходе передачи. А недоста­
Сообщения протокола UDP называются дейтаграм­ ток его заключается в том, что он менее надежный
мами. Для каждой дейтаграммы указывается адрес в побайтовом отношении, так как утерянные паке­
назначения, после чего дейтаграмма отправляется ты не отправляются повторно. Протокол UDP по­
в канал связи с предположением, что она дойдет по лезно применять для передачи потоковых данных,
месту назначения. Двустороннее сокетное соедине­ содержащих большой объем дублирующей инфор­
ние между отправителем и получателем отсутству­ мации, — таких как видео или аудио. Потеря пакета
ет. Ответственность за то, что делать в случае, если в аудио- или видеопотоке может быть замечена как
некоторые пакеты дейтаграммы не прибудут или небольшое кратковременное искажение, не влияю­
прибудут в неправильном порядке, лежит на полу­ щее на общее восприятие воспроизводимого изо­
чателе сообщения. бражения или звука.
То обстоятельство, что протокол UDP не полагается Отношение протокола TCP к протоколу UDP подоб­
на выделенное «один-к-одному» соединение между но отношению технологии Bluetooth к технологии
отправителем и получателем, позволяет отправ­ 802.15.4. Для взаимодействия устройства Bluetooth
лять широковещательные сообщения всем другим должны установить сеанс друг с другом, в то время
объектам той же подсети. Для этой цели зарезер­ как радио 802.15.4 (наподобие радиомодулей ХВее
вирован специальный 1Р-адрес: 255.255.255.255. в главе 6) взаимодействуют, просто отправляя адре­
Иными словами, если любой узел подсети отпра­ сованные сообщения в сеть и не ожидая результа­
вит сообщение UDP по адресу 255.255.255.255, оно тов их доставки. Подобно протоколу TCP, протокол
будет принято всеми другими узлами этой подсе­ Bluetooth применяется для передач, в которых каж­
ти. Это специальный широковещательный адрес дый байт является критическим, но он менее гибок
1 UDP, User Datagram Protocol — протокол передачи дейта­ во всем, что касается сопряжения, чем технология
грамм пользователя. 802.15.4.

&й Кто там? Широковещательные сообщения


Первое преимущество протоколов, не требующих установления подключения, — таких как
1ЮР или 802.15.4, состоит в том, что они позволяют передавать сообщения одновременно всем
узлам сети. Впрочем, все время делать так нежелательно, поскольку это наводнит сеть сообще­
ниями, которые нужны далеко не каждому устройству, но такую возможность полезно иметь
под рукой, когда надо узнать, какие другие устройства имеются в сети. Для этого нужно просто
отправить широковещательное сообщение, спрашивая «Кто там?», и ожидать ответы.
Бессеансовые сети 277

Определение других устройств с помощью UDP


Библиотека Ethernet среды Arduino включает воз­ разработки Стефана Кузо (Stephane Cousot), кото­
можность отправлять и получать пакеты UDP. Это рую можно загрузить по адресу http://processing.
позволяет создать простой скетч, который ожида­ org/reference/libraries/#data_protocols. Чтобы ис­
ет широковещательные сообщения и отвечает на пользовать эту библиотеку, разархивируйте загру­
них. Такая возможность может быть полезна, когда женный ZIP-архив и скопируйте полученную пап­
нужно получить одновременный ответ от большого ку udp в подпапку libraries папки Processing. Затем
числа сетевых устройств. Отправить такой широко­ перезапустите среду Processing, и библиотека UDP
вещательный запрос можно с помощью программы будет готова к применению.
Processing.
Для следующего проекта подойдет любая плата
Библиотека Network среды Processing не годится Arduino с шилдом Ethernet, подключенным к сети.
для отправки сообщений UDP, но это можно делать Кроме шилда Ethernet, никакого другого оборудова­
с помощью хорошей бесплатной библиотеки UDP ния не требуется.

ШГПосылаем сообщение
и получаем ответ________
Рассматриваемый скетч Proces­
sing посылает широковещатель­ Отправитель/получатель широковещательного запроса UDP
ное сообщение UDP на порт Контекст: Processing
43770. Это произвольный порт, */
расположенный достаточно вы­ // Импортируем библиотеку UDP:
соко, что делает его использова­ import hypermedia.net.*;
ние другими распространенными
приложениями маловероятным. UDP udp; // Инициализируем объект иРР:

Значение IP-адреса маршрутиза­ void setup() {


тора или компьютера, на котором udp = new U DP( this, 43770 ); // Открываем порт иРР:
исполняется этот скетч, не имеет udp.listen( true ); // Ожидаем входящие сообщения:
значения, так как в нем задейство­ }
ван специальный широковеща­
тельный адрес 255.255.255.255. void draw()

В отличие от обмена сообщения­ {


ми с установлением подключе­ }
ния, где байты посылаются и
void keyPressed() {
считываются с потока, подобно
String ip = "255.255.255.255"; // IP-адрес назначения
последовательной связи, сооб­
int port = 43770; // Порт назначения
щения UDP отправляются в од­ udp. send («Привет!\n>>, ip, port ); // Отправляемое сообщение
ном отдельном сообщении: udp.
send (), которое содержит адрес и
порт назначения:

Ответ сохраняется в массиве void receive( byte[] data ) {


data [] И ВЫВОДИТСЯ методом // Выводим на экран входящие байты данных, как символы ASCII:
receive ()библиотеки UDP ПО for(int thisChar=0; thisChar < data.length; thisChar++) {
одному символу за раз: print(char(data[thisChar]));

println () ;
} ►

278 Глава 7

□ Отвечаем на запрос | /*
Ответчик на запрос UDP
Следующий скетч Arduino ожи­
Контекст : Arduino
дает сообщения UDP на том же
*/
порту 43770 и отвечает на них.
Загрузите этот скетч в модуль
#include <SPI.h>
Arduino, подключенный к сети
#include <Ethernet.h>
вашего компьютера через шилд
#include <Udp.h>
Ethernet:

// Введите МАС-адрес и IP-адрес для вашего сетевого адаптера.


// IP-адрес будет зависеть от вашей локальной сети.
// Вместо выделенных жирным шрифтом значений укажите значения
// для вашего устройства,
byte шас[] = {
0x00, ОхАА, ОхВВ, OxCC, OxDE, 0x01 };
IPAddress mylp(192,168,1,20);
unsigned int myPort =43770; // Локальный порт, на котором
// ожидаются UDP-сообщения

// Экземпляр UDP для отправки и получения пакетов по протоколу UDP


UDP query;

void setup() {
// Запускаем последовательное подключение:
Serial.begin(9600);

// Запускаем подключение Ethernet:


Ethernet.begin(mac, mylp);
// Выводим на экран наши адреса:
for (int thisByte = 0; thisByte < 4; thisByte+t) {
Serial.print(Ethernet.locallP()[thisByte], DEC);
Serial.print(«.»);

Serial.println();

query.begin(myPort);
// Даем шилду Ethernet секунду для инициализации:
delay(1000);

lid Цикл loop () просто вызыва­ void loop ()


ет метод l i s t e n (), который ожи­ {
дает входящие пакеты UDP на listen(query, myPort);
том же самом порту, на который }
скетч Processing отправляет ши­
роковещательное сообщение:


Бессеансовые сети 279

ШГ Процесс получения пакетов void listen(UDP thisUDP, unsigned int thisPort)


UDP несколько отличается от по­ {
лучения пакетов TCP. Каждый // Проверяем на наличие входящего пакета и извлекаем
пакет UDP содержит заголовок // информацию из заголовка:
с информацией о том, с какого int messageSize = thisUDP.parsePacket();
// Если есть полезная нагрузка, извлекаем ее:
адреса и порта он был отправлен.
if (messageSize > 0) {
При получении пакета эту ин­
Serial.print(«сообщение получено от: «);
формацию нужно извлечь из за­
// Извлекаем адрес и порт отправителя:
головка. Эту задачу и выполняет IPAddress yourlp = thisUDP.remotelP() ;
МеТОД parsePacket () ИЗ библиоте­
unsigned int yourPort = thisUDP.remotePort();
ки UDP для Arduino, вызываемый for (int thisByte = 0; thisByte < 4; thisByte++) {
несколько раз в методе listen о. Serial.print(yourlp[thisByte], DEC);
Сначала с помощью этого ме­ Serial .print (". ")•;
тода мы извлекаем элементы }
заголовка из тела сообщения. Serial.println(" на порт: « + String(thisPort));
Затем с помощью метода read () // Отправляем полезную нагрузку на последовательный порт:
побайтно считываем само со­ while (thisUDP.available() > 0 ) {
общение, как мы это уже делали // Считываем пакет в буфер пакетов:
с сокетами и последовательны­ int udpByte = thisUDP.read();
ми портами TCP. Вызовы соот­ Serial.write(udpByte);
ветствующих методов выделены }
в коде жирным шрифтом: sendPacket(thisUDP, Ethernet.locallP(), yourlp, yourPort);
}

И Метод sendPacket () ОТПрДВЛЯ- void sendPacket(UDP thisUDP, IPAddress thisAddress,


IPAddress destAddress, unsigned int destPort)
ет пакет ответа на адрес и порт,
с которого было получено сооб­ {
// Подготавливаем пакет для отправки:
щение. В тело ответа включает­ thisUDP.beginPacket(destAddress, destPort);
ся 1Р-адрес и порт отвечающего for (int thisByte = 0; thisByte < 4; thisByte++) {
устройства в виде строки А8СИ: // Отправляем байт:
thisUDP.print(thisAddress[thisByte], DEC);
thisUDP.print («.»);

thisUDP.println(«Привет, там!»);
thisUDP.endPacket();

Как можно видеть, обмен сообщениями по прото­ 192.168.1.20


колу UDP отличается от обмена сообщениями по После этого запустите на исполнение скетч Pro­
сокетам протокола TCP. Каждый пакет сообщения cessing и нажмите любую клавишу. В окне монито­
необходимо начать и завершить. При исполнении ра порта Arduino должно быть выведено следующее
метода beginPacket () для начала пакета контроллер сообщение:
Ethernet начинает сохранять подлежащие отправле­
нию байты в своей памяти, а когда вызывается ме­ сообщение получено от : 192.168.1.1. на порту:
тод endPacket о для завершения пакета, контроллер 43770 Привет!
начинает отправлять сохраненные байты. Адрес в сообщении будет IP-адресом вашего ком­
Загрузив программу в Arduino, установите с мо­ пьютера. А в окне скетча Processing должно быть
дулем последовательное соединение с помощью выведено следующее сообщение:
монитора порта. Когда модуль Arduino получит IP- Привет !
адрес, он должен вывести этот адрес в окне мони­ 192.168.1.20. Привет, там!
тора порта:
280 Глава 7

Просто привет в первой строке — от самой про­ Приведенный здесь скетч полезно добавлять в лю­
граммы Processing. Дело в том, что отправитель так­ бой проект, связанный с работой в Е&етеЕ Вам
же получает свое собственное широковещательное нужно будет предоставить отдельный экземпляр
сообщение. А строка привет, там! во второй стро­ 1ЮР И порт ДЛЯ прослушки, НО метод Бепс1Рас]^ ()
ке — от модуля Arduino. Если подключить к сети может работать с другими программами для полу­
несколько модулей Arduino и исполнять на них этот чения ответа от устройства при отправке широко­
скетч, каждый из них даст такой ответ. Собственно вещательных сообщений.
говоря, суть этого примера демонстрируется лучше
всего, когда отвечают несколько сетевых узлов.

Запросы для радиомодулей ХВее


Применение широковещательных
сообщений протокола 802.15.4
Аналогично тому, как в подсети Ethernet посылают­ Подождем, пока радио не ответит ок. Затем выпол­
ся UDP-запросы для определения устройств в дан­ ните команду:
ной подсети, подобные запросы можно посылать АТШ\г
и в персональных сетях ХВее. Радиомодули ХВее
имеют специальную команду для определения всех Возврат каретки
модулей, доступных в сети. Эта процедура назы­ Не забывайте, что символы \г в этой записи означают
вается обнаружением узлов (node discovery). Когда возврат каретки, поэтому вместо ввода этих символов
радиоустройство ХВее получает команду а т ш \г с клавиатуры просто нажмите клавишу <ЕЩег>
стандарта АТ, оно посылает широковещательное со­
общение, запрашивающее, чтобы все другие радио­ Если в радиусе действия передатчика присутствуют
устройства данной персональной сети идентифици­ в этой же персональной сети другие радиоустрой­
ровали себя. Когда радиоустройство получает это ства, после нескольких секунд они ответят следую­
сообщение, оно отвечает сообщением, содержащим щим образом:
свой исходный адрес, серийный номер, уровень по­ 1234
лученного сигнала и идентификатор узла. 13А200
400842А7
О версии прошивки ХВее 28

Чтобы выполнять операцию обнаружения узлов, радио­ Т160Е1


устройство ХВее должно иметь версию 10А1 или более
позднюю версию прошивки. Дополнительную инфор­ 5678
мацию по этому вопросу см. далее в разд. «Обновление 13А200
прошивки радиоустройств ХВее». 400842А9

Для следующего упражнения нам будут нужны, Т1СОЕЗ
по крайней мере, два радиомодуля ХВее, подклю­
ченные к последовательным портам компьютера. Каждая группа строк здесь представляет ответ от
Подключить радиомодули легче всего с помощью отдельного радиоустройства. Первая строка груп­
адаптера USB/XBee-Serial, наподобие адаптера пы — это исходный адрес устройства (который
ХВее Explorer. предоставляется устройству при отправке ему
команды а т м у ). Вторая строка — старшее слово се­
Подключив и запустив в работу радиоустройства, рийного номера устройства, а третья — младшее
установите последовательное подключение с одним слово серийного номера. Четвертая строка — зна­
из них в мониторе портов и выполните команду: чение уровня сигнала при получении отвечающим
+++ устройством сообщения запроса.
Бессеансовые сети 281

Последняя строка группы содержит идентифи­ Замените строку имя радио любым именем, которое
катор узла радиоустройства — текстовую строку вы хотите присвоить своему модулю.
длиной до 20 символов, представляющую собой
Широковещательные сообщения могут быть по­
имя устройства, присвоенное ему пользователем.
лезными во многих ситуациях. Но их следует ис­
Эта функция не применялась в проектах главы 6,
пользовать осмотрительно, так как они создают
поэтому ваши радиомодули могут и не иметь такого
дополнительную нагрузку на пропускную способ­
идентификатора. Присвоить его можно, выполнив
ность сети. В следующем проекте мы используем
для устройства команду:
широковещательные сообщения для обнаружения
АТЫ1 имя_радио, Ш \ г всех объектов в небольшой закрытой сети.

И з Обновление прошивки радиоустройств ХВее


Чтобы радиоустройство ХВее могло выполнять ки. Выберите в этом списке самую послед­
команды обнаружения узлов, идентификации нюю версию прошивки, а затем установите
узлов, а также некоторые другие команды типа флажокАИуаув update firmware (Всегда обнов­
АТ, его прошивку нужно обновить, по крайней лять прошивку). Оставьте значение раскрываю­
мере, до версии 10А1. Узнать текущую версию щегося списка Function Set х в е е 802 л 5.4. Затем
прошивки радиоустройства можно, выполнив нажмите кнопку Write. Программа загрузит
для него команду в устройство новую прошивку, обеспечив ему
возможность выполнения расширенного набора
ATVR\r
команд АТ. Программу X-CTU полезно иметь под
Радио ответит числом из четырех шестнадцате­ рукой, так как она позволяет изменять и запи­
ричных цифр. Если это номер 10А1 или больше, сывать настройки радиоустройств, не прибегая
радио может выполнять расширенные команды. к использованию команд АТ.
В противном случае зайдите на сайт http://www.
digi.com/support/kbase/kbaseresultdetl?id=2125
и загрузите программное обеспечение X-CTU.
К сожалению, пользователям Mac OS X и Linux
не повезло — это ПО работает только под
Windows. Исполнять это ПО можно в эмуляторах
VirtualBox (бесплатный), Parallels ($80), VMWare
($80), на компьютерах Мае с помощью Bootcamp,
а также на компьютерах с Linux, используя аль­
тернативную загрузку в Windows.
Установите приложение согласно инструкциям
и запустите его на исполнение. На вкладке PC
Settings программы можно выбрать последо­
вательный порт, к которому подключено радио­
устройство ХВее. Выберите требуемый порт
и оставьте значения по умолчанию для других
параметров. Для обновления прошивки устрой­
ства выберите вкладку Modem Configuration.
Нажмите кнопку Read, чтобы получить инфор­
мацию о текущей прошивке устройства. В ин­
формационной панели окна будет выведен спи­
сок параметров, как показано на рис. 7.2.
Номер версии прошивки указан в строке полей
над этой панелью, в правом крайнем поле Version.
Это поле имеет раскрывающийся список, содер­ Рис. 7.2. Вкладка Modem Configuration программы
жащий последние доступные версии прошив­ х-сти
282 Глава 7

Проект 13
Предупреждение о токсических испарениях в мастерской
Если у вас есть мастерская, вы оцените этот проект. Подключив датчик летучих испарений
к радиомодулю ХВее, вы сможете обнаруживать повышенную концентрацию испарений рас­
творителей в атмосфере мастерской. При работе с химикатами в мастерской легко привыкнуть
к испарениям этих химикатов, что может повлечь нежелательные последствия, вплоть до ле­
тальных. Этот проект демонстрирует, как можно предотвратить такое развитие событий.

Значения датчиков отправляются по радио двум дру­ с ударными тарелками в руках, которая находится
гим устройствам. Одно из них подключено к плате где-то в другом месте дома и поднимает ужасный
Arduino, которая посредством шилда Ethernet под­ звон, когда уровень испарений органических рас­
ключена к Интернету в качестве веб-сервера. Второе творителей в мастерской достигает определенного
устройство подключено к игрушке мартышки порогового значения. Таким образом, остальные
обитатели дома сразу же поймут, что воздух в ва­
шей мастерской может оказаться отравленным,
и смогут проверить, все ли с вами в порядке. Если
вы не разделяете моего увлечения мартышками,
к этой схеме можно подключить для управления
им любое другое устройство, которое можно вклю­
чать и выключать транзистором. На рис. 7.3 пока­
заны все элементы проекта в собранном виде. А на
рис. 7.4 — блок-схема сети проекта.

ЛИк Это демонстрационный проект


Несмотря на все ранее сказанное, этот проект
предназначен только для демонстрационных
целей. Схема датчика в нем не откалибрована
должным образом. Он не спасет вашу жизнь
в случае опасности, а лишь проинформирует
о наличии испарений растворителей в окру­
жающей вас атмосфере. Не полагайтесь на эту
систему, если вам требуется точное определе­
ние концентрации органических соединений
в воздухе. Свяжитесь с производителем датчи­
ка, чтобы узнать, как создать должным обра­
зом откалиброванную схему.
_____________ __ _____________ 7

Рис. 7.3. Проект, выявляющий наличие токсичных


газов, в сборе: датчик, мартышка и модуль сетевого
подключения
Бессеансовые сети 283

Рис. 7.4. Блок-схема системы выявления токсических газов


284 Глава 7

Требуемые компоненты ►
►Беспаечная макетная плата, 1 шт.


►Адаптер USB/XBee-Serial, 1 шт. ►
►Регулятор напряжения 3,3V В, 1 шт.

►Конденсатор 1 мкФ, 1 шт.
Детали для схем
Детали для проекта представлены в группах для каж­ ►
►Конденсатор 10 мкФ, 1 шт.
дой отдельной схемы, которую мы будем собирать.

►Адаптерная плата для ХВее, 1 шт.
Большинство этих деталей можно приобрести у лю­
бых поставщиков, а не только у тех, которые указаны ►
►Штыревой соединитель, 2 шт.
в перечне деталей в начале главы.

►Гнездовой разъем, 2 шт.
Для схемы датчика ►
►Светодиод, 2 шт.

►Беспаечная макетная плата, 1 шт. ►
►Сопротивление 220 Ом, 2 шт.

►Радиомодуль ХВее компании Digi, 1 шт.

►Регулятор напряжения 5 В, 1 шт. Для схемы исполнительного устройства


►Регулятор напряжения 3,3 В, 1 шт. ►
►Беспаечная макетная плата, 1 шт.


►Источник постоянного тока 9-12 В, 1 шт. ►
►Радиомодуль ХВее компании Digi, 1 шт.
Подойдет как батарейка, так и сетевой источ­ ►
►Игрушка мартышка-цимбалист, 1 шт.
ник питания.

►Адаптерная плата для ХВее, 1 шт. Об источнике питания

►Штыревой соединитель, 2 шт. Если для вашей игрушки требуется источник пита­
ния напряжением 3 В (например, две батарейки клас­

►Гнездовой разъем, 2 шт. са D), регулятор напряжения на 3,3 В будет не нужен.
Но при этом необходимо обеспечить достаточную

►Конденсатор 1 мкФ, 1 шт.
для радиоустройств силу тока. Если собранные со­

►Конденсатор 10 мкФ, 1 шт. гласно приведенным схемам и инструкциям радио­
устройства функционируют неустойчиво, причиной

►Датчик газа производства компании Hanwei, может быть «захват» всего энергопитания двигателем
1 шт. игрушки. В таком случае для схемы радиоустройства
следует использовать отдельный источник питания.

►Адаптерная плата для датчика газа, 1 шт.

►Светодиод, 2 шт. ►
►Регулятор напряжения 3,3V В, 1 шт.

►Сопротивление 220 Ом, 3 шт. ►
►Адаптерная плата для ХВее, 1 шт.

►Сопротивление 10 К, 1 шт. ►
►Штыревой соединитель, 2 шт.

►Гнездовой разъем, 2 шт.
Для схемы подключения к Интернету

►Светодиод, 2 шт.

►Модуль микроконтроллера Arduino, 1 шт.

►Сопротивление 220 Ом, 3 шт.

►Плата Arduino Ethernet, 1 шт.

►Настроечный потенциометр 10 К, 1 шт.

►Радиомодуль ХВее компании Digi, 1 шт.

►Пара Дарлингтона NPN TIP 120, 1 шт.

►Шилд беспроводной связи Arduino, 1 шт. Если
используется этот компонент, перечисленные ►
►Силовой диод 1N4004, 1 шт.
далее детали не требуются. Все они приме­

►Сопротивление 1 К, 1 шт.
няются для подключения радиомодуля ХВее
к плате Arduino. ►
►Конденсатор 100 мкФ, 1 шт.
Бессеансовые сети 285

Настройка радиомодулей
Подсоедините один из радиомодулей к адаптеру PWM0 радиомодуля сигнального устройства будет
USB/XBee-Serial. Эта схема будет использоваться связан с аналоговым вводом радиомодуля датчика.
только для конфигурирования модуля. В проек­ Настройка радиомодуля сигнального устройства
те используется три радиоустройства: для датчи­ выполняется следующими командами:
ка, для исполнительного устройства (мартышка с
• ATMY02 — задает исходный адрес радиомодуля
ударными тарелками или какое-либо другое ваше
сигнального устройства;
устройство) и для модуля Arduino. В главе 6 мы
рассмотрели, как выполнять настройку исходного • ATDL01 — настраивает радиомодуль на отправ­
адреса радиомодуля, адреса назначения и кода PAN ку сообщений только на радиомодуль датчика
ID (идентификатор персональных сетей). В этом (адрес oi). Но эта настройка, по сути, не имеет
проекте мы научимся настраивать функциональ­ никакого значения, так как этот радиомодуль не
ность некоторых их линий ввода/вывода. Например, будет отправлять никаких сообщений;
цифровые и аналоговые линии радиомодуля мож­ • A TiD iiii — задает код PAN ID;
но настроить для работы как ввод, как вывод или • АТР02— настраивает линию 0 ШИМ (Р0) функ­
полностью отключить их. Кроме того, линии мож­ ционировать в качестве вывода ШИМ;
но задать как цифровые или аналоговые вводы или
• attui — настраивает радиомодуль отправлять
цифровые или ШИМ-выводы. Функциональность
все пакеты данных ввода/вывода на последо­
линии вывода можно даже связать с сигналами, по­
вательный порт. Эта настройка задается только
лучаемыми от другого радиомодуля. (Если вы под­
для целей отладки — мы не будем ничего под­
забыли общую процедуру выполнения настройки
соединять к последовательному порту этого ра­
радиомодуля ХВее, см. шаг 1 проекта 10).
диомодуля в окончательной версии проекта;
Центром этого проекта является радиомодуль дат­ • ATIA01 или ATIAFFFF — конфигурирует радиомо-
чика. Мы настроим его для чтения аналогового дуль настраивать свои линии ШИМ, используя
напряжения на первом аналоговом вводе (ADO, ли­ пакеты данных, получаемые от радиомодуля
ния 20) и будем передавать получаемое на этом вво­ с адресом oi (радиомодуль датчика). Если для
де значение широковещательно всем другим радио­ этого параметра задано значение f f f f , радиомо­
устройствам той же персональной сети. Настройка дуль будет конфигурировать свои линии ШИМ,
радиомодуля выполняется следующими командами: используя данные, полученные от любого радио­
• ATMY01 — задает исходный адрес радиодатчика; устройства в своей персональной сети.
• atdlffff— задает адрес назначения, как широ­ Радиомодуль модуля Arduino ожидает сообщения
ковещательный адрес; из персональной сети и отправляет полученные
сообщения через свой последовательный порт.
• ATiDiiii — задает код PAN ID;
Настройки этого радиомодуля весьма просты, так
• ATD02 — задает функционирование линии ввода/ как он выполняет самый меньший объем работы,
вывода 0 (D0) как аналогового ввода; и выполняются следующими командами:
• ATIR64 — задает частоту опроса аналогового
входа в 100 миллисекунд (0x64h); • атмуоз — задает исходный адрес радиомодуля
Arduino;
• ATIT5 — настраивает модуль на накопление пяти
опросов, прежде чем отправлять их. Таким об­ • ATDL01 — настраивает радиомодуль на отправ­
разом, передача будет осуществляться каждые ку сообщений только на радиомодуль датчика
500 миллисекунд (5 опросов хЮО миллисекунд (адрес oi). Но эта настройка, по сути, не имеет
частоты выборки = 500 миллисекунд). никакого значения, так как этот радиомодуль не
будет отправлять никаких сообщений;
Радиомодуль сигнального устройства ожидает со­
общения из персональной сети, и если какой-либо • A TiD iiii — задает код PAN ID;
радиомодуль отправит ему пакет данных, содер­ • ATiui — настраивает радиомодуль отправлять
жащий показания аналогового датчика, отфор­ все пакеты данных ввода/вывода на последо­
матированный должным образом, он установит вательный порт. Эти данные будут направлять­
первый импульс вывода ШИМ (PWM0), равным ся на подсоединенный к радиомодулю модуль
полученному значению. Иными словами, вывод Arduino.
286 Глава 7

Сброс настроек радиомодуля Схемы


Чтобы сбросить настройки радиомодуля ХВее к их фа­ Выполнив настройку всех радиомодулей, смонти­
бричным настройкам по умолчанию (что может быть
желательно, прежде чем выполнять их настройку для руем схемы для датчика, сигнального устройства
этого проекта), выполните для них команду атке\ г. и модуля Arduino. Во всех этих схемах обязатель­
но вставьте развязывающий конденсатор на любой
В табл. 7.1 приводится сводная конфигурационная стороне регулятора напряжения, так как радиомо­
информация для всех радиомодулей проекта. дули ХВее имеют без них склонность к ненадежной
работе.
Таблица 7.1. Сводная конфигурационная
информация для радиомодулей проекта
Радиомодуль Радиомодуль Радиомодуль Схема датчика
датчика сигнального модуля
устройства Arduino Для датчика газа требуется питание напряжением
(мартышки- 5 В, поэтому нам будет нужен регулятор напряже­
цымбалиста) ния 5 В для него, регулятор напряжения 3,3 В для
MY = 01 MY = 02 MY = 03 радио ХВее, а также источник питания напряжени­
ем минимум 9 В для питания схемы. Для этой цели
о

DL= FFFF DL = 01
I

ID = 1111 ID = 1111 ID = 1111 подойдет батарейка напряжением 9 В или сетевой


DO = 2 PO = 2 IU=1 адаптер питания напряжением 9-12 В. На рис. 7.5
IR = 64 IU= 1 показана принципиальная (а) и монтажная (б) схе­
IT = 5 IA = 01 мы датчика газа.
(или FFFF)
Выходное напряжение датчика газа должно быть
Обязательно сохраните настройки для каждого ра­ ниже 3,3 В при любых наиболее вероятных обстоя­
диомодуля в его памяти, выполнив в конце конфи­ тельствах в мастерской. Тем не менее протести­
гурационного процесса команду: руйте его, прежде чем подключать к радиомодулю
WR\r ХВее. Соберите схему и включите ее питание, но
не подключайте провода вывода датчика к аналого­
Выполнить настройку радиомодуля можно, задавая вому входу радиомодуля ХВее — дайте схеме пора­
по одному параметру за раз, или задав все парамет­
ботать минуту или две. Это время нужно для разо­
ры одновременно.
грева нагревательного элемента датчика. Измерьте
Например, задать параметры радиомодуля датчика напряжение между выводом датчика и «землей».
можно, выполнив следующую процедуру: Если в окружающем воздухе отсутствуют летучие
1. Введите команду+++. органические соединения (ДОС), это напряжение
должно быть около 0,1 В. Продолжая измерять на­
2. Ожидайте, пока радиомодуль не ответит ок. Затем
пряжение датчика, возьмите емкость с каким-либо
введите следующие команды:
органическим растворителем (я использовал для
ATMYl, DLFFFFXr
этой цели жидкость для дезинфицирования рук,
ATID1111, D02, IR64\r
которая содержит большой объем алкоголя) и осто­
ATIT5, WR\r
рожными движениями навейте испарения из нее на
Настройка радиомодуля сигнального устройства датчик. При этом соблюдайте осторожность, чтобы
выполняется следующими командами: самому не вдыхать эти испарения. В результате по­
ATMY2, DLl\r казания датчика должны значительно повысить­
ATID1111, Р02\г ся — вплоть до 3 В. Если напряжение активации
ATIU1, IA1, WR\r датчика превышает 3,3 В, замените сопротивление
А эти команды выполняют настройку радиомодуля утечки, чтобы это значение было в диапазоне ниже
модуля Arduino: 3,3 В даже при высокой концентрации испарений.
ATMY3, DLIXr Выставив требуемый диапазон напряжения актива­
ATID1111, IU1, WR\r ции датчика, подсоедините его вывод к аналоговой
Бессеансовые сети 287

К плюсу источника
питания 9-12 В

Рис. 7.5. Принципиальная (а) и монтажная (б) схемы подсоединения радиомодуля ХВее к датчику газа.
Здесь показан датчик газа МО-6, но это система будет работать со многими датчиками компании Нап\л/еК Однако
для других датчиков может потребоваться изменить номинал резистора 10 К, чтобы откорректировать диапазон
выходного напряжения. Чтобы вставить разъем радиомодуля ХВее в гнезда беспаечной макетной платы, из-за
разных расстояний между штырьками радиомодуля и гнездами макетной платы приходится использовать специ­
альную адаптерную плату
288 Глава 7

линии ввода радиомодуля ХВее (линия 20). Также ХВее, так что можно подавать питание на радиомо­
обязательно подсоедините линию опорного напря­ дуль от источника питания мартышки. Подсоеди­
жения радиомодуля ХВее (линия 14) к источнику ните провода от батареи к макетной плате. В слу­
напряжения 3,3 В. чае, если ваше сигнальное устройство использует
другое напряжение, обязательно модифицируйте
схему, чтобы на радиомодуль подавалось минимум
Проветрите помещение 3 В. На рис. 7.7 показана модификация внутрен­
Закончив калибрование датчика, обязательно ностей мартышки. Для подсоединения мартышки
проветрите помещение. Весьма нежелательно к макетной плате схемы я использовал старый теле­
отравиться в процессе изготовления датчика вы­ фонный шнур.
явления отравляющих веществ.
V У Схема сигнального устройства преобразовывает
полученный по радио переменный сигнал в управ­
Чтобы убедиться, что радиомодуль ХВее правиль­
ляющий сигнал включения/выключения. Вывод
но снимает показания датчика, подсоедините его
ШИМ радиомодуля ХВее управляет базой тран­
линию передачи (ТХ) к линии ТХ адаптера Ш В /
зистора Т1Р120 ( см. рис. 7.6, а). Этот транзистор,
ХВее-8епа1, линию приема (ЮС) — к линии ЛХ
в свою очередь, управляет встроенным в мартыш­
адаптера, а также соедините их линии «земли». При
ку двигателем. Высокий сигнал на базе транзисто­
выполнении этой операции обязательно удалите ра­
ра включает двигатель, а низкий — выключает. Но
диомодуль ХВее из разъема — здесь мы используем
двигатель обладает физической инерцией, поэто­
только адаптер. Вставьте адаптер в разъем компью­
му в случае короткого импульса и длинной паузы
тера и установите последовательное соединение с
между импульсами двигатель включаться не станет.
ним. Введите команду:
Однако при достаточно высоком отношении протя­
+++ женности импульса к протяженности паузы двига­
тель вращаться начнет.
и дождитесь ответа ок. Затем выполните команду:
АТ1Э\г Г ~ 7 ------------------------------------------- N
Эта команда заставляет радиомодуль ХВее считы­
ш ж Регулятор напряжения 3,3 В И>1117-33\/
вать аналоговые вводы и возвращать их значения. Во многих проектах этой главы использует­
Радиомодуль должен ответить сообщением, напо­ ся регулятор напряжения 3,3 В Ы)1117-ЗЗУ.
добие следующего: Распиновка этого регулятора отличается от рас­
пиновки других регуляторов, рекомендуемых
1 в этой книге. Поэтому сверьтесь со справочным
200
листком технических данных для используемого
ЗРГ
вами регулятора, чтобы убедиться в правильном
На данном этапе неважно, какие эти значения, важ­ подсоединении его выводов. Выполнение такой
но — что мы вообще получаем что-либо. Реальные проверки следует сделать привычкой — в про­
значения мы увидим позже, по мере разработки тивном случае существует возможность непра­
проекта. вильного монтажа и повреждения как регулято­
ра напряжения, так и других частей питаемой
Схема сигнального устройства ^им схемы._________________________________^
Для управления сигнальным устройством — мар­
тышки с ударными тарелками в нашем варианте, Для проверки работы этой схемы убедитесь, что
отключите двигатель мартышки от его выключателя радиомодуль датчика работает, и включите схему.
и подключите его к схеме, показанной на рис. 7.6. При низком значении датчика двигатель должен
быть выключен, а когда датчик покажет высокую
Батарея питания мартышки выдает 3 вольта напря­ концентрацию ЛОС, двигатель должен включиться,
жения, что достаточно для питания радиомодуля и мартышка начать бить в тарелки, предупреждая
Бессеансовые сети 289

д Радиомодуль ХВее

Рис. 7.6. Принципиальная (а) и монтажная (б) схемы подсоединения сигнального устройства
(мартышки с ударными тарелками) к радиомодулю ХВее

вас об этом. Настройте пороговое значение активи­ Когда воздух вокруг датчика очистится от вредных
рования двигателя с помощью настроечного потен­ испарений, двигатель должен остановиться. Если вы
циометра. Сначала установите высокое сопротив­ не уверены, что схема двигателя работает должным
ление потенциометра, а затем медленно понижайте образом, вместо двигателя подсоедините светодиод
его, пока двигатель не выключится. В этой точке последовательно с сопротивлением 220 Ом между
подвергните датчик воздействию испарений рас­ +3 В и коллектором транзистора. Светодиод дол­
творителя, что должно снова запустить двигатель. жен светиться более ярко при высоких показаниях
290 Глава 7

Рис. 7.7. Внутренности мартышки, с показанными изменениями подсоединения проводов двигателя:


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

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

Схема модуля Arduino Когда модуль Arduino получает сообщение от


Если вы используете шилд беспроводной связи радиомодуля ХВее, он извлекает из него значение
Arduino, тогда все, что вам нужно сделать для наше­ показаний датчика и преобразовывает его в значе­
го проекта, — это установить его на шилд Ethernet ние напряжения. Модуль Arduino функционирует
или плату Arduino Ethernet, а затем установить по­ как веб-сервер, что позволяет любому проверить
лученный сандвич на плату микроконтроллера. уровень показаний датчика по Интернету. Но для
Если же вы собираете эту схему самостоятельно, то этого задачу следует разбить на две составляющие:
ее принципиальная (а) и монтажная (б) версии по­ сначала нужно удостовериться в том, что мы можем
казаны на рис. 7.8. получать сообщения от радиомодуля ХВее и извле­
кать из них необходимые данные. Когда эта задача
Схема Arduino Ethernet с радиомодулем ХВее во будет успешно выполнена, к этому коду мы доба­
многом схожа со схемой, которую мы создавали вим код составляющей веб-сервера.
для дуплексной радиосвязи в главе 6. Единственное
Бессеансовые сети 291

Reset GND
+3 3V CLK
+5V MOSI
Gnd Шилд Ethernet M|SQ

Gnd Eth, SS
Vin
SD card SS

AREF
Reset GND
+3 3V D13
+5V D12
Gnd D11/PWM
Gnd D10/PWM
Vin D9/PWM К +5 В
D8 Регулятор напряжения
LD1117-33V 3,3 В
Модуль Arduino In - Входящее
D7 Out
Out - Выходящее
D6/PWM 1
Analogo D5/PWM JT
10 мкФ 1 мкФ Радиомодуль
A1 D4 ХВее
A2 D3/PWM
A3 D2
Vcc
\
ADO/DIOO
A4 Digital1/TX
A5 DigitalO/RX TX AD1 /DI01
RX AD2 / DI02
D08 AD3 / DI03
RESET RTS/AD6/DI06 Л\ 220 Ом
PWMO/RSSI Asst /AD5 /DI05
- ф - Л /W ]
PWM1 Vref Л Х\ \ 22U Ом
220 им ' '----------- 1
NC SLP
- 0 - w v _]_
DTR/DI8 CTS /DI07
GND AD4 /DI04

Рис. 7.8. Подсоединение радиомодуля ХВее к модулю Arduino с шилдом Ethernet


292 Глава 7

Чтение протокола ХВее


До сих пор мы могли просто полагаться на способ­ • байт 8 — широковещательные опции (не при­
ность радиомодулей ХВее самостоятельно выпол­ меняются в данном случае);
нять свою работу, и нам не было ни какой надоб­ • байт 9 — количество выборок в пакете (мы за­
ности разбираться в их протоколе связи. Но для дали этому параметру значение 5 с помощью
этого проекта нам нужно знать, как интерпретиро­ команды IT ранее);
вать этот протокол. Итак, перед тем как передавать
• байты 10-11 — каналы ввода/вывода, исполь­
данные, получаемые со своих аналого-цифровых
зуемые в настоящее время. В данном примере
преобразователей, радиомодули ХВее формируют
предполагается только один аналоговый ка­
из них пакет. Формат этого пакета описан в руко­
нал — линия AD0 и не используются никакие
водстве пользователя радиомодулей ХВее 802.15.4
цифровые каналы;
компании Digi. Выглядит он следующим образом:
• байты 12-21 — 10-битные значения, представ­
• байт 1: 0х 7е — значение стартового байта; ляющие собой выборку АЦП от отправителя.
• байты 2-3 — размер пакета (двухбайтное зна­ Каждая 10-битная выборка демонстрирует на­
чение). Параметр зависит от других настроек пряжение в диапазоне от 0 В до максималь­
радиомодуля; ного напряжения ХВее 3,3 В. При этом, зна­
• байт 4 — значение идентификатора API (код, чение о означает 0 вольт, а Ю 2 3 — 3,3 вольта.
определяющий ответ); Соответственно, каждый пункт значения датчи­
ка равен 3,3/1024 или 0,003 вольта.
• байты 5-6 — адрес отправляющего радиомоду­
ля ХВее; Поскольку каждый пакет начинается с постоянной
• байт 7 — индикатор уровня принятого сигнала величины : 0х 7е (десятеричное значение 126), раз­
(ИУПС, RSSI)2; борку пакета и извлечение из него данных можно
начинать с поиска этого значения.
2 RSSI, Received Signal Strength Indicator — RSSI.

Ш Читаем пакет
Считыватель сообщений ХВее
Следующий скетч считывает и Контекст: Arduino
помещает в массив байты, пока */
не будет встречено значение
0х 7е .Тогда скетч начинает иссле­ const int packetLength =22; // Длина сообщений ХВее будет 22 байта,
довать содержимое массива, что­ int dataPacket[packetLength]; // Массив для хранения данных ХВее
бы найти в нем значение показа­ int byteCounter =0; // Счетчик байтов, полученных от ХВее
ний датчика. Нам, прежде всего,
нужна переменная для длины void setup()
сообщения (или пакета), массив {
и счетчик, чтобы знать, в каком // Запускаем последовательную связь:
элементе массива мы находимся. Serial.begin(9600);
Затем нам нужно организовать }
последовательную связь:

Ш Главный цикл в этом скет­ void loop()


{
че ничего особенно не дела­
// Ожидаем данные, входящие по последовательному каналу:
ет — он просто вызывает метод
if (Serial.available() > 0) {
11зЬепТоЗег1а1 (), который пр0Х0-
listenToSerial ();
дит по байтам массива и выпол­
няет всю работу:


Бессеансовые сети 293

Щ Для начала мы просто счи- ) void listenToSerial() {


тываем байты и высматриваем | // Считываем входящий байт:
среди них байт со значением | int inByte = Serial.read();

0х 7е . Обнаружив такой байт, вы- \ // Новый пакет начинается байтом со значением 0х7Е:
if (inByte == 0х7Е ) {
водим символ перевода строки. \
Serial.println ();
Несмотря ни на что, выводим |
значения байтов, разделенные ) }
// Выводим байты на экран:
пробелами: I
Serial.print(inByte, DEC);
]j Serial.print(" ");
s
Используем последовательное подключение
В этой схеме мы не подсоединяем линию передачи (TX) модуля Arduino
к линии приема (RX) радиомодуля ХВее. Это позволяет нам использовать
последовательное подключение как для приема от ХВее, так и для передачи
отладочной информации в монитор порта.

Ш Исполнение этого скетча 201 1 201. 1 :200 :


1 197 91
должно вывести на экран текст , 126 0 18 131 0 1 43 0 5 2 0 1 197 1 196 1 198 1 198 1 197 106
наподобие следующего: 126 0 18 131 0 1 43 0 5 2 0 1 197 1 193 1 193 1 192 1 192 125
126 0 18 131 0 1 44 0 5 2 0 1 194 1 194 1 193 1 190 1 190 130
Каждая строка этого вывода на­ 126 0 18 131 0 1 43 0 5 2 0 1 189 1 189 1 191 1 190 1 190 143
чинается со значения 126 (0х 7е и ) 126 0 18 131 0 1 43 0 5 2 0 1 190 1 186 1 186 1 186 1 188 156
и представляет отдельное сооб­ 126 0 18 131 0 1 43 0 5 2 0 1 187 1 187 1 186 1 183 1 183 166
щение радиомодуля ХВее. Боль­ 126 0 18 131 0 1 43 0 5 2 0 1 182 1 182 1 184 1 183 1 183 178
шинство строк содержат 22 бай­ 126 0 18 131 0 1 43 0 5 2 0 1 181 1 180 1 179 1 179 1 182 191
та, соответствуя описанному ра­ 126 0 18 131 0 1 43 0 5 2 0 1 181 1 181 1 180 1 178 1 177 195
нее формату пакета. Вы можете : 126
спросить, почему первая строка
вывода не содержит такое коли­
чество байтов и не начинается
со значения 126 ? Причина этого
проста — неизвестно, какой байт
радиомодуль ХВее посылает,
когда модуль Arduino начинает
ожидать поступления данных.
Впрочем, никаких проблем тут
не возникнет, так как следующий
код отфильтровывает неполные
пакеты.

И Усовершенствуем код void listenToSerial() {


// Считываем входящий байт:
Для обработки полученных па­
int inByte = Serial.read();
кетов было бы очень удобно,
// Новый пакет начинается байтом со значением 0х7Е:
чтобы каждый пакет сохранялся
if (inByte == 0х7Е ) {
в отдельном массиве. С учетом
// Выполняем разборку последнего пакета и извлекаем показание:
такого пожелания и будут ис­
int thisReading = parseData();
пользоваться объявленные ранее
// Выводим показание на экран:
глобальные переменные.
Serial, println (thisReading);
294 Глава 7

ЙПсГ этой целью изменяем ме­ // Очищаем массив данных


тод listenToSerial (), добавив for (int fhisByte = 0; thisByte < packetLength; thisByte++) {
в него код для разборки масси­ dataPacket[thisByte] = 0;
ва dataPacket, затем очищаем }
массив, чтобы подготовить его // Выполняем сброс счетчика входящих байтов:
для получения новых данных. byteCounter = 0;
Замените все содержимое в опе­
}
раторе и первоначального мето­
// Если значения счетчика байтов меньше, чем длина пакета,
да кодом, выделенным жирным
// добавляем этот байт в массив байтов:
шрифтом, и уберите из него стро­
if (byteCounter < packetLength) {
ки, которые выводили на экран
dataPacket [byteCounter ] = inByte;
байт и пробел.
// Увеличиваем значение счетчика байтов:
Следующая функция вызывает byteCounter++;
функцию parseData (), которая из­
влекает значения показаний дат­
чика из байтов 12 по 21 пакета и
вычисляет их среднее значение:

СЗ Разбираем пакет int parseData() {


int adcStart = 1 1 ; // Считывание АЦП начинается с байта 12
Следующая функция проходит int numSamples = dataPacket[8]; // Количество выборок
по каждому полному пакету со­ / / в пакете
общения побайтно, собирая тре­ int total = 0 ; // Сумма всех показаний АЦП
буемые значения из разных бай­
тов. Завершив работу, она воз­ // Считываем адрес. Это двухбайтное значение, поэтому
вращает среднее значение пяти // складываем два байта таким образом:
int address = dataPacket[5] + dataPacket[4] * 256;
выборок пакета:
// Считываем 10-битные аналоговые значения <numSamples>
/ / п о два за раз, так как длина каждого показания составляет
// два байта:
for (int thisByte = 0; thisByte < numSamples * 2;
thisByte=thisByte+2) {
// 10-битное значение = старший байт * 256 + младший байт:
int thisSample = (dataPacket[thisByte + adcStart] * 256) +
dataPacket[(thisByte +1 ) + adcStart];
// Добавляем результат к сумме для дальнейшего вычисления
// среднего значения:
total = total + thisSample;

// Вычисляем среднее значение результата:


int average = total / numSamples;
return average;

При исполнении этого скетча мы должны чтобы определить причину проблемы. Возможность
получать значения в диапазоне от о до Ю23 увидеть каждый получаемый в действительности
при каждом получении сообщения от радиомодуля байт, прежде чем выполнять какие-либо операции
ХВее датчика. Убедитесь в получении качественных с этими байтами, будет самым лучшим подходом к
значений, прежде чем продолжать дальше. Если по­ решению этой проблемы. Следует рассмотреть сле­
лучаемые значения не отвечают требуемым харак­ дующие наиболее распространенные возможные
теристикам, воспользуйтесь первой версией скетча, причины:
которая выводит на экран значение каждого байта,
Бессеансовые сети 295

• получаем ли мы какие-либо данные вообще?


Если нет, передает ли данные радиомодуль ХВее
датчика?
• настроены ли все радиомодули должным обра­
зом? Подключите каждый из них через адаптер
USB/XBee-Serial и проверьте в приложении по­
следовательной связи;
• достаточна ли мощность источника питания
принимающего радиомодуля? Проверьте на­
пряжение питания принимающего радиомодуля
ХВее между линиями 1 и 10. Если у вас старая
версия Arduino, и вы используете вывод питания Рис. 7.9. В процессе диагностирования проблем
напряжением 3,3 В без регулятора напряжения, с приемом данных неплохо пометить радиомодули
возможно, радиомодуль не получает питания ХВее, чтобы можно было различать их визуально,
достаточной мощности. Версии Arduino, пред­ а не проверяя каждый раз их конфигурацию
шествующие версии Uno, не выдают достаточно с помощью программы последовательной связи
тока на выводе питания напряжением 3,3 В.

Рекомендую также последовать показанному на


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

Ш Добавляем сервер // Включаем библиотеки SPI и Ethernet


#include <SPI.h>
Теперь, когда мы можем правиль­ #include <Ethemet.h>
но читать сообщения радиомоду­
ля ХВее, в скетч можно добавить // Инициализируем экземпляр сервера:
код для функциональности веб­ Server server(80);
сервера. Остальная часть этого
скетча во многом подобна скетчу // МАС-адрес и IP-адрес сервера.
сервера RGB из главы 4. // Вместо выделенных подчеркнутым шрифтом значений укажите
// значения для вашего устройства.
byte шас[] = {0x00, ОхАА, ОхВВ, ОхСС, ОхРЕ, 0x01 };
Сначала включаем библиотеки
IPAddress i p (192,168,1,20);
Ethernet и SPI и добавляем не­
сколько глобальных перемен­ // Входящий запрос НТТР от клиента
String requestLine =
ных в верхней части скетча для
управления ими. Добавленный const int packetLength = 22; // Длина сообщений ХВее будет
код выделен жирным шрифтом: / / 2 2 байта.
int dataPacket[packetLength]; // Массив для хранения данных ХВее
int byteCounter = 0; // Счетчик байтов, полученных
/ / о т ХВее

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


const int averagelnterval = 10 * 1000; // Время в секундах между
// средними значениями ^
296 Глава 7

т long sensorTotal = 0; // Применяется для получения


// средних значений показаний датчика
float averageVoltage =0.0; // Среднее значение в вольтах
long lastAverageTime = 0 ; // Время вычисления последнего
// среднего значения
int readingCount = 0 ; // Количество считываний после
// последнего среднего значения

Ш В главный цикл добавляем void loop () {


код для ожидания новых клиен­
// Ожидаем данные, входящие по последовательному каналу:
тов и их обработки, а также и для
if (Serial.available() > 0 ) {
вычисления среднего значения listenToSerial();
из входящих пакетов ХВее каж­
дые 10 секунд. Добавленный код
// Ждем подключений от клиентов
выделен жирным шрифтом:
Client client = server.available();
if (client) {
listenToClient(client);
}
// Вычисляем среднее значение показаний после
// <averagelnterval> секунд
long now = millis();
if (now - lastAverageTime > averagelnterval) {
averageVoltage = getAverageReading();
Serial.println(averageVoltage);
}

ш Так же, как мы ранее добави­ // Этот метод ожидает запросы от клиента HTTP:
void listenToClient ( Client thisClient) {
ли метод для ожидания данных
while (thisClient.connected()) {
с последовательного канала свя­ if (thisClient.available()) {
зи, добавляем метод для ожида­ // Считываем байт:
ния входящих запросов НТТР от char thisChar = thisClient.read();
клиентов. Этот метод считывает // Для любого другого символа увеличиваем длину строки:
requestLine = requestLine + thisChar;
байты и сохраняет их в строку,
// Полученные перевод строки и пустая линия запроса
пока не встретится байт символа // означают конец запроса:
перевода строки. Метод не вы­ if (thisChar == '\n' && requestLine.length() < 2) {
полняет разборку строк, а только // Отправляем ответ HTTP:
ищет символы перевода строки makeResponse(thisClient);
break;
или возврата каретки. Когда ему
}
встречается два символа перево­ // Перевод строки или возврат каретки означает,
да строки подряд, метод знает, // что мы в конце строки:
что они означают конец запроса if (thisChar == '\n' || thisChar == '\r’) {
// Очищаем последнюю строку:
НТТР, и отвечает на него, вызы-
requestLine =
вая процедуру makeResponse ()!

// Даем браузеру время, чтобы получить данные:


delay(1);
// Закрываем подключение:
thisClient.stop ();
} »
Бессеансовые сети 297

Ш Метод makeResponse () ПО- void makeResponse(Client thisClient) {


// Считываем текущее среднее напряжение:
сылает заголовок HTTP и ответ
float thisVoltage = getAverageReading();
HTML клиенту, а затем закрыва­
ет подключение. Он также вызы­ // Выводим на экран заголовок HTTP:
вает метод getAverageReading(), thisClient.print(«НТТР/1.1 200 ОК\п»);
который берет среднее значение thisClient .print («Content-Type: text/html\n\n>>) ;
всех сообщений за последние // Выводим на экран документ HTML:
10 секунд и преобразовывает его thisClient .print («<htmlxhead><meta http-equiv=\»refresh\»
content=\»3\»>»);
в напряжение: thisClient.println("</head>");
// Если показание действительно, выводим его на экран:
if (thisVoltage >0.0) {
thisClient.print(«<hl>reading = «);
thisClient.print(thisVoltage);
thisClient.print(« volts</hl>»);
} // Если показание недействительно, сообщаем об этом:
else {
thisClient.print("<hl>HeT показаний</1й>");
}
thisClient.println(«</html>\n\n»);
}
ш Метод getAverageReading () float getAverageReading () {
вызывается каждые 10 секунд в int thisAverage = sensorTotal / readingCount;
// Преобразовываем в напряжение:
основном цикле, а также каждый
float voltage = 3.3 * (thisAverage / 1024.0);
раз, когда клиент присылает за­ // Сбрасываем счет показаний и сумм для следующего раза:
прос. Он берет показания из не­ readingCount = 0;
скольких сообщений ХВее и вы­ sensorTotal = 0;
числяет их среднее значение: // Сохраняем время вычисления данного среднего:
lastAverageTime = millisO;
// Возвращаем результат:
return voltage;
}

Вот и весь скетч. Загрузите его в модуль Arduino,


а затем откройте адрес Arduino, как показано на
рис. 7.10.

Теперь, когда вы работаете в своей мастерской,


у членов вашей семьи или ваших друзей есть два
способа узнать, когда воздух в мастерской станет
слишком опасным для дыхания: они услышат, что
reading = 032 volts
мартышка начнет бить в тарелки, или же посмотрят
показания качества воздуха на веб-сайте.

Примечание
Приведенный здесь код в действительности не сопо­
ставляет выходное напряжение концентрации испа­
i__________________________________ ________л
рений. Чтобы осуществить такой расчет, вам нужно
следовать инструкциям и спецификации технических Р и с 7.10. Результаты работы веб-сервера для датчика
характеристик для используемого вами датчика. газа
298 Глава 7

Все, что происходит в подсети, в подсети и остается


Вы, наверное, задаете себе вопрос: «Это все пре­ а не широковещательных сообщений. Так, видео-
красно, но как так получается, что все эти сообщения и аудиопередачи в Интернете обычно выполняются
не рассылаются благодаря протоколу 1ЮР по всему направленными потоками 1ЮР. Для этого клиент
Интернету? Разве это не основанный на сообще­ сначала подает серверу запрос НТТР или другой
ниях протокол, параллельный протоколу на основе подобный запрос по протоколу ТСР. Сервер указы­
сообщений радиомодулей ХВее?» Действительно, вает клиенту открыть порт для получения сообще­
это такой протокол. И следует проявлять осторож­ ний, клиент открывает указанный порт, и сервер на­
ность, используя протокол 1Л)Р за пределами сво­ чинает посылать поток сообщений СЮР. Это более
ей собственной подсети. Если бы мы посылали деликатное применение протокола 1ГОР в широком
широковещательные сообщения за пределы своей сегменте Интернета.
подсети на весь остальной Интернет, мы бы наво­
днили всю сеть ненужным трафиком. Хотя прото­ В следующем проекте мы будем посылать по про­
кол 1ЮР и другие протоколы на основе сообщений токолу 1ЮР сообщения, направленные от одного
и действуют за пределами частных подсетей в более устройства другому, а также посылать направлен­
широком сегменте Интернета, по большому сче­ ные сообщения радиомодулей ХВее.
ту они используются для рассылки направленных,

&&Направленные сообщения
Более распространенный способ использования протоколов, не устанавливающих соедине­
ние, — это посылать направленные сообщения конкретному объекту. Такой подход мы уже
применяли в главе 6, когда программировали микроконтроллеры на взаимодействие друг с
другом через радиомодули ХВее. В том проекте каждый радиомодуль имел исходный (свой)
адрес (который можно установить и узнать с помощью команды а т м у ) и адрес радиомодуля
назначения (который можно установить и узнать с помощью команды атоь). При этом адрес
назначения одного радиомодуля являлся исходным адресом другого, и наоборот. Хотя в том
примере были задействованы всего два радиомодуля, можно было использовать большее их
число и решать, какому из них передавать сообщения, изменяя адрес назначения в процессе
работы.

Передача направленных дейтаграмм UDP


В примере, приведенном в начале этой главы, мы вы можете попробовать выполнить эксперимент со
обменивались дейтаграммами UDP между програм­ скетчем Processing, приведенным далее. Это скетч
мой Processing и модулем Arduino. Скетч Processing для передачи широковещательных сообщений, рас­
посылал широковещательный пакет, а модуль ширенный для передачи также и направленных
Arduino в ответ посылал направленное сообщение, сообщений. Попробуйте выполнить его на всех
извлекая адрес назначения из полученного пакета. подключенных к сети Ethernet модулях Arduino,
При условии, что мы знаем адрес, по которому нуж­ используя ранее приведенный скетч для Arduino
но отправить дейтаграмму, направленная связь не «Ответчик на запросы UDP». На ввод буквы а в окно
представляет ничего сложного. консоли ответят все принимающие устройства, но
Если у вас есть несколько устройств, подключен­ на ввод буквы ь или с ответит только устройство
ных к сети Ethernet (не считая вашего компьютера), с соответствующим адресом.
Бессеансовые сети 299

Ш Отправка сообщения *

Отправитель/получатель широковещательного или направленного


Этот скетч совместно со скетчем запроса UDP
для Arduino «Ответчик на за­ Контекст:Processing
просы UDP» является хорошим */
средством тестирования работо­
// Импортируем библиотеку UDP:
способности всех ваших сетевых import hypermedia.net.*;
устройств. Имеет смысл удосто­
вериться в работоспособности UDP udp; // Инициализируем объект UDP:
сетевых подключений с помощью
простого инструмента, наподо­ void setup() {
бие этого, прежде чем выполнять udp = new U D P ( this, 43770 ); // Открываем порт UDP:
udp.listen( true ); // Ожидаем входящие сообщения:
более сложные скетчи:
}

void draw ()
{

void keyPressed() {
int port = 43770; // Порт назначения
String message = ", Я разговариваю с ТОБОЙ!"; // Отправляемое
// сообщение
String ip = "255.255.255.255"; // IP-адрес назначения

// Отправляем сообщения на разные адреса,


// в зависимости от нажатой клавиши:
switch (key) {
case 'а': // Широковещательное сообщение
message = "Всем! Всем! Всем!\п";
break;
case 'b': // Направленное сообщение
// Выделенный жирным шрифтом адрес нужно изменить на ваш адрес,
ip = "192.168.1.20»; // IP-адрес назначения
message = ip + message; // Отправляемое сообщение
break;
case 'с ': // Направленное сообщение
// Выделенный жирным шрифтом адрес нужно изменить на ваш адрес,
ip = «192.168.1.30»; // IP-адрес назначения
message = ip + message; // Отправляемое сообщение
break;
}

// Отправляем сообщение на выбранный адрес:


udp.send(message, ip, port );

void receive( byte[] data ) {


// Выводим на экран входящие байты данных, как символы ASCII:
for(int thisChar=0; thisChar < data.length; thisChar+t) {
print(char(data[thisChar]));
}
println();
}
300 Глава 7

х Проект 14
Беспроводная ретрансляция данных солнечной панели
В этом проекте мы будем ретранслировать данные от солнечной панели через два радиомо­
дуля ХВее и модуль Arduino в скетч Processing, который выведет полученные данные в виде
графика. Этот проект в части оборудования похож на предшествующий, но вместо передачи
широковещательных сообщений мы будем ретранслировать данные от первого узла второму,
а от него — третьему с помощью направленных сообщений. Соответственно, модуль Arduino
отправляет сообщения программе Processing с помощью направленных дейтаграмм UDP.

В основу нашего проекта положена разработ­ узнать, сколько полезной энергии панель получа­
ка Гил ада Дотана (Gilad Lotan) и Анжелы Пабло ет ежедневно. Поскольку панель использовалась
(Angela Pablo) (рис. 7.11 и 7.17), бывших студентов для зарядки 12-вольтового аккумулятора, она была
программы интерактивных коммуникаций универ­ полезна только тогда, когда выдавала напряжение
ситета Нью-Йорка. Офис программы находится на свыше 12 вольт. Чтобы отслеживать выдаваемое
четвертом этаже 12-этажного здания в Манхэттене панелью напряжение, находясь на четвертом эта­
и работает с 80-ваттной солнечной панелью, рас­ же, Гилад и Анжела (по совету третьего студен­
положенной на крыше здания. Студенты хотели та, Роберта Фалуди, позже написавшего книгу

а Рис. 7.11. Студенты программы интерактивных коммуникаций Гилад Лотан и Анжела


Пабло проводят эксперимент с батареей солнечной панели и радиомодулем ХВее для
ее мониторинга

► ► Рис. 7.12. Блок-схема сети для проекта солнечной панели


Бессеансовые сети 301

по радиомодулям ХВее «Building Wireless Sensor


Networks» (издательство O'Reilly)) использовали
три радиомодуля ХВее, которые ретранслировали
Ячеистые сети
сигнал с крыши по лестничному колодцу здания на Радио ХВее можно настроить для работы
четвертый этаж. А уже оттуда данные передавались в ячеистой сети, используя протокол ZigBee.
процессором Ethernet по локальной сети в базу дан­ В ячеистой сети некоторые радиомодули функ­
ных SQL. ционируют как маршрутизаторы, подобно тому,
В нашем примере задействована солнечная панель как работает радиомодуль ретранслятора в этом
меньшего размера, а получаемые данные вместо проекте. Маршрутизаторы могут не только ре­
сохранения в базе данных SQL выводятся про­ транслировать сообщения, но также сохранять
граммой Processing в виде графика. Кроме того, эти сообщения, когда концевые узлы не рабо­
в проекте используются три радиомодуля: один тают, и передавать их, когда узлы включаются.
подключен к солнечной панели, другой служит Это позволяет получить общую экономию энер­
в качестве ретранслятора, а третий подключен гии по всей сети, так как конечные узлы могут
к модулю Arduino. На рис. 7.12 показана блок-схема быть выключены большую часть времени. Но
организации такой сети. для этого нужны другие радиомодули: ХВее
ZigBee или OEM модули ХВее-PRO ZigBee
компании Digi. Подробную информацию об ис­
Настройки радио пользовании этих радиомодулей можно найти
в книге Роберта Фалуди «Building Wireless
Настройки радиомодулей в этом проекте подобны Sensor Networks» (издательство O'Reilly).
настройкам радиомодулей из предыдущего про­
екта, с единственной разницей — в адресах назна­
чения. На этот раз мы не будем применять широ­
ковещательный адрес. Вместо него радиомодуль Далее приводятся команды для задания этих
солнечной панели (адрес = i) будет передавать со­ настроек:
общения радиомодулю ретранслятора (адрес = 2),
который передаст полученные сообщения радиомо­ • для радио солнечной панели:
дулю Arduino (адрес = з). Вместо широковещатель­ ATMYl, DL02\r
ной сети эти радиомодули организованы цепочкой, ATID1111, D02, IR64\r
что удлиняет расстояние передачи сообщения. ATTT5, WR\r
Настройки этих радиомодулей указаны в табл. 7.2.
• для радио ретранслятора:
Таблица 7.2. Настройки радиомодулей сети ATMY2, DL03, ID1111, WR\r
солнечной батареи • и для радио модуля Arduino:
Радиомодуль Радиомодуль Радиомодуль ATMY3, DL01, ID1111, WR\r
датчика ретрансля­ модуля
тора Arduino Схемы
MY = 01 MY = 02 MY = 03 Питание для схемы солнечной панели поставляет­
ся самой панелью, так как она может генерировать
о
m

О
Q

DL = 02
II

II

достаточное напряжение и ток для питания радио­


ID = 1111 ID = 1111 ID = 1111 модуля. Регулятор напряжения LD1117-33V может
принимать на входе до 15 вольт, а панель выдает
DO = 2
максимум 12 вольт, так что здесь мы в безопасно­
IR= 0x64 сти. Интегральная схема МАХ8212 представляет
собой управляемый напряжением триггер. Когда
IT = 5
входное напряжение на триггерном вводе схемы
302 Глава 7

превышает уровень, установленный сопротивлени­ радиомодуля ХВее, создают делитель напряжения,


ями схемы, уровень на выходной линии сменяется который понижает напряжение из солнечной пане­
с высокого на низкий. Это активирует транзистор ли до пределов области 3,3 вольта, используемых
2N3906, который открывает путь току от солнечной для питания аналого-цифрового преобразовате­
панели для питания радиомодуля. Когда солнечная ля (АЦП) радиомодуля. Конденсаторы емкостью
панель генерирует недостаточно высокое напряже­ 4700 мкФ сохраняют заряд от солнечной панели
ние, радио просто выключается. Это не представ­ наподобие батарей, обеспечивая постоянное пита­
ляет никакой проблемы, поскольку если панель ние радиомодуля. На рис. 7.13 показана принципи­
затемнена, то и нет ничего стоящего для передачи. альная (а) и монтажная (б) схемы подсоединения
Два сопротивления, подсоединенные к линии ado радиомодуля к солнечной панели.

Солнечная Рис. 7.13. Схема


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

\
б
Бессеансовые сети 303

Требуемые компоненты

►Адаптер USB/XBee-Serial, 1 шт. ►
►Регулятор напряжения 3,3 В, 1 шт.

►Конденсатор 1 мкФ, 1 шт.
Схема для солнечной панели

►Конденсатор 10 мкФ, 1 шт.

►Беспаечная макетная плата, 1 шт.

►Адаптерная плата для ХВее, 1 шт.

►Радиомодуль ХВее компании Digi, 1 шт.

►Штыревой соединитель, 2 шт.

►Регулятор напряжения 3,3 В, 1 шт.

►Гнездовой разъем, 2 шт.

►Адаптерная плата для ХВее, 1 шт.

►Светодиод, 2 шт.

►Штыревой соединитель, 2 шт.

►Сопротивление 220 Ом, 2 шт.

►Гнездовой разъем, 2 шт.

►Конденсатор 1 мкФ, 1 шт. Схема ретранслятора

►Конденсатор 10 мкФ, 1 шт. ►
►Радиомодуль ХВее компании Digi, 1 шт.

►Электролитический конденсатор 4700 мкФ, ►
►Разъем для батарейки «Крона» 9 В, 1 шт.
3 шт. ►
►Батарейка «Крона» 9 В, 1 шт.

►Монитор напряжения МАХ8212, 1 шт.
Эта схема — всего лишь сам радиомодуль ХВее, пи­

►Сопротивление 10 К, 1 шт. таемый от батарейки. Если вы предпочитаете иное,

►Сопротивление 100 К, 3 шт. вместо любой из трех перечисленных далее опций
можно использовать адаптер USB/XBee-Serial. При

►Сопротивление 4,7 К, 1 шт. этом вам не понадобится ничего, кроме радиомоду­
ля ХВее, батарейки и отрезка монтажного провода,

►Сопротивление 1 К, 1 шт. чтобы соединить линию ТХ с линией RX.

►Транзистор NPN 2N3906, 1 шт.
Опция 1:

►Светодиод, 2 шт.

►Сопротивление 220 Ом, 3 шт. ►
►Адаптерная плата ХВее Explorer Regulated,
1 шт.

►Солнечная панель, 1 шт.
Опция 2:
Схема подсоединения радиомодуля ХВее
к модулю Arduino ►
►ХВее LilyPad, 1 шт.

|| Схема подключения радиомодуля ХВее к модулю Опция 3:


11 Arduino такая же, как и для предыдущего проекта.

►Беспаечная макетная плата, 1 шт.

►Модуль микроконтроллера Arduino, 1 шт. ►
►Регулятор напряжения 3,3 В, 1 шт.

►Плата Arduino Ethernet, 1 шт. ►
►Адаптерная плата для ХВее, 1 шт.

►Радиомодуль ХВее компании Digi, 1 шт. ►
►Штыревой соединитель, 2 шт.

►Шилд беспроводной связи Arduino, 1 шт. ►
►Гнездовой разъем, 2 шт.
Если используется этот компонент, перечис­ ►
►Светодиод, 2 шт.
ленные далее детали не требуются. Все они
служат для подключения радиомодуля ХВее ►
►Сопротивление 220 Ом, 2 шт.
к плате Arduino. ►
►Конденсатор, 10 мкФ, 1 шт.

►Беспаечная макетная плата, 1 шт. ►
►Конденсатор, 100 мкФ, 1 шт.
304 Глава 7

Схема ретранслятора очень простая. Это всего Вместо макетной платы можно также использовать
лишь радиомодуль с батарейкой, с соединенными адаптеры LilyPad ХВее (рис. 7.15), ХВее Explorer
линиями передачи (ТХ) и приема (ЮС). Переброс Regulated или любой другой адаптер USB/XBee-
линии приема на линию передачи позволяет радио­ Serial. Все, что нужно будет сделать с любым из
модулю ретранслировать принимаемые сообщения. этих адаптеров, это соединить вместе линии приема
Все входящие сообщения отправляются на линию и передачи и подключить питание к регулятору.
передачи, а затем обратно на линию приема, отку­
Настроив и запустив в работу радиомодули, теперь
да они снова будут переданы. На рис. 7.14 показана
нужно запрограммировать модуль Arduino на счи­
принципиальная (а) и монтажная (б) схемы ретран­
тывание входящих пакетов ХВее и передачу их в
слятора.
Processing. Для этого мы воспользуемся направлен­
ными дейтаграммами UDP.
Батарейка 9 В

44 Рис. 7.14. Принципиальная (а) и монтажная (6)


схемы радиоретранслятора ХВее

Радиомодуль
Регулятор ХВее
напряжения 3,3 В
LM7833 ж Рис. 7.15. Схема, альтернативная схеме
In Out радиоретранслятора на макетной плате:
ADO / DIOO адаптер ХВее 1_ПуРаб с соединенными линиями

10 МКФ
т
1 мкФ
ТХ

RX
AD1 / DI01

AD2 / DI02
приема и передачи

D 08 AD3 / DI03

RESET RTS/AD 6/D I06 w


PWM0 / RSSI Ass't /AD5 / DI05

PWM1 Vref 220 Ом ^

NC SLP
W r ®
D TR /D I8 CTS / DI07 220 Ом

GND AD4 / DI04

a
Бессеансовые сети 305

!Передача сообщений *
ХВее на UDP
Скетч Arduino для считывания и
Контекст : Arduino
передачи направленных дейта­
*/
грамм UDP довольно прост. Как
обычно, первым делом нужно : #mclude <SPI.h>
включить необходимые библио- i #mclude <Ethernet.h>
теки и определить глобальные j #include <Udp.h>
переменные. Обратите внима- |
ние, что мы задаем конкретный I // Введите МАС-адрес и IP-адрес для вашего сетевого адаптера.
удаленный IP-адрес и порт — это // IP-адрес будет зависеть от вашей локальной сети.
должен быть IP-адрес компьюте­ // Выделенные жирным шрифтом адреса нужно изменить на ваши адреса,
ра, на котором будет исполняться byte mac[] = {0x00, ОхАА, ОхБВ, ОхСС, OxDE, 0x02};
скетч Processing: IPAddress mylp(192,168,1,20);
IPAddress yourlp(192,168,1,21);

j unsigned int myPort = 43770; // Локальный порт, на котором


// ожидаются UDP-сообщения
unsigned int yourPort = 43770; // Удаленный порт, на который
// посылать сообщения

// Экземпляр UDP для отправки и получения пакетов по протоколу UDP


UDP udp;

IМетод setup о запускает под­ void setup() {


ключение Ethernet, инициали­ // Запускаем последовательное подключение:
зирует последовательную связь, Serial.begin(9600);
открывает порт UDP и подготав­ // Запускаем подключение Ethernet :

ливает для отправки начальный Ethernet.begin(mac, mylp);


// Запускаем UDP:
пакет UDP:
udp.begin(myPort);
// Даем шилду Ethernet секунду для инициализации:
delay(1000);
// Подготавливаем пакет для отправления :
udp.beginPacket(yourlp, yourPort);

ш Главный цикл loop о ожида­ void loop () {


ет ввод по последовательному if (Serial.available()) {

каналу связи. Когда он получает int serialByte = Serial.read();


// Если значение полученного байта равно 0х7Е
байт со значением 0х 7е , который
// отправляем данный пакет и начинаем новый:
означает начало нового сообще­
if (serialByte == 0х7Е) {
ния ХВее, он отправляет преды­
udp.endPacket();
дущую дейтаграмму, используя
// Подготавливаем пакет для отправления:
метод endPacketo, и начинает
udp.beginPacket(yourlp, yourPort);
новый пакет. Ну, и в заключение,
}
к текущему пакету добавляется // Отправляем байт:
любой новый байт. Вот и вся про­ udp.write(serialByte);
грамма! }
}
306 Глава 7

Отображение результатов на графике


Теперь, когда все наше оборудование работает процедура для разборки пакетов выглядит очень
должным образом, настало время написать скетч похожей на процедуру разборки из предыдущего
Processing для отображения результатов на графике. проекта. Весьма полезно их сравнить, чтобы уви­
Этот скетч будет получать пакеты UDP от Arduino, деть, как один и тот же алгоритм реализуется на
разбирать содержащиеся в них пакеты ХВее и двух языках программирования лишь с небольшой
отображать их в виде графика. Вы увидите, что разницей.

Ш сначала нам нужно импорти­ /* Программа для считывания и вывода в графике пакетов ХВее

ровать библиотеку UDP, инициа­ Считывает пакеты радио ХВее через протокол UDP и выполняет

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


для ожидания входящих дейта­ Выводит результаты в виде временного графика.
грамм. Контекст: Processing
*/
Наша программа выводит стро­
ки чисел, которые выглядят во
import hypermedia.net.*;
многом подобно строкам в скет­
import processing.serial.у
че Arduino для проекта датчика
газа. Это потому, что получаемые
UDP udp; // Определяем объект иБР
программой дейтаграммы пред­
int queryPort = 43770; // Номер порта для отправки
ставляют тот же самый прото­
// запроса устройству
кол — протокол ХВее для пере­
дачи аналоговых показаний:
void setup() {
// Создаем подключение для ожидания дейтаграмм UDP
/ / н а порту для запросов:
udp = new UDP(this, queryPort);
// Ожидаем входящие пакеты:
udp.listen( true );
}

void draw() {
// Здесь ничего не происходит.

/*
Ожидаем ответы по протоколу UDP.
*/
void receive( byte[] data, String ip, int port ) {
int[] inString = int(data); // Входящие данные
// преобразовываются в строку
print(inString);
println();

►►
Бессеансовые сети 307

Ш Теперь добавляем метод для void parseData(int[] thisPacket) {


интерпретирования протокола. // Сначала проверяем, чтобы пакет был длиной 22 байта:
Не удивительно, что этот метод if (thisPacket.length >=22) {
во многом похож на функцию int adcStart = 11; // Считывание АЦП начинается
// с байта 12
parsePacket о из скетча Arduino
int numSamples = thisPacket[8]; // Количество выборок
в предыдущем проекте. Вставьте
/ / в пакете
этот метод в конец програм­
int[] adcValues = new int[numSamples]; // Массив для
мы. Для его вызова замените // хранения
операторы print о и printino // пяти показаний.
в методе receive о оператором int total = 0 ; // Сумма всех показаний АЦП.
parseData(inString);!
// Считываем адрес. Это двухбайтное значение,
// поэтому складываем два байта таким образом:
int address = thisPacket[5] + thisPacket[4] * 256;

// Считываем уровень принимаемого сигнала:


int signalStrength = thisPacket[6];

// Считываем 10-битные аналоговые значения <numSamples>


// по два за раз, так как длина каждого показания
// составляет два байта:
for (int i = 0; i < numSamples * 2; i=i+2) {
// 10-битное значение = старший байт * 256 + младший байт:
int thisSample = (thisPacket[i + adcStart] * 256) +
thisPacket[(i + 1) + adcStart];
// Помещаем результат в один из пяти байтов:
adcValues[i/2] = thisSample;
// Добавляем результат к сумме для дальнейшего
// вычисления среднего значения:
total = total + thisSample;
}
// Вычисляем среднее значение результата:
int average = total / numSamples;

int hPos = 0; // Горизонтальная позиция на графике


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

ИМ Нужно также добавить стро­ // Задаем размер окна:


ку кода в начало метода setup о size (400,300);
для установки размера окна:
►►
308 Глава 7

Ш Далее, добавляем в конец void drawGraph(int thisValue) {


// Рисуем линию:
программы Н О В Ы Й метод draw-
stroke(#4F9FE1);
Graph() I
// Сопоставляем данное значение высоте окна:
float graphValue = map (thisValue, 0, 1023, 0, height);
Этот метод вызывается из метода , // Определяем высоту линии графика:
parseData () — надо только заме­ float graphLineHeight = height - (graphValue) ;
нить в нем оператор printino, // Рисуем линию:
который выводит на экран сред­ line(hPos, height, hPos, graphLineHeight);
нее значение, следующим опера­ // В конце окна возвращаемся в начало:
if (hPos >= width) {
тором:
hPos = 0;
// Рисуем линию на графике: // Очищаем окно:
drawGraph(average); background(0);

Теперь программа должна рисо- :


}
else {
вать график показаний датчика, // Увеличиваем значение горизонтальной позиции
обновляя его при получении но­ // для прорисовки следующей линии:
вой дейтаграммы. hPos++;
}
}
Ш Вставим в программу код int lineHeight = 1 4 ; // Переменная для установки высоты линии
// текста
для добавления метки времени.
Сначала добавим глобальную пе­
ременную для установки высоты
текстовой линии:

□ Затем добавим в конец про­ void drawReadings(int thisReading, int thisSignalStrength) {


граммы метод drawReadings(). // Организовываем массив для получения названий месяцев
Этот метод будет выводить дату, // с их числовых значений:
String[] months = {
время, показания напряжения
«Jan», «Feb», «Маг», «Apr», «May», «Jun», «Jul», «Aug»,
и уровень полученного сигнала: «Sep», «Oct», «Nov», «Dec»
};
Этот метод вызывается в несколь­
ких местах программы. Сначала // Форматируем строку даты:
String date = day() + « « + months[month() -1] + « « + year();
в конце метода setup ():
// Выводим текст показаний: // Форматируем строку времени:
drawReadings(0,0); // Все цифры форматируются как двухцифровые номера:
String time = nf(hour(), 2) + «:» + nf(minute(), 2)
А затем, для прорисовки самых + «:» + nf(second(), 2);
последних показаний, вызываем
его В конце метода parseData (): // Вычисляем напряжение из показаний:
float voltage = thisReading * 3.3 / 1024;
// Рисуем линию на графике
/ / и выводим показания:
drawGraph(average); // Выбираем позицию для текста:
int xPos = 20;
drawReadings(average,
signalStrength); int yPos = 20;
// Очищаем предыдущие показания:
noStroke();
fill (0);
rect(xPos,yPos, 180, 80); ►►
Бессеансовые сети 309

// Изменяем цвет заливки для текста:


fill (#4F9FE1) ;
// Выводим показания на экран:
text(date, xPos, yPos + lineHeight);
text(time, xPos, yPos + (2 * lineHeight));
text(«Voltage: « + voltage + «V», xPos, yPos + (3 * lineHeight));
text(«Signal Strength: -» + thisSignalStrength + « dBm», xPos,
yPos + (4 * lineHeight));
}

Вот и вся программа. Результат ее исполнения показан на рис. 7.16.

Рис. 7.16. Вывод графика программы отслеживания солнечной панели.


Для демонстрационных целей эти показания были получены
при освещении панели фонариком. Ваши графики, скорее всего,
будут другими
310 Глава 7

йй Заключение
Бессеансовые сети могут быть полезными для передачи коротких сообщений, не предъявля­
ющих особых требований к подтверждению их получения. Для передачи сообщений в таких
сетях требуется выполнять намного меньший объем работы, так как для них не нужно устанав­
ливать и поддерживать логическое соединение. Они также предоставляют большую степень
свободы в части количества устройств, к которым можно обращаться одновременно.
Сравнивая два проекта этой главы можно видеть, Теперь, когда у нас есть хорошие знания основ как
что в бессеансовой сети переключение с направлен- сеансовых, так и бессеансовых сетей, в следующих
ных сообщений на широковещательные не требует главах мы слегка изменим направление взгляда и
большой работы. Поэтому наилучшей стратегией рассмотрим два других аспекта подключения сетей
будет по умолчанию использовать по мере возмож- к физическому миру: определение местонахожде-
ности направленные сообщения, что уменьшает ния и идентификацию,
уровень трафика для тех устройств, которым не
требуется получать каждое сообщение.1

1 Рис. 7.17. Шкала измерения энергоотдачи


солнечной панели, разработанная Гиладом ►► Солнечная панель на крыше здания факультета
Лотаном и Анжелой Пабло искусств И бс Н университета Нью-Йорка
Глава 8 с

КАК УЗНАТЬ МЕСТОНАХОЖДЕНИЕ


(ПОЧТИ) ЧЕГО УГОДНО
К этому времени у вас должно возникнуть довольно хорош ее
понимание того, как можно организовать взаимодействие вещей
друг с другом по сетям. Вы познакомились с пакетами, сокетами,
дейтаграммами, клиентами, серверами и различными протоколами.
В этой и следующей главах мы углубим наши знания, рассмотрев
два часто задаваемых вопроса: «Где я?» и «С кем я имею дело?»
Технологии определения местонахождения и идентификации
имеют некоторые общие важные свойства. Вследствие этого
обе эти технологии иногда путают между собой, полагая, что
технологию определения местонахождения можно использовать
для идентификации лица или объекта и наоборот. В физическом
мире — это две разные задачи, и таковыми они являются и в
сетевом окружении. Системы для определения физического
местонахождения объекта не всегда обладают хорошими
способностями для определения личности, а системы идентификации
не всегда хорош о определяю т точное местонахождение.
Соответственно, знание личности на узле, обменивающемся
информацией, не всегда может помочь узнать местонахождение
этого узла. В последующ их примерах мы рассмотрим методы для
определения местонахождения и идентификации как в физическом,
так и в сетевом окружении.

44 Адрес 2007 от Моуны Андраос (Mouna Andraos) и Сонали Сридхар (Sonali Sridhar)
Этот кулон содержит модуль GPS. Когда модуль активируется, кулон показывает рас­
стояние от носителя кулона до его дома. Фотография предоставлена Дж. Нордбергом
(J. Nordberg).
314 Глава 8

Компоненты для проектов этой главы


Поскольку предметом рассмотрения этой США и Европа
главы является определение местонахожде­
• А — Arduino Store (http://store.arduino.cc/ww/)
ния, то большинство новых деталей в ней —
это датчики. Мы также воспользуемся радио­ • AF — Adafruit (http://adafruit.com)
устройствами из глав б и 7. • D — Digi-Key (www.digikey.com)
• F — Famell (http://farnell.com)
Код поставщика • J — Jameco (http://jameco.com)
• MS — Maker SHED (www.makershed.com)
Россия • P — Pololu (www.pololu.com)
• АМР — «Амперка» (http://am perka.ru) • PX — Parallax (www.parallax.com)
• СНВ — «Чип и Дип» (http://chipdip.ru) • RS — RS (www.rs-online.com)
• ЬС — «Линуксцентр» (www.linuxcenter.ru) • SF — SparkFun (www.sparkfun.com)
• SS — Seeed Studio (www.seeedstudio.com)

Рис. 8.1. Новые компоненты для проектов этой главы:


1. Инфракрасный (ИК) дальномер GP2Y0A21 компании Sharp. 2. Кабель с разъемом JST для подсоединения
ИК дальномера. 3. Ультразвуковой дальномер LV-EZ1 компании MaxBotix. 4. GPS-приемник ЕМ-406А.
5. Интерфейсный кабель для приемника ЕМ-406А. 6. Цифровой компас LSM303DLH.
7. Сенсорная кнопка со светодиодом. 8. Адаптерная плата для кнопки. 9. Акселерометр ADXL335.
Понадобится также достаточное количество штырьковых контактов для адаптерных плат
Как узнать местонахождение (почти) чего угодно 315

Проект 15. Проект 1б. Ультразвуковой


Инфракрасный дальномер дальномер

►Модуль Arduino, 1 шт. Желательно исполь­ ►
►Модуль Arduino, 1 шт. См. замечание в списке
зовать Arduino Uno или его разновидности, но деталей для проекта 15.
проект должен работать и на других версиях AMP: А000066, http://amperka.ru/product/ar-
Arduino и совместимых платах. duino-uno
AMP: А000066, http://amperka.ru/product/ar- LC : 1с8192, http ://www.linuxcenter.ru/shop/
duino-uno ops_hard/arduino/arduino_uno/
LC: 1с8192, http://vmw.linuxcenter.ru/shop/ D: 1050-1019-ND, J: 2121105, SF: DEV-09950, A:
A000046, AF: 50, F: 1848687, RS: 715-4081, SS:
opshard/arduino/arduinouno/
ARD132D2P, MS: MKSP4
D: 1050-1019-ND, J: 2121105, SF: DEV-09950, А:

►Ультразвуковой дальномер LV-EZ1 компа­
А000046, AF: 50, F: 1848687, RS: 715-4081, SS: нии MaxBotix, 1 шт. Еще один датчик расстоя­
ARD132D2P, MS: MKSP4 ния, но на основе сонара и с большим радиусом

►Инфракрасный дальномер Sharp GP2Y0A21, действия: от 0 до 6,4 метра.
1 шт. Этот датчик расстояний из семейства ин­ АМР (альтернатива): SEN0001, http://amperka.
фракрасных дальномеров компании Sharp ра­ ru/product/ultrasonic-urm37
ботает от источника напряжения 5 В и выдает SF: SEN-00639, AF: 172, P: 726, SS:
сигнал в диапазоне 0—5 В, выявляя объекты на SEN136B5B
расстоянии от 10 до 80 см. Датчик сравнитель­ ►
►Штыревой соединитель, 3 шт.
но недорогой, очень прост в использовании и
AMP: АМР-Х013, http://amperka.ru/product/
предлагается многими магазинами розничной
pin-headers
торговли.
J: 103377, D: A26509- 20ND, SF: PRT-00116, F:
AMP: АМР-Х129, http://amperka.ru/product/ 1593411
infrared-range-meter-80
D: 425-2063-ND, SF: SEN-00242, RS: 666-6570, Проект 17. Определение уровня
Р: 136 полученного сигнала

► Грехпроводный жгут с JST-разъемом, 1 шт. с помощью радиомодуля ХВее
Этот кабель позволит вам с легкостью подклю­
чать датчик к микроконтроллеру. ►
►Радиомодуль ХВее стандарта 802.15.4 компа­
нии Digi, 2 шт.
SF: SEN-08733
AMP: АМР-Х124, http://amperka.ru/product/

►Конденсатор 10 мкФ, 1 шт. xbee
AMP: AMP-CE10U-10, http://amperka.ru/prod- J: 2113375, SF: WRL-08664, AF: 128,F: 1546394,
uct/electrolytic-capacitor SS: WLS113A4M, MS: MKAD14
J: 29891, D: P11212-ND, F: 1144605, RS: 715- ►
►Адаптер USB/XBee, 1 шт.
1638 AMP: DFR0174, http://amperka.ru/product/
xbee-usb-converter

►Штыревой соединитель, 3 шт.
J: 32400, SF: WRL-08687, AF: 247
AMP: АМР-Х013, http://amperka.ru/product/ ►
► Адаптерная плата для ХВее, 1 шт. Используйте
pin-headers схему для проекта солнечной панели или датчи­
J: 103377, D: А26509- 20ND, SF: PRT-00116, ка газа из главы 7.
F: 1593411 J: 32403, SF: BOB-08276, AF: 127
316 Глава 8

Проект 18. Определение уровня ►


►Штыревой соединитель, 12 шт.

полученного сигнала с помощью AMP: АМР-Х013, http://amperka.ru/product/


pin-headers
радиомодуля Bluetooth
J: 103377, D: A26509-20ND, SF: PRT-00116,

►Модуль Bluetooth Mate, 1 шт. Такой же, как F: 1593411
и для проектов из главы 2 или 6. ►
►Регулятор напряжения 5 В, 1 шт.
АМР (альтернатива): АМР-Х143, http://amper- AMP: АМР-Х065, http://amperka.ru/product/
ka.ru/product/hc-06-bluetooth-module voltage-regulator-17805
SF: WRL-09358 или WRL-10393 J: 51262, D: LM7805CT-ND, SF: СОМ-00107,

►Адаптер USB/TTL-Serial, 1 шт. F: 1860277, RS: 298-8514

AMP: А000059, http://amperka.ru/product/usb-


serial-converter Проект 20. Определение
SF: DEV-09718 или DEV-09716, AF: 70, направления с помощью
А: А000059, М: MKAD22, SS: PR0101D2P, цифрового компаса
D: TTL- 232R-3V3 или TTL-232R-5V

►Компьютер с Bluetooth, 1 шт. Если ваш ком­ ►
►Беспаечная макетная плата или шилд для
пьютер не оснащен встроенным адаптером Blue­ прототипов, 1 шт. Такие же, как и для предыду­
tooth, используйте внешний адаптер Bluetooth: щих проектов.
SF: WRL-09434, F : 1814756. AMP: АМР-Х003, http://amperka.ru/product/
breadboard-half
D: 438-1045-ND, J: 20723 or 20601, SF: PRT-
Проект 19. Чтение последователь­ 00137, F: 4692810, AF: 64, SS: STR101C2M или
ного протокола GPS STR102C2M, MS: MKKN2

►Модуль Arduino, 1 шт. См. замечание в списке

►Беспаечная макетная плата, 1 шт. Такая же,
деталей для проекта 15.
как и для всех предыдущих проектов.
AMP: А000066, http://amperka.ru/product/ar-
AMP: АМР-Х003, http://amperka.ru/product/
duino-uno
breadboard-half
LC : 1с8192, http ://www.linuxcenter.ru/shop/
D: 438-1045-ND, J: 20723 или 20601, SF: PRT-
opshard/arduino/arduinouno/
00137, F: 4692810, AF: 64, SS: STR101C2M или
STR102C2M, MS: MKKN2 D: 1050-1019-ND, J: 2121105, SF: DEV-09950,
A: A000046, AF: 50, F: 1848687, RS: 715-4081,

►Модуль GPS-приемника ЕМ-406А, 1 шт.
SS: ARD132D2P, MS: MKSP4
АМР (альтернатива): SEN133D1P, http://amper- ►
►Цифровой компас LSM303DLH компании
ka.ru/product/gps-bee STMicroelectronics, 1 шт. Как компания Pololu,
S: GPS-00465, РХ: 28146, AF: 99 так и SparkFun предлагают модуль с таким ком­

►Интерфейсный кабель для GPS-модуля, 1 шт. пасом. На момент подготовки этой книги модель
от Pololu работала от питания 5 В без внешних
S: GPS-09123, РХ: 805-00013 компонентов, а модель от SparkFun — нет.

►Модуль Bluetooth Mate, 1 шт. Такой же, как АМР (альтернатива): AMP-G006, http://amper-
и для проектов из главы 2 или 6. ka.ru/product/triple-axis-compass
АМР (альтернатива): АМР-Х143, http://'amper- SF: SEN-09810, RS: 717-3723, P: 1250
ka.ru/product/hc-06-bluetooth-module ►
►Сенсорная кнопка со светодиодом, 1 шт.
SF: WRL-09358 или WRL-10393 В этом прокте используются сенсорная кнопка
Как узнать местонахождение (почти) чего угодно 317

и адаптерная плата для нее, оснащенная встро­ Проект 21. Определение высоты
енным светодиодом, от компании SparkFun, но
можно взять любую кнопку и светодиод. с помощью акселерометра
SF: СОМ-10443 и SF: ВОВ-10467 ►
►Беспаечная макетная плата или шилд для

►Сопротивление 220 Ом, 1 шт. прототипов, 1 шт. Такие же, как и для преды­
дущих проектов.
AMP: AMP-R220R-10, http://amperka.ru/prod-
AMP: АМР-ХООЗ, http://amperka.ru/product/
uct/resistor
breadboard-half
D: 220QBK-ND, J: 690700, F: 9337792, RS: 707- D: 438-1045-ND, J: 20723 или 20601, SF: PRT-
8842 00137, F: 4692810, AF: 64, SS: STR101C2M или

►Сопротивление 10 К, 1 шт. STR102C2M, MS: MKKN2
AMP: AMP-R1K-10, http://amperka.ru/product/ ►
►Модуль Arduino, 1 шт. См. замечание в списке
деталей для проекта 15.
resistor
D: 10KQBK-ND, J: 29911, F: 9337687, RS: 707- AMP: А000066, http://amperka.ru/product/ar-
8906 duino-uno
LC: 1с8192, http://www.linuxcenter.ru/shop/

►Светодиод, 1 шт. Не требуется, если использу­
ops_hard/arduino/arduino_uno/
ется кнопка компании SparkFun.
D: 1050-1019-ND, J: 2121105, SF: DEV-09950, А:
AMP: AMP-X009-R4, http://amperka.ru/prod- А000046, AF: 50, F: 1848687, RS: 715-4081, SS:
uct/led-5mm ARD132D2P, MS: MKSP4
D: 160-1144-ND или 160-1665-ND, J: 34761 или ►
►Акселерометр ADXL320 компании Analog
94511, F: 1015878, RS: 247-1662 или 826-830, Devices, 1 шт. Это тот же трехкоординатный
SF: СОМ-09592 или СОМ-09590 акселерометр, который мы использовали в про­
екте балансировочной доски из главы 5. Можно

►Штыревой соединитель, 13 шт. также взять акселерометр на цифровом компасе
AMP: АМР-Х013, http://amperka.ru/product/ LSM303DLH из предыдущего проекта.
pin-headers АМР (альтернатива): DRF0143, http://amperka.
J: 103377, D: A26509-20ND, SF: PRT-00116, ru/product/triple-axis-accelerometer
F: 1593411 J: 28017, SF: SEN-00692, AF: 163, RS: 726-3738,
P: 1247, MS: MKPX7

йй Сетевое и физическое местонахождение


Одной из самых распространенных задач, решения которых люди хотят добиться с помощью
сенсорных систем, является определение местонахождения вещей. Естественная реакция
на осознание широты диапазона вещей, которые могут выявлять датчики, — это восторг от
предоставляемой им свободой. Ведь теперь для взаимодействия с компьютерами больше
не требуется быть прикованным к креслу. Можно свободно танцевать, бегать, прыгать, —
а компьютер все равно сможет различить выполняемые вами действия и отреагировать на них
каким-либо образом.
Но оборотная сторона этой свободы — представ­ дение кого угодно и чего угодно можно опреде­
ление, что в сетевом мире местонахождение объ­ лить в любое время, где бы они ни находились,
екта можно определить, где бы он ни находился. и невзирая на то, хотят ли они этого или нет. Однако
Повсеместно развешанные камеры наблюдения в реальности возможности технологий определения
и системы наподобие Wireless Е911 (которая опре­ местонахождения лежат где-то посредине наших
деляет местонахождение мобильных телефонов) представлений о них.
создают впечатление, как будто бы местонахож­
318 Глава 8

Задача определения местонахождения объектов человека рядом с вами. Вы моментально получите


в сети отличается от задачи определения место­ исчерпывающую оценку всех ваших характери­
нахождения объектов в физическом пространстве. стик: вашего внешнего вида, поведения, обста­
Общее представление о местонахождении устрой­ новки, в которой вы оба находитесь, вещей, имею­
ства в сети можно получить с помощью разно­ щихся при вас, и многого другого, — что позволит
образных средств: от сопоставления адреса до из­ вам сформулировать для себя достаточно точный
мерения мощности сигнала. Но это не означает, что и контекстно-зависимый ответ. Никакой объем тех­
мы узнаем физическое местонахождение устрой­ нологий не сможет дать вам такой ответ, поскольку
ства, — мы всего лишь выявим его расположение связь между тем, где вы находитесь, и тем, что вы
относительно других узлов этой сети. Мы можем хотите знать, в вопросе редко выражается явным
узнать, возле какой ближайшей антенны ячейки образом. В результате, самым лучшим подходом
(так называемой базовой станции) сотовой сети при разработке системы определения местонахож­
находится мобильный телефон, или что компьютер дения будет задействовать способности создавать
подключен к определенной точке доступа Wi-Fi. ассоциации того лица, которое станет использовать
Эту информацию вместе с другими данными мож­ систему. Предоставление ему данных, показываю­
но использовать, чтобы получить представление о щих, где он может находиться при выполнении того
лице, использующем то или иное устройство. Если или иного действия, и поясняющих, какие действия
мы знаем, что антенна сотовой ячейки находится на он может предпринять, поможет устранить потреб­
расстоянии менее километра от нас, это дает нам ность в использовании более развитых технологий.
основания полагать, что лицо, с которым мы разго­ Повышению эффективности работы системы будет
вариваем по мобильному телефону, скоро прибудет, способствовать также и указание системе мест на­
и мы можем подготовиться к его/ее встрече. Таким хождения окружающих объектов или размещение
образом, для ряда сетевых приложений нам не их таким образом, чтобы система могла с легкостью
столько нужно знать физическое местонахождение найти свой объект поиска.
устройств, сколько их расположение относительно
других узлов сети. Например, представьте, что вы разрабатываете ин­
терактивное пространство, которое реагирует на
движения находящихся в нем лиц. Такие проекты
О Шаг 1 :спросите человека пользуются популярностью среди представителей
Люди имеют весьма развитые способности опре­ искусств интерактивного жанра, которые часто ис­
делять местоположение объектов. На физическом пользуют в своем творчестве приемы типа «тело-
уровне мы обладаем различными чувствами, кото­ как-курсор», в которых зритель представляется
рые можем применить для решения этой пробле­ объектом, движущимся в пространстве галереи.
мы, а также мозгом, владеющим замечательными Для определения местонахождения зрителя в двух
возможностями нахождения соответствия форм и измерениях и предоставлении этой информации си­
определения расстояний на основе тех или иных стеме, подобно тому, как это делается для курсора
сенсорных данных. А на поведенческом уровне мы на экране компьютера, требуется некий тип отсле­
оснащены тысячами шаблонов, которые помогают живающей системы.
нам определить, как и зачем нам искать что бы то ни
Но в такой постановке задачи отсутствует причина,
было. Компьютерные системы не наделены этими
по которой зритель должен перемещаться вообще.
возможностями, поэтому при разработке интерак­
Поэтому, если мы начнем с выявления, что делает
тивных систем для определения местонахождения
сейчас зритель, и станем давать ему подсказки, что
вещей или людей самым лучшим пригодным для
от него ожидается дальше, то сможем уменьшить
работы инструментом — а также самым первым,
пространство, в котором нам нужно будет отсле­
применение которого следует предусмотреть, — яв­
живать его перемещения. Так, нам нужно только
ляется лицо, для которого создается система.
понять, что он, например, приближается к одной
Процесс качественного определения местонахож­ из нескольких скульптур в пространстве галереи,
дения начинается с рассмотрения культурных и по­ чтобы активировать движение скульптуры ему
веденческих индикаторов. Если вы хотите знать, в ответ. Эту задачу будет решить легче, если пред­
где вы находитесь и как выглядите, — спросите ставить себе скульптуры в качестве узлов сети.
Как узнать местонахождение (почти) чего угодно 319

Вместо отслеживания зрителя в неопределенном частично зависит от доступной технологии. Если


двумерном пространстве, все, что нам нужно будет вы создаете упомянутый ранее путеводитель по го­
сделать сейчас, — это зафиксировать его появление роду для мобильных телефонов, можно применить
вблизи одной из нескольких точек в помещении. несколько различных способов. Так, код ближай­
Соответственно, вместо разработки системы от­ шего ретранслятора, название улицы или названия
слеживания движения, можно обойтись установкой близлежащих бизнес-заведений — все эти мето­
возле каждой скульптуры датчика приближения, ды подойдут для определения местонахождения.
уточнить, возле какого датчика находится зритель, В этом случае, как и во многих других, ваша зада­
и взять показания этого датчика, чтобы определить ча в разработке системы заключается в том, чтобы
расстояние от зрителя до него. В этом случае мы ис­ вычислить, как соотнести одну систему координат
пользуем для упрощения задачи комбинацию про­ с другой, чтобы предоставить пользователю понят­
странственной организации и технологии. Задачу ную информацию.
можно облегчить еще больше, предоставляя зри­
телю визуальные, звуковые и поведенческие под­ Сопоставление местонахождения системам коор­
сказки того, каким образом он должен действовать. динат представляет собой весьма трудоемкую за­
Теперь зритель больше не является пассивным объ­ дачу, поэтому большинство картографических баз
ектом системы, а принимает активное участие в ее данных являются неполными. Так, геокодирование
работе. позволяет узнать широту и долготу для большин­
ства адресов в США. Но эта технология не работает
Рассмотрим также другой пример. Скажем, мы в некоторых местах даже в самих США и в боль­
разрабатываем приложение-путеводитель по горо­ шинстве мест вне их, так как требуемые данные не
ду для владельцев мобильных телефонов, которое были собраны и предоставлены для общего доступа.
полагается на информацию о местонахождении Качество геокодирования зависит от наличия точ­
телефона относительно близлежащих антенн со­ ной базы данных имен, соотнесенных с местополо­
товой связи, чтобы определить местонахождение жениями. Если вы не можете определиться с точны­
его владельца. Что нам делать в том случае, когда ми именами, на этом пути вас ожидают трудности.
нет надежного сигнала от антенн? Возможно, нам Определенную помощь можно получить, восполь­
следует попросить туриста ввести название улицы, зовавшись рядом доступных ресурсов. Например,
на которой он находится, или название какого-либо веб-сайт www.vterrain.org/Culture/geocoding.html
значительного объекта поблизости, или еще какую- содержит обширный список ресурсов геокодиро­
либо другую подобную подсказку. Тогда програм­ вания для США и других стран, созданный в про­
ма сможет совместить эти данные с данными о цессе развития проекта Virtual Terrain Project1.
местоположении, основанными на последнем по­ Организация Geocoder.net предоставляет на веб­
лученном надежном сигнале, и определить место­ сайте www.geocoder.us возможность бесплатного
нахождение пользователя с большей вероятностью. поиска географических координат по адресу для го­
В таких случаях, да и во всех системах, основанных родов США, а организация Worldkit предоставляет
на определении местонахождения пользователя, на своем веб-сайте расширенную версию сервиса
важно встроить в систему возможности человека, для городов других стран.
чтобы сделать систему лучше.
Географические координаты (широта и долгота)
наиболее часто сопоставляются названиям улиц, но
О Шаг 2: определитесь существуют и другие объекты, для которых было
на местности бы полезно знать географические координаты.
Например, все антенны ячеек мобильной связи (ба­
Прежде чем можно будет понять, где вы находи­ зовые станции) имеют физическое местоположение.
тесь, нужно определиться с вашим окружением. Было бы весьма удобно располагать базой данных
Любое место можно описать несколькими спосо­ географических координат для этих базовых стан­
бами. Например, угол улицы можно описать в тер­ ций. Однако базовые станции являются частной
минах его адреса, его широты и долготы, его по­ собственностью мобильных операторов, поэтому1
чтового индекса или расположенных поблизости
бизнес-объектов. Какой из этих способов выбрать, 1 Проект «Виртуальный ландшафт» (www.vterrain.org).
320 Глава 8

подробные данные об их местоположении принад­ определение дает нам приблизительное местополо­


лежат этим операторам и недоступны для общего жение — этот процесс обычно начинается с иденти­
пользования. Такие проекты, как OpenCelllD (www. фикации в сети устройства, являющегося объектом
opencellid.org), пытаются составить карты распо­ поиска. В описанном ранее проекте интерактивной
ложения базовых станций, используя специальные скульптурной галереи можно было бы определять
программы на мобильных телефонах с функцио­ новое местонахождение зрителя, фиксируя акти­
нальностью GPS. Но так как для мобильных теле­ вирование им датчика приближения возле одного
фонов существует большое число операционных из объектов галереи. Узнав, где зритель приблизи­
систем, сама разработка соответствующего про­ тельно находится, мы можем уточнить его место­
граммного обеспечения представляет серьезную нахождение, измерив с помощью прикрепленного
задачу. к объекту датчика-дальномера расстояние от зрите­
ля до объекта.
Не всегда может быть точным и сопоставление
физическим адресам IP-адресов компьютеров, по­ Но не всегда нам требуется уточнить физическое
скольку компьютеры могут менять свое местопо­ позиционирование объекта. Иногда мы уточняем,
ложение. Тем не менее, существует несколько баз что он делает, а не где находится. Имея некоторое
данных геокодирования и для IP-адресов. Принцип прибтшзительное представление о том, что где-
работы таких баз данных основан на предположе­ то что-то происходит, нам, чтобы отреагировать
нии, что маршрутизаторы перемещаются не часто, должным образом, нужно узнать больше о том,
поэтому, если нам известно физическое местополо­ что же там происходит на самом деле. В примере
жение маршрутизатора, устройства, которые полу­ с интерактивной скульптурной галереей нам вряд
чают доступ к Интернету через этот маршрутиза­ ли потребуется знать точное местоположение
тор, не должны находиться слишком далеко от него. зрителя в метрах и сантиметрах. Когда мы знаем,
Геокодирование на основе IP-адресов имеет ограни­ вблизи какого объекта в галерее он находится,
ченную точность, но оно может помочь определить а также находится ли он достаточно близко к этому
некую область на планете, а иногда даже и район объекту, чтобы обратить внимание именно на него,
или городской квартал, где расположено подклю­ мы можем инициировать реакцию этого объекта.
ченное к Интернету устройство. Конечно же, поиск Например, сменить изображение на дисплее или
по IP-адресам не работает с частными IP-адресами. активировать анимированную скульптуру. В обоих
В следующей главе мы рассмотрим пример опре­ случаях нам нет надобности знать точное расстояние
деления местоположения с комбинированным ис­ от зрителя до объекта — нам лишь нужно уточнить,
пользованием сетевого идентификатора и геокоди­ что зритель достаточно к нему близко, чтобы
рования. переключить свое внимание на этот объект и за­
метить реакцию объекта на приближение зрителя
Можно разработать собственную базу данных со­ к нему. Иногда датчики приближения применяются
поставлений географических координат место­ в качестве детекторов движения, помогающих
положениям сетевых устройств или культурных определить общие области происходящего, а не
заведений, если объем требуемой информации не вычислить расстояние.
очень большой, или если у вас есть достаточное ко­
личество персонала для выполнения такой работы. Фиксация приближения не всегда предоставляет
Но лучше, как это обычно и делается, полагаться на нам достаточно информации, чтобы предпринять
существующую инфраструктуру, когда такая воз­ предусмотренное действие. Уточнение полученной
можность имеется. от датчиков информации может касаться и опре­
деления расположения одного объекта относительно
другого. Например, если мы указываем кому-либо
направление, нам нужно знать, в какую сторону он
О Шаг 3: уточните происходящее при этом смотрит. Относительное расположение
Когда мы уже знаем, где и что станем искать, нам объектов также весьма важно и в том случае, когда
нужно будет постоянно выполнять две задачи: два объекта находятся близко друг от друга, —
определять новое местоположение объекта и улуч­ не имеет смысла активировать анимированную
шать точность этого определения. Первоначальное скульптуру, если зритель стоит к ней спиной...
Как узнать местонахождение (почти) чего угодно 321

35 способов определить свое местонахождение


На конференции ETech2 2004, организованной • Используйте информацию о доступных мо­
издательством O'Reilly, интерактивный дизайнер бильных операторах.
и писатель Крис Хиткоут (Chris Heathcote) дал
• Какие телефонные операторы доступны?
замечательную презентацию культурных и тех­
нологических решений для определения место­ • Какой формат телефонных номеров?
нахождения объектов: «35 способов определить • Доступны ли газеты и какие?
свое местонахождение»3. Он изложил в общих
чертах несколько важных факторов, которые сле­ • На каком языке разговаривают окружающие?
дует иметь в виду, прежде чем выбирать инстру­ • Почтовые индексы.
мент для решения задачи. В частности, он под­
• Названия улиц.
черкнул, что наилучший способ определить ме­
стонахождение кого-либо или чего-либо состоит • Углы/перекрестки улиц.
из комбинации технологических решений и ин­
• Номера домов.
терпретации культурных и поведенческих инди­
каторов. Его список способов — весьма полезный • Названия деловых заведений.
инструмент, способствующий созданию решений • Местоположения мобильного телефона через
при разработке систем для определения местона­ триангуляцию или трилатерацию.
хождения. Далее приводится несколько наиболее
популярных способов из этого списка. • Триангуляция и трилатерация на других
радиоинфраструктурах — таких как телеви­
• Предполагайте, что вы на Земле. Или в ее не­ дение, радио и общедоступная связь Wi-Fi.
коей области, но рассматривайте при этом • GPS, A-GPS4, WAAS5 и прочие улучшения
наибольшее пространство, в котором нужно GPS.
определить местонахождение.
• Большие и небольшие ориентиры и/или до­
• Обратите внимание на местное время. стопримечательности.
• Спросите у кого-либо. • Счисление места6.
• Используйте ассоциации: вблизи кого или чего
4 А-GPS (англ. Assisted GPS) — технология, ускоряющая
вы находитесь? «холодный старт» GPS-приемника. Ускорение происходит за
счет предоставления необходимой информации через альтер­
• Используйте близость телефонов-автоматов, нативные каналы связи.
остановок общественного транспорта и улич­ 5 WAAS (Wide Area Augmentation System) — американская
ных знаков. глобальная система распространения дифференциальных по­
правок. Разработана в США для повышения точности пози­
• Пользуйтесь картой. ционирования и достоверности данных навигационных GPS-
систем.
6 Счисление координат (или счисление места) — метод опре­
2 Emerging Technology Conference — конференция по разви­ деления места (текущих координат) объекта (судна, летатель­
вающимся технологиям. ного аппарата, транспортного средства, иного объекта) по из­
3 В оригинале: «35 Ways to Find Your Location». вестным исходным координатам и параметрам движения.
322 Глава 8

l i Определение расстояния
Электронные системы определения местонахождения — такие как GPS, сонар, локация мо­
бильных телефонов — сначала кажутся каким-то волшебством, поскольку нет никаких види­
мых индикаторов принципа их работы. Но если разбить этот процесс на несколько компо­
нентов, то ничего волшебного в нем больше не останется, а все станет сравнительно просто.
Большинство систем определения физического местоположения основаны на одном из двух
принципов: измерении времени, затрачиваемого сигналом для прохождения от известного
места до объекта, или измерении уровня сигнала в точке приема. В обоих методах для опре­
деления местоположения с помощью трилатерации комбинируются измерения с нескольких
(двух, трех или более) источников.

Например, приемник GPS определяет свое местона­ В одних случаях расстояние измеряется для опреде­
хождение на поверхности планеты, измеряя время ления местонахождения, а в других — для его уточ­
прохождения радиосигналов от нескольких спут­ нения. В следующих двух примерах используются
ников, расположенных на геосинхронной орбите пассивные устройства определения физического
вокруг Земли. Система определения местонахож­ расстояния.
дения мобильных телефонов работает подобным
образом, используя для триангуляции сигналы от
близлежащих базовых станций. Такие системы, как Пассивное определение
Skyhook (www.skyhookwireless.com), применяют расстояния
несколько разных технологий (Wi-Fi, GPS и лока­
цию посредством сотовых антенн) для уточнения Ультразвуковой дальномер LV-EZ1 компании Мах-
своих данных о местоположении. Сонарные и ин­ Botix и инфракрасный дальномер GP2Y0A21YK
фракрасные датчики приближения работают, излу­ компании Sharp являют собой примеры устройств
чая соответственно акустический или инфракрас­ для определения расстояния. Дальномер MaxBotix
ный сигнал, измеряя затем уровень отраженного от излучает ультразвуковой сигнал и ожидает его от­
объекта сигнала. ражения. Дальномер Sharp излучает инфракрасный
луч света и принимает его отражение. Эти датчики
Методы определения расстояния можно разбить имеют ограниченный радиус действия: у датчика
на активные и пассивные. В активных системах Sharp — от 10 до 80 см, а у датчика MaxBotix — от
цель оснащается источником радио-, светового или Одо 7,5 м. Пассивные датчики наподобие этих двух
акустического сигнала, а приемник отслеживает удобны, когда нужно определить расстояние до че­
сигнал, излучаемый целью. В пассивных системах ловека в ограниченном пространстве, при этом не
цели не требуется быть оснащенной каким бы то обременяя его никаким оборудованием. Они также
ни было оборудованием. Здесь рабочее устройство полезны для проектов с перемещающимися объек­
само излучает сигнал, а затем оно же и принимает тами, о которых нужно знать про их приближение
этот сигнал после его отражения целью. Технолог™ к другим объектам в том же самом пространстве,
определения местонахождения мобильных телефо­ в котором они перемещаются.
нов является активной, так как в ней используется
двусторонний обмен между телефоном и антенна­
ми базовых станций. Технология GPS также являет­
ся активной, хотя и при однонаправленном обмене,
так как здесь принимаемый сигнал не излучается
принимаемым устройством, и целью является при­
емник GPS. Сонарные и инфракрасные методы опре­
деления расстояния являются пассивными, так как
сигнал не излучается целью, а отражается от нее.
Как узнать местонахождение (почти) чего угодно 323

Проект 15
Пример инфракрасного дальномера
Дальномеры GP2xx компании Sharp достаточно точно определяют короткие расстояния, из­
меряя интенсивность отраженного от цели инфракрасного луча. Они очень просты в исполь­
зовании. На рис. 8.2 показана схема подсоединения к модулю Arduino дальномера GP2Y0A21,
который может определять расстояния до объектов, находящихся от него в диапазоне от 10
до 80 см. Для датчика требуется питание напряжением 5 В, а выдает он сигнал в диапазоне от 0
до 5 В — в зависимости от расстояния до ближайшего объекта в области определения.
Вывод датчиков Sharp — не линейный, и если
вам требуется линейный диапазон, придется по­ Требуемые компоненты
строить график напряжений относительно рас­ ►
►Модуль Arduino, 1 шт.
стояний, а затем выполнить определенные вы­

►Инфракрасный дальномер Sharp GP2Y0A21,
числения. К счастью, добрые люди из компании
Acroname Robotics такие вычисления уже вы­ 1 шт.
полнили. Соответствующую информацию можно ►
► Конденсатор 10 мкФ, 1 шт.
найти на их веб-сайте по адресу: www.acroname. ►
► Штыревой соединитель, 3 шт.
com/robotics/info/articles/irlinear/irlinear.html.
Спецификацию технических данных для датчика
можно загрузить по ссылке: http://www.sharpsma. в диапазоне расстояний от 10 до 80 см, крутиз­
com/webfm_send/l208. Спецификация содержит на кривой на нем приблизительно равна 27 В см.
график напряжений относительно измеренных рас­ Используя эту информацию, можно получить до­
стояний. График показывает достаточно линейное статочно хорошее приблизительное значение рас­
взаимоотношение между этими двумя величинами стояния.

скетч считывает /*
ИК дальномер с датчиком Sharp GP2xx
показания датчика и преобразо­
Context: Arduino
вывает результат в напряжение.
Затем это напряжение, с исполь­ */
зованием только что описанной void setup () {
информации из спецификации // Инициализируем последовательную связь на скорости 9600 б/с:
технических данных для датчика, Serial.begin(9600);
преобразовывается в расстояние
в сантиметрах. Формула преоб­
разования дает только приблизи­ void loop() {
тельные значения, но они вполне int sensorValue = analogRead(A0);
приемлемы для общих целей. // Преобразовываем в напряжение:
float voltage = map (sensorValue, 0, 5, 0, 1023);
Впрочем, для многих приложе­
ний нам требуется не абсолютное, // Показания датчика в действительности не являются
а относительное расстояние, — // линейными. Эта формула выводится из графика напряжения
ближе объект находится или даль­ // относительно значения 1/расстояние, предоставленного
ше от определенного порогового // в спецификации технических характеристик. Крутизна этой
значения расстояния, при котором // линии — приблизительно 27.
float distance = 27.0 /voltage;
активируется какое-либо другое
взаимодействие? Для таких при­ // Выводим значение датчика
ложений указанное преобразова­ Serial.print(distance) ;
ние не требуется. Для них мож­ Serial.println(" см");
но просто использовать вывод // Ожидаем 10 миллисекунд, прежде чем снова считывать
команды апа1одКеас1 () И выбрать // показания датчика,
пороговое значение путем экспе­ delay(10);
римента.
324 Глава 8

Рис. 8.2. Подключение инфракрасного


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

AREF
Reset GND
+3.3V D13
+5V D12

Gnd D11/PWM

Gnd D10/PWM
Инфракрасный
дальномер Vin D9/PWM
GP2Y0A21YK
D8
Модуль
Arduino

О +5 В

"Земля"

Аналоговый выход
о

J'
.
10мкФ
D6/PWM
D7

Analogo D5/PWM

О A1

A2 D3/PWM
D4

A3 D2

A4 Digitali/TX

A5 DigitalO/RX
б
Как узнать местонахождение (почти) чего угодно 325

Проект 16
Пример ультразвукового дальномера
Ультразвуковые датчики компании MaxBotix (www.maxbotix.com) измеряют расстояние ана­
логично тому, как это делают инфракрасные датчики компании Sharp, но обладают большим
радиусом действия. Кроме того, вместо инфракрасного света, они излучают ультразвуковой
сигнал и принимают возвращенное эхо. Показания датчика отражают время для возвращения
эха, которое соответствует расстоянию до отражателя. Для этих датчиков требуется питание
напряжением 5 В (датчики серии LV могут работать на напряжении от 2,5 до 5 В), и возвращают
они свои показания через аналоговый, ШИМ или асинхронный последовательный интерфейс.
Эти датчики можно приобрести у самой компании MaxBotix, а также в магазинах SparkFun,
Adafruit, Pololu и многих других поставщиков, перечисленных в книге.

Требуемые компоненты

►Модуль Arduino, 1 шт. Измерение расстояния "спереди-сзади"


►Ультразвуковой дальномер LV-EZ1 компании
MaxBotix, 1 шт.

►Штыревой соединитель, 3 шт.

►Отрезок монтажного провода, 3 шт.

Дальномеры отлично подходят для измерения ли­


нейных расстояний, но у них ограниченное поле
конуса чувствительности, вследствие чего они не
очень годятся для определения местонахождения в
большом двумерном пространстве. Например, дат­
чик LV-EZ1 компании MaxBotix имеет конус поля
чувствительности с углом приблизительно 80° (но
чувствительность падает по краям) и длиной 6,4 м.
Чтобы охватить всю комнату, потребуется несколь­ Измерение расстояния "слева-справа"
ко датчиков, о расположении которых еще придется
призадуматься. На рис. 8.3 показан один из спосо­
бов покрыть площадь размером 4x4 метра, исполь­
зуя пять таких дальномеров.
При этом нам нужно обеспечить, чтобы датчики не
работали одновременно, так как их сигналы будут
мешать друг другу, — поэтому датчики следует
активировать последовательно один за другим.
Кроме того, надо учесть, что датчики MaxBotix мо­
гут брать измерения только раз в 50 миллисекунд,
Рис. 8.3. Измерение расстояния в двух координатах
и после каждого замера датчику нужно дать время с использованием ультразвуковых дальномеров.
для стабилизации, прежде чем брать следующий Квадрат на каждой схеме представляет комнату
замер. Поскольку возвращение результата занимает размером 4x4 метра. Для того, чтобы обеспечить
у датчика до 5 миллисекунд, для полного сканиро­ покрытие всего пространства комнаты, нужно
вания комнаты потребуется до 250 миллисекунд. расположить несколько датчиков по краям комнаты
326 Глава 8

На рис. 8.4 показаны монтажная (а) и принципи­


альная (б) схемы подсоединения к модулю Arduino
дальномера LV-EZ1 компании MaxBotix.

Рис. 8.4. Монтажная (а) и принципиальная (б)


схемы подключения ультразвукового датчика LV-EZ1
а к модулю Arduino

AREF
R e se t GND
Ультразвуковой
датчик LV-EZ1 + 3 .3V D 13

+5V D 12

G nd D11/PWM

G nd D10/PW M

Vin D9/PW M

D8
Модуль
Arduino
D7

D6/PW M

A nalogo D5/PWM

A1 D4

A2 D3/PW
U J / Г VV M
IV I

A3 D2

A4 Digital1/TX

A5 DigitalO/RX
Как узнать местонахождение (почти) чего угодно 327

скетч похож на
скетч для проекта 15. Он считы­ Ультразвуковой дальномер LV-EZ1
Контекст : Arduino
вает показания датчика, преоб­
*/
разовывает их в напряжение, а
затем преобразовывает получен­ void setup() {
ное напряжение в расстояние в // Инициализируем последовательную связь на скорости 9600 б/с:
сантиметрах. Опять же, формула Serial.begin(9600);
преобразования дает только при­ }
близительное значение:
void loop() {
// Считываем показание датчика и преобразовываем
// его в напряжение:
int sensorValue = analogRead(АО);
float voltage = map (sensorValue, 0, 5, 0, 1023);
// Датчик выдает приблизительно 9,8 мВ на дюйм, поэтому
// умножаем это значение на 2,54, чтобы получить сантиметры:
float distance = voltage * 2.54 / 0.0098;
// Выводим значение датчика
Serial.print(distance);
Serial.println(« cm»);
// Ожидаем 50 миллисекунд, прежде чем снова считывать
// показания датчика, чтобы дать ему стабилизироваться,
delay(50);
}

Активное определение расстояния


Ультразвуковые и инфракрасные дальномеры, рас­ предоставляют сведения о мощности сигнала. Для
смотренные в предыдущих разделах, представляют того чтобы соотнести эту информацию с расстоя­
собой пассивные устройства определения расстоя­ нием, нам нужно вычислить это расстояние, как
ния. Системы мобильной связи и GPS основаны функцию мощности сигнала. Основная функция
на активной дальнометрии (рис. 8.5). Эти системы приемника GPS как раз и состоит в вычислении
содержат радиомаяк (антенна базовой станции или расстояния до спутников GPS на основе мощности
спутник GPS) и радиоприемник (телефон или при­ сигнала, чтобы затем с помощью полученных рас­
емник GPS). Приемник определяет свое расстояние стояний определить местоположение. Другие упо­
до радиомаяка на основе принимаемого от него сиг­ минаемые здесь радиосистемы определения место­
нала. Такие системы могут измерять намного боль­ положения самостоятельно этого не делают.
шие расстояния в масштабе города или даже всей
Однако для многих приложений не требуется знать
планеты. Недостатком систем активного определе­
конкретное расстояние до объекта, а надо только
ния расстояния является необходимость наличия
определить, находится ли объект в пределах какого-
питаемого устройства на обоих концах. Для того,
то определенного расстояния. Например, если мы
чтобы измерить расстояние от человека до какой-
делаем дверной замок, чтобы впускать и выпускать,
либо точки с помощью активной системы опреде­
например, кота, мы могли бы прикрепить пере­
ления расстояния, у этого человека должен иметься
датчик (радиомаяк) Bluetooth на ошейнике кота,
соответствующий приемник.
а приемник Bluetooth — на замке. При достижении
Система GPS и системы определения местонахож­ достаточно мощного уровня сигнала радиомаяка за­
дения мобильных телефонов в действительности мок будет открываться, позволяя коту зайти. В дан­
определяют не расстояние до радиомаяков, а толь­ ном случае, и во многих других подобных ему, у нас
ко относительную мощность получаемого сигнала. нет надобности знать действительное расстояние.
Радио Bluetooth, 802.15.4, ZigBee и Wi-Fi также
328 Глава 8

Рис. 8.5.
Активное и пассивное
определение расстояния

Базовое устройство (датчик)


Исходный сигнал, излучаемый излучает сигнал, затем принимает -
антенной базовой станции сигнал, отраженный от объекта

осю
Л о с ­ ООО
ООО
ООО

Ответный сигнал, излучаемый


мобильным устройством
(например, сотовым телефоном)

L ООО
\

Пассивное определение
Активное определение | , ^ , -Ч расстояния
расстояния 1 ^ -

Проект 17

Определение уровня полученного сигнала


с помощью радиомодуля ХВее
В предыдущей главе мы получали значение уровня принимаемого сигнала. В частности, скетч
Processing для считывания напряжения, выдаваемого солнечной панелью, извлекал значение
уровня полученного сигнала при разборке пакета. Однако мы никак его не использовали. Здесь
мы создадим упрощенный вариант того скетча, который считывает только уровень сигнала.
Для его тестирования можно использовать настройки из проекта 14 главы 7. Для приемника
используйте адаптер USB/XBee-Serial, а для передатчика — схему на рис. 7.5 (схема датчика
газа) или на рис. 7.13 (схема солнечной панели).
Как узнать местонахождение (почти) чего угодно 329

т Выполните следующий скетч


Processing, чтобы подключиться Измеритель уровня сигнала радио ХВее
Контекст: Processing
к принимающему радиомодулю
ХВее через адаптер USB/XBee-
Считывает пакеты радиомодуля ХВее, выполняет их разборку.
Serial. Исполняемый скетч вы­
Размер пакетов должен быть 22 байта. Организация пакетов
водит на экран столбик графика, должна быть следующей:
как показано на рис. 8.6. Байт 1: 0х7Е, значение стартового байта.
Байты 2-3: размер пакета; 2-байтное значение (не применяется
в данном случае)
Байт 4: Значение идентификатора API, код, определяющий ответ
(не применяется в данном случае).
Байты 5-6: Адрес отправляющего радио ХВее.
Байт 7: ИУПС, Индикатор уровня принятого сигнала
(не применяется в данном случае)
Байт 8: Широковещательные опции (не применяется в данном случае) .
Байт 9: Количество последующих выборок
Байты 10-11: Индикатор активных каналов (не применяется
в данном случае)
Байты 12-21: 5 10-битных значений, каждое представляющее
выборку АЦП от отправителя

import processing.serial.*;
Serial XBee ; // Входной последовательный порт
/ / от радиомодуля ХВее
int[] packet = new int[22]; // Для 5 выборок размер пакета
/ / радиомодуля ХВее — 22 байта
int byteCounter; // Для отслеживания, где мы
/ / находимся в пакете
int rssi = 0; // Мощность полученного сигнала
int address = 0 ; // Адрес передающего модуля ХВее
int lastReading = 0 ; // Значение предыдущего входящего
/ / байта

void setup () {
size (320, 480); // Размер окна
// Получаем список последовательных портов:
println(Serial.list());
// Открываем последовательный порт,
ХВее = new Serial(this, Serial.list () [0], 9600);
}

void draw() {
// Если есть новые действительные данные (>0),
// выводим их на график:
if ((rssi > 0 ) && (rssi != lastReading)) {
// Задаем фон:
background(0);
// Задаем высоту и ширину столбца графика:
int rectHeight = rssi;
int rectWidth = 50; ►►
330 Глава 8

EH // Рисуем прямоугольник:
stroke(23, 127, 255);
fill (23, 127, 255);
rect(width/2 - rectWidth, height-rectHeight,
rectWidth, height);
// Выводим число:
text(«XBee Radio Signal Strength test», 10, 20);
text(«Received from XBee with address: « +
hex(address), 10, 40);
text («Received signal strength: -» + rssi +
« dBm», 10, 60);
// Сохраняем текущий байт для следующего считывания:
astReading = rssi;

void serialEvent(Serial XBee ) {


// Считываем байт с порта:
int thisByte = XBee.read();
// Если значение = 0x7E — значение стартового байта —
// имеем новый пакет:
if (thisByte == 0х7Е) { // start byte
// Разбираем предыдущий пакет, если есть данные:
if (packet[2] > 0 ) {
rssi = parseData(packet);
}
// Выполняем сброс счетчика байтов:
byteCounter = 0;
}
// Помещаем текущий байт в пакет в текущую позицию:
packet[byteCounter] = thisByte;
// Увеличиваем значение счетчика байтов:
byteCounter++;

/*
Получив пакет, нам нужно извлечь из него полезные данные.
Данный метод получает адрес отправителя и ИУПС.
*/

int parseData(int[] thisPacket) {


int result = -1; // Если не получаем результата,
// обозначаем это посредством -1.

// Проверяем, что имеем достаточно места в пакете


// для чтения данных:
if (thisPacket.length > 6) {
// Считываем адрес. Это двухбайтное значение,
// поэтому складываем два байта таким образом:
address = thisPacket[5] + thisPacket[4] * 256;
// Получаем ИУПС:
result = thisPacket[6];
}
return result;
Как узнать местонахождение (почти) чего угодно 331

► ► Рис. 8.6. Вывод программы определения уровня


полученного сигнала

Мощность радиосигнала измеряется в де­


цибелах на милливатт (дБм). Возможно, вам
кажется странным, что значение мощности сигнала
отрицательное: -66 дБм. Как это мощность может
быть отрицательной? Ответ заключается в логариф­
мическом взаимоотношении между милливаттами
мощности и дБм. Чтобы получить дБм, нам нужно
взять логарифм милливатт. Например, 1 милливатт
мощности принятого сигнала равняется log 1 дБм.
Поскольку log 1 = 0, то 1 мВ = 0 дБм. Когда мощ­
ность сигнала опускается ниже 1 мВ, уровень дБм
опускается ниже 0. Например, 0,5 мВ = (log 0,0005)
дБм или -3,01 дБм. Другой пример: 0,25 мВ =
с минимальной мощностью -92 дБм. Радиомодули
(log 0,00025) дБм, или -6,02 дБм.
Bluetooth и Wi-Fi обычно обладают чувствитель­
Если у вас возникают затруднения с логарифмами, ностью в этом диапазоне. В идеальном мире, без
просто помните, что 0 дБм — это максимальная каких бы то ни было препятствий на пути распро­
мощность, то есть мощность сигнала начинается странения сигнала, взаимоотношение между мощ­
от 0 дБм и может идти только вниз. Используемые ностью сигнала и расстоянием определяла бы лога­
нами радиомодули ХВее могут принимать сигнал рифмическая кривая.

^ Проект 18
Определение уровня полученного сигнала
с помощью радиомодуля Bluetooth
Модули Bluetooth, с которым мы работали в главах2 и 6, также могут выдавать показания мощ­
ности принимаемого сигнала. Для этого радиомодуль должен иметь установленное подклю­
чение с другим радиомодулем Bluetooth. Проще всего подключить радиомодуль Bluetooth
к компьютеру можно способом, предложенным в проекте 4 главы 2.

Подсоединив радиомодуль Bluetooth к компьютеру, RSSI=ff,ff


откройте последовательное подключение к нему RSSI=ff,ff

через Bluetooth. Установив подключение, переклю­


чите радиомодуль из режима данных в командный Это значения уровня мощности сигнала в шестнад­
режим, выполнив команду: цатеричном формате. Значение ее означает самый
мощный сигнал, а оо — самый слабый. Первое из
$$$ двух значений определяет качество текущего сиг­
Модуль ответит строкой: cmd. Тогда выполните нала, а второе — самое низкое значение, получен­
команду: ное на данный момент. По мере приближения или
удаления передатчика от приемника эти значения
L\r
будут меняться так же, как они менялись и в слу­
Модуль ответит следующими строками: чае с радиомодулем ХВее из предыдущего проекта.
332 Глава 8

Чтобы выйти из режима измерения уровня приня- А чтобы выйти из командного режима, выполните
того сигнала, снова выполните команду: команду:
1Лг ---- \ г

Множественное отражение сигнала


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

Настоящий
радиомаяк

Рис. 8.7. Эффект множественного отражения сигнала. Отраженные радиоволны создают эффект фантомных
радиомаяков, которые приемник не может отличить от настоящего радиомаяка. Это вызывает ошибки в
вычислениях, основанных на уровне мощности сигнала
Как узнать местонахождение (почти) чего угодно 333

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

ё£ Определение местонахождения
методом трилатерации
Определение расстояния предоставляет информацию о том, как далеко находится объект от
точки, из которой выполняется определение, в одном измерении, но не предоставляет полной
информации о местоположении объекта. Расстояние между исходной точкой и целевым объ­
ектом определяется кругом с центром в исходной точке (или сферой — в случае трех измере­
ний). Наш объект может находиться в любой точке этого круга.
Поэтому, чтобы определить местонахождение объ­ Добавив третье расстояние, мы получим третий круг
екта в двух- или трехмерном пространстве, нам тре­ и точное местонахождение объекта на пресечении
буется знать больше, чем только расстояние. Чаще всех трех кругов. В похожем методе определения
всего местонахождение объекта определяется из­ местонахождения, называющемся триангуляцией,
мерением расстояния до него, по крайней мере, из используются две точки, местонахождение которых
трех точек. Этот метод называется трилатерацией. известно. Местоположения объекта рассчитывается
Если измерить расстояние до объекта с двух точек, с использованием углов треугольника, создаваемо­
мы получим две возможные точки, где объект мо­ го этими точками и точкой, местоположение кото­
жет находиться в плоскости (рис. 8.8). рой мы хотим определить.

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


объекта (слева). Расстояние до объекта от двух точек сужает местонахождение объекта до двух точек (в центре).
А расстояние до объекта с трех точек определяет точное местонахождение объекта в одной точке плоскости (справа)
334 Глава 8

В глобальной системе определения местоположе­ разницы во времени между передачей и приемом.


ния GPS7 используется трилатерация на основе Большинство приемников GPS используют сиг­
сети спутников Земли. Местоположение каждо­ нал минимум от шести спутников, чтобы миними­
го из спутников можно определить по траектории зировать ошибки определения местоположения.
его полета и текущему времени. Каждый спутник Системы определения местонахождения мобиль­
передает сигнал времени своих часов, который при­ ных телефонов, такие как Wireless Е911, вычисля­
нимается приемниками GPS. Когда приемник по­ ют приблизительное местонахождение телефонов
лучает сигнал как минимум от трех спутников, он подобным образом, измеряя расстояние от антенн
может вычислить свое местонахождение на основе нескольких базовых станций на основе разности
7 GPS, Global Positioning System — глобальная система пози­ времени между моментами прихода сигналов от
ционирования. этих антенн.

46 Проект 19
Чтение последовательного протокола GPS
Как уже отмечалось ранее, пользователям системы GPS не требуется самостоятельно выпол­
нять вычисления трилатерации, поскольку это делает сам приемник GPS, который выдает поль­
зователю его местоположение в виде географических координат (широты и долготы). В систе­
ме GPS используются несколько протоколов для приемников, но самым распространенным из
них является протокол NMEA 0183, разработанный ассоциацией NMEA8 США. Практически все
приемники GPS на рынке предоставляют данные по этому протоколу, а также обычно еще по
одному или двум другим протоколам.
Последовательный протокол NMEA 0183 работает
со скоростью 4800 битов в секунду, слово состоит Требуемые компоненты
из 8 битов, проверка на четность не производится,

►Беспаечная макетная плата, 1 шт.
имеется один столовый бит (формат 4800-8-N-1).
Большинство приемников выдают данные, исполь­ ►
►GPS-приемник ЕМ-406А, 1 шт.
зуя уровни RS-232 или TTL. Задействованный в ►
►Интерфейсный кабель для GPS-приемника,
нашем примере приемник US GlobalSat ЕМ-406а 1 шт.
выдает данные в формате NMEA, используя уровни
TTL 5 В. ►
►Штыревой соединитель, 12 шт.

В этом проекте мы подключим приемник GPS ►


►Модуль Bluetooth Mate, 1 шт.
к радиомодулю Bluetooth Mate. Но прежде нам ►
►Регулятор напряжения 5 В, 1 шт.
нужно согласовать их скорости, установив ско­
рость передачи данных для модуля Bluetooth Mate
в 4800 битов в секунду. Для этого подсоедините Радиомодуль ответит строкой: cmd. Затем выполни­
модуль Bluetooth Mate к компьютеру через адап­ те команды:
тер USB/TTL-Serial и подключитесь к нему в про­
SU,4 8 \ г
грамме терминала последовательной связи (типа
R ,l\r
CoolTerm или PuTTY) на скорости 115 200 битов в
секунду (мы этим занимались в проекте 4 главы 2). Первая команда установит скорость передачи дан­
Затем переключите терминал в командный режим, ных в 4800 бит/с, а вторая — перезагрузит модуль
выполнив в терминале команду с новыми настройками. Теперь радиомодуль можно
подключить к модулю GPS. Схема этого подключе­
$$$ ния показана на рис. 8.9.
NMEA, National Marine Electronics Association — Национальная ассоциация морской электроники.
Как узнать местонахождение (почти) чего угодно 335

Регулятор Рис. 8.9. Схема


напряжения подключения приемника
7805 GPS ЕМ-406А
к радиомодулю Bluetooth:
а — монтажная;
б — принципиальная.
Для того чтобы
получить настоящий
сигнал GPS, нужно быть
вне помещения, что
объясняет использование
беспроводной передачи
данных и батарейного
источника питания

Добавьте развязывающие конденсаторы


Если ваш источник питания не выдает стабильное на­
пряжение, добавьте развязывающие конденсаторы на
входной и выходной стороне регулятора, как в других
проектах с его использованием.
336 Глава 8

Данные GPS будут передаваться по каналу Blue­ Тем самым вы добавите в список последователь­
tooth на персональный компьютер с исполняющей­ ных портов порт для используемого радиомодуля
ся на нем программой Processing. Если вы еще не Bluetooth Mate. В программе терминала последова­
выполнили сопряжение используемого радиомо­ тельной связи подключитесь к этому порту. В окне
дуля Bluetooth Mate с компьютером, сделайте это терминала начнут выводиться примерно такие дан­
сейчас, следуя инструкциям проекта 3 из главы 2. ные в формате протокола NMEA:
$GPGGA,180226.000,4040.6559,N,07358.1789,W,1,04,6.6,75.4,М, -34.3,М,,0000*5В
$GPGSA,A,3,12,25,09,18,,,,,,,,,6.7,б.6,1.0*36
$GPGSV,3,1,10,22,72,171,,14,67,338,,25,39,126,39,18,39,146,35*70
$GPGSV,3,2,10,31,35,228,20,12,35,073,37,09,15,047,29,11,09,302,20*7D
$GPGSV,3,3,10,32,04,314,17,27,02,049,15*73
$GPRMC,180226.000,A,4040.6559,N,07358.1789,W,0.29,290.90,220411,,*12
$GPGGA,180227.000,4040.6559,N,07358.1789,W,1,04,6.6,75.4,M, -34.3,M,,0000*5A
$GPGSA,A,3,12,25,09,18,,,,,,,,,6.7,6.6,1.0*36
GPRMC,180227.000,A,4040.6559,N,07358.1789,W,0.30,289.06,220411,,*1C

В протоколе NMEA используется несколько типов пятибуквенный идентификатор типа предложения.


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

ПИ Рассмотрим для примера сле­ $GPRMC,155125.000,А,4043.8432,N,07359.7654,W,0.10,11.88,200407,, *20


дующее предложение:
Таблица 8.7. Информация, содержащаяся в предложении протокола NMEA
Сокращение ЯМС9 в идентифи­ Идентификатор сообщения SGPRMC
каторе типа предложения означа­ Время 155125.000 или 15:51:25 GMT10
ет, что это предложение содержит Состояние данных А = действительные (V = недей­
минимальные рекомендуемые (действительные или нет) ствительные)
специфичные данные спутника Широта 4043.8432 или 40°43.8432’
глобальной системы навигации. Индикатор юга/севера N = Север (North), S = Юг (South)
Эти данные предоставляют ба­ Долгота 07359.7654 или 73°59.7654’
зовую информацию, которая мо­ Индикатор востока/запада W = Запад (West), Е = Восток (East)
жет требоваться почти любому Скорость относительно 0,10 узла
приложению. Информация, со­ поверхности (земли)
держащаяся в таком предложе­ Направление движения 11,88° с Севера
относительно поверхности земли
нии, показана в табл. 8.1.
Дата 200407 или 20 апреля, 2007 г.
Магнитное склонение нет
Режим нет
Контрольная сумма (Перед контроль­ *20
ной суммой нет запятой. Последняя
запятая в таком предложении не перед
контрольной суммой, а между магнит­
ным склонением и режимом, которые
в этом предложении отсутствуют.

RMC, Recommended Minimum specific. 10 GMT, Greenwich Mean Time — среднее время по Гринвичу.
Как узнать местонахождение (почти) чего угодно 337

Использование протокола NMEA в программе со­ Дополнительное упражнение


стоит просто в определении, какое предложение По выводу (см. рис. 8.10) определите, где я находил­
предоставляет нам требуемую информацию, считы­ ся, когда писал эту главу. Спасибо читателю Дерику
вании данных через последовательный канал связи О’Брайену (Derrick O’Brien), который в первом издании
и преобразовании полученных данных в значения, книги обнаружил ошибку в моих вычислениях и позна­
комил меня с замечательным примером по обработке
которые можно использовать. В большинстве слу­ данных GPS с помощью Processing, который можно за­
чаев предложение типа RMC предоставляет все не­ грузить по ссылке http://bodytag.org/p5gps/p5gps.pde.
обходимые данные о местоположении. Это позволило мне откорректировать мой пример для
данного издания, что делает задачу определения моего
Следующий скетч Processing считывает предло­ местонахождения более легкой.
жение NMEA через последовательный канал дан­
ных и разбирает его, извлекая время, дату, широ­
ту, долготу и направление движения. Он получает
основную информацию из предложения SGPRMC,
информацию о спутниках в области видимости —
из предложения типа SGPGSV, а количество спут­
ников, использованных для определения местона­
хождения, — из предложения типа SGPGGA. Для
указания направления движения скетч рисует в сво­
ем окне стрелку. Пример вывода скетча показан на
рис. 8.10. (Убедитесь, что при открытии последова­
тельного порта вы открываете действительно порт
для Bluetooth!)

Рис. 8.10. Вывод скетча Processing GPS parser

определение /*
GPS parser
местонахождения
Контекст: Processing
Сначала, как обычно, определяем
глобальные переменные: Эта программа принимает в виде ввода последовательные данные
приемника GPS NMEA 0183 и извлекает дату, время,
широту и долготу из предложения GPRMC.
*/

/ / Импортируем библиотеку s e r i a l
im port p r o c e s s i n g .s e r i a l .* ;

Serial myPort; // Последовательный порт


float latitude = 0.0; // Показания широты в градусах
String northSouth = «N»; // Север или юг?
float longitude = 0.0; // Показания долготы в градусах ►►
338 Глава 8

ш String eastWest = "W"; // Восток или запад?


float heading = 0.0; // Направление движения в градусах

int hrs, mins, secs; // Единицы времени


int currentDay, currentMonth, currentYear;

int satellitesInView = 0 ; // Кол-во спутников в области


// видимости
int satellitesToFix = 0 ; // Кол-во спутников, использованных
// для вычисления местоположения

float textX = 50; // Размещение текста на экране

float textY = 30;

т Метод setup о устанавливает void setup() {


размер окна, определяет пара­ size (400, 400); // Размер окна
метры прорисовки и открывает
последовательный порт: // Параметры прорисовки:
noStroke();
smooth();

// Выводим на экран все доступные последовательные порты


println(Serial.list());

// Открываем порт, используемый для модуля Bluetooth.


// Этот порт может находиться в конце списка
// последовательных портов.
// Замените выделенный жирным шрифтом номер порта на номер
// порта, используемый вашим устройством Bluetooth.
String portName = Serial.list()[6];
myPort = new Serial(this, portName, 9600);

// Считываем байты в буфер, пока не дойдем до символа


// возврата каретки (ASCII 13):
myPort.bufferUntil('\r');

СГ М етод draw () выводит дан­ void draw() {


ные в окне скетча и вызывает м е­ // Темно-синий фон:
тод drawArrow () ДЛЯ ПрорИСОВКИ background(#0D1133);
стрелки в круге:
// Светло-синий текст:
fill (#A3B5CF) ;

// Помещаем весь текст в одну длинную строку:


// Выводим дату и время из предложения GPS в формате
// ММ/ДЦ/ГГГГ, Ч Ч :М М :СС GMT
// Все числа форматируются функцией nf() как 2-х или
// 4-х цифровые.
String displaystring = nf(currentMonth, 2)+ «/»+ nf(currentDay,
2) + «/»+ nf(currentYear, 4) + «, « + nf(hrs, 2)+ «:» +
Как узнать местонахождение (почти) чего угодно 339

т // Выводим местоположение из предложения GPS:


displaystring = displaystring + latitude + « « + northSouth +
«, « + longitude + « « + eastWest + «\п»;

// Выводим направление движения:


displaystring = displaystring + «heading « + heading +
« degrees\n»;

// Выводим информацию о спутниках:


displaystring = displaystring + «satellites in view: « +
satellitesInView + «\п»;
displaystring = displaystring + «satellites used to calculate
position: « + satellitesToFix;
text(displaystring, textX, textY);

// Рисуем стрелку, используя значение heading:


drawArrow(heading);
}
D T Метод drawArrow () вызыва­ void drawArrow (float angle) {
ется из метода draw о и рисует // Перемещаем все, что мы будем рисовать далее, таким образом,
стрелку в круге: // чтобы координаты (0,0) были в центре окна:
translate(width/2, height/2);

// Рисуем светло-синий круг:


fill (80, 200,230) ;
ellipse(0,0,50,50);
// Делаем стрелку черной:
fill (0);
// Поворачиваем стрелку в соответствии с направлением
// движения:
r o t a t e ( r a d ia n s ( a n g le ) );

// Рисуем стрелку с центром в (0,0):


triangle(-10, 0, 0, -20, 10, 0);
rect (-2,0, 4,20);

Ш Метод seriaiEvent о получает void seriaiEvent(Serial myPort) {


все входящие данные как обычно // Считываем данные из последовательного буфера:
И Передает ИХ Методу parseString (). String myString = myPort.readStringUntil(1\n');
Метод parsestring () разбивает // Если есть какие-либо байты иные, чем перевод строки
// выполняем разборку:
полученную строку на все ча­
if (myString != null) {
сти предложения GPS. Он пере­
print(myString);
дает входящие предложения для
parseString(myString);
обработки соответствующим
методам: getRMCO, getGGA () И
getGSv (). Если бы мы создавали
более универсальный парсер, то void parseString (String serialstring) {
написали бы подобные методы // Разбиваем строку по запятым:
для каждого типа предложения: String items[] = (split(serialstring, ','));
340 Глава 8

т и
и
Если первая часть является идентификатором, выполняем
разборку остального:
if (items[0].equals("$GPRMC")) {
// $GPRMC дает время, дату, местоположение, направление
// и скорость
getRMC (items) ;

if (items[0].equals(«$GPGGA»)) {
// $GPGGA дает время, дату, местоположение,
// использованные спутники
getGGA(items);

if (items[0].equals(«$GPGSV»)) {
// $GPGSV дает спутники в области видимости
satellitesInView = getGSV(items);

Ш Метод getRмc () преобразо­ void getRMC(String[] data) {


вывает широту, долготу и другие // Помещаем значения элементов из строки в переменные:
числовые части предложения int time = int(data[1]);
в числа: // Первые две цифры элемента времени — часы:
hrs = time/10000;
// Следующие две цифры элемента времени — минуты:
mins = (time % 10000)/100;
// Последние две цифры элемента времени — секунды:
secs = (time%100);

// Если есть действительное показание, разбираем остальную


// часть:
if (data[2].equals(«А»)) {
latitude = minutesToDegrees (float (data [3])) ;

northSouth = data[4];
longitude = minutesToDegrees (float (data [5])) ;
eastWest = data[6];
heading = float (data [8] );
int date = int(data[9]);
// Последние две цифры даты — год. Добавляем 2000,
// чтобы получить должный формат:
currentYear = date % 100 + 2000;
// Средние две цифры даты — месяц:
currentMonth = (date % 10000)/100;
// Последние две цифры даты — день:
currentDay = date/10000;



Как узнать местонахождение (почти) чего угодно 341

Ш Метод getGGA () разбирает ча­ void getGGA(String[] data) {


// Помещаем значения элементов из строки в переменные:
сти предложения $ОРООА. Не­
int time = int(data[1]);
которая информация этого пред­
// Первые две цифры элемента времени — часы:
ложения такая же, как и в предло­
hrs = time/10000;
жении $СРБ1МС, но информация
// Следующие две цифры элемента времени — минуты:
о количестве спутников, исполь­
mins = (time % 10000)/100;
зованных для определения ме­
// Последние две цифры элемента времени — секунды:
стонахождения, — новая. ecs = (time % 100);

// Если есть действительное показание, разбираем


// остальную часть:
if (data[6].equals(«1»)) {
latitude = minutesToDegrees (float (data [2] ));
northSouth = data[3];
longitude = minutesToDegrees (float (data [4] ));
eastWest = data[5];
satellitesToFix = int(data[7]);
}

ш Метод getGSV () разбирает ча­ int getGSV(String[] data) {


сти предложения ЗСРОБУ. Он int satellites = int(data[3]);
возвращает одно целое число — return satellites;
количество спутников в области }
видимости:

ШГ Наконец, метод minutesToDe­ float minutesToDegrees (float thisValue) {


grees () используется как методом // Получаем целую часть градусов:
getRMC (), так И методом getGGA (). int wholeNumber = (int)(thisValue / 100);
Протокол NMEA предоставляет // Получаем дробную часть и преобразовываем минуты
информацию о широте и долготе / / в десятичную дробь:

в формате ггмм.мммм, где гг озна­ float fraction = (thisValue - ( wholeNumber ) * 100) / 60;
// Объединяем обе части и возвращаем результат:
чает градусы, а мм.мммм — мину­
float result = wholeNumber + fraction;
ты. Таким образом, метод преоб­
return result;
разовывает минуты в десятичную
долю градусов: }

При исполнении этого скетча определение перемещаются, поэтому, если у вас не удается по­
местоположения может занять несколько лучить местоположение сразу, подождите с полчаса
минут. Разным приемникам GPS требуется разное и повторите попытку.
время, чтобы определить местоположение при пер­
вом запуске или после перемещения в новое место. Многие современные мобильные телефоны осна­
Поэтому установите свой приемник в таком месте, щены приемником GPS и, вроде бы, принимают
где небо видно полностью, и наберитесь терпения. сигнал почти всегда, что может заставить вас заду­
Обратите также внимание на количество спутни­ маться — почему ваш приемник не может настро­
ков в области видимости. Если их меньше, чем ится на сигнал также быстро. Следует помнить, что
четыре, ваш приемник может испытывать пробле­ для определения местоположения мобильные теле­
мы с определением местоположения. Но спутники фоны обычно используют как GPS, так и антенны
342 Глава 8

базовых станций сети. Поэтому, если они не могут несколькими другими протоколами GPS, а также с
получить сигнал от достаточного количества спут­ инструментами для использования этих протоколов
ников, они обычно определяют свое местополо­ при прокладке маршрутов и определении место­
жение относительно ближайших базовых станций положения. Но протокол NMEA хорош тем, что он
и используют эту информацию, чтобы предоста­ применяется практически во всех приемниках GPS.
вить вам приблизительные координаты. Независимо от того, какой другой протокол они мо­
гут использовать, все они, как правило, работают
Протокол NMEA 0183 является только одним из по протоколу NMEA. Поэтому будет полезно знать
многих протоколов, используемых для получе­ этот протокол, независимо от того, какими инстру­
ния данных GPS. В главе 11 мы познакомимся с ментами GPS вы пользуетесь.

=Щ1 Выбор оборудования GPS


На рынке наличествует широкий ассортимент На рис. 8.11 представлены несколько рекоменду­
приемников GPS, что может затруднить выбор емых приемников GPS. Фотографии предостав­
модуля, подходящего для выполнения требуемой лены компанией SparkFun. Мои благодарности
задачи. Далее приводится несколько рекоменда­ студентам курса Wildlife Tracking11 2011 года за
ций, которые могут помочь вам сделать требуе­ их подтверждение моих тестов.
мый выбор.
Большинство распространенных приемников
GPS взаимодействуют с микроконтроллером по­
средством последовательного канала с уровнями
TTL по протоколу NMEA 0183. Поэтому, в плане

подключения их к микроконтроллеру и чтению
их данных, они, по большому счету, равнознач­
ны. Различаются эти модули, в основном, тем, а б
насколько хорошо они принимают сигнал GPS,
что определяется количеством принимаемых
ими каналов (обычно, чем больше, тем лучше),
типом используемой в них антенны (обычно, чем
больше, тем лучше) и их уровнем энергопотреб­
ления. Лично я предпочитаю приемник ЕМ-406а,
использованный в этом проекте, так как он обла­
дает хорошим приемом, быстро определяет ме­ в г
стоположение и всегда проявлял себя наиболее
Рис. 8.11. Рекомендуемые приемники GPS:
надежным по сравнению с другими, с которыми я
имел дело. Но есть и другие хорошие приемники. а — GPS-приемник ЕМ-406а. 20 каналов, хороший
прием, не такой дорогой, как другие варианты;
Найти их вам поможет хороший справочник по
выбору приемника GPS на веб-сайте компании 6 — GPS-приемник D2523T. 50 каналов,
замечательный прием, но более дорогой;
SparkFun.
в — GPS-приемник LS20126. Антенна у него очень
Все, что необходимо для подсоединен™ прием­ маленькая, но на открытой местности работает он
ника GPS к микроконтроллеру, — это разъем по­ прилично;
следовательной связи и питание: плюс и минус г — модуль GPS MiniMod с приемником
(«земля»). Существуют шилды для подсоеди­ GR10/ MN1010. Самый маленький из всех, который
нения приемника к модулю Arduino, но без них я смог найти. Требует много времени, чтобы поймать
можно и обойтись, так как все, что требуется, — сигнал.
это три провода. 11 Слежение за животным миром.
Как узнать местонахождение (почти) чего угодно 343

й& Определение направления


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

4$ Проект 20

Определение направления с помощью цифрового компаса


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

Требуемые компоненты В этом проекте задействован цифровой компас


компании STMicroelectronics модели LSM303DLH.

►Беспаечная макетная плата или шилд
Адаптерные платы для него можно приобрести
для прототипов, 1 шт.
в компании SparkFun или Pololu. Здесь использова­

►Модуль Arduino, 1 шт. лась версия от Pololu, так как она имеет встроен­
ный переключатель напряжения и работает лучше

►Цифровой компас, модель LSM303DLH
от питания напряжением 5 В.
компании STMicroelectronics, 1 шт.

►Сенсорная кнопка со светодиодом, 1 шт. Компас измеряет мощность магнитного поля по
В этом проекте используется сенсорная трем координатам, он также оснащен встроенным
кнопка от компании SparkFun, оснащенная трехкоординатным акселерометром, компенсирую­
встроенным светодиодом, но можно щим воздействие наклона. Показания компаса пре­
использовать любую кнопку и любой доставляются в виде синхронного последователь­
светодиод. ного потока данных через разъем I2C с использова­
нием библиотеки Wire. На рис. 8.12 показана схема

►Сопротивление 220 Ом, 1 шт.
подсоединения компаса к плате Arduino.

► Сопротивление 10 К, 1 шт.
Этот компас нужно калибровать, поэтому схема

►Штыревой соединитель, 13 шт.
проекта содержит кнопку для переключения между
калибровочным и рабочим режимами и светодиод
для индикации режима калибровки.
344 Глава 8

AREF
Reset GND
+3 3V D13
+5V D12
Gnd D11/PWM
Gnd D10/PWM
Т Vin D9/PWM
. . D8
Модуль
INT2
Arduino
INT1 D7
220 0м
DRDY D6/PWM
SDA Analogo D5/PWM
Модуль компаса SO ­ A1 D4
LSM303DLH A2 D3/PWM
GNO
VIN A3 D2
3V A4 Digital1/TX
1V8 A5 DigitalO/RX

Рис. 8.12. Подключение компаса LSM303DLH к модулю Arduino: а — монтажная схема; б — принципиальная

Калибровка компаса
Для калибровки компаса переключите его в режим калибровки и медленно
проверните на 360 градусов на плоской ровной поверхности. В процессе
калибровки компаса необходимо точно знать направления на основные сто­
роны света. Для этого воспользуйтесь обычным магнитным компасом, убе­
дившись, что он работает должным образом. Калибровку следует выпол­
нять вдали от электронного оборудования и прочих источников магнитных
полей (за исключением земного). Например, в моем офисе обычные компа­
сы имеют склонность показывать на запад-юго-запад, поэтому я выполняю
калибровку цифрового компаса снаружи, подавая питание на всю схему от
батареи. А для калибровки акселерометра модуль нужно покрутить через
все возможные координаты.
Как узнать местонахождение (почти) чего угодно 345

Компас работает от напряжения 5 В постоянного Для взаимодействия с компасом по протоколу I2C


тока. Назначения его выводов следующие: следующий скетч использует библиотеку Wire.
Эта библиотека включена в состав другой биб­
1. 1V8 — вывод 1,8 В. Этот вывод не будет ис­ лиотеки —LSM303DLH, разработанной Райаном
пользоваться. Муллиганом (Ryan Mulligan) из компании Pololu.
2. 3V — вывод 3 В. Этот вывод не будет исполь­ Я модифицировал эту библиотеку, добавив в нее
зоваться. несколько дополнительных функций. Загрузить
ее можно по ссылке http://github.com/tigoe/
3. Vin — входящее напряжение 5 В. Подсоедините
LSM303DLH. Загрузите версию библиотеки 1.1.0
эту линию к линии 5 В микроконтроллера.
(самая последняя версия на момент подготовки
4. GND — общий («земля»). Подсоедините эту этой книги) и поместите папку LSM 303D LH в под­
линию к линии GND микроконтроллера. папку libraries в папке Arduino. Обратите внимание,
5. SCL — сигнал последовательного тактиро­ что загружаемая папка содержит вложенную папку
вания. Подсоедините эту линию к линии SCL LSM 303D LH . Копировать нужно именно эту вло­
микроконтроллера (аналоговый вывод 5). женную папку.
6. SDA — последовательные данные. Подсоеди­
ните эту линию к линии SDA микроконтролле­ В скетче используется также библиотека Button
ра (аналоговый вывод 4). разработки Александра Бревига (Alexander Brevig),
текущую версию которой для плат Wiring можно
7. DRDY — индикатор готовности данных: вы­
загрузить по адресу http://wiring.uniandes.edu.co/
дает 1,8 В, когда компас готов к чтению. Этот
source/trunk/wiring/firmware/libraries/Button, а для
вывод не будет использоваться.
плат Arduino — по адресу http://github.com/tigoe/
8. INT1 — прерывание 1. Этот вывод не будет ис­ Button. Скопируйте папку этой библиотеки так же
пользоваться. в папку libraries. Поместив все нужные библиотеки
9. INT2 — прерывание 2. Этот вывод не будет ис­ в папку libraries, перезапустите среду Arduino.
пользоваться.

т Пишем код _____ _ // Включаем в скетч необходимые библиотеки:


#include <Wire.h>
Скетч не содержит никаких гло­ #include <LSM303DLH.h>
бальных переменных, но перед #include <Button.h>
методом setup () нужно включить
в него необходимые библиотеки const int modeButton = 2; // Кнопка для режима калибровки
const int buttonLed = 3; // Светодиод для кнопки
и определить пару констант:
// Инициализируем библиотеку компаса:
LSM303DLH compass;
// Инициализируем кнопку на линии 2:
Button button = Button(modeButton, BUTTON_PULLDOWN);
boolean calibrating = false; // Отслеживаем состояние
// калибровки

ш г Метод setup () инициализи­ void setup() {


рует библиотеки Wire И Serial И // Инициализируем последовательную связь:
включает компас: Serial.begin(9600);
// Настраиваем светодиод кнопки:
pinMode(buttonLed, OUTPUT);
// Инициализируем библиотеку Wire и включаем компас:
Wire.begin();
compass.enable();
} ►

346 Глава 8

USI Основной цикл начинает ра­ void loop() {


боту с проверки кнопки. Если в // Если кнопка изменила состояние, изменяем состояние
настоящее время кнопка нажата // калибровки и светодиода:
и ее состояние изменилось со if(button.isPressed() && button.stateChanged()){
времени последней проверки, calibrating = !calibrating;

скетч выполняет переключение digitalWrite(buttonLed, calibrating);

между рабочим и калибровочным }


режимами. Также изменяется со­
стояние светодиода: включенный
светодиод означает режим кали­
бровки, выключенный — рабо­
чий режим:

EOTВ режиме калибровки скетч // Если в режиме калибровки, выполняем калибровку:

постоянно вызывает метод if (calibrating) {

calibrate о ДЛЯ калибровки КОМ- compass.calibrate ();

паса. В рабочем режиме скетч }


else { // Если в рабочем режиме, считываем и выводим показания:
считывает показания компаса и
compass.read() ;
выводит на экран результаты.
int heading = compass.heading();
Затем выдерживается пауза дли­
Serial, println («Направление: « + String (heading) + « градусов»);
ной в 100 миллисекунд, чтобы
}
позволить компасу стабилизиро­ delay(100);
ваться, и процесс повторяется:

Запустите скетч на исполнение,


откройте монитор порта, а затем
переведите компас в режим кали­
бровки, нажав кнопку. В течение
секунды-двух крутите компас на
горизонтальной поверхности,
делая полные круги, а затем вра­
щайте его во всех трех координа­
тах в течение нескольких секунд.
Затем нажмите кнопку, чтобы пе­
ревести компас в рабочий режим,
и он должен начать выводить по­
казания направления. Ноль гра­
дусов означает северное направ­
ление, 180 — южное, 90 — вос­
точное, а 270 — западное.
Как узнать местонахождение (почти) чего угодно 347

« I Введение в интерфейс I2C


Компас LSM303DLH использует вариант син­ низкий (что называется задним фронтом или от­
хронного последовательного интерфейса I2C12. рицательным перепадом) бит данных передается
Этот интерфейс также носит название TWI13 и от устройства I2C микроконтроллеру.
представляет собой альтернативу другому весьма В отличие от интерфейса SPI, интерфейсу I2C не
распространенному синхронному последователь­ требуется линия выбора схемы. Каждое устрой­
ному интерфейсу SPI, с которым мы познакоми­ ство имеет свой уникальный адрес, и главное
лись в главе 4. устройство начинает обмен, посылая адрес
Сходство интерфейсов I2C и SPI состоит в том, устройства, с которым оно хочет взаимодейст­
что I2C также использует один тактирующий (син­ вовать.
хронизирующий) сигнал на основном устройстве Таким образом, интерфейс I2C реализуется всего
для синхронизации взаимодействующих через лишь двумя линиями (шиной) между контролле­
него устройств. Каждое устройство I2C задей­ ром (или ведущим устройством) и периферийным
ствует для передачи и приема данных две линии: (или ведомым) устройством:
линию последовательного тактирующего сигнала
• л и н и я та к т и р о в а н и я (SCL) — линия, на ко­
SCL14, на которую микроконтроллер выдает им­
торую ведущее устройство подает регулярные
пульсы тактирования (синхронизации), и линию сигналы тактирования;
данных SDA15, по которой передаются данные.
На каждый импульс тактирования передается • Л и н и я д а н н ы х (SDA) — линия, по которой
или принимается один бит данных. При переходе передаются данные в обоих направлениях.
уровня импульса тактирования с низкого на высо­
Все устройства, использующие интерфейс I2C,
кий (что называется передним фронтом или по­
могут общаться между собой по шине, состоящей
ложительным перепадом) бит данных передается из этих двух линий.
от микроконтроллера устройству I2C. А при пере­
ходе уровня импульса тактирования с высокого на Библиотека Arduino Wire предоставляет про­
граммный интерфейс для шины I2C. На большин­
1212C, Inter-Integrated Circuit — межсхемный интерфейс инте­ стве плат Arduino линия SDA — это линия анало­
гральных схем.
13 TWI, Two-Wire Interface — двухпроводной интерфейс.
гового ввода 4, а линия SCL — линия аналогового
14 SCL, Senal CLock — последовательный тактирующий сигнал. ввода 5. Только на плате Arduino Mega для SDA
15 SDA, Serial DAta — последовательные данные. задействована линия 20, а для SCL — линия 21.

Проект 21

Определение положения в пространстве с помощью акселерометра


Курс по компасу — это прекрасный способ определить направление, когда мы находимся на
поверхности Земли. Но если вы когда-либо использовали обычный компас, то должны знать,
насколько важно держать его строго горизонтально, чтобы получить правильные показания.
В области навигации наклон объекта относительно земной поверхности называется отклоне­
нием. Различают две основные его разновидности: крен — отклонение объекта из стороны в
сторону вокруг продольной его оси, и тангаж — отклонение объекта вверх-вниз вокруг его
поперечной оси.
348 Глава 8

Крен и тангаж — это только два вида отклонения


объекта в пространстве от нормального положения. Требуемые компоненты
Так, отклонение объекта из стороны в сторону во­ ►
►Беспаечная макетная плата или шилд для
круг вертикальной его оси называется рысканием. прототипов, 1 шт.
Крен, тангаж и рыскание определяют вращатель­
ные движения объекта относительно осей X, Y и Z, ►
►Модуль Arduino, 1 шт.
соответственно. Эти движения так и называются — ►
►Акселерометр ADXL320 компании Analog
вращениями. А поступательные движения вдоль Devices, 1 шт. Можно также взять акселеро­
этих осей называются продольным смещением, бо­ метр на цифровом компасе LSM303DLH из
ковым смещением и вертикальным смещением со­ предыдущего проекта. Для него используется
ответственно. Все эти шесть движений демонстри­ альтернативный скетч.
руются на рис. 8.13.

►Штыревой соединитель, 6 шт.
Крен и тангаж относительно легко измерить с по­
мощью акселерометра. Мы уже использовали аксе­
лерометр в главе 5 в клиенте балансировочной до­ Для проекта можно взять акселерометр АБХЬ335
ски сетевого пинг-понга. Акселерометры измеряют (версия от компании Абайпй показана на рис. 8.14),
изменения в ускорении (акселерации). Внутри ак­ другой аналоговый акселерометр или же акселеро­
селерометра находится крошечный грузик, который метр компаса ЬБМЗОЗБЬН, который мы использо­
может свободно перемещаться в одном, двух или вали в предыдущем проекте.
трех измерениях. Когда акселерометр наклоняется Разные акселерометры имеют различные интерфей­
относительно поверхности земли, действующая на сы. Акселерометр на модуле компаса, который мы
грузик гравитационная сила изменяется. Так как задействовали в предыдущих проектах, совмест­
сила равна массе, умноженной на ускорение, и по­ но с магнитометром использует шину 12С. Другие
скольку масса грузика акселерометра постоянная, акселерометры работают через интерфейс ШИМ.
изменение этой силы фиксируется как изменение А многие просто выдают данные для каждой ко­
ускорения. В этом проекте мы воспользуемся ак­ ординаты на отдельный аналоговый вывод, как это
селерометром для управления тангажем и креном делает акселерометр на рис. 8.14. У разных аксе­
диска на экране в программе Processing. Числовые лерометров также и различные разрешения. Для
значения из датчика будут передаваться на диск, многих аспектов человеческой деятельности впол­
и он станет наклоняться соответствующим образом. не достаточно 3-6 g (до шестикратного ускорения

Крен
г*
Продольное v
смещение %

Рыскание s
Тангаж
ì

Вертикальное \\
смещение Боковое
смещение

Рис. 8.13. Вращения и смещения тела в трех измерениях


Как узнать местонахождение (почти) чего угодно 349

AREF
Reset GND
+3.3V D13
+5V D12
Gnd D11/PWM
Gnd D10/PWM
Vin D9/PWM
D8
Модуль
Arduino
TST D7
3V D6/PWM

Акселерометр X Analogo D5/PWM


ADXL335 Y A1 D4
Z A2 D3/PWM
GND A3 D2
A4 Digitali/TX
A5 DigitalO/RX

Рис. 8.14. Подключение акселерометра ADXL335


к модулю Arduino:
а — монтажная схема; б — принципиальная.
Здесь показана адаптерная плата компании Adafruit для акселерометра ADXL335. Этот акселерометр работает от
напряжения питания 3,3 В, поэтому напряжение выдаваемого сигнала показаний также в диапазоне от 0 до 3,3 В.
Аналоговая линия опорного напряжения микроконтроллера тоже подключена к 3,3 В, поэтому он «знает», что
максимальное значение его аналоговых входов находится в диапазоне от 0 до 3,3 В

свободного падения, равного приблизительно Если вы используете для этого проекта акселеро­
9,8 метров в секунду за секунду). Большинство ком­ метр на модуле компаса LSM303DLH, подсоедини­
мерческих устройств, использующих акселероме­ те его к модулю Arduino, как показано на рис. 8.12,
тры, — такие как игровая консоль №п1епбо \¥й или но без светодиода и кнопки. Первый из приведен­
массовые мобильные телефоны, имеют акселеро­ ных далее скетчей предназначен для работы с лю­
метры с этим диапазоном измерения. Акселерометр бым двух- или трехкоординатным акселерометром,
АЭХЬ335 также имеет разрешение 3 g. Но в ряде а второй — с акселерометром модуля компаса
случаев могут потребоваться намного большие LSM303DLH. Оба эти скетча взаимодействуют со
пределы измерения. Например, ускорение кулака следующим за ними скетчем Processing.
боксера при ударе может достигать 100 g!
350 Глава 8

Определение тангажа и крена с помощью акселерометра


Трехкоординатные акселерометры, наподобие ис­ Но чтобы определить ускорение на каждой оси, нам
пользуемого нами, измеряют линейное ускорение нужно преобразовать показания, которые мы полу­
тела в каждой координате — иными словами: про­ чаем от команды anaiogRead о . Это не составляет
дольное, боковое и вертикальное смещения тела. большой трудности. Мы уже знаем, что акселеро­
Они не измеряют крен, тангаж или рыскание. Но, метр имеет диапазон измерений от 0 до 3,3 В (так
зная ускорение вдоль каждой координаты, мы мо­ как он работает от источника питания напряжени­
жем вычислить крен и тангаж. Однако для таких вы­ ем 3,3 В), и что этот диапазон напряжений преоб­
числений требуется применения хитроумной триго­ разовывается в числовой диапазон от 0 до 1023.
нометрии. С полным объяснением этих вычислений Поэтому, мы можем сказать, что:
можно ознакомиться в материале по применению напряжение = anaiogRead(axis) * 3.3 / 1024;
акселерометров компании Freescale Semiconductor,
которое можно загрузить в формате PDF по адре­ Точка нулевого ускорения для каждой оси находит­
су http://cache.freescale.com/files/sensors/doc/app_ ся посредине ее диапазона, то есть в районе 1,65 В.
Поэтому отнимем это число от полученного пока­
note/AN3461.pdf. Вкратце же, основы вычислений
зания, при этом отрицательное значение будет озна­
и их процедура заключаются в следующем.
чать наклон в противоположном направлении.
Сила тяжести всегда действует на объект перпен­
Из справочного листка технических данных аксе­
дикулярно поверхности Земли. Поэтому, когда лерометра можно узнать, что его чувствительность
объект наклоняется на некий угол теша (0), часть составляет 300 милливольт на 1 g, где 1 g — это
этой силы действует вдоль оси X объекта, а часть — ускорение силы тяжести. На любую ось, располо­
вдоль оси Y (рис. 8.15). Ускорения вдоль осей X и Y женную перпендикулярно поверхности Земли, дей­
вместе составляют общую силу притяжения, кото­ ствует сила в 1 g, и показания этой оси должны быть
рая вычисляется с помощью теоремы Пифагора по в районе 300#мВ или 0,3 В. Таким образом, ускоре­
формуле х2 + у 2 = z2. ние на каждую ось вычисляется как напряжение по­
Зная это, мы можем вычислить составляющие уско­ казания, разделенное на чувствительность:
рения с помощью тригонометрических функций си­ ускорение = напряжение / 0,3
нуса и косинуса. Составляющая ускорения по осиХ Получив ускорения для каждой оси, можно при­
(Xaxis) равна силе тяжести, умноженной на sin 0, менить рассмотренные ранее тригонометрические
а по оси Y (Yaxis) — силе тяжести, умноженной на формулы, чтобы вычислить тангаж и крен.
cos 0 (вспомним, что синус равен отношению про­
тивоположного катета прямоугольного треугольни­
ка к гипотенузе, а косинус — отношению к гипоте­
нузе прилегающего катета).
Отсюда мы можем вычислить составляющие вдоль
всех трех осей одновременно. Выясняется, что:

Xaxis
Крен —arctg
л/ Yaxis2 + Zaxis2

Yaxis
Тангаж = arctg
V X axis2 + Zaxis2 Рис. 8.15. Вычисление части силы тяжести на основе
угла наклона
Как узнать местонахождение (почти) чего угодно 351

Следующий скетч считывает показания осей X и У переставьте выводы, чтобы они соответствовали
акселерометра, вычисляет тангаж и крен как угол от вашему акселерометру. Кроме этого, если для ваше­
-90° до +90°, а затем отправляет результат по после­ го акселерометра требуется питание напряжением
довательному каналу. Если вы хотите использовать 5 В, также измените должным образом вычисления
этот скетч с акселерометром иным, чем АБХЬ335, с напряжением.

Ш Берем показания
(аналоговый выход) Считыватель акселерометра
Контекст : Arduino
Метод setup () инициализирует
Берет показания для двух осей акселерометра, вычисляет тангаж
последовательную связь и выпол­
и крен и отправляет полученные значения на последовательный
няет настройки аналого-цифро­ порт.
вого преобразователя на взятие */
опорного напряжения с внешней
линии аналогового опорного на­ void setup() {
пряжения. // Инициируем последовательную связь:
Serial.begin(9600);
Работаем с акселерометром // Указываем микроконтроллеру считывать внешнее аналоговое
ADXL320 // опорное напряжение:
analogReference(EXTERNAL);
Этот скетч пригоден для работы с
акселерометром ADXL320 компа­
нии Analog Devices.

□ Метод loop овызывает метод void loop () {


преобра­
readAcceleration () ДЛЯ // Берем показания для осей акселерометра и преобразовываем
зования аналоговых показаний // полученные результаты в значения ускорения:
float xAxis = readAcceleration (analogRead(АО));
в значения ускорения. Затем он
delay(10);
подставляет полученные резуль­ float yAxis= readAcceleration(analogRead(Al));
таты в приведенные ранее три­ delay(10);
гонометрические формулы для float zAxis = readAcceleration(analogRead(A2));
вычисления крена и тангажа и
выводит конечные результаты на // Применяем тригонометрические формулы, чтобы получить
экран: // тангаж и крен:
float pitch = atan(xAxis/sqrt(pow(yAxis,2) + pow(zAxis,2)));
float roll = atan(yAxis/sqrt(pow(xAxis,2) + pow(zAxis,2)));
pitch = pitch * (180.0/PI);
roll = roll * (180.0/PI) ;

// Выводим результаты на экран:


Serial.print(pitch);
Serial.print(«,»);
Serial.println(roll);

ПГ Метод геас!Ассе1ега^оп () float readAcceleration (int thisAxis) {


принимает в виде ввода аналого­ // Нулевое показание акселерометра соответствует половине
вое показание и преобразовывает // его диапазона выходного напряжения,
float zeroPoint = 1.65;
его в значение ускорения от 0 до
// Преобразовываем показание в напряжение:
float voltage = (thisAxis * 3.3 / 1024.0) - zeroPoint;
// Разделяем на чувствительность акселерометра:
float acceleration = voltage / 0.3;
// Возвращаем ускорение в единицах д:
return acceleration;
352 Глава 8

| | | |1 Независимо от используемого акселеромет­ Если вы используете акселерометр на модуле ком­


ра, вы обнаружите, что он не всегда выдает точные паса LSM303DLH из предыдущих проектов, вам по­
показания углов, — уровень шумов может быть везло. Библиотека Arduino для этого акселерометра
достаточно велик. Представленные здесь вычис­ самостоятельно вычисляет тангаж и крен и возвра­
ления предполагают, что кроме силы тяжести на щает готовые результаты. Следующий скетч берет
акселерометр не воздействуют никакие другие эти результаты в виде ввода и возвращает угловые
силы, что не всегда так. При перемещении акселе­ значения от -90° до +90°, так же, как и приведен­
рометра в пространстве его движение ускоряется ный ранее скетч для аналогового акселерометра.
и замедляется, добавляя в вычисления дополни­
тельную силу вдоль всех трех осей. Обычно, чтобы
компенсировать эти сторонние силы, данные аксе­
лерометра объединяются с данными гирометра.

СОГБерем показания /*
Считыватель акселерометра через I2C
(выход I 2 C ) _____ ____ Контекст: Arduino
Считывает показания компаса ЬЗМЗОЗОЬН и выводит на экран
Этот скетч считывает показания
значения осей X и У акселерометра.
для осей X и У акселерометра
ЬБМЗОЗЭЬН и отправляет ре­
зультаты через последователь­ // Включаем в скетч необходимые библиотеки:
ный порт. Так же, как и в пре­ #include <LSM303DLH.h>
дыдущем проекте, здесь исполь­ #include <Wire.h>
зуется библиотека ЬБМЗОЗЭЬН,
// Инициализируем компас:
поэтому обратите внимание, что
LSM303DLH compass;
она должна быть установлена.
void setup () {
Работаем с акселерометром // Инициализируем библиотеки serial и Wire и включаем компас:
ЬБМЗОЗРШ Serial.begin (9600);
Wire.begin();
Этот скетч использует акселе­ compass.enable ();
рометр на цифровом компасе // Выполняем калибровку компаса в течение 5 секунд после
ЬЗМЗОЗОЬН. // запуска:
while (millis() < 5000) {
compass.calibrate();

void loop() {
// Считываем показания компаса и выводим на экран значения
// осей X и У акселерометра:
compass.read();
Serial.print(compass.pitch()); // X axis angle
Serial.print(«,»);
Serial.println(compass.roll()); // Y axis angle
delay(100);

^Подклю чение *

Наклонение акселерометра
Этот скетч Processing считывает Контекст: Processing
получаемые от микроконтролле­ Принимает в виде ввода показания акселерометра и использует их
ра данные и использует их для для установки положения в пространстве диска, отображаемого
изменения пространственного в окне программы.

import processing.serial.*; // Импортируем библиотеку serial ►►


Как узнать местонахождение (почти) чего угодно 353

положения диска в окне про-Т float pitch, roll; // Тангаж и крен


граммы в трех координатах. Он j float position; // Местоположение, в которое
будет работать с любым из двух \ // выполняем перемещение
предыдущих скетчей для чтения j
данных акселерометра, так как J Serial myPort; // Последовательный порт
оба они выдают данные в одном
и том же формате. Но прежде чем
исполнять скетч, убедитесь, что ;
открываемый им последователь- j
ный порт совпадает с номером
порта, к которому подключен
микроконтроллер:
Ш Метод setup о инициализи- : void setup() {
рует окно и последовательное // Устанавливаем размер окна:
size (400, 400, P3D);
подключение, а также устанавли­
// Вычисляем позицию смещения для диска:
вает сглаживание графики: position = width/2;
// Выводим на экран все доступные последовательные порты
println (Serial.list ());
// Открываем порт, используемый микроконтроллером.
// Если необходимо, измените выделенный жирным шрифтом номер
// порта на порт, к которому в действительности подключен
// ваш микроконтроллер.
myPort = new Serial(this, Serial.list()[2], 9600);
// Генерируем событие serial только тогда, когда получаем
// символ перевода строки:
myPort.bufferUntil('\n');
// Включаем сглаживание трехмерной графики:
hint(ENABLE_OPENGL_4X_SMOOTH);

Ш м етод draw (), как всегда, толь­ void draw () {


ко обновляет содержимое окна. // Задаем цвета:
background(#20542Е);
Он вызывает метод setAtt itude (),
fill (#79BF3D) ;
чтобы вычислить наклон диска, а
// Рисуем диск:
затем метод tilt о , чтобы выпол­
tilt ();
нить собственно наклон:
}
Ш Система 3D в Processing об­ void tilt () {
// Смещение от начала координат в центр:
рабатывает вращения от 0 до 2к translate(position, position, position);
радиан. Метод t i l t о сопостав-
ляет углы акселерометра в этом // X — спереди назад
диапазоне. Он использует методы rotateX(radians(roll + 90));
// Y — слева направо
Processing translate () И rotate () rotateY(radians(pitch) );
для смещения и вращения пло­
скости диска в соответствии // Задаем цвет закраски диска:
с движением акселерометра: fill (#79BF3D) ;
// Рисуем диск:
ellipse(0, 0, width/4, width/4);
// Задаем цвет текста:
fill (#20542Е) ;
// Выводим текст, чтобы можно было отличить переднюю
/ / и обратную стороны:
text(pitch + + roll, -40, 10, 1);


354 Глава 8

Ш Метод эег^аЗ^епМ) считы­ void serialEvent(Serial myPort) {


// Считываем данные из последовательного буфера:
вает все байты, поступающие из String myString = myPort.readStringUntil(’\n');
последовательного буфера и раз­
бирает их, как разделенные запя­ // Если есть какие-либо байты иные, чем перевод строки:
тыми значения АБСИ, — точно if (myString != null) {
myString = trim(myString);
так же, как мы это делали в про­ // Разбиваем строку по запятым:
екте 2 «Мартышкин пинг-понг» String items[] = split(myString, ’,’);
главы 2: if (items.length > 1 ) {
pitch = float(items[0]);
roll = float(items[1]);

Хотя преобразование показаний акселеро­ которые мы затем преобразовали в измерения уско­


метра в визуализацию его перемещений, рения относительно ускорения силы тяжести. Затем
показанную на рис. 8.16, может показаться слиш­ с помощью тригонометрических формул мы преоб­
ком трудоемким для понимания происходящих при разовали эти результаты в углы в градусах.
этом процессов, оно будет весьма полезно.
Преимущество представления результатов в граду­
Итак, сначала мы преобразовали ускорения вдоль сах состоит в том, что это хорошо известная стан­
трех координат в аналоговые напряжения, а затем дартная единица измерения, вследствие чего нам не
преобразовали эти напряжения, используя метод нужно будет выполнять большой объем сопоставле­
апа1одКеаА (), в цифровые значения в памяти ми­ ний при отправке результатов в Processing. Вместо
кроконтроллера. Далее мы преобразовали получен­ этого программа Processing могла бы взять вывод из
ные цифровые значения в показания напряжения, акселерометра, который предоставил бы ей тангаж
и крен в градусах.

Такой уровень детализации не всегда необходим.


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

► ► Адрес 2007 от Моуны Андраос (Mouna Andraos)


и Сонали Сридхар (Sonali Sridhar)
Как можно видеть из этого проекта, технологии
определения местоположения не обязательно долж­
ны быть чисто утилитарными. Фотография предо­
ж Рис. 8.16. Вывод скетча Наклонение акселерометра ставлена Дж. Нордбергом (J. Nordberg).
Как узнать местонахождение (почти) чего угодно 355

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

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

ИДЕНТИФИКАЦИЯ
В предыдущих главах мы предположили, что идентичность
равнозначна адресу. Зная адрес устройства в сети, мы начинали с ним
взаимодействовать. Но представьте себе, какими непредсказуемыми
были бы последствия, если бы мы использовали этот подход
в повседневной жизни, — например, сняли трубку телефона,
набрали номер и просто начали говорить. А что, если мы набрали
неправильный номер? А если ответит кто-либо другой, а не тот,
кого мы ожидаем услышать?

Адреса устройств в сети обозначаю т их сетевое расположение,


но никак не суть связей, которые по сетям организованы. Мы же
используем эти устройства для передачи тех или иных сообщений
другим людям. При этом сетевой идентификатор устройства и
физическая идентичность лица — две абсолютно разные вещи.
Ф изическая идентичность обычно оценивается присутствием
(это возле меня?) или адресом (где это?), а сетевая идентификация
также принимает во внимание сетевые возможности устройства
и его состояние, когда с ним устанавливается контакт. В этой главе
мы рассмотрим некоторые методы наделения физических объектов
сетевыми идентификаторами. Будут также предложены способы,
с помощью которых устройства в сети м огут определить
возможности друг друга посредством пересылаемых сообщений
и используемых протоколов.

И Нюхач, игрушка для детей с проблемами зрения от Сары Иогансон (Sara Johansson)
В носу собачки находится считыватель меток RFID. Когда он обнаруживает объекты
с меткой RFID, то генерирует звуковую и тактильную обратную связь, уникальные
для каждого объекта. Разработка Сары Иогансон, студентки курса «Ощутимое взаимо­
действие» Колледжа архитектуры и дизайна Осло, под руководством ее наставников
Тимо Арнала (Timo Amai) и Моссе Сьяастада (Mosse Sjaastad). Фотография предо­
ставлена Сарой Иогансон.
358 Глава 9

4z Компоненты для проектов этой главы


Код поставщика США и Европа
Россия • А — Arduino Store (store.arduino.com)
• AF — Adafruit (http://adafruit.com)
• АМР — «Амперка» (http://amperka.ru) • CR — CoreRFID (www.rfidshop.com)
• CHD — «Чип и Дип» (http://chipdip.ru) • D — Digi-Key (www.digikey.com)
• LC — «Линуксцентр» (www.linuxcenter.ru) • F — Famell (www.farnell.com)
• J — Jameco (http://jameco.com)
• MS — Maker SHED (www.makershed.com)
• RSH — Radio Shack (www.radioshack.com)
• RS — RS (www.rs-online.com)
• SF — SparkFun (www.sparkfun.com)
• SH — Smarthome (www.smarthome.com)
• SS — Seeed Studio (www.seeedstudio.com)
• ST — SamTec (www.samtec.com)

Рис. 9.1. Новые компоненты для проектов этой главы: 1. Шилд для прототипов. 2. Интерфейсный модуль Х10.
3. Модуль Х10 для лампы или... 4. Модуль Х10 для бытовых приборов. 5. Четырехжильный телефонный кабель (RJ-11).
6. Перфорированная печатная плата. 7. Восьмипроводный кабель Ethernet. 8. Метки RFID ЕМ4001. 9. Метки RFID
Mifare. 10. Считыватель меток RFID ID-12 или ID-20 на 125 кГц компании ID Innovations. 11. Плата RFID на 13,56 МГц
компании SparkFun или... 12. Шилд RFIDTinkerKit. 13. Антенна для считывателя RFID SM130.14. Гнездовые разъемы
увеличенной длины. 15. ЖК-дисплей 2x16 символов.
Понадобится также достаточное количество штырьковых контактов для адаптерных плат
Идентификация 359

Проект 22. Распознавание цветов » Штыревые соединители.


с помощью веб-камеры AMP: АМР-Х013, http://amperka.ru/product/
pin-headers

►Персональный компьютер с портом USB или J: 103377, D: A26509-20ND, SF: PRT-00116, F:
FireWire, 1 шт. 1593411

►Веб-камера с интерфейсом USB или FireWire, ►
►Метки RFID. Метки должны подходить для
1 шт. вашего считывателя. Все перечисленные здесь

►Объекты разного цвета. поставщики меток продают в различных фи­
зических упаковках метки, которые подходят
Проект 23. Определение лиц для поставляемых ими считывателей: так что
с помощью веб-камеры можете выбрать те, которые вам нравятся боль­
ше всего. В примерах этой главы используются

►Персональный компьютер с портом USB или метки ЕМ4001, взаимозаменяемые с метками
FireWire, 1 шт. ЕМ4102.

►Веб-камера с интерфейсом USB или FireWire, AMP: АМР-Х031, http://amperka.ru/product/
1 шт. rfid-card

►Лицо, 1 шт. CR: WON002, SF: СОМ-10169

►Переходник USB/TTL-Serial типа FTDI, 1 шт.
Проект 24. Распознавание Можно использовать переходник, которым мы
пользовались для предшествующих проектов
двумерных штрихкодов этой книги, вместе с упомянутой ранее адап­
с помощью веб-камеры терной платой для считывателя RFID. Если вы
хотите применить адаптерную плату, предна­

►Персональный компьютер с портом USB или значенную конкретно для вашего считывате­
FireWire, 1 шт. ля, можете приобрести адаптерную плату для

►Веб-камера с интерфейсом USB или FireWire, считывателя RFID с интерфейсом USB, предо­
1 шт. ставляемую компанией SparkFun, номер детали:

►Принтер, 1 шт. SEN-09963.
AMP: А000059, http://amperka.ru/product/usb-
Проект 25. Чтение меток RFID serial-converter
в Processing SF: DEV-09718 или DEV-09716, AF: 70, A:
A000059, M: MKAD22, SS: PRO101D2P, D:

►Считыватель RFID, 1 шт. Для этого проекта TTL-232R-3V3 или TTL- 232R-5V
подойдут считыватели ID-12 или ID-20 компа­
нии ID Innovations. Считыватель ID-20 имеет
несколько больший радиус действия, чем ID-12, Проект 26. RFID и бытовая
но во всем остальном эти считыватели практи­ автоматизация
чески идентичны.

►Модуль Arduino, 1 шт. Желательно исполь­
АМР (альтернатива): AMP-G007, http://amper-
зовать Arduino Uno или его разновидности, но
ka.ru/product/rfid-scanner
проект должен работать и на других версиях
CR: IDI003 или IDI004, SF: SEN-08419 Arduino и совместимых платах.

►Адаптерная плата для считывателя RFID, AMP: А000066, http://amperka.ru/product/ar-
1 шт. Подходит для любого из считывателей duino-uno
компании ID Innovations.
LC: 1с8192, http://www.linuxcenter.ru/shop/ops_
SF: SEN-08423 hard/arduino/arduino uno/
360 Глава 9

D: 1050-1019-ND, J: 2121105, SF: DEV-09950, A: физических упаковках метки, которые подходят


A000046, AF: 50, F: 1848687, RS: 715-4081, SS: для поставляемых ими считывателей: так что
ARD132D2P, MS: MKSP4 можете выбрать те, которые вам нравятся боль­
ше всего. В примерах этой главы используются

►Шилд для прототипов, 1 шт.
метки ЕМ4001, взаимозаменяемые с метками
AMP: А000082, http://amperka.ru/product/ar- ЕМ4102.
duino-proto-shield
AMP: АМР-Х031, http://amperka.ru/product/
J: 2124314, SF: DEV-07914, AF: 51, F: 1848696, rfid-card
SS: STR104B2P, M: MSMS01
CR: WON002, SF: СОМ-10169

►Считыватель RFID, 1 шт. Для этого проекта

►Светодиод, 1 шт.
подойдут считыватели ID-12 или ID-20 компа­
нии ID Innovations. Считыватель ID-20 имеет AMP: AMP-X009-R4, http://amperka.ru/prod-
несколько больший радиус действия, чем ID-12, uct/led-5mm
но во всем остальном эти считыватели практи­ D: 160-1144-ND или 160-1665-ND, J: 34761 или
чески идентичны. 94511, F: 1015878, RS: 247-1662 или 826-830,
АМР (альтернатива): AMP-G007, http://amper- SF: СОМ-09592 или СОМ-09590
ka.ru/product/rfid-scanner ►
►Сопротивление 220 Ом, 1 шт.
CR: IDI003 или IDI004, SF: SEN-08419 AMP: AMP-R220R-10, http://amperka.ru/prod-

►Адаптерная плата для считывателя RFID, uct/resistor
1 шт. D: 220QBK-ND, J: 690700, F: 9337792, RS: 707-
8842
SF: SEN-08423

►Интерфейсный модуль, 1 шт. Однонаправлен­
Или используйте перечисленные далее детали:
ный интерфейс модуль стандарта X I0.
• Гнездовой 10-контактный разъем, 2 шт.
Не требуется, если используется адаптерная SH: 1134В
плата. Подобно многим другим поставщи­ ►
►Модуль управления стандарта X I0, 2 шт.
кам, компания Samtec предоставляет бес­ Любые: модули управления бытовыми прибо­
платные пробные образцы этой детали в не­ рами компании Smarthome, номер детали 2002,
больших объемах. или модули управления лампами Powerhouse
CHD: 362520493, ST: MMS-110-01-L-SV, J: стандарта X I0 компании Smarthome, номер де­
164822, SF: PRT-08272, F: 1109732 тали 2000. Всего требуется два модуля управ­
ления. Можно использовать по одному модулю
• Штыревой 20-контактный соединитель, каждого указанного типа или два модуля одного
2 шт. типа, что предпочтительнее. Если планируется
AMP: АМР-Х013, http://amperka.ru/ управление только лампами накаливания, при­
product/pin-headers обретайте только модули управления лампами.
J: 103377, D: A26509-20ND, SF: PRT-00116, Для всех других целей приобретайте модули
F: 1593411 управления приборами.

• Гнездовой 5-контактный разъем, 1 шт. ►


►Четырехжильный телефонный кабель с разъ­
емом RJ-11,1 шт. Можно взять кабель от любо­
ОТО: 353302583, SF: PRT-10519
го выбрасываемого телефона или купить новый
• Гнездовой 7-контактный разъем, 1 шт. в магазине радиотоваров.
SF: PRT-10518
CHD: 985207210, D: A1642R-07-ND, J: 115617,

►Метки RFID. Метки должны подходить для F : 1335141
вашего считывателя. Все перечисленные
здесь поставщики меток продают в различных
Идентификация 361

Проект 27. Твиты от RFID ►


►Плотный картон толщиной 1,5 мм.

►Гнездовые разъемы.

►Модуль чтения/записи RFID SM130 компа­
нии SonMicro, 1 шт. ОГО: 362520493, вТ: ММ8-110-01-Ь-8У, 3:
164822, вР: PRT-08272, Р: 1109732
АМР (альтернатива): RFR105A1M, http://am-

►Этажерочные гнездовые разъемы, 6 кон­
perka.ru/product/rfid-module-13-56
тактов.
SF: SEN-10126
АМР: АМР-Х099, http://amperka.ru/product/

►Метки чтения/записи RFID компании Mifare,
stackaЫe-pin-headers
3 шт.
вР: PRT-09280, АР: 85
SF: SEN-10127

►Восьмипроводниковый кабель. Подойдет

►Плата Arduino Ethernet, 1 шт. шлейф или витая пара ЕШегпе!.
AMP: А000068, http://amperka.ru/product/ar- И: А Е 08А -5-^ , Р: 1301013
duino-ethernet

►ЖК-дисплей, 16x2 символа, 1 шт.
А: А000050
АМР: АМР-ХЮО-ЕЬА, http://amperka.ru/prod-
В качестве альтернативного варианта можно
ис1Аех1-1сй-16х2
использовать плату с Ethemet-шилдом, совмес­
тимую с Arduino Uno (см. главу 2). 8Р: ЬСБ-00709
SF: DEV-09026, J: 2124242, А: А000056, AF: Далее приводится список деталей для альтерна­
201, F: 1848680 тивной схемы считывателя без шилда:

►Шилд RFID, 1 шт. • Сопротивление 4,7 К, 4 шт.
SF: DEV-10406, А: Т040030 или Т040031 АМР: AMP-R220R-10, http://amperka.ru/
рп^ис^ге818^г

►Антенна на 3,56 МГц, 1 шт. Не нужна, если
считыватель оснащен встроенной антенной. 3: 691024, О: СЕ14Л4К70СТ^О, Р: 735033,
Пв: 707-8693
А: С000027
• Беспаечная макетная плата, 1 шт.

►Потенциометр, 2 шт.
АМР: АМР-Х003, http://amperka.ru/prod-
AMP: АМР-Х021, http://amperka.ru/product/ uct/breadboard-half
potentiometer
П: 438-1045-Ш, 3:20723 и л и 20601, вР: РКГ-
J: 29082, SF: СОМ-09939, F: 350072, RS: 522- 00137, Р: 4692810, АР: 64, 88 STR101C2M
0625 и л и STR102C2M, М: МКК№

►Перфорированная печатная плата, 1 шт.
AMP: AMP-BO 16, http://amperka.ru/product/
proto-perfboard
RSH: 276-150, D: V2018-ND, J: 616673, SS:
STR125C2B, F: 4903213, RS: 1595420

Основные новые компоненты для этой главы — веб-камеры и считыватели меток RFID, которыми мы вос­
пользуемся для идентификации цветов, лиц и меток RFID.
362 Глава 9

Ж Физическая идентификация
Процесс идентификации физических объектов является такой существенной частью нашей
жизни, что мы редко отдаем себе отчет в том, как мы это делаем. Конечно же, мы используем
для этого наши органы чувств: смотрим на объекты, ощупываем, поднимаем и встряхиваем
их, прислушиваемся к ним, нюхаем и пробуем их на вкус и так до тех пор, пока мы не сориен­
тируемся в том, что они собой представляют, после чего мы снабжаем их соответствующими
ярлыками. Весь этот процесс полагается на очень сложные функциональные возможности на­
шего мозга и тела, и любой, кто когда-либо пробовал заниматься компьютерным зрением или
искусственным интеллектом вообще, может сказать вам, что научить компьютер распознавать
физические объекты — задача далеко не из легких. Так же, как сужение поля поиска человеком
какого-либо предмета облегчает задачу определения его местоположения, задача распозна­
вания объектов посредством компьютеров облегчается, если мы можем ограничить область
активного поиска, а также тем или иным способом пометить важные объекты.
Мы идентифицируем объекты, используя инфор­ продавец сопоставил номер метки названию кни­
мацию, предоставляемую нам нашими органами ги или же дате получения книги магазином. Когда
чувств, так же это делают и компьютеры. Они мо­ книга покинет магазин, он может удалить его из
гут идентифицировать физические объекты, толь­ базы данных, так как он перестанет иметь для него
ко используя информацию, которую они получают какое бы то ни было значение. С другой стороны,
от своих датчиков. Двумя наиболее известными продавец может связать номер метки с совершенно
цифровыми методами идентификации являются другими данными в своей базе данных или же во­
оптическое опознавание и радиочастотная иден­ обще не использовать его, полагаясь на другие спо­
тификация (RFID1). Для оптического опознавания, собы идентификации книги. Иными словами, не су­
в частности, существует множество способов: от ществует центральной базы данных, связывающей
распознавания цветов и форм до использования по­ метки RFID и свойства помеченных ими объектов
всеместно распространенных штрихкодов. типа их названий или владельцев.
Распознанному объекту компьютер может присво­ Подобно адресам местонахождения, идентифика­
ить адрес в сети. Сетевой идентификатор физиче­ торы становятся более конкретными по мере рас­
ского объекта может быть как присвоен ему цен­ ширения описываемого ими контекста. Например,
трализованно и быть доступным повсеместно, так знание, что меня зовут Том, много вам обо мне не
и быть временным. Такой идентификатор может скажет. Знание моей фамилии несколько сужает по­
использоваться только небольшим подмножеством иск, но эффективность процесса идентификации
объектов сети или только в течение короткого про­ будет зависеть от поля поиска. Так, в США жи­
межутка времени. В этом отношении особо инте­ вет несколько десятков людей по имени Том Иго
ресным является метод RFID. Наклеенная на обло­ (Tom Igoe), а в Нью-Йорке есть, по крайней мере,
жку книги метка RFID может выглядеть как универ­ трое людей с таким именем. Поэтому, если требу­
сальная метка, но ее значение в действительности ется однозначный идентификатор, можно выбрать
зависит от того, кто ее считывает. Владелец книж­ универсальную метку — например, номер моей
ного магазина или его продавец может присвоить карточки социального страхования, или же доба­
метке номер в своем списке товаров, но для покупа­ вочную метку — например, имя моего отца: Том
теля книги он не означает ничего, если только у него Иго, сын Фрэнка. Что именно выбрать, будет зави­
нет надлежащего инструмента для его считывания сеть от ваших требований в той или иной ситуации.
и базы данных, записи в которой он может быть со­ Подобным же образом, для идентификации физиче­
поставлен. Покупатель не может знать, что означа­ ских объектов в сети можно выбрать однозначные
ет этот номер для продавца, если только у него нет идентификаторы или же дополнительные, времен­
доступа к его базе данных. Вполне возможно, что* ные метки для конкретной ситуации.
RFID, Radio Frequency Identification.
Идентификация 363

Рис. 9.2. Пример


распознавания цветов,
использованный для
скетча проекта 22. Этот
простой скетч хорошо
работает с мартышками
яркого розового цвета
ш&Ш тж 1 — Р м
Щ Ш Ш Ш Я Ш Ш Ш Нн^^иВИК
^ я и н в

ШШШШ шт Ш ЯШ ш
ШЯШШ ИВ»

1^—
— 1

ШШШШШ

Присвоенные идентификатору характеристики Видеоидентификация


также могут быть приспособлены под конкретную
ситуацию. Рассмотрим пример с метками RFID Во всех способах распознавания с помощью видео
снова: в одном магазине номера метки может быть используется один и тот же основной подход —
достаточно для активирования сигнала тревоги на компьютер считывает изображение с камеры и со­
выходе или же для того, чтобы добавить стоимость храняет его в двумерном массиве пикселов. Каждый
помеченного ею товара к общей стоимости вашей пиксел обладает собственными яркостью и цветом,
покупки. А в другом магазине этой же самой метке которые можно измерить с помощью одной из цве­
может быть не присвоено вообще никаких характе­ товых моделей. Например, модели RGB2 и Ш У 3
ристик, даже если она обрабатывается в этом мага­ применяются для приложений, в том числе и видео­
зине по такому же протоколу, как и другие метки приложений, ориентированных на экранное отобра­
RFID. Использование подобных идентификато­ жение. А модель СМУК4распространена в типогра­
ров в разных контекстах может вызвать путаницу. фии. Свойства групп пикселов создают комбинации
С вами никогда не случалось, что после звона сигна­ цветов, яркости и форм. Когда компьютер находит в
ла тревоги на выходе из магазина кассир махал вам своей памяти комбинации, похожие на полученные
рукой: «Идите, идите!», так как он забыл деакти­ со ввода, он может идентифицировать последние,
вировать метку на вашей покупке? Или попробуйте как объекты, сопоставленные комбинациям, хра­
зайти в книжный магазин Barnes & Noble с джинса­ нящимся в памяти. На рис. 9.2 показан пример та­
ми, купленными в магазине Gap. Скорее всего, вы кой идентификации с использованием игрушки —
активируете сигнал тревоги, так как обе компании обезьянки яркого розового цвета.
используют одинаковые метки RFID, но отдельные
2 RGB, Red-Green-Blue — красный, зеленый, синий.
магазины не всегда настраивают свои системы без­
3 HSV, Hue-Saturation-Value — оттенок, насыщенность, значение.
опасности, чтобы отфильтровывать метки, которые 4 CMYK, Cyan-Magenta-Yellow-blacK — голубой, пурпурный,
не используются для их товаров. желтый, черный.
364 Глава 9

В следующих трех проектах для захвата изображе­ Распознавание цветов


ния с подключенной к компьютеру камеры и после­
дующего его анализа мы воспользуемся библиоте­ Распознавание объектов по их цвету — сравни­
кой OpenCV. В первом — и самом простом — про­ тельно простой процесс, если распознаваемый цвет
екте мы попытаемся опознать цвет, во втором — является уникальным в захваченном с камеры изо­
нечто, похожее на лицо, а в третьем — двумерный бражении. С помощью этого метода супергероям
штрихкод QR5. кинофильмов дают возможность летать. Для этого
актер снимается в имитации полета на одноцветном
Библиотека OpenCV разработана компанией Intel фоне — обычно зеленом, который весьма далек от
и выпущена с лицензией на открытый исходный натурального цвета человеческой кожи. Затем пик­
код. Эта библиотека была адаптирована для многих селы этого цвета удаляются, а изображение супер­
сред программирования, включая среду Processing. героя совмещается с подходящим фоновым изобра­
Версию библиотеки для Processing можно загрузить жением.
с помощью веб-страницы http://processing.org/
reference/libraries/. Для загрузки нужно перейти с Распознавание цвета представляет собой весьма эф­
этой страницы по ссылке OpenCV. Загрузив вер­ фективный способ отслеживать физические объек­
сию библиотеки OpenCV для Processing, скопируй­ ты в контролируемом пространстве. При условии,
те ее в подпапку libraries папки скетчей Processing. что мы имеем дело с ограниченным количеством
Теперь мы готовы к созданию упомянутых ранее объектов в поле видимости камеры и что цвет каж­
проектов. дого объекта уникальный и не меняется при разных
условиях освещения, мы можем достаточно на­
Новая версия библиотеки дежно идентифицировать каждый объект. Но даже
незначительные изменения освещения могут из­
На момент написания этой книги версия OpenCV
для Processing находилась по адресу http://ubaa.net/
менить цвет пикселов, поэтому условия освещения
shared/processing/opencv. Известно, что в разработке необходимо строго контролировать, что и демон­
находится новая версия библиотеки, поэтому посетите стрируется в следующем проекте.
сайт Processing, чтобы получить обновленную ссылку.

5 QR, Quick Response — быстрый отклик.

С Проект 22

Распознавание цветов с помощью веб-камеры

В этом проекте мы своими глазами увидим,


как работает компьютерное зрение. Скетч Требуемые компоненты
Processing для этого проекта захватывает изо­ ►
►Персональный компьютер с портом USB или
бражение с видеокамеры, ищет в нем пик­ FireWire, 1 шт.
селы определенного цвета и помечает их на

►Веб-камера с интерфейсом USB или FireWire,
копии изображения, которую он выводит на
1 шт.
экран. Захват изображения с подключенной
к компьютеру видеокамеры и анализ пиксе­ ►
►Объекты разного цвета.
лов этого изображения как раз и позволяет
библиотека OpenCV.
Идентификация 365

Следующий скетч Processing демонстрирует отсле­ использовали в главе 3 для проекта сетевого кота,
живание объекта по цвету с использованием библи­ прекрасно подойдет и для этого проекта. Вам также
отеки OpenCV. Для работы скетча камера должна потребуется несколько небольших цветных объек­
быть подключена к компьютеру, и для нее установ­ тов — небольшие этикетки или мячики.
лены необходимые драйверы. Камера, которую вы

Ш Как всегда, определяем перед /*


методом setup () ряд глобальных Распознавание цвета с OpenCV
переменных, включая экземпляр Контекст: Processing
библиотеки OpenCV, массив для На основе примера Даниэля Шифмана.
хранения значений цвета пиксе­
лов и переменную для отслежи­
ваемого цвета:
Метод setup () тоже, как обычно, // Импортируем библиотеку OpenCV
задает начальные условия. В на­ import hypermedia.video.*;
шем случае это инициализация
библиотеки OpenCV с использо­ OpenCV opencv; // Создаем экземпляр библиотеки
ванием первой доступной каме­ int[] pixelArray; // Массив для копирования пикселов
ры, подключенной к компьютеру, color trackColor; // Требуемый цвет
установка размера окна и иници­
ализация сглаженной графики:
Как выбрать нужную камеру? void setup() {
// И н и ц и а л и з и р у е м окно:
Поскольку приложение с OpenCV
использует первую доступную ка­ size( 640, 480 );
меру компьютера, могут возник­
нуть проблемы, если при включен­ // Инициализируем библиотеку OpenCV:
ной встроенной камере ноутбука к opencv = new OpenCV( this );
нему также подключена внешняя
opencv.capture( width, height );
камера. Одним из решений этой
проблемы будет открыть ненуж­ // Начинаем с отслеживания красного цвета:
ную камеру в другом приложении, trackColor = color(255, 0, 0);
чтобы только нужная камера была // Рисуем, сглаживая края:
доступна библиотеке OpenCV. Это smooth();
не совсем элегантное решение, но
оно работает.

U J Метод draw о начинает ис­ void draw() {


полнение, устанавливая значения float closestMatch = 500; / / Значение, представляющее
/ / наиболее близко совпадающий цвет
для наиболее близко совпадаю­
float colorThreshold = 10; / / Пороговое значение схожести цветов
щего цвета, пороговое значение
int closestX = 0; // Горизонтальная позиция
для схожести цветов, а также // ближайшего цвета
позиции х и y ближайшего со­ m t closestY = 0; // Вертикальная позиция
впадающего пиксела. Затем он // ближайшего цвета
выполняет захват изображения с
камеры и сохраняет его в массиве // Выполняем захват изображения с веб-камеры:
пикселов: opencv.read();
// Выводим изображение с камеры на экран:
image(opencv.image(), 0, 0);
// Копируем массив пикселов камеры:
pixelArray = opencv.pixels();
►►
366 Глава 9

Ш Далее следует пара вложен­ // Начинаем цикл для прохода по каждому пикселу
ных циклов, которые проходят for (int х = 0; х < opencv.width; x++ ) {
по строкам и столбцам пиксе­ for (int у = 0; у < opencv.height; y++ ) {

лов. Это стандартный алгоритм // Вычисляем позицию пиксела в массиве на основе его
// ширины и высоты:
для исследования всех пикселов
int 1ос = х + у*opencv.width;
изображения. Для каждого пик­
// Получаем цвет текущего пиксела:
села определяется его позиция в
color currentColor = pixelArray[loc];
массиве с использованием сле­
float rl = red(currentColor);
дующей формулы (которую мы
float gl = green (currentColor);
будем видеть очень часто впо­ float bl = blue (currentColor) ;
следствии): float r2 = red(trackColor);
arrayLocation = х + (у * width); float g2 = green(trackColor);
float b2 = blue (trackColor);
Зная позицию пиксела, извлекаем
значения его красной, зеленой и
синей составляющих, а также зна­
чения для отслеживаемого цвета:

О д алее вычисляем разницу меж­ // Применяем функцию disto для вычисления общего цвета
ду этими цветами. Рассматривая // текущего пиксела. Этот метод рассматривает красную,
// зеленую и синюю составляющие цвета текущего пиксела
значения красной, зеленой и синей
// и целевого цвета, как координаты в трехмерном
составляющих каждого цвета, как // пространстве, и вычисляет разницу между ними
позиции в трехмерном простран­ // в Евклидовом пространстве.
стве, разницу между цветами // В этой формуле меньшее расстояние равно более
можно определить, вычислив рас­ // близкой схожести цветов:
стояние между ними. С этой зада­
float d = dist(rl, gl, bl, r2, g2, b2) ;
чей хорошо справляется функция
disto среды Processing.
// Если текущий цвет более похожий на целевой цвет,
Вычислив разницу, сравниваем // чем предыдущий ближайший цвет, сохраняем текущую
// позицию и текущую разницу:
ее с наиболее близким текущим ;
совпадением (которое для перво- j
if (d < closestMatch) {
го раза было установлено про­ closestMatch = d;
извольно высоко). Если текущая closestX = x;
разница меньше, чем наиболее closestY = y;
близкое совпадение, текущий
пиксел становится новым наибо­
лее близким совпадением: }

Ш После получения ближай- j // Рассматриваем распознанный цвет только, если его


// расстояние до целевого цвета меньше, чем установленное
шего совпадения исполнение ; // пороговое значение. Чем меньше это расстояние, тем лучше
вложенных циклов for заверша- ; // совпадение цвета. А чем больше расстояние, тем обширнее
ется. Все, что остается сделать в ! // диапазон совпадающих цветов:
if (closestMatch < colorThreshold) {
методе draw о , — это проверить,
// Обводим кругом отслеживаемый пиксел:
не меньше ли ближайшее совпа­ fill (trackColor) ;
дение, чем установленное поро­ strokeWeight(2.0);
говое значение. Если меньше, то stroke(0);
ellipse(closestX, closestY, 16, 16);
обводим соответствующий пик­
сел на изображении кругом: , ►►
Идентификация 367

СОТ Далее добавим обработчик void mousePressedO {


нажатия кнопки мыши, который // Сохраняем цвет в положении курсора при нажатии кнопки мыши
изменяет отслеживаемый цвет на // в переменную trackColor:
цвет, находящийся в положении int loc = mouseX + mouseY*opencv.width;

указателя мыши: trackColor = pixelArray[loc];


1

Освещение для распознавания цвета


Как вы сами увидите при исполнении этого скет­ Optoelectronic Solutions (www.taosinc.com)
ча, он не самый стабильный распознаватель цвета. выпускает несколько разных датчиков цвета,
Ближайшее совпадение имеет большую склонность включая датчик TAOS TCS230. Этот датчик
к перепрыгиванию с одного значения на другое. содержит четыре фотодиода, три из которых
Настройка Значения переменной colorThreshold накрыты светофильтрами, что позволяет ему
немного помогает, но проблему не решает. Ста­ определять красный, зеленый, синий и белый
бильность распознавания можно улучшить, очень цвета. Показания всех четырех каналов датчика
внимательно контролируя изображение и его осве­ выдаются в виде сигнала ШИМ. Более дешевый
щение. Далее приводятся некоторые советы на этот датчик TAOS TSL230R не содержит светофиль­
счет. тров и определяет только наличие окружающего
света. На рынке также доступны и другие датчи­
• Легче всего распознаются цвета типа DayGlo, ки цвета. Их недостаток состоит в том, что они
которые ярко светятся при освещении ультра­ предназначены для обнаружения цвета только
фиолетовым или солнечным светом, но они при­ на сравнительно близком расстоянии (в преде­
вязывают вас к очень специфичному визуально­ лах нескольких сантиметров), и они не могут
му эстетическому эффекту. различить когерентное изображение. По сути,
• Легче всего распознавать объекты, которые сами это просто однопиксельные камеры.
генерируют свет, — особенно, если прикрыть
соответствующим фильтром объектив камеры, Распознавание форм и образов
чтобы заблокировать посторонние излучатели.
Например, хорошо работает в качестве филь­ Задача распознавания цвета в плане вычислитель­
тра кусок черного негатива 35-миллиметровой ных возможностей компьютера сравнительно про­
фотопленки (если вы сможете еще ее найти), стая, задача же распознавания физических объектов
который задерживает почти любой свет, кроме неизмеримо сложнее. Чтобы сравнивать графиче­
инфракрасного. Эффективны также два поля­ ские представления объектов, нужно выявлять их
ризационных светофильтра с осями, располо­ двумерную геометрию со всех возможных сторон.
женными перпендикулярно друг другу. Такие
Компьютер с одной камерой не может «видеть»
фильтры хороши для отслеживания как инфра­
в трех измерениях. Все, что он «видит» в любом
красных светодиодов, так и обычных лампочек
объекте, — это только двумерный силуэт. Кроме
накаливания для фонариков.
того, компьютер не может отличить один объект
• Обычные светодиоды не очень хорошо подходят в поле зрения камеры от другого при отсутствии
в качестве объектов для цветового распознава­ какого-либо визуального образца. Компьютер не
ния, если только они не достаточно тусклые. способен «понимать» физические объекты, он мо­
Яркие светодиоды отображаются в камере как жет только сравнивать и сопоставлять образы. Он
белые точки, поскольку их яркость забивает ма­ может вращать изображение объекта, растягивать
трицу датчика камеры. его, выполнять всяческие математические вычисле­
• Для распознавания цветов не обязательно ис­ ния над массивом пикселов, но он не воспринимает
пользовать камеру — для этого хорошо подой­ объект как отдельную сущность таким же образом,
дут датчики цвета. Компания Texas Advanced как это делает человек.
368 Глава 9

- И з Проблемы с идентификацией физических


маркеров
Телефонный автоответчик с использованием ша­ трудоемко, поэтому я накупил больших бусин
риков разработки Дарела Бишопа является за­ и повставлял в их отверстия сопротивления,
мечательной демонстрацией трудностей, сопро­ а отверстия позакрывал медной лентой с липкой
вождающих задачу идентификации физических подложкой. Когда я пошел работать в Apple и ра­
маркеров. При получении каждого нового сооб­ ботал вместе с Джонатаном Коэном, мы создали
щения автоответчик вбрасывает шарик в лоток на правильную версию для Маков, использующую се­
своей передней панели. Пользователь прослуши­ тевые штрихкоды. Позже, снова с Джонатаном,
вает сообщения, помещая шарики в лоток воспро­ но на этот раз в компании Interval Research, мы
изведения. Когда шарики помещаются обратно использовали микросхемы для идентификации
в подающий контейнер, их сообщения стираются, производства компании Dallas Semiconductor.
и шарики готовы для повторного использования.
В данном случае шарики являются физическими В большинстве случаев цвета, самого по себе,
маркерами, представляющими сообщения, что по­ недостаточно для распознавания объекта, тем не
зволяет с легкостью определять с первого взгляда менее существуют системы, использующие цвет
количество полученных сообщений. в качестве маркера физической идентификации.
Однако такие системы имеют определенные огра­
Бишоп перепробовал множество разных методов, ничения. Чтобы различать шарики, Бишоп мог бы
чтобы надежно идентифицировать и системати­ применить распознавание цвета шариков, но это
зировать физические маркеры, представляющие наложило бы на конструкцию, по крайней мере,
сообщения: два ограничения. Прежде всего, было бы невоз­
можно различить два шарика одного и того же
Сначала я создал рабочую версию с двигателем цвета. Если, например, он бы использовал цвет
и шнеком (наподобие механизма доставки тор­ для идентификации разных людей, которые полу­
гового автомата) и навешал на шнек бумажные чали сообщения на одном и том же автоответчике,
карточки, обратная сторона которых была за­ стало бы невозможным выявить различия между
крашена серым цветом разных уровней. При по­ несколькими сообщениями для каждого человека.
лучении нового сообщения машина считывала Кроме того, система была бы ограничена количе­
следующий серый уровень, проворачивала шнек ством цветов, которые могли бы надежно ею раз­
и сбрасывала карточку. Это было достаточно личаться.

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


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

^ Проект 23
Обнаружение лиц с помощью веб-камеры
Теперь, когда мы располагаем основными
знаниями в области оптического обнаруже­ Требуемые компоненты
ния объектов, настало время попробовать ►
►Персональный компьютер с портом USB или
определять простые образы. В этом проекте FireWire, 1 шт.
для нахождения лиц в изображении с камеры

►Веб-камера с интерфейсом USB или FireWire,
мы воспользуемся методами обнаружения
1 шт.
лиц библиотеки OpenCV.

►Лица.
Система обнаружения образов библиотеки OpenCV
основана на файлах описания характеристик
определенных образов, называемых каскадами. • представление лица анфас (четыре вариации);
Отдельный каскад описывает подобласть того или • представление лица в профиль;
иного образа, включая его относительный размер,
• полное представление тела;
форму и степень контрастности. Образы разработа­
ны таким образом, чтобы быть достаточно общими • представление нижней части тела;
и позволять определенный объем варьирования, но • представление верхней части тела.
достаточно специфичными, чтобы отличаться от
других образов. Библиотека OpenCV для Processing Следующий скетч пытается выполнить простое
содержит образы для следующих особенностей че­ определение лица. Попробуйте, сможете ли вы об­
ловеческого тела: мануть его.

ш Как обычно, перед методом /*


setup () определим несколько Обнаружение лиц с помощью OpenCV
глобальных переменных. Они Контекст: Processing

почти идентичны переменным из */


предыдущего проекта, за исклю­
// Импортируем библиотеки OpenCV и Rectangle:
чением дополнительного объекта
import hypermedia.video.*;
Java Rectangle. Этот объект тре-
import java.awt.Rectangle;
буется потому, что метод обнару­
жения лиц библиотеки OpenCV
OpenCV opencv; // Создаем экземпляр библиотеки OpenCV
возвращает массив прямоуголь­
ников, которые, по его мнению,
содержат лица:
Метод setup о также похож
на этот метод из предыдущего
проекта, но здесь библиотека
OpenCV будет искать требуе­
мый образ с помощью метода
cascade о. Описание доступных
образов приводится на странице
для Processing сайта библиотеки
OpenCV по адресу http://ubaa.
net/shared/processing/opencv/
opencv_cascade.html.
370 Глава 9

Ш Наконец, метод setup () задает void setup() {


// Инициализируем окно:
условия рисования овалов, чтобы
size ( 320,240 );
можно было рисовать круги на
// Инициализируем библиотеку OpenCV:
лицах:
opencv = new OpenCV( this );
opencv.capture( width, height );
// Выбираем описание обнаружения, которое применять:
opencv.cascade( OpenCV.CASCADE_FRONTALFACE_DEFAULT );
// Рисуем, сглаживая края:
smooth();
// Настраиваем рисование овалов с левого верхнего угла:
ellipseMode(CORNER);

ш Метод draw о намного про­ void draw() {


ще, чем в предыдущем проекте, // Захватываем новый кадр:
так как мы не исследуем каждый opencv.read();
пиксел. Он применяет функцию
detect () библиотеки OpenCV для // Ищем лица:

нахождения прямоугольников, Rectangle[] faces = opencv.detect();

совпадающих с выбранным об­


// Выводим изображение:
разом, и предоставляет результат
image( opencv.image(), 0, 0 );
в массиве. Затем он проходит по
этому массиву прямоугольников // Рисуем круги на лицах:
и рисует овалы на каждом лице: fill(0xFF, 0x00, 0x84, 0x3F); // Задаем красивый розовый цвет
noStroke(); // Рисуем без границ

Запустите скетч на исполнение и for ( int thisFace=0; thisFace<faces.length; thisFace++ )


посмотрите в камеру. На вашем {ellipse ( faces[thisFace].x, faces[thisFace].y,
лице должен нарисоваться кра­ faces[thisFace].width, faces[thisFace].height
сивый розовый круг, как показа­
но на рис. 9.3.

Как можно видеть, скетч достаточно уверенно на­ находит вообще (рис. 9.3, г), чему кот, как можно
ходит мое лицо анфас (рис. 9.3, а), но не в профиль видеть, не особенно рад.
(рис. 9.3, б). Скетч также достаточно хорошо обна­
Попробуйте исполнять эту программу с разными
руживает лица на фотографиях (рис. 9.3, в), и даже
лицами и в разных условиях. Также попробуйте
находит абстрактное изображение лица на моей
работать с другими каскадами обнаружения лиц,
футболке (рис. 9.3, а). Наличие растительности или
упоминающимися на странице для Processing веб­
других особенностей лица усложняет обнаружение
сайта OpenCV.
лиц (рис. 9.3, в, левая фотография). А зверюшек —
в общем, и кота Лапшу в частности, — алгоритм не

и интерпретируя светлые и темные полоски раз­


Распознавание штрихкодов личной ширины, как логические нули и единицы.
Штрихкод — это просто набор темных и свет­ Сканирование может выполняться с помощью ка­
лых линий или ячеек, применяемый для кодиро­ меры или фотодиода, если штрихкод провести над
вания буквенно-цифровой строки. Компьютер ним с постоянной скоростью. Принцип работы
считывает штрихкод, сканируя его изображение многих ручных сканеров штрихкодов заключается
Идентификация 371

в г

Рис. 9.3. Результаты исполнения скетча для обнаружения лиц

в том, что пользователь проводит по штрихкоду штрихкодовых систем обозначений, которые нахо­
сканирующей головкой, содержащей светодиод и дят также самое широкое применение. Например,
фотодиод. Светодиод излучает луч света, который почтовая служба США использует символьную
отражается от светлых и темных областей штрихко­ систему POSTNET для автоматизации обработки
да с разной интенсивностью, а фотодиод принимает почты. Системы EAN7 и JAN8 являются расширен­
отраженный свет и выдает соответствующее напря­ ными версиями системы UPC и предназначены для
жение, которое затем обрабатывается специальной упрощения международного товарообмена. Каждая
схемой. символьная система обеспечивает сопоставление
штрихов символам. Разные символьные системы не
Наиболее известное приложение для работы являются взаимозаменяемыми, поэтому нельзя рас­
со штрихкодами UPC6 используется почти все­ шифровать штрихкод системы, скажем, POSTNET,
ми основными производителями на планете для с помощью интерпретатора системы EAN. Это озна­
маркировки своих товаров. Но кроме него суще­ чает, что нам нужно или программное приложение
ствует несколько десятков других разнообразных
7 EAN, European Article Numbering— европейский товарный код.
6 UPC, Universal Product Code — универсальный товарный код. 8 JAN, Japanese Article Numbering — японский товарный код.
372 Глава 9

с расширенными возможностями, которое может Существуют также и двумерные штрихкоды, дан­


работать с несколькими символьными системами, ные в которых, чтобы получить более высокую
или же знать наперед, с какой системой мы будем плотность информации, кодируются в двумерной
иметь дело, и обеспечить наличие соответствую­ матрице. Как и в случае с одномерными система­
щего программного обеспечения для ее интерпре­ ми, разработано несколько различных двумерных
тации. Для генерирования штрихкодов разрабо­ символьных систем. На рис. 9.5 показан типичный
таны многочисленные программные библиотеки, двумерный штрихкод — код QR. Этот код был раз­
а также несколько шрифтов штрихкодов для печати работан в Японии и первоначально предназначался
более популярных символьных систем. для отслеживания запчастей для автомобилей, но
впоследствии стал широко применяться для марки­
Штрихкоды, наподобие показанного на рис. 9.4, на­
ровки разного рода товаров. Оснащение многих мо­
зываются одномерными, так как они считываются
бильных телефонов с камерой программным обе­
только вдоль одной координаты.910
спечением для чтения этих меток сделало код QR
еще более популярным. В следующем проекте ис­
пользуется библиотека Java с открытым исходным
9 кодом для чтения кодов QR в Processing.

Рис. 9.4. Одномерный штрихкод (здесь приведен


штрихкод 1БВ№ этой книги10)

9 ISBN, International Standard Book Number — уникальный


номер книжного издания.
10 Имеется в виду оригинальное издание.
Идентификация 373

^ Проект 24

Распознавание двумерных штрихкодов с помощью веб-камеры

В этом проекте мы сгенерируем несколько


двумерных штрихкодов для текста, используя Требуемые компоненты
онлайновый генератор СЖ-кода, а затем рас­ ►
►Персональный компьютер с портом USB или
шифруем эти метки, используя камеру и ком­ FireWire и доступом к Интернету, 1 шт.
пьютер. В качестве домашнего задания, когда ►
►Веб-камера с интерфейсом USB или FireWire,
этот скетч заработает должным образом, ис­ 1 шт.
пользуйте его, чтобы расшифровать рисунки

►Принтер, 1 шт.
этой книги, содержащие коды (Ж

Приводимый скетч считывает (^Л-коды с по­ для дальнейшего использования. Также сохраните
мощью подключенной к компьютеру камеры. Со­ их изображения в формате PNG, поскольку они нам
ставляющая скетча для работы с видео очень по­ для скетча понадобятся.
хожа на соответстзующую часть предшествующе­
го скетча для определения цвета. Но прежде чем Для работы скетча требуется библиотека pqrcode
приступать к работе над этим скетчем, нам нужно для Processing разработки Даниэля Шифмана. Эта
раздобыть несколько (Ж-кодов для их последую­ библиотека основана на библиотеке qrcode, кото­
щего прочтения. К счастью, в Интернете можно рая доступна на сайте http://qrcode.sourceforge.
найти несколько вполне приличных генераторов jp. Библиотеку pqrcode можно загрузить с адреса
СЖ-кодов. Просто введите этот термин в строку по­ www.shiffman.net/p5/pqrcode. Распакуйте архив
иска вашего любимого поисковика и посчитайте, и скопируйте полученную папку pqrcode в подпап­
сколько он их найдет. На сайте ЬЯр:/Л|гсо<1е.каул¥а. ку libraries папки приложения Processing, а затем
с о т доступен хороший генератор, который может перезапустите среду. Создайте новый скетч, затем
создавать СЖ-коды для ИЛЬ, номеров телефонов создайте в папке скетча подпапку data и скопируйте
или простого текста. Имейте при этом в виду, что в эту папку файлы *.рпд или *.jpg созданных ранее
чем больше символов содержит исходный текст, QR-кодов. Теперь все готово, чтобы начать созда­
тем большего размера окажется конечная метка. ние самого скетча.
Сгенерируйте несколько кодов и распечатайте их

Ш В методе setup () мы импор­ /*


тируем библиотеки pqrcode и Считыватель QR-кодов
Контекст: Processing
OpenCV и инициализируем не­ */
сколько глобальных перемен­
ных: import hypermedia.video.*;
import pqrcode.*;

OpenCV opencv; // Создаем экземпляр библиотеки OpenCV


Decoder decoder; // Создаем экземпляр библиотеки pqrcode

// Строка для возвращения сообщений:


String statusMsg = "Ожидание сообщения";

void setup () { ►►
374 Глава 9

□ // Инициализируем окно:
size (400, 320);

// Инициализируем библиотеку OpenCV:


opencv = new OpenCV ( this );
opencv.capture ( width, height );

// Инициализируем декодер:
decoder = new Decoder(this);
}

Efr Метод draw () выводит на void draw () {


экран захваченное камерой изо­ // Выполняем захват изображения с веб-камеры:
бражение и сообщение состоя­ opencv.read ();
ния. Если библиотека декодера | // Выводим захваченное изображение на экран:
находится в процессе чтения image ( opencv.image () , 0, 0 );
изображения, она выводит это
изображение в левом верхнем // Выводим сообщение состояния:
text(statusMsg, 10, height-4);
углу окна и меняет сообщение
состояния:
// Если мы находимся в процессе декодирования:
if (decoder.decoding()) {
// Отображаем декодируемое изображение:
PImage show = decoder.getImage();
image(show, 0, 0, show.width/4, show.height/4);
// Обновляем сообщение состояния:
statusMsg = "Декодируется изображение";
// Добавляем точку после каждого десятого кадра:
for (int dotCount = 0; dotCount < (frameCount) % 10;
dotCount++) {
statusMsg += «.»;
}
}
}

Q Библиотека pqrcode содер­ void keyReleased () {


жит функцию decode Image () . String code = «»;
Чтобы ее использовать, мы пере­ // В зависимости он нажатой клавиши, выполняем разные задачи:
даем ей изображение в методе switch (key) {
keyReleased (). Оператор switch case ' ': / / Клавиша пробела — захватываем и тестируем
проверяет, какая клавиша была // изображение:

нажата. Если нажата клавиша // Декодируем изображение:


decoder.decodeImage(opencv.image());
<f>, декодеру передается файл
break;
qrcode.png из подпапки data. А
case ' f' : // Клавиша <f> — тестируем файл
если нажата клавиша пробела,
PImage preservedFrame = loadlmage(«qrcode.png»);
передается изображение с каме­
// Декодируем файл
ры. Наконец, если нажата кла­ decoder.decodeImage(preservedFrame);
виша <s>, выводится диалоговое break;
окно настроек камеры: }
> ►

Идентификация 375

ШГПосле передачи изображения ] / / П о завершению работы объекта декодера вызывается данный метод,
декодеру мы ждем, пока он его ] void decoderEvent(Decoder decoder) {
обработает. Декодировав изо- | statusMsg = decoder.getDecodedString();
бражение, декодер генерирует }
Событие decoderEvent (), И М Ы
можем прочитать идентифика- 1
тор метки с помощью метода ]
getDecodedString() I

0 f При исполнении этого скетча обратите вни-


Ш ■ мание, что изображения формата JPG или
PNG сканируются намного более надежно, чем
изображения с камеры. Так происходит потому, что
искажения аналого-цифрового преобразования, вы­
полняемого камерой, создают много ошибок. Эти
ошибки еще более усугубляются некачественной
оптикой или схемами низкого технического уровня
для формирования видеосигнала, которыми осна­
щаются мобильные телефоны и веб-камеры. Но
даже с хорошим объективом, если сканируемая мет­
ка в видоискателе не отцентрирована, искажения по
ее краям могут сбить с толку процедуру распозна­
вания образов. Надежность сканирования можно
улучшить, предлагая пользователю отцентрировать
метку, прежде чем делать с нее снимок. Здесь мо­
гут быть полезными даже простые графические
подсказки — типа размещения ограничительных
пометок по углам метки, как показано на рис. 9.6.
При попадании этих меток в кадр пользователи
обычно руководствуются ими, что обеспечивает Рис. 9.6. Двумерная метка штрихкода (СЖ-кода, если
быть более точным) с ограничивающими пометками по
дополнительное пространство вокруг кода и более
углам. Эти пометки игнорируются обработчиками изо­
качественное сканирование. Такие методы помога­ бражения, но помогают пользователям центрировать
ют улучшить качество оптического распознавания метку для более качественного захвата изображения
образов с камеры, будь то одно- или двумерные
штрихкоды или образы вообще иного типа.

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


ограничение в дополнение к упомянутым ранее — физических объектов, но не требовала бы, чтобы
штрихкод должен быть виден. В настоящее время идентифицирующая метка была видна. Это одна из
большинство людей знакомы со штрихкодами, по­ главных причин, вследствие которой идентифика­
скольку они украшают все, что мы покупаем или ция REID начинает вытеснять штрихкоды в систе­
пересылаем. Но это ограничение не только эсте­ мах управления запасами и в других приложениях
тическое. Если вам когда-либо приходилось по­ идентификации.
ворачивать предмет снова и снова, пытаясь найти
штрихкод для сканирования, вы знаете, что это
ограничение также и функциональное. Улучшением
системы штрихкодов стала бы система, которая так
376 Глава 9

оказывается достаточно для одноразовой передачи


Радиочастотная меткой своих данных, причем сигнал такой пере­
идентификация (RFID) дачи сравнительно слабый. Соответственно, боль­
шинство пассивных устройств RFID могут считы­
Подобно системам распознавания штрихкодов, си­ вать метки на расстоянии от нескольких сантиме­
стема RFID предусматривает наличие на объектах тров до нескольких десятков сантиметров.
меток для их идентификации. Но, в отличие от ме­
В активных системах RFID каждая метка снабжена
ток штрихкодов, метки RFID не обязательно долж­ своим собственным источником питания и радио­
ны быть на виду, чтобы их можно было считывать. приемопередатчиком, который и передает сигнал
Считыватель RFID излучает радиосигнал ближнего в ответ на полученный от считывателя запрос.
действия, принимаемый меткой RFID, которая за­ Активные системы имеют намного больший ради­
тем передает назад короткую строку данных. В за­ ус действия, чем пассивные, а также менее подвер­
висимости от размера и чувствительности антенны жены ошибкам. Но они и намного более дорогие.
считывателя и мощности сигнала, метка может на­ Если вы регулярно добираетесь на работу или по
ходиться на расстоянии в несколько футов от счи­ другим делам на автомобиле и при этом проезжаете
тывателя, помещена внутри книги, ящика, коробки, через пункт оплаты на платной дороге, вы, веро­
предмета одежды и, тем не менее, быть доступной ятно, пользуетесь активным RFID. Установленные
для считывания (рис. 9.7). Более того, некоторые там системы типа E-ZPass12 используют активные
производители одежды начинают просто зашивать метки, чтобы устройство RFID могло считывать их
в свою продукцию метки RFID, которые извлекают­ на расстоянии нескольких метров.
ся клиентами после покупки. Может возникнуть предположение, что поскольку
Так же, как и в случае с системами определения система RFID основана на радио, ее можно исполь­
расстояния, существуют два типа систем RFID: пас­ зовать также и для определения расстояния, но это
сивная и активная. Пассивные метки RFID содержат
12 E-ZPass — система электронного сбора платы за проезд
микросхему с базовым радиоприемопередатчиком по платной дороге, используемая на большинстве плат­
и энергонезависимую память небольшого объема. ных дорог, мостов и туннелей в северо-восточной части
Питание они получают от тока, который наводится США, к югу от штата Северная Каролина и к западу от
в их антеннах сигналом считывателя. Этой энергии штата Иллинойс.

Рис. 9.7. Фотография


электромагнитного поля
считывателя RFID, снятая
Тимо Арналом (Timo
Arnall), демонстрирует
радиус действия и форму
электромагнитного поля
считывателя RFID. На
фотографии показан
считыватель ID-20
компании ID Innovations,
с которым мы будем
работать в следующем
проекте
Идентификация 377

не так. Обычно, ни пассивные, ни активные систе­ Соответственно, нельзя ожидать, что какой-либо
мы RFID не рассчитаны на предоставление инфор­ один считыватель будет работать со всеми типами
мации об уровне сигнала, принимаемого от меток. меток. Более того, нельзя рассчитывать и на то, что
А без этой информации использовать систему RFID один считыватель будет работать со всеми метками
для определения расстояния до метки или ее ме­ одного частотного диапазона. Поэтому для чтения
стонахождения невозможно. Все, что считыватель того или иного типа меток необходимо применять
может сказать нам, — это то, что метка находится соответствующий считыватель.
в пределах его радиуса действия. Хотя некоторые
В настоящее время на рынке доступно много про­
системы высокого технического уровня могут пре­
стых и недорогих считывателей, охватывающих ряд
доставлять информацию об уровне принимаемого
частотных диапазонов и протоколов для пассивных
от меток сигнала, подавляющее большинство счи­
систем RFID. Например, компания ID Innovations
тывателей такой способностью не обладают.
выпускает линейку небольших, недорогих и про­
Стоимость систем RFID варьируется в обширном стых в использовании считывателей в диапазоне
диапазоне. Приобретение и установка активных 125 кГц с последовательным выводом. Самый ма­
систем может обойтись в десятки тысяч долларов. ленький из них имеет размер около 3,75x3,75 см
Пассивные коммерческие системы также довольно и может считывать метки, поддерживающие про­
дороги. Типичный пассивный считыватель, кото­ токол ЕМ4001. Мы воспользуемся одним из таких
рый может считывать метки на расстоянии до одно­ считывателей в следующем проекте. Эти считы­
го метра, обычно стоит несколько тысяч долларов. ватели и соответствующие метки можно приобре­
Впрочем, пассивные считыватели низкого класса сти у компании SpartFun или CoreRFID. Компания
с коротким радиусом действия можно приобрести Parallax поставляет считыватель диапазона 125 кГц,
за $30 или даже дешевле. На момент подготовки который также может работать с метками компа­
этого материала за цену в диапазоне от $30 до $100 нии ЕМ Microelectronics и, в частности, с метками
можно приобрести считыватель с радиусом дей­ ЕМ4001. Он оснащен встроенной антенной, реа­
ствия в несколько дюймов. Что-либо с более длин­ лизован на плоской печатной плате и имеет размер
ным радиусом действия будет стоить, соответствен­ около 6,25x8,75 см. Таким образом, считыватели
но, дороже. компаний ID Innovations и Parallax могут работать
с одними и теми же метками.
Пассивные считыватели короткого радиуса дей­
ствия работают, по крайней мере, в трех распро­ Надо, впрочем, отметить, что протокол ЕМ4001 не
страненных частотных диапазонах — в двух низ­ столь часто используется в повседневных приложе­
кочастотных: 125 кГц и 134,2 кГц и в высокочас­ ниях, как протокол Mifare, который является вари­
тотном 13,56 МГц. Чем выше частота, тем больше антом стандарта ISO 14443 в частотном диапазоне
скорость чтения и радиус считывания. 13,56 МГц. Протокол Mifare применяется во многих
транспортных системах — таких как, например,
Кроме работы на разных частотных диапазонах,
лондонское метро. Компания SonMicro выпуска­
системы RFID раличаются и используемыми про­
ет устройство, которое может как записывать, так
токолами RFID. Например, только в одном частот­
и считывать эти метки, чем мы и займемся в одном
ном диапазоне 13,56 МГц действуют стандарты ISO
из следующих проектов этой главы.
15693, ISO 14443 и ISO 14443-А. Кроме того, один
и тот же стандарт может реализоваться по-разному На рис. 9.8 представлено далеко не все многообра­
разными изготовителями. Так, стандарт ISO 15693 зие меток RFID. Как можно видеть, метки RFID мо­
реализуется компанией Philips как I-Code, компани­ гут иметь весьма различную реализацию: наклей­
ей Texas Instruments — как Tag-IT HF, а компанией ки, жетоны, брелоки, кредитные карточки, играль­
Inside Contactless Technologies — как PicoTag. Свои ные карты, даже капсулы для введения под кожу.
реализации этого стандарта среди прочих имеют Кстати, капсулы для введения под кожу использу­
также компании Infineon и STMicroelectronics. А ются для отслеживания домашних животных и не
стандарт ISO 14443 реализуется компанией NXP предназначены для людей, но некоторые любители
Semiconductors как Mifare и Mifare UL, компани­ острых ощущений вставляют их под кожу и себе.
ей STMicroelectronics — как SRI 76, свои реали­
зации этого стандарта имеют и другие компании.
378 Глава 9

потребуется считывать метки? Если на сравнитель­


i l k Имплантация капсул RFID но большом, рассмотрите возможность применения
Большинство капсул RFID не стерилизованы для высокочастотных считывателей. Особенно внима­
внутреннего использования в живых организмах тельно подойдите к вопросу выбора считывателя,
(включая людей) и определенно не предназна­ если вы планируете работать с уже существую­
чены для имплантации неквалифицированны­ щими метками, а не приобретать свои, поскольку
ми лицами. Кроме того, процесс имплантации не все считыватели работают со всеми метками.
таких капсул весьма болезненный. Поэтому не Труднее всего решить вопрос выбора считывателя
пытайтесь оснастить себя или своих друзей воз­ меток для домашних животных, так как многие из
можностями RFID. Не делайте этого самостоя­ них работают в диапазоне 134,2 кГц, для которого
тельно даже со своими домашними любимцами, выбор считывателей не очень велик.
а предоставьте потрудиться ветеринару. А если
Следует принять во внимание и поведение считыва­
вам так уж хочется быть помеченным RFID,
теля при нахождении метки в области его действия.
сделайте себе пару красивых сережек с RFID-
метками. Например, считыватели компаний Parallax и ID
Innovations хотя и могут работать с одними и теми
же метками, тем не менее реагируют на наличие
Подобно любому другому радиосигналу, сигнал ме­ метки в их области действия по-разному. Так, счи­
ток RFID может проникать через ряд материалов, тыватель от ID Innovations предоставляет иденти­
но блокируется любым радиоэкранирующим ма­ фикатор метки только один раз, в то время как счи­
териалом, — таким как проволочная сетка, прово­ тыватель от Parallax предоставляет его непрерывно
дящий тканевый ламинат или металлическая фоль­ до тех пор, пока метка не выйдет за пределы его ра­
га. Это означает, что метки RFID можно вставлять диуса действия. Как мы увидим далее, особенности
в любые объекты при условии, что мощность сиг­ функционирования считывателя могут повлиять на
нала вашего считывателя достаточна для проникно­ конструктивные особенности проекта.
вения через их материал.
Упомянутые здесь считыватели имеют TTL-интер-
Прежде чем приобрести определенный считыва­ фейс, поэтому их можно очень легко подключать
тель, продумайте, в какой среде вы планируете его к микроконтроллеру или адаптерному модулю
использовать, и как эта среда может влиять как на USB/TTL-Serial. При этом считыватели компаний
метки, так и на считыватель. Будет ли в такой среде ID Innovations и Parallax имеют сходные функцио­
много радиопомех? И в каком частотном диапазо­ нальности последовательной связи, что позволяет
не? Затем рассмотрите возможность применения заменить один считыватель другим, выполнив лишь
считывателя в другом частотном диапазоне, где несколько изменений в коде программы.
уровень помех окажется ниже. На каком расстоянии

Рис. 9.8. Все эти предметы различных


цветов и форм оснащены метками
RFID. Фотография ТимоАрнала.
Дополнительную информацию по
исследованиям Тимо Арнала и его
коллег в области дизайна RFID можно
найти на веб-сайте www.nearfiedl.org
Идентификация 379

4 с Проект 25
Чтение тегов RFID в Processing
В этом проекте мы прочитаем несколько меток RFID, чтобы получить представление о работе
считывателей и установить, на каком расстоянии они могут читать метки. Вам предоставляется
удобная программа тестирования, которую полезно иметь под рукой при добавлении к про­
ектам возможностей RFID.
Считыватели компании ID Innovations работают от
питания 5 В и имеют последовательный вывод TTL, Требуемые компоненты
поэтому схема проекта очень простая. Она содер­ ►
►Считыватель тегов RFID ID-12 или ID-20
жит зуммерную головку, которая подает сигнал при компании ID Innovations, 1 шт.
чтении метки. Вместо зуммера можно использовать

►Метки RFID ЕМ4001.
и светодиод. На рис. 9.9 показана схема подключе­
ния считывателя компании ID Innovations к адапте­ ►
►Адаптерная плата для считывателя RFID,
ру USB/TTL-Serial. Для проекта можно также при­ 1 шт.
менить считыватель компании Parallax, но в этом ►
►Штыревые разъемы.
случае нужно будет слегка изменить код, чтобы он ►
►Адаптер USB/TTL-Serial, 1 шт.
мог работать с протоколом этого считывателя.
Если вы планируете использовать считыватели
(код ASCII 02) и заканчивается байтом окончания
компании ID Innovations на регулярной основе, ре­
передачи ЕТХ (код ASCII 03). За байтом STX сле­
комендуется рассмотреть замену этой схемы адап­
дует 10-байтный идентификатор метки. За иденти­
терной платой компании SparkFun (номер детали
фикатором идет контрольная сумма, затем символ
SEN-09963), которая содержит и адаптер USB/TTL-
возврата каретки (код ASCII 13) и символ перевода
Serial, и посадочное гнездо для считывателя.
строки (код ASCII 10), а затем конечный байт ЕТХ.
Все считыватели REID компании ID Innovations Идентификатор меток ЕМ4001 состоит из символов
работают по одному и тому же протоколу на ско­ кода ASCII в шестнадцатеричном формате, поэтому
рости 9600 бит/с. Предложение последовательной строка всегда будет содержать только цифры 0-9
передачи начинается с байта начала передач STX и буквы A—F кода ASCII.

Следующий скетч Processing по- | Считыватель RFID ID12


лучает и обрабатывает данные со | Контекст: Processing
считывателя RFID компании ID j Получает данные от считывателя RFID ID-12 по последовательному порту.
Innovations. К этому моменту ме- j */
ТОД setup () должен быть для вас
уже хорошо знакомым — он про- 1 // Импортируем библиотеку serial:
сто открывает последовательный j import processing.serial.*;
порт и организовывает строку для
входящих данных. Так как пред­ Serial myPort; // Используемый последовательный порт
ложение последовательной связи String tagID = // Строка для идентификатора метки
считывателя ID-12 начинается j
со значения 03, мы помещаем в void setup() {
буфер все данные последователь- , size (150,150);
ного порта, пока не увидим байт // Выводим список всех последовательных портов:
со значением 03: println(Serial.list()); ►►
380 Глава 9

Переходник USB/
TTL-Serial
типа FTDI л
jO ^ M É H Ì

Рис. 9.9. Подключение считывателя RFID ID-12 компании ID Innovations к адаптеру USfVTTL-Serial типа FTDI:
а — макетная схема; б — принципиальная.
Штыревые контакты считывателя ID-12 расположены на расстоянии 2 мм друг от друга.
Для установки считывателя в макетную плату со стандартными расстояниями между гнездами
применяется адаптерная плата от компании SparkFun
Идентификация 381

ИГ" // Измените выделенный жирным шрифтом номер порта на номер


// используемого вами последовательного порта.
String portnum = Serial.list()[2];
// Инициализируем последовательный порт:
myPort = new Serial(this, portnum, 9600);
// Входящая строка заканчивается значением 0x03:
myPort.bufferUntil(0x03);

ШГметод draw о выводит иден­ void draw() {


тификатор метки на экран: // Очищаем экран и задаем цвет фона и шрифта:
background(#022Е61);
fill (#D9EADD) ;
// Выводим строку на экран:
text(tagID, width/4, height/2);

СЗ Но вся настоящая работа вы­ void serialEvent(Serial myPort) {


полняется В методе serialEvent (), // Помещаем содержимое буфера в строку:
который вызывается каждый раз, String inputstring =- myPort.readstring () ;
когда в последовательный порт
поступает байт со значением оз. // Отфильтровываем из строки идентификатор метки:
// Первый байт ввода:
Метод проверяет, начинается ли
char firstChar = inputstring.charAt(0);
строка с байта со значением о2 // Последний байт ввода:
и кончается байтом со значением char lastChar = inputstring.charAt(inputstring.length() -1);
оз. При положительном резуль­
тате проверки он берет первые // Если первый байт — STX (0x02), а последний — ETX (0x03),
десять байтов после байта со зна­ // тогда помещаем следующие 10 байтов в строку tagID:
чением 02 в качестве идентифи­
катора метки: if ((firstChar == 0x02) && (lastChar == 0x03)) {
tagID = inputstring.substring(1, 11);
Подключите к компьютеру счи­
тыватель ID-12, запустите этот
скетч на исполнение и проведите
перед считывателем несколько
меток RFID. Для каждой метки
вы должны получить резуль­
тат, подобный показанному на
рис. 9.10.

Рис. 9.10. Вывод скетча «Считыватель RFID IDI 2»

Убедившись в правильной работе скетча, проверьте с его помощью ра­


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

Проект 26
RFID и бытовая автоматизация
В нашем с напарником офисе находятся десятки потребляющих электроэнергию устройств:
несколько компьютеров, два монитора, четыре или пять ламп освещения, несколько жестких
дисков, паяльник, хабы сети Ethernet, динамики и т. п. Даже в наше отсутствие эти устройства
потребляют много электроэнергии. Какие устройства включены в определенный момент
времени, зависит от того, кто из нас находится в офисе и что мы делаем. Этот проект пред­
ставляет собой систему для уменьшения энергопотребления нашего офиса, особенно когда
нас в нем нет.

Когда мы заходим в офис, нам нужно лишь дотро­


нуться брелком с RFID-меткой на кольце для ключей Требуемые компоненты
к панели возле двери, и система включит устрой­ ►
►Беспаечная макетная плата, 1 шт.
ства, которые мы обычно используем. Каждый из
нас имеет соответствующий брелок, а под панелью ►
►Модуль Arduino, 1 шт.
смонтирован модуль со считывателем RFID, кото­ ►
►Считыватель тегов RFID 1 или ID-12 компа­
рый считывает поднесенные к нему метки. нии ID Innovations, 1 шт.
Считыватель подключен к модулю микроконтрол­ ►
►Метка RFID ЕМ4001, 2 шт.
лера, который взаимодействует по электропровод­ ►
►Адаптерная плата для считывателя RFID,
ке с модулями управления электроустройствами
1 шт.
по протоколу Х10. Каждый из нескольких много-
розеточных блоков подключен к модулю X I0 для ►
►Штыревые разъемы.
управления электроустройствами. В зависимости ►
►Однонаправленный интерфейсный модуль
от прочитанной метки, микроконтроллер знает, стандарта X I0, 1 шт.
какой из этих модулей включить или выключить.
Графическая блок-схема такой системы показана на ►
►Модуль стандарта X I0, 2 шт.
рис. 9.11. ►
►Четырехжильный телефонный кабель с разъ­
емом RJ-11, 1 шт.
Схема
Интерфейсный модуль X I0 подключается к микро­ Линия сброса считывателя RFID соединена с ли­
контроллеру посредством четырехжильного теле­ нией сброса микроконтроллера, чтобы при сбросе
фонного кабеля. Обрежьте один конец кабеля и микроконтроллера также выполнялся сброс и счи­
припаяйте наконечники к каждой его жиле, а затем тывателя.
подсоедините их к микроконтроллеру, как показано
на рис. 9.12. Считыватель RFID подключается к микроконтрол­
На схеме телефонный разъем (разъем RJ-11) на ин­ леру несколько иначе, чем можно было бы ожи­
терфейсном модуле показан в виде на него снизу. дать, — его линия последовательной передачи под­
Убедитесь, что провода в гнезде слева направо со­ ключена к линии 7 микроконтроллера. На этот раз,
ответствуют контактам разъема. чтобы добавить для Arduino дополнительное после­
довательное подключение, мы будем работать с би­
Цвета четырехжильного телефонного кабеля блиотекой SoftwareSerial. Библиотека SoftwareSerial
включена в стандартную установку Arduino и не
На рис. 9.12 указаны цвета четырехжильного теле­
фонного кабеля, типичные для многих таких кабелей требует отдельной загрузки и установки.
в США, но не соответствующие цветам, используемым
в других схемах в этой книге. Поэтому будьте внима­ А для работы с протоколом X I0 должна использо­
тельны, чтобы подключить их в схему точно так, как ваться библиотека X I0 для Arduino, которую можно
показано. загрузить по адресу https://github.com/tigoe/xlO.
Идентификация 383

Многорозеточный Многорозеточный
Лампа блок для блок для
компьютеров компьютеров

Рис. 9.11. Управляемая посредством RFID система автоматического управления электроприборами на основе
модулей Х10

Распакуйте загруженный архив и скопируйте по­ с электросистемами как на 50 Гц, так и на 60 Гц.
лученную папку в подпапку libraries папки Arduino, Если вы хотите разработать также и свои методы
а затем перезапустите среду Arduino. приема, их заглушки можно найти в исходном коде
библиотеки — можете свободно модифицировать
В проекте никакие данные X I0 не принимаются —
их, как вам требуется. Более продвинутую библи­
данные только отправляются микроконтроллером
отеку X I0 можно загрузить по адресу http://load-
модулям управления Х10. Но схема должна быть
8-l.blogspot.com/2010_06__01_archive.html. Мои
совместимой с двунаправленными интерфейсны­
благодарности читателю Тому Крайтсу (Tom Crites)
ми модулями. И хотя библиотека не предназначена
за эту ссылку.
для двустороннего обмена, она может быть моди­
фицирована также и для отправки данных. Методы
для отправки данных из скетча проекта пред­
ставляют собой простые заглушки, поэтому вам,
чтобы их использовать, придется добавить в них
свой код. Библиотека должна быть совместимой
384 Глава 9

Внимание! Эти цвета (слева направо:


Разъем R J-11 желтый, зеленый, красный, черный)
к интерфейсному соответствуют цветам проводов
модулю Х10 обычного телефонного кабеля под
разъем RJ-11. Они не обозначают
линии плюса и минуса питания
и передачи данных, как можно
было бы ожидать

+5V

AREF С чи ты ватель
RES 2200
Reset GND ID-12
GND
+3.3V D13
+5V D12
Gnd D11/PWM
Gnd D10/PWM
L / 1 v / 1 V V IV I

Vin D9/PWM
\JJ 1 V V IV I

D8
Модуль Arduino
D7
D6/PWM

Analogo D5/PWM Интерфейсный


модуль Х10
A1 D4 PL513

A2 D3/PWM +5V
A3 D2
A4 Digitali/TX ► 10KQ
X
A5 DigitalO/RX

Рис. 9.12. Схема для проекта RFID на Х10: а — макетная; б — принципиальная. Линия сброса считывателя RFID ID-12
подсоединена к линии сброса микроконтроллера, чтобы сброс всегда выполнялся одновременно для них обоих
Идентификация 385

- ® а Что такое X I 0?
Протокол связи по линиям электропроводки X I0 как про него заведомо известно, что он работает.
предназначен для автоматического управления до­ Тогда, если модуль управления приборами или
машним электрооборудованием. Такие компании, лампами в вашем проекте не отвечает должным
как Smarthome (w w w .sin arth om e.com ) и X10.com образом, вы сможете, по крайней мере, организо­
(w w w .xlO .com ) поставляют различные устрой­ вать его взаимодействие с модулем панели управ­
ства, связь с которыми осуществляется по линиям ления, что позволит вам определить, проходят ли
электропроводки по протоколу Х10, — камеры, данные по линиям электропередачи. Компания
датчики движения, панели управления выклю­ Smarthome предоставляет варианты всех этих че­
чателями и многие другие. Это медленный про­ тырех типов модулей X I0:
токол с ограниченной функциональностью, но в
течение многих лет он пользуется популярностью
• и н тер ф ей сн ы й м одуль —
однонаправленный
интерфейсный модуль стандарта Х1013, номер
среди энтузиастов домашней автоматизации, так
детали 1134В. Модуль имеет две распростра­
как оборудование для него сравнительно недоро­
ненные версии: PL513 и TW523, которые, по
гое и легкодоступное.
сути, работают одинаковым образом. Но мо­
По сути, протокол X I0 — это синхронный по­ дуль TW523 — двунаправленный, то есть он
следовательный протокол наподобие протоколов может отправлять и принимать сигналы Х10,
I2C или SPI. Но биты данных передаются не по в то время как модуль PL513 может только по­
перепаду сигнала тактирования, а по переходу сылать сигналы;
переменного напряжения через нулевое значение.
Это означает, что максимальная скорость пере­
• —
м одуль уп р а в л ен и я у ст р о й ств а м и трех­
контактный модуль управления устройствами
дачи данных протокола X I0 составляет у нас 100
Х1014, номер детали 2002. Этот модуль спо­
битов в секунду, так как синусоида переменного
собен управлять любым устройством с потре­
тока пресекает нулевое значение дважды каждый
блением тока до 15 А, которое можно вставить
цикл, а частота переменного тока бытовых элек­
в розетку электросети;
тросетей в России равна 50 Гц. Самостоятельно
программировать протокол X I0 достаточно слож­ • м одуль уп р а в л ен и я л а м п а м и —
модуль
но, но многие системы разработки для микрокон­ управления лампами Powerhouse Х 1 0 15, номер
троллеров содержат библиотеки и для работы с детали 2000. Этот модуль может управлять
этим протоколом. только лампами накаливания, но не неоновы­
ми лампами и не лампами дневного света;
Для разработки проектов X I0 полезно иметь в
наличии четыре типа устройств: интерфейсный • м одуль п ан ел и у п р а в л ен и я — мини-конт­
модуль, модуль управления устройствами, модуль роллер Х1016, номер детали 4030.
управления лампами и модуль панели управления.
Мы будем создавать собственные контроллеры, 13X I0 One-Way Interface Module.
но модуль панели управления полезно иметь под
14X I0 Appliance Module 3-Pin.
15 Powerhouse X I0 Lamp Module.
рукой в качестве инструмента диагностики, так 16 X I0 Mini Controller.

Адреса устройств Х10 имеют двухуровневую дисками для установки кодов блока и единицы. Для
структуру. Модуль использует 16 кодов блока, по­ этого проекта нам понадобятся, по крайней мере,
меченных буквами латинского алфавита от А до Р. два модуля управления приборами или лампами.
Каждому из кодов блока можно присвоить до 16 Установите для первого модуля код блока А, а код
кодов единиц. Каждый модуль X I0 оснащен двумя единицы 1, а для второго — А и 2 соответственно.
386 Глава 9

Конструкция
Корпус для этого проекта похож на корпус для отсутствует, поскольку в этом проекте Ethernet не
клиентов проекта сетевого пинг-понга из главы 5. задействован. Вместо этого в корпусе делается от­
Более того, он делается по тому же самому шаблону верстие для прохождения кабеля Х10. На рис. 9.13
с небольшими изменениями высоты и ширины бо­ показан прототип корпуса (а) и доступная на рынке
ковых сторон. Корпус также имеет одно отверстие версия дверного замка RFID (б).
для светодиода, а отверстие для разъема Е& ете!

НЩз Другие последовательные порты:


программный последовательный порт
Аппаратный последовательный канал связи мо­ помощью к библиотеке БойлуагеБепа!. Одной ш
дуля Arduino (цифровые линии 0 и 1, обозначен­ предоставляемых этой библиотекой возможностей
ные RX и TX) позволяет ему осуществлять обмен является использование двух цифровых линий
данными, независимо от того, что делает в это микроконтроллера в качестве эмулятора УАПП
время исполняющийся на нем код. Это возмож­ Библиотека может ожидать входящие сигналы на
но благодаря встроенной в модуль специальной этих линиях, а также передавать по ним исходящие
микросхеме УАПП17, единственной задачей ко­ сигналы. Поскольку предоставляемый библиотекой
торой является обеспечение постоянного после­ эмулятор УАПП реализуется программно, на очень
довательного канала связи. Но что делать, если высоких или очень низких скоростях он менее наде­
нам требуется подключить к Arduino более чем жен, чем аппаратный УАПП, но работает хорошо на
одно устройство асинхронной последователь­ скоростях в диапазоне от 4800 бит/с до 57,6 Кбит/с,
ной связи? Модуль Arduino Mega 2560 оснащен Эмулятор УАПП может быть весьма полезен, когда
четырьмя УАПП, но эти возможности стано­ требуется дополнительный последовательный порт
вятся избыточными, когда нам требуется лишь или когда аппаратный порт используется для диаг­
один дополнительный последовательный порт. ностики, как делается в этом проекте.
В таких случаях мы можем обратиться за
17 УАПП, универсальный асинхронный приемопередатчик.

^ Т е с тируем часть R F ID ™ 1 /*
Считыватель RFID
Прежде всего нужно проверить Контекст : Arduino
работоспособность обеих частей */
нашей схемы. Следующий скетч #include <SoftwareSerial.h>
просто принимает данные из счи­ SoftwareSerial rfid(7,8); // Линия 7 - RX, 8 — ТХ
тывателя RFID через программ­
void setup() {
ный последовательный порт и // Инициализируем библиотеку serial:
записывает их на аппаратный Serial.begin(9600);
последовательный порт. Открой­ rfid.begin (9600) ;
те монитор портов и проведите }
пару-другую меток перед считы­ void loop() {
вателем. В окне монитора портов // Принимаем данные со считывателя и выводим их на экран
должны отобразиться их иден­ // монитора портов:
тификаторы. Запишите их, так if (rfid.available ()) {
char thisChar = rfid. read ();
как они понадобятся нам в даль­ Serial.write(thisChar);
нейшем:
►►
Идентификация 387

Рис. 9.13. Готовый корпус считывателя RFID (а) и доступный на рынке дверной замок RFID на входной двери
многоквартирного дома (6). Установка считывателя на двери предусматривает, что пользователь уберет метку
после того, как он проведет ею по считывателю. Таким образом решается проблема невозможности считывания
больше чем одной метки за раз. Во избежание путаницы проводов, прототип считывателя (а) питается от батареек

П Тестируем часть Х10 /*


Мигалка XIО
Убедившись, что считыватель Контекст : Arduino
RFID работает должным образом, */
;переходим к тестированию выво­
!да Х10. Этот скетч включает на #include <xl0.h>
!
j
IIполсекунды, а затем выключает const int rxPin =3; // Линия приема данных
устройство по адресу А1. Чтобы const int txPin = 4; // Линия передачи данных
проверить его работу в действии, const int zcPin =2; // Линия пресечения нуля
вставьте интерфейсный модуль
i I0 в розетку электросети, в
X void setup () {
другую розетку электросети на // Инициализируем библиотеки serial и XIО
Serial.begin(9600);
той же самой цепи, что и первая,
xlO.begin(rxPin, txPin, zcPin);
вставьте модуль управления лам­
пами, а в него вставьте и включи­
те лампу. При исполнении скетча void loop() {
лампа должна мигать: // Открываем передачу на код блока А: ►►
388 Глава 9

□ xlO.beginTransmission(A);
Serial.println(«Свет включен:»);
// Посылаем команду включения лампы:
х10.write(ON);

delay(500);
Serial.println(«Свет выключен:»);
// Посылаем команду выключения лампы:
xlO.write(OFF) ;
xlO.endTransmission() ;
delay(500);

ЙЦ?В Маловероятно, что все заработает должным


образом с первого раза. Интерфейс Х10 из­
дневного света также обычно не работают с моду­
лями управления Х10, да они и не предназначены
вестен проблемами синхронизации при разработке для использования в таких модулях. Если вы сомне­
аппаратного и микропрограммного обеспечения с ваетесь, что конкретная лампа сможет управляться
его участием. Так, он не работает, когда передатчик модулем для ламп, воспользуйтесь модулем управ­
и приемник подключены к разным цепям электро­ ления устройствами.
сети, поэтому нужно знать, к каким цепям входного
Если лампы не включаются/выключаются долж­
распределительного щитка подключены ваши ро­
ным образом при управлении скетчем, сначала
зетки. Некоторые фильтры защиты от бросков на­
повытаскивайте все из розеток, установите адреса
пряжения и просто многорозеточные блоки также
устройств, снова повставляйте все в розетки, а за­
могут отфильтровывать сигналы X I0, поэтому убе­
тем выполните сброс модуля Arduino. Если и это не
дитесь, что модули X I0 вставлены непосредственно
поможет, убедитесь, что все устройства управления
в розетки электросети, а не в многорозеточные бло­
подключены к одной и той же цепи электросети, а
ки, которые могут быть оснащены фильтром бро­
также избавьтесь от многорозеточных блоков (если
сков. Многорозеточные блоки с фильтром бросков
вы их используете). Попробуйте включать и выклю­
лучше вставлять только в модули управления Х10.
чать модули управления с модуля панели управле­
Но при этом не вставляйте их в модули управления
ния. Проверьте, что панель управления не переда­
лампами, если только вы не будете вставлять в них
ет сигнал выключения всех модулей a l l units off
исключительно лампы.
одновременно с работой модуля Arduino. Если не­
Модули управления лампами X I0 позволяют управ­ обходимо, вытащите панель управления из розетки,
лять только пассивными нагрузками, то есть спо­ удостоверившись, что модуль управления лампами
собны включать/выключать лишь лампы накалива­ отвечает должным образом. Когда все модули зара­
ния. Это означает — никаких фенов, блендеров или ботают штатно, можно будет объединить програм­
чего-либо с электродвигателем. Компактные лампы мы для работы с REID и Х10.

Ш Усовершенствуем код /*
Проверка меток RFID
Этот скетч принимает данные | Контекст: Arduino
считываемых меток и сверяет их | */
со списком меток в памяти. Когда |
ему встречается совпадающая | // Включаем в скетч библиотеки X10 и SoftwareSerial:
метка, он проверяет состояние ! #include <xl0.h>
модуля X I0 управления лампами #include <SoftwareSerial.h>
или приборами, соответствую- |
щего этой метке, а затем соответ- | const int xlOZeroCrossing = 2; // Линия пересечения нуля X10
ствующим образом изменяет его I const int xlOTx = 3; // Линия передачи данных XI0
состояние: 1 ►►
Идентификация 389

ESI const int xlORx = 4; // Линия приема данных XIО


// (не используется)
const int rfidRx = 7; // Линия приема данных RFID
const int rfidTx = 8; // Линия передачи данных RFID
// (не используется)
int numTags = 2; // Количество меток в списке
String currentTag; // Строка для хранения
// данных текущей
// обрабатываемой метки
// Списки меток, имена и состояния единиц:
String tag[] = {
«10000CDFF7»,»0F00AD72B5»};
int unit[] = {
UNITJL, UNIT_2};
int unitState[] = {
OFF, OFF};

SoftwareSerial rfid (rfidRx, rfidTx);

void setup() {
// Инициализируем библиотеку serial:
Serial.begin(9600);
rfid.begin (9600);
// Инициализируем библиотеку XI0:
xlO.begin(xlOTx, xlORx,xlOZeroCrossing);
// Выключаем все лампы:
xlO.beginTransmission(A);
xlO.write(ALL_LIGHTS_OFF);
xlO.endTransmission();
}
EHМетод loop () просто прове­ void loop() {
ряет поступление новых байтов // Принимаем данные с последовательного порта и выполняем
//их разборку:
со считывателя RFID. Основная if (rfid.available ()) {
работа выполняется парой сле- readByte();
дующих методов:

□ Метод readByte () вызывается void readByte() {


при каждом поступлении нового char thisChar = rfid.read();
байта из считывателя RFID. Если // В зависимости от значения входящего байта,
входящий байт имеет значение // выполняем разные действия:
02, он начинает строку новой те­ switch(thisChar) {
кущей метки. Если значение бай­ // Если значение байта =02, мы в начале новой метки:
case 0x02:
та равно оз, метод сверяет теку­ currentTag =
щую метку со списком известных break;
меток, используя для этого метод // Если значение байта =03, мы в конце метки:
checkTags (). Если байт имеет лю­ case 0x03:
checkTags();
бое другое значение, метод про­ break;
веряет длину строки текущей // При любом другом значении, если строка текущей метки
метки и, если она меньше 10 бай­ // меньше, чем 10 байтов, мы все еще считываем эту метку:
тов, добавляет байт к строке: default:
if (currentTag.length() < 10) {
currentTag += thisChar;

} »
390 Глава 9

Ш Метод сЬескТадэО сверяет void checkTags() {


строку текущей метки со спи­ // Сверяем с каждым элементом списка меток:
for (int thisTag = 0; thisTag < numTags; thisTag++) {
ском известных меток. Если он
// Если входящая метка совпадает с текущей меткой списка:
находит совпадение, то сверяет
состояние соответствующего if (currentTag.equals(tag[thisTag])) {
устройства X I0 со списком со­ // Номер единиц начинается c l , но нумерация позиций
стояний устройств. Затем он по­ // списка — с 0:
сылает этому устройству приказ Serial.print(«unit « + String(thisTag +1));
// Начинаем передачу устройству:
изменить свое состояние с вклю­
xlO.beginTransmission(A);
ченного на выключенное или xlO.write(unit[thisTag]);
наоборот: // Изменяем состояние соответствующего устройства:
if (unitState[thisTag] == ON) {
unitState[thisTag] = OFF;
Serial.println(« Выключаем»);

else {
unitState[thisTag] = ON;
Serial.println(« Включаем»);
}
// send the new status:
xlO.write(unitState[thisTag]);
// end transmission to unit:
xlO.endTransmission();

Исполняя этот код, вы увидите, что считыва­ Самым простым решением этой проблемы будет
тель REID считывает только те метки, кото­ физически спроектировать систему таким образом,
рые вновь входят в его поле действия. Считыватели чтобы пользователь был вынужден убрать метку
RFID компании ID Innovations не могут считывать после того, как он провел ею по считывателю (см.
несколько меток, находящихся в их поле действия. рис. 9.13). Это решение наиболее широко приме­
Это важное ограничение. Оно означает, что взаи­ няется в коммерческих устройствах — например,
модействие меток со считывателем нужно реали­ входная дверь моего многоквартирного дома осна­
зовать таким образом, чтобы одновременно в поле щена замком RFID. Считыватель установлен вер­
действия считывателя могла находиться только одна тикально, что не позволяет оставить метку на нем,
метка, а для считывания другой метки предыдущая а замки внутренней двери открываются обычными
метка должна быть убрана. Пользователи системы ключами, что вынуждает жильцов убрать кольцо,
должны предпринять такое явное действие, чтобы несущее метку, и другие ключи, после того, как они
вызвать ее реакцию. По сути, это означает, что двое откроют входную дверь, если они хотят открыть
посетителей не могут одновременно поместить внутреннюю дверь.
свои брелки на считыватель.
Идентификация 391

4 с Проект 27
Твиты от RFID
К этому моменту мы познакомились с чтением меток RFID, но, кроме считываемых меток RFID,
существуют также метки, в которые можно записывать информацию. В первой части этого про­
екта мы воспользуемся высокочастотным считывателем RFID компании SonMicro для записи
ников Twitter в метки считывания и записи RFID популярного стандарта Mifare. А в его второй
части мы на основе микроконтроллера создадим считыватель для считывания данных с этих
меток и вывода их на ЖК-дисплей размером 2x16 символов. Таким образом мы свяжем физиче­
скую идентификацию тега RFID с сетевой идентификацией социальной сети Twitter.

Кроме простого хранения идентификатора, метки


RFID часто применяются и для выполнения других Требуемые компоненты
задач. В некоторых системах общественного транс­ ►
►Модуль чтения/записи RFID SM 130 компа­
порта метки RFID применяются в качестве проезд­ нии SonMicro, 1 шт.
ного билета — когда с них считывается значение
доступных средств, это значение уменьшается на ►
►Теги чтения/записи RFID компании Mifare,
стоимость проезда, а новое значение записывается 3 шт.
обратно на метку. Организаторы конференций так­ ►
►Модуль Arduino Ethernet, 1 шт.
же могут записывать на RFID-метки информацию
с визиток посетителей, и те смогут обмениваться ►
►Антенна на 13,56 МГц, 1 шт. Не нужна, если
считыватель оснащен встроенной антенной.
этой информацией, коснувшись меткой считывате­
ля. Технология коммуникации ближнего поля NFC18 ►
►Шилд RFID, 1 шт.
еще больше расширяет возможности такого обме­
на. Она задействует как пассивное, так и активное Далее приводится список деталей для схемы
взаимодействие, когда два устройства обменивают­ считывателя без шилда, если вы предпочи­
ся данными друг с другом на коротких расстояниях. таете этот способ:
Технология NFC реализуется несколькими стандар­ ►
►Сопротивления 4,7 К, 2 шт.
тами связи, включая некоторые стандарты RFID, —
например, стандарт ISO 14443А и В, который вклю­ ►
►Беспаечная макетная плата, 1 шт.
чает подстандарт Mifare. Вследствие этого устрой­
ства NFC часто совместимы со считывателями
и метками RFID стандарта Mifare. Технология
NFC быстро набирает популярность в мобильных и RFID в ближайшем будущем. Проекты, наподо­
телефонах и других мобильных устройствах, так бие того, который мы рассмотрим далее, могут
что ожидайте появления многих приложений NFC стать вполне обыденным делом.

18 NFC, Near Field Communications.

Схема
Считыватель RFID SM I30 компании SonMicro ра­ В первой части проекта мы будем взаимодейство­
ботает на напряжении питания 5 В и может взаи­ вать со средой Processing, используя канал асин­
модействовать с микроконтроллером посредством хронной последовательной связи. А во второй ча­
либо асинхронного последовательного канала, сти взаимодействие с микроконтроллером будет
либо синхронной последовательной шины I2C. Мы осуществляться напрямую посредством интер­
в этом проекте увидим в действии оба эти способа. фейса I2C.
392 Глава 9

+5V +5V +5V

Рис. 9.14. Принципиальная схема подсоединения считывателя RFID к модулю Arduino через шину I2C.
К каждой линии I2C нужно подсоединить нагрузочное сопротивление номиналом 4,7 К.
Эти сопротивления встроены в шилды TinkerKit и SparkFun

Для подключения считывателя SM130 к модулю использовать в качестве такого адаптера сам модуль
Arduino можно использовать любой из двух шил- Arduino. Для шилда SparkFun требуется скетч для
дов: шилд RFID компании TinkerKit и шилд RFID передачи данных с программного последователь­
Evaluation 13,56 МГц компании SparFun. Оба эти ного канала на аппаратный и наоборот. Для шилда
шилда позволяют подключать считыватель к микро­ TinkerKet нужно поставить переключатель после­
контроллеру как через асинхронный последователь­ довательного канала в положение ON и загрузить
ный канал связи, так и через шину I2C (рис. 9.14). на плату пустой скетч. Оба эти скетча приведены
На шилде SparkFun с помощью впаиваемых пере­ далее.
мычек можно подсоединить цифровые линии 7 и 8
для программного последовательного канала связи. Единственная разница между двумя рассматри­
А шилд TinkerKit оснащен переключателем, кото­ ваемыми шилдами проявляется только при взаимо­
рый позволяет включать и выключать аппаратный действии со считывателем RFID по асинхронному
последовательный канал связи. Шилд SparkFun последовательному каналу, так как для этого они
оснащен встроенной антенной. Шилд TinkerKit используют разные линии. А при взаимодействии
имеет разъемы для внешней антенны, что позволя­ со считывателем по шине I2C, как мы будем делать
ет разместить ее относительно платы в требуемом далее в этом проекте, шилды функционально иден­
положении. тичны.

Для взаимодействия со средой Processing мож­ Для этого проекта использовался шилд RFID
но задействовать адаптер USB/TTL-Serial, как TinkerKit, но проект был протестирован с обоими
это делалось во многих других проектах, или же шилдами.
Идентификация 393

Если же вы предпочитаете не использовать ни на рис. 9.15. Затем загрузите скетч Arduino «Идем
один из этих шилдов, подсоедините считыватель в обход» (см. далее) и можно будет пробовать вы-
SonMicro к адаптеру USB/TTL-Serial, как показано полнить соответствующий скетч Processing.

Рис. 9.15. Развернутый вид монтажной


схемы подключения считывателя
RFID SonMicro к адаптеру USB/TTL-
Serial. Считыватель и антенна обычно
размещаются на макетной плате так
же, как показано в монтажной схеме
подключения считывателя через шину
I2C на рис. 9.16
!Ш i

т Рис. 9.16. Развернутый вид


подсоединения считывателя RFID к
модулю Arduino посредством шины
I2C. Показаны соединения, которые
Переходник пролегают на макетной плате под
USB/TTL-Serial модулем (см. рис. 9.17). Эта схема,
типа FTDI в общем, пригодна для шилдов как
TinkerKit, так и SparkFun. К каждой
линии I2C нужно подсоединить
нагрузочное сопротивление
номиналом 4,7 К. Схема не требуется,
если используется шилд RFID

ШИ
394 Глава 9

Рис. 9.17. Нормальный вид макетной схемы подсоединения считывателя RFID к модулю Arduino посредством
шины I2C. Считыватель и антенна размещаются на макетной плате таким же образом, что и при подключении
считывателя к модулю Arduino посредством адаптера USB/TTL-Serial (см. рис. 9.15)

Ш Идем в обход
(для TinkerKit) /*
Обход микроконтроллера модуля Arduino для считывателя
Этот скетч передает данные со RFID TinkerKit
считывателя RFID SonMicro, Контекст: Arduino
*/
расположенного на шилде RFID
TinkerKit, контролллеру USB/ void setup () {
TTL-Serial модуля Arduino, минуя }
микроконтроллер. При програм­
мировании платы таким образом (
void loop ) {
модуль Arduino функционирует, }
как адаптер USB/TTL-Serial для
считывателя SonMicro:

□ Идем в обход /*
Обход микроконтроллера модуля Arduino для считывателя RFID
(для SparkFun) SparkFun
Этот скетч передает данные, Контекст: Arduino

полученные со считывателя */
RFID SonMicro на шилде RFID #include <SoftwareSerial.h>
SparkFun, на аппаратный после­
довательный порт модуля Arduino // Используем линии 7 и 8 (на Arduino линия 7 —это TX, а 8 —RX)
и наоборот. При программиро­ SoftwareSerial rfid (7,8);
вании платы таким образом мо­
дуль Arduino функционирует, как void setup () {
адаптер USB/TTL-Serial для счи­
rfid.begin (19200) ; // Инициализируем программный
// последовательный порт
тывателя SonMicro: Serial.begin(19200) ; // Инициализируем
// последовательный порт
}
Идентификация 395

void loop() {
// Передаем данные с аппаратного порта на программный порт:
if (Serial.available()) {
rfid.write (Serial.read ()) ;
}
// Передаем данные с программного порта на аппаратный порт:
if (rfid.available ()) {
Serial.write (rfid.read ()) ;
}

П р О ТО К О Л С В Я З И Б О П М К Г О Версия протокола для шины 12С имеет следующий


формат:
Считыватели ИРГО компании 8опМюго применяют
для взаимодействия с другими устройствами двоич­ Длина Команда Данные Контрольная
ный протокол связи, причем и для взаимодействия сумма
по асинхронному последовательному каналу связи
1 байт 1 байт А байт 1 байт
и по шине 12С версии протокола весьма схожи.

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

Заголовок Зарезервировано Длина Команда Данные Контрольная сумма


1 байт 1 байт 1 байт 1 байт А байт 1 байт

Команды протокола имеют формат однобайтных Байт длины указывает длину команды, включая
значений. Наиболее часто применяемые команды следующие за ней данные. Например, команда
показаны в табл. 9.1. сброса, для которой никогда нет никаких дан­
ных, имеет длину в 1 байт. А команда чтения со­
Таблица 9.7. Некоторые команды
держит один байт данных, указывающий адрес,
протокола связи SonMicro
по которому выполнять чтение. Поэтому длина
Значение Команда этой команды 2 байта.
байта Контрольная сумма — это значение для про­
0x80 Сброс (Reset) верки команды на ошибки. Контрольная сумма
вычисляется сложением всех байтов команды и
0x81 Получить версию микропрограммного ее данных. Если полученное значение превыша­
обеспечения (Get firmware version) ет 255, берется младший байт. Например, кон­
0x82 Искать метку (Seek for tag) трольная сумма команды сброса вычисляется
следующим образом:
0x83 Выбрать метку (Select tag)
0x01 (длина) + 0x80 (команда) = 0x81
0x85 Аутентифицировать (Authenticate)
А для чтения, например, по адресу памяти 04,
0x86 Читать блок памяти (Read memory контрольная сумма будет следующей (обратите
block) внимание на тот факт, что значения приводятся
0x89 в шестнадцатеричном формате):
Записать блок памяти (Write memory
0x02 (длина) + 0x86 (команда) + 0x04 (адрес) =
block)
0х8С
0x90 Питание антенны (включить или вы­ Для асинхронного последовательного протоко­
ключить) (Antenna power) ла значение байта заголовка всегда равно Охее,
396 Глава 9

а зарезервированного байта — о. Эти значения приведена вразд. «Обновление микропрограммного


не включаются при вычислении контрольной обеспечения считывателей ЗопМ1сго» далее в этой
суммы команды, поэтому для этой версии про­ главе.
токола можно использовать те же команды и вы­
При исполнении скетча в верхней строке экрана
числения, что и для версии шины I2C, просто
выводится ответ от считывателя в шестнадцате­
добавляя в начале команды два байта со значе­
ричном формате, а в нижней — в формате А8СИ
ниями Ox f f и 0x00. Возвращаемые считывателем
(рис. 9.18).
ответы следуют этому же формату.
Команда для получения версии микропрограммно­
Для работы с протоколом связи SonMicro существу­
го обеспечения — единственная, которая возвраща­
ет библиотека как для Processing, так и для Arduino,
ет представление АЭСИ, поскольку это двоичный
поэтому знание этих протоколов не является обяза­
протокол. Команда выбора метки возвращает дво­
тельным, но познакомиться с их основами полезно.
ичную строку, подобную команде версии микро­
Напишем сейчас простой скетч Processing, который
программного обеспечения. Строка начинается с
посылает команду для получения версии микропро­
байта заголовка и зарезервированного байта (ОхРР,
граммного обеспечения считывателя, а затем выво­
0x00), затем следует байт со значением длины
дит ответ на экран.
команды (если есть метка — 0x06, если нет —
Считыватели SonMicro могут иметь разные версии 0x02), полученная команда (0x83), тип метки (0x02
микропрограммного обеспечения, поэтому жела­ означает классическую метку М1£аге), четыре бай­
тельно обновить ее на своем считывателе. Вы сэко­ та идентификатора метки (в данном случае: ОхОА,
номите много времени на диагностировании, узнав 0хБ4, 0хБ0, 0x28) и байт контрольной суммы
предварительно версию микропрограммного обе­ (0x81). А вот представление команды в АБСИ вы­
спечения своего считывателя. Процедура обновле­ глядит, как крякозябры.
ния микропрограммного обеспечения считывателя

Рис. 9.18. Окна с результатами


исполнения команд протокола
считывателя SonMicro в скетче
Processing:
а — команда чтения версии
микропрограммного обеспечения;
б — команда выбора метки
Идентификация 397

Ш ОбменданТГь»ми /*
Определитель версии микропрограммы считывателя SonMicro
Этот скетч Processing посылает Контекст: P r o c e ssin g
команды модулю SM130 и выво­ */
дит на экран результаты их испол­
im port p r o c e s s i n g . s e r i a l .* ;
нения. По умолчанию скорость
передачи данных считывателя
Serial myPort; // Последовательный порт
SM130 составляет 19 200 бит/с. String binarystring = «»;
Чтобы выбрать метку в поле, на­ S tr in g a s c i i S t r i n g = «»;
жмите клавишу <s>, а для чтения
версии микропрограммного обе­ void setup() {
спечения — любую клавишу: size(500, 200); // Размер окна
// Выводим на экран все доступные последовательные порты
println(Serial.list());
// Открываем порт, используемый микроконтроллером.
myPort = new Serial(this, Serial.list()[2], 19200);

void draw() {
// Цветовая схема мрачного морского пейзажа авторства aremll4,
// http ://kuler.adobe.com/
background(#7B9B9D);
fill (#59462E) ;
// Выводим ответ в шестнадцатеричном формате и ASCII:
text(binarystring, 10, height/3);
text(asciiString, 10, 2*height/3);

void keyReleased() {
int command = 0x81; // Команда по умолчанию — определение
// версии микропрограммы
int dataLength = 1; // Длина данных обеих команд — 1 байт
if (key == 's') { // Команда "выбор метки"
command = 0x83;

// Посылаем команду:
myPort.write(OxFF);
myPort.write(0x00);
myPort.write(dataLength);
myPort.write(command);
myPort.write(command + dataLength);
// Сбрасываем строки ответа:
binarystring =
asciiString =

void serialEvent(Serial myPort) {


// Получаем следующий входящий байт:
char thisChar = (char)myPort.read();
// Добавляем байт к строкам ответа:
binarystring += hex(thisChar, 2) + « «;
asciiString += thisChar;
398 Глава 9

-Шп Обновление микропрограммного обеспечения


считывателей SonMicro
Считыватели RFID SM 130 компании SonMicro по которой можно обратиться к компании с техни­
могут иметь разные версии микропрограммного ческим вопросом.
обеспечения. Различные поставщики предостав­
ляют разные модели считывателя, поэтому будет Подсоедините считыватель RFID к компьютеру
разумно первым делом по приобретении своего с помощью адаптера USB/TTL-Serial (для это­
проверить версию его микропрограммного обе­ го подойдет метод, примененный в предыдущем
спечения. Все версии микропрограммного обеспе­ скетче). Запустите приложение SM12X FU, на­
чения обладают возможностью последовательно­ жмите кнопку «...» и в открывшемся окне нави­
го взаимодействия, поэтому приведенный ранее гации по файловой системе компьютера выберите
скетч можно использовать как универсальный файл микропрограммного обеспечения, которым
инструмент для проверки версии микропрограм­ должен обновляться модуль RFID. Файл будет на­
мы. Подробную информацию о версиях микро­ зываться i2c_28_M.rme или как-то так, в зависимо­
программного обеспечения можно найти на веб­ сти от номера версии. Выбрав требуемый файл,
сайте компании SonMicro (www.sonmicro.com) нажмите кнопку Auto Upgrade (рис. 9.19, а).
в разделе Products 113.56 MHz RFID - MIFARE | Начнется процесс обновления микропрограммно­
OEM Modules & Readers. Если ваше устройство го обеспечения, в ходе которого в нижней части
имеет микропрограммное обеспечение версии окна программы будут выводиться информацион­
UM 1.3 или UM 1.3с, вам придется его обновить, ные сообщения, последним из которых станет со­
чтобы получить возможность управлять им по­ общение об успешном выполнении обновления.
средством интерфейса I2C. Микропрограммное
обеспечение версии I2C 2.8 или другой версии Но на этом наша работа еще не завершена.
I2C позволяет взаимодействовать с модулем по­ Закройте программу обновления и запустите ди­
средством как интерфейса I2C, так асинхронного агностическую программу SMRFID Mifare v i.2.
последовательного канала связи. В раскрывающемся списке Com Port выберите по­
следовательный порт, к которому подключен ваш
Для обновления микропрограммного обеспечения считыватель RFID, а затем выберите опцию Read
вам потребуется персональный компьютер с опе­ I2C Address в меню Hardware Commands. Если
рационной системой Windows, средство обнов­ ответ НЕ будет 0x42, следует изменить адрес I2C.
ления микропрограммного обеспечения SM13X Для этого в меню Hardware Commands выберите
FU и диагностическое программное обеспечение опцию Set I2C Address, в открывшемся диалого­
SMRFIED Mifare v i.2. Загрузить оба эти инстру­ вом окне введите 42, а затем нажмите кнопку ОК,
мента можно с веб-сайта компании SonMicro на чтобы закрыть это окно. Адрес I2C считывателя
вкладке Software раздела Support | 13.56 MHz будет изменен на 0x42, который является адресом
RFID - MIFARE | Downloads. Загрузите инстру­ по умолчанию и используется в последующих
менты, распакуйте и поместите в удобную для вас примерах для Arduino (рис. 9.19, б).
папку. Устанавливать их не требуется. Вам так­
же понадобится программное обеспечение I2C. Сработавшие приложения больше не требуются,
Чтобы его получить, вам надо будет отправить их вообще-то можно закрыть и продолжить ра­
по электронной почте в компанию SonMicro со­ боту над проектом, но исследовать приложение
ответствующий запрос. Они реагируют на такие SMRFID Mifare будет нелишне. Это полезный ин­
запросы быстро и дружелюбно, кроме того, на струмент для чтения и записывания меток, а так­
странице Support | 13.56 MHz RFID - MIFARE же для выполнения диагностики модулей RFID
имеется ссылка Contact us for Technical Inquries, SM130.
Идентификация 399

<T X » H ‘ i W < n g L № (Read ЕС Slave Address)


‘"Timeout.No Response***
** “Timeout Mo Response*4*
TX>FFC0 Ot St 82 (Read Firmware Version)
га«ГТООО88148Э24Э20 322Е 381Т EC 2.S FIRMWARE VERSON
;T> *Ff СИНИ 9C9D (Read i2C Save Address*
iRX <FFC0 029C 42СО В Slave Address ia,0x 42

Рис. 9.19. Окна программы обновления микропрограммного обеспечения модулей SM130 (а)
и программы диагностики этих модулей (б).
По завершению обновления микропрограммного обеспечения модуля, результаты проверки версии должны
выглядеть в программе диагностики наподобие показанных на этом рисунке

Запись меток Mifare


Теперь, когда мы кое-что знаем о протоколе представлении. При работе с устройством, обла­
SonMicro, можно попробовать записывать данные дающим многими возможностями, каким является
на метки. Для этого нам потребуется библиоте­ модуль SM130, иногда стоит создать инструмент
ка SonMicroReader для Processing, которую мож­ для работы со всеми его функциями (или, по край­
но загрузить по адресу https://github.com/tigoe/ ней мере, с наиболее часто употребляемыми). На
SonMicroReader-for-Processing. Распакуйте за­ рис. 9.20 показан пользовательский интерфейс, вы­
груженный архив и скопируйте полученную папку водимый при исполнении скетча.
в подпапку libraries папки Processing, а затем пере­
запустите среду Processing. Выполните последова­ Запустите скетч на исполнение и нажмите кнопку
тельность команд меню File | Examples и в открыв­ firmware version, чтобы получить версию микро­
шемся диалоговом окне Java Examples разверните программного обеспечения вашего считывателя, —
узел Contributed Libraries. Он должен содержать просто чтобы убедиться в наличии надежной связи
только что добавленную библиотеку. Теперь мы го­ с ним. Затем попробуйте прочитать несколько меток,
товы создать наш скетч для записи данных на мет­ нажав кнопку select tag. Когда на считывателе нет
ки. Назовем этот файл SonMicroWriter0002.pde. меток, скетч выводит соответствующее сообщение.
Но при нажатии кнопки seek tag сначала выводится
Наш скетч имеет графический интерфейс пользова­ сообщение, что происходит выполнение команды.
теля с кнопками для выполнения распространенных А при внесении метки в зону действия считывателя
команд и выводит результаты исполнения команд ее считывание выполняется автоматически, без не­
как в текстовом формате, так и в шестнадцатеричном обходимости посылать команду для этого.
400 Глава 9

Рис. 9.20. Окно скетча


Processing SonMicro Writer
с ответом на успешное
выполнение команды
чтения блока

Кроме идентификатора метки, который нельзя из­ метки предоставляется доступ к одному блоку па­
менить, метки Mifare содержат небольшой объем мяти размером 16 Кбайт за раз.
RAM19, в которую пользователь может записывать
данные и считывать их. Объем этой памяти для Процедура чтения и записи блока памяти всегда вы­
меток Mifare Standard — 1 Кбайт, Mifare Classic — полняется в такой последовательности:
4 Кбайт, а для Mifare Ultralight — 512 битов. Первые
1. Выбор метки.
два типа меток используют зашифрованную связь
2. Аутентификация.
для операций чтения и записи, и прежде чем вы­
3. Запись (или чтение) блока.
полнять такие операции, требуется проверить под­
линность метки. В процессе проверки подлинности Далее приводится исходный код скетча.

19 RAM, Random Access Memory — оперативная память.

ЕЛ Записываем метки __ /*
Работа с модулем RFID SonMicro
Этот скетч Processing позволяет Контекст: Processing
читать и записывать содержи­ */
мое памяти меток Mifare с по­
мощью модуля RFID SM130. // Импортируем библиотеки
В нем используется библиотека import processing.serial.*;
SonMicroReader для Processing. import SonMicroReader.*;

Глобальные переменные для это­


String tagID = «»; // Строка для идентификатора метки
го скетча в основном представ­
Serial myPort; // Экземпляр последовательного порта
ляют свойства последней прочи­ SonMicroReader myReader; // Экземпляр библиотеки
танной метки. Массив ArrayList // SonMicroReader
применяется для отслеживания
кнопок графического интерфей­ int lastCommand = 0; // Последняя отправленная команда
са и их названий: int lastTagType = 0; // Последний полученный тип метки ►►
Идентификация 401

Cl int lastPacketLength = 0; // Последняя полученная длина пакета


String lastTag = null; // Последний полученный
// идентификатор метки
int lastErrorCode = 0; // Последний полученный код ошибки
int[] lastResponse = null; // Последний ответ от модуля
// (неотформатированные данные)
int lastAntennaPower = 0; // Последнее полученное значение
// мощности антенны
int lastChecksum = 0; // Последняя полученная контрольная
// сумма

int fontHeight = 14; // Размер шрифта выводимого


// текста
String message = null; // Сообщение, считанное с метки
String outputstring = 'Hello world!"; // Строка для записи
// на метку

// Цветовая схема: Ghostly Music


// Автор: banshee prime, http://kuler.adobe.com
color currentcolor = #CBD0D4; // Цвет текущей кнопки
color highlight = #745370;
color buttoncolor = #968195;
color userText = #444929;
color buttonText = #ACB0B9;
ArrayList buttons = new ArrayListO; // Список кнопок
// Названия кнопок
String[] buttonNames = {
«antenna power», «select tag», «authenticate», «read block»,
«seek Tag», «write block», «firmware version»

ш Метод setup о инициализи­ void setup () {


рует последовательное подклю­ // Задаем размер окна:
size (600, 400);
чение и создает экземпляр биб­
// Выводим список всех последовательных портов:
лиотеки SonMicroReader. Затем
println(Serial.list());
он создает шрифты для вывода
текста на экран и вызывает метод / / Н а основе списка последовательных портов,
makeButtonsO ДЛЯ СОЗДанИЯ КНО­ // предоставленного
ПОК интерфейса. Методы для со з­ // предыдущей командой, замените выделенный жирным шрифтом
// номер порта на порт, используемый вашим модулем RFID.
дания кнопок и управления при­
String portnum = Serial.list()[0];
водятся далее, в конце скетча:
// Инициализируем последовательный порт. По умолчанию,
// скорость передачи данных считывателя SM130 составляет
// 19200 бит/с.
myPort = new Serial(this, portnum, 19200);
// Инициализируем экземпляр модуля RFID:
myReader = new SonMicroReader(this, myPort);
myReader.start();

// Создаем шрифт из второго шрифта, доступного системе:


PFont myFont = createFont (PFont.list () [2], 1опШе1д1^) ;
textFont (туРоп^ ;
// Вызываем метод для создания кнопок:
такеВи^опэ () ;
►►
402 Глава 9

Ш Метод draw о выводит на void draw() {


экран текст и кнопки: background(currentcolor);
// Рисуем кнопки команд:
drawButtons ();
// Рисуем поля вывода :
textAlign(LEFT);
text(«Command: « + hex(lastCommand, 2), 10, 30);
text(«Packet length: « +lastPacketLength, 10, 50);
text(«Antenna power: « + lastAntennaPower, 10, 70);
text(«Tag type: « + lastTagType, 10, 90);
text(«Tag string: « + lastTag, 10, 110);
text(«Error code: « + hex(lastErrorCode, 2), 10, 130);

// Выводим шестнадцатеричные значения всех байтов ответа:


String responsestring = «»;
if (lastResponse != null) {
for (int b = 0; b < lastResponse.length; b++) {
responsestring += hex(lastResponse[b], 2);
responsestring += « «;
}
// Заворачивает текст, чтобы он не выходил за пределы
// кнопок и не засорял окно:
text(«Full response:\п» + responsestring, 10, 150, 300, 200);
}
// Выводим любые сообщения об ошибках от модуля RFID:
text(myReader.getErrorMessage(), 10, 210);
// Выводим последнее считанное с метки сообщение
text («last message read from tag:\n» + message, 10, 230);

// Выводим выходное сообщение:


text(«type your message to write to tag:\n», 10, 300);
fill (userText) ;
text(outputstring, 10, 320);

// Показываем версию библиотеки


fill (0);
text(«SonMicroReader version: « + myReader.version(),
width - 300, height - 30);

СИдля взаимодействия с модулем /*


RFID библиотека SonMicroReader Этот метод вызывается автоматически при поступлении
использует библиотеку Serial. действительного пакета данных со считывателя.
Когда появляются новые данные, */
она генерирует событие. Событие
void sonMicroEvent(SonMicroReader myReader) {
sonMicroEvent () ПРОИСХОДИТ ПрИ
// Получаем все релевантные данные с последнего пакета данных:
наличии ответа от считывателя. lastCommand = myReader.getCommand();
В этом скетче мы считываем в lastTagType = myReader.getTagType();
методе sonMicroEvent () все части lastPacketLength = myReader.getPacketLength();
ответа, включая идентификатор lastTag = myReader.getTagString();
lastErrorCode = myReader.getErrorCode();
метки, тип метки, любые данные,
lastAntennaPower = myReader.getAntennaPower();
возвращенные чтением блока па­
lastResponse = myReader.getSonMicroReading();
мяти, статус антенны и прочее: lastChecksum = myReader.getCheckSum() ; ..
Идентификация 403

// Если последняя отправленная команда была команда


// на чтение блока:
if (lastCommand — 0x86) {
int[] inputstring = myReader.getPayload();
message = «»;
f o r (int c = 0 ; c < inputstring.length; C + + ) {
message += char(inputstring[c]);

U ! При нажатии любой клавиши }


в окне скетча, ее значение добав­ /*
Если нажата клавиша, добавляем ее к строке вывода;
ляется к строке, которая затем
но, если нажата клавиша забоя (<Backspace>), удаляем строку:
записывается на метку RFID при */
подаче команды записи. Значения
клавиш добавляются к строке ме­ void keyTyped() {
тодом keyTyped(): switch (key) {
case BACKSPACE: // Очищаем строку
outputstring = "\0";
break;
default:
if (outputstring.length() < 16) {
outputstring += key;

else {
outputstring = "Строка вывода не может превышать
16 символов";

Функциональность кнопок
обрабатывается отдельным клас­ /*
Инициализируем все кнопки
сом Java в скетче, который назы­ */
вается Button. Применяются так­
же несколько методов для управ­ void makeButtons() {
// Определяем и создаем прямоугольную кнопку
ления списком кнопок, включая
for (int b = 0; b < buttonNames.length; b++) {
метод makeButtons (), КОТОрыЙ // Создаем новую кнопку со следующим именем в списке:
создает их изначально, и метод Button thisButton = new Button(400, 30 +b*30, 150, 20,
drawButtonsO, КОТОрЫЙ прориСО- buttoncolor, highlight,
buttonNames[b]);
вывает и обновляет их: buttons.add(thisButton);

/*
Прорисовываем все кнопки
*/
void drawButtons() {
for (int b = 0; b < buttons.size(); b++) {
// Получаем данную кнопку из массива ArrayList:
Button thisButton = (Button)buttons.get(b);
// Обновляем ее статус нажатия:
thisButton.update();
// Прорисовьюаем кнопку:
thisButton.display();
} ►

404 Глава 9

Е З Метод тоиэеРгеззесЦ) про- \ }


веряет наличие нажатых кно- 1 void mousePressed() {
пок. Если он выявляет нажа­ // Проходимся по всем кнопкам, активируем нажатую

тую кнопку, то вызывает метод | for (int b = 0; b < buttons.size(); b++) {


Button thisButton = (Button)buttons.get(b);
^ Ви^опАсЪ 1оп (), КОТОрЫЙ ПОСЫ- !
if (thisButton.containsMouse()) {
лает соответствующую команду |
doButtonAction(thisButton);
модулю БМ130: \
}

Ii }
I '*
j Если нажата одна из клавиш команд, вычисляем какая,
{ и предпринимаем соответствующее действие.
*/
| void doButtonAction(Button thisButton) {
] // Узнаем, какая клавиша нажата, по данным из массива ArrayList:
I int buttonNumber = buttons.indexOf(thisButton);
| // Посылаем соответствующую команду:

| switch (buttonNumber) {
case 0: // Задаем мощность антенны
| if (myReader.getAntennaPower() < 1) {
] myReader.setAntennaPower(0x01);

else {
myReader.setAntennaPower(0x00);
}
break;
case 1: // Выбираем метку
myReader.selectTag();
break;
case 2: // Выполняем аутентификацию
myReader.authenticate(0x04, OxFF);
break;
case 3: // Считываем блок памяти
myReader.readBlock(0x04);
break;
case 4: // Ищем метку
myReader.seekTag();
break;
case 5: // Записываем данные на метку - не больше 16 байтов
myReader.writeBlock(0x04, outputstring);
outputstring = «»;
break;
case 6: // Получаем версию микропрограммного обеспечения
myReader.getFirmwareVersion();
break;



Идентификация 405

СОТ Наконец, класс Button опре­


class Button {
деляет свойства и поведения
int х, у, w, h; // Расположение кнопок
кнопок:
color basecolor, highlightcolor; // Цвет кнопок и цвет
// выделения
Этот скетч не охватывает всех воз­ color currentcolor; // Текущий цвет кнопки
можностей модуля RFID SM130. String name;
Например, он выполняет запись
только в блок 4 памяти метки // Конструктор: задает все начальные значения для всех
Mifare, а также применяет толь­ // экземпляров класса Button
Button(int thisX, int thisY, int thisW, int thisH,
ко процедуру аутентификации по
color thisColor, color thisHighlight, String thisName) {
умолчанию. Но он предоставля­
x = thisX;
ет нам возможность записывать у = thisY;
и считывать метки, а, кроме того, h = thisH;
основу для понимания того, как w = thisW;
можно использовать функции basecolor = thisColor;
модуля SM130. highlightcolor = thisHighlight;
currentcolor = basecolor;
name = thisName;

// Если курсор мыши над кнопкой, изменяем цвет кнопки:


void update() {
if (containsMouse()) {
currentcolor = highlightcolor;
}
else {
currentcolor = basecolor;

// Рисуем кнопку*и ее текст:


void display() {
fill (currentcolor) ;
rect (x, y, w, h);
// Располагаем имя кнопки в ее центре:
fill (0) ;
textAlign(CENTER, CENTER);
text(name, x+w/2, y+h/2);

// Проверяем курсор мыши на нахождение в пределах


// прямоугольника кнопки:
boolean containsMouse() {
if (mouseX >= x && mouseX <= x+w &&
mouseY >= у && mouseY <= y+h) {
return true;
}
else {
return false;
}
406 Глава 9

Чтение меток Mifare


Чтобы подготовить площадку для следующей части Затем проверьте правильность записи следующей
этого проекта, запишите на RFID-метки с помощью процедурой:
предыдущего скетча следующие три ника социаль­
ной сети Twitter: 1. Поместите метку в область действия модуля
SM130.
• @molei tau 2. Нажмите кнопку select tag.
• @Kurt_Vonnegut 3. Нажмите кнопку authenticate.
• @pomeranian99 4. Нажмите кнопку read block.
Напомним последовательность команд для этого: Теперь, когда у вас есть пара записанных таким
образом меток, можно переходить к созданию сле­
1. Поместите метку в область действия модуля
дующей части проекта — считывателю твитов на
SM130.
основе Arduino.
2. Нажмите кнопку select tag.
3. Нажмите кнопку authenticate.
4. Нажмите кнопку write block.

Добавления в схему
Схема для этой части проекта такая же, как на выводов, предоставляющих плюсовое напряжение
рис. 9.16 и 9.17, но с добавлением к ней подклю­ и общий для этого потенциометра, соответственно.
чения Ethernet и ЖК-дисплея размером 2x16 сим­ Далее приводится небольшой пример для проверки
волов. Если вы уже используете модуль Arduino ЖК-дисплея.
Ethernet, тогда можете себя считать в этом плане
подготовленным. В противном случае подключите
шилд Ethernet к вашему модулю Arduino. И в лю­ Г ~1 л
бом случае подключите ЖК-дисплей, как показано i à Энергопотребление схемы
на рис. 9.21. Если вы используете не модуль Arduino Ethernet,
а шилд Ethernet, может потребоваться подвести
Убедитесь в работоспособности ЖК-дисплея, про­ для этой схемы внешнее питание. Все вместе:
верив его работу с помощью какого-либо примера модуль Arduino, шилд Ethernet и ЖК-дисплей —
из библиотеки LiquidCrystal, входящей в состав потребляют столько тока, что в момент чтения
программного обеспечения модуля Arduino. При метки считывателем вся схема потребует его
этом измените (если необходимо) в этих примерах больше, чем может предоставить шина USB
номера линий, чтобы они соответствовали вашему компьютера, что вызовет снижение напряже­
ЖК-дисплею. Номера линий в этих примерах были ния. В некоторых случаях эта проблема может
выбраны таким образом, чтобы не конфликтовать с быть решена подсоединением конденсаторов
линиями, используемыми контроллером Ethernet и емкостью 220 мкФ к линиям питания (+ и об­
карточкой SD. щий) шилда RFID. Но если это не поможет,
используйте внешний источник питания, ис­
Потенциометр со средним выводом на линии Al точник питания Power-over-Ethemet или плату
модуля Arduino служит для управления скоростью Arduino Ethernet вместо комбинации Arduino
прокрутки текста на ЖК-дисплее. Линии АО и А2 Uno + шилд Ethernet.
модуля Arduino используются в качестве цифровых
Идентификация 407

Обозначения D4-D7 на ЖК-дисплее


означают линии ЖК-дисплея,

A R EF
Reset GND
+3.3V D13
+5V D12
Gnd D11/PWM
Gnd D10/PWM
Примечание __ Vin D9/PWM
Линия АО используется в качестве
плюса для потенциометра с выводом Модуль 08
на линию А1. Arduino
Линия А2 используется в качестве D7
"земли" (общего) для потенциометра D6/PWM
Analogo D5/PWM
Ю кП " A1 D4
A2 D3/PWM
A3 D2
A4 Digital1/TX
A5 DigitalO/RX

Рис. 9.21. Монтажная (а) и принципиальная (б) схемы подсоединения ЖК-дисплея к модулю Arduino.
Подсоединение шилда Ethernet и модуля SM130 не показаны. Вставьте их в гнезда на модуле Arduino и они
подсоединятся должным образом, так как их линии не задействованы для подключения ЖК-дисплея. Второй
потенциометр, подключенный к линии А1, будет использоваться для управления скоростью прокрутки
408 Глава 9

/*
Проверка ЖК-дисплея
Этот скетч выводит на подсоеди­ Контекст : Arduino
ненный к модулю Arduino ЖК- */
дисплей количество секунд, про­
шедших с момента его запуска: // Подключаем библиотеку LiquidCrystal:
#include <LiquidCrystal.h>

// Инициализируем библиотеку номерами линий интерфейса


LiquidCrystal led(9,8, 7, 6,5, 3);

void setup() {
// Задаем количество столбцов и строк ЖК-дисплея:
led.begin(16, 2);
// Выводим сообщение на Ж-дисплей:
led.print(«Скетч исполняется в течение:»);
}

void loop () {
// Устанавливаем позицию курсора на столбец 0, линию 1
// (Примечание: Линия 1 — это вторая строка дисплея,
// так как нумерация начинается с нуля):
led.setCursor(0, 1);
// Выводим количество секунд, прошедших после сброса:
led.print(millis()/1000);

До сих пор мы использовали плату Arduino для вза­ со считывателем RFID. Но чтобы удостовериться
имодействия с модулем SM130 только в качестве в том, что все работает должным образом, и что­
адаптера USB/TTL-Serial. Но на этом этапе проек­ бы увидеть протокол I2C в действии, попробуйте
та мы станем взаимодействовать с модулем SM130 исполнить следующий скетч. Он посылает коман­
посредством интерфейса I2C. Библиотека Wire, ко­ ду считывателю для получения версии микропро­
торая входит в состав ПО Arduino, позволяет нам граммного обеспечения и выводит полученный от­
управлять устройствами, использующими шину вет в окно монитора портов. Некоторые части этого
I2C. Для основного скетча команды библиотеки скетча должны быть вам знакомы по протоколу свя­
Wire будут инкапсулированы в другую библиоте­ зи SonMicro.
ку, которая предназначена специально для работы

Пч итаем версию Считыватель версии микропрограммы модуля SM130


Контекст : Arduino

Этот скетч получает версию мик­


ропрограммного обеспечения
#include <Wire.h>
модуля SM130:
void setup () {
// Инициализируем библиотеки serial и I2C
Serial.begin(9600);
Wire .begin ();
// Даем считывателю время для выполнения сброса:
delay(2000); ►

Идентификация 409

ш Serial.printin("Запрашиваю версию микропрограммы");


// Открываем подключение I2C; адрес I2C для считывателя — 0x42:
Wire.beginTransmission(0x42);
Wire.write(0x01); // Длина
Wire.write(0x81); // Команда
Wire.write(0x82); // Контрольная сумма
Wire.endTransmission();

// Считывателю требуется 50 мс между ответами для стабилизации:


delay(50);
Serial.print(«Получаю ответ: « ) ;
// Ожидаем получения 10 байтов по шине I2C:
Wire.requestFrom(0x42ДО) ;
// Не делаем ничего, пока не получим новые байты:
while(!Wire.available()) {
delay(50);
}
/ / П о прибытии новых байтов на шину I2C, считываем их:
while(Wire.available()) { •
Serial.write(Wire.read());

// Переходим на новую линию:


Serial.println();

void loop() {

Исполнение этого скетча должно вывести в окне задачей, можно переходить к работе над следую­
монитора портов ответ наподобие следующего: щим скетчем.
Запрашиваю версию микропрограммы Этот скетч ищет метки RFID и по обнаружении
Получаю ответ: I2C 2.8у метки считывает блок 4 ее памяти. Если содержи­
мое памяти включает ник социальной сети Twitter,
Последний байт строки вывода — контрольная
скетч выполняет вызов API XML сети Twitter, что­
сумма значений байтов строки, отправленной счи­
бы получить последний твит (запись) данного поль­
тывателем в ответ на запрос. Если вы получили
зователя Twitter. Полученная запись выводится на
правильный ответ, можно двигаться дальше. В про­
ЖК-дисплей.
тивном случае снова перечитайте примечание про
энергопотребление после рис. 9.21.
Экономия памяти
Было бы удобно, если вместо запоминания число­
вых значений каждой команды, мы могли бы вы­ Скетч для этого проекта довольно сложный и за­
зывать команды по имени, как это делается выше нимает большой объем программной памяти мо­
в библиотеке для Processing. В этом нам поможет дуля Arduino. В этом плане имеет смысл обратить
библиотека SonMicro для Arduino. Более того, име­ внимание на то, что операторы вывода данных по­
на большинства ее методов такие же, как и мето­ следовательного канала связи имеют новый формат
дов библиотеки SonMicroReader для Processing. вида:
Загрузите последнюю версию этой библиотеки по
Serial.println(F(«Hello»));
адресу https://github.com/tigoe/SonMicroReader-for-
Arduino. Распакуйте загруженный архив и скопи­ Запись f () дает указание операторам print и println
руйте полученную папку в подпапку libraries пап­ сохранять заключенный в скобки текст в флеш-
ки Arduino. Переименуйте скопированную папку памяти, а не в оперативной памяти. Поскольку эти
на SonMicroReader, а затем перезапустите среду операторы применяются только для целей отладки
Arduino. Новая библиотека должна отобразиться в и не будут меняться, предлагаемый подход позволя­
списке Примеры меню Файл. Справившись с этой ет сэкономить оперативную память.
410 Глава 9

ISПолучаемтвит
Этот скетч состоит из большого
количества разнообразных фраг­ Веб-клиент для T w itte r RFID
ментов. С каждым из них связано Контекст : Arduino
по нескольку глобальных пере­ */
менных — таких как для текущей
метки, последней прочитанной #include <SPI.h>
метки, а также для адреса блока #include <Ethernet,h>
памяти тега, который нужно про­ #include CTextFinder.h>
читать. #include <Wire.h>
#include CLiquidCrystal.h>
Основной цикл loop о представ­
#include <SonMicroReader.h>
ляет собой простую автомати­
зированную процедуру. Он вы­
SonMicroReader Rfid; // Создаем экземпляр библиотеки
полняет разные задачи в зависи­
// ЗопМ1сгоБеабег
мости его текущего состояния, | unsigned long tag = 0; // Адрес текущей метки
поэтому для отслеживания этого \ unsigned long lastTag = 0; // Адрес предыдущей метки
состояния нам нужна отдельная ] int addressBlock = 4; // Блок памяти метки для чтения
переменная. Всего скетч имеет
четыре состояния: 1 int state = 0 ; // Текущее состояние скетча
• ожидание метки; !
{
j // Введите МАС-адрес и IP-адрес для вашего сетевого адаптера,
• чтение только что получен­ j // IP-адрес будет зависеть от вашей локальной сети.
ной метки; | // Вместо выделенных подчеркнутым шрифтом значений укажите
• отправка запроса HTTP; | // значения для вашего устройства.
I byte mac[] = { 0x00, ОхАА, ОхВВ, OxCC, OxDE, 0x01 };
• ожидание ответа сервера. | IPAddress i p (192,168,1,20); // Используется только
j / / в случае отказа DHCP
Независимо от состояния скет­
j IPAddress server (199, 59,149, 200) ; // Адрес API сети Twitter
ча, он должен обновлять ЖК-
Client client; // Подключение клиента
дисплей при каждом проходе че­
рез цикл loop о .
Затем, есть также обычные пе­ ì

ременные для параметров IP и


Ethernet:
П ~Н ам также нужно несколько String twitterHandle = // Ник пользователя Twitter
String tweet = «»; // Твит
глобальных переменных для от­ ì
int tweetBufferLength; // Объем памяти, резервируемой
слеживания состояния твитера // для твита
(пользователя Twitter), твита, вре­ ì int tweetLength = 0 ; // Действительный размер твита
мени последнего запроса HTTP long lastRequestTime = 0; // Время последнего подключения
и паузы между запросами: / / к серверу
int requestDelay = 15 * 1000; // Пауза между запросами HTTP
Наконец, нам нужны глобальные // Инициализируем библиотеку номерами линий интерфейса
переменные для различных ха­ LiquidCrystal led(9,8, 7, 6,5, 3);
рактеристик ЖК-дисплея и конс­ const int screenWidth = 16; // Ширина Ж-дисплея в символах
long lastScrollTime = 0; // Время последней прокрутки ЖКД
танты для потенциометра, управ­
int scrollDelay = 130; // Пауза между прокрутками ЖКД
ляющего скоростью прокрутки int cursorPosition = 0; // Положение курсора на ЖКД
ЖК-дисплея: const int potVoltage = A0; // Плюс питания для потенциометра
// скорости прокрутки ЖКД
const int potGround = A2; // Общий (земля) для потенциометра
// скорости прокрутки ЖКД
const int potlnput = Al; // Средний вывод потенциометра
// скорости прокрутки ЖКД ►►
Идентификация 411

Метод setup () инициализи­ void setup() {


// Инициализируем последовательную связь и считыватель:
рует связь: последовательный
Serial.begin(9600);
интерфейс, сеть Ethernet, связь
// Запускаем подключение Ethernet:
со считывателем REID по шине if (Ethernet.begin(mac) == 0) {
I2C, ЖК-дисплей. Метод также Serial.println(F("He удалось настроить Ethernet no DHCP"));
устанавливает высокий уровень Ethernet.begin(mac, ip);
на линии до и низкий на А2, ко­ }
торые будут служить в качестве // Устанавливаем высокий уровень на линии АО и низкий на А2
/ / и используем их как плюс и общий для потенциометра,
плюса и общего для потенциоме­ // управляющего скоростью прокрутки Ж-дисплея:
тра, управляющего прокруткой pinMode(potGround, OUTPUT);
ЖК-дисплея: pinMode(potVoltage, OUTPUT);
digitalWrite(potGround, LOW);
digitalWrite(potVoltage, HIGH);

// Резервируем 140 * 2 screenWidths + 3 дополнительных


// байта для твита:
tweetBufferLength = 140 + 2*screenWidth + 3;
tweet.reserve(tweetBufferLength);
Rfid.begin () ;
// Задаем количество столбцов и строк Ж-дисплея:
led.begin(screenWidth,2);
led.clear();
led.print(F("Ready"));

Ш Главный цикл loop о про­ void loop() {


веряет свое текущее состояние, switch(state) {
применяя для этого оператор case 0 : // Получаем метку
tag = Rfid.selectTag() ;
switch. Завершив выполнение
if (tag != 0) {
требуемых действий для каж­ // Если есть метка, выводим ее сведения:
дого состояния, цикл увеличи­ Serial.println(tag, HEX);
вает переменную состояния и в state++; // Переходим к следующему состоянию
следующем проходе переходит
к очередному состоянию. Если break;
обработка какого-либо состояния case 1: // Считываем блок памяти
if (Rfid.authenticate (addressBlock)) {
завершается неуспешно (напри­
Serial.print(F("Аутентифицирован "));
мер, не получается выполнить // Считываем метку, чтобы получить ник пользователя
аутентификацию или чтение с // twitter:
последней обнаруженной метки), Rfid.readBlock(addressBlock) ;
цикл возвращается к первому со­ twitterHandle = Rfid.getString();
// Отображаем ник:
стоянию ожидания метки.
led.clear(); // Очищаем предыдущие данные
led.setCursor(0,0); // Перемещаем курсор
Завершив проверку состояния, // в начало строки
цикл loop о обновляет ЖК-дис­ led.print(twitterHandle); // Ник twitter в верхней
плей. Он выводит ник пользо­ // строке
вателя Twitter в верхней линии Serial.println(twitterHandle);
state++; // Переходим к следующему
дисплея и прокручивает послед­ // состоянию
ний твит в нижней линии каждые
scrollDelay МИЛЛИСекунД*. else state = 0; // Возвращаемся к первому
// состоянию
break; ►►
412 Глава 9

case 2: // Подключаемся к серверу


// Если это новая метка или если прошла пауза запроса
// после последнего запроса HTTP:
if (tag != lastTag ||
millis () - lastRequestTime > requestDelay) {
// Пытаемся подключиться:
if (connectToServer()) {
state++; // Переходим к следующему состоянию
}
else state = 0 ; // Возвращаемся к первому состоянию

else state = 0 ; // Возвращаемся к первому состоянию


lastTag = tag;
break;
case 3: // Читаем ответ
tweetLength = readResponse();
state = 0 ; // Возвращаемся к первому состоянию
break;

// Если текст на ЖКД не прокручивался в последнее время:


±£ (ЬюееЬЬепдЬЬ > 0 && ш П И б О - 1азЬЗсго11Т1ше >
зсго1Юе1ау) {
// Прокручиваем текст на ЖКД:
зсгоП ЬопдЗШ пд (си гзо гР о зШ о п );
// Инкрементируем позицию курсора ЖКД:
±£ (си гзо гР о зШ о п < Ь^л/ееЬЪепди!) {
сигзогРозШоп++;
else {
cursorPosition = 0;
}
// Запоминаем время последней прокрутки ЖКД:
lastScrollTime = millis ();

и г Наконец, главный цикл об­ // Обновляем скорость прокрутки согласно второму потенциометру:
int sensorReading = analogRead(potInput);
новляет значение переменной // Сопоставляем задержке прокрутки в 100 - 300 мс:
зсго11Бе1ау В СООТВеТСТВИИ С ВВО- scrollDelay = map(sensorReading, 0, 1023, 100, 300);

наг
дом потенциометра на линии

Метод зсгоПЪопдзШпд о бе­


рет в качестве ввода 16-символь­
a i: }
// Данный метод берет подстроку строки твита для вывода
// ее на дисплей.
void scrollLongString(int startPos) {
ную подстроку длинного твита String shortString = // Строка для отображения
и отображает ее на ЖК-дисплее. // Проверяем, что осталось от достаточно длинной строки:
if (startPos < tweetLength - screenWidth) {
Начало и конец твита дополня­
// Берем 16-символьную подстроку:
ются достаточным числом сим­ shortstring = tweet.substring(startPos, startPos +
волов, чтобы он прокручивался screenWidth);
на экран и с экрана:
// Обновляем ЖКД:
led.clear(); // Очищаем предыдущие данные
led.setCursor(0,0); // Перемещаем курсор к началу
// верхней линии
led.print(twitterHandle); // Ник пользователя twitter
/ / в верхней строке
led.setCursor(0,1); // Перемещаем курсор к началу нижней
// строки
led.print(shortstring); // Твит, в нижней линии с прокруткой


Идентификация 413

ЦД Метод connectToServer () // Этот метод подключается к серверу и отправляет запрос HTTP GET:
очень похож на метод connect boolean connectToServer() {
клиента программы показателя // Запоминаем время этой попытки подключения:
качества воздуха из главы 4. Он lastRequestTime = millisO;

подключается к серверу и от­ // Пытаемся подключиться:


Serial.println(F(«Подключаемся к серверу»));
правляет запрос HTTP g e t . Но
if (client.connect(server, 80)) {
в нашем случае метод запраши­
Serial.println(F(«Отправляем запрос HTTP»));
вает не HTML-страницу, a XML-
// Отправляем запрос HTTP:
версию твита, которую можно
C l i e n t . p r i n t (F(«GET
получить по адресу http://api. / l / s t a t u s e s /u s e r _ t im e l in e .x m l? s c r e e n _ n a m e = » ) ) ;
twitter.com. Подобно другим clie n t.p r in t(tw itte r H a n d le );
веб-сайтам, сайт Twitter позво­ c l i e n t . p r i n t l n ( F (« HTTP/1 . 1 » ) );
лят получить версию сайта как c l i e n t . p r i n t l n ( F ( « H o s t : a p i . t w i t t e r . c o m » ) );
в человекочитаемом, так и в ма­ c l i e n t . p r i n t l n ();
шиночитаемом формате, вто­ retu rn tr u e ;
рой из которых предоставляется }
в формате XML: else {
Serial.print(F("He удалось подключиться "));
return false;

ш Метод readResponse () читает int readResponse() {


байты, поступающие от сервера char tweetBuffer[141]; // 140 символов + 1 дополнительный
после запроса HTTP, и ищет сре­
ди них начало и окончание тви­ int result = 0;
та. Это не представляет никаких // Если есть байты от сервера:
трудностей, так как твит удобно while (client.connected()) {

размещен между тегами <tweet> if (client.available()) {


// Создаем экземпляр библиотеки TextFindes для
и </ tweet> и все, что нужно сде-
// поиска в ответе:
лать, — это найти эти теги и воз­
TextFinder response(client);
вратить содержимое, находящее­
// Проверяем ответ сервера на содержание значения <text>:
ся между ними, игнорируя всю
response.getstring(«<text>», « < / text>», tweetBuffer, 141);
остальную часть потока:
// Отображаем строку твита:
Serial.println(tweetBuffer);
Если нужно все содержание // Создаем строку с заполняющими пробелами на обоих концах:
XML-страницы твита, открой­ tweet = « « + String(tweetBuffer)
те используемый скетчем адрес + « «;
(URL) в браузере и добавьте в его result = tweet.length();
конец ник пользователя Twitter, // Нас интересует только твит:
как показано далее: client.stop();

http://api.twitter.com/1/
statuses/user_timeline.xml?
}
return result;
screen_name=halfpintingalls
414 Глава 9

иагностика
В этом скетче многое может не работать должным • Удается ли скетчу установить связь с серве­
образом, поэтому необходимо четко понимать каж­ ром? Если нет, попробуйте исполнить клиент
дую из его составляющих и иметь план диагности­ для проверки HTTP из главы 4, используя в нем
ки. Далее приводится несколько советов, на что сле­ адрес (URL) из этого скетча.
дует обратить внимание при диагностике.
• Может ли скетч читать твиты пользователя?
• Входит ли скетч в каждое из своих четырех Проверьте, не выбрали ли вы такого пользова­
состояний? Если нет, определите, на котором теля Twitter, который не предоставляет доступа
из них он останавливается. Добавьте в скетч код к своим записям. Есть ли у него записи вооб­
для вывода сообщения, извещающего о входе в ще? Откройте запрашиваемый URL в браузере
каждое новое состояние, а также выводящего и найдите в исходном коде страницы теги
результаты предыдущего состояния. <tweet> вручную. Если они отсутствуют в коде
страницы, то как может скетч найти их?
• Выполняет ли скетч чтение меток? Может ли
он читать блоки памяти меток? Если нет, по­ • Работает ли ЖК-дисплей должным образом?
пробуйте исполнить один из скетчей примеров, Проверьте его работоспособность отдельно
входящих в состав библиотеки ЗопМюгоЛеаёег. с помощью монитора портов.
В частности, попробуйте исполнить пример
ЯеаёВ1оск, предназначенный для базовой опе­ Этот скетч содержит несколько операторов p r in t ,
рации чтения меток. предоставляющих информацию о ходе выполнения
скетча. Используйте также и их в процессе диагно­
стики.

Конструкция корпуса
Корпус для проекта представляет собой простую • припаяйте провода для линий D8 и D9 Arduino к
коробку из плотного картона, наподобие корпусов разъему с двумя штырьками;
для проекта из главы 5, но несколько иной компо­
• провода для линий D3 по D7 припаяйте к разъ­
новки. Антенна КЕШ и ЖК-дисплей подсоедине­
ему из пяти штырьков, пропустив штырек для
ны к микроконтроллеру проводами. Их можно за­
линии D4;
менить кабельным шлейфом или старым кабелем
ЕШете^ обрезав его разъемы. • провода для питания +5 В и общего также при­
паяйте к разъему с двумя штырьками.
Обязательно протестируйте схему, прежде чем по­
мещать ее в корпус! На рис. 9.23 показана выполненная таким образом
распайка жил кабеля Ethernet.
Установите ЖК-дисплей и потенциометр для управ­
ления контрастом дисплея на отдельной перфопла­ Подсоедините потенциометр для управления ско­
те, как показано на рис. 9.22. При желании для это­ ростью прокрутки к линиям с АО по А2, как пока­
го можно использовать шилд для прототипов, что, зано на рис. 9.21, используя для этого любой под­
впрочем, не обязательно — можно просто надеть на ходящий имеющийся под рукой провод.
провода наконечники и вставить их в плату. Чтобы
провода было легче вставлять в гнезда, рекоменду­ Прикрепите антенну RFID сверху корпуса с по­
ется сгруппировать их следующим образом: мощью застежки-липучки. Используйте гнездовой
Идентификация 415

разъем с длинными штырьками, чтобы антенна ж Рис. 9.22. Подсоединение ЖК-дисплея


находилась поверх проводов для ЖК-дисплея. и потенциометра к перфоплате
Размещение схемы внутри корпуса показано на
рис. 9.24.
^ Рис. 9.23. Распайка жил кабеля для подсоединения
Установите потенциометры в верхней панели кор­ к перфоплате
пуса, закрепив с помощью их крепежных гаек.
Установите ЖК-дисплей сверху корпуса с помощью
застежки-липучки или двусторонней клейкой лен­
ты. Плату Arduino к корпусу также можно успешно
прикрепить с помощью застежки-липучки.

В награду за все ваши труды вы получите удобный


считыватель сообщений Twitter, показанный на
рис. 9.25.

Запишите идентификаторы популярных пользова­


телей Twitter на несколько меток RFID, чтобы мож­
но было проверять их сообщения в любой момент.

Итак, мы создали связь между осязаемой иден­


тичностью, выражаемой метками RFID, и сетевой
идентичностью, выражаемой каналом социальной
сети Twitter.
О)
+5V
GND

00 VO Ю СО
О О о О о О
416 Глава 9

Рис. 9.24. Размещение схемы


внутри корпуса,, перфоплата для
ЖК-дисплея на переднем плане

Рис. 9.25. Готовый считыватель


твитов

йб Сетевая идентификация
До сих пор мы идентифицировали сетевые устройства по их адресам. Для устройств Интернета
в качестве идентификаторов используются как 1Р-адреса, так и МАС-адреса. Стандартные адре­
са также присваиваются устройствам стандарта 802.15.4. Но адрес устройства не предоставля­
ет нам никакой информации о самом устройстве или его функции.
Вспомните проект сетевого измерителя качества настольного компьютера наподобие Safari или
воздуха из главы 4. Там микроконтроллер посы­ Chrome или браузера мобильного телефона? Каким
лал запрос HTTP, а сценарий РНР возвращал ему бы образом он знал, как форматировать содержи­
ответ. Зная возможности микроконтроллера, мы мое ответа?
посылали ему достаточно короткий ответ, чтобы
микроконтроллер мог эффективно его обработать и Большинство протоколов связи для Интернета ого­
придать ему удобочитаемый формат. Но что, если варивают базовый обмен информацией об иден­
тот же самый сценарий РНР должен был бы отве­ тичности и возможностях отправителя и получа­
чать на запросы HTTP от Arduino Ethernet, браузера теля данных. Эта информация предоставляется
Идентификация 417

посредством заголовков, обмен которыми осу­ Переменные среды HTTP


ществляется на начальной стадии взаимодействия.
Такие заголовки можно продуктивно использовать Когда серверная программа — например, сцена­
при разработке сетевых систем подобных тем, с ко­ рий РНР, получает запрос HTTP, она имеет доступ
торыми мы имеем дело в этой книге. Вся область к намного большему объему информации о сервере,
интернет-заголовков слишком обширна для подроб­ клиенте и многом другом, что мы до этого момента
ного здесь рассмотрения, но два примера: по НТТР видели.
и электронной почте — полагаю, втиснуть удастся.

Ш Чтобы увидеть некоторую <?php


часть этой информации, сохра­ /*
ните следующий сценарий РНР Отображение переменных среды

как файл env.php на своем веб­ Контекст : РНР

сервере, а затем откройте его


Выводит на экран переменные среды
в браузере:
*/
foreach ($_REQUEST as $key => $value)
{
echo «$key: $value<br>\n»;
}
foreach ($_SERVER as $key => $value)
{
echo «$key: $value<br>\n»;
}
?>

В результате исполнения этого сценария в окне xml;q=0.9,*/* ;q=0.8


браузера должен отобразиться текст наподобие сле­ HTTP_ACCEPT_ENCODING: gzip, deflate, sdch
дующего: HTTP_ACCEPT_LANGUAGE: en-US,en;q=0.8
HTTP_ACCEPT_CHARSET: ISO-8859-1,utf-8;q=0.7, *;q=0.3
HTTP_COOKIE: __utmz=152494652.1295382826.13.2.
#CGI __utmz: 152494652.1295382826.13.2.utmccn
utmccn=(refer
= (referral)
ral)|utmcsr=itp.nyu.edu|utmcct=/physcomp/
Iutmcsr=itp.nyu.edu|utmcct=/physcomp/studio/
studio/Spring2011/
Spring2011/
Tomlgoe|utmcmd=referrai; utma=152494652.4029
Tomlgoe|utmcmd=referrai
68136.12880696
__utma: 152494652.402968136.1288069605.1308754
05.1308754712.1308768861.29
712.130876886
SERVER_SIGNATURE:
1.29
SERVER_SOFTWARE: Apache
PATH : /usr/local/bin:/usr/bin:/bin
SERVER_NAME: www.example.com
REDIRECT_HANDLER: php-cgi
SERVER_ADDR: 77.248.128.3
REDIRECTJ3TATUS: 200
SERVER_PORT: 80
UNIQUE_ID: Thtgla3sqiUAAFdwW-UAAAAP
REMOTE_ADDR: 66.168.47.40
SCRIPT_URL: /php/09_env.php
DOCUMENT_ROOT: /home/username/example.com
SCRIPT_URI: http://www.example.com/php/09_env.
php SERVER_ADMIN: webmaster@example.com
HTTP_HOST: www.example.com SCRIPT_FILENAME: /home/username/example.com/
php/0 9_env.php
HTTP_CONNECTION: keep-alive
REMOTE_PORT: 52138
HTTP_USER_AGENT: Mozilla/5.0 (Macintosh; Intel
Mac REDIRECTJJRL: /php/09_env.php
OS X 10_6_8) AppleWebKit/534.30 (KHTML, like Gecko) GATEWAY_INTERFACE: CGI/1.1
Chrome/12.0.742.112 Safari/534.30 SERVER_PROTOCOL: HTTP/1.1
HTTP_ACCEPT: text/html,application/ REQUEST_METHOD: GET
xhtml+xml,application/ QUERY_STRING:
418 Глава 9

КЕ<2иЕЗТ_ГО1: /рЬр/ 0 9_епу.рЬр Например, параметр нттр изЕИ АСЕЫт содержит на­
Э С М Р ^ А М Е : /рЬр/09_епу.рЬр звание браузера клиента. На основе этой инфор­
ОК1С_ЗСК1РТ_Е1ЬЕЫАМЕ: /dh/cgi-system/php5.с д ±
мации мы можем определить устройство клиента:
0К16_РАТН_1ЫЕ0: /php/09_env.php
ОИI6_РАТН_ТРАЫЭЬАТЕБ: /11оте/изегпате/ехатр1е.
мобильный телефон, настольный компьютер или
сот/рИр/О 9_епч.рИр что-либо другое — и предоставить соответствую­
ОК16_ЗСР1РТ_ЫАМЕ: /cgi-system/php5.сд1 щее содержимое для каждого из них. Другой па­
РНР_ЭЕЪЕ: /php/09_env.php раметр: нттр_АССЕРТ_1тшсиАСЕ — предоставляет
КЕаиЕЗТ_Т1МЕ: 1310417045
информацию о языке, на котором клиент хотел бы
получить ответ на свой запрос. А совместив пара­
Как можно видеть, этот текст содержит большой
метр кемоте_аоек с проектом геокодирования по 1Р-
объем информации: 1Р-адрес веб-сервера и клиента, адресу, следующим далее, можно сделать разумное
тип браузера, путь к папке сценария и многое дру­ предположение о местонахождении клиента, пола­
гое. Возможно, вы никогда и не подозревали, что гая, разумеется, что запрос не был отправлен через
простой запрос НТТР может предоставить столько прокси-сервер.
информации, включая информацию и о клиенте,
и это лишь малая толика ее. Такая возможность
очень полезна для разработки серверных сцена­
риев, которые могут по-разному отвечать разным
клиентам.

I*
iX Проект 28
Геокодирование по 1Р-адресу
В следующем примере 1Р-адрес клиента используется, чтобы определить широту и долготу его
местонахождения. Эта информация берется с сайта www.hostip.info, который представляет
собой общественный проект геокодирования по 1Р-адресу. Данные этого сайта не всегда самые
точные, но они доступны бесплатно. Следующий сценарий также использует агент НТТР поль­
зователя, чтобы определить тип клиента: браузер на компьютере или же модуль Е^егпет На
основе полученной информации он форматирует свой ответ должным образом для каждого
типа устройства.

Ш Определяем <?php
/* IP geocoder
местонахождение Контекст : PHP
Использует IP-адрес клиента, чтобы определить широту
Сохраните следующий сценарий
и долготу его местонахождения.
на своем веб-сервере в файле \р_ Использует агент пользователя клиента для форматирования ответа.
деосос1ег.р 11р: */
// Инициализируем переменные:
$lat = 0;
$long = 0;
$country = "unknown";
// Смотрим, каким типом клиента является данный:
('
$userAgent = getenv HTTP_USER_AGENT ');
// Получаем IP-адрес клиента:
$ipAddress = ('
getenv REMOTE ADDR ');
Идентификация 419

Ш Веб-сайт www.hostip.info воз­ // Обращаемся к сайту http://www.hostIP.info, чтобы получить


вращает широту и долготу для // широту и долготу для IP-адреса. Сначала составляем строку
// запроса HTTP:
предоставленного ей IP-адреса $IpLocatorUrl = «http://api.hostip.info/?&position=true&ip=»;
в удобном XML-формате. Эта / / Добавляем IP-адрес:
информация заключена в теге $IpLocatorUrl .= $ipAddress;
<gml : coordinates>, КОТОрЫЙ М Ы / / Отправляем запрос HTTP:
и будет искать. Сначала состав­ $filePath = fopen ($IpLocatorUrl, «г») ;
/ / Выполняем, пока не дойдем до конца входящего текста:
ляем строку запроса HTTP и от­
while (! feof ($filePath)) {
правляем запрос. Затем ожидаем / / Считываем по одной строке за раз
ответ в цикле while, а получив от­ $line = fgets ($filePath, 4096);
вет, разбираем его на составные / / Если строка содержит координаты, это нужная нам строка:
части: if (preg match ( */<gml : coordinates>/' , $line)) {
$position = strip_tags($line); / / Удаляем теги XML
$position = trim($position); / / Удаляем пробелы
$coordinates = explode («,», $position); / / Разделяем no
/ / запятым
$lat = $coordinates[0];
$long = $coordinates[1];
}
}
Q Определив местоположение, // Закрываем подключение:
узнаем, какому типу клиента мы fclose ($filePath) ;
отправляем результаты, и форма­ // Определяемся с форматом вывода на основе типа клиента:
тируем ответ должным образом. switch ($userAgent) {
Нам требуется информация из case "arduino":

агента пользователя HTTP: // Для Arduino требуется аккуратный короткий ответ:


echo «<$lat,$long,$country>\n»;
break;
case «processing»:
// Для Processing можно возвращать строки:
echo «Широта : $1аЬ\пДолгота: $1опд\пСтрана: $country\n\n»;
break;
default :
/ Другим клиентам можно посылать длинный ответ:
echo < « E N D

<html>
<headx/head>

<body>
<h2>Bame местонахождение:</h2>
Ваша страна: $country<br>
Ваш IP: $ipAddress<br>
Широта: $lat<br>
Долгота: $long<br>
</body>
</html>
END;
}
?>
420 Глава 9

Если вызвать этот сценарий из браузера, // Отправляет запрос HTTP GET:


в ответ будет получена версия HTML. Чтобы String requeststring = «/~yourAccount/ip__
geocoder.php";
получить ответ для Processing или Arduino, нужно
client.write("GET " + requeststring + "
отправить специальный запрос HTTP. Из програм­
HTTP/1.0\r\n");
мы терминала запрос можно послать следующим client.write("HOST: example.com\r\n");
образом. client.write("USER-AGENT: processing\r\n\r\n");
Сначала подключаемся к серверу, как мы это дела­ Использование переменной агента пользователя
ли раньше (замените выделенный жирным шриф­ u s e r -a g e n t подобным образом может значительно
том URL на URL вашего веб-сервера): упростить вашу задачу разработки, поскольку это
telnet exaraple.com 80 позволяет вам с легкостью применять браузер или
командную строку для отладки программ, разраба­
Затем отправьте следующие строки (нажмите клави­ тываемых для клиентов любого типа.
шу <Enter> дважды после ввода последней строки):
GET /~yourAccount/ip_geocoder.php НТТР/1.1
HOST : example.com Переменные среды
USER-AGENT: arduino
электронной почты
Сервер должен возвратить ответ наподобие следу­ Электронная почта позволяет организовать более
ющего: гибкие и сложные взаимоотношения между объ­
НТТР/1.1 200 ОК ектами, чем на основе использования IP-адресов.
Date: Thu, 21 Jun 2007 14:44:11 GMT Объект может предоставлять сведения не только
Server: Apache/2.0.52 (Red Hat) о своей идентичности (адрес От:), но и информа­
Content-Length: 38 цию о том, кому бы он хотел, чтобы получатель
Connection: close отправил ответ (адрес Обратный адрес:), а также
Content-Type: text/html; charset=UTF-8 кому еще отправить исходное сообщение (адреса
Копия: и Скрытая копия:). Всю эту информацию
<40.6698,-73.9438,UNITED STATES (US)> можно предоставить, даже не используя поле темы
А если заменить агент пользователя с arduino на или тела письма. Язык РНР имеет простые инстру­
processing, ответ должен стать наподобие следую­
менты для выполнения разборки текста. Поскольку
щего: электронная почта используется для взаимодей­
ствия большим количеством устройств (функцию
НТТР/1.1 200 ОК отправки текстовых сообщений по мобильному
Date: Thu, 21 Jun 2007 14:44:21 GMT телефону также можно подключить к электронной
Server: Apache/2.0.52 (Red Hat)
почте), она расширяет диапазон устройств, которые
Content-Length: 64
можно добавить в систему.
Connection: close
Content-Type: text/html; charset=UTF-8 Подобно протоколу HTTP, протоколы электронной
Широта: 40.6698 почты имеют переменные среды, которые можно
Долгота: -73.9438 использовать для своих целей. Если вам когда-либо
Страна: UNITED STATES (US)
приходилось видеть полный заголовок сообщения
Как можно видеть, это очень мощная возможность. электронной почты в своем клиенте, вы уже знако­
И все, что нужно сделать, чтобы использовать мы с некоторыми из этих переменных. Для более
ее, — это добавить одну строку в запросы HTTP углубленной работы с электронной почтой можно
с Processing или микроконтроллера (см. главу 5). использовать функции почты IMAP20 языка РНР.
Просто добавьте дополнительный оператор print, Протокол электронной почты IMAP позволяет по­
чтобы отправить агента пользователя, и все готово. лучать сообщения с сервера почты от нескольких
В Processing или Arduino запрос HTTP будет выгля­ 20 IMAP, Internet Message Access Protocol — протокол доступа к
деть таким образом: интернет-сообщениям.
Идентификация 421

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

<?php
/*
Сохраните следующий сценарий mail reader
РНР на своем веб-сервере: Контекст : РНР

// Держите свою личную информацию в отдельном файле:


@include_once('pwds.php');

// Открываем подключение к ящику на gmail на порту 993 по SSL,


/ / н о без сертификата для подтверждения подключения:
$mailServer = '{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX’;
$mbox = imap_open($mailServer, $user, $pass);

// Получаем заголовки сообщений в почтовом ящике:


$headers = imap_headers($mbox);

// Если нет заголовков, нет и сообщений:


if ($headers == false) {
echo "He удалось получить почту<Ьг />\п";
} else {
// Выводим на экран количество сообщений:
echo "Кол-во сообщений: ".imap_num_msg($mbox);
echo "\n\n";
// Выводим на экран заголовок первого сообщения:
echo imap_fetchheader($mbox,1);
}
// Закрываем входящий ящик:
imap_close ($mbox) ;
?>

ш Теперь создайте другой файл <?php


с именем pwds.php и также со­ $u sе г= 'имя_пользовао?еля’; // имя вашей учетной записи почты
храните его на своем веб-сервере. $pass=’пароль'; // пароль для входа в ваш
Этот файл будет содержать ваши // почтовый ящик
имя пользователя и пароль. ?>
Храните его в целях безопасно­
сти отдельно от основного фай­
ла РНР. Содержимое файла сле­
дующее:
Настройка разрешений
Сразу же после загрузки файла
Если вы используете клиент SFTP или FTP с графиче­
р\л/с18.р11р на веб-сервер измените
ским интерфейсом, настройки разрешений для файла
его разрешения, чтобы только его будут выглядеть наподобие показанных на рис. 9.26.
владелец (то есть вы сами) могли Эта защита не позволит кому-либо, кто не имеет раз­
его просматривать и в него за­ решения на доступ к вашей учетной записи, получить
писывать. Для этого выполните ваши учетные данные. Это не идеальная защита, но она
в командной строке терминала служит для демонстрационных целей и может быть
следующую команду: улучшена частым изменением пароля.

chmod qo-rwx pwds.php


422 Глава 9

Рис. 9.26. Разрешения для файла р\лгс18.рЬр. Обеспечьте,


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

Для работы сценария необходимо, чтобы в To: tom.igoe0gmail.com


почтовом ящике было хотя бы одно непрочи­ Subject: Hello world!
From: cat0catmail.com
танное сообщение. В результате исполнения сцена­
Message-Id: <20110528193210.OOAD1156BB60
рия в окне браузера отобразится заголовок сообще­ algenib.myhost.com>
ния наподобие следующего: Date: Sat, 28 May 2011 12:32:10 -0700 (PDT)

number of messages: 85 Этот заголовок содержит большой объем полезной


информации. Хотя в поле From : указано, что сооб­
Delivered-То: tom.igoe0gmail.com щение исходит от ca t@ ca tm a il.co m , в действитель­
Received: by 10.52.188.138 with SMTP id ности оно получено от сервера в домене m yhost.
gal0csl29118vdc; com . Использование псевдонимов для поля От:
Sat, 28 May 2011 12:32:30 -0700 (PDT) (From:), указание в поле Обратный адрес: (Reply
Received: by 10.42.176.136 with SMTP id
to:) другого адреса, чем в поле От: или и то, и дру­
be8mr4324248icb.15.1306611150331; Sat, 28 May 2011
12:32:30 -0700 (PDT)
гое является распространенной практикой. Это по­
Return-Path: <tigoe@algenib.myhost.com>
зволяет посылать сообщения из таких сценариев,
Received: from myhost.com (crusty.g.myhost. как cat-mail.php из главы 3, но при этом отправлять
com [67.225.8.42]) by mx.google.com with ESMTP id ответ на них живому человеку, который может пред­
f8sil0612848icy.106.2011.05.28.12.32.29; Sat, принять необходимое действие. Это обстоятельство
28 May 2011 важно иметь в виду при создании сценариев, кото­
12:32:29 -0700 (PDT) рые отвечают друг другу. Если электронная почта
Received-SPF: pass (google.com: domain of используется для взаимодействия между сетевы­
tigoeOalgenib. ми объектами, программа для каждого устройства
myhost.com designates 67.225.8.42 as permitted
должна быть в силах отличать адрес От: от адреса
sender)
client-ip=67.225.8.42;
Обратный адрес:. В противном случае объекты
Authentication-Results: m x .google.com;
могут не получать сообщения друг от друга.
spf=pass (google.com: Приведенное здесь сообщение не имеет поля
domain of tigoe0algenib.myhost.com designates
X -M a iler, хотя многие сообщения его имеют. Поле
67.225.8.42 as
X -M a iler содержит информацию о программе, от­
permitted sender) smtp.mail=tigoe0algenib.
myhost.com правившей сообщение. Например, заголовки сооб­
Received: from algenib.myhost.com (algenib. щений, отправленных программой Apple Mail, всег­
myhost.com да содержат поле X -M a iler со значением Apple Mail
[173.236.170.37]) by crusty.g.myhost.com и номером версии (например, 2.752.3). Подобно
(Postfix) with полю U ser A g en t протокола HTTP, поле X -M ailer
ESMTP id 6EAC3BE813 for <tom.igoe0gmail.com>; может быть полезным для определения того, как
Sat, 28 May 2011 12:31:15 -0700 (PDT)
форматировать сообщения электронной почты. Из
Received: by algenib.myhost.com (Postfix, from
userid его содержимого можно извлечь информацию об
1774740) id 00AD1156BB6; Sat, 28 May 2011 устройстве, отправившем сообщение, чтобы можно
12:32:09 -0700 было должным образом отформатировать ответ это­
(PDT) му устройству.
Идентификация 423

шшЗаключение
Граница между физической и сетевой идентификацией всегда порождает возможность пу­
таницы и недоразумений. Никакая система для перемещения информации через эту грани­
цу не предоставляет стопроцентной надежности. Определение идентичности, возможностей
и действий являются сложными задачами, поэтому, чем больше пользовательского ввода мож­
но включить в ситуацию, тем лучшие будут результаты.
Обеспечение безопасности передаваемых иден­ важно, что вы можете идентифицировать кого-либо
тифицирующих характеристик является задачей или что-либо для всего мира, но что по-настоящему
первостепенной важности, так как это поддер­ важно — это быть в силах выполнить идентифика­
живает доверие людей, которые используют ваш цию для своих конкретных целей. Решение этого
продукт, и оберегает их. В Интернете нет ничего вопроса предоставляет основание, но котором мож­
по-настоящему личного или по-настоящему закры­ но продолжать дальнейшую работу.
того, поэтому приобретение навыков работы с от­
крытостью облегчит вашу жизнь. В конечном итоге, Начиная разрабатывать проекты, которые исполь­
имейте в виду, что четкие и простые способы обо­ зуют системы определения местоположения, мы
значения идентичности являются наиболее эффек­ обычно обнаруживаем, что меньше означает боль­
тивными, будь они универсальными или нет. Как ше. Довольно часто можно начать разработку про­
начинающие, так и опытные разработчики сетевых екта, полагая, что нужно знать местоположение,
решений часто попадают впросак по этому вопро­ расстояние и направление, а затем урезать эти тре­
су, так как они думают, что идентификация должна бования по мере углубления в проект. Физические
быть абсолютной и ясной для всего мира. Не заци­ ограничения создаваемых объектов и пространства,
кливайтесь на том, насколько всеобъемлюще вы мо­ в которых они создаются, решают для нас многие
жете идентифицировать объекты поначалу. Не суть проблемы.
Глава 10 а

СЕТИ МОБИЛЬНОЙ ТЕЛЕФОННОЙ


СВЯЗИ И ФИЗИЧЕСКИЙ МИР
Технологии Ethernet и Wi-Fi удобны для общения людей и объектов
по Интернету, однако намного больший охват имеет мобильная
телефонная связь. Тем не менее в настоящее время телефония
и Интернет настолько переплетены, что не имеет смысла
рассм атривать их отдельно друг от друга. Подключать по сетям
мобильной телефонной связи не только мобильные телефоны
становится все легче. В этой главе мы рассмотрим, как совместить
сеть Интернет и сети мобильной телефонной связи, и когда такое
совмещение может быть полезным.

Н ohai lion, how г u??? txt me I8r!!!1


Этот лев может послать вам SMS-ку. Компания Groundlabs совместно с персоналом
программ «Жизнь со львами» и «Защитники львов» разработали этот отслеживающий
ошейник с модулем GPS/GSM для передачи сообщений SMS о местах обитания львов
как исследователям живой природы, так и пастухам коровьих стад племени масаи.
Цель этой системы с открытым исходным кодом — помочь борцам за охрану окружа­
ющей среды защитить последние две тысячи диких львов, живущих в южной Кении,
и охранять коровьи стада племени масаи, возвращая в рабочий оборот их племенные
земли. Фотография предоставлена компанией Groundlabs.*

ohai lion, how are you??? text me later!!! — Лев из Охай, как дела? Брось мне СМСку позже!!!
426 Глава Ю

4$ Компоненты для проектов этой главы


Код поставщика США и Европа
• А — Arduino Store (http://store.arduino.cc/ww/)
Россия • AF — Adafruit (http://adafruit.com)
• АМР — «Амперка» (http://amperka.ru) • D — Digi-Key (www.digikey.com)
• CHD — «Чип и Дип» (http://chipdip.ru) • F — Famell (www.farnell.com)
• LC — «Линуксцентр» (www.linuxcenter.ru) • J — Jameco (http://jameco.com)
• L — Less EMF (www.lessemf.com)
• MS — Maker SHED (www.makershed.com)
• RS — RS (www.rs-online.com)
• SF — SparkFun (www.sparkfun.com)
• SS — Seeed Studio (www.seeedstudio.com)

Рис. 10.1. Новые компоненты для проектов этой главы: 1. Камера с возможностью 1Р-связи.
2. Ветровка с капюшоном. 3. Отрезок проводящей ленты. 4. Проводящая нитка. 5. Модуль LilyPad Arduino Simple.
6. Зарядное устройство для литиево-полимерных батареек. 7. Проводящая ткань Shieldit. 8. Нитки для вышивания.
9. Литиево-полимерная батарейка. 10. Устройство на ОС Android. 11. Датчики температуры ТМР36.
12. Карточка MicroSD. 13. Считыватель карточек MicroSD. 14. Печатная плата для реле управления.
15. Коробка с розетками для бытовой электросети. 16. Электрокабель
Сети мобильной телефонной связи и физический мир 427

Проект 29. D: 10KQBK-ND, J: 29911, F: 9337687, RS:


707-8906
Возвращение сетевого кота • Диод 1N4148,1 шт.

►Плата Arduino Ethernet, 1 шт. AMP: AMP-X064-5, http://amperka.ru/prod-
uct/schottky-diode
AMP: А000068, http://amperka.ru/product/ar-
duino-ethernet SF: COM-08588, F: 1081177, D: 1N4148TACT-
ND, RS: 544-3480
А: А000050
• Транзистор NPN 2N3906,1 шт.
В качестве альтернативного варианта можно
использовать плату с Ethemet-шилдом, совмес­ AMP: AMP-X035-5, http://amperka.ru/prod-
тимую с Arduino Uno (см. главу 2). uct/bipolar-transistor
SF: DEV-09026, J: 2124242, А: 139, AF: 201, F: J: 178618, D: 2N3906D26ZCT-ND, SF: COM-
1848680 00522, F: 1459017, RS: 294-328

►Считыватель карточек MicroSD, 1 шт. Шилды • Светодиод, 1 шт.
Ethernet и модули Arduino Ethernet имеют встро­ AMP: AMP-X009-R4, http://amperka.ru/
енный считыватель карточек MicroSD. product/led-5mm

►Карточка MicroSD, 1 шт. Можно приобрести в D: 160-1144-ND или 160-1665-ND, J: 34761
любом магазине электронных товаров. или 94511, F: 1015878, RS: 247-1662 или 826-
830, SF: СОМ-09592 или C0M-09590

►Камера с возможностью IP-связи, 1 шт. В при­
• Зажимная 2-контактная клеммная колод­
мерах этой книги используется камера D-Link
ка, 1 шт.
DCS-930L.
CHD: 38598, SF: PRT-08432, D: 732-2030-

►Датчик температуры, 1 шт. ND, F: 1792766, RS: 189-5893
AMP: АМР-В002, http://amperka.ru/product/ • Зажимная 3-контактная клеммная колод­
troyka-temperature-sensor ка, 1 шт.
AF: 165, D: TMP36GT9Z-ND, F: 1438760, RS: CHD: 64756, SF: PRT-08235, D: 732-2031-
427-351 ND, F: 1792767, RS: 710-0166

►Печатная плата для реле управления, 1 шт. ►
►Переключатель Power Switch Tail, 1 шт. Это
Используется для монтажа перечисленных да­ альтернатива печатной плате и монтируемым не
лее компонентов. В качестве альтернативы мож­ ней компонентам, перечисленным выше. Версию
но использовать также указанный далее пере­ на 240 В можно приобрести на веб-сайте www.
ключатель Power Switch Tail. powerswitchtail.com.
АМР (альтернатива): AMP-BO 10, http://amper- SF: СОМ-09842, AF: 268, MS: MKPS01
ka.ru/product/troyka-relay

►Кот, 1 шт.
SF: COM-09096
• Реле, 1 шт. ►
►Кондиционер, 1 шт.
CHD: 614437829, SF: COM-OOlOl, D: ►
►Загородная дача, 1 шт. (опционально).
T9AV1D12-12-ND, F: 1629059
• Сопротивление 1 К, 2 шт. Любого типа.
D: 1.0KQBK-ND, J: 29663, F: 1735061, RS: Проект 30.
707-8669 Телефонируем термостату
• Сопротивление 10 К, 1 шт.
АМР : AMP-R1К -10, http ://amperka.ru/
to Завершенный проект 29,1 шт.
product/resistor ►
►Учетная запись Twilio, 1 шт.
428 Глава 10

Проект 31. ►
►Отрезок токопроводящей ленты, 1 шт.

Мобильный регистратор SF: DEV-10172



►Толстая токопроводящая нитка.
личных биометрических данных
AMP: DEV-11791, http://amperka.ru/product/

►Устройство на ОС Android, 1 шт. Версия conductive-thread-60g-stainless-steel
ОС Android должна быть 2.1 или более позд­
SF: DEV-10120, L:A304
няя. Подробности см. по адресу http://wiki.
processing.org/w/Android. ►
►Токопроводящая ткань Shieldit Super.


►Плата Arduino LilyPad, 1 шт. L: A1220

►Застежка-липучка.
AMP: DEV-09266, http://amperka.ru/product/
lilypad-arduino-328-main-board ►
►Толстовка с капюшоном, 1 шт.
SF: DEV-09266, A: A000011 MS: MKSWT

►Модуль Bluetooth Mate, 1 шт. ►
►Нитки для вышивания. Доступны в магазинах
AMP: AMP-X143, http://amperka.ru/product/ товаров для рукоделия.
hc-06-bluetooth-module Эта глава не содержит большого количества нового
SF: WRL-09358 или WRL-10393 материала. Да и многие основные аппаратные ком­

►Литиево-полимерная батарейка, 1 шт. поненты, используемые здесь, вам уже знакомы. Но
нам придется работать с переменным напряжением
AMP: PRT-00731, http://amperka.ru/product/ номиналом 120 или 220 В, а также с токопроводя­
polymer-lithium-ion-battery-110mah щими тканями и нитками. Мы также рассмотрим
SF: PRT-00341, AF: 258, RS: 615-2472, F: чтение и запись карточек SD.
1848660

►Сопротивление 270 Ом, 1 шт.
CHD: 63800, J: 691446, D: P270KBACT-ND, RS:
163-921, F: 1565367

йй Одна большая сеть


Телефонная сеть возникла задолго до Интернета. Все соединения в этой сети осуществлялись
аналоговыми электрическими схемами, и все телефонные звонки были коммутируемыми —
то есть между абонентами было необходимо устанавливать временную выделенную цепь.
Затем появились модемы, которые позволили компьютерам обмениваться данными по тем же
самым телефонным аналоговым цепям. Постепенно, телефонные коммутаторы были замене­
ны маршрутизаторами, и новые телефонные сети стали цифровыми. Теперь абоненты соеди­
няются виртуальными цепями, и сценарии телефонных звонков не сильно отличаются от сце­
нариев электронной почты или чата: между абонентами устанавливается сеанс, происходит
обмен битами и осуществляется обмен сообщениями. Различия между телефонным звонком
и электронной почтой сейчас заключены в протоколах, применяемых для каждого вида связи,
а не в структуре электрических цепей.
Появление средств интернет-телефонии — таких связи, предоставляемых компаниями Twilio (www.
как сервер телефонии с открытым исходным кодом twillo.com), Google Voice (www.voice.google.com),
Asterisk (www.asterisk.org), атакже услуг голосовой Skype (www.skype.com) и пр., практически размыло
Сети мобильной телефонной связи и физический мир 429

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


ниями через Интернет. Эти услуги вполне сравни­ иногда, приемником GPS. И, конечно же, они по­
мы с услугами связи, предлагаемыми «обычными» стоянно работают в сети. Но чего в них нет, так это
телефонными компаниями. Однако телефонные возможности подключения дополнительного пери­
компании поверх услуг обычной телефонии предо­ ферийного оборудования — каких-либо других дат­
ставляют сеть линий и маршрутизаторов, в которой чиков, контроллеров двигателей и прочих приводов
первостепенное внимание уделяется голосовым и т. п., то есть тех компонентов, для работы с кото­
услугам, что гарантирует нам качественный сервис, рыми предназначены микроконтроллеры. Поэтому
который мы не всегда получаем от сервисов, рабо­ сопряжение телефона с микроконтроллером для ис­
тающих только с 1Р-телефонией. пользования этой связки в качестве мультимедиа­
компьютера и шлюза мобильной сети, открывает
Услуги телефонии и услуги Интернета пересека­ множество возможностей для интересных проектов.
ются на шлюзах и маршрутизаторах, реализующих
программное обеспечение для взаимного преоб­ В зависимости от технических характеристик теле­
разования протоколов. Например, все мобильные фона, реализовать его сопряжение с микроконтрол­
операторы предоставляют услуги SMS-шлюза, ко­ лером можно несколькими способами. В этой главе
торые позволяют абонентам отправить сообщение под телефоном подразумевается смартфон с нали­
электронной почты, которое доставляется адресату чием большинства или всех перечисленных далее
в виде сообщения SMS, или отправить сообщение возможностей, многие из которых будут реализова­
SMS, которое доставляется как сообщение элек­ ны в последующих проектах:
тронной почты. Служба Google Voice и многие дру­
• программируемость;
гие службы онлайновой телефонии предоставляют
услугу доставки голосовой почты в виде текста, • сенсорный экран или клавиатура;
когда входящий звонок записывается в цифровой • доступ к мобильной сети;
аудиофайл, который затем обрабатывается про­ • последовательный порт Bluetooth;
граммой распознавания речи и преобразовывается
• разъем USB;
в соответствующий текст, отправляемый получате­
лю. Основная задача при реализации проектов, ис­ • микрофон, динамик;
пользующих телефонную сеть, заключается в том, • встроенный акселерометр;
чтобы научиться преобразовывать информацию из • встроенный приемник GPS.
одних протоколов связи в другие.
На основе этих возможностей и с учетом типов
проектов, которые вы бы желали реализовать, мож­
но организовать несколько возможных компоновок
Компьютер у вас в кармане системы. На рис. 10.2 показаны четыре наиболее
Современные мобильные телефоны представляют распространенные компоновки.
собой намного более серьезные устройства, чем про­
стые телефонные аппараты. Типичный смартфон — В трех из четырех показанных на рис. 10.2 ком­
это настоящий компьютер, работающий под управ­ поновок применяется беспроводной канал связи.
лением полноценной операционной системы, такой Современные мобильные телефоны не обладают
как Android, iPhone, Blackberry или Windows Phone. хорошими возможностями организации последо­
Вычислительные возможности таких устройств зна­ вательного проводного канала связи с внешними
чительно превосходят вычислительные возможности устройствами, хотя в этом отношении и начинают
настольных компьютеров еще недавнего времени, происходить изменения. Тем не менее, для боль­
а их операционные системы — это всего лишь слег­ шинства приложений лучшим подходом будет ис­
ка урезанные версии операционных систем, которые пользование беспроводного канала связи. К тому
устанавливаются на обычные настольные компью­ же, случаи, когда было бы предпочтительней при­
теры, ноутбуки или планшеты. Большинство смарт­ вязать телефон к проекту проводами, встречаются
фонов также оснащены рядом основных датчиков: не очень часто.
430 Глава 10

Радиус действия:
локальный (меньше 10 м)
\
'ч \

Интерфейс БР1

Последовательный
Последовательный канал
по Bluetooth
lie
Последовательный
порт Bluetooth
Телефон

Радиус действия:
глобальный
Ч
Интерфейс ЭР!
((<'
Сеть Wi-Fi или
Интернет ^ мобильная сеть

Телефон

Протокол SMS, e-mail


или ТСР/НГТР

Последовательный
канал Мобильная сеть

»)) (Iо
Телефон

Рис. 10.2. Возможные способы сопряжения микроконтроллеров с мобильными телефонами:


а — локальный радиус действия; 6 — глобальный радиус действия
Сети мобильной телефонной связи и физический мир 431

Определитесь, Интерфейс на основе своего приложения


как это должно происходить Если по каким-либо причинам вы не хотите или не
К этому времени вы уже должны были выработать можете использовать интерфейс на основе обычно­
общий подход к разработке своих проектов: начи­ го браузера, можно разработать свое приложение
нать с определения того, что вы хотите, чтобы люди для телефона, чтобы с его помощью взаимодейство­
делали с тем, что вы создаете, а потом разрабаты­ вать с микроконтроллером по Bluetooth, сети, USB
вать то, что позволяет им делать это наилегчайшим или через сообщения SMS. Мы рассмотрим пример
способом. Вы разрабатываете систему, в которой такого приложения в Processing для Android далее в
пользователи управляют в режиме реального вре­ этой главе. Преимущество разработки собственного
мени движущейся рядом моделью вертолета или приложения — вы сможете полностью контролиро­
корабля? Или же систему, с помощью которой они, вать происходящее. Но есть и недостаток — необ­
находясь в отпуске, управляют удаленным устрой­ ходимость изучать новую среду программирования,
ством, — например, домашней системой управле­ а также невозможность использования разработан­
ния климатом? Подумайте, какое время реагиро­ ной программы на телефоне с иной операционной
вания потребуется для каждого случая. Нужно ли
системой. Поскольку большинство операционных
взаимодействие в режиме реального времени, как
систем телефонов не разрешают прямого доступа
в проекте из главы 5, или же достаточно обновле­
ния состояния каждые несколько секунд или даже браузера к аппаратной части телефона, если вы пла­
минут? Учтите и расстояние между устройства­ нируете использовать локальные соединения типа
ми — требуется ли вам связь на дальних расстоя­ Bluetooth или USB, вам придется разработать спе­
ниях или же достаточно локального канала типа циальное приложение.
Bluetooth или USB? Если это удаленное подклю­
чение, как пользователь узнает, что происходит на
другом конце канала? Может ли он увидеть резуль­ Интерфейс на основе сообщений SMS
тат своих действий? Посылается ли ему сообщение или электронной почты
SMS или электронной почты, извещающее его о
предпринятых действиях? Проанализируйте необ­ Взаимодействие между пользователем и устрой­
ходимость применения проводного или беспровод­ ством не всегда требуется организовывать в режиме
ного соединения с учетом того, как людям требу­ реального времени. Если вам нужно только время
ется перемещаться и манипулировать устройствами от времени получать обновленную информацию от
проекта. Узнайте, какие сети доступны там, где вы удаленных датчиков или периодически запускать
планируете использовать свою систему. Есть ли там процесс, который затем может выполняться само­
доступ к сети Wi-Fi? К мобильным сетям? Как на­ стоятельно, — например, включить систему полива
счет сети Ethernet? Возможно ли соединить ваши лужайки или домашнего освещения, может быть
два устройства посредством локальной сети с по­ вполне достаточно сообщений SMS или электрон­
мощью Bluetooth или Wi-Fi?
ной почты. То есть, разработать для этого микро-
контроллерное приложение, которое получает со­
Интерфейсы на основе браузера общения SMS по модему GPRS, или же создать се­
тевой сервер, который проверяет почтовый ящик и
Если вы хотите управлять неким сетевым устрой­
при получении соответствующего сообщения элек­
ством с мобильного телефона, самым легким спо­
собом для этого будет оснастить устройство под­ тронной почты посылает управляющее сообщение
ключением к Интернету и управлять им с теле­ подключенному к Интернету микроконтроллеру.
фонного браузера. В этом случае вам не придется Преимущество этого подхода состоит в том, что
разбираться в операционной системе конкретного он позволяет управлять удаленными устройствами
телефона — все, что понадобится, — это иметь с помощью приложений, которые уже имеются на
возможность установить соединение HTTP между телефоне: приложений для работы с сообщениями
телефоном и управляемым устройством. Сделайте SMS или электронной почты.
микроконтроллер простым сервером, как в проек­
те 6 «Hello Internet!», и все дела.
432 Глава 10

Голосовые интерфейсы для съема информации с сети датчиков на теле


владельца телефона или поблизости него. В таких
Не забывайте о первоначальном назначении теле­ случаях нужно установить локальное подключе­
фона — обеспечении двунаправленной голосовой ние микроконтроллера к телефону — скорее всего,
связи на расстоянии. Голосовые интерфейсы для се­ по Bluetooth или USB, а затем отправлять данные
тевых устройств могут быть простыми и удобными. с датчиков удаленному серверу. Для этого вам, ско­
Возможность генерирования сетевых действий по­ рее всего, не придется создавать сложное приложе­
средством голосовых звонков предоставляют шлю­ ние, а всего лишь понадобится установить соедине­
зы телефонии, такие как Asterisk и Twilio. ние между датчиками и телефоном и между теле­
фоном и сетью.
Телефон как шлюз
Не все приложения с использованием телефо­
на требуют управления удаленным устройством.
Иногда телефон просто нужен в качестве средства

Проект 29
Возвращение сетевого кота (Cat Cam 2)

Если в состав программного обеспечения ва­


шего телефона входит браузер, вам нет надоб­ Требуемые компоненты
ности знать, как его программировать, чтобы ►
►Модуль Arduino Ethernet или модуль Arduino
создать мобильное приложение. В этом про­ Uno с шилдом Ethernet, 1 шт.
екте мы создадим вариант проекта сетевого

►Считыватель карточек MicroSD, 1 шт.
кота из главы 3. Но на этот раз мы воспользу­
емся микроконтроллером, который пересы­ ►
►Карточка MicroSD, 1 шт.
лает файлы с карточки БР, и 1Р-камерой, для ►
►Камера с возможностью IP-связи, 1 шт.
подключения которой к Интернету компью­ ►
►Датчик температуры, 1 шт.
тер не требуется. ►
►Печатная плата для реле управления, 1 шт.

►Реле, 1 шт.
У моей соседки, которую зовут, скажем, Люба, ►
►Сопротивление 1 К, 2 шт.
есть кот, которого она зовет Господин Привереда.

►Сопротивление 10 К, 1 шт.
У Любы также есть загородная дача с вишневым
садом. Она любит отдыхать там летом, по крайней ►
►Диод, 1 шт.
мере, по выходным, но не может брать с собой туда ►
►Транзистор, 1 шт.
Привереду, однако хочет, чтобы ему в ее отсутствие ►
►Светодиод, 1 шт.
тоже было комфортно. Поскольку содержание дачи ►
►Зажимная 2-контактная клеммная колодка,
стоит больших денег (самовары и все такое прочее), 1 шт.
Люба не может позволить себе иметь в своей город­
ской квартире кондиционер с автоматическим тер­ ►
►Зажимная 3-контактная клеммная колодка,
1 шт.
мостатом. Чтобы ее выручить, я сделал ей сетевой
монитор температуры. ►
►Кот, 1 шт.

►Кондиционер, 1 шт.
Монитор работает следующим образом: Люба за­ ►
►Загородная дача (опционально).
пускает браузер на своем телефоне или ноутбуке
Сети мобильной телефонной связи и физический мир 433

и входит в веб-интерфейс управляющего модуля, Прежде чем вы решите реализовать такую систему
который мы для краткости и будем называть тер­ для себя, вам нужно будет создать диаграмму задей­
мостатом. Здесь она видит текущую температуру ствованных в ней устройств и протоколов, а также
в своей городской квартире, состояние конди­ разбить на шаги все операции, чтобы понимать, что
ционера, а также Привереду по веб-камере. Если должно происходить. На рис. 10.3 показана блок-
в квартире слишком жарко, она задает для включе­ схема такой системы, а на рис. 10.4 — схема взаи­
ния кондиционера более низкое значение темпера­ модействия ее компонентов.
туры, а если слишком прохладно — более высокое.
Программа интерфейса обновляет настройки тер­ Система включает несколько аппаратных устройств
мостата и показывает Любе новое состояние кли­ и ряд протоколов для обеспечения их взаимодей­
мата в квартире. ствия. К этому времени многие из них должны быть

Цифровое
напряжение 0-5 В
434 Глава Ю

Рис. 10.4. Блок-схема


взаимодействия Cat Cam 2
и контроллера управления
кондиционером

настройки
термостата

вам уже знакомы. Контроллер Ethernet на шилде 2. Микроконтроллер считывает эту страницу
Ethernet (или на плате Arduino Ethernet) взаимо­ с карточки SD.
действует с микроконтроллером посредством ин­
3. Сервер считывает показания датчика темпера­
терфейса SPI, так же, как и карточка SD на шил­
туры...
де или плате. Датчик температуры предоставляет
аналоговый ввод, а реле с рабочим напряжением 4. ... и текущее значение настройки кондицио­
220 В для управления кондиционером — цифровой нера.
вывод. Бытовая IP-камера в этом проекте оснаще­
на встроенным сервером, поэтому все, что нужно 5. Сервер отправляет полученную страницу кли­
сделать, — это настроить ее для взаимодействия енту.
с маршрутизатором. Клиентом сервера камеры бу­ 6. Так как в страницу вставлено изображение кота
дет только веб-браузер на вашем телефоне, компью­ с веб-камеры, клиент запрашивает его у IP-
тере или планшете. камеры.
Хотя взаимодействие клиента и сервера кажется до­ 7. IP-камера посылает изображение клиенту.
статочно простым, не лишним будет расписать его
8. Посредством формы на веб-странице клиент
по следующим десяти шагам (см. рис. 10.4):1
изменяет значение настройки кондиционера
1. Клиент делает запрос HTTP g e t , требуя глав­ и посылает его серверу с помощью команды
ную страницу интерфейса (index.htm). HTTP POST.
Сети мобильной телефонной связи и физический мир 435

9. Сервер читает полученный запрос post и об­ возьмите кабель питания, разрежьте одну из его
новляет значение термостата для перенастрой­ жил и подсоедините концы разреза к клеммам
ки кондиционера. LOAD (нагрузка) платы реле. На рис. 10.6 показано
подсоединение кабеля питания к реле указанным
10. Сервер посылает назад страницу ответа.
образом. Выводы «земли», питания +5 В и управ­
Некоторые из этих задач — такие как получение ления реле подсоединяются к микроконтроллеру.
изображения с камеры и конечной страницы, мож­ Чтобы создать более солидную схему реле управ­
но решить с помощью кода HTML. При этом не ления электропитанием с розеточной коробкой, на­
нужно выполнять никакого дополнительного про­ подобие показанной на рис. 10.7, обратитесь к за­
граммирования, так как все это будет сделано брау­ мечательному руководству Натана Сейдла (Nathan
Seidle), найти которое можно по адресу www.
зером при интерпретации им кода HTML. Основная
sparkfun.com/tutorials/119.
задача программирования здесь состоит в создании
базового веб-сервера на Arduino, который предо­ Чтобы безопасно проверить схему без включения
ставляет файлы с карточки SD. ее в сеть электропитания, установите мультиметр
на измерение электропроводности и замерьте цепь
между одним из штыревых контактов вилки и со­
Схема системы ответствующим гнездовым контактом на другом
конце кабеля. Одна пара штырь-гнездо (неразре­
Теперь, когда у нас есть понимание общих прин­
занной жилы кабеля) должна всегда показывать
ципов работы системы, можно приступать к ее
проводимость цепи. А вторая пара (разрезанной
реализации. Монтажная схема системы показана на
жилы, подсоединенной к реле) не должна показы­
рис. 10.5, а, а принципиальная — на рис. 10.5, б.
вать проводимости без подачи напряжения пита­
Поскольку карточка SD находится на моду­ ния на реле. Только когда на реле подается питание
ле Ethernet (шилде Ethernet или плате Arduino и на его линию управления подается сигнал +5 В,
Ethernet), нам нужно подсоединить к модулю только эта пара должна показывать проводимость. А при
датчик температуры и реле. Реле содержит катуш­ подсоединении линии управления реле на «зем­
ку электропровода, намотанную вокруг контактов лю» проводимость в этой паре снова должна про­
выключателя. Когда на катушку подается напряже­ падать. Проверив схему реле таким образом, про­
ние, в ней индуцируется магнитное поле, которое верьте его работу с микроконтроллером. Для этого
сжимает контакты выключателя, замыкая цепь. подсоедините линию управления реле к выводу D1
К рабочим контактам реле подключены концы микроконтроллера и запустите на микроконтрол­
одной разрезанной жилы кабеля питания, как по­ лере скетч «Мигалка». Реле должно включаться
казано на рис. 10.6 и 10.7, а также и на монтажной и выключаться.
схеме (см. рис. 10.5, а).
Обязательно смонтируйте схему в изолированном
Работать с переменным током электросети может корпусе и хорошо зафиксируйте линии электропи­
быть опасно, поэтому проверьте, что все соедине­ тания. Если они случайно отсоединятся, это может
ния выполнены правильно, прежде чем включать вызвать короткое замыкание, а короткие замыкания
схему в розетку электропитания. Если вы не чув­ электросети — вещь не очень приятная. Лучше
ствуете себя комфортно, самостоятельно монтируя всего воспользоваться специальным корпусом для
схему реле для работы с переменным током, вос­ проектов по электронике. Провода электропитания
пользуйтесь готовым модулем управления Power можно зафиксировать термоклеем или резиновым
Switch Tail, который можно прибрести в магазинах герметиком, хотя некоторые корпуса поставляют­
Maker SHED, SparkFun и Adafruit. ся со специальным фиксатором кабеля питания.
Зафиксировав кабель питания, проверьте надеж­
Но ежели у вас нет проблем с монтированием своей ность фиксации, потянув за него, чтобы убедиться,
схемы управления, использование печатной платы что он не двигается. Уделите этому вопросу до­
для реле от компании SparkFun будет безопасной статочно внимания, чтобы обеспечить надежность
и более дешевой альтернативой модулю Power фиксации кабеля электропитания, прежде, чем дви­
Switch Tail. Впаяйте реле в печатную плату, затем гаться дальше.
436 Глава 10

AREF
Reset GND
+3.3V D13 К линии Clock шилда Ethernet
+5V D12 К линии MOSI шилда Ethernet
Gnd D11/PWM К линии Ml SO шилда Ethernet
Gnd D10/PWM К линии Eth. CS шилда Ethernet
Vin D9/PWM
D8
Модуль
Arduino
D7
D6/PWM
Analogo D5/PWM
A1 D4 К линии C S карточки SD
шилда Ethernet
A2 D3/PWM
Реле
A3 D2
A4 Digital 1/TX - fr rtj '" К /V
A5 DigitalO/RX В электросеть

Розетка для
кондиционера

Рис. 10.5. Монтажная (а) и принципиальная (б) схемы системы удаленного управления кондиционером
Сети мобильной телефонной связи и физический мир 437

Рис. 10.6. Контакты платы реле подключены к разрыву в одной из жил кабеля питания

ш Н Н И Н р
Ш Ш Ш ш
М Н И ВШ И— ;
Ш т ш Ы Ш

Рис. 10.7. Розеточная коробка, содержащая реле, провода управления которым подсоединены к модулю Arduino.
Это более безопасный вариант реализации проекта
438 Глава Ю

Код для проекта


Так как скетч для этого проекта весьма сложный, 2. Управляем реле.
он создается по частям:
3. Считываем данные с карточки ББ.
1. Считываем датчик температуры (дополнитель­
ную информацию по этому датчику можно 4. Создаем веб-сервер. Этот сервер будет обладать
найти в руководстве Абай*ий по адресу \vww- большим набором возможностей, чем сервер из
ladyada.net/learn/sensors/tmp36.html). главы 4.

0 1 Пишем код
Задача считывания датчика тем­ /*
пературы не представляет ниче­ Считывание термодатчика и управление реле
го сложного. Датчик выдает на Контекст : Arduino
линии выхода аналоговое напря­ Считываем показания датчика температуры ТМР36
жение, прямо пропорциональное */
температуре. Формула взаимоот­
ношения температуры и напря­ void setup() {
// Инициируем последовательную связь:
жения следующая:
Serial.begin(9600);
Темп.(°С) = (Увых (в мВ) -
500) / 10

Поскольку в основном цикле нам void loop() {

нужно заниматься другими де­ Serial.print(«Температура: «);


Serial.println( readSensor() );
лами, чтение показания датчика
и преобразование его в градусы }
Цельсия выполняется в отдель­
// Считываем показания датчика температуры:
ной функции. Результат возвра­
float readSensor () {
щается в значении с плавающей
// Берем показания датчика температуры:
точкой и выглядит примерно так: int sensorValue = analogRead(АО);
Температура: 26.17 // Преобразовываем в напряжение:
float voltage = (sensorValue * 5.0) / 1024.0;
Значение температуры выдается // Преобразовываем напряжение в градусы Цельсия
в градусах Цельсия, но если вы // (100 мВ на градус - 500 мВ смещение):
хотите получить их в градусах по float temperature = (voltage - 0.5) * 100;
Фаренгейту, то формула для пре­ // Возвращаем значение температуры:
образования следующая: return temperature;

F = 9/5*С + 32

Сам скетч в исходном виде вы­


глядит следующим образом:

При исполнении этого скетча


на данном этапе он непрерывно
выводит значение температуры
в окне монитора портов. Теперь
добавим в скетч код управления
реле.
Сети мобильной телефонной связи и физический мир 439

#include <EEPROM.h>
const int relayPin = 2; // Линия, к которой подсоединено реле
Реле следует включать не чаще const long tempChecklnterval = 10000; // Время между проверками
одного раза в несколько секунд, // (в мс)
поэтому код для включения реле const int thezmostatAddress = 10; // Адрес EEPROM для
нужно заключить в оператор // значения термостата
условия, который проверяет ис­ long now; // Время последней проверки температуры
течение соответствующей паузы. // Значение настройки для термостата:
Надо также добавить некоторые int thermostat = EEPROM. read (thezmostatAddress);
глобальные переменные и кон­
станты и внести определенные void setup() {
изменения в методы setup о и // Инициируем последовательную связь:
loop о. Добавленный код выде­ Serial.begin(9600);
// initialize the relay output:
лен жирным шрифтом.
pinMode(relayPin, OUTPUT);

Было бы полезно иметь возмож­


ность сохранять значение термо­
void loop() {
стата, даже если на Arduino не
// Периодически проверяем температуру, чтобы узнать,
подается питание. Это можно // не нужно ли включить или выключить реле:
сделать с помощью библиотеки if (millisO - now > tempChecklnterval) {
EEPROM. В начале скетча мы Serial.print("Температура: «);
будем считывать сохраненное Serial.println(readSensor());
значение термостата, а затем со­ if (checkThermostat()) {
хранять его новое значение. Serial.println("Кондиционер включен»);
}
В конце скетча добавляем новый else {
метод: checkThermostat (). Он про­ Serial.println(«Кондиционер выключен»);
веряет температуру и сравнивает >
ее с установленным значением now = millisO ;
термостата. Если температура }
больше, чем значение термоста­
та, метод включает реле, а если
меньше — выключает его: // Примечание: Сюда вставляется метод readSensor(),
// показанный ранее.

При исполнении этого скетча на


// Проверяем температуру и управляем реле соответствующим
данном этапе реле станет вклю­ образом:
чаться или выключаться в зави­ boolean checkThermostat() {
симости от значения его настрой­ // Полагаем, что реле выключено
ки. Но поскольку с ЕЕРЯОМ boolean relayState = LOW;
будет, скорее всего, считываться // Если температура выше, чем значение настройки реле,
значение 255, реле включаться // реле должно быть включенным:
не будет. Попробуйте установить if(readSensor() > thermostat) {
значение настройки меньшее, relayState = HIGH;
чем текущее значение показания }
датчика температуры, загрузите // Включаем или выключаем реле:
код снова и посмотрите, что бу­ digitalWrite(relayPin, relayState);
дет происходить. return relayState;
}
440 Глава 10

E l Читаем с карточки SD #include <EEPROM.h>


#include <SD.h>
Следующим шагом будет чтение const int sdChipSelect = 4; // Задаем линию выбора (CS)
данных с карточки SD. Для этого // микросхемы SD
в скетч нужно добавить библио­
теку SD. На шилдах Arduino с // Примечание : Сюда нужно вставить все предыдущие константы
// и глобальные переменные.
разъемом под карточку SD для
выбора микросхемы SD исполь­ void setup() {
зуется линия 4. Но в шилдах // Инициируем последовательную связь :
других производителей линия Serial.begin(9600);
выбора микросхемы может быть // initialize the relay output:
иной, поэтому проверьте ее, если pinMode(relayPin, OUTPUT);
вы используете шилд SD другого if (!S D .begin(sdChipSelect)) {
производителя. // Если не можем читать карточку SD,
// дальше не продолжаем:
Сначала проверяем наличие Serial.println(F("Не удалось выполнить инициализацию!" )) ;
карточки с помощью метода }
s d .begin о . Если карточка отсут­ else {
Serial.println(F("Инициализация выполнена"));
ствует, нет смысла продолжать
sendFile("index.htan") ;
исполнение. В противном случае
}
карточку можно читать. Добавим
также Н О В Ы Й метод: sendFileO,
который берет массив симво­ // Примечание: Здесь нужно вставить предыдущие методы 1оор(),
лов в качестве имени файла. // readSensor() и checkThermostat ()
Добавленный код выделен жир­
ным шрифтом: // Посыпаем запрошенный файл:
void sendFile(char thisFile[]) {
Чтобы модифицированный та­ String outputstring = ""; // Переменная String для хранения
// каждой линии файла
ким образом код работал долж­
ным образом, в разъем MicroSD
// Открываем файл для чтения?
должна быть вставлена карточка File myFile = SD.open(thisFile);
MicroSD, содержащая файл под if (myFile) {
названием index.htm. Для начала // Читаем файл, пока в нем ничего не останется:
запишите на карточку файл про­ while (myFile.available()) {
стого документа HTML: // Добавляем текущий символ к строке вывода:
char thisChar = myFile.read();
<html>
outputstring += thisChar;
<head>
ctitleMlpHBeT!</title> // Когда получаем символ перевода строки, посылаем
</head> // содержимое outputstring, а затем очищаем ее:
<body> if (thisChar == '\n’) {
Привет ! Serial.print(outputstring);
</body> outputstring = «»;
</html>
}

Теперь при исполнении этого // Закрываем файл:


скетча он сначала выведет в окно myFile.close();
монитора портов файл index.htm, }
else {
а затем перейдет к выполнению
// Если файл не открылся:
кода для считывания показания
Serial.print("Не удалось открыть файл.");
датчика температуры и управле­
ния реле, рассмотренного ранее.
Сети мобильной телефонной связи и физический мир 441

со всеми устройствами SPI модуль Arduino исполь­


|£ 11 Запись на карточку MicroSD зует линию 11 для MOSI2, линию 12 для M IS03 и
линию 13 для сигнала тактирования (clock). Шилд
Библиотека SD для Arduino позволяет записывать
и плата Ethernet Arduino используют линию 10 для
данные на карточки SD и предоставляет несколько выбора микросхемы Ethernet и линию 4 для выбора
опций монтирования SD-карточек. Все эти опции микросхемы карточки SD. На платах карточек SD
монтирования базируются на синхронном после­ других производителей используются другие линии
довательном протоколе SPI, который шилд Ethernet выбора микросхемы карточки. Например, на шилде
Arduino и плата Arduino Ethernet используют для карточки SD компании SparkFun для выбора микро­
взаимодействия с микросхемой Ethernet. Как мы схемы карточки используется линия 8, а на адаптер­
видели в главе 4, этот протокол можно применять ной плате для карточек SD компании Adafruit (по­
для организации взаимодействия нескольких раз­ казана на рис. 10.8) для этой цели служит линия 10.
ных устройств, которые подсоединяются к тем же При использовании в проекте нескольких устройств
самым линиям данных и сигнала тактирования, но SPI — например, шилда Ethernet и шилда SD, нуж­
каждое из этих устройств должно иметь свою ли­ но удостовериться, что каждое из них имеет свою
нию выбора микросхемы (CS). Для взаимодействия отдельную линию выбора микросхемы.
Г Л
Рабочее напряжение карточек SD
Карточки 8Б работают только на напряжении
3,3 В! Поэтому, если вы используете гнезда для
ЗБ-карточек, которые подсоединяются напря­
мую к линиям любого микроконтроллера, рабо­
тающего от питания напряжением 5 В, необхо­
димо обеспечить, чтобы на карточку подавалось
только 3,3 В.

Правила работы с карточками SD


Чтобы получать наиболее надежные результаты при
работе с шилдом карточки SD или с платой Arduino,
оснащенной разъемом под карточку SD, всегда при­
держивайтесь следующих правил.

• Никогда не вставляйте и не вынимайте


карточку SD из разъема при исполняющем­
ся скетче. Мы никогда не вынимаем карточку
в процессе работы с ней из считывателя, под­
ключенного к компьютеру. То же самое относит­
ся и к Arduino. Убедитесь, что микроконтроллер
не обращается к карточке, прежде чем вставлять
или вынимать ее из разъема. Самый простой
способ придерживаться этого правила — нажать
и удерживать нажатой кнопку сброса Arduino,
Рис. 10.8. Адаптерная плата для карточки SD компании когда карточка вставляется или вынимается.
Adafruit, подсоединенная к SPI-линиям 11 (MOSI),
12 (MISO) и 13 (сигнал тактирования) платы Arduino. 2 MOSI, Master Out, Slave In — выход ведущего, вход ве­
Эта плата использует для выбора микросхемы карточки домого.
линию 10. Однако в платах разных производителей 3 MISO, Master In, Slave Out — вход ведущего, выход ве­
для этой цели могут использоваться другие линии домого.
442 Глава 10

• Форматируйте карточку файловой системой rmdir () — для их удаления. Используйте эти


FAT16 или FAT32. Библиотека SD работает команды при разработке более сложных скет­
только с этими двумя форматами файловой си­ чей, работающих с файлами, и особенно те
стемы. К счастью, любая операционная система команды, которые позволяют получить сведения
может форматировать диски в эти файловые си­ о файлах, не изменяя их, — такие как exists о,
стемы. Сведения о том, как форматировать кар­ size () И реек ().
точку SD файловой системой FAT16 или FAT32,
• Показывайте, что выполняется доступ к кар­
вы найдете в инструкции для приложения по
точке, и когда он невозможен. Когда нет воз­
обслуживанию дисков вашей операционной си­
можности наблюдать результаты работы с кар­
стемы.
точкой на экране, используйте светодиоды для
• Имена файлов должны быть в формате 8.3. индикации моментов, когда Arduino осуществля­
Библиотека SD использует схему именования ет доступ к карточке, а также ошибок доступа.
файлов в стиле DOS, согласно которому имена
файлов не могут превышать восьми символов В этом проекте мы будем только считывать микро­
плюс три символа для расширения имени фай­ контроллером информацию с карточки. Для записи
ла. Имена файлов не чувствительны к регистру на карточки требуется устройство для считывания и
букв, пробелы не допускаются. Таким образом, записывания, которое может работать с карточками
имена datalog.txt или mypage.htm допустимы, но, MicroSD. Такие устройства недороги и становятся
например, someArbitraryWebPage.html — нет. все более распространенными. Более новые ком­
пьютеры даже оснащаются встроенными устрой­
* Запись на карточку занимает время. Обычно,
ствами записи карточек SD. Большинство карточек
операции с файлами write (), print () и printin ()
MicroSD продаются с адаптером, позволяющим
промежуточно сохраняют данные в энергоза­
вставить их в разъем для обычных карточек SD.
висимый буфер на карточке, и эти данные те­
Некоторые карточки даже поставляются со своими
ряются, когда карточка извлекается из разъема.
считывателями.
Данные на постоянной основе сохраняются
ТОЛЬКО операциями flush о И Л И close о, причем
Отформатировав свою карточку, создайте тексто­
выполнение их занимает определенное время.
вый файл index.htm (см. разд. «Читаем с карточки
Чтобы поспевать за взаимодействием с поль­
SD» ранее), сохраните его на карточку и вставьте
зователем, сохраняйте данные посредством ко­
карточку в разъем на шилде. При исполнении это­
манд flush о и close о так же, как вы бы сохра­
го скетча он должен в конце метода setup о выве­
няли файлы на обычном компьютере — делайте
сти на экран файл index.htm один раз, а затем, как
это часто, но не слишком, и, предпочтительно,
и раньше, перейти к выполнению кода для считыва­
когда пользователь или другие устройства не
ния показаний датчика температуры и управления
выполняют каких-либо других операций.
реле. Когда все это заработает должным образом,
* Практикуйте безопасное управление файла­ мы сможем считать себя готовыми перейти к созда­
ми. Библиотека SD предоставляет некоторые по­ нию сервера. Этот код будет добавляться к скетчу,
лезные инструменты для управления файлами. который у нас уже имеется.
Например, команда имя файла.exists о позволя­
ет проверить, существует ли уже данный файл.
Команда if (имя файла) позволяет проверить воз­
можность доступа к файлу. Для удаления фай­
лов применяется команда имя файла.remove ().
Команды size о и position о предоставляют
информацию о размере файла и местонахожде­
нии указателя в нем, а команда реек о позволяет
перемещаться внутри файла. Команда mkdiro
применяется для создания каталогов, а команда
Сети мобильной телефонной связи и физический мир 443

^Д обавляем сервер /*
Веб-сервер с чтением SD-карточки
В начале скетча добавляем биб­ Контекст : Arduino
лиотеку ЕШете! и необходимые */
константы и глобальные пере­
#include <EEPROM.h>
менные для настройки сервера #include <SD.h>
и работы с ним. Добавленный #include <SPI.h>
код, как обычно, выделен жир­ #include <Ethemet.h>
ным шрифтом: #include <TextFinder.h>

// Конфигурация подключения Ethernet


// Вместо подчеркнутых значений укажите значения для вашего
// устройства и маршрутизатора.
byte mac [] = {
0x00, ОхАА, ОхВВ, ОхСС, ОхРЕ, 0x01 };
IPAddress gateway(192,168Д Д ) ;
IPAddress subnet(255,255,255,0);
IPAddress ±0(192,168,1,20);
// Инициализируем библиотеку сервера Ethernet
Server server(80);

const int inputLength = 16; // Размер запрошенного файла


const int typeLength = 6; // Длина GET или POST
const int sdChipSelect = 4; // Задаем линию выбора
// микросхемы SD
const long terrpChecklnterval = 10000; // Время между проверками (в мс)
const int thermostatAddress = 10; // Адрес EEPROM для значения
// настройки реле

// Следующие переменные применяются для управления входящими


// запросами HTTP
char inputstring[inputLength]; // Ввод, поступающий от
// браузера
char requestTypeString[typeLength] ; // Тип запроса: GET или
// POST
int nextChar = 0; // Счетчик указателя для
// requestTypeString
const int fileStringLength = 16; // Размер запрошенного файла
char fileString [fileStringLength] ; // Ввод, поступающий от
// браузера
long now; // Время последней
// проверки температуры

Ш В методе setup () замените void setup() {


вызов метода sendFiieO сле­ // Инициализируем последовательную связь:
Serial.begin(9600);
дующим кодом для получения
// Инициализируем вьюод реле:
IP-адреса и запуска сервера. pinMode(relayPin, OUTPUT);
Добавленный код выделен жир­
ным шрифтом: // Проверяем наличие карточки SD:
Serial.print(F(«Инициализация карточки SD...»));
if (!SD.begin(sdChipSelect)) {
// Если карточка SD не читается, выводим сообщение
/ / о б ошибке и идем дальше:
Serial.println(F(«Не удалось выполнить инициализацию!»));
} ►

444 Глава 10

т else {
Serial.printIn(F(«Инициализация выполнена»));

// Даем контроллеру Ethernet время для запуска:


delay(1000);
Serial.println(F(«Получение IP-адреса»));
// Пытаемся запустить через DHCP. Если не получилось,
// делаем это вручную:
if (!Ethernet.begin (mac) ) {
Ethernet.begin(mac, ip, gateway, subnet);
}
// Выводим IP-адрес и запускаем сервер:
Serial.println(Ethernet.locallP());
server.begin();

uj Метод loop () изменяется void loop() {


значительно. В начало его до­ String fileName = «»; // Имя запрашиваемого клиентом
// файла
бавлено несколько локальных
char inChar = 0; // Входящий символ от клиента
переменных, последняя из кото­ int requestType = 0; // Тип запроса: GET или POST
рых применяется для ожидания int гequestedFileLength = 0; // Размер запрошенного файла
подключения клиента. При под­
ключении клиента создается эк­ // Ждем подключений от клиентов:
земпляр библиотеки Text Finder Client client = server.available();
для поиска текста во входящем
if (client) {
потоке от клиента:
// Создаем экземпляр библиотеки TextFinder для поиска текста
// от клиента:
TextFinder finder (client ) ;

Ш Вспомним, как выглядят за­ while (client.connected()) {


просы g e t и p o s t от клиента. Это if (client.available()) {
запрос g e t : // Ищем любые данные перед /. Это должно быть GET
// или POST:
GET /index.htm НТТР/1.0 if(finder.getString(«»,»/», requestTypeString,typeLength) )

А это запрос p o s t , который пре­ // Выполняем разные операции для GET и POST:
доставляет переменную: if(String(requestTypeString) = «GET « ) {
POST /response.htm НТТР/1.0 requestType = 1;

thermostat=23 }
else if(String(requestTypeString) = «POST «) {
Помещаем следующий блок requestType = 2;
while внутри оператора условия }
if, который проверяет наличие
клиента. Он проверяет, подклю­ // Собираем все, что следует после / в массив.
// Это имя требуемого клиентом файла:
чен ли клиент, а также отправил
гequestedFileLength = finder.getString(«», « «,
ли он какие-либо байты данных.
filestring, fileStringLength);
При наличии данных выполня­
ется поиск запроса g e t и л и p o s t , // Завершили обработку линии GET/POST; обрабатываем
а также получение запрошенного // полученные данные:
файла. Если получен запрос p o s t , switch (requestType) {
извлекается переменная термо­ case 1: // GET
стата, после чего вызывается // Ничего не делаем для GET,
метод sendFile () ДЛЯ ОТПраВКИ // кроме как отправляем файл (ниже)
файла клиенту: break;
Сети мобильной телефонной связи и физический мир 445
7
т case 2: //POST
// Пропускаем остальную часть заголовка, которая
// заканчивается символами новой строки
/ / и возврата каретки:
I finder.find("\n\r") ;
// Если клиент прислал новое значение для настройки
// реле, берем его:
if (finder.find("thermostat")) {
int newThermostat = finder.getValue ('= ');
// Если значение изменилось, сохраняем его:
if (thermostat != newThermostat) {
thermostat = newThermostat;
// Ограничиваем диапазон значениями
// от 20 до 40 градусов:
thermostat = constrain(thermostat, 20, 40);
// Сохраняем значение настройки в EEPRCM:
EEPROM.write (thermostatAddress, thermostat) ;
}
}
break;
}

// Будь это запрос GET или POST,


// даем им требуемую строку.
// Если после / ничего нет,
// тогда клиенту требуется указатель:
if (requestedFileLength < 2) {
// Минутку, этот вызов метода sendFile() выглядит иначе,
// чем в предыдущем скетче в разделе «Читаем с кар точки SD».
// Изменение следует.
sendFile(client, «index.htm»);
}
// В противном случае посылаем им запрошенный файл:
else {
sendFile (client, filestring);
}
}
// Даем клиенту время для получения данных:
delay(1);
// Закрываем подключение:
Serial.println(F(«Подключение закрывается»));
client.stop();
} // Закрытие блока if (client.available)
} // Захфытие блока while (client.connected)
} // Закрытие блока if (client)
// Примечание: Здесь вставляется метод проверки температуры
// (тело метода 1оор()) с версии скетча из раздела
// «Управляем реле».



446 Глава Ю

СОТ После блока w h ile о блок / / Посылаем запрошенный файл:


кода для проверки значения на­ void sendFile(Client thisClient, char thisFile[]) {
стройки реле из исходного скетча S tr in g o u tp u ts tr in g = «»; / / Переменная S tr in g для хранения
/ / каждой линии файла
завершает модифицированный
метод loop (). / / Открываем файл для чтения:
Метод se n d F ile () нужно ИЗМе- F il e m yF ile = S D .o p e n ( t h is F ile ) ;
i f (m yFile) {
нить, чтобы вместо вывода со­
// Отправляем заголовок HTTP OK
держимого на экран, его можно
sendHttpHeader(thisClient, 200);
было отправлять клиенту. Он
/ / Читаем файл, пока в нем ничего не останется:
также должен отправлять заголо­ w h ile ( m y F ile .a v a ila b le ()) {
вок HTTP перед файлом. Кроме / / Добавляем текущий символ к строке вывода:
того, если файла нет, клиента char th isC h a r = m y F ile . r e a d ();
нужно известить об этом. Для это­ o u tp u ts tr in g += th isC h ar;
го можно использовать стандарт­
ные коды ошибок HTTP. Таким / / Когда получаем символ перевода строки, посылаем
/ / содержимое o u tp u ts tr in g , а затем очищаем ее:
образом, модифицированный ме­
i f (th isC h ar == *\ n ') {
тод se n d F ile о будет ПОСЫЛаТЬ
thisClient.print(outputstring);
заголовок нттр 200 ок, если он
o u tp u ts tr in g = "";
может читать файл, и заголовок
}
HTTP 404 F il e Not Found В прОТИВ- }
ном случае. Изменения в методе / / Если файл не кончается символом перевода строки,
выделены жирным шрифтом: / / отправляем последнюю линию:
i f (o u tp u ts tr in g != «») {
t h i s C lie n t .p r in t ( o u t p u t s t r in g ) ;

/ / Закрываем файл:
m y F ile . c l o s e () ;
}
e ls e {
/ / Если файл не открылся:
sendHttpHeader(thisClient, 404);
}
I }
□ Метод sendHttpHeadr () ВЫГЛЯ^| / / Посылаем клиенту заголовок HTTP:
ДИТ следующим образом: v o id sendHttpHeader (C lie n t t h i s C lie n t , i n t errorCode) {
th isC lie n t.p r in t(F (" H T T P /1 .1 " ) ) ;
sw itch (erro rC o d e) {
c a se 200: / / OK
t h i s C l i e n t . p r i n t l n ( F ("200 OK"));
th is C lie n t.p r in tln (F (" C o n te n t-T y p e : t e x t /h t m l" ) );
; break;
c a se 404: / / Файл отсутствует
t h i s C l i e n t . p r i n t l n ( F («404 Not Found»));
break;

/ / Заголовок ответа кончается дополнительным символом


/ / перевода строки:
ЬМзСПепЬ .рг1пЬ1п ();
Сети мобильной телефонной связи и физический мир 447

Код скетча в его текущем виде представля­ Наша следующая задача — создать настоящие
ет рабочий веб-сервер, который пересылает страницы интерфейса HTML. Нам нужна страница,
браузеру любые файлы, имеющиеся на карточке которая может показывать текущую температуру
SD. Хотя сервер может пересылать только тексто­ и предоставлять форму для ввода нового значения
вые документы HTML (обратите внимание, что ме­ перенастройки реле. Когда пользователь отправля­
тод sendHttpHeader о возвращает только тип содер- ет форму на сервер, он должен получить сообще­
ЖИМОГО C ontent-T ype: t e x t /h tm l), НО И Эта ВОЗМОЖ­ ние обратной связи о том, что новое значение было
НОСТЬ позволяет делать многое. Попробуйте создать получено и сохранено, а интерфейс должен выпол­
несколько страниц со ссылками друг на друга, со­ нить перезагрузку. Нам также нужна веб-камера,
храните их на SD-карточке, а затем пройдитесь по чтобы получить изображение комнаты. Наконец,
этим ссылкам через браузер. Попробуйте также страница должна хорошо выглядеть на маленьком
просмотреть эти страницы с браузера мобильного экране смартфона или планшетного компьютера.
телефона — ведь именно это было нашей исходной Все эти задания могут быть обеспечены выполне­
целью. Но не поддавайтесь пока искушению предо­ нием кода HTML.
ставить URL сайта своим друзьям — у нас впереди
еще много работы.

<html>
<head>
Главная страница интерфейса < lin k r e l= » sty lesh eet> > ty p e = » t e x t/c s s » h r e f= » m y sty le .c ss»
будет называться index.htm. Мы />
используем трехбуквенное рас­ <meta name=»HandheldFriendly>> co n te n t= » tr u e » />
ширение Мт вместо четырех­ <meta name=»viewport>>
буквенного Мт1 по той причине, c o n ten t= » w id th = d ev ice-w id th , h e ig h t= d e v ic e -h e ig h t» />
что, как упоминалось ранее, би­
блиотека работает с именами < s c r ip t ty p e = » t e x t/j a v a s c r ip t» >
файлов только в формате 8.3. fu n c tio n r e f r e s h () {
var today=new D a te ();
В заглавную часть документа docum ent. im a g e s [« p ic » ]. src=
нужно поместить немного мета­ « h t t p : / / v i s i t o r :p a s s w o r d ! @
информации. В частности, ссыл­ yournam e. d y n d n s. c o m /im a g e /jp e g .c g i" + " ? " + to d a y ;

ку на файл таблицы стилей CSS, if ( d o c u m e n t . im ages) w in d o w .o n lo a d = r e fr e sh ;

чтобы можно было устанавли­ t= setT im eo u t( 'r e fr e s h ()',5 0 0 );

вать на странице шрифты, цвета }


и т. п., а также два метатега, по­ < /s c r ip t >
</head>
зволяющие браузерам мобиль­
ных устройств форматировать
страницу под свои требования.
Далее следует сценарий JavaScript,
который позволяет обновлять
изображение на странице без не­
обходимости обновлять осталь­
ное ее содержимое:



448 Глава 10

ММ Тело документа содержит <body onload=»refresh()»>


тег изображения со ссылкой на <div class=»header»xhl>Thermostat Control</hlx/div>
изображение на другом сервере. <div class=»main»>
Этот момент рассматривается бо­ <img src=»http://visitor:password!@yourname.
dyndns.com/image/jpeg.
лее подробно далее:
cgi» width=»300>> id=»pic»>
Форма в теле документа предна­ <form name=»tempSetting» action=»response.htm»
значена для установки порогового method=»POST»>
<р>Текущая температура:
значения срабатывания реле. Она
// Серверу нужно будет заменить выделенные жирным
вызывает отдельный документ: // шрифтом переменные, прежде чем предоставлять файл.
response.htm, с помощью запро­ / / М ы рассмотрим, как это делается, далее в этой главе.
са p o s t , на который сервер дол­ $temperature
жен предоставить ответ. Мы уже </р>
написали первоначальный ответ Значение термостата (&#176;С):
в предыдущем скетче, когда сер­ cinput name=»thermostat» type=»number»
вер Ищет Значение «thermostat» min=»20»
в конце запроса p o s t .Посмотрите max=»40»
КОД ДЛЯ case 2 оператора switch step=»l»
в предыдущем скетче из разд. value=$thermostat>
«Добавляем сервер». Вы увидите, cinput type="submit" value="submit">
что диапазон температур ограни­ </form>
чен значениями от 20 до 40 гра­ Кондиционер $status

дусов Цельсия. </div>


</body>
Сохраните этот код HTML в фай­ </html>
ле с названием index.htm, а затем
создайте новый документ с на­
званием response.htm.

ШГПосылаем ответ <html>

Страница ответа сервера за за­ <head>


прос клиента: response.htm — на­ cmeta http-equiv=»refresh» content=»3; URL=index.htm» />
много проще, чем страница index, clink rel=»stylesheet» type=»text/css» href=»mystyle.css»
htm. Все что страница ответа де­
лает — это предоставляет дан­ cmeta name=»HandheldFriendly» content=»true» />
ные о текущей температуре, по­ cmeta name=»viewport» content=»width=device-width,
роговом значении термостата и о height=deviceheight»
состоянии (включен или выклю­ />
чен) подключенного к реле кон­ c/head>
диционера (собственно, включено
или выключено реле управления cbody>
кондиционером). К этой странице cdiv class=»header»>chlУправление TepMocTaTOMC/hl>c/div>
применяется та же самая таблица
стилей, что и для главной стра­ cdiv class="main">
ницы, те же самые метатеги для ср>Текущая температура:
мобильных телефонов, а также // Серверу нужно будет заменить выделенные жирным шрифтом
метатег http-equiv, который по­ // переменные, прежде чем предоставлять файл.
сле трех секунд отправляет брау­ $temperature
зер обратно на главную страни­ &#176;С
цу. (Мы использовали последний с/р>
прием в странице проекта сете­ <Р>
вого кота из главы 3.)
Значение термостата изменено на $thermostat&#176;C Щ
Сети мобильной телефонной связи и физический мир 449

Ш Обратите внимание, что пере­ </р>


менные в документах HTTP вы­ < р > К о ндиционер $ status
глядят, как переменные РНР, на­ </р>
чинаясь со знака доллара. Эти <а href=»index.htm»>Bo3Bpai4eHne к управлению</а>
переменные нужно заменить </div>
соответствующими данными от </body>
сервера, прежде чем предостав­ </html>
лять страницу. У нас нет РНР на
Arduino, но мы можем вставить
в наш скетч код, который находит
эти переменные и заменяет их на
нужные значения. Но сначала
нам нужно закончить документ
CSS для сайта:
ШГПридаем стиль_______ .main {
background-color: #fefefe;
Последний документ, который color: #0al840;
нам нужно создать, — это табли­ font-family: «Lucida Grande», Verdana, Arial, sans-serif;
ца стилей. Сохраните его в файле
с названием mystyle.css, а затем
скопируйте этот и два предше­ .header {
ствующих файла на карточку background-color: #0al73E;
SD. Поместите эти файлы не color: #flfffe;
в какую-либо папку на карточке, font-family: sans-serif, «Lucida Grande», Verdana, Arial;
а в ее корневой каталог.
В этом документе вы можете за­
менять любые шрифты и цве­
та — они имеют чисто космети­
ческое значение:

Скопировав файлы на карточку


SD, вставьте ее в разъем на мо­
дуле (шилде) Ethernet, а затем по­
пробуйте просмотреть их в брау­
зере. Результаты для Любиной
квартиры показаны на рис. 10.9.
Ваши результаты должны выгля­
деть похоже. Но текущая версия
нашего сервера еще не предо­
ставляет значения для текущей
температуры, значения термоста­
та и статуса кондиционера. Мы
позаботимся об этом далее.
Current temperature: 21 °C

—— ------- ------- -— -------- -------------------- — Thermostat setting (°C): j25


► ► Рис. 10.9. Фрагмент снимка с экрана результатов
исполнения скетча удаленного управления кондиционером, Afr conditioner is off
сделанного на смартфоне с ОС Android __________________ _____
450 Глава Ю

Динамический адрес DNS


Предоставление
Другим решением будет использование динами­
общего доступа к серверу ческого DNS. Если вам непременно нужно иметь
Итак, наш модуль ЕШ еп^ работает в качестве для своего модуля доменный URL, можете вос­
сервера, и если мы хотим обращаться к нему из- пользоваться узлом динамического сервера DNS
за пределов нашей домашней сети, нужно сделать (DDNS), — например: www.dyndns.com. Узел
его видимым для общего доступа из Интернета. DDNS — это просто узел DNS, который постоянно
Присвоение модулю фиксированного адреса вну­ обновляет запись DNS вашего домена. Ваш марш­
три сети в этом плане не поможет — если вы ор­ рутизатор или иное устройство становится клиен­
ганизовываете сервер у себя дома, этот адрес не том и при подключении к узлу DDNS запрашива­
будет виден за пределами домашней сети. Вам ет, чтобы выбранное доменное имя — например,
придется организовать перенаправление порта на yourserver.com — указывало на адрес, с которого
своем маршрутизаторе (см. разд. «Предоставление подключается данный клиент. Например, ваш мо­
доступа из Интернета к устройству с частным дуль Ethernet (который имеет локальный IP-адрес
192.168.1.20) делает запрос DDNS на узел www.
1Р-адресом» главы 4). Применяя перенаправление
портов, вы можете предоставить устройствам, под­ dyndns.com. Поскольку запрос идет через ваш
ключенным к вашему домашнему маршрутизатору, маршрутизатор, IP-адрес которого 63.118.45.189,
выход в сеть общего доступа — Интернет. При этом узел dyndns.com сопоставляет имя yourserver.com
они будут иметь только числовые 1Р-адреса, так как этому IP-адресу. Числовой IP-адрес называется
им не присвоены доменные имена. Но и этого мо­ записью CNAME4 доменного адреса. Поэтому, если
жет быть достаточно. кто-либо захочет просмотреть сайт yourserver.com,
он будет направлен по IP-адресу 63.118.45.189.
Существуют два решения для присвоения устрой­ А если вы настроили перенаправление общедоступ­
ствам имен с помощью метода перенаправления ного порта 80 маршрутизатора на адрес 1 9 2 . 1 6 8 . 1.20
портов. Самым простым будет встроить адрес моду­ порт 80, ваш модуль Ethernet будет отображаться
ля в свою веб-страницу общего доступа. Например, в сети Интернет как yourserver.com.
если общедоступный адрес вашего маршрутизатора
63.ii8.45.i89, настройте перенаправление порта,
Услуги динамического сервера DNS обычно плат­
чтобы порт 80 маршрутизатора указывал на порт 80 ные, но один домен, который заканчивается на
модуля Е& ете^ а затем перезагрузите маршрути­ имя, принадлежащее узлу DDNS, — например,
затор. Когда маршрутизатор снова установит под­ privereda.dyndns.tv, может предоставляться бес­
ключение к Интернету, откройте в браузере адрес платно. Впрочем, услугу DDNS для даже специаль­
http://63.118.45.189 — вы должны получить доступ ного имени или нескольких имен можно приобрести
к модулю. Осталось только вставить эту ссылку в за вполне разумную месячную плату, что позволит
реальную веб-страницу на размещенном на хостин­ вам присвоить устройствам вашей домашней сети
ге веб-сервере. общедоступные имена Интернета.
4 CNAME, Canonical Name record.

|||||] Сетевые камеры


Настройка таких камер проста и подробно описыва­
Камеры с возможностью подключения к Интернету ется в сопровождающей их документации. Камеру
доступны на рынке уже в течение нескольких лет, прежде всего нужно подключить к вашей домаш­
и цена на них с каждым годом продолжает пони­ ней сети Ethernet через проводное соединение и от­
жаться. За сумму порядка $60 можно приобрести крыть ее страницу администрирования в браузере.
небольшую камеру со встроенным модулем Wi-Fi, На этой странице нужно настроить параметры сети
который работает для камеры в качестве сервера. Wi-Fi, к которой требуется подключить камеру, со­
Камера для этого проекта — D-Link DCS-930L — хранить настройки в памяти камеры, а затем пере­
обошлась мне в магазине канцтоваров в $70. загрузить камеру.
Сети мобильной телефонной связи и физический мир 451

Поскольку камера работает как сервер, нам нужно Вместо параметров имя_пользователя И пароль
знать ее IP-адрес. Кроме того, камеру нужно сде­ вставьте реальные значения имени пользователя
лать видимой в сети Интернет тем же способом, как и пароля. Этот подход весьма ненадежен с точки
мы это сделали с модулем Ethernet. Но для камеры зрения безопасности, так как любой, кто может
придется использовать другой порт, поскольку порт просмотреть исходный код страницы, сможет так­
80, который является портом HTTP по умолчанию, же увидеть и пароль. Поэтому убедитесь, что эта
уже занят для модуля Ethernet. Вполне приемлемо учетная запись не обладает абсолютно никакими
выбрать для камеры порт 8080. правами на изменение и даже на просмотр ее па­
раметров.
Настроив перенаправление портов для камеры,
вставьте ее адрес в ссылку в коде HTML модуля Установив общедоступный адрес (иШ.) для изобра­
Ethernet. Пусть изображения в файлах формата JPG жения камеры, проверьте его в браузере. Неплохо
камеры DCS-930L будут находиться в папке /image/ также выполнить эту проверку из-за пределов вашей
jpeg.cgi. Представим, что общедоступный IP-адрес домашней сети. Удостоверившись, что все работает
вашего маршрутизатора 63.ii8.45.i89 и что его должным образом, вставьте эту ссылку в страницу
порт 8080 перенаправлен на порт 80 камеры. Тогда index.htm и снова проверьтре, как все это работа­
ссылка на общедоступную страницу будет такой: ет. Не забудьте изменить изображения в коде
JavaScript в заглавной части документа. Теперь ваш
<а href ="http://63.118.45.189:8080/image/jpeg.cgi">
сервер в Интернете представлен по-настоящему.
Кстати, подобно камерам многих других произво­
Это был последний крупный этап проекта. Остались
дителей, для доступа к камерам D-Link требуется
только некоторые мелочи — в частности, надо за­
использовать пароль. Поэтому нам нужно добавить
менить подстановочные переменные температуры,
учетную запись для посетителей с правами только
настройки термостата и состояния кондиционера.
на просмотр изображения и изменить URL изобра­
Для этого в наш скетч следует добавить еще немно­
жения на:
го кода.
<а href=»http://имя_пользователя:пароль®63.118.45
.189:8080/image/jpeg. cgi»>

ШГИзвещаем ___ while (myFile.available()) {


// Добавляем текущий символ к строке вывода:
Чтобы изменить переменные char thisChar = myFile.read();
в документе HTML, серверу outputstring += thisChar;
нужно прочитать этот документ
в процессе его предоставления // Ищем и заменяем переменную температуры.
по запросу. Такая работа вы­ // Значения типа float нельзя преобразовывать в сороковые,
полняется в блоке while о мето­ // поэтому отправляем напрямую:

да sendFile (). Так что добавьте if (outputstring.endsWith(«$temperature»)) {

в этот метод следующий выде­ outputstring =


// Ограничиваем значение двумя разрядами после запятой:
ленный жирным шрифтом код:
thisClient.print(readSensor(),2);
}
При исполнении скетча с добав­
ленным кодом сервер исследует // Ищем и заменяем переменную термостата:
файл на указанные перемен­ if (outputstring.endsWith(«$thermostat»)) {
ные. Когда он находит одну из outputstring.replace(«$thermostat», String(thermostat));
указанных строк: $temperature, }
$thermostat ИЛИ $status — сервер
заменяет эту строку значением // Ищем и заменяем переменную состояния кондиционера:
соответствующей переменной. if (outputstring.endsWith(<<$status>>)) {
String relaystatus = «off»; W
452 Глава 10

эратите внимание, что опе­ if (checkThermostat()) {

ратор i f о для замены перемен­ relayStatus = «оп»;

ной температуры отличается }


outputstring.replace(«$status», relayStatus);
от других двух. Поскольку не
существует функции для преоб­ >
разования значения типа float в
// Когда получаем символ перевода строки, посылаем
строчное, нужно использовать
// содержимое outputstring, а затем очищаем ее:
функцию print () ИЛ И println (). if (thisChar -= *\n') {
Это означает, что переменную thisClient.print(outputstring);
температуры нужно выводить outputstring =
непосредственно в клиенте, а не
просто заменить эту часть строки
перед ее выводом.

Выполнив эти дополнения к скетчу и загру- приложения разрабатываются путем создания ба­
15 13 зив его в микроконтроллер, мы наконец по­ зовой браузерной оболочки без какого бы то ни
лучим полностью готовый сервер. Теперь, открыв было пользовательского интерфейса с последую­
адрес модуля Arduino в браузере, мы увидим значе­ щей разработкой пользовательского интерфейса в
ние температуры в комнате, текущее значение тер­ НТМЬ5. Переходя по ссылкам такого приложения,
мостата, а также статус кондиционера. Результатом мы просто путешествуем по страницам сайта, на
изменения каких-либо из этих настроек будет из­ котором оно основано. Поскольку большинство
менение температуры в комнате. Кроме того, в ре­ приложений для мобильных телефонов являются в
зультате изменений для камеры в теге изображения основном сетевыми приложениями, при разработке
и в коде JavaScript документа index.htm вы теперь своих приложений вполне имеет смысл применять
можете получать и изображения с камеры, установ­ указанный подход в первую очередь. Это позволит
ленной в квартире. Результат исполнения конечно­ вам воспользоваться всеми доступными протокола­
го приложения в браузере мы уже видели ранее на ми Сети.
рис. 10.9.
Сетевой подход к разработке мобильных приложе­
Использование браузера в качестве интерфейса для ний также позволяет воспользоваться протоколами,
мобильных приложений замечательно тем, что та­ которые не исполняются в браузере, но, тем не ме­
кой подход позволяет обойтись одним приложением нее, основаны на протоколе НТТР. Мы рассмотрим
для всех платформ. Многие популярные мобильные этот подход в нашем следующем проекте.
Сети мобильной телефонной связи и физический мир 453

Проект 30

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

Наша Люба в некотором роде — что касается новых


технологий — луддитка, и она не совсем в востор­ Требуемые компоненты
ге от веб-интерфейса термостата. «Но это же теле­ ►
►Завершенный проект 29, 1 шт.
фон! — жалуется она. — Не могла бы я просто по­
звонить кому-либо, чтобы они зашли ко мне в квар­ ►
►Учетная запись Twilio, 1 шт.
тиру и изменили настройки кондиционера?» В этом
с ней трудно спорить — если у нас есть телефон,
мы должны быть в состоянии управлять вещами
телефонным звонком.
В течение последних нескольких лет 1Р-телефония сообщают ему о своих возможностях и предостав­
развивается семимильными шагами, и в настоя­ ляют способ связываться с другими людьми: гудок
щее время граница между телефонным звонком и готовности линии и кнопочную панель для набора
веб-страницей весьма размыта. Серверные при­ номера.
ложения — такие как Google Voice или Asterisk —
Если вам приходилось звонить в ту или иную служ­
можно рассматривать как виртуальные коммута­
бу поддержки в последние несколько лет, высока
торы: они соединяют телефонные коммутируемые
вероятность, что вам пришлось общаться с серве­
сети общего пользования (ТКСОП) с Интернетом.
ром SIP. Он или пытается распознать произноси­
Эти серверы используют протокол SIP5 для уста­ мые вами слова, используя для этого программное
новления соединения между двумя клиентами и обеспечение для преобразования речи в текст, или
определения сервисов, которые эти клиенты могут же дает указания нажимать кнопки телефона, ис­
предоставлять и получать. Например, клиент SIP пользуя для этого программное обеспечение, преоб­
может работать с голосовой связью, текстовыми со­ разующее текст в речь. Полученный от вас ответ —
общениями, маршрутизировать сообщения другим голосовой или значения нажатых кнопок — сервер
клиентам и т. п. Иногда сервер SIP устанавливает преобразовывает в запрос HTTP g e t и л и p o s t , ко­
соединение между клиентами, а затем устраняется, торый он отправляет для выполнения в свою уда­
позволяя клиентам взаимодействовать друг с дру­ ленную или локальную базу данных. Получив ре­
гом напрямую. А в других случаях сервер управ­ зультаты выполнения запроса, сервер сообщает их
ляет трафиком между клиентами, преобразовывая вам, снова используя преобразование текста в речь.
протоколы каждого из них в формат, понимаемый Если сервер SIP не может понять, что вы говорите
другим. Короче говоря, это версия телефонистки (возможно вы кричите «Девушка! Девушка! Я хочу
старых времен 21-го столетия. Когда разработчи­ говорить с человеком!», как это часто делаю я), он
ки приложения делают свою работу как положено, перенаправляет ваш звонок на номер, с которого
пользователю приложения не нужно ничего знать вам уже отвечает сотрудник службы поддержки.
о протоколе SIP, так как телефон или программа
В этом проекте мы воспользуемся коммерче­
5 SIP, Session Initiation Protocol — протокол инициации сеанса. ским сервисом SIP компании Twilio и создадим
454 Глава Ю

голосовой интерфейс для управления термостатом в США и Канаде. Тем не менее, рекомендую вам
из предыдущего проекта. Компания Twilio предо­ прочитать весь материал на эту тему, чтобы полу­
ставляет разные услуги VoIP6, такие как голосовая чить общее представление о возможностях в рас­
почта, конференц-связь и многие другие. Открыв сматриваемой области, а затем попробуйте найти
платную учетную запись в этой компании, можно компанию, предоставляющую подобные услуги
купить телефонные номера, к которым привязыва­ в вашей стране. К сожалению, предоставление теле­
ются эти сервисы, чтобы клиенты могли звонить на фонных номеров является одним из аспектов, в кото­
них напрямую. Компания также предоставляет воз­ ром ТКСОП существенно отстают от Интернета, —
можность бесплатно попробовать предоставляемые в основном по коммерческим и политическим
ею услуги. Но в таком случае вам придется пользо­ причинам. Если вы действительно хотите глубоко
ваться телефонным номером, который они выделят вникнуть в предмет VoIP и SIP, прочитайте книгу
вам сами, а также использовать пароль для доступа «Asterisk: The Future of Telephony»7 издательства
к услугам, связанным с этим ноиером.
O'Reilly, написанную Джимом Ван Меггеленом
На момент подготовки этого материала компания (Jim Van Meggelen), Джаред Смит (Jared Smith)
Twilio предоставляет телефонные номера только и Лиф Мадсен (Leif Madsen).

6 VoIP, Voice over IP — передача голоса по IP-протоколу,


Интернет-телефония. 7 «Asterisk: Будущее телефонии».

Каким стандартом пользоваться?


К сожалению, приложения SIP и VoIP имеют не Я выбрал для этого проекта сервис Twilio по при­
только преимущества, но и недостатки. Основным чине простоты его языка разметки TwiML. Кроме
из этих недостатков в настоящее время является от­ того, демонстрируемые Twilio примеры ясно по­
сутствие общих стандартов. Все подобные сервисы казывают, как отделить язык разметки от друго­
предоставляют услуги, слегка отличающиеся друг го серверного языка, — например, РНР или Ruby.
от друга, хотя основные услуги: телефонных звон­ Все делается с помощью команд g e t и л и p o s t . Сайт
ков, сообщений SMS и считывания кнопок тональ­ Twilio предлагает отличные примеры для РНР, но
ного набора — предоставляют почти все. Но каж­ их использование совершенно не обязательно, что­
дый сервер и каждый коммерческий поставщик ис­ бы начать работать с этим сервисом. Предоставляет
поведуют несколько иные подходы к предоставле­ Twilio также хороший отладчик и хорошую техни­
нию интерфейса API для своего сервиса. Например, ческую поддержку. И хотя сервис не предоставляет
язык разметки сервиса Twilio (который применяется возможностей, которые есть у других, — например,
в этом проекте) нельзя использовать для разработ­ замера уровня звука при записи или преобразова­
ки приложений для других сервисов — таких как ния речи в текст, но в целом, преимущества его про­
Tropo, Google Voice или любого другого из десятков стоты перевешивают недостатки отсутствующих
имеющихся на рынке. возможностей.
С выбором правильного средства для разработки Для этого проекта вам нужно будет получить учет­
любого проекта вам помогут ответы на следующие ную запись на веб-сайте w w w .tw ilio .co m . Учетная
четыре вопроса: запись может быть как платной, так и бесплатной.
• предоставляет ли он требуемые мне возможно­ Для бесплатной учетной записи при каждом звонке
сти? кроме номера телефона нужно будет вводить еще
и пароль доступа. При этом поддерживаться будет
• доступен ли он в моем регионе?
одновременно только одно приложение. Но для
• легко ли его использовать? первого знакомства с этой областью такого вполне
• будет ли он работать с инструментами, которые достаточно.
у меня уже есть?
Сети мобильной телефонной связи и физический мир 455

Нам также понадобится адрес (URL) сервера i D £V £L O P £R TOOLS


Arduino из предыдущего проекта. Например, если
IP-адрес вашего сервера 63л 1 8 .45.189, адрес для ! API Credentials
этого проекта будет http://63.118.45.189/voice.xml.
Jv Account SID
Войдите в свою учетную запись Twilio и откройте
ì C;,:A •****••*’" * • * **'•*«•'**•
панель управления. Здесь вам будет предоставлен
Г■:
номер телефона в «песочнице» и пароль (ПИН-код). Sandbox
Номер телефона соединит вас со шлюзом Twilio,
|c 'iiuifiber pm
а шлюз — с сервером HTTP, чей адрес вы предо­
ставите (то есть адрес вашего сервера Arduino). : .V;,- «' • ; ’’ blip,/83 * 18 45 IKtyvOrC*4 XHSÈ
Справившись с этой частью, мы можем приступить
: -, ; -, ; hup .Aitчто i om e/? :t b
к написанию файла XML для сервера и модифи­
цированию скетча, чтобы он отвечал должным об­ : y.n \ и POST.pi
разом. На рис. 10.10 показана панель управления
учетной записи сервиса Twilio.

Краткое введение в XML ж Рис. 10.10. Панель управления Twilio. Введите адрес
(URL) вашего сервера Arduino в поле Voice URL
Язык разметки общего назначения XML8 использу­
ется многими веб-сервисами и базами данных. Язык
XML позволяет описать практически что угодно в
машиночитаемом формате. Базовыми строитель­
ными элементами языка являются теги, которые за­ раметр длина является атрибутом тега пауза, со
ключаются в угловые скобки < и >. Теги описывают значением этой паузы равным 10 секундам. С по­
элементы, которые могут быть любым контентом, мощью атрибутов элементы можно описывать до­
который нам нужно категоризировать. Элементы статочно подробно.
могут иметь подэлементы. Например, элемент
<body> может иметь подэлементы <paragraph>: Если вы заметили, что все это выглядит, как HTML,
то вы думаете правильно. Языки XML и HTML
<body> являются родственными языками, но синтаксис
<р>Это содержимое параграфа</р>
языка XML намного строже. И поскольку этот язык
</body>
более общий, можно создавать программы разбора
Все, что находится между открывающим и закрыва­ XML, преобразовывающие одну схему разметки
ющим тегом, является содержимым элемента. Это, в другую.
как правило, тот материал, который хотят читать
люди, машины же к нему безразличны.
Схема разметки TwiML
Каждый элемент должен иметь открывающий и за­
крывающий теги, хотя иногда тег может закрывать Схема разметки Twilio, называемая TwiML, пред­
сам себя: ставляет собой описание предоставляемых Twilio
<Пауза длина=»10» />
функций в XML. То есть она описывает, что мож­
но делать с помощью Twilio. Схема содержит эле­
Содержимое внутри тега, отличное от его имени, менты для обработки голосовых звонков и SMS-
является его атрибутом. В предыдущем теге па­ сообщений. Список элементов довольно краткий:

8 XML, extensible Markup Language — расширяемый язык раз­


метки.
456 Глава 10


►Голосовые элементы: Значение всех этих элементов подробно объясняет­
• <Say>
ся на страницах документации веб-сайта Twilio, но
• <Р1ау>
вы, наверное, можете и сами догадаться, о назначе­
нии большинства из них.
• <Gather>
• <Record>
Для этого проекта мы опишем элемент <Response>.
• <Sms>
Внутрь этого элемента мы включим подэлемент
• <Dial> <Gather> — для получения нажатий кнопок пользо­
• <Number> вателя. Элемент <Gather> является TwiML-версией
• <Conference> формы HTML, поэтому он имеет атрибуты action
• <Hangup> и method, посредством которых мы указываем эле­
• <Redirect> менту куда и как отправлять полученные им дан­
• <Reject> ные. Мы также воспользуемся элементом <say>,
• <Pause> чтобы озвучивать текст для пользователя, исполь­

►SMS -элементы: зуя преобразования текста в речь.

• <Sms>
• <Redirect>

<?xml version=»l.О» encoding=»UTF-8»?>


<Response>
Для этого проекта нам потребу­ <Gather action=»voice.xml» method=»POST»>
ется создать всего лишь один до­ <Say>
кумент TwiML. Когда пользова­ The current temperature is
тель набирает номер, этот доку­ $temperature
мент будет начальным ответом, degrees Celsius.
когда пользователь нажимает (Текущая температура:
кнопку, документ вызывает сам $ temperature
градусов Ц ельсия.)
себя, чтобы обновить настрой­
The thermostat is set to $thermostat degrees Celsius.
ки. Сохраните документ в файле (Термостат установлен на $thermos tat градусов Цельсия.)
voice.xml на карточке SD, которую The air conditioner is $status.
мы использовали в предыдущем (Кондиционер: $ s tatus.)
проекте. (Перед сохранением If you would like to change the thermostat,
удалите русский текст в скобках, please enter a new setting.
выделенный жирным шрифтом, (Если вы хотите изменить значение термостата,
и сами скобки тоже. Он нужен введите новое значение.)
If you are satisfied, please hang up.
только для понимания, что вам
(Если вы довольны показаниями, просто завершите
будет говорить машина.) звонок.)
</Say>
Как можно видеть, этот доку­ </Gather>
мент содержит такие же перемен­ <Say>
ные, что и в предыдущем про­ You didn't give a new setting, so the thermostat will
екте: $temperature, $thermostat remain at $thermostat degrees. Goodbye!
и $status. Сервер заменит их так (Вы не предоставили нового значения, поэтому значение
же, как он это делает в документе термостата останется $thermostat градусов.
До свидания.)
HTML. Эту часть скетча изме­
</Say>
нять не потребуется. </Response>
Изменения, которые нужно вне­
сти в скетч сервера, следуют
далее. №
Сети мобильной телефонной связи и физический мир 457

ШГмодифицируем сервер case 2: //POST


// Пропускаем остальную часть заголовка, которая
Чтобы превратить сервер из // заканчивается символами новой строки и возврата
предыдущего проекта в голосо­ // каретки:
вой сервер, в него нужно вне­ finder .find («\п\г») ;
сти лишь несколько изменений.
// Если клиент прислал новое значение для термостата
Первое из них — в главном ци­
// (настройки реле), берем его:
кле loop о . Когда Twilio делает
if (finder.find("Digits")) {
запрос p o s t ,он посылает обратно
int newThermostat = finder .getValue (’= ') ;
значения цифр, которые поль­
зователь нажал на панели теле­
фона, используя для этого пере­
менную Digits. Поэтому там,
где мы раньше искали в запросе
POST переменную thermostat, М Ы
теперь ищем переменную Digits.
Новая линия кода выделена жир­
ным шрифтом:

ш Шлюз Twilio, который играет // Посылаем запрошенный файл:


роль клиента для нашего серве­ void sendFile(Client thisClient, char thisFile[]) {
ра, несколько более приверед­ String outputstring = // Переменная String для
// хранения каждой линии файла
лив, чем большинство браузеров.
Лучше всего он работает тогда,
// Открываем файл для чтения:
когда ему предварительно со­ File myFile = SD.open(thisFile);
общается размер отправляемого if (myFile) {
ему сообщения. Это означает, // Определяем размер файла:
что нам нужно внести некоторые int mySize = myFile.size() ;
изменения В методы sendFileO // Определяем тип файла — XML или HTML — по его
и sendHttpHeader (). Сначала // расширению (но полагаем, что это HTML) :
в методе sendFileO мы получа- int fileType = 1; // 1 = html, 2 = xml
ем размер отправляемого фай­ if (String (thisFile) .endsWith(«xml»)) {
ла и определяем его тип: HTML fileType = 2;
или XML. Затем мы отправляем }
информацию о размере и типе
файла методу sendHttpHeader (). // Отправляем заголовок HTTP OK
sendHttpHeader(thisClient, 200, mySize, fileType);
Далее приводится начало метода
// Читаем файл, пока в нем ничего не останется:
sendFileO с изменениями, выде-
while (myFile.available()) {
ленными жирным шрифтом:

Щ Необходимо также модифи­ else {


цировать ВЫЗОВ метода sendHttp // Если файл не открылся:
Header о В методе sendFile () ДЛЯ sendHttpHeader(thisClient, 404, 0, 1);
обработки ошибки 404: }

Тестовый сервер и онлайновый отладчик


В процессе разработки этого проекта мне очень помог специаль­
но созданный тестовый сервер, подобный описанному в главе 4,
который просто получал весь запрос от ТшШо. Принес пользу
в обнаружении проблем также и онлайновый отладчик Twilio.
458 Глава 10

Ё1теперь метод sendHttpHeaderQ // Посылаем клиенту заголовок HTTP:


отправляет намного больший void sendHttpHeader(Client thisClient, int errorCode,
объем информации. Если рань­ int fileSize, int fileType) {
thisClient.print(F("HTTP/1.1 "));
ше мы отправляли минимальный switch(errorCode) {
объем, необходимый для ответа case 200: // OK
большинству браузеров, то те­ thisClient.println(F("200 OK"));
перь клиент шлюза Twilio ожи­ break;
дает от нас большего. Мы уже case 404: // Файл отсутствует
thisClient.println(F(«404 Not Found»));
видели более подробные ответы
break;
от сервера — например, в про­
}
екте измерителя качества возду­ thisClient.println(F("Server: Arduino"));
ха из главы 4. Так же и здесь: мы thisClient.print (F ("Content-Type: text/ ")) ;
посылаем имя серверного при­ if (fileType = 1) {
ложения (Arduino) и определяем thisClient.println (F ("html")) ;
тип содержимого на основе ин­ >
if (fileType = 2) {
формации, полученной в методе
thisClient.println (F ("xml")) ;
sendFiie о . Затем мы посылаем
}
информацию о размере содер­ thisClient.print (F ("Content-Length: ")) ;
жимого, основанную на размере thisClient.println (fileSize) ;
файла. Эта информация сообща­ // Заголовок ответа кончается дополнительным символом
ет клиенту, сколько байтов ожи­ // перевода строки:
thisClient.println();
дать, прежде чем закрывать под­
ключение:

Выполните эти изменения, сохраните файл и $status их настоящими значениями. Например,


voice.xml на карточку SD, запустите сервер и если температура 27,28 градуса Цельсия, мы заме­
позвоните по своему номеру Twilio. Введите ПИН- няем строку $temperature Значением 27,28 — НО ЭТО
код, чтобы вызов прошел. Если вы сделали все пра­ только 5 символов, а не 12. То же самое относится и
вильно, вам будет прочитан текст вашего докумен­ к строке $thermostat, которую мы заменяем числом
та, и вы сможете ввести новое значение для термо­ из двух цифр, и к строке $status, которую мы заме­
стата с кнопочной панели телефона. Это значение няем двух- или трехсимвольной строкой. Чтобы пра­
можно изменять любое количество раз, пока вы не вильно вычислить размер содержимого, нам нужно
завершите звонок. принять это обстоятельство во внимание. Указанную
проблему можно решить двумя способами:
Установка правильного размера
Топорное решение
содержимого
Поскольку для большинства браузеров размер со­
Теперь сервер теоретически может предоставлять держимого значения не имеет, то и не выводите его,
как XML-, так и HTML-документы, поэтому мы если предоставляется HTML-вариант:
также должны быть в состоянии просматривать эти
if (fileType == 1) {
страницы в браузере. Но у браузера могут возникать
thisClient.print(F(«Content-Length: «));
проблемы с размером содержимого. Если вы были thisClient .println (fileSize) ;
внимательны, то, возможно, заметили, что размер }
файла в действительности не равняется количеству
байтов, отправляемых в качестве содержимого. Филигранное решение
Дело тут в том, что размер файла определяется Мы знаем, что значение термостата — число из
ДО замены переменных $temperature, $thermostat двух цифр, так как мы сами задали для него такой
Сети мобильной телефонной связи и физический мир 459

формат. Это на девять символов меньше, чем коли­ else {


чество символов в строке $thermostat. Мы также mySize = mySize - 20;

знаем, что значение температуры — строка из пяти }


// Отправляем заголовок HTTP OK
символов, так как мы ограничили его до двух деся­
sendHttpHeader(thisClient, 200, mySize,
тичных знаков после запятой (а температура свыше
fileType) ;
100 °С весьма маловероятна). Это на семь символов
меньше, чем в строке $temperature. Мы также знаем, Корректировки наподобие этих приходится выпол­
что строка состояния включения кондиционера со­ нять все время при динамическом изменении содер­
стоит из двух или трех символов (on или off), что на жимого файла перед его предоставлением браузеру.
пять или четыре символа меньше, чем длина строки Поэтому полезно знать несколько способов того, как
$status. Поэтому, прежде чем посылать заголовок это осуществить. На серверах, оснащенных доста­
HTTP, можно вычислить получающуюся разницу. точным объемом памяти, можно просто поместить
Результат будет на 20 или 21 символ меньше, чем весь файл в массив, а затем определить размер это­
исходный файл, — в зависимости от состояния го массива. Но при работе с микроконтроллерами,
реле управления кондиционером, определить кото­ объем памяти которых ограничен, неплохо так же
рое МОЖНО, вызвав метод checkThermostat (). Метод иметь в виду и несколько обходных маневров, по­
sendFileO можно изменить для выполнения СООТ- добных рассмотренным.
ветствующих корректировок, прежде чем посылать
Признаюсь честно, я сначала выбрал топорный
заголовок ок следующим образом:
вариант.
if (checkThermostat()) {
mySize = mySize - 21;
}

HTML5 и другие подходы к разработке мобильных веб-приложений


В настоящее время большой энтузиазм среди раз­ единять элементы в странице, страницы в браузере
работчиков мобильных приложений вызывает стан­ и браузер с удаленными серверами. Моя граммати­
дарт HTML5, самая последняя версия стандарта ческая аналогия не идеальна, но в целом передает
HTML. Целью стандарта HTML5 является обеспе­ суть того, как эти три инструмента открывают нам
чение большей поддержки интерактивности и кон­ широкий диапазон средств для представления ин­
троля над видом и поведением веб-страниц. На мой формации, ожидания ввода от пользователей, ге­
взгляд, более всего в HTML5 интересен не столько нерирования интерактивных ответов и получения
сам язык разметки, сколько возможности, которые и отправки данных в расположения иные, нежели
он предоставляет в комбинации с JavaScript и стан­ браузер, независимо от местонахождения дан­
дартом каскадных таблиц стилей CSS3. ных — на жестком диске пользователя или на уда­
ленном сервере.
Каким же образом HTML5, JavaScript и CSS3 рабо­
тают сообща? Упрощая, можно сказать, что HTML Прежде приложения, исполняющиеся в веб-брау­
предоставляет имена существительные, CSS — зере, имели весьма ограниченный доступ к аппа­
прилагательные и наречия, a JavaScript — глаголы, ратному обеспечению компьютера, на котором они
чтобы привести все остальные части речи в дей­ исполнялись. Разработчики операционных систем
ствие. Язык HTML описывает базовую структуру считали небезопасным разрешать загружаемым из
страницы и элементы в ней: формы, элементы вво­ Интернета приложениям получать доступ к жестко­
да, блоки текста и т. п. Язык CSS в основном опи­ му диску, камере, микрофону или другому обору­
сывает характеристики визуальных элементов: цве­ дованию компьютера. Ведь хакеры-то не дремлют!
та, шрифты, расстояния между элементами и т. п. Конечно же, теперь, когда почти любое приложение
А язык сценариев JavaScript позволяет нам со­ загружается из Интернета, этот образ мышления
460 Глава 10

кажется устаревшим. Хотя загрузить вредоносную этого средства HTML5 и JavaScript. Разработчики
программу можно и сейчас, большинство пользо­ платформы взяли движок встроенного в телефон
вателей вполне способны разобраться, заслужива­ браузера (который реализует все новые стандарты
ет ли онлайновый источник той или иной степени HTML5), добавили к нему кучу точек входа к по­
доверия и предоставляет ли он запрошенную веб­ лезным функциональностям (таким, как встроен­
страницу или же вредоносное приложение. В то же ные датчики) и выпустили продукт в виде базовой
самое время все больше требующихся нам данных инфраструктуры, на основе которой можно выпол­
находятся в Интернете — будь то на веб-сайте со­ нять дальнейшую разработку конкретных прило­
циальной сети или в онлайновом хранилище типа жений. Разработчик просто загружает прикладную
Google Docs или Dropbox. Браузеру более нет на­ инфраструктуру на языке программирования его
добности обращаться к локальному жесткому дис­ телефона (Java — для Android, Objective-C — для
ку компьютера, если все ваши файлы находятся iOS). Этот код не подлежит никаким изменениям,
в Сети. так как служит основой для приложения. Затем
разработчик создает свои документы HTML5 и
Размытие границы между безопасностью браузе­
JavaScript, которые обеспечивают приложению тре­
ра и общей безопасностью — достаточно удобное
буемую функциональность. После чего все это ком­
новшество, если вам нравится разрабатывать физи­
пилируется и загружается в телефон. На веб-сайте
ческие интерфейсы. Стандарт HTML5 и JavaScript
PhoneGap также предоставляется услуга онлай­
содержат методы для доступа к некоторым ап­
новой компиляции — вы загружаете на сайт свои
паратным устройствам компьютера или телефо­
файлы HTML, они компилируют их в приложение,
на. Например, можно определить расположение
которое вы затем загружаете в свой телефон.
устройства в пространстве, снимая показания ак­
селерометра, если устройство оснащено таковым К сожалению, некоторые функции PhoneGap пока
(а большинство смартфонов оснащено), считывая недоступны. Например, установление подключе­
показания компаса и приемника GPS, опять же, ния к последовательному порту Bluetooth телефона
если таковые имеются, и многое другое. или доступ к его порту USB. Тем не менее, это обе­
щающее начало.
Но есть у этой медали и оборотная сторона — среди
разработчиков браузеров нет общего стандарта для PhoneGap — не единственная платформа, позво­
указанных методов. Поэтому такие возможности ляющая разрабатывать приложения для мобиль­
доступны не в каждом браузере, а те, которые до­ ных телефонов под разные операционные систе­
ступны, не обязательно реализованы универсаль­ мы. Компания MoSync (www.mosync.com) также
ным способом. Например, на момент подготовки предоставляет прикладные инфраструктуры для
этого материала, браузер Safari на телефоне Apple разных платформ, но на них пользовательские при­
iPhone и планшете iPad предоставляет доступ к ак­ ложения нужно разрабатывать на языке C++, а не
селерометру, а стандартный браузер для Android — на HTML. Платформа MoSync обеспечивает более
нет. В общем, ситуация такова, что если получить обширный доступ к аппаратным устройствам теле­
доступ через браузер к устройствам вне телефона фона, но она определенно требует большего объема
не представляется трудным, то для получения до­ знаний и опыта программирования, чем все прочее,
ступа к устройствам самого телефона могут потре­ что мы делали в этой книге.
боваться значительные усилия.
В настоящее время несколько других компаний
также предлагают подобные инструменты, и, несо­
Платформа PhoneGap мненно, в будущем их будет еще больше. Но если
вы заинтересованы в разработке приложений для
Если вас интересует получение доступа к датчи­ телефонов, оснащенных датчиками, но не хотите
кам своего телефона, и у вас есть навыки работы разрабатывать приложения под каждую из разных
с JavaScript, технология PhoneGap (www.phonegap. операционных систем телефонов, лучше всего вы­
с о т) выглядит очень обещающе. Платформа брать платформу PhoneGap — по крайней мере до
PhoneGap предоставляет доступ практически ко того момента, пока возможности браузеров не до­
всем аппаратным датчикам телефона, используя для стигнут должного уровня.
Сети мобильной телефонной связи и физический мир 461

тшИнтерфейсы на основе текстовых сообщений


Обмен текстовыми сообщениями быстро становится наиболее распространенным примене­
нием мобильных телефонов. Многие считают текстовые сообщения не столь раздражающими
вторжениями в повседневную жизнь, как телефонные звонки. Текстовые сообщения позволяют
быстро передать информацию, не тратя время на разного рода предварительные разговоры.
Кроме того, сообщения электронной почты можно легко посылать на SMS и наоборот — эта
возможность не зависит от какой-либо конкретной платформы. Все что вам нужно — это мо­
бильный телефон и учетная запись электронной почты. А для ситуаций, когда требуется не­
медленное и малозаметное извещение, или для предоставления одноразовой инструкции они
самое то.

Сервис SMS начинался как способ отправки тек­ Далее приводится список наиболее распростра­
стовой информации по каналу связи мобильных ненных серверов для отправки сообщений SMS на
телефонных сетей. Идея заключалась в том, чтобы электронную почту нескольких мобильных опера­
посылать байты текстовых сообщений в виде ча­ торов в США, Канаде и Европе:
сти потока данных телефонного звонка, но не во
• AT&T: phonenumber@txt.att.net
время входящего звонка. Эти короткие сообщения
можно было использовать для диагностики, изве­ • T-Mobile: phonenumber@tmomail.net
щения абонента об ожидающей его голосовой по­ • Virgin Mobile: phonenumber@vmobl.com
чте или для других быстрых извещений. Но когда • Sprint: phonenumber@messaging.sprintpcs.com
услуга SMS стала доступной для клиентов на ком­ • Verizon: phonenumber@vtext.com
мерческой основе, она значительно превзошла свое
• Bell Canada: phonenumber@txt.bellmobility.ca
исходное предназначение. Сообщения SMS могут
быть ограничены 140 символами, но люди изобре­ • Telenor Norway: phonenumber@mobilpost.no
ли много творческих способов упаковывать в эти • Telia Denmark: phonenumber@gsml800.telia.dk
140 символов большой объем информации. • Swisscom: phonenumber@bluewin.ch
Почти все мобильные операторы включают в пре­ • T-Mobile Austria: phonenumber@sms.t-mobile.at
доставляемые ими услуги шлюз SMS-email, а это • T-Mobile Germany: phonenumber@t-dl-sms.de
означает, что клиенты могут посылать сообщения • T-Mobile UK: phonenumber@t-mobile.uk.net
SMS из почтового клиента и получать их в почто­
вый ящик. Для проверки этой возможности от­ Намного более обширный список можно найти
правьте со своего телефона текстовое сообщение, на веб-сайте www.emailtextmessages.com (сразу
но не на телефонный номер, а на адрес своей элек­ предупреждаю, я не проверял все эти адреса в этом
тронной почты. В зависимости от вашего оператора списке).
мобильной связи сообщение может быть отправле­ Но не все так просто. Пользователи иногда дей­
но через службу MMS9 или же как сообщение SMS. ствительно предполагают, что для мобильных опе­
Проверьте свой почтовый ящик — в нем должно раторов параметр phonenumber в адресе должен
быть сообщение с вашего телефона. Теперь вы зна­ представлять собой просто телефонный номер
ете, какой адрес электронной почты использовать, абонента, но многие мобильные операторы США
если вы хотите послать себе текстовое сообщение и других стран мира предпочитают иметь свой осо­
на телефон через электронную почту. В большин­ бый подход к этому вопросу. В ряде случаев у не­
стве случаев он будет состоять просто из вашего которых операторов услуга получения сообщений
номера телефона, символа @ и адреса электронной электронной почты в виде SMS может быть плат­
почты вашего оператора. ной. Поэтому для уточнения всех подробностей
9 MMS, Multimedia Message Service — служба передачи муль­ лучше всего обратиться в службу поддержки своего
тимедийных сообщений. мобильного оператора.
462 Глава 10

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

т Пишем код <?php


/*
Чтобы отправить сообщение SMS Доставщик SMS
Контекст : РНР
на телефонный номер из почто­
вого ящика, отправьте сообще­
ние электронной почты на адрес $phoneNumber = $_REQUEST[«phoneNumber»]; // Получаем номер
в формате номер_телефона@ // телефона
$carrier = $_REQUEST[«carrier»]; // Получаем оператора
адрес_оператора. Далее приво­ $message = $_REQUEST[«message»]; // Получаем сообщение
дится сценарий РНР для отправ­ $recipient = $phoneNumber."@".$carrier; // Составляем адрес
ки таких сообщений. Сохраните // получателя
$subject = "Сообщение для вас";
его на своем веб-сервере в файле
с названием sms.php. // Если все поля заполнены, отправляем сообщение:
if (isset($phoneNumber)&& isset($carrier) &&
isset($message)) {
Г Защитите mail($recipient, $subject, $message);

этот сценарий ?>


Весьма неплохо защитить этот |
<html>
сценарий паролем или вообще <head></head>
удалить его с сервера после за­ <body>
вершения работы с ним. Если <h2>SMS Messenger</h2>
его найдет какой-либо спам- <form name="txter" action="sms.php" method="post">
Phone number: <input type="text" name="phoneNumber"
; робот с кучей телефонных но­ size="15" maxlength="15"xbr>
меров, он может использовать Message:<br>
его не по назначению. <textarea name="message" rows="5" cols="30"
V_____ „ ____________ ____ 2 maxlength="14 0">
Вставьте ваше сообщение SMS сюда (140 символов максимум)
</textarea>
</br>
Carrier:
<select name=»carrier»>
<option value=»txt.att.net»>AT&T US</option>
<option value=»txt.bellmobility.ca»>Bell Canada</option>
<option value=»messaging.nextel.com»>Nextel US</option>
<option value=»messaging.sprintpcs.com US»>Sprint</option>
<option value=»bluewin.ch»>Swisscom</option>
<option value=»sms.t-mobile.at»>T-Mobile Austria</option>
<option value=»t-dl-sms.de»>T-Mobile Germany</option>
<option value=»t-mobile.uk.net»>T-Mobile UK</option>
<option value=»tmomail.net»>T-Mobile US</option>
<option value=»gsml800.telia.dk»>Telia Denmark</option>
<option value=»mobilpost,no»>Telenor Norway</option>
<option value=»vtext.com»>Verл zon</option>
<option value=»vmobl.com»>Virgin Mobile US</option>
</select>

<input type=»submit» value=»send message»>


</form>
</body>
</html>
Сети мобильной телефонной связи и физический мир 463

GPRS для микроконтроллеров


На рынке представлены несколько устройств, сетевые подключения. Джон Боксол (John Boxali)
которые позволяют подключать микроконтрол­ выложил хороший набор руководств по исполь­
лер к мобильным телефонным сетям напрямую. зованию этого модуля по адресу tronixstuff.
С помощью такого устройства микроконтроллер wordpress.com/2011/01/19/tutorial-arduino-and-
может соединяться с Интернетом так же, как это gsm-cellular-part-one.
делает мобильный телефон. Он получает номер
Несколько разных шилдов GRPS для Arduino ком­
телефона и может посылать и принимать сообще­
пания Libelium (www.libelium.com) продает на
ния SMS, делать запросы HTTP, — в общем, де­
своем сайте Cooking Hacks (www.cooking-hacks.
лать в Интернете все, что можете делать вы сами.
com). В наличии там имеются двухдиапазонные
Недостатком таких устройств является дороговиз­
и четырехдиапазонные модули, а это означает,
на их использования, как по энергопотреблению,
что некоторые из этих модулей могут работать
так и по финансовым расходам на подключение.
в США, Европе, Африке и на большей части Азии,
Модули компании Telit занимают верхнюю нишу в зависимости от страны и оператора.
рынка модулей GPRS, и на основе этих модулей
доступны несколько плат и шилдов для Arduino. Компании Seeed Studio также предоставляет
Модули оснащены последовательным интер­ четырехдиапазонный шилд GPRS, оснащенный
фейсом TTL и набором команд в стиле АТ — то аудиоразъемами на случай, если вы захотите сде­
есть, они работают как модемы, подобно модулям лать свой телефон.
Bluetooth Mate, но используют другие команды. Использованию любого из шилдов GRPS сопут­
Они оснащены встроенными библиотеками ТСР/ ствуют две проблемы: потребляемая ими мощ­
IP, что позволяет им устанавливать сетевые под­ ность и стоимость эксплуатации. Например,
ключения, а некоторые также имеют возможно­ шилд SM5100B может потреблять в процессе
сти GPS. Одна из таких моделей даже оснащена звонка до двух ампер тока. Это больше, чем мо­
интерпретатором Python, что позволяет испол­ жет предоставить регулятор напряжения на плате
нять на ней программы, написанные на этом язы­ Arduino, поэтому линия питания шилда должна
ке программирования. быть подключена на линию Vin платы Arduino.
Компания SparkFun поставляет адаптерные пла­ Соответственно, источник напряжения для платы
ты для модулей GE865 и GM862 компании Telit, должен выдавать, по крайней мере, 2 ампера толь­
а также для модуля ADH80667 компании ADH ко для модуля GPRS. Плата не будет потреблять
Tech. Эти платы переводят все выводы модуля весь этот ток постоянно, но если она не сможет
на разъемы с расстоянием 0,1 дюйма между вы­ получить его, когда требуется, установить под­
водами, они также обычно оснащены разъемом ключение не получится.
USB/TTL-Serial. Модули не предназначены для Для работы любого из этих модулей требуется
использования с каким-либо определенным ми­ соответствующий тарифный план и рабочая SIM-
кроконтроллером, поэтому вам придется начать карточка мобильного оператора. И если только
с изучения набора команд и ознакомления со вы не подключены к сети оператора по какому-
спецификацией технических данных, если вы хо­ либо дешевому тарифному плану, тестирование
тите использовать один из них. и отладка проектов GPRS может обойтись вам
В продаже также имеется шилд GPRS для Arduino в круглую сумму. Альтернативой может служить
на основе модуля SM5100B компании Spreadtrum тарифный план, по которому вы платите только
Technologies. Этот модуль не имеет столь много за использованное время звонков. Ни один из этих
функций, как модули компании Telit, но он под­ вариантов не является идеальным, поэтому пытай­
держивает набор команд АТ, может принимать тесь выполнять как можно больший объем диагно­
и получать SMS-сообщения и устанавливать стирования и отладки в автономном режиме.
464 Глава 10

Рис. 10.11. Два способа оснастить микроконтроллер функциональностью GPRS: адаптерная плата компании
SparkFun разводит все выводы модуля GM862 компании Telit на выводы с расстоянием 0,1 дюйма между ними (а);
шилд SM5100B (б) разводит последовательные выводы модуля GPRS на последовательные выводы модуля Arduino

Ья Приложения для операционных систем


мобильных телефонов
Хотя интерфейсы на основе веб-браузеров и БМБ-сообщений предоставляют много возмож­
ностей, для некоторых проектов просто необходим доступ к операционной системе телефона.
Из веб-приложения трудно, если вообще возможно, получить доступ, например, к аппаратному
обеспечению телефона или его файловой системе. На такие случаи вам понадобится изучить
операционную систему своего телефона и имеющиеся для нее средства программирования.
А если вы задались целью создать приложение для всех типов мобильных телефонов, вам при-
дется изучить все их операционные системы.
Область мобильных телефонов подвержена бы­ К программированию для iOS, как к весьма при­
стрым изменениям, как и область их операционных влекательной среде, проявляется много интереса,
систем, и поспевать за всеми этими изменениями но компания Apple печально известна своим жест­
может стать изнуряющей задачей. В настоящее ким контролем над разработкой для своей опера­
время основными операционными системами для ционной системы, — разработчики должны у них
мобильных телефонов являются Android компании зарегистрироваться, а доступный инструмента­
Google, Blackberry, WebOS (первоначально разрабо­ рий жестко ограничен. Кроме того, разработчики
танная компанией Palm), Windows Mobile, Symbian не могут сами распространять свои приложения,
и iOS компании Apple (для IPad, iPhone и iPod). а должны делать это через Арр Store. Для коммер­
Три из них: Android, iOS и Blackberry — на момент ческих разработчиков такой подход не проблема,
подготовки этого материала являются самыми рас­ но для любителей и индивидуальных разработчи­
пространенными, занимая большую часть рынка. ков это может представлять непреодолимый барьер.
Операционная система Symbian компании Nokia Подробную информацию по программированию
когда-то была одной из самых распространенных, для iPhone можно почерпнуть в книгах издатель­
но Nokia больше ее не поддерживает. По состоянию ства O’Reilly «Learning iPhone Programming» и «iOS
на последний квартал 2010 года ОС Android была Sensor Programming», Алана Аласдэйра (Alasdair
самой популярной операционной системой для Allan). Надо отдать ему должное — Аласдэйр сде­
смартфонов, занимая 35 % мирового рынка. лал много для того, чтобы программирование для
iPhone стало более доступным.
Сети мобильной телефонной связи и физический мир 465

С другой стороны, программирование для опера­ Следующие далее примеры подготавливались одно­
ционной системы Android не имеет таких огра­ временно с разработкой используемых для их соз­
ничений. Приложения на телефоны с ОС Android дания инструментов, а в некоторых случаях исполь­
можно устанавливать как через Android Market, так зуемые в них библиотеки впервые по-настоящему
и самостоятельно по USB. Эта система основана на испытывались на них. Так что, имейте в виду — вы
Linux и программируется на Java, что предоставля­ вступаете на неизведанную территорию. В статье
ет знакомую среду для многих опытных разработ­ Википедии про Processing для Android (http://wiki.
чиков. Для тех, кто не чувствует себя с кодом так processing.org/w/Android,) говорится: «Не пользуй­
уверенно, компания Google предоставляет графиче­ тесь этим кодом при управлении тяжелой техникой.
скую среду программирования Арр Inventor (http:// Не полагайтесь на этот код для рефератов или ди­
appinventor.mit.edu/explore/), которая позволяет пломной работы, ибо вы не получите диплома. Не
создавать приложения, компонуя графические объ­ используйте этот код, если вы предрасположены
екты. В оставшейся части этой главы мы рассмо­ высказывать нарекания про несовершенное про­
трим создание приложений для Android с помощью граммное обеспечение, которое вы загрузили на ха­
уже знакомой нам среды программирования — ляву». В библиотеки, используемые в следующем
Processing. Начиная с версии 1.5, среда Processing проекте, будут, скорее всего, внесены изменения,
может компилировать и устанавливать скетчи и они, будем на то надеяться, станут более стабиль­
в виде приложений для Android. ными и легкими в применении. Поэтому обязатель­
но проверьте онлайновую документацию для всех
упоминаемых здесь инструментов на предмет на­
Среда Processing для Android личия обновлений для них.
Среда Processing для Android — очень перспек­
тивное обновление этой платформы программи­
рования, но она все еще в процессе разработки.

Настройка Processing для Android


Рабочий процесс в среде Processing для Android не­ окно, запрашивающее указать папку, в которой
сколько отличается от стандартной среды Processing, установлен этот набор. Выберите папку, в которую
поэтому вам нужно будет установить некоторые до­ вы установили Android ADK, и нажмите кнопку
полнительные компоненты и ознакомиться с рядом Open. Цветовая схема окна Processing слегка изме­
новых инструментов. Прежде всего, вам будет нуж­ нится и будет выполнен переход в режим Android.
на версия Processing 1.5.1 или более поздняя, загру­
зить которую можно на веб-сайте Processing (www.
processing.org/download). Вам также потребуется
набор Android SDK10, загрузить который можно по
адресу http://developer.android.com/sdk/. Загрузите
и установите обе эти программы, а затем запустите
Processing. Нажмите кнопку со стрелкой у правого
края панели инструментов (рис. 10.12) и выберите
из раскрывшегося меню опцию Android.
Откроется диалоговое окно, спрашивающее, уста­
новлен ли на компьютере набор Android SDK.
Нажмите кнопку Yes. Откроется другое диалоговое
10 SDK, Software Developers Kit — набор средств для разра­ Рис. 10.12. Выбор режима программирования
ботки ПО. в Processing
466 Глава 10

Далее нужно установить некоторые компоненты При желании можно также установить и другие
Android SDK. Для этого нажмите меню Android пакеты — в зависимости от версии Android вашего
и выберите опцию Android SDK. Откроется окно телефона и того, к каким возможностям вы хотите
Android SDK Manager для установки новых паке­ получить доступ.
тов Android. Установите флажок Updates/New, что­
бы отобразить пакеты, доступные для установки. Чтобы узнать операционную систему своего
Вам нужно будет установить, по крайней мере, три устройства Android, откройте его главное меню и
пакета: выберите в нем опцию Настройки. Прокрутите
список настроек до самого низа и выберите опцию
• в узле Tools установите флажки Android SDK О телефоне. Версия Android будет указана или на
Tools и Android SDK Platform-tools; этом экране, или же здесь нужно будет выбрать оп­
• затем разверните узел с версией вашей опера­ цию Сведения о ПО. На рис. 10.13 показан пример
ционной системы и установите флажок Google экрана с информацией о телефоне, включая версию
APIs. его операционной системы.

Если окажется, что ваша версия Android более древ­


няя, чем версия 2.1, рекомендуется установить са­
мую последнюю версию Android, которую поддер­
живает ваш телефон. Например, я установил SDK
Platform Android 2.3.3, API 10, revision 1 для работы
с телефоном Nexus S, а также Google APIs Android
API 10, revision 2.

Где исполняются приложения?


Разработанные в Processing приложения Android
можно исполнять или на настоящем телефоне, или
же на эмуляторе телефона, который входит в состав
набора разработки Android SDK. Эмулятор поле­
зен, если у вас нет под рукой настоящего телефона
Android. Эмулятор должен установиться автомати­
чески в SDK Manager, но если этого не произошло,
вы можете установить его сами, выбрав в меню
Android опцию Android SDK Manager. Впрочем,
эмуляторы обычно очень медленны, и исполнение
приложений на них не идет ни в какое сравнение с
исполнением их на настоящем телефоне.

Чтобы разрешить исполнение скетчей Processing на


вашем телефоне Android, выберите в главном меню
устройства опцию Настройки, а затем Опции раз­
работчика. Откроется окно с предупреждением,
что включение опций разработчика может вызвать
нестабильную работу устройства. Нажмите в нем
кнопку ОК, а в следующем экране установите фла­
жок Отладка USB. Это позволит устанавливать
приложения на устройство по USB, а также посы­
Рис. 10.13. Один из экранов меню О телефоне лать отладочную информацию обратно в Processing
с информацией о версии Android или в любую другую среду разработки.
Сети мобильной телефонной связи и физический мир 467

Включив режим отладки по USB, подсоедините


телефон к разъему USB компьютера и откройте
один из примеров скетчей Processing для Android.
Вспомните, что примеры находятся в меню File | м 'ц и с *. с. j v m c >.с < I’fiui i u ’.-1..r: i ,
Examples. Для начала выберем из папки Sensors
пример Accelerometer. Щелкните по этому при­
меру двойным щелчком левой кнопки мыши, что­
бы загрузить его скетч в Processing. Загрузив скетч
в Processing, нажмите кнопку Run (рис. 10.14). В за­ Рис. 10.14. Для исполнения скетча на физическом
висимости от вашей версии Processing при нажатии устройстве нажмите кнопку Run (самая левая кнопка
кнопки Run может потребоваться нажать и удер­ на панели инструментов). А для исполнения скетча на
живать клавишу <Shift>, чтобы изменить режим виртуальном устройстве — нажмите и удерживайте
клавишу <Shift>, а затем нажмите кнопку Run
с исполнения на виртуальном устройстве на ис­
полнение на физическом устройстве или наоборот.
Скетч будет скомпилирован, установлен на устрой­ Processing для Android, и методы onPauseO
ство и запустится в нем на исполнение. Вот и все. и onResumeO, которые вызываются методами
Теперь вы разработчик приложений Android для Processing pause о и resume о. Исполнение дея­
мобильных устройств. тельностей (и, соответственно, скетчей) часто при­
Полезной особенностью опции Run on Device яв­ останавливается и возобновляется: при переходе
ляется то, что в панели сообщений выводятся со­ устройства в режим простаивания, при изменении
общения от исполняющегося на устройстве скетча. ориентации экрана и при переключении на другое
Это возможно благодаря включенной опции отлад­ приложение. Поэтому для плавной обработки таких
ки USB на устройстве. Таким образом в панели со­ переходов в скетч необходимо вставлять методы
общений окна Processing также выводятся резуль­ pause () И resume ().
таты исполнения в скетче всех команд print о и Взаимодействие с устройством осущ ествляется
printin о . Это намного облегчает задачу отладки
посредством сенсорного экрана. Поскольку мыши
скетчей. Но не забудьте поудалять все команды нет, то и события мыши не работают. Но системные
print о и printin о по завершении отладки скетча.
переменные mousex и mousey продолжают исполь­
Когда устройство не подключено к компьютеру, вы­ зоваться, кроме того, добавлены новые системные
вод этих команд записывается в файл журнала на переменные — motionX, motionY, pmotionX, pmotionY
устройстве, расходуя таким образом доступную па­ И motionPressure — КОТОрые ИСПОЛЬЗуЮТСЯ ДЛЯ рабо­
мять устройства. ты с сенсорны м экраном. Переменная mousePressed
также доступна.
Важные различия Поскольку скетч Android исполняется не в окне,
Версия Processing для Android значительно отлича­ а на полном экране, устанавливать размер окна
ется от стандартной версии Processing. с помощью метода size о нет смысла, поэтому он
в режиме Android и не работает. Но зато, если
Большинство стандартных библиотек Processing необходимо, можно использовать переменные
не будут работать в режиме Android. Эта ситуация screenWidth И screenHeight. Также М О Ж Н О зафикси­
может измениться в будущем, по мере того, как раз­ ровать ориентацию:
работчики адаптируют наиболее полезные библио­
orientation(PORTRAIT);
теки для режима Android, но пока будет лучше на
orientation(LANDSCAPE);
это не полагаться.
Возможности шрифтов работают так же, как и в
То, что мы называем скетчем, для режима Android
стандартной версии Processing. Вывести список
называется деятельностью. Деятельности имеют
шрифтов можно следующим образом:
несколько основных методов: метод onCreateo,
который является эквивалентом метода setup о printin ( PFont.listO );
468 Глава 10

Для получения доступа к различным функциям Поскольку скетч перезапускается при каждом изме­
устройства нужно включать разные разрешения. нении ориентации экрана, для сохранения и после­
Для этого используется опция Sketch Permissions дующей загрузки значений переменных, которые
меню Android. Она открывает окно Android должны сохраняться, можно использовать методы
Permissions Selector, в котором можно устано­ saveStrings() И loadStrings().
вить большинство необходимых разрешений.
Дополнительные сведения о различиях между стан­
Установленные разрешения записываются в файл
дартной средой Processing и средой Processing для
AndroidM anifest.xm l, который находится в папке
Android, а также самую последнюю информацию
скетча. И хотя разрешения можно устанавливать,
по этой среде можно найти на веб-сайте http://wiki.
редактируя этот файл, настоятельно рекомендует­
processing.org/w/Android.
ся делать это посредством окна установки раз­
решений. Для всего, что мы будем делать далее А теперь давайте создадим для начала небольшой
в этой книге, можно без проблем использовать окно скетч. Он считывает положение указателя и сохра­
со списком разрешений. А редактирование файла няет данные при приостановке и возобновлении
вручную чревато проблемами, так как XML ошибок движения. Для скетча нужно установить флажок
не прощает. разрешения WRITE_EXTERNAL_STORAGE.

I l l Точка касания /*
Тестирование Processing для Android
Этот скетч демонстрирует ис­ Контекст: Processing
пользование системных пере­ */
менных в Android. При вращении
float ballX, ballY; // Позиция шарика на экране
устройства экран приложения
// Файл, для сохранения и считывания данных при паузе
ориентируется соответственно, / / и возобновлении:
при этом сохраняя, а затем пере­ String datafile = «sketchFile.dat»;
загружая данные о положении
указателя: void setup() {
// Создаем шрифт для экрана:
String[]fontList = PFont.list();
PFont androidFont = createFont(fontList[0], 24, true);
textFont(androidFont, 24);

void draw() {
// Цветовая схема: Sandy stone beach ocean diver.
// Автор — ps. http://kuler.adobe.com:
background(#002F2F);
fill (#EFECCA) ;
// Выводим координаты X и Y шарика и давления пальца:
text(«mouseX:» + mouseX, 10, 50);
text{«mouseY:» + mouseY, 10, 80);
text("motionPressure:" + motionPressure, 10, 170);
// Перемещаем шарик, если пользователь надавливает на экран:
if (mousePressed) {
ballX = mouseX;
ballY = mouseY;
}
// Рисуем голубой шарик в точке касания:
fill (#046380) ;
ellipse(ballX, ballY, 50, 50);
Сети мобильной телефонной связи и физический мир 469

ш Методы pause () И resume () j void pause () {


// Создаем строку для хранения позиции шарика:
используют внешний файл на |
String ballPos = Ьа11Х+ «\п» + ballY;
устройстве для записи значений j
// Помещаем строку в массив и сохраняем ее в файл:
переменных, которые должны I
String[] data = {
сохраняться при приостановке )
ballPos
и возобновлении исполнения j
};
скетча, — например, при враще- |
savestrings (datafile, data) ;
нии устройства и соответствую- j
щей переориентации экрана. Для |
каждой переменной использует- j void resume() {
ся отдельная строка, которая со- j // Загружаем файл с данными:
храняется в своей строке файла. ] String [] data = loadStrings (datafile);
Строки переменных разделяются j // Если файл в наличии:
символом новой строки (\п): ! if (data != null) {
/ / и содержит две строки, извлекаем их для X и Y:
Результаты исполнения скетча j if (data.length > 1 ) {
показаны на рис. 10.15. I ballX = float (data [0]);
ballY = float (data [1]);

}*I

f Попробуйте также запустить и другие приме-


I ры, поставляемые с Processing для Android.
Особый интерес представляют скетчи Accelerometer
и Compass, так как они демонстрируют, как полу­
чить доступ к полезным компонентам телефона.
Получив хорошее представление о среде Processing
для Android, можно приступать к созданию своего
собственного приложения — мобильного регистра­
тора личных биометрических данных на телефоне.

► ► Рис. 10.15. Наш первый скетч в Processing


для Arduino
470 Глава 10

4z Проект 31
Мобильный регистратор личных биометрических данных
Одной из популярных причин разработки собственных приложений для мобильных телефо­
нов является возможность использования радиомодуля Bluetooth телефона для организации
последовательного канала связи с другими устройствами. Это позволяет использовать теле­
фон в качестве мобильного регистратора данных или канала для отправки их в базу данных
в Интернете. В этом проекте мы будем с помощью Arduino измерять гальваническую реакцию
кожи, отправлять полученные данные по Bluetooth на телефон Android, а затем сохранять их
в файле в Интернете.
Все возрастающее число энтузиастов личных дан­
ных собирают личные биометрические данные с Требуемые компоненты
разными целями: от визуализации закономерностей

►Устройство Android, 1 шт.
своей деятельности, чтобы улучшить свой подход к
физическим упражнениям, до отслеживания струк­ ►
►Модуль LilyPad Arduino Simple, I шт.
туры сна, чтобы решить проблему бессонницы. ►
►Модуль Bluetooth Mate, 1 шт.
Здесь и там по всему миру проводятся встречи чле­
нов движения Quantified Self11 (http://quantifiedself. ►
►Литиево-ионная полимерная батарейка, 1 шт.
com), на которых они обмениваются советами и ►
►Сопротивление 270 К, 1 шт.
методами, как это делать, а на рынок поставляются

►Отрезок проводящей ленты, 1 шт.
устройства типа FitBit (www.fitbit.com) и Zeo (www.
myzeo.com), облегчающие задачу биометрического ►
►Токопроводящие нитки.
мониторинга. ►
►Отрезок токопроводящей ткани Shieldit Super,
Этот проект основан на разработке выпускника про­ 14 дюймов, 1 шт.
граммы интерактивных коммуникаций Мустафы ►
►Застежка-липучка.
Багдатли (рис. 10.16).

►Ветровка с капюшоном, 1 шт.

►Нитки для вышивания.

Мустафа решил отслеживать свою кожно-гальва­


ническую реакцию (КГР) и частоту сердцебиений,
чтобы определить, каким образом события дня вли­
яют на его состояние, то есть как они отражаются
на его сердцебиении и ГКР. Его проект Poker Face
отлеживал эти две биометрические характеристики
с помощью модуля Arduino LilyPad и передавал по
Bluetooth на мобильный телефон, который сохранял
их в Интернете. Более подробно о проекте Poker
Face можно узнать на веб-сайте Мустафы http://
Рис. 10.16. Мустафа Багдатли с устройством Poker
Face1
12— регистратором биометрических данных,
mustafabagdatli.com. Наш проект будет таким же,
связанным с мобильным телефоном. Фотографию как и проект Мустафы, но только — для упроще­
предоставил Мустафа Багдатли (Mustafa Bagdath) ния — без отслеживания частоты сердцебиения. Вы
же можете вполне свободно заменить датчик ГКР
11 «Квантифицированный "я"».
датчиком любой физиологической характеристики,
12 Poker Face (Н епроницаем ое лицо) — как у игрока в п о­
кер, чтобы други е не могли догадаться по нему, насколько которую решите отслеживать. На рис. 10.17 показа­
хорош ие или плохие у него карты. на блок-схема этого проекта.
Сети мобильной телефонной связи и физический мир 471

Рис. 10.17. Блок-схема


системы для проекта
мобильного регистратора
биометрических данных

Мобильный
телефон

Последовательный Канал
канал TTL Bluetooth

Микроконтроллер считывает показания датчика использовали в других проектах Bluetooth в книге.


в виде аналогового напряжения и передает его Телефон делает запрос HTTP g e t к сценарию РНР
последовательно на модуль Bluetooth Mate. Данные на веб-сервере, который сохраняет входящие данные
затем передаются по Bluetooth на мобильный в файл. Что делать дальше с этими данными, решать
телефон по протоколу SPP, который мы уже уже вам.

Схема системы или возбуждению, он тоже слегка потеет, что из­


меняет проводимость его кожи. Вот это изменение
Схема для этого проекта предельно простая. Все,
в сопротивлении кожи мы и будем замерять в на­
что требуется для измерения кожно-гальванической
шем проекте.
реакции, — это высокоомное сопротивление и ваша
кожа. Чтобы убедиться, возьмите мультиметр и за­ По сути, датчик представляет собой делитель на­
мерьте сопротивление участка кожи на запястье. Вы пряжения, где ваша кожа играет роль переменно­
увидите, что сопротивление сухой и прохладной го сопротивления, а постоянное высокоомное со­
кожи очень высокое — возможно, в мегаомном диа­ противление дополняет цепь. В схему (рис. 10.18)
пазоне. Выполните какие-либо интенсивные физи­ включено постоянное сопротивление номиналом
ческие упражнения, чтобы выработать пот, и снова 270 К, но вы можете использовать другой номинал,
замерьте сопротивление на том же самом участке который лучше подойдет для вашей кожи. Надо при
кожи. Вы увидите, что сопротивление станет на­ этом учесть, что с номиналом, меньше 10 К, схема
много ниже. Когда человек подвергается стрессу обычно не работает.
472 Глава 10

Рис. 10.18. Монтажная (а)


и принципиальная (б)
схемы мобильного регистратора
биометрических данных.
Контактные площадки датчика
выполнены из токопроводящей ткани

Контактные площадки
из токопроводящей ткани

о о
A REF
Reset GND
+3 3V D13
+5V D12
Gnd D11/PWM
К «земле» Вывод 11
(минусу) батареи Gnd D10/PWM используется
К +3,7 В батареи Vin DQ/PWM
L / ^ / Г V V IVI
в качестве питания
для датчика
D8
Модуль
Arduino
D7
D6/PWM
Analogo D5/PWM

^ЛЛЛг—
270 Ом _
A1
A2 D3/PWM
D4

Вывод А1
используется - A3 D2
в качестве общего _ A4 Digitali/TX
(«земли») для датчика
A5 DigitalO/RX

Л
Зарядные устройства
RTS
Если вы собираетесь использовать для это­
RX
го проекта литиево-полимерные батарейки,
Модуль TX приобретите для них зарядное устройство,
Bluetooth Mate Vcc +5 В работающее от USB. Хорошо подойдет за­
CTS рядное устройство USB Lilon/LiPoly charger
Gnd компании Adafruit (номер детали: 259) или
LiPo Charger Basic - Micro USB компании
SparkFun (номер детали: PRT-10217).
б
Сети мобильной телефонной связи и физический мир 473

Для изготовления датчика и для закрепления модуля


Arduino LilyPad на ветровке использовались токо­
проводящая ткань и токопроводящие нитки. Разные
токопроводящие ткани и нитки имеют различные
механические и электрические свойства, поэтому
может быть полезно поэкспериментировать снача­
ла с несколькими их типами, чтобы выяснить, какие
подойдут для вас лучше всего. В качестве контактов
для датчика сопротивления кожи Мустафа исполь­
зовал два отрезка растягиваемой токопроводящей
ткани, пришитых к напульснику (рис. 10.19).

Конструкция
Мы для этого проекта используем в качестве кон­
тактов датчика сопротивления кожи два лоскутка Рис. 10.19. Крупный план напульсника с пришитыми
токопроводящей ткани с термоклейкой основой, за­ контактами датчика КГР. Напульсник показан
вывернутым наизнанку чтобы контакты были лучше
крепленные внутри кармана ветровки с помощью
видны. Фотографию предоставил Мустафа Багдатли
утюга. Засунув руку в карман, вы сможете коснуть­
ся этих контактов ладонью, а другой рукой снять
показания по телефону. Можно, конечно, оставить
мобильное приложение исполняющимся постоян­
но, проверяя наличие показаний датчика каждые Токопроводящая нитка соединяет тканевые контак­
две минуты. ты на одной стороне ветровки с трехжильным токо­
проводящим шлейфом на другой. Микроконтроллер
и батарейка зашиваются в нижнюю оторочку ве­
Протестируйте схему тровки непосредственно под карманом и соединя­
до закрепления ее в одежду ются токопроводящим шлейфом, пришитым вну­
Прежде чем закреплять детали в одежде, проте­ три ветровки. Расположение компонентов схемы
стируйте всю схему с кодом, следующим далее. внутри ветровки показано на рис. 10.20.
Поиски неисправностей в аппаратной части, Вклейте контакты из токопроводящей ткани внутрь
скрепленной с элементами одежды, сопряжены кармана, прогрев их утюгом. Разместите их при­
с трудностями. близительно на расстоянии ширины верхней части
ладони друг от друга, чтобы можно было надежно
В своем варианте проекта я использовал токопро­ замыкать их, положив руку в карман. На рис. 10.21
водящую ткань Shieldit Super с клейкой подложкой. показано расположение контактов в кармане.
Дополнительные сведения по токопроводящим тка­
На каждом конце трехжильного токопроводящего
ням можно найти в замечательном введении в эту
шлейфа сделайте продольный разрез длиной око­
область Лии Бючли (Leah Buechley) по адресу h ttp ://
ло трех сантиметров. Между концами проводов
w e b .m e d ia .in it.e d u /~ le a h /g r a d _ w o r k /d iy /d iy .h tm l,
шлейфа следует обеспечить расстояние, достаточ­
в книге Сьюзи Пахчян (Syuzi Pakhchyan) «Fashioning
ное, чтобы подсоединить их к контактам в кармане
Technology: A D1Y Intro to Smart Crafting»13 (изда­
на одном конце и к контактам на модуле Arduino
тельство O’Reilly) и в замечательном онлайновом
LilyPad Simple на другом. Залудите концы прово­
ресурсе Ханны Пернер-Вильсон (Hannah Pemer-
дов, чтобы они не разлохматились. Средний из трех
Wilson) по адресу h ttp ://w w w .p lu sea .a t.
проводов шлейфа не используется, поэтому обрежь­
13 Пожалуй, это можно перевести так: «Технология леп­ те его в концах разреза с каждого конца. Припаяйте
ки: Введение в изобретательное под ел кино для самодел- одну пару выводов токопроводящего шлейфа к кон­
киных». тактам 11 и АО модуля Arduino LilyPad.
474 Глава 10

Рис. 10.20. Размещение компонентов схемы на внутренней стороне Рис. 10.21. Контактные площадки
ветровки: модуль Arduino LilyPad и батарейка (1 ) в действительности из токопроводящей ткани внутри
размещаются внутри нижней оторочки ветровки, вставляемые через кармана ветровки
большую прорезь в ней справа от них (2). Токопроводящий шлейф
выходит из нижней оторочки через небольшую прорезь (3) и идет
к контактам вверху кармана на противоположной стороне ветровки (4)

Сделайте прорезь изнутри в нижней оторочке ве­ Расположите концы токопроводящего шлейфа на
тровки непосредственно под карманом и через нее внутренней стороне ветровки напротив тканевых
вставьте в оторочку микроконтроллер с подсоеди­ контактов в кармане. Пришейте их к контактам
ненными к нему модулем Bluetooth Mate и бата­ через ветровку, используя токопроводящие нит­
рейкой. Нам надо будет вытаскивать батарейку для ки. Чтобы обеспечить хорошее соединение, шейте
зарядки и вставлять ее обратно через эту прорезь, мелкими стежками. По завершении проверьте про­
поэтому закрепите ее края, чтобы они не разлохма­ водимость между контактами и соответствующими
тились. Это можно сделать с помощью термоклей­ противоположными выводами токопроводящего
кой ткани или просто обшить края прорези нитками. шлейфа. Таким образом, вы будете знать, что сиг­
Затем пришейте изнутри к краям застежку-липучку, нал проходит от контактов через ветровку и до кон­
чтобы закрывать прорезь. ца токопроводящего шлейфа, который будет под­
соединен к модулю ЬйуРаё.
Сделайте другую, небольшую на этот раз, прорезь
в нижней оторочке ветровки приблизительно в Прикрепите токопроводящий шлейф к внутрен­
10 сантиметрах от большой, чтобы можно было ней стороне ветровки стежками с интервалами в
протянуть через нее токопроводящий шлейф. Обе 2-3 сантиметра, чтобы он не болтался внутри и не
прорези показаны на рис. 10.20: большая под номе­ перекручивался при ношении ветровки. Не прикре­
ром 2, маленькая — под номером 3. пляйте к ветровке батарейку, так как ее нужно будет
вынимать для перезарядки. Модуль ЬйуРаб следует
Убедитесь, что схема полностью собрана, и модуль
прикрепить, но не пришивайте его, а используйте
Arduino LilyPad Simple запрограммирован, прежде
для этого застежку-липучку, прикрепив одну поло­
чем закреплять схему в ветровке.
вину к модулю, а другую внутри нижней оторочки
ветровки.
Сети мобильной телефонной связи и физический мир 475

На этом этапе схема должна быть полностью функ­ Код для проекта
циональна. Но прежде чем применять Bluetooth,
проверьте ее работоспособность по проводному Для этого проекта используются три модуля кода:
подключению. Для этого подсоедините модуль сценарий РНР, скетч Arduino и скетч Processing.
Arduino LilyPad к компьютеру посредством адап­ Первые два модуля сравнительно простые, и их
тера USB/TTL-Serial (подсоединение адаптера к реализация и тестирование поможет лучше понять
LilyPad может потребовать некоторой изобрета­ скетч Processing.
тельности) и установите последовательное под­ • Скетч Arduino ожидает последовательный ввод
ключение с ним в программе монитора портов (или и по получению байта считывает показания дат­
в другой программе последовательной связи) на чика, сопоставляет их напряжению и отправляет
скорости 115 200 бит/с. Положите ладонь руки на по назначению.
контакты в кармане ветровки. Затем отправьте мо­ • Сценарий РНР получает строку запроса и ищет
дулю какой-нибудь байт, и он должен будет возвра­ в ней переменную data. Все содержимое этой
тить значение датчика. Чтобы увидеть изменение переменной добавляется к существующему тек­
в показаниях датчика, либо поупражняйтесь немно­ стовому файлу datalog.txt. Сценарий возвращает
го, чтобы вспотеть, либо послюните ладонь и сно­ простую страницу HTML, содержащую все, что
ва замкните ею контакты. Убедившись, что схема прислано клиентом.
работает должным образом, удалите адаптер USB/ • Скетч Processing выполняет проверку на нали­
TTL-Serial и подсоедините модуль Bluetooth Mate чие подключения к модулю Bluetooth Mate. При
и батарейку. Затем подключитесь к микроконтрол­ наличии подключения скетч считывает показа­
леру через последовательный порт Bluetooth в мо­ ния с модуля Arduino каждые 10 секунд. Каждые
ниторе портов или в другой программе терминала две минуты скетч отправляет накопленные по­
последовательной связи. Это тот же процесс, что казания сценарию РНР. Скетч также предостав­
и в главе 2, где мы подсоединяли модуль Bluetooth ляет две кнопки: одну — для снятия показаний,
Mate в проекте мартышкиного пинг-понга. а другую — для отправки их на сервер.

Х2 Считываемпоказания Считыватель кожно-гальванической реакции


Глобальные переменные скетча Контекст : Arduino
Arduino определяют два контакта, Ч
как плюс и минус для датчика:
const int voltagePin = 11; // Используем контакт 11, как плюс
const int groundPin = Al; // Используем контакт А1,
// как минус (общий)

Метод setup () инициализирует void setup() {


последовательный порт на ско­ // Инициализируем последовательную связь:
рость 115 200 бит/с (скорость по Serial.begin(115200);
умолчанию для модуля Bluetooth // Задаем контакты voltagePin и groundPin, как цифровые
// выводы
Mate) и задает соответствующие
pinMode(voltagePin, OUTPUT);
контакты плюса и общего для
pinMode(groundPin, OUTPUT);
датчика: // Устанавливаем для них высокий и низкий уровни
digitalWrite(voltagePin, HIGH);
digitalWrite(groundPin, LOW);
}

►►
476 Глава 10

UM Метод loop () проверяет нали­ void loop() {


чие ввода на последовательном // Если есть данные на последовательном порту,
// считываем показание датчика
порту. При наличии ввода метод
if (Serial.available() >0) {
считывает его, просто чтобы очи- ! int inByte = Serial.read();
стать последовательный буфер, int sensorReading = analogRead(AO);
затем считывает показание дат­ float voltage = map (sensorReading, 0, 1023, 0,3.7);
Serial.printIn(voltage);
чика, сопоставляет его напряже­
}
нию и возвращает: }
Обратите внимание, что диапазон
напряжений для сопоставления
показаниям датчика: от 0 до 3,7 В. ;
Причиной этому то обстоятель­
ство, что литиево-полимерная
батарейка выдает 3,7 В, когда
полностью заряжена.

Ш Сохраняемпоказания <?php
вфайл____ __ ! /*
Регистратор данных
Сценарий РНР использует мас­ Контекст: РНР
сив $_REQUEST, ЧТОбы ПОЛуЧИТЬ */
результаты запроса HTTP. Хотя !
скетч Processing делает запрос // Имя файла на сервере, в котором сохранять показания
g e t , для нашего сценария это не // датчика
имеет значения — он может чи­ $dataFile = 'datalog.txt';
тать как запрос g e t , так и запрос
POST. // Проверяем, загрузил ли клиент файл:
if (isset($_REQUEST)) {
Сначала сценарий проверяет мас­ $newData = $_REQUEST['data'];
сив $_ r e qu e s t на наличие в нем if (file_exists ($dataFile) ) {
данных. При наличии данных он // Открываем существующий файл и берем его содержимое
ищет в них переменную data. $currentData = file_get_contents ($dataFile) ;
Далее выполняется проверка // Добавляем к старому содержимому данные,
на наличие файла datalog.txt. // полученные от клиента:
Если файл существует, сцена- ; $currentData .= $newData;
// Записываем все обратно в файл
рий открывает его и помещает |
file_put_contents ($dataFile, $currentData) ;
его содержимое в переменную j
$currentData. Затем новые дан- | }
ные от клиента добавляются | }
?>
в конец содержимого этой пере- j
менной, а результаты записыва- I
<html>
ются в файл, затирая его старое j
<body>
содержимое. |
Here's what you sent:
Код HTML в конце сценария вы­ <?php echo $newData; ?>
водит отправленные в файл но­ </body>
вые данные на экран. Данные </html>
в формате HTML удобно прове- ;
рить в браузере: |
Сети мобильной телефонной связи и физический мир 477

Чтобы сценарий РНР мог записывать в файл Созданный файл можно просмотреть в браузере
журнала, этот файл нужно сначала соз­ следующей строкой запроса:
дать на сервере. Для этого просто создайте пустой
файл datalog.txt в том же самом каталоге, где нахо­ http://w w w .yourserver.com /logger.php?data=
дится сценарий РНР (в программе терминала для blahblahblah
Linux или Mac OS X это можно сделать, выполнив
В браузере должна отобразиться страница, подоб­
команду touch datalog.txt). Установите разрешения
ная показанной на рис. 10.23.
файла, чтобы он был доступен для чтения и записи
всем. Для этого в Linux или Mac OS X выполните Если теперь открыть файл datalog.txt в каком-либо
в консоли команду: текстовом редакторе, мы должны увидеть следую­
щее содержимое:
chmod o+rw datalog.txt
blahblahblah
Если вы создали файл с помощью программы
blahblahblah
с графическим интерфейсом, получите информа­
blahblahblah
цию о файле и установите разрешения средствами
этой программы. Например, на рис. 10.22 показано Если содержимое файла действительно выглядит
окно для установки разрешений файлов програм­ так, значит, на этом этапе все работает должным об­
мы BBEdit, которая подобна многим другим про­ разом, и теперь пора создавать скетч Processing.
граммам.

.
Here's what you sent: blahblahblah

Рис. 10.22. Установка разрешений чтения и записи Рис. 10.23. Вывод сценарием РНР файла журнала
в программе с графическим интерфейсом в браузере

ссылке Downloads и выберите для загрузки самую


Последовательная последнюю версию библиотеки (0.1.6 на момент
подготовки этого материала). Убедитесь, что вы за­
библиотека Bluetooth
гружаете архив, а не исходный код. Распакуйте за­
Чтобы использовать Processing для создания скетча груженный файл. Вы должны получить папку под
Android, нам понадобится BtSerial — последова­ названием btserial-0.1.6, которая содержит подпап­
тельная библиотека для Bluetooth. Эта библиотека ку btserial. Поместите последнюю папку в папку
позволяет устанавливать последовательные под­ libraries папки скетчей Processing, как это вы делали
ключения по Bluetooth, используя команды, подоб­ с другими библиотеками.
ные тем, какие мы использовали для работы с по­
следовательной библиотекой в стандартном режиме В режиме Android среды Processing версии 1.5.1 би­
Processing. Загрузить библиотеку можно по адресу блиотеки не всегда автоматически импортируются
https://github.com/arduino/BtSerial. Щелкните на в скетчи. Этот недостаток, по-видимому, устранят
478 Глава 10

в будущих версиях, чтобы автоматический импорт Это не идеальное решение, но имеющаяся проблема
библиотек в скетчи работал, как в стандартном должна быть решена должным образом ко времени
режиме Processing. Если при попытке исполнить выхода этой книги — команда Processing работает
скетч вы получите сообщение об ошибке — что над исправлением ошибок достаточно оперативно.
пакет cc.arduino.btserial не существует (Package
cc.arduino.btserial does not exist), создайте под­
папку code в папке скетча и скопируйте в нее файл
btserial.jar из подпапки library папки btserial, которую
вы получили при распаковке архива. Затем снова
запустите скетч на исполнение.

Ш Передаем показания
Регистратор данных
В скетче применяются глобаль­ Получает данные по Bluetooth каждые десять секунд
ные переменные для следующих Загружает данные по HTTP каждые две минуты
Контекст: Processing, режим Android
значений:

• период снятия показаний дат­ import cc.arduino.btserial.*;


чика в секундах; // Экземпляр библиотеки
• период обновления сервера BtSerial bt;
в минутах;
int readlnterval = 1 0 ; / / В секундах
• время последнего снятия по­ int sendlnterval = 2 ; / / В минутах
казаний и их отправки;
• адрес сценария РНР; int lastRead = secondo; // Секунды последнего снятия показаний
int lastSend = minute(); // Минуты последнего снятия показаний
• состояние подключения; String lastSendTime; // Строковая временная метка
• две кнопки для снятия и от­ // последнего обновления сервера
правки показаний вручную;
// URL сценария РНР
• цветовая схема для прило­ // Замените выделенный жирным адрес на действительный
жения. // адрес сценария
String uri = "http://www.yourserver.сот/logger.php?data=»;
String currentReadings = «»; // Группа показаний,
// с временной меткой
String thisReading; // Самое последнее показание

String connectionState = // Подключение Bluetooth


// есть или нет?

Button readButton; // Кнопка для снятия показаний


// вручную
Button sendButton; // Кнопка для отправления
/ / показаний вручную
boolean updateNow = false; // Флаг для принудительного снятия
boolean sendNow = false; // Флаг для принудительной отправки

// Цветовая схема с http://kuler.adobe.com


// Глубокий оптимизм, автор nicanore
color bgColor = #2B0D15;
color textColor = #FFEB97;
color buttonColor = #565F63;
color buttonHighlightColor = #ACBD9B;
Сети мобильной телефонной связи и физический мир 479

Ш^Метод setup о устанавливает void setup() {


// Задаем цветовую схему:
цвет фона и шрифтов и инициа­
background(bgColor);
лизирует параметры текста. Затем fill (textColor);
он создает экземпляр библиоте­
ки Btseriai и пытается подклю­ // Задаем шрифты
читься к модулю Bluetooth Mate String[] fontList = PFont.list();
PFont androidFont = createFont(fontList[0], 24, true);
посредством метода connect().
textFont(androidFont, 24);
Наконец, выполняется инициа-
лизация на экране двух кнопок. // Создаем экземпляр библиотеки:
bt = new BtSerial( this );
Обратите внимание, что разме­
щение кнопок и текста указыва­ // Пытаемся подключиться к Bluetooth:
ется относительно переменных connectionState = connect();
зсгееиг^б^ И зсгеепНе1д!^. Это
readButton = new Button(screenWidth/2 - 100, 2*screenHeight/3,
означает, что они будут разме­ 200, 60, buttonColor, buttonHighlightColor, «Get Reading»);
щаться так же относительно друг sendButton = new Button(screenWidth/2 - 100, 2*screenHeight/3
друга на экране при повороте + 80, 200, 60, buttonColor, buttonHighlightColor,
"Send Reading");
устройства:

Mm Метод draw () начинает свое void draw() {


// Выводим данные на экран
исполнение с вывода текстовых background(bgColor);
строк и отображения кнопок. fill (textColor) ;
Затем выполняется проверка на textAlign (LEFT);
text(connectionState, 10, screenHeight/4);
истечение интервала проверки
text(getTime(), 10, screenHeight/4 + 60);
датчика и установки перемен­ text(«latest reading (volts): « + thisReading, 10,
ной updateNow (этой переменной screenHeight/4 + 90) ;
присваивается значение true, text(«Server updated at:\n» + lastSendTime, 10,
screenHeight/4 + 120);
когда нажимается кнопка Read
Now). При наличии одного из // Р и суем к н о п к и :
этих условий скетч снимает по­ r e a d B u t t o n .d i s p l a y ();
s e n d B u t t o n .d i s p l a y ();
казания датчика через Bluetooth
С П О М О Щ Ь Ю метода getData(), if (sendNow) {
а затем добавляет новые показа­ textAlign(LEFT);
ния к строке показаний, взятых text(«sending to server, please wait...», 10,
screenHeight/4 - 60);
после последнего обновления
сервера.
// Е с л и ис т е к п ериод меж д у обновлениями и ли установлена
Далее скетч проверяет, не была // переме нная updateNow, о бновляем автоматически:
ли установлена переменная if (abs ( s e c o n d o - lastRead) >= readlnterval || updateNow) {
sendInterval ИЛИ sendNow. ЕСЛИ this R e ading = g e t D a t a O ;

какая-либо из этих переменных


// Е с ли получ е н ы действительные показания,
была установлена, текущая стро­ // д о б а в л я е м време н н у ю метку:
ка показаний отправляется на if (thisReading != null) {
сервер методом sendData ()! currentReadings += g e t T i m e () +»,» + thisReading;
// Смот р и м время последнего обновления:
lastRead = secondo,*
// Обновление уже выполнено, не требуется делать
// это снова, пока не сказано:
u p d a teNow = false;
}
►►
480 Глава 10

т // Если истек период между отправками или установлена


// переменная sendNow, обновляем автоматически:
if (abs(minute () - lastSend) >= sendlnterval || sendNow ) {
sendData(currentReadings);
// Получаем время двумя способами:
lastSendTime = getTimeO; // Строковое значение для
// вывода на экран:
lastSend = minute(); // Целочисленное значение
// для дальнейших сравнений
}

О Наконец, метод draw о счи­ // Если состояние кнопки Read сменилось с не нажатой
тывает состояние кнопок, после / / н а нажатую, устанавливаем переменную updateNow, чтобы
чего устанавливает переменные // вынудить обновление в следующем проходе по циклу.
их состояния. В этом скетче ис­ // Делаем то же самое и для кнопки Send и переменной
пользуется модифицированная // sendNow, сразу ниже:
версия класса Button из скетча if (readButton.isPressedo && !readButton.getLastState ()) {
считывателя RFID (см. главу 9). updateNow = true;
Поскольку курсор на сенсорном }
// Сохраняем состояние кнопки для следующей проверки:
экране — а именно ваш палец —
может быть с экрана снят, не су­ readButton.setLastState(readButton.isPressed());
ществует эквивалентов событий I
mousePressed И mouseReleased, if (sendButton.isPressed() && !sendButton.getLastState()) {
поэтому нам нужно создать свое sendNow = true;
событие нажатия. Для этого мы
используем В классе Button ме­
}
// Сохраняем состояние кнопки для следующей проверки:
тод isPressedo, переменную sendButton.setLastState(sendButton.isPressed());
pressedLastTime, а также два ме­
тода для получения и установки
}
значения этой переменной. С по­
мощью этих элементов мы можем
проверить текущее состояние I
кнопки: isPressedo, Сохранить
его: setLastStateO И ПОЛуЧИТЬ !
значение состояния при послед- ;
ней проверке: getLastState ():

Ш Когда исполнение скетча при­ void pause () {


// Если есть показания, отправляем их:
останавливается, вызывается ме­
тод pause (). Этот метод посылает if (!currentReadings.equals(«»)) {
sendData(currentReadings);
все текущие снятые показания на
сервер, затем отключает последо­ }
// Останавливаем подключение Bluetooth, чтобы
вательное соединение Bluetooth,
// можно было запустить его по возобновлению:
чтобы можно было открыть его
if (bt != null && bt.isConnectedO ) {
по возобновлению исполнения b t .disconnect();
скетча. Метода resume о не су­ }
ществует, так как метод setup о
вызывается по умолчанию при
}
каждом возобновлении деятель­
ности Android (вспомним, что
скетч Processing для Android яв­
ляется деят ельност ью): ►►
Сети мобильной телефонной связи и физический мир 481

String connect() {
Ш Метод connect () пытается
String result = "Bluetooth еще не инициализирован...»;
установить подключение Blue­ if (bt !=null) {
tooth. Сначала метод проверяет // Если подключены, получаем данные:
наличие действительного экзем­ if (!bt.isConnected() ) {
// Получаем список сопряженных устройств:
пляра библиотеки Btseriai, а String[] pairedDevices = bt.listO;
также что он еще не подключен if (pairedDevices.length > 0) {
к удаленному устройству (в дан­ println(pairedDevices);
ном случае Bluetooth Mate). Затем // Устанавливаем подключение с первым
// устройством в списке:
он получает список всех сопря­ b t .connect( pairedDevices[0] );
женных с телефоном устройств result = "Подключились к \n" + b t .getName();
и пытается подключиться к пер­
вому устройству в списке: else {
result = "He удалось получить никаких
сопряженных устройств";

return result;

U J Прежде чем исполнять скетч, String getData() {


откройте настройки Bluetooth на String result = "";
вашем телефоне и выполните со­ if (bt != null) {
пряжение с модулем Bluetooth // Если подключены, получаем данные:
Mate. Если этого не сделать,
if ( b t .isConnected() ) {
приложение не сможет «уви­
деть» модуль Bluetooth Mate. // Отправляем байт, чтобы получить новые данные:
Если модуль Bluetooth Mate не bt.write("А");
первый в списке устройств, из­ // Ожидаем входящие данные:
мените выделенный жирным while (bt.available () == 0);
шрифтом в квадратных скобках // Если есть входящие байты, считываем и х :
номер устройства в следующем
while (bt.available () > 0 ) {
вызове на номер вашего модуля
Bluetooth Mate в списке: // Добавляем входящие байты к строке результатов:

b t .connect( pairedDevices[0] result += char(bt.read());

Метод getData () проверяет нали-


чие действительного подключе­ // Берем последний символ строки результатов:
ния Bluetooth. Затем он посылает char lastChar = result.charAt(result.length() - 1);
байт, предписывая Arduino от­ // Должен быть символ новой строки, иначе
править данные в ответ. Все по­ // данные недействительны:
лученные в ответе байты метод if (lastChar != '\n') {
добавляет к строке результата. result = null;
Поскольку подключение Blue­ }
tooth может оборваться, метод } // Если не подключены, пытаемся подключиться:
проверяет, что полученные дан­
else {
ные заканчиваются символом
новой строки, который обознача­ connectionState = connect();
ет последний байт, посылаемый
модулем Arduino. Если метод
получил действительную стро­ return result;
ку показаний, он возвращает эту
строку, как результат своего ис­
полнения. В противном случае,
метод возвращает n u l l .
Если отсутствует действительное
подключение, метод getData ()
пытается его установить: ►►
482 Глава Ю

Ш Метод sendData () отправляет v o id se n d D a ta (S trin g th isD a ta ) {


текущие снятые показания дат­ / / Если есть данные для отправки:
i f (th isD a ta != n u ll) {
чика на сервер, используя метод / / Кодируем данные в URL и составляем URL:
Processing lo a d s tr in g s о . Метод S tr in g se n d S tr in g = fo rm atD ata(u rl + th is D a t a ) ;
lo a d S tr in g s () ВЫПОЛНЯеТ обыч- / / Отправляем данные чер ез HTTP GET:
S t r i n g [] r e s u l t = lo a d s t r in g s ( s e n d S t r in g ) ;
ный запрос HTTP get и возвра­
/ / Очищаем переменную cu rren tR ead in gs
щает содержимое, посланное ему / / для последующих данных:
сервером: S t r i n g c u r r e n tR e a d in g s =

ш Строка URL должна быть S tr in g fo rm a tD a ta (S trin g t h is S t r in g ) {


сформирована согласно требо­ / / Преобразовываем пробелы, символы перевода строки
ваниям: никаких пробелов, сим­ / / и возврата каретки в их безопасные с точки зрения HTML
/ / эквиваленты:
волов перевода строки или воз­ S tr in g r e s u l t = t h i s S t r i n g .r e p l a c e A l l (« «, «%20»);
врата каретки и т. п. — поэтому r e s u l t = r e s u l t . r e p l a c e A l l (« \п » , «%0А»);
метод sendData () вызывает метод r e s u l t = r e s u l t . r e p la c e A ll (« \г » , <<%0D>>) ;
form atData о, который преобра­ retu rn r e s u l t ;
зовывает пробелы, символы пе­
ревода строки и возврата каретки
в их безопасные с точки зрения
HTML эквиваленты:

П $ Последний метод основно­ / / Получаем дату и время в виде строки


го скетча: д е № т е ( ) . Он просто S t r i n g g e tT im e O {
D ate c u r r e n tD a te = new D a t e ( ) ;
возвращает отформатированную
r e tu r n c u r r e n t D a t e . t o S t r i n g ( ) ;
строку даты и времени:
}
m Класс B utton для этого скетча / / Класс B utton определяет поведение и вид кнопок на экране,
отличается от такого же класса / / Они ведут себя несколько по-иному на сенсорном экране,
/ / чем на экране с мышью, вследствие отсутствия обработчика
для скетча записи RFID из гла­ / / щелчка мыши m o u s e d ic k .
вы 9 тем, что у него есть пере­ c l a s s B utton {
менная и методы для отслежи­ i n t x, у, w, h; // Расположение кнопок
вания своего состояния нажатия c o lo r b a s e c o lo r , h ig h lig h t c o lo r ; // Цвет кнопок и цвет
// выделения
при последней проверке этого c o lo r c u r r e n tc o lo r ; // Текущий цвет кнопки
состояния. А конструктор почти S tr in g name; // Надпись на кнопке
такой же, за исключением новой b o o lea n p ressedL astT im e; // Была ли кнопка нажата
// при последней проверке
переменной pressedLastT im e:
/ / Конструктор: задает все начальные значения для
/ / всех экземпляров класса Button
B u tto n (in t th isX , i n t th isY , i n t thisW , in t th isH ,
c o lo r th is C o lo r , c o lo r t h is H ig h lig h t , S tr in g thisName) {
x = th isX ;
у = th isY ;
h = th isH ;
w = thisW ;
b a s e c o lo r = th is C o lo r ;
h ig h lig h t c o lo r = th is H ig h lig h t;
c u r r e n tc o lo r = b a se c o lo r ;
name = thisName;
pressedL astT im e = f a l s e ;
►►
Сети мобильной телефонной связи и физический мир 483

Ш Метод d is p la y о совмеща­ / / Рисуем кнопку и е е текст:


ет функциональность методов v o id d i s p l a y () {
update () И d is p la y () ИЗ проекта / / Если кнопка нажата, меняем ее цвет:
записи RFID-карточек главы 9, i f (isP r e sse d O ) {
поэтому он и изменяет цвет, и c u r r e n tc o lo r = h ig h lig h t c o lo r ;

рисует саму кнопку: }


e ls e {
c u r r e n tc o lo r = b a se c o lo r ;

f i l l ( c u r r e n t c o lo r );
r e c t ( x , y, w, h );

/ / Располагаем имя кнопки в ее центре:


f i l l (t e x tC o lo r );
t e x t A lig n (CENTER) ;
t e x t (паше, x+w /2, y + h /2 );

т Метод isPressed о проверяет / / Проверяем наличие нажатия экрана и точку нажатия на


не только, находятся ли коорди­ / / нахождение в пределах прямоугольника кнопки:
наты тоиэеХ И тоизеУ (ТО есть точ­ b o o le a n is P r e s s e d O {
ка нажатия экрана пользовате­ i f (mouseX >= x && mouseX <= x+w &&

лем) в пределах границ кнопки, mouseY >= у && mouseY <= y+h && m o u se P r e sse d ) {
r e tu r n t r u e ;
но также использует переменную
СОСТОЯНИЯ m ousePressed ДЛЯ ука­
}
e ls e {
зания, нажимает ли пользователь
r e tu r n f a l s e ;
на экран вообще:
}
\

Cl Наконец, методы s e tL a s t / / Этот метод применяется для установки состояния кнопки,


Предо-
S ta te () И g e tL a s tS ta te () / / каким оно было при последней проверке, в противоположность
/ / е е текущему состоянию:
ставляют нам доступ к данным
v o id s e t L a s t S t a t e ( b o o l e a n s t a t e ) {
о последнем состоянии кнопки
p r e ss e d L a s tT im e = s t a t e ;
извне класса:
}

b o o le a n g e t L a s t S t a t e () {
r e tu r n p r e ss e d L a s tT im e ;

Вот и весь скетч. Пример его исполнения пока­


зан на рис. 10.24, а весь комплект проекта в сборе
и в работе — на рис. 10.25.
484 Глава Ю

# # При исполнении этого скетча на устройстве А как насчет USB?


В В Android он будет пытаться подключиться к
сопряженному с ним модулю Bluetooth Mate. Когда Обычно устройства Android являются периферий­
ему удастся установить подключение, скетч каж­ ными устройствами USB, а не USB-хостами. По­
дые 10 секунд станет проверять наличие новых этому к ним нельзя подсоединить периферийные
показаний от датчика, которые он будет пытаться устройства наподобие мыши, клавиатуры или мо­
отправить на сервер каждые две минуты. Но скетч дуля Arduino, чтобы они работали так же, как и
не проверяет получение действительного ответа от при подключении их к компьютеру. Но компания
сервера — этот момент оставлен для вас в качестве Google решила, что разработчики Android, воз­
домашнего задания. можно, захотят создавать и периферийные устрой­
ства USB. Поэтому недавно в компании объявили
Получив в свое распоряжение представленный о выпуске набора для разработки вспомогатель­
здесь опыт работы с Processing для Android, вы смо­ ных устройств Google14 (Google ADK), который,
жете сделать очень многое. У вас теперь есть воз­ соответственно названию, и представляет собой
можность по беспроводному каналу подключаться платформу с открытым аппаратным обеспече­
к Интернету и к локальным устройствам, и, конеч­ нием, позволяющую создавать вспомогательные
но же, к встроенным датчикам своего телефона, USB-устройства для Android. Набор Google ADK
чтобы использовать его в качестве центрального основан на Arduino Mega 2650 со встроенным шил-
коммутатора для соединения самых разнообразных
объектов. Google ADK, Google Accessory Development Kit.

Рис. 10.24. Пример результатов работы скетча Рис. 10.25. Ветровка регистратора личных
регистратора биометрических данных биометрических данных в действии
Сети мобильной телефонной связи и физический мир 485

дом USB-хост (первоначально разработан Олегом Mega ADK с библиотекой Processing для Android.
Мазуровым, www.circuitsathome.com). Компания И другие компании также разрабатывают свои вер­
Circuits@Home предоставляет несколько хороших сии наборов ADK для Android, так что, к тому вре­
вариантов шилда USB-хост, как для стандартного мени, когда вы будете читать эти строки, у вас будет
шилда Arduino, так и для Mini Pro. Магазин Arduino большой выбор.
Store предлагает разработчикам набор Arduino

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

ж Проект SIMbaLink. Разработчики Мередит Хэссон (Meredith Hasson), Ариэль Неварес (Ariel Nevarez)
и Нахана Шеллинг (Nahana Schelling)
Команда SIMbaLink разработала устройство для удаленного мониторинга состояния домашней системы
энергоснабжения на солнечной панели и передачи сведений о состоянии на клиентский веб-сайт SIMbaLink
через модем GPRS. Работая совместно с компанией солнечной энергетики из Эфиопии, команда SIMbaLink
осуществляет удаленный мониторинг домашних солнечных систем энергоснабжения города Авасса
в Эфиопии. Системы состоят из солнечной панели мощностью в 10 ватт, аккумулятора и четырех одно­
ваттных светодиодных светильников. Эта простая система позволяет осветить сельский дом там, где это
нельзя сделать иным способом. Фотографии предоставила Мередит Хэссон.
fe'c- г I
■•ЗЩ* 1

шШШ
й№ j

lllM lllll
iilllli:

ms
^Ш И Ш ж
1||
_ н Н Ш Ш

■ н

^
^ш ш ЯИиЙЙй
Щ

нн^нни
, :, . 'Ш « 1

■■ Ч Ш Н Н Н Н
■ и
ии—1 ills
шшшшшвшЯШШИШШЯШШШШШЯЯШл
— I
_ _
Глава 11 «с

СНОВА О ПРОТОКОЛАХ
Одно из самых ценных качеств, которое может выработать у себя
разработчик программного обеспечения, — это способность
создавать элегантные переходы между кажущимися несовместимыми
системами. Понимание сути разных протоколов является основной
составляющей этого качества. Осуществляя проекты, рассмотренные
в книге, мы познакомились с несколькими протоколами связи,
однако к тому времени, когда вы читаете эти строки, протоколы,
которые мы использовали, возможно, претерпели изменения или
устарели. Но если вы теперь понимаете, как подходить к изучению
новых протоколов, это не составит для вас никаких проблем.
Последняя глава этой книги посвящена, образно говоря, осмотру
поля боя с господствующей высоты — общему обзору протоколов,
с которыми нам пришлось здесь иметь дело, выявлению их общих
черт и различий, рассмотрению того, как они взаимодействуют
друг с другом, и какой подход использовать для изучения новых
протоколов в будущем.
488 Глава 11

Компоненты для проектов этой главы


Код поставщика Проект 32. Развлекаемся с MIDI
Россия ►
►Модуль Arduino, 1 шт. Желательно исполь­
зовать Arduino Uno или его разновидности, но
• АМР — «Амперка» (http://amperka.ru)
проект должен работать и на других версиях
• CHD — «Чип и Дип» (http://chipdip.ru) Arduino и совместимых платах.
• LC — «Линуксцентр» (www.linuxcenter.ru)
AMP: А000066, http://amperka.ru/product/ar-
duino-uno
США и Европа
LC: 1с8192, http://www.linuxcenter.ru/shop/ops_
• А — Arduino Store (http://store.arduino.cc/ww) hard/arduino/arduinouno/
• AF — Adafruit (www.adafruit.com) D: 1050-1019-ND,J: 2121105, SF: DEV-09950, А:
• D — Digi-Key (www.digikey.com) A000046, AF: 50, F: 1848687, RS: 715-4081, SS:
ARD132D2P, MS: MKSP4
• F — Famell (www.farnell.com)
• J — Jameco (http://jameco.com) ►
►Модуль Music Instrument shield, 1 шт. Шилд
для музыкальных инструментов.
• MS — Maker SHED (www.makershed.com)
• RS — RS (www.rs-online.com) АМР (альтернатива): SLD01104P, http://amper-
ka.ru/product/arduino-music-shield
• SF — SparkFun (www.sparkfun.com)
SF: DEV-10587
• SS — Seeed Studio (www.seeedstudio.com)

►Инфракрасный дальномер Sharp GP2Y0A21,
1 шт. Этот датчик расстояний из семейства ин­
фракрасных дальномеров компании Sharp ра­
ботает от источника напряжения 5 В и выдает
сигнал в диапазоне 0—5 В, выявляя объекты на
расстоянии от 10 до 80 см. Датчик сравнитель­
но недорогой, очень прост в использовании и
предлагается многими магазинами розничной
торговли.
АМР: АМР-Х129, http://amperka.ru/product/
infrared-range-meter-80
D: 425-2063-ND, SF: SEN-00242, RS: 666-6570,
P: 136

►Конденсаторы 100 мкФ.
CHD: 16360, J: 158394, D: P10269-ND, F:
1144642, RS: 715-1657

Проект 33. Развлекаемся c REST


Рис. 11.1. Новый компонент для проекта этой главы:
шилд для музыкальных инструментов компании ►
►Учетная запись на веб-сервере.
БрагкРип
Снова о протоколах 489

йй Как установить соединение?


Изучать новые протоколы намного легче, когда можно сопоставлять их с теми, которые вы уже
знаете. К счастью, нам уже знакомы несколько протоколов. И мы можем сравнивать их на лю­
бом из уровней, рассмотренных в главе 2. Наибольшее влияние на разрабатываемый проект
будут оказывать три уровня: физический, уровень данных и прикладной. Надо также учесть
организацию сетей, в которых они обеспечивают связь: прямые соединения «один к одному»,
сети с использованием центрального хаба или контроллера, многоуровневые сети, кольцевые
сети и шины. Зная структуру системы, можно предполагать грамматику и синтаксис исполь­
зуемых в ней протоколов. Каждый из этих факторов поможет вам выполнить преобразование
одного устройства или системы в другие, а каждый аспект связи позволит вам узнать что-либо
о других ее аспектах.
Например, если мы имеем дело с протоколом, Доступные возможности
в котором используются адреса, мы можем быть
уверенными, что он предназначен для связи между
на физическом уровне
более чем двумя объектами. А если адрес разби­ Приступая к работе с новым электронным устрой­
вается на несколько частей, как это делается с 1Р- ством, следует ознакомиться с используемыми им про­
адресами, можно предположить, что этот протокол токолами связи. Сейчас мы уже знаем несколько раз­
используется во многоуровневых сетях. личных протоколов для модуля Arduino. На рис. 11.2
приводится графический обзор этих протоколов.
Рис. 11.2. Коммуникационные возможности Arduino.
В технической документации асинхронный последо­
вательный порт называется универсальным асинхрон­
ным приемопередатчиком (УАПП), так что запомните
этот термин и его английский эквивалент — UART
(Universal Asynchronous Receiver-Transmitter) S ^ ж е т бьи^лю баТ ’
свободная линия
Интерфейс SPI >Х
Тактирование >Х Линия Тх микроконтроллера
о« >х УАПП является линией Rx контроллера
Контроллер 11i о s' к& USB/УАПП, и наоборот
USB/УАПП | | Передача------|Ч---------- Прием

Программный последовательный
интерфейс (может быть на любых
двух свободных линиях)
usb

------Микроконтроллер

Данные Тактирование

Q
Интерфейс I2C
490 Глава 11

Этот рисунок предоставляет нам информацию • вывод ШИМ, выдающий осциллирующий меж­
о физическом уровне (какие линии служат для каких ду низким и высоким уровнями импульс, шири­
целей связи) и об уровне данных (какие протоколы на которого меняется в зависимости от расстоя­
данных устройство может использовать). К этому ния до обнаруженного объекта.
моменту вы уже должны знать, что если определен­
ный набор линий (контактов) предназначен для той Эти и другие возможности модуля описываются в
или иной функции связи, его нельзя использовать спецификации его технических данных, которую
для других функций. можно загрузить с веб-сайта компании произво­
дителя по адресу www.maxbotix.com. Наличие не­
Большинство используемых в этой книге одноце­
скольких протоколов у одноцелевого устройства
левых устройств ориентированы только на один
полезно в тех случаях, когда нужно выполнить его
протокол, но это не всегда так. Например, ультра­
соединение с микроконтроллером, имеющим толь­
звуковой дальномер компании МахВобх,
ко один какой-либо тип ввода. Например, при под­
с которым мы работали в главе 8 (рис. 11.3), предо­
ключении его к микроконтроллеру без аналогового
ставляет три разных интерфейса.
ввода, или к компьютеру с последовательным пор­
Этот модуль имеет следующие возможности связи: том RS-232, или когда компьютер не используется
вовсе, а нужно просто управлять той или иной схе­
• аналоговое выходное напряжение (0—5 В), кото­
мой с помощью сигнала ШИМ или аналогового на­
рое использовалось в нашем проекте;
пряжения.
• асинхронный последовательный порт 118-232
(Тх и 1Ъс), работающий со скоростью 9600 битов Подобным же образом считыватель RFID SonMicro,
в секунду; с которым мы встречались в главе 9, также предо­
ставляет два разных коммуникационных интерфей­
са: последовательный TTL и I2C. И мы использо­
Рис. 11.3. Коммуникационные возможности вали последовательный порт для взаимодействия
ультразвукового дальномера 1ЛЛЕ2-1 с компьютером, а интерфейс I2C — для работы с
микроконтроллером, поскольку это позволяло нам
Выход ШИМ задействовать последовательный порт микрокон­
(147 мкс на дюйм) троллера для программирования и отладки.

Аналоговый выход
(—9,8 мВ на дюйм)

RS-232
(9600 бит/с, 8-Н-1, вывод
"Rxxx\r", где ххх - 0 *

Прием

Передача
Снова о протоколах 491

Начиная проект, примите во внимание то, какие Должны ли устройства иметь возможность при­
порты устройства используются для его настройки, нимать независимые решения, когда посылать
программирования и отладки, и по мере возмож­ информацию? В таком случае любая система, ко­
ности пытайтесь не использовать их для рабочих торая объединяет устройства по принципу взаимо­
целей. С другой стороны, если интерфейс, обычно отношений «ведущий-ведомый», как это делает лю­
служащий для программирования, предоставляет бой из синхронных последовательных протоколов,
наиболее быстрый и надежный канал связи, имеет будет неприемлемой.
смысл использовать такой интерфейс как для про­
Требуется ли, чтобы несколько устройств взаи­
граммирования устройства, так и для его целевой
модействовали по одним и тем же линиям? В та­
функции.
ком случае рассмотрите возможность применения
шинных протоколов. Синхронные последователь­
ные протоколы и некоторые асинхронные, такие
Выбор последовательного как Ш В и 118-485, работают на шинах. Для всех
протокола этих протоколов требуется та или иная форма адре­
сации.
При планировании разработки выбор последова­
тельного протокола может оказаться сложной за­ Является ли фактором расстояние или ско­
дачей. Какой протокол лучше: синхронный или рость? Многие протоколы для пересылки данных
асинхронный? Последовательный TTL или после­ на большие расстояния используют дифференци­
довательный RS-232? Двухпроводной интерфейс альную передачу, задействуя для этого две линии:
I2C или SPI? А, может быть, USB? В большинстве данные + и данные -. При этом одни и те же данные
случаев этот выбор вы сделаете с учетом того, что посылаются по обеим линиям, и сложение их всег­
один из необходимых компонентов проекта может да должно давать ноль. Таким способом снижается
работать только с определенным протоколом. Но уровень электрических помех и соответствующих
когда у вас есть выбор, следует рассмотреть ряд ошибок передачи. Дифференциальная передача ис­
определяющих обстоятельств. пользуется интерфейсами Ш В, 118-485 и ЕШегпе!.
Она также позволяет осуществить более высокую
Какие протоколы используются всеми другими скорость передачи данных.
устройствами вашей системы? Если все устрой­
ства используют какой-либо один протокол, то это В табл. 11.1 приводится список нескольких после­
очевидный выбор. довательных протоколов, упоминаемых в этой кни­
ге, а также их краткие характеристики.

Таблица 11.1. Последовательные протоколы и их краткие характеристики

Синхронные последовательные Асинхронные последователь­ Асинхронные последователь­


протоколы ные протоколы ные шинные протоколы
• Взаимоотношение между уст­ • Нет общего сигнала тактиро­ • Нет общего сигнала тактиро­
ройствами типа «ведущий-ве­ вания, но скорость передачи вания, но скорость передачи
домый». согласована. согласована.
• Несколько устройств разделя­ • Обычно применяются к взаи­ • Часто используются для боль­
ют общие линии данных. модействиям типа «один к ших расстояний или сетей.
• Требуется линия тактирования одному», а не для сетей • Обычно используется диффе­
от ведущего устройства к ве­ ренциальная передача.
домым. • От 3 до 4 линий: данные +,
• Расстояние: до 1 метра. данные - , «земля», питание
• Разные диапазоны напряже­ (необязательно)
ний, обычно 5 или 3,3 В
492 Глава 11

Таблица 11.1 (окончание)

Синхронные последовательные Асинхронные последователь­ Асинхронные последователь­


протоколы ные протоколы ные шинные протоколы
I2C (TWI) Последовательные ТТЬ ивв
• 3 линии: данные, тактирова­ • Разные диапазоны напряжений, • Диапазон напряжений:
ние, «земля». обычно 5 или 3,3 В. 3 линии: от 0 до 5 В.
• Каждому ведомому устройству передача, прием, «земля». • Расстояние: до 10 метров
присваивается однозначный • Логика: + В = логическая еди­
адрес, который посылается в ница, 0 В = логический ноль.
начале передачи • Расстояние: обычно до 1 метра
SPI П8-232 К8-485 (ВМХ-512)
• 4 + п линий: вход ведущего, • Диапазон напряжений: • Диапазон напряжений:
выход ведомого (M IS01), вы­ от±3 до ±15 В. о т -7 до +12 В.
ход ведущего, вход ведомого • Логика: - В = логическая еди­ • Расстояние: до 1200 метров
(MOSI2), тактирование, «земля», ница, + В = логический ноль.
1 CS (выбор микросхемы для
• 0 В не имеет логического зна­
каждого ведомого устройства).
чения.
• Адресация устройств осущест­
• Расстояние: до 300 метров
вляется посредством линий
выбора микросхемы

1 MISO, Master In Slave Out.


2 MOSI, Master Out Slave In.

Планируйте физическую систему


и потоки информации на раннем
этапе
Определившись с физическим коммуникационным Для планирования подобных проектов можно (и не­
протоколом, запланируйте взаимодействие объек­ обходимо) создать блок-схемы протекания инфор­
тов, прежде чем начинать что-либо программиро­ мации между объектами (см. рис. 10.3 и 10.4), из
вать или конфигурировать. Оказав должное вни­ которых было бы ясно видно, что каждому устрой­
мание этому аспекту на раннем этапе, вы сможете ству требуется от других. Уточните, какие линии
сэкономить много времени в будущем. микроконтроллера доступны для различных тре­
Рассмотрим, например, веб-сервер с чтением SD- бующихся вам функций. Разберитесь, откуда лучше
карточки из главы 10. В нем задействовано несколь­ всего предоставлять изображения и веб-страницы,
ко устройств: и какие для этого требуются ссылки и разрешения.
Проследите направления потоков данных и устано­
• микроконтроллер; вите, кому нужно знать чьи адреса. Определитесь
• контроллер Ethernet; с физическим местом для размещения сервера
и камеры и с их укрытием. Все это позволит вам
• карточка SD;
уменьшить объем работы по созданию проекта и
• датчик температуры;
сконцентрироваться на создании только того, что
• управляющее реле; действительно необходимо, в терминах кода, схем
• камера с возможностью 1Р-связи. и материалов.
Снова о протоколах 493

Текст или двоичный код?


Одним из самых сбивающих с толку аспектов передачи данных является разница между дво­
ичным и текстовым протоколами. Как мы узнали из главы 2, существует общая схема для пре­
образования передаваемых данных в буквенно-цифровые символы. Код АБСИ и его современ­
ный родственник игнсос1е позволяют преобразовывать любой поток текстовой информации
в двоичную информацию, читаемую компьютерами, и наоборот. Понимание разницы между
текстовыми и нетекстовыми протоколами и знание того, какой из них выбрать, являются не­
обходимыми предварительными условиями для понимания взаимодействия между электрон­
ными устройствами.

Разве не все данные двоичные?


Ну, с одной стороны, да. В конце концов, компью­ преобразовывать их в двоичные биты самостоятель­
теры работают только на двоичной логике. Поэтому но. Например, возьмем фразу «1 -2-3, go!». В табл. 11.2
даже текстовые протоколы в своей основе являют­ показана разбивка этой фразы на составляющие ее
ся двоичными. Но нам легче составлять сообще­ символы с соответствующими представлениями
ния обычным текстом, предоставляя компьютерам А8СП и двоичного кода для каждого символа.

Таблица 11.2. Разбивка фразы «1-2-3, до!» на составляющие ее символы

Символ 1 - 2 - 3 9 g О !

Код ASCII 49 45 50 45 51 44 32 103 111 33


Двоичный
00110001 00101101 00110010 00101101 00110011 00101100 01000000 01100111 01101111 01000001
код

Может показаться, что в двоичном коде слишком Известно, что каждая составляющая цвета переда­
много единиц и нулей, но это только до тех пор, пока ется одним байтом, поэтому для одного пиксела тре­
мы не осознаем, что компьютер может считывать буется самое большее три байта. Но при передаче их
миллионы или даже миллиарды битов в секунду. в текстовой форме, когда для каждого символа тре­
А как насчет скорости передачи двоичных данных буется один байт, понадобится втрое больше байтов,
другому компьютеру? Давайте считать. В этой фразе плюс разделяющая символы запятая. В частности,
80 битов. Допустим, что мы передаем их по после­ для приведенной строки потребовалось бы 26 бай­
довательному ТТЪ-каналу со скоростью 9600 битов тов. Но если передавать ту же самую информацию
в секунду. Если к каждому байту добавить старто­ в исходном формате, потребовалось бы всего лишь
вый и столовый биты (как это делается последова­ девять байтов. Так что, когда передаются значе­
тельными протоколами ТТЬ и 118-232), мы получим ния миллионов пикселов, разница очень ощутима.
суммарно 96 битов, то есть, с учетом заявленной В случаях подобных описанному, когда передают­
скорости это сообщение можно передать за V ся чисто числовые данные (для описания пикселов
долю секунды. В общем-то, довольно быстро. текст не требуется — мы и так знаем, что первый
байт всегда определяет красный цвет, второй — зе­
Ну, а как насчет тех случаев, когда требуется пере­
леный, а третий — синий), имеет смысл передавать
дать нетекстовое сообщение? Пусть мы передаем
их без преобразования в текстовый формат. Лишь
текстом следующую строку значений пикселов
когда нам нужно передать именно текст (напри­
1ШВ, каждое из которых может быть в диапазоне
мер, электронную почту или гипертекст), следует
от 0 до 255:
закодировать его в А8СП или Шюоёе. Впрочем,
102,198,255,127,127,212,255,155,127, когда передается небольшой объем данных — как
494 Глава 11

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


торые нам нужно было передавать в проектах из Подобно тому, как шестнадцатеричные значения на­
этой книги, — кодирование передаваемых данных чинаются с символов Ох, двоичные числа в Arduino,
в формате ASCII или Unicode может быть полез­ а также в языке С начинаются с символов оь — на­
но для отладки, поскольку большинство программ пример: 0Ы0101010.
терминалов для последовательной или сетевой свя­
Теперь, можете ли вы сказать, какая цифра в сле­
зи интерпретируют все получаемые ими байты как
дующем числе имеет наибольшее значение?
текст, в чем мы имели возможность убедиться.
$2,508
Соответственно:
Ответить легко — цифра 2, так как она представ­
• если нужно передать большой объем числовых
ляет самое большое количество — две тысячи, или
данных, передавайте их в сыром (неотформати-
две группы по 103. То есть цифра 2 находится здесь
рованном) двоичном формате;
в самом старшем разряде. Число в этом примере
• передавайте текст в формате ASCII или показано в десятеричном представлении, но тот же
Unicode; самый принцип применяется и к числам в двоич­
• в случае небольшого объема данных любого ном представлении. Какой бит самый старший в
типа, передавайте их в любом удобном для вам следующем двоичном числе?
формате. 0Ы0010110

Самым старшим битом здесь является самая левая


Интерпретирование двоичного единица, так как она представляет одну группу зна­
протокола чений по 128, или 27. Обычно, когда нам приходит­
ся иметь дело с битами, нам не столько важны их
Поскольку большинство протоколов, с которыми десятичные значения, сколько их позиция в байте.
мы имели дело в этой книге, были текстовыми, нам Например, в следующем проекте мы будем созда­
не требовалось посвящать много времени интер­ вать музыку с помощью интерфейса MIDI3. В дво­
претированию битов, составляющих байты. Но для ичном протоколе MIDI все байты, чей самый стар­
двоичных протоколов часто требуется знать значе­ ший бит имеет значение 1, являются командами
ния каждого бита, входящего в состав байта, поэто­ (глаголами), а со значением 0 — данными (суще­
му весьма полезно хоть немного знать об архитек­ ствительными, прилагательными или наречиями).
туре байта и представлять, как манипулировать его Таким образом, интерпретатор MIDI может иссле­
содержимым. Поэтому давайте поговорим немного довать самый старший бит (который и прибывает
о битах. самым первым при последовательной передаче)
Двоичные протоколы часто применяются для обе­ и сразу же понять, является ли пришедший байт
спечения взаимодействия между микросхемами командой или данными.
в сложных устройствах. И особенно часто при этом
используются синхронные последовательные про­
токолы. Большинство устройств SPI и I2C име­
Чтение и запись битов
ют небольшие наборы команд. Их однобайтные Модуль Arduino предоставляет команды для чтения
коды операций часто объединяются с параметрами и записи битов в байте:
команды в одном байте. Мы видели пример этого
// Для чтения значения бита:
в главе 9, когда выполняли код операции для чте­
myBit = bitRead(someByte, bitNumber);
ния микропрограммного обеспечения считывателя
RFID SM 130.
// Для записи значения бита:
Команды этих протоколов обычно записываются bitWrite(someByte, bitNumber, bitValue);
в шестнадцатеричном или двоичном представле­
нии или и в том, и в другом. Мы уже видели в этой 3 MIDI, Musical Instrument Digital Interface — цифровой
интерфейс музыкальных инструментов.
Снова о протоколах 495

Присвоение биту значения 1 в программировании XOR (л): Если биты имеют разные значения, ре­
называется установкой4 бита, а значения о — его зультат будет 1. В противном случае это 0:
очисткой5. Поэтому существуют также такие
1 А1 = о
команды: 0 А о = о
// Присвоить биту значение 1:
1 А 0 = 1
bitSet(someByte, bitNumber);
0 А1 = 1
С помощью логических, или побитовых, операто­
// Присвоить биту значение 0: ров можно изолировать один бит в байте, как в сле­
bitClear(someByte, bitNumber); дующем примере:
// Проверка, имеет ли бит 7 байта someByte
Сдвиг битов значение 1:
Иногда будет легче манипулировать одновременно if (someByte & OblOOOOOOO) {}
несколькими битами. Это можно сделать с по­
мощью операций сдвига влево и вправо, доступных Например, в протоколе MIDI четыре самых левых
в Arduino, языке С и Java. Оператор сдвига влево бита байта представляют команду, а четыре самых
( « ) сдвигает все биты байта на одну позицию вле­ правых — канал MIDI. Таким образом, канал MIDI
во, а сдвига вправо ( » ) — на одну позицию вправо. можно изолировать с помощью оператора AND:
channel = commandByte & ObOOOOllll;
Например:
ObOOOOllll « 2; // результат - ObOOllllOO Или же, можно использовать оператор сдвига, что­
OblOOOOOOO » 7; // результат — ObOOOOOOl бы получить команду, теряя при этом информацию
о канале:
Операции сдвига полезны в тех случаях, когда
нужно обеспечить определенное значение в опреде­ command = commandByte » 4;

ленной позиции байта. Мы вскоре увидим соответ­ Все вместе эти команды манипулирования битами
ствующий пример. дают нам необходимые возможности для работы
с двоичными протоколами.
Побитовое маскирование
Логические операторы И (AND), ИЛИ (OR) и ис­ Польза шестнадцатеричного
ключающее ИЛИ (XOR) позволяют объединять представления
биты несколькими особыми способами.
Поскольку мы можем манипулировать данными
AND (&): Если оба бита одинаковы, результат бу­ двоичных протоколов побитно, вы, наверное, задае­
дет 1. В противном случае это 0: тесь вопросом: зачем нам нужно шестнадцатерич­
1 & 1 = 1 ное представление? Это представление, конечно же,
0 & 0 = 1 полезно для работы с группами по 16. Например,
1 & о = о протокол MIDI определяет блоки инструментов,
0 & 1 = о каждый из которых содержит 128 инструментов,
а количество каналов, на которых может играть
OR (I): Если значение любого из битов 1, результат
каждый инструмент, может быть до 16. Поэтому
также 1. В противном случае это 0:
теми командными байтами, которыми мы мани­
1 I 1 = 1 пулировали ранее, можно также манипулировать
0 |0 = 0 и в шестнадцатеричном формате. Возьмем следу­
1 | 0 = 1 ющий пример. Шестнадцатеричное значение х9п
0 | 1 = 1 представляет команду включения ноты (note on),
4 От англ. — Setting the bit. где п означает номер канала от о до а в шестнад­
5 От англ. — Clearing the bit. цатеричном формате. Так, команда 0х9А означает
496 Глава 11

включение ноты на канале а (и л и на канале ю в де­ сгруппировать подобным образом, поэтому весьма
сятичном формате). А команда 0х8А означает вы­ полезно знать, как манипулировать ими и в двоич­
ключение ноты (note off) на канале а . Теперь, когда ном, и в шестнадцатеричном формате.
мы знаем, что инструменты MIDI организованы
в группы по 16, вполне имеет смысл манипули­ Рассмотренные здесь понятия вскоре будут приме­
ровать ими в шестнадцатеричном формате. Более нены нами в следующем проекте управления син­
того, данные многих двоичных протоколов можно тезатором МГО1.

£ 1 Протокол МЮ1
Протокол МЮ1 обеспечивает взаимодействие в реальном времени между цифровыми музы­
кальными инструментами. Это самый старый из протоколов цифровых синтезаторов.

Большинство музыкальных синтезаторов, секвен­ и прочие устройства ввода. Синтезаторы, сэмплеры


соров, сэмплеров, клавиров и рабочих станций на и ряд других устройств относятся ко второй кате­
рынке поддерживают MIDI. Если вы планируете гории.
создавать музыку с помощью аппаратных средств,
вы обязательно столкнетесь с этим протоколом. Данные в последовательном протоколе MIDI пере­
Протокол MIDI представляет собой всеобъемлю­ даются со скоростью 31 250 бит/с. Все устройства
щую спецификацию, которая охватывает последо­ MIDI оснащены стандартными разъемами DIN5,
вательную связь, аппаратное обеспечение и даже причем сами устройства несут гнездовые разъемы,
организацию блоков звуков в памяти синтезатора. а соединяющие их кабели — штыревыми на обо­
Благодаря своему обширному охвату этот прото­ их концах. Все вводы устройств MIDI должны
кол в течение десятилетий позволяет композиторам быть оптоизолированными, что устраняет пря­
и музыкантам работать с широким диапазоном син­ мую электрическую связь между устройствами.
тезаторов MIDI, сэмплеров и контроллеров. С пол­ Оптоизолятор представляет собой компонент, со­
ным описанием протокола можно ознакомиться на держащий светодиод и фототранзистор. Подача на­
веб-странице ассоциации производителей MIDI по пряжения на вход оптоизолятора включает светоди­
адресу www.midi.org. од, свет от которого активирует фототранзистор, ко­
торый включает выход оптоизолятора. На рис. 11.4
Протокол MIDI — это протокол описания музыки. показано, как создать схему ввода и вывода MIDI,
Сообщения MIDI в действительности сами не игра­ если вы хотите сделать ее сами. Эта схема позво­
ют нот, а предписывают синтезатору, какие ноты лит вам подключать микроконтроллер к любому
играть. В этом смысле, отношение протокола MIDI синтезатору или контроллеру MIDI. Но если вы не
к музыке можно сравнить с отношением языка раз­ горите желанием самостоятельно создавать интер­
метки HTML к веб-страницам. Для воспроизведе­ фейс MIDI для микроконтроллера, то можете вос­
ния музыки протокол MIDI полагается на синтеза­ пользоваться одним из нескольких шилдов MIDI,
тор, так же, как и язык HTML полагается на браузер имеющихся на рынке.
для воспроизведения веб-страниц.
Микроконтроллеры обычно используются в каче­
Устройства MIDI можно с известной степенью стве основы для контроллеров MIDI, а не устройств
приближения сгруппировать в контроллеры, или ввода. На рынке имеется много хороших синтеза­
устройства, генерирующие сообщения MIDI, торов и сэмплеров, для которых требуется только
и устройства воспроизведения, которые получа­ контроллер, чтобы создавать музыку, а сделать не­
ют сообщения и выполняют с ними какие-либо обходимый контроллер не представляет никаких
действия. К первой категории относятся клавиры трудностей, и этот процесс может даже доставить
Снова о протоколах 497

вам удовольствие. Для следующего проекта мы соз­ Наиболее простые из команд MIDI — сообщения
дадим очень простенький контроллер и использу­ для включения и выключения нот — управляют
ем в качестве устройства ввода MIDI шилд Music воспроизведением нот на 16 разных каналах синте­
Instrument компании SparkFun, который представля­ затора. Каждая команда включения или выключения
ет собой обычный синтезатор MIDI на шилде. Тот ноты содержит два байта состояния, указывающих
же самый код можно использовать, если вы хотите на высоту звука в диапазоне от о до 127 (семиби­
подключить микроконтроллер к любому синтезато­ товый диапазон) и скорость (силу воспроизведения
ру MIDI, так как общая спецификация MIDI охва­ ноты) также в семибитовом диапазоне. Высота зву­
тывает не только сообщения, но также и способы ка со значением 0x45 определяется как А над сред­
организации блоков звуков синтезаторами. ним С (А-440) в общей спецификации MIDI. Эта
спецификация также охватывает инструменты, ко­
Сообщения MIDI состоят из трех или более бай­ торые могут находиться на каждом канале. Общую
тов. Первый байт называется командным байтом спецификацию инструментов MIDI можно найти
и всегда имеет значение 128 (0х80) или больше. по адресу www.midi.org/techspecs/gmlsound.php.
Точное его значение зависит от конкретной коман­
ды. Следующие байты называются байтами со­ Дополнительные сведения по MIDI можно также
стояния. Все байты состояния имеют значение 127 получить из книги издательства Amsco «MIDI for
(o x 7f ) и л и меньше. the Profesional» Поля Д. Лермана (Paul D. Lehrman)
и Тима Талли (Tim Tully).

4 с Проект 32
Развлекаемся с МЮ1
В этом проекте мы рассмотрим работу двоичного протокола, выполняя несколько простых
упражнений МЮ1. Благодаря большому выбору на рынке контроллеров и устройств ввода
МГО1, протокол МЮ1 предоставляет весьма широкий диапазон возможностей качественного
воспроизведения звука. Поэтому знать протокол МЮ1 полезно, если вам нравится создавать
проекты для работы со звуком.

Самый лучший способ начать работать с MIDI— это


создать очень простой контроллер, подключить его Требуемые компоненты
к синтезатору и посмотреть, что он может делать. ►
► Модуль Arduino, 1 шт.
Если у вас уже есть синтезатор, вы можете подклю­
чить его к микроконтроллеру с помощью схемы, ►
►Шилд MIDI Music Instrument, 1 шт.
показанной на рис. 11.4, в противном случае можно ►
►Инфракрасный дальномер Sharp, 1 шт.
воспользоваться шилдом Music Instrument, подклю­
чив его, как показано на рис. 11.5. Этот шилд, как ►
►Конденсатор 100 мкФ, 1 шт.
и любой другой, просто вставляется сверху в разъ­ ►
►Наушники или динамики, 1 пара.
емы модуля Arduino. Синтезатор получает сигнал
MIDI с линии 3 Arduino. Для взаимодействия с син­
тезатором применяется библиотека SoftwareSerial.
Наш первый скетч MIDI предназначен для те­ Спецификация позволяет использовать контроллер
стирования доступных инструментов и каналов. на том же самом канале и инструменте с любым
Обратите внимание, что для каждого инструмента синтезатором МГО1 и более или менее определить,
канал 10 является ударным — это также оговари­ какой звук можно получить.
вается в общей спецификации инструментов MIDI.
498 Глава 11

1-----------------------— 1 Ц

Вход МЮ1
AREF (вид разъема со стороны
лепестков для пайки)
+5V GND
2
Gnd D13 5 4

Gnd D12
+9V D11/PWM2
D10/PWM1
270 0м
D9/PWM0
D8
Arduino
Module
D7
D6
Analogo D5
A1 D4
A2 D3
A3 D2
A4 Digital1/TX
A5 DigitalO/RX Выход MIDI
(вид разъема со стороны
лепестков для пайки)

Рис. 11.4. Схема для создания своего входа и выхода МЮ1 для микроконтроллера:
а — монтажная; б — принципиальная
Снова о протоколах 499

Ш Воспроизведение
Этот пример основан на скетче, /*
разработанном Натаном Сейдлом . Демо инструмента General MIDI
(Nathan Seidle) для шилда Music 1 Контекст :
Arduino
Instrument, который можно при­
обрести по адресу www.sparkfun. Проигрывает все инструменты банка инструментов General MIDI
com/products/10587. */
Как обычно, скетч начинается #include <SoftwareSerial,h>
с задания функциональностей // Настраиваем программный последовательный порт
линий. Для выхода MIDI будет // для передачи сигналов MIDI :
использоваться линия 3, а ли­ SoftwareSerial midi(2,3);
ния 4 — для сброса шилда Music
Instrument. Линия сброса не const byte resetMIDI = 4 ; // Линия сброса микросхемы
требуется, если вы используете // синтезатора MIDI

отдельный синтезатор, подклю­


ченный по схеме, показанной на
рис. 11.4.
--------~~^
Urn Метод setup о инициали­ void setup (){
зирует последовательное под­ //Инициализируем последовательную связь на скорости 9600 б/с:
Serial.begin(9600);
ключение и подключение MIDI
и выполняет сброс шилда син­
//
//Инициализируем последовательный MIDI-канал на линиях
программного последовательного порта:
тезатора. Затем метод посылает midi.begin(31250) ;
команду MIDI Control Change На
канал о (охво) для выбора банка. //Выполняем сброс синтезатора MIDI:
Таким образом задается банк ин- i pinMode(resetMIDI, OUTPUT) ;
: digitalWrite(resetMIDI, LOW);
струментов, на которых мы бу-
дем играть:
delay(20) ;
digitalWrite(resetMIDI, HIGH);
delay(20) ;
//
//Посылаем команду MIDI Control Change, чтобы выбрать
банк звуков :
sendMidi(0хВ0, 0, 0);
}
CSS Метод loop() проходит по void loop
//
(){
всем инструментам в банке. Для Проходимся по всем инструментам в банке:
каждого инструмента он вы­ for(int instrument =;
0 instrument < ;
127 instrument++) {
Serial.print (" Instrument: ");
полняет команду MIDI Program
Serial.println(instrument +;
1)
change, чтобы выбрать инстру­
мент, а затем проходит и по всем
// Выбор программы. Имеет только один байт состояния:
sendMidi(OxCO, instrument, 0);
16 каналам. На каждом канале // Меняем каналы внутри инструмента:
играются ноты с 21-й (АО6, самая for (int thisChannel = <{
0; thisChannel
thisChannel++)
16;
низкая нота на 88-клавишном пи­
Serial.print("Канал :");
анино) по 109-ю (С8, самая высо­
Serial.println(thisChannel+; 1)
кая нота): for (int thisNote = <
21; thisNote 109; thisNote++) {
//
Включаем ноту
noteOn(thisChannel, thisNote, 127);
6 По американской нотной системе. delay(30); ►►
500 Глава 11

т // Выключаем ноту
noteOff (thisChannel, thisNote, 0);
d e l a y (30);
}
}
}
}

Б 1 Методы псуЪеОпО, noteOff() // Отправляем сообщение MIDI включения ноты.


И зепсМ1с11() используются ДЛЯ // Подобно нажатию клавиши пианино.

подачи команд МГО1. Метод // Диапазон каналов от 0 до 15.


void noteOn(byte channel, byte note, byte velocity) {
з е п с м ж () просто отправляет по­
sendMidi ( (0x90 | channel), note, velocity);
лученные им три байта. В мето­ }
дах пс^еОпО И noteOff () ИСПОЛЬ-
зуется побитовая операция сж для // Отправляем сообщение MIDI выключения ноты.
объединения команды (0x80 или // Подобно отпусканию клавиши пианино.
Ох9о) и ноты в одном байте: void noteOff(byte channel, byte note, byte velocity) {
sendMidi ( (0x80 | channel), note, velocity);
}
При исполнении этого скетча
синтезатор будет воспроизводить void sendMidi (mt cmd, int datal, int data2) {
все звуки своего первого банка midi.write(cmd);
звуков. midi.write(datal);
midi.write(data2);
}
01Музицируем взмахом
руки
Нет сомнений, что никакой ува­ /*
жающий себя энтузиаст МГО1 не Stinger player
успокоится до тех пор, пока не Контекст : Arduino
сделает свой первый терменвокс. */
Это как называть себя писателем,
не написав свою автобиогра­ #mclude <SoftwareSerial ,h>

фию, — так просто не делается! // Настраиваем программный последовательный порт


// для передачи сигналов MIDI:
Помахать рукой перед дальноме­
SoftwareSenal midi (2, 3);
ром, чтобы зазвучали ноты, —
это обряд посвящения в братство
const int midiResetPin = 4 ; // Линия сброса шилда
МГО1. Так что пишем нашу пер­ // Music Instrument
вую программу МГО1 для тер- const int threshold = 100; // Пороговое значение датчика
менвокса. Как вы увидите, эта int lastReading = 0 ; // Последнее показание датчика
программа несколько отличается
от большинства подобных про­
грамм.
Глобальные переменные вклю­
чают пороговое значение для ин­
фракрасного дальномера и пере­
менную для хранения предыду­
щего показания:


Снова о протоколах 501

HI Метод setup о инициирует void setup() {


связь и выполняет сброс шилда: // Инициируем аппаратные последовательный порт
/ / и программный MIDI-порт:
Serial.begin (9600);
midi.begin (31250);

// Выполняем сброс шилда Music Instrument


resetMidi(midiResetPin);

ш Метод loop о считывает по­ void loop() {


казание датчика и, когда оно // Считываем датчик:
превышает пороговое значение, int sensorReading = analogRead(АО);
активирует меТОД playStinger (), Serial.println(sensorReading);
который проигрывает последова­
тельность нот: // Если показание датчика выше, чем пороговое значение
// но было ниже при последнем считывании,
// играем на инструменте:
if (sensorReading <= threshold
&& lastReading > threshold ) {
playStinger();
}
// Сохраняем текущее показание для следующего прохода:
lastReading = sensorReading;

Рис. 11.5. Шилд Music Instrument компании


SparkFun, подключенный к модулю Arduino
и инфракрасному дальномеру. Конденсатор
позволяет немного сгладить выход датчика,
но если ваш датчик выдает надежный выход,
можно обойтись и без него
502 Глава 11

Ш Метод playstinger о играет void playStinger () {


последовательность нот с пау­ int note[] = {43, 41, 49};
зами между ними. Для этого ; int rest[] = {70, 180, 750};

он вызывает ноты из массива


С ПОМОЩЬЮ методов noteOn() и
// Проходим в цикле по трем нотам:

noteOffO, а затем выдержива­


for (int thisNote = 0; thisNote < 3; thisNote+t) {
// Включаем ноту:
ет паузу, длительность которой
noteOn(9, note[thisNote], 60);
определяется значением из мас­
delay(rest[thisNote]);
сива.
// Выключаем ноту:
noteOff(9, note[thisNote], 60);
Методы noteOn(), noteOffO И
// Берем небольшую паузу после второй ноты:
sendMidi() такие же, как и в пре­ if (thisNote == 1) {
дыдущем примере, и их можно delay(50);
просто скопировать оттуда: }
}
}
// Примечание: Сюда вставляем методы noteOn(), noteOffO
/ / и sendMidi () из предыдущего примера.

□ Метод resetMidi () СОСТОИТ ИЗ void resetMidi(int thisPin) {


кода для выполнения сброса му­ // Выполняем сброс шилда Music Instrument
зыкального инструмента, взятого pinMode(thisPin, OUTPUT);
из метода setup о предыдущего digitalWrite(thisPin, LOW);

примера и оформленного, как от­ delay(100);


digitalWrite(thisPin, HIGH);
дельный метод:
delay(100);
}
Загрузив этот скетч в микрокон­
троллер и запустив его на испол­
нение, скажите:
- Парень заходит в бар
и говорит «Ой-ой-ой!»

Затем помашите рукой перед ин­


фракрасным дальномером. Ну,
вы и комик! А еще вы сделали
свой первый инструмент MIDI.
Снова о протоколах 503

йй П ротокол РМ Х 512
Протокол Р М Х 512 — еще один двоичны й протокол, которы й будет полезно знать. Э то по сле­
довательны й протокол реальн ого врем ени для взаим одействия между систем ой управления
освещ ением сцены и реостатам и освещ ения. В течен и е пары д есятко в л ет он являлся стан ­
дартным промыш ленным протоколом для орган и заци и сц е н и че ско го освещ ения и управле­
ния театрально-конц ертны м оборудованием . П ротокол Р М Х 5 1 2 такж е прим еняется для уп р а в­
ления устро й ствам и специ альны х эф ф ектов, передвижным и светильникам и, проекционны м и
систем ами и многими другим и устро й ствам и .

На физическом уровне протокол DMX512 бази­ (Daniel Hirschmann), предлагается по адресу h ttp://
руется на последовательном интерфейсе RS-485. w w w .h irsc h a n d m a n n .c o m /2 0 1 1 /su p e r-d m x -sh ie ld -
Протокол RS-485 — это шинный последователь­ fo r-a rd u in o /. Первый шилд позволяет подсоединить
ный протокол, позволяющий нескольким устрой­ собственный разъем, а второй оснащен разъемами
ствам задействовать одни и те же линии передачи XLR, RJ-45 и также контактами для подсоедине­
и приема, при условии, что каждое из них имеет ния собственного разъема. Дополнительные сведе­
однозначный адрес. Протокол RS-485 основан на ния и средства для протокола DMX можно найти
принципе дифференциальной передачи, вследствие на игровой площадке для Arduino по адресу w w w .
чего он может работать на очень больших расстоя­ a rd u in o .cc/p la y g ro u n d /L ea rn in g /D M X , а также по
ниях, вплоть до 1200 метров. Устройства DMX512 адресу w w w .o p en d m x .n et.
обычно оснащены разъемами в стиле XLR с тремя
либо пятью контактами, хотя многие современные Подобно протоколу MIDI, протокол DMX устаре­
устройства оснащаются и разъемами в стиле RJ-45. вает. Светотехническая промышленность начала
разрабатывать его наследника — набор протоколов
Протокол DMX512 работает со скоростью ACN7, которые могут работать поверх протокола
250 Кбит/с, что для последовательного протокола Ethernet. Можно ожидать, что в течение следующих
весьма высокая скорость. И слишком высокая для лет этот набор протоколов приобретет все возраста­
обычного последовательного канала TTL микро­ ющее значение. Для дополнительной общей инфор­
контроллера. Но на рынке присутствуют несколь­ мации по протоколам управления сценическими
ко шилдов с разъемами DMX, а для работы с ними действиями не найти лучшего источника, чем книга
имеется библиотека DMX для Arduino, называюща­ издательства Focal Press «Control Systems for Live
яся Simple DMX. Автор лично протестировал толь­ Entertainment»8, написанная Джоном Хантингтоном
ко два таких шилда, и оба они работали хорошо. (John Huntington),.
Первый шилд — Tinker DMX (рис. 11.6, а), мож­
но приобрести в магазине Arduino Store по адресу 7 ACN, Architecture for Control Networks — архитектура
h ttp ://store.ard u in o.cc/w w /, а второй шилд — Super сетей управления.
DMX (рис. 11.6, б) разработки Даниэля Хиршмана 8 «Системы управления живыми представлениями».

Рис. 11.6. Шилд Tinker DMX (а) и Super DMX


Даниэля Хиршмана (б). Оба шилда позволяют
управлять светотехническими системами
и системами управления сценическим
а б действием посредством протокола DMX512
504 Глава 11

после которой следует информация о свойствах об­


I I Структура и синтаксис мена, каждое из которых предоставляется отдель­
ной строкой. Каждая строка начинается с описания
текстовы х протоколов свойства — например, размера содержимого, а по­
сле двоеточия дается и само значение. Заголовок
В этой книге мы познакомились с несколькими го­
обмена отделяется от собственно сообщения двумя
товыми текстовыми протоколами, и даже создали
символами перевода строки, и само сообщение так­
несколько своих. По сути, протокол — это средство
же обычно закрывается двумя символами перевода
для структурирования данных. Некоторые протоко­
строки. Любые поступающие от клиента данные
лы просто передают информацию, а другие отдают
оформляются в виде массивов пар «имя-значение»,
команды — явно или неявно — посредством запро­
информация об обмене отделяется двоеточием, а
сов. Весьма полезно уточнить некоторые аспекты
элементы данных в содержимом обмена разделяют­
их грамматики — на случай, если вам придется
ся амперсандами (&). Возьмем, для примера, сле­
столкнуться с подобными протоколами, чтобы вы
дующий запрос HTTP post из главы 2:
знали, на что следует обращать внимание.
POST /a g e_ ch ec k e r.p h p HTTP/1 .1
H o st: exam ple. com
Простые форматы данных C o n n ectio n :C lose
C on ten t-T yp e: a p p lica tio n /x -w w w -fo rm -u rlen co d ed
Самый простой формат — это просто строка раз­ C o n te n t-le n g th : 16
деленных запятыми значений, как в проекте
«Мартышкин пинг-понг» из главы 2. Такие фор­ name=tom&age=l4
маты, как CSV9 и TSV101, используются повсемест­
Все содержимое заголовка является параметром за­
но — строка формата CSV обычно заканчивается
проса: кому направляется запрос, тип подключения,
символом перевода строки или символом перево­
тип содержимого для обмена, размер содержимого.
да строки и символом возврата каретки. Хорошим
А все в теле запроса является параметром содержи­
примером использования формата CSV на практике
мого: имя и возраст. Четкая разница между форма­
является протокол NMEA-0183, который использу­
тированием заголовка и форматированием содер­
ется в приемниках GPS.
жимого делает более легкой задачу разделения этих
Мы также видели несколько примеров организа­ элементов при написании программы, как мы уже
ции данных в парах «имя-значение». И в самом имели возможность это видеть.
деле, любой список элементов, с каждым из кото­
рых связано имя, представляет такой набор пар. Форматы структурированных
Переменные среды языка РНР — включая перемен­ данных
ные $_GET, $_ POST, $_REQUEST И $_SERVER---ДаЮТ Нам
пары «имя-значение». В языках программирования Для обмена данными, более сложными, чем про­
ассоциативные массивы по сути представляют со­ стой список пар «имя-значение», требуется какая-
бой списки пар «имя-значение». либо структура. Рассмотрим, например, массив
датчиков, расположенных в разных местах вашего
Мы также использовали несколько протоколов для дома (табл. 11.3).
обмена данными в Интернете — такие как прото­
колы HTTP11 и SMTP12. Они также имеют общий В данном случае мы имеем дело не с простым спи­
формат — обмен начинается командой g e t и л и p o s t , ском элементов и даже не со списком пар «имя-
значение». В действительности списком пар «имя-
9 CSV, Comma-separated values — значения, разделенные запя­ значение» является каждая строка таблицы. В таких
тыми.
случаях как раз и будет кстати формат структури­
10 TSV, Tab-separated values — значения, разделенные символа­
ми табуляции. рованных данных. Для структурированных данных
11 HTTH, HyperText Transfer Protocol — протокол передачи ги­ типа этих пользуется популярностью текстовый
пертекста. формат обмена данными JSON13.
12 SMTP, Simple Mail Transfer Protocol — простой протокол пе­
ресылки [электронной] почты. 13 JSON, JavaScript Object Notation.
Снова о протоколах 505

Таблица 11.3. Пример массива датчиков, расположенных в доме


Адрес Размещение Последнее чтение Значение
1 кухня 12:30:00 60
2 гостиная 05:40:00 54
3 ванная 01:15:00 23
4 спальня 09:25:00 18
5 коридор 06:20:00 3

Формат 18(Ж представляет каждую ячейку таблицы как пару «имя-значение». Каждая строка содержит
заключенный в фигурные скобки список пар, разделенных запятыми. Для нашей таблицы примера такой
список будет выглядеть следующим образом:
[{"Адрес":1,"Размещение":"кухня","Последнее чтение":"12:30:00","Значение":60},
{"Адрес":2,"Размещение":"гостиная","Последнее чтение":"05:40:00","Значение":54},
{"Адрес":3,"Размещение":"ванная","Последнее чтение":"01:15:00","Значение":23},
{"Адрес":4,"Размещение":"спальня","Последнее чтение":"09:25:00","Значение":18},
{"Адрес":5,"Размещение":"коридор","Последнее чтение":"06:20:00","Значение":3}]

Это сравнительно простой способ форматирования данных. Элементы разделяются только одним сим­
волом, что позволяет считывать их по одному символу за раз и знать, когда заканчивается один элемент
и начинается следующий. Поскольку это текстовый формат, он может читаться как людьми, так и машина­
ми. Символы пробелов, возврата каретки и табуляции не входят в структуру 18(Ж , поэтому форматирова­
ние для более удобного чтения можно выполнить и следующим образом:
Преимуществом такого формата обмена данными,
"Адрес":1,
как 18(Ж, является его легкость, в том смысле,
"Размещение":"кухня", что для структурирования данных, которые нужно
"Последнее чтение":"12:30:00' переслать, не требуется использовать много допол­
"Значение":60 нительных байтов. Таким образом, структуриро­
{ ванный формат данных предоставляет нам больше
"Адрес":2, возможностей, чем простой список, при этом про­
"Размещение":"гостиная", должая оставаться эффективным при передаче дан­
"Последнее чтение":"05:40:00'
"Значение":54
ных от сервера клиенту. Данные в формате 18СЖ
}, можно посылать и как тело запроса НТТР, что при
{ наличии клиента для разбора данных дает нам бы­
"Адрес":3,
стрый способ обмена сложными данными.
"Размещение":"ванная",
"Последнее чтение":"01:15:00'
"Значение":23 Однако для представления более сложных струк­
}, тур нам требуется язык разметки. Языки разметки
{ предоставляют способ подробно описывать струк­
"Адрес":4,
"Размещение":"спальня", туру текстового документа. Они разделяют данные
"Последнее чтение":"09:25:00' на содержимое и разметку, которая представляет
"Значение":18
собой ряд описательных тегов для упорядочивания
Ь
{ содержимого. Содержимое — это то, что мы хотим
"Адрес":5, представить для просмотра, а разметка описывает,
"Размещение":"коридор", каким образом представить это содержимое, что
"Последнее чтение":"06:20:00'
"Значение":3
с ним делать, а в некоторых случаях, и как его
} интерпретировать.
506 Глава 11

Теги разметки обычно представляют собой тексто­ большое количество обрабатывающих их программ,
вые строки, отделяемые от содержимого специаль­ каждая из которых использует другой протокол.
ной парой знаков пунктуации. В следующем приме­ Когда каждый протокол разработан таким образом,
ре пара <titie> и </titie> является открывающим чтобы учитывать другие протоколы, как в случае
и закрывающим тегами HTML: с HTTP, HTML и языком маркировки Wiki, каждая
программа может с легкостью разобрать байты,
<title> Это заголовок flOKyMeHTa</title>
которые представляют важность для нее, и пропу­
Если тег имеет какие-либо атрибуты, они помеща­ стить все остальное..
ются внутри открывающего тега:
В большинстве случаев нам не требуется вся инфор­
<а href=»www.example.com>A link</a> мация, которая содержится в обычном обмене дан­
ными. Знание структуры и синтаксиса протокола не
Языки разметки со строгими требованиями в отно­
только помогает нам понять смысл сообщения, но
шении соблюдения правил (так называемые стро­
также и увидеть, что в нем можно проигнорировать.
гие языки) для каждого открывающего тега пред­
Необходимость исследовать каждый получаемый
усматривают соответствующий закрывающий тег.
фрагмент данных может создать чрезмерную нагруз­
Требовательность языков разметки к форматирова­
ку на вашу систему, да и на ваше терпение тоже. Но
нию обусловлена тем, что они предназначены для
когда известно, что можно проигнорировать, — мы
машинной обработки. Компьютерная программа
в выигрыше. Рассмотрим, например, запрос HTTP
не обладает способностью предположить, что вы
p o s t , который служба Twilio отправляет в проекте
хотели поставить закрывающий тег, но просто за­
из главы 10 (см.разд. «Модифицируем сервер»). Он
были это сделать, и будет искать его, пока не найдет
содержит большой объем данных, свыше 500 байт.
следующий закрывающий тег. Но если она найдет
Но все, что нам из него требовалось, так это только
второй открывающий тег перед тем, как найти за­
свойство Digits, поэтому скетч только сканировал
крывающий для первого открывающего, она впадет
входящий поток текста, не сохраняя ничего, пока
в фрустрацию.
он не нашел строку Digits. Такое сканирование
Языки разметки описывают структуру документа в поисках нужной информации и игнорирование
и способ его представления, но они не предоставля­ ненужной является центральным требованием для
ют никаких сведений о содержимом документа. Для эффективного разбора данных.
текстовых документов языки разметки то же самое,
что и протокол MIDI для музыки: он задает пара­
метры, описывающие как играть ноту, но не предо­
Языки разметки по сравнению
ставляет никаких сведений о самом тоне ноты. с языками программирования
Обратите внимание, что ни один из рассмотрен­ Языки разметки в основном являются описатель­
ных нами протоколов связи не использует символы ными языками, и не всегда активными. Они ин­
угловых скобок: < и >. Это одна из причин, по­ терпретируются программой, которая отображает
чему эти символы приняты в языке HTML для обо­ описываемое ими содержимое. Возьмем, например,
значения тегов разметки. Разбирая ответ HTTP, мы язык HTML. Этот язык описывает, как должна вы­
знаем — когда найден первый символ <, мы достиг­ глядеть страница, но он не обладает глаголами для
ли основного текста. Подобным образом в разметке указания серверу предпринять какое-либо действие.
справочников Wiki для заключения тегов обычно Он может описать элемент, подлежащий воспроиз­
используются квадратные скобки: [ и ]. Это по­ ведению, например, файл видео или аудио, а также
зволяет отличить разметку Wiki от разметки HTML указать, что элемент должен воспроизводиться при
или XML и использовать оба типа разметки в одном загрузке. Но в HTML нет никаких команд для указа­
документе, не вызывая конфликтов. ния каких-либо действий после того, как страница
была загружена. Языки разметки для инициирова­
Составляющие веб-страницу байты, прежде, чем ния действия обычно полагаются на внешнего аген­
достичь места назначения, могут проходить через та — на того же пользователя.
Снова о протоколах 507

В противоположность языкам разметки, языки К этому моменту вы должны были заметить, что
программирования могут инициировать действие языки программирования, как правило, не проща­
на основании своей внутренней логики. Языки про­ ют пропущенной запятой или точки с запятой или
граммирования представляют собой наборы команд, использования заглавной буквы вместо прописной.
посредством которых выполняются определенные Причиной здесь является то обстоятельство, что
действия. Ваша задача, как программиста, состоит язык программирования в действительности пред­
в том, чтобы организовать необходимые команды ставляет собой нечто наподобие языка разметки
таким образом, чтобы действия выполнялись так, для компилятора. Компилятор читает текст вашей
как вы хотите, и тогда, когда вы этого хотите. программы и преобразует его в машинный язык,
поэтому ваш текст должен быть машиночитаемым,
Для управления простыми данными в языках про­ так же, как это требуется от языков разметки и фор­
граммирования применяются переменные и масси­ матов данных. Проблема создания хорошего языка
вы, но обычно они не содержат требований по фор­ программирования подобна проблеме создания хо­
матированию сложных данных. Предполагается, рошего протокола данных — он должен быть эф­
что программист сам предложит формат или прото­ фективным для машинного чтения и интерпретиро­
кол данных, а затем использует возможности языка вания, но в то же самое время быть более или менее
программирования для побайтной сборки оформ­ удобочитаемым для людей.
ленных таким образом данных или для их побайт­
ного считывания и интерпретирования. Хорошие Ключ к интерпретированию любого протокола дан­
языки программирования оснащены библиотека­ ных — от самых простых списков значений, раз­
ми для чтения и записи распространенных форма­ деленных запятыми, до наиболее сложных языков
тов данных, с которыми нам пришлось работать программирования или разметки, — это начать с
в этой книге. Большинство библиотек, которые мы вопроса, для чего он предназначен, а затем внима­
использовали, были разработаны для чтения или тельно исследовать его структуру, чтобы выяснить
записи определенного формата данных. А стандарт его организацию. Как можно видеть, многие разные
HTML5 представляет удачное сочетание языка раз­ протоколы и языки имеют общие схожие элементы
метки (HTML и CSS) и языка программирования пунктуации или структуры, поэтому знание одного
(JavaScript), что позволяет веб-дизайнерам и разра­ помогает в изучении других.
ботчикам создавать полноценные приложения для
исполнения в браузере.

йй Принцип REST
Протокол HTTP основан на принципе передачи представительного состояния REST14. REST —
это не протокол, а, скорее, архитектурный стиль для обмена информацией. Хотя принцип REST
и берет свое начало в веб-приложениях, он нашел применение и в других областях. Некоторое
представление о REST не только поможет вам понимать другие системы, но также и разраба­
тывать свои собственные протоколы связи. Усвоив этот принцип, вы захотите применять его
повсюду.
Основная идея REST заключается в следующем: либо изменить это состояние. Посредством REST
где-то в Сети имеется какой-либо объект. Возможно, мы можем описать, или представить, состояние
это база данных, а, может быть, это микроконтрол­ того или иного объекта в Сети и передать это пред­
лер, управляющий вашими бытовыми приборами, ставление удаленному пользователю. Иными сло­
наподобие того, который мы создали в предыдущей вами, REST — это схема адресации для любого
главе. Мы хотим либо узнать его текущее состояние, удаленного объекта.

14 От англ. — REpresentational State Transfer.


508 Глава 11

Мы уже использовали REST — это тот принцип, на Запросы HTTP являются его глаголами: g e t ,
котором основан протокол HTTR Когда мы хотим p o s t , p u t и d e l e t e (последние два используются

получить информацию об объекте, мы делаем за­ менее часто);


прос g e t 15, а запросом p o s t 16 м ы обновляем его со­ • описание не зависит от используемой техно­
стояние. Объект отвечает на наш запрос либо пред­ логии. В запросах нет явного указания предо­
ставлением своего состояния (например, страницы ставить ресурс с веб-сервера в виде страницы
HTML, доставляемой контроллером кондиционера, HTML или документа XML, или что он должен
которая содержит представление текущей темпера­ быть сохранен на сервере сценарием РНР или
туры в квартире и состояние термостата), либо из­ Ruby, программой C/C++, исполняющейся на
менением состояния (например, обновляя настрой­ Arduino, или заклинанием черной магии. Каким
ку термостата). способом создается результат — не имеет значе­
В мышлении в стиле REST адреса (URL) — это ния, мы просто хотим знать состояние объекта,
существительные, которые описывают объекты, а а как предоставить это состояние — уже забота
запросы — глаголы, которые воздействуют на су­ для сервера.
ществительные. Свойства объектов описываются в Вся прелесть независимости от технологии состоит
URL с разделением их косыми чертами. Рассмотрим в том, что REST можно использовать практически
описание REST одного из контактов Arduino: для любого интерфейса управления. Так, принципы
/pin/АО/ REST используются в протоколе управления му­
зыкальными инструментами OSC17, который пред­
Если мы хотим узнать состояние этого контакта, мы
назначен заменить MIDI. Принципы REST также
можем это сделать, отправив Arduino следующий
используются в наборе протоколов ACN, который
запрос:
идет на замену протоколу DMX512. REST также
GET /pin/АО/ независим от механизма транспортировки и может
На этот запрос Arduino ответит, предоставляя со­ применяться для передачи данных по Ethernet, по­
стояние контакта а о ,т о есть число в диапазоне зна­ следовательным каналам и другим физическим
чений от о до Ю23. А если мы хотим изменить со­ каналам передачи данных. REST предоставляет
стояние контакта цифрового вывода, то можем это стандартный способ для именования или адреса­
сделать следующим запросом: ции объектов, что позволяет использовать одну и
ту же схему адресации при смене среды, инстру­
POST /pin/D2/l/
ментов программирования или сетевой техноло­
Модуль Arduino будет знать, что этот запрос озна­ гии. Протоколы REST достаточно простые и могут
чает: задать цифровой контакт 2 как вывод и уста­ обрабатываться процессорами с ограниченными
новить на нем высокий уровень (1 = HIGH — вы­ вычислительными возможностями, но в то же са­
сокий). В данном случае модуль Arduino выступает мое время достаточно общие, чтобы описать какой
в роли сервера, предоставляя нам представление угодно объект, о котором требуется информация
своего состояния, а мы являемся клиентом. или которым нужно управлять.
Такой обмен имеет три важных аспекта: Еще одно преимущество REST при разработке веб­
сайтов состоит в том, что при изменении программ­
• представление (которое также называется ре­
ной среды, используемой для обеспечения работы
сурсом) и его атрибуты разделяются косыми
сайта, адреса (URL) изменять не требуется. Клиент
чертами. Атрибуты можно рассматривать как
никогда не видит расширений php, rb (Ruby) или
свойства объекта;
pi (Perl), и поэтому он не знает и ему безразлично,
• запрос является глаголом — хотим ли мы по­ какая программная среда обеспечивает работу ва­
лучить информацию о состоянии объекта или шего сайта. Если вы хотите попробовать новые язы­
изменить его состояние, мы начинаем с глагола. ки — никаких проблем. Структура сайта останется
прежней.
15 От англ. — Получить.
16 От англ. — Объявить (новое состояние). 17 OSC, Open Sound Control.
Снова о протоколах 509

Чтобы разрабатывать веб-проекты согласно прин­ от 1 до 10. Клиент может получить или установить
ципам REST, следует рассматривать разрабатывае­ позицию любой жалюзи. Адреса (URL) для полу­
мое устройство или сайт в терминах его свойств и чения или установки состояния жалюзи могут вы­
придумать такую схему адресации, которая позво­ глядеть следующим образом:
ляет клиентам просматривать и изменять эти свой­
• получить состояние всех жалюзи:
ства требуемым образом. На практике это означает,
что все адреса (URL) вашего сайта должны закан­ http : / /mywindows.example.сот/window/a l1
чиваться символом косой черты — /. Файл index, • получить состояние жалюзи отдельного окна
html (или любой файл формата HTML) не исполь­ (в данном случае окна 2):
зуется, как не используется и строка запроса g e t . http : / / mywindows.example.com/window/2
Параметры запроса передаются с помощью коман­
ды p o s t — обычно они идут в конце адреса, как мы • установить жалюзи отдельного окна в среднем
увидим в следующих примерах. Один из них — положении:
традиционная веб-служба, а другой — физическое http : / /mywindows.example.сот/window/2/50
сетевое устройство.
• закрыть все жалюзи:
http ://mywindows.example.com/window/all/0
Традиционная веб-служба
Конечно же, если вам не нравятся эти конкретные
Допустим, что мы разрабатываем общественный схемы адресации, вы можете создать свои собствен­
сайт для бегунов, на котором они могут ежедневно ные. Но только следуйте основному стилю REST:
сравнивать результаты своих пробежек. Для этого
каждый бегун имеет свой профиль с различными /объект/атрибут — для получения значения атрибута
атрибутами для пробежки за каждый день: число и
(день, месяц и год), дистанция и время пробежки.
/объект/атрибут/новоеЗначение — ДЛЯ установки НО­
Для пробежки 31 января 2014 года адреса (URL)
ВОГО значения.
для доступа к этим атрибутам могут выглядеть сле­
дующим образом: Как должен выглядеть интерфейс, возвращаемый
адресом URL, оставляется на ваше усмотрение.
• чтобы получить дистанцию:
Можно выбрать графическое представление, кото­
http://myrun.example.сот/runnerName/31/1/2014/
рое отображает окна с жалюзи, или же выводить
distance/
результаты на экран только в текстовом формате.
• чтобы установить дистанцию в 12,56 киломе­ Архитектура REST только определяет, где найти
тров: что-то, но не что именно там найти.
http://myrun.example.com/runnerName/31/1/2012/
distance/12.56 Адреса в стиле REST предназначены для легкого
• чтобы установить время 1 час, 2 минуты и 34 се­ разбора компьютером. Все, что нужно сделать для
кунды: разборки адреса, — это разделить входящие запро­
сы на подстроки по разделяющим косым чертам,
http://myrun.example.com/runne rName/31/1/2012/
time/1:02:34 определить, что представляет собой каждая под­
строка, и выполнять соответствующие действия на
Обратите внимание на то, как можно отличить вы­ следующих за ней подстроках. Эта адреса также
зов, который возвращает параметры, от вызова, ко­ удобочитаемы и для людей. Адреса (URL), приве­
торый устанавливает их: в первом типе вызова ни­ денные в показанных только что примерах, намного
чего не следует за именем параметра. более понятные, чем эквивалентный запрос g e t :
http : //myrun.example. com/?runnerName=George&day=
Физическое веб-устройство 31&month=l&year=2012&distance=12.56

Допустим, что мы создаем устройство для управле­ В следующем проекте демонстрируется, как орга­
ния оконными жалюзи в нашем офисе. Всего есть низовать сервер на основе РНР, который может вы­
12 окон, и для каждого свои жалюзи. Уровень подъ­ полнять разборку адресов, оформленных в стиле
ема жалюзи может занимать позицию в диапазоне REST.
510 Глава 11

^ Проект 33
Развлекаемся с REST
Если вы имеете опыт разработки только статических страниц HTML, вы, наверное, привыкли
к мысли, что косые черты в URL разделяют подпапки на пути к конечной папке на сервере,
содержащей требуемый файл HTML. Но это не обязательно должно быть именно так. Серверу
можно указать, как интерпретировать URL, что мы и сделаем в этом проекте.

В разд. «Сетевая идентификация» главы 9 мы соз­


дали сценарий РНР, который выводил на экран все Требуемые компоненты
переменные среды, возвращенные сервером в ответ ►
►Учетная запись на веб-сервере.
на запрос HTTP. Одной из таких переменных была
переменная r e q u e s t u r i , которая содержала тексто­
вую строку, следующую за запросом g e t о т клиента. Для этого проекта нужно создать базовую папку
Вот с этой переменной нам нужно работать, чтобы и отредактировать файл .htaccess таким образом,
создать веб-службу в стиле REST. Каждая состав­ чтобы сервер перенаправлял все запросы, которые
ляющая адреса (URI) запроса будет частью нашего выглядят как путь, в подпапку к нашему сценарию.
интерфейса, точно так же, как и в предыдущих при­ Затем мы используем переменную среды r e q u e s t _
мерах с URL. u r i , чтобы создать наш интерфейс в стиле REST.

Скорее всего, что ваш веб-сервер работает под


управлением серверной программы Apache. В та­ Унифицированный идентификатор ресурса
ком случае вы можете создать в каталоге .htaccess Сокращение URI расшифровывается как Uniform
специальный файл, который определяет поведение Resource Indicator — унифицированный идентифика­
сервера касательно этого каталога. В частности, тор ресурса. Это просто синоним, означающий веб­
адрес ресурса.
можно скрывать файлы и подкаталоги, защитить
каталог паролем и многое другое.

В1 Изменяем доступ
Начнем с создания новой пап­ RewriteEngine On
ки на веб-сервере. Назовите ее # Задаем базовый путь к папке:
ту зем се. Создайте в этой пап­ RewriteBase /-username/myservice
ке текстовый файл, назвав его # Перенаправляем все после базовой папки на index.phpA
.Массезз. Файлы, имена кото­ RewriteCond %{REQUESTJFILENAME} -s [OR]
рых начинаются с точки, не ото­ RewriteCond %{REQUEST_FILENAME} -1

бражаются в файловой системе RewriteRule A .*$ - [NC,L]


RewriteRule A .*$ index.php [NC,L]
операционных систем Ь тих и
Мае 0 8 X. Поэтому будет лучше
создать этот файл непосредствен­
но на сервере с помощью про­
граммы терминала или програм­
мы редактирования веб-страниц.
Далее приводится содержимое
этого файла:
Снова о протоколах 511

Этот файл дает указание веб­


серверу модифицировать запро­ .Модуль A pache mod rewrite
сы HTTP клиента, начиная с име­ Чтобы этот код работал, необходимо, чтобы ваш веб-хостинг исполнял
ни данной папки на вашем веб­ модуль Apache m o d r e w r i t e на своем сервере. Это довольно распростра­
сайте. Он берет любую строку ненный модуль, так что, скорее всего, он исполняется. Но если сценарий
после имени папки и заменяет ее не работает, как описывается здесь, узнайте у администратора своего веб­
названием index.php. хостинга, включен ли модуль m o d r e w r i t e .

ШГчтение <?php
/*
Далее приводится содержимое
RESTful reader
файла тс!ех.рЬр. Этот сценарий
Контекст : PHP
берет содержимое переменной
*/
$_ЕЕоиЕзт_ш1 и разбивает его на
массив строк, используя косую // Разбиваем строку URI на список:
черту в качестве точки, по кото­ $parameters = explode(«/», $_SERVER['REQUESTJJRI']);
рой выполняется разбиение ис­ // Выводим на экран все элементы списка:
ходной строки: foreach($parameters as $item) {
echo «Элемент: «;
Сохраните этот файл на сервере, echo $item."<br>";
а затем введите в адресную строку
браузера следующий адрес 1ЖЬ: ?>
http://www.myserver.com/
myservice/this/is/a/list/of/
restful/parameters/

Сервер должен возвратить ответ


наподобие следующего:
Элемент:
Элемент: myservice
Элемент: this
Элемент: is
Элемент: а
Элемент: list
Элемент: of
Элемент: restful
Элемент: parameters

Теперь, когда мы получили все посылаемое кли­


ентом содержимое в виде массива, мы можем вы­
полнять с этим содержимым любые операции.
Вот здесь и начинается самая интересная часть.
Например, мы можем написать программу, которая
выискивает определенные элементы списка и пред­
принимает для них определенные действия. Далее
приводится краткий пример — на основе предыду­
щего примера веб-сайта для бегунов — который из­
влекает параметры дистанции и времени.
512 Глава 11

СО! Модифицируем <?php


// Разбиваем строку URI на список:
сценарий
$$parameters = explode(«/», $_SERVER['REQUEST_URI']);
Возьмите блок кода ГогеасМ)
из предыдущего примера и из­ $position = array_search('distance', $parameters);
мените его, как показано далее. if ($pos±tion) {
Добавленный код выделен жир­ $distance = $parameters[$position+l];

ным шрифтом: echo "Ваша дистанция: « .$distance.»<br />»;


}
Введите в адресную строку брау­
зера следующий адрес (замените $position = array_search('time’, $parameters);
имя хоста и путь на соответству­ if ($position) {
ющие параметры для вашего веб­ $tiine = $paraineters[$position+l] ;
сервера): echo "Ваше время: ".$tixne."<br />";

http ://www.example.com/
myService/runnerName/31/1/2012/
distance/12.45/time/0:45:34

В результате исполнения этого


запроса браузер должен возвра­
тить следующее:
Ваша дистанция: 12.45
Ваше время: 0:45:34

Объединив этот подход со стандартными инфраструктуры, как Саке и Codeigniter для РНР,
формами HTML, использующими запрос Rails и Sinatra для Ruby и многие другие, пытаются
HTTP p o s t , мы получили два способа передачи па­ сделать задачу создания приложений более легкой,
раметров серверу, а наши адреса (URL) отобража­ и их интерфейсы API преследуют цель стимули­
ют состояние ресурса. Это предоставляет нам мощ­ ровать разработчиков придерживаться принципов
ный и гибкий способ для создания архитектуры REST. Эти принципы часто позволяют создавать
веб-службы, позволяя получить адреса (URL), как приложения-посредники, которые принимают в ка­
машиночитаемые, так и понятные для людей. честве ввода данные сложного формата и выдают
их в более простом формате, чтобы позволить их
Каждый серверный язык программирования имеет использование устройствам с ограниченными воз­
несколько разных инфраструктур, предназначенных можностями.
для облегчения реализации принципов REST. Такие
Снова о протоколах 513

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

Как вы должны были уже к настоящему моменту протоколы способами, не предусмотренными их


понять, наиболее гибкие физические интерфей­ разработчиками. Заставьте технологию служить
сы обычно также и наименее заметны в сети. Они требованиям пользователя.
включаются и выключаются, подсоединяются че­
Задача обеспечения взаимодействия объектов всег­
рез частные сети и используют процессоры с огра-
да порождает два вопроса. Для кого вы стараетесь,
ниченнььми вычислительными возможностями для
создавая свой проект? Что этому человеку требует­
экономии места, веса и энергопотребления. Они не
ся и как можно наилучшим способом предоставить
всегда могут делать все то, что способен сделать
это для него?
специально выделенный веб-сервер, и они также не
всегда доступны на постоянной основе. Но все это Чтобы разработать гибкую сеть физических объ­
не представляет ограничений, когда такие устрой­ ектов, которые по-настоящему полезны для людей,
ства используются для взаимодействия с выделен­ нужно в первую очередь думать о потребностях
ными серверами. и действиях их потенциальных пользователей.
И не забывайте о правилах личных взаимоотношений
В качестве хабов для своих проектов используйте
и сетевой деятельности:
общедоступные серверы, работающие по принципу
24/7 (24 часа в сутки 7 дней в неделю). Они могут • слушайте больше, чем говорите;
сохранять сообщения для физических устройств, • никогда не предполагайте;
когда тех нет в Сети, чтобы доставить эти сообще­
• установите правила обмена информацией;
ния адресатам позже. Они могут служить посред­
никами при выполнении задач, для которых более • попросите разъяснения.
простые устройства не предназначены, — напри­ Интернет Вещей будет бесполезным, если эти вещи
мер, сложное управление данными или аутенти­ не улучшат качество нашей жизни и методы нашего
фикация. Не бойтесь использовать инструменты и взаимодействия друг с другом.
Приложение 4с

ГДЕ БРАТЬ КОМПОНЕНТЫ


И ПРОЧЕЕ?
В книге упоминается много разных поставщиков аппаратных
устройств и источников программного обеспечения.
В этом приложении приводится список всех используемых в книге
компонентов и краткое описание их поставщиков.
Приложение разбито на три части:

• компоненты;
• поставщики аппаратных компонентов;
• поставщики программного обеспечения.
516 Приложение


►Плотный картон толщиной 1,5 мм. Исполь­
Компоненты зуется в проектах 8, 26 и 27 для конструкции
корпуса проекта.
В этой части приводится список всех компо­
нентов, используемых в книге. Для каждого ►
►Компьютер с функциональностью Bluetooth.
компонента указываются проекты, в которых Используется в проектах 3, 4, 11, 18 и 19. Если
он задействован. ваш компьютер не оснащен функциональностью
Bluetooth, используйте адаптер Bluetooth. SF:
Поскольку возможны обновления этого списка, WRL-09434, F: 1814756
посетите веб-страницу http://oreilly.com/catalog/

►Устройство Android. Используется в проек­
0636920010920, чтобы ознакомиться с ними.
те 31.

Код поставщика Микроконтроллеры,


Россия шилды и макетные платы
• АМР — «Амперка» (http://amperka.ru) ►
►Модуль Arduino Uno. Используется в про­
ектах 1, 2, 3, 9, 10, 11, 15, 16, 20, 21, 26 и 32.
• CHD — «Чип и Дип» (http://chipdip.ru)
АМР: А000066, LC: 1с8192, D: 1050-1019-ND,
• LC — «Линуксцентр» (www.linuxcenter.ru) J: 2121105, SF: DEV-09950, А: А000046, AF: 50,
F: 1848687, RS: 715-4081, SS: ARD132D2P, MS:
США и Европа MKSP4

• А — Arduino Store (http://store.arduino.cc/ww/) ►


►Модуль Arduino Fio. Используется в проек­
те 10. SF: DEV-10116
• AF — Adafruit (www.adafruit.com)
• CR — CoreRFID (www.rfidshop.com) ►
►Плата Arduino Ethernet. Используется в про­
ектах 6, 7, 8, 13, 14, 27 и 29. Альтернативно по­
• D — Digi-Key (www.digikey.com)
дойдет плата с Ethernet шилдом, совместимая
• F — Famell (www.farnell.com) с Arduino Uno (см. ранее). АМР: А000068, SF:
• J — Jameco (http://jameco.com) DEV-09026, J: 2124242, А: А000056, AF: 201, F:
• L — LessEMF (www.lessemf.com) 1848680
• MS — Maker SHED (www.makershed.com) ►
►Arduino LilyPad. Используется в проекте 31.
• P — Pololu (www.pololu.com) АМР: DEV-09266, SF: DEV-09266, А: А000011
• RS — RS (www.rs-online.com) ►
►Шилд Wi-Fi Arduino. Используется в проек­
• SF — SparkFun (www.sparkfun.com) те 12, но может применяться в любом проекте
• SH — Smarthome (www.smarthome.com) Ethernet. АМР: А000058, А: А000058
• SS — Seeed Studio (www.seeedstudio.com) ►
►Шилд беспроводной связи Arduino. Исполь­
зуется в проектах 10, 13 и 14. АМР: А000064
или А000065, А: А000064 или А000065. Альтер­
Инфраструктура нативные шилды: SF: WRL-09976, AF: 126, F:
1848697, RS: 696-1670, SS: WLS114A0P

►Персональный компьютер. Используется во
всех проектах. ►
►Шилд RFID. Используется в проекте 27. АМР
(альтернатива): RFR105A1M, SF: DEV-10406,

►Ethernet-подключение к Интернету. Исполь­ А: Т040030 или Т040031
зуется во многих проектах.

►Шилд для музыкальных инструментов ком­

►Корпус для проекта. Используется в большин­ пании SparkFun. Используется в проекте 32.
стве проектов. АМР (альтернатива): SLD01104P, SF: DEV-10587
Где брать компоненты и прочее? 517


►Беспаечная макетная плата. Используется ►
►Считыватель RFID. Используется в проектах
в проектах 2, 3, 5, 6, 7, 9, 10, 11, 12, 19, 20, 21 25 и 26. АМР (альтернатива): AMP-G007, CR:
и 27. Альтернативно можно использовать шилды IDI003 или IDI004, SF: SEN- 08419
для прототипов для Arduino. AMP: АМР-Х002

►Метки RFID. Используются в проектах 25
или АМР-Х003, D: 438-1045-ND, J: 20723 или
и 26. AMP: АМР-Х031, CR: W0N002, SF: СОМ-
20601, SF: PRT-00137, F: 4692810, AF: 64, SS:
STR101C2M или STR102C2M, MS: MKKN2 10169


►Шилд для прототипов для Arduino. Исполь­ ►
►Модуль чтения/записи RFID SM130 компа­
зуется в проекте 26. Также может использоваться нии SonMicro. Используется в проекте 27. АМР
в качестве альтернативы беспаечным макетным (альтернатива): RFR105A1M, SF: SEN-10126
платам во всех проектах, но при этом все равно ►
►Теги чтения/записи RFID компании Mifare.
для них будет необходима маленькая макетная Используются в проекте 27. SF: SEN-10127
плата. AMP: А000082, AF: 51, А: А000024, SF:
DEV-07914, MS: MSMS01 ►
►Антенна на 13,56 МГц. Используется в проек­
те 27. А: С000027
• Макетные платы для прототипов: АМР:
АМР-Х008, SF: PRT-08802, входит в комп­ ►
►Считыватель карточек MicroSD. Можно при­
лект платы поставщика AF, D: 923273-ND обрести в любом магазине электроники или

►Перфорированная печатная плата. Исполь­ канцелярских принадлежностей. Используется
зуется в проектах 8 и 27. AMP: АМР-В016, в проектах 29 и 30.
D: V2018-ND, J: 616673, SS: STR125C2B, F: ►
►Карточка MicroSD. Используется в проектах
4903213, RS: 159-5420 29 и 30.

►Камера с возможностью IP-связи. Использу­
Модули связи ется в проектах 29 и 30. D-Link: DCS-930L

►Переходник USB/ТТЪтипа FTDI. Используется
в большинстве проектов. AMP: А000059, SF:
DEV-09718 или DEV-09716, AF: 70 или 284, А:
Адаптерные платы и разъемы
А000059, MS: MKAD22, D: TTL-232R-3V3 или ►
►Адаптер ХВее LilyPad. Используется в проек­
TTL-232R-5V те 14. AMP: DEV-08937, SF: DEV-08937

►Модуль Bluetooth Mate. Используется в про­ ►
►Адаптерная плата ХВее Explorer Regulated.
ектах 3, 4, 11, 18, 19 и 31. АМР (альтернатива): Используется в проекте 14. SF: WRL-09132
АМР-Х143, SF: WRL-09358 или WRL-10393

►Адаптерная плата для датчика газа. Исполь­

►ХВее радиомодули стандарта 802.15.4 компа­
зуется в проекте 13. SF: ВОВ-08891, Р: 1479 или
нии Bigi. Используются в проектах 10, 14 и 17.
1639
AMP: АМР-Х124, J: 2113375, SF: WRL-08664,
AF: 128, F: 1546394, SS: WLS113A4M, MS: ►
►Трехпроводный жгут с JST-разъемом. Исполь­
MKAD14 зуется в проекте 15. SF: SEN-08733

►USB/XBee адаптер. Используется в проектах ►
►Разъем для батарейки «Крона» 9 В. Исполь­
10, 14 и 17. AMP: DFR0174, J: 32400, SF: WRL- зуется в проектах 3 и 14. AMP: AMP-W003,
08687, AF: 247 D: 2238K-ND, J: 101470, SF: PRT-09518, F:

►Интерфейсный модуль. Однонаправленный 1650675
интерфейсный модуль стандарта Х10. Исполь­ ►
►Гнездовой разъем питания, 2.1 мм внут. диа­
зуется в проекте 26. SH: 1134В метр, 5,5 мм внешн. диаметр. Используется

►Модули X I0. Используются в проекте 26. SH: в проекте 3. AMP: АМР-Х042, D: CP-024A-ND,
2002 или 2000 J: 159506, F: 1737256
518 Приложение


►Провод для монтажа накруткой. Используется Общие компоненты
в проекте 5. CHD: 28604, D: K445-ND, J: 22577,
SF: PRT-08031, F: 150080 ►
►Сопротивление 100 Ом. Используется в проек­

►Инструмент для монтажа накруткой. те 8. АМР: AMP-R.100R.-10, Б: ЮОдВК-Ш, .1:
Используется в проекте 5. J: 242801, F: 441089, 690620, Р: 9337660, Ив: 707-8625
RSH: 276-1570, S: TOL-00068 ►
►Сопротивление 220 Ом. Используется в про­

►Штыревые соединители. Используются в про­ ектах 5, 8, 9, 11, 20 и 26. АМР: АМР-Я220К-
ектах 5, 10, 14, 15, 16, 19, 20, 25, 26 и 27. АМР: 10, Б: 220дВК-1ЧВ, 3: 690700, Р: 9337792, Ив:
АМР-Х013, D: A26509-20-ND, J: 103377, SF: 707-8842
PRT-0011, F: 1593411 ►
►Сопротивление 1 К. Используется в проектах 5,

►Гнездовые разъемы. Используются в проек­ 13,14,29 и 30. АМР: АМР-Ш К-10, Б: 1.0КдВК-
тах 10 и 14. CHD: 362520493, J: 2037747, D: N 0 ,3: 29663, Р: 1735061, Кв: 707-8669
3M9406-ND, F: 1776193 ►
►Сопротивление 10 К. Используется в проектах

►Гнездовой разъем 5-контактный. Использу­ 2, 6, 9, И, 12, 13, 14 и 20. АМР: АМР-К10К-10,
ется в проектах 25 и 26. CHD: 353302583, SF: В: ЮКдВК-ЫБ, 3: 29911, Р: 9337687, Бв: 707-
PRT-10519 8906


►Гнездовой разъем 7-контактный. Используется ►
►Сопротивление 4,7 К. Используется в проектах
в проектах 25 и 26. SF: PRT-10518 14 и 27. АМР: АМР-Я4К7-10, Б: СБ14Л4К70СТ-
ЫБ, 3: 691024, Р: 735033, Кв: 707-8693

►Этажерочный гнездовой разъем 6 контактов.
Используется в проекте 27. AMP: АМР-Х099, ►
►Потенциометр 10 К. Используется в проектах
SF: PRT-09280, AF: 85 10, 11, 13, 14, 27, 29 и 30. АМР: АМР-Х021, 3:
29082, 8Р: СОМ-09939, Р: 350072, Ив: 522-0625

►Восьмипроводниковый кабель. Используется
в проекте 27. D: AE08A-5-ND, F: 1301013 ►
►Сопротивление, 100 К. Используется в проек­
те 14. АМР: АМР-ЯШОК-Ю, Б: ЮОКдВК-ЫБ,

►Кабель интерфейса для GPS-модуля. Исполь­ 3: 29997, Р: 9337695, И8: 707-8940
зуется в проекте 19. SF: GPS-00465, Р: 28146

►Сопротивление, 270 К. Используется в проек­

►Адаптерная плата для считывателя RFID. те 31. СНВ: 63800, Л: 691446, В: Р270КВАСТ-
Используется в проектах 25 и 26. SF: SEN- ЫБ,Ив: 163-921, Р: 1565367
08423

►Светодиоды. Используются в проектах 7,8,10,

►Четырехжильный телефонный кабель с 11,20, 26, 29 и 30. АМР: АМР-Х009-К4, Б: 160-
разъемом RJ-11. Используется в проекте 26. 1144-ЫБ или 160-1665-ЫБ, 3: 34761 или 94511,
CHD: 985207210, D: A1642R-07-ND, J: 115617, Р: 1015878, И 8:247-1662 или 826-830,8Р: СОМ-
F: 1335141 09592 или СОМ-09590

►Зажимная клеммная колодка 2-контактная. ►
►Трехцветный диод с общим катодом. Исполь­
Используется в проектах 29 и 30. CHD: 38598, зуется в проекте 1. АМР: АМР-Х012, Б: 754-
SF: PRT-08432, D: 732-2030-ND, F: 1792766, RS: 1492-ЫВ, 3: 2125181, 8Р: СОМ-00105, Р:
189-5893 8738661, И8: 713-4888

►Зажимная клеммная колодка 3-контактная. О Инфракрасный светодиод. Используется
Используется в проектах 29 и 30. CHD: 64756, в проекте 9. АМР: АМР-ХОЮ, 3: 106526, 8Р:
SF: PRT-08235, D: 732-2031-ND, F: 1792767, RS: СОМ-09469, Р: 1716710, Б8: 577-538, 88:
710-0166 МТК102А2В

►Регулятор напряжения 5 В. Используется в
проектах 13,14 и 19. AMP: АМР-Х065, J: 51262,
Где брать компоненты и прочее? 519

Б: ЬМ7805СТ-Ш, вБ: СОМ-ООЮ7, Р: 1860277, Специальные компоненты


Ив: 298-8514

►Вольтметр. Используется в проекте 7. АМР:

►Регулятор напряжения 3,3 В. Используется АМР-Х032, SF: TOL-10285, F: 4692810, RS:
в проектах 10 и 14. О Ш : 9020002518, Л: 242115, 244890
Б: 576-1134-МЛ, БР: СОМ-00526, Р: 1703357,
ЯБ: 534-3021 ►
►Монитор напряжения МАХ8212. Исполь­
зуется в проекте 14. CHD: 8958297444, D:

►Конденсатор 1 мкФ. Используется в проек­ МАХ8212CPA+-ND, F: 1610130
тах 10 и 14. СШ>: 31890, Л: 94161, Б: Р10312-
N 0, Р: 8126933, 475-9009 ►
►Солнечная панель. Используется в проекте 14.
SF: PRT-07840, Р: 1691

►Конденсатор 10 мкФ. Используется в проектах
10, 14 и 15. АМР: АМР-СБЮИ-Ю, Л: 29891, Б: ►
►ЖК-дисплей, 16x2 символа. Используется
Р11212-Ш, Р: 1144605, ЯБ: 715-1638 в проекте 27. AMP: AMP-X100-FLA, SF: LCD-
00709

►Конденсатор 100 мкФ. Используется в проек­
тах 13 и 32. СНО: 16360, Л: 158394, Б: Р10269- ►
►Печатная плата для реле управления. Ис­
N 0, Р: 1144642, Ив: 715-1657 пользуется в проектах 29 и 30. SF: СОМ-09096


►Электролитический конденсатор 4700 мкФ. ►
►Реле. Используется в проектах 29 и 30. АМР (аль­
Используется в проекте 14. СРП): 17740409, тернатива): AMP-ВОЮ, CHD: 614437829, SF:
Л: 199006, Б: Р10237-ИИ, Р: 1144683, Ив: 711- СОМ-00101, D: T9AV1D12-12-ND, F: 1629059
1526 ►
►Диод 1N4148. Используется в проектах 29 и 30.

►Пара Дарлингтона NPN Т1Р120. Используется AMP: АМР-Х064-5, SF: СОМ-08588, F: 1081177,
в проекте 13. СНО: 47667, Б: Т1Р120-Ш, Л: D: 1N 4148TACT-ND, RS: 544-3480
32993, Р: 9804005 ►
►PowerSwitch Tail. Альтернативная деталь, ис­

►Силовой диод 1М4004. Используется в про­ пользуемая в проектах 29, 30. SF: СОМ-09842,
екте 13. АМР: АМР-Х045-4, Б: Ш4004-ЕЗ или АР: 268
2301-Ш , Л: 35992, Р: 9556109, К8: 628-9029

►Транзистор PNP 2Ш906. Используется в про­ Датчики
ектах 14, 29 и 30. АМР: АМР-Х035-5, Л: 178618,
Б: 2Ю 906Б262СТ-Ш , вБ: СОМ-00522, Р: ►
►Датчики изгиба. Используется в проекте 2.
1459017, Яв: 294-328 AMP: АМР-Х127, D: 905-1000-ND, J: 150551,
SF: SEN-10264, АР: 182, RS: 7081277, MS:

►Батарейка, 9 В. Используется в проектах 3 JM 150551
и 14.

►Переключатели или кнопки без фиксации по­

►Источник постоянного тока 9-12 В. Исполь­ ложения. Используются в проектах 2, 8,9 и 11.
зуется в проекте 13. АМР: ЕГИОООБ, Л: 170245, AMP: AMP-X026-Y, D: GH1344-ND, J: 315432,
вБ: Т0Б-00298, АБ: 63, Б: 636363, Р: 1463 SF: СОМ- 09337, F: 1634684, RS: 718-2213, MS:

►Литиево-ионная полимерная батарейка. JM315432
Используется в проекте 31. АМР: РКТ-00731, вБ: ►
►Резистивные датчики давления серии 400
РЯТ-00341, АБ: 258, Ив: 6152472, Р: 1848660 компании Interlink. Используются в проекте 5.

►Зарядное устройство ивВ для литиево-поли­ AMP: АМР-Х126, D: 1027-1000-ND, J: 2128260,
мерных батареек. Используется в проекте 31. SF: SEN-09673
А: 259, ББ: РЯТ-10217 ►
►Веб-камера. Используется в проекте 5.

►Фотодатчики (светочувствительные сопротив­
ления). Используются в проектах 6 и 12. АМР:
520 Приложение

АМР-Х016, D: PDV-P9200-ND, J: 202403, SF: Разное


SEN-09088, F: 7482280, RS: 234-1050

►Мячик для настольного тенниса. Используется

►Двухкоординатный джойстик. Используется
в проекте 1.
в проекте 8. AMP: DFR0061, J: 2082855, SF:
СОМ-09032, AF: 245, F: 1428461 ►
►Небольшая мягкая игрушка мартышка.
Используется в проектах 2 и 3.

►Акселерометр. Используется в проектах 8 и 21.
AMP: DRF0143, J: 28017, SF: SEN-00692, AF: ►
►Кот. Используется в проектах 5, 29 и 30.
163, RS: 726-3738, Р: 1247, MS: МКРХ7

►Подстилка для кота. Используется в проекте 5.

►Датчик газа компании Hanwei. Используется

►Куски фанеры или толстого картона, разме­
в проекте 13. AMP: SEN0127, SEN0128 или
ром приблизительно в размер подстилки для
SEN0134, SF: SEN-08880, SEN-09404 или SEN-
кота. Используются в проекте 5.
09405, Р: 1480, 1634, 1633, 1481, 1482 или 1483

►Светофильтры. Используются в проектах 6
И Инфракрасный дальномер GP2Y0A21 ком­
и 12.
пании Sharp. Используется в проекте 15. АМР:
АМР-Х129, D: 425-2063-ND, SF: SEN-00242, ►
►Семислойный гофрированный картон. Ис­
RS: 666-6570, Р: 136 пользуется в проекте 8.

►Ультразвуковой дальномер LV-EZ1 компа­ ►
►Застежка-липучка. Используется в проектах 8
нии MaxBotix. Используется в проектах 16 и 32. и 31.
АМР (альтернатива): SEN0001, SF: SEN-00639,

►Игрушка мартышка-цимбалист. Использу­
AF: 172, Р: 726, SS: SEN136B5B
ется в проекте 13.

►GPS-приемник ЕМ-406А. Используется в про­

►Отрезок токопроводящей ленты. Использу­
екте 19. АМР (альтернатива): SEN133D1P, SF:
ется в проекте 31. SF: DEV-10172
GPS-00465, Р: 28146, AF: 99

►Токопроводящие нитки. Используются в про­

►Цифровой компас LSM303DLH компании
екте 31. AMP: DEV-11791, SF: DEV-10120, L:
STMicroelectronics. Используется в проекте 20. А304
АМР (альтернатива): AMP-G006, SF: SEN-
09810, RS: 717-3723, Р : 1250 ►
►Токопроводящая ткань Shieldit Super. Ис­
пользуется в проекте 31. L: А1220-14

►Сенсорная кнопка со светодиодом. Исполь­
зуется в проекте 20. CHD: 648915066, SF: СОМ- ►
►Ветровка с капюшоном. Используется в про­
10443 и ВОВ-10467 екте 31.
№ Датчик температуры. Используется в про­ ►
►Нитки для вышивания. Используются в про­
ектах 29 и 30. AMP: АМР-В002, AF: 165, D: екте 31.
TMP36GT9Z-ND, F: 1438760, RS: 427-351
Где брать компоненты и прочее? 521

Аппаратное обеспечение Aboyd Company


Компания Aboyd поставляет художественные при­
Следующий список содержит всех поставщи­ надлежности и материалы, маскарадные костюмы,
ков аппаратного оборудования для проектов необычные поделки, картонные манекены, домаш­
из текущего и прошлых изданий книги. ние декорации и многое другое. Они также хороший
источник мартышек-цимбалистов Charley Chimp.
www.aboyd.com
Electronicparts info@aboyd.com
Компания Electronicparts является официальным Тел.: +1-888-458-2693
дистрибьютором модулей Arduino в России, а также
Тел.: +1-601-948-3477 — международный
производителем уникальных развивающих наборов
на базе контроллеров. Факс: +1-601-948-3479
PO. Box 4568
www.electronicparts.ru
Jackson, MS 39296, USA
arduino-spb@mail.ru
Тел.: +7-812-954-41-34
Acroname Robotics
195220, Санкт-Петербург
Компания Acroname продает широкий выбор дат­
ул. Политехническая, д. 29, Россия чиков и приводов для проектов по робототехнике
и электронике. Они предоставляют замечательный
Линуксцентр выбор узкоспециальных датчиков, таких как датчи­
ки ультрафиолетового излучения, решетки тепло­
Компания «Линуксцентр» (ЗАО «Мезон.ру») явля­ вых датчиков и камеры. Также у них есть много
ется официальным поставщиком модулей Arduino вариантов базовых дальномеров. А на своем сайте
в России, а также предлагает широкий выбор лите­ они предо^вляю т много хороших руководств по
ратуры по электронным компонентам. использованию их деталей.
www.linuxcenter.ru www.acroname.com
info@linuxcenter.ru info@acroname.com
Тел.: +7-812-309-06-86 Тел.: +1-720-564-0373
Факс: +7-812-640-49-90 Факс: +1-720-564-0376.
197022, Санкт-Петербург 4822 Sterling Dr.
пр. Медиков, д. 5, корп. 7, Россия Boulder, СО 80301-2350, USA

Abacom Technologies Arduino Store


Компания Abacom предоставляет ассортимент радио­ Магазин Arduino Store продает микроконтроллер-
передатчиков, приемников и приемопередатчиков, ные платы и шилды Arduino, а также компоненты
а также адаптерных модулей Ethemet/TTL-Serial. и принадлежности компании TinkerKit для Arduino,
выбранные командой Arduino. Также предлагаются
www.www.abacom-tech.com некоторые предпочитаемые командой Arduino при­
abacom@abacom-tech.com надлежности других сторонних производителей.
3210 Wharton Way http://store.arduino.cc/ww/
Mississauga ON L4X 2C1, Canada GHEO SA
Via Soldini, 22
СН-6830 Chiasso, Switzerland
522 Приложение

Atmel Digi
Компания Atmel изготавливает микроконтроллеры Компания Digi изготавливает радиомодули XBee,
AVR, на которых основаны модули Arduino, Wiring радиомодемы и мосты Ethernet.
и ВХ-24. Они также изготавливают микроконтрол­
YVYm.digi.com
лер ARM, используемый в модуле Маке.
Тел.: +1-877-912-3444
wYm.atmel.com
Факс: +1-952-912-4952
Тел.: +1-408-441-0311
11001 Bren Road
2325 Orchard Parkway
East Minnetonka, MN 55343, USA
San Jose, СA 95131, USA

CoreRFID Digi-Key Electronics


Компания CoreRFID продает широкий выбор счи­ Компания Digi-Key — одна из самых крупных роз­
тывателей и меток RFID и прочих продуктов RFID. ничных торговых фирм электронных компонентов.
Они основной источник постоянно используемых
www.rfidshop.com компонентов: сопротивлений, конденсаторов, разъ­
info@corerfid.com емов, некоторых датчиков, макетных плат, провода,
Тел.: +44(0)845-071-0985 припоя и многого другого.
Факс: +44 (0) 845-071-0989 Yvww.digikey.com
Dallam Court, Dallam Lane Тел.: +1-800-344-4539 или
Warrington, WA2 7LT, United Kingdom Тел.: +1-218-681-6674
Факс: +1-218-681-3380
D-Link 701 Brooks Avenue
Компания D-Link изготавливает устройства USB, South Thief River Falls, MN 56701, USA
Ethernet и Wi-Fi, включая Wi-Fi-камеру, используе­
мую в главе 10.
YYYm.dlink.com ELFA
productinfo@dlink.com Компания ELFA — один из самых крупных по­
Тел.: +1-800-326-1688 ставщиков электронных компонентов Северной
Ирландии.
Devantech/Robot Electronics Ymw.elfa.se
Компания Devantech изготавливает ультразвуковые export@elfa.se
дальномеры, электронные компасы, жидкокристал­ Тел.: +46 8-580-941-30
лические дисплеи, драйверы двигателей, релейные
S-175 80 Jarfalla, Sweden
контроллеры и другие полезные дополнительные
модули для микроконтроллерных проектов.
http://robot-electronics.co.uk Farnell
sales@robot-electronics.co.uk Компания Farnell поставляет электронные компо­
Тел.: +44(0)195-345-7387 ненты для всей Европы. Номера деталей их ката­
Факс: +44 (0)195-345-9793 лога такие же, как и номера деталей каталога ком­
пании Newark In One Electronics в США, поэтому,
Maurice Gaymer Road
если вы работаете по обе стороны Атлантики, ис­
Attleborough пользовать компанию Farnell в качестве источника
Norfolk, NR17 2QZ, England компонентов может быть особо удобным.
Где брать компоненты и прочее? 523

http://uk.farnell.com Gridconnect
sales@farnell.co.uk
Компания Gridconnect служит дистрибутором се­
Тел.: +44-8701-200-200 тевых продуктов, включая продукты компаний
Факс: +44-8701-200-201 Lantronix и Digi.
Canal Road, www.gridconnect.com
Leeds, LSI2 2TU, United Kingdom sales@gridconnect.com
Тел.: +1 630-245-1445
Figaro USA, Inc. Факс: +1 630-245-1717
Компания Figaro продает ряд газовых датчиков, Тел.: +1-800-975-GRID (4743) (бесплатный)
включая датчики летучих органических соедине­ 1630 W. Diehl Road
ний, угарного газа, кислорода и многие другие. Naperville, IL 60563, USA
www.figarosensor.com
figarousa@figarosensor.com Images SI, Inc.
Тел.: +1-847-832-1701
Компания Images SI продает компоненты для ро­
Факс: +1-847-832-1705 бототехники и электроники. Они предоставляют
3703 West Lake Ave., Suite 203 выбор компонентов RFID, резистивных датчиков
Glenview, IL 60026, USA давления, датчиков растяжения, датчиков газа, на­
боры для проектов электронных устройств, наборы
для проектов распознавания речи, компоненты для
Future Technology Devices солнечной энергетики, а также микроконтроллеры.
International, Ltd. +(FTDI) www.imagesco.com
Компания FTDI изготавливает ряд адаптерных imagesco@verizon.net
микросхем USB/TTL-Serial, включая микросхему Тел.: +1-718-966-3694
FT232RL, которой оснащены модули во многих Факс: +1-718-966-3695
проектах книги.
109 Woods of Arden Road
www.ftdichip.com Staten Island, NY 10312, USA
adminl@ftdichip.com
Тел.: +44 (0) 141-429-2777
Interlink Electronics
373 Scotland Street
Компания Interlink изготавливает резистивные дат­
Glasgow, G5 8QB, United Kingdom
чики давления, сенсорные панели и другие устрой­
ства ввода.
Glolab www.interlinkelectronics.com
Компания Glolab изготавливает ряд электронных specialty@interlinkelectronics.com
наборов и модулей, включая несколько интересных Тел.: +1-805-484-8855
радио- и инфракрасных передатчиков, приемников Факс: +1-805-484-8989
и приемопередатчиков.
546 Flynn Road
www.glolab.com Camarillo, СА 93012, USA
lab@glolab.com
524 Приложение

lOGear Keyspan
Компания IOGear изготавливает компьютерные Компания Keyspan изготавливает компьютерные
адаптеры. В частности, они предоставляют хоро­ адаптеры. Предоставляемые ими адаптеры USB/
шего качества адаптеры USB/TTL-Serial, а также TTL-Serial серии USA-19xx очень удобны для ис­
продукты Powerline Ethernet. пользования с микроконтроллерами.
www.iogear.com www.keyspan.com
sales@iogear.com info@keyspan.com
Тел.: +1-510-222-0131 — для информации и заказов
Тел.: +1-866-946-4327 (бесплатный)
Тел: +1-510-222-8802 — поддержка
Тел.: +1-949-453-8782
Факс: +1-510-222-0323
Факс: +1-949-453-8785
4118 Lakeside Dr.
23 Hubble Drive
Richmond, СА 94806, USA
Irvine, СА 92618, USA

Jameco Electronics Lantronix


Компания Lantronix изготавливает модули Ethernet/
Компания Jameco поставляет массовые и отдель­
TTL-Serial: модули XPort, WiPort, WiMicro, Micro и
ные электронные компоненты, кабели, макетные
многие другие.
платы, инструменты и прочие основные компонен­
ты для энтузиастов или профессионалов в области www.lantronix.com
электроники.
sales@lantronix.com
http://jameco.com
Тел.: +1-800-526-8766
domestic@jameco.com
Тел.: +1-949-453-3990
international@j ameco.com
Факс: +1-949-450-7249
custservice@j ameco.com
5353 Barranca Parkway
Тел.: +1-800-831-4242 — Бесплатный телефон для Irvine, СА 92618, USA
заказов 24 часа в сутки
Тел.: +1-650-592-8097 — Телефон для международ­
ных заказов
Libelium
Компания Libelium изготавливает продукты на
Факс: +1-650-592-2503 — Международный
основе ХВее и другие беспроводные продукты.
Факс: +1-800-237-6948 — Международный бес­
www.libelium.com
платный
info@libelium.com
Факс: +001-800-593-1449 — Бесплатный для
Мексики Libelium Comunicaciones Distribuidas S.L.
Факс: +1-803-015-237-6948 — Бесплатный для Maria de Luna 11, Instalaciones
Индонезии
CEEIARAGON, C.P: 50018
1355 Shoreway Road
Zaragoza, Spain
Belmont, СА 94002, USA
Где брать компоненты и прочее? 525

Linx Technologies Making Things


Компания Linx изготавливает ряд радиоприемни­ Компания Making Things изготавливает контроллер
ков, передатчиков и приемопередатчиков. MAKE, и была первым изготовителем контролле­
ров Teleo (в настоящее время сняты с производства).
www.linxtechnologies.com
Они также разрабатывают специальные решения
info@linxtechnologies.com для проектирования аппаратных платформ.
Тел.: +1-800-736-6677 — США www.makingthings.com
Тел. : +1 -541 -471 -6256 — международный info@makingthings.com
Факс:+1-541-471-6251 Факс:+1-415-255-9513
159 Ort Lane 1020 Mariposa Street, #2
Merlin, OR 97532, USA San Francisco, СА 94110, USA

Low Power Radio Solutions Maxim Integrated Products


Компания LPRS изготавливает ряд радиоприемни­ Компания Maxim изготавливает датчики, микросхе­
ков, передатчиков и приемопередатчиков. мы связи, микросхемы управления энергопотреб­
www.lprs.co.uk лением и многое другое. Ей также принадлежит
компания Dallas Semiconductor. Совместно эти две
info@lprs.co.uk компании представляют один из самых крупных
Тел.: +44-1993-709418 источников микросхем в области последовательной
связи, датчиков температуры, управления жидко­
Факс: +44-1993-708575 кристаллическими дисплеями и многого другого.
Two Rivers Industrial Estate www.maxim-ic.com
Station Lane, Witney
info2@maxim-ic.com
Oxon, 0X28 4BH, United Kingdom Тел.: +1-408-737-7600
Факс: +1-408-737-7194
Maker SHED 120 San Gabriel Drive
Компания Maker SHED первоначально была соз­ Sunnyvale, СА 94086, USA
дана, как источник прошлых выпусков журнала
МАКЕ. В настоящее время компания предоставля­
ет разнообразные компоненты для самоделкиных, Microchip
художественных ремесленников и перспективных Компания Microchip изготавливает семейство ми­
ученых. кроконтроллеров PIC. Они предоставляют широкий
www.makershed.com выбор микроконтроллеров практически для любой
вообразимой цели.
help@makershed.com
www.microchip.com
Тел.: +1-800-889-8969
Тел.: +1-480-792-7200
1005 Gravenstein Hwy N.
2355 West Chandler Blvd.
Sebastopol, СА 95472, USA
Chandler, AZ, 85224-6199, USA
526 Приложение

Mouser New Micros


Компания Mouser является крупным розничным Компания New Micros продает разные микрокон-
продавцом электронных компонентов в США. Они троллерные модули. Они также продают переход­
поставляют большинство основных компонентов, ники USB/XBee, которые позволяют очень удобно
используемых в проектах этой книги, — такие подключать к компьютеру радиомодули ХВее ком­
как сопротивления, конденсаторы, а также некото­ пании Digi. Эти переходники оснащены всеми не­
рые датчики. У них можно приобрести и кабель- обходимыми линиями для обновления микропро­
переходник USB/TTL-Serial типа FTDI. граммного обеспечения радиомодулей ХВее через
последовательный порт.
www.mouser.com
www.newmicros.com
help@mouser.com
nmisales@newmicros.com
1000 North Main Street
Тел.:+1-214-339-2204
Mansfield, TX 76063, USA

Parallax
NetMedia
Компания Parallax изготавливает семейство микро­
Компания NetMedia изготавливает микроконтрол- контроллеров Basic Stamp. Они также изготавлива­
лерный модуль ВХ-24 и модуль Ethernet SitePlayer. ют микроконтроллер Propeller, широкий выбор дат­
www.basicx.com чиков, наборов для начинающих, роботов и других
полезных инструментов для людей, заинтересован­
siteplayer.com ных в проектах по электронике и микроконтрол­
sales@netmedia.com лерах.

Тел.: +1-520-544-4567 www.parallax.com

Факс: +1-520-544-0800 sales@parallax.com

10940 N. Stallard Place Тел.: +1-888-512-1024 — бесплатный для заказов

Tucson,AZ 85737, USA Тел.: +1-916-624-8333 — офис/международный


Факс: +1-916-624-8003

Newark In One Electronics 599 Menlo Drive


Rocklin, California 95765, USA
Компания Newark поставляет электронные компо­
ненты в США. Номера деталей их каталога такие
же, как и номера деталей каталога компании Famell Phidgets
в Европе, поэтому, если вы работаете по обе сто­
роны Атлантики, использовать компании Famell и Компания Phidgets изготавливает модули ввода
Newark в качестве источников компонентов может и вывода для подсоединения настольных компью­
быть особо удобно. теров и ноутбуков к физическому миру.

www.newark.com www.phidgets.com
somewhere@something.com sales@phidgets.com
Тел.: +1-773-784-5100 Тел.: +1-403-282-7335
Факс:+1-888-551-4801 Факс: +1-402-282-7332
4801 N. Ravenswood 2715А 16ANW
Chicago, IL 60640-4496, USA Calgary, Alberta T2M3R7, Canada
Где брать компоненты и прочее? 527

PoloSu Roving Networks


Компания PoloJu изготавливает разнообразные Компания Roving Networks изготавливает и продает
электронные компоненты и адаптерные платы для радиомодули Bluetooth для изготовителей электрон­
роботехники и других проектов. ных продуктов. Модули Bluetooth Mate компании
SparkFun основаны на этих радиомодулях.
www.poloIu.com
www.rovingnetworks.com
www@pololu.com
info@rovingnetworks.com
Тел.: +1-702-262-6648
Тел.: +1-408-395-6539
Тел.: +1-877-776-5658 — только для США
Факс:+1-603-843-7550
Факс: + 1-702-262-6894
102 Cooper Court
3095 Е. Patrick Ln. #12
Los Gatos, CA 95032, USA
Las Vegas, NV 89120, USA

RadioShack RS Online
Урааа! В RadioShack начали осознавать, что ры­ Один из самых крупных европейских розничных
нок электронных компонентов для самоделкиных в торговцев электронными компонентами. Продают
США никогда не пропадал, и они снова предостав­ свои товары по всему миру.
ляют широкий выбор компонентов. К тому време­
www.rs-online.com
ни, когда вы будете читать этот материал, возмож­
но, что они также будут иметь в наличии и модули general@rs-components.com
Arduino. Узнайте номера требуемых вам деталей на
Тел.: 0845-850-9900
их веб-сайте и позвоните в свой местный магазин,
чтобы узнать, есть ли они у них. Это сэкономит вам Факс: 01536-405678
время.
www.radioshack.com Samtec
Компания Samtec изготавливает разъемы для элек­
Reynolds Electronics тронной техники. Они предлагают широкий вы­
бор разъемов, поэтому, если вам требуется что-то
Компания Reynolds Electronics изготавливает не­
необычное в этом плане, они, скорее всего, его из­
сколько небольших наборов для радио- и инфра­
готавливают.
красной связи, инфракрасного дистанционного
управления, а также другие полезные модули рас­ www.samtec.com
ширения функциональности для микроконтроллер-
info@samtec.com
ных проектов.
Тел.: +1-800-S АМТЕС-9
www.rentron.com
sales@rentron.com
Тел.: +1-772-589-8510
Факс: +1-772-589-8620
12300 Highway AIA
Vero Beach, Florida, 32963, USA
528 Приложение

Seeed Studio SparkFun Electronics


Компания Seeed Studio изготавливает разные по­ Компания SparkFun делает легким использование
лезные и оригинальные электронные компоненты с разного типа электронных компонентов. Они изго­
открытым аппаратным обеспечением. тавливают адаптерные платы для датчиков, радио и
регуляторов мощности, а также продают большой
www.seeedstudio.com
ассортимент микроконтроллерных платформ.
techsupport@seeedstudio.com
www.sparkfun.com
Тел.: +86-755-26407752
spark@sparkfun.com
Room 0728, Bid 5,
2500 Central Avenue, Suite Q
Dong Hua Yuan,
Boulder, CO 80301, USA
NanHai Ave. NanShan dist.
Shenzhen 518054 China Symmetry Electronics
Компания Symmetry реализует радиомодули ZigBee
SkyeTek и Bluetooth, адаптеры Ethemet/TTL-Serial, моду­
ли Wi-Fi, сотовые модемы и другие электронные
Компания SkyeTek изготавливает считыватели,
устройства связи.
устройства записи и антенны RFID.
www.semiconductorstore.com
www.skyetek.com
Тел.: +1-877-466-9722
Тел.: +1-720-565-0441
Тел.: +1-310-643-3470 — международный
Факс: +1-720-565-8989
Факс:+1-310-297-9719
11030 Circle Point Road, Suite 300
5400 West Rosecrans Avenue
Westminster, CO 80020, USA
Hawthorne, СА 90250, USA

Smarthome
Компания Smarthome изготавливает широкий ас­
TI-RFID
сортимент устройств домашней автоматизации, Отдел RFID компании Texas Instruments. Изготав­
включая камеры, контроллеры домашних бытовых ливают считыватели и метки RFID для разных про­
приборов, как стандарта X I0, так и INSTEON. токолов и частотных диапазонов.
www.smarthome.com www.tiris.com
custsvc@smarthome.com Тел.: +1-800-962-RFID (7343)
Тел.: 1-800-762-7846 Факс: +1-214-567-RFID (7343)
Тел.: + 1-800-871-5719 — для Канады Radio Frequency Identification Systems
Тел.: +1-949-221-9200 — международный 6550 Chase Oaks Blvd., MS 8470
16542 Millikan Avenue Plano, TX 75023, USA
Irvine, СА 92606, USA
Где брать компоненты и прочее? 529

Trossen Robotics Uncommon Projects


Компания Trossen Robotics предлагает на продажу Изготавливает YBox — устройства для наложения
широкий ряд принадлежностей для RFID и робото­ текста, которое выводит текст с веб-каналов на те­
техники. У них есть в запасах много хороших датчи­ левизор.
ков, включая резистивные датчики давления компа­
www.uncommonproj ects.com
нии Interlink, линейные приводы, наборы Phidgets,
считыватели RFID, а также метки для большинства ybox.tv
частотных диапазонов RFID. info@uncom monproj ects.com
www.trossenrobotics.com
68 Jay Street #206
jenniej@trossenrobotics.com
Brooklyn, NY 11201, USA
Тел.: +1-877-898-1005
Факс:+1-708-531-1614
1 Westbrook Со. Center, Suite 910
Westchester, IL 60154, USA

Программное обеспечение AVRIib


Большинство используемого в этой книге Библиотека функций языка С для разнообразных
программного обеспечения распространяет­ задач с использованием процессоров AVR. Может
ся с открытым исходным кодом. В следующем исполняться под Windows, Linux и Mac OS X как
списке любое программное обеспечение, ко­ библиотека для компилятора avr-gcc.
торое не является таковым, явно обозначено hubbard.engr.scu.edu/avr/avrlib
как коммерческое приложение. Если такого
обозначения нет, можно считать приложение
открытым. avr-gcc
Компилятор С и ассемблер для микроконтролле­
ров AVR. Может исполняться под Windows, Linux
Arduino и Mac OS X.
Arduino — это среда программирования для микро­ www.avrfreaks.net/AVRGCC
контроллеров AVR, основана на среде программиро­
вания Processing. Может исполняться под Windows,
Linux и Mac OS X. CCS с
www.arduino.ee Коммерческий компилятор языка С для микрокон­
троллеров PIC. Может исполняться под Windows
и Linux.
Asterisk www.ccsinfo.com
Программный PBX1 контроллер телефонии.
Исполняется под Linux и UNIX.
CoolTerm
www.asterisk.org
Бесплатная программа терминала последователь­
ной связи для Windows и Mac OS X, автор Роджер
Майер (Roger Meier).
1 PBX, Private branch exchange — учрежденческая автоматиче­
ская телефонная станция. http://freeware.the-meiers.org
530 Приложение

Dave's Telnet Java


Приложение telnet для Windows. Язык программирования. Может исполняться под
http://dtelnet.sourceforge.net Windows, Linux и Mac OS X, а также на многих
встроенных системах.
Eclipse http ://j ava.sun.com
Среда IDE2 для разработки программного обеспе­
чения на многих разных языках. Расширяемая бла­ Macam
годаря модульной архитектуре, содержит ссылки
Драйвер веб-камеры для Mac OS X.
на компиляторы для большинства основных язы­
ков программирования. Может исполняться под http://webcam-osx.sourceforge.net/
Windows, Linux и Mac OS X.
www.eclipse.org Max/MSP
Коммерческое средство разработки программ по­
Evocam средством создания блок-схем потока данных. По­
Коммерческое приложение веб-камеры для Mac OS X. зволяет создавать программное обеспечение, со­
единяя графические объекты вместо написания тек­
http://evological.com
стового кода. К Мах подключена библиотека MSP
для обработки аудиосигналов в режиме реального
Exemplar времени и библиотека Jitter для обработки видео­
сигналов в режиме реального времени. Может ис­
Средство для создания приложений для датчиков
полняться под Windows и Mac OS X.
предоставлением примеров, а не программирова­
нием. Может исполняться под Windows, Linux и www.cycling74.com
Mac OS X как модуль для Eclipse.
http://hci.stanford.edu/research/exemplar PEAR
Репозиторий расширений и приложений для РНР3.
Fwink Содержит библиотеки расширений для сценариев
Приложение веб-камеры для Windows. РНР.
www.lundie.ca/fwink http://pear.php.net

Girder РНР
Коммерческое приложение домашней автоматиза­
Язык сценариев, специально предназначенный для
ции для Windows.
веб-разработки. Его сценарии могут вставляться
www.girder.nl в код HTML. Может исполняться под Windows,
Linux и Mac OS X.
GitHub www.php.net
Хост для get — средства управления версиями
исходного кода программ на любом языке. Инст­
рументы git и github позволяют с легкостью предо­ PicBasic Pro
ставлять код для общего использования.
Коммерческий компилятор BASIC для микрокон­
http ://git-scm.com
троллеров PIC. Исполняется под Windows.
https://github.com
http://melabs.com
2 IDE, Integrated development environment — интегрированная
среда разработки. 3 РНР Extension and Application Repository.
Где брать компоненты и прочее? 531

Processing Sketchtools NADA


Язык и среда программирования, предназначенные Инструмент-посредник для подсоединения сред
для пользователей, не обладающих большими тех­ программирования к аппаратным устройствам.
ническими знаниями и навыками, но желающих Изначально коммерческий инструмент, в настоящее
создавать программы для обработки изображений, время средство с открытым исходным кодом.
анимации и взаимодействий. Может исполняться
http://code.google.eom/p/nadamobile/
под Windows, Linux и Mac OS X.
www.processing.org
TinkerProxy
Puredata (PD) Приложение-посредник для предоставления прило­
жениям Flash доступа к последовательным портам
Графическое средство разработки программ по­ компьютера.
средством создания блок-схем потока данных.
Позволяет создавать программное обеспечение, со­ http://code.google.eom/p/tinkerit/wiki/TinkerProxy
единяя графические объекты вместо написания тек­
стового кода. Разработано одним из разработчиков
средства Мах, Миллером Пакета (Miller Puckette).
Twilio
Может исполняться под Windows, Linux и Mac OS X. Коммерческий поставщик услуг 1Р-телефонии.
http://puredata.info Они предоставляют интерфейсы API, позво­
ляющие использовать телефонные звонки с веб­
приложениями.
putty ssh www.twilio.com
Клиент telnet, SSH и последовательного порта для
Windows.
UDP Library for Processing
www.puttyssh.org
Библиотека для UPD-связи с Processing. Может ис­
полняться под Windows, Linux и Mac OS X, как би­
QR Code Library блиотека для Processing.

Набор библиотек для кодирования и декодирования http://ubaa.net/shared/processing/udp/


двумерных штрихкодов QR Code. Может испол­
няться под Windows, Linux и Mac OS X, как библио­
Wiring
тека для Java.
Wiring — это среда программирования для микро­
http://qrcode.sourceforge.jp
контроллеров AVR, основана на среде программиро­
вания Processing. Может исполняться под Windows,
Dan Shiftman's Processing Libraries Linux и Mac OS X.
www.wiring.org.co
Дан Шифман (Dan Shiffman) разработал несколько
полезных библиотек для Processing, включая биб­
лиотеку pqrcode, используемую в этой книге. Он
также разработал библиотеку SFTP (www.shiffman.
net/2007/06/04/sftp-with-j ava-processing) и биб­
лиотеку для датчиков обнаружения резких движе­
ний для Mac OS X (www.shiffman.net/2006/10/28/
processingsms).
ГН У/Линуксцентр
Авторизованныйдистрибьюторведущихмировыхироссийскихпроизводителей
свободного ПОидистрибутивовбМШпих

иШ -ЭКСПЕРТ
ДЛЯ ВАШЕГО БИЗНЕСА
йгооопум

Мы продаем всё, Мы реш аем лю бые задачи, связанны е е СРШ/Ыпшс:


что связано с вМи/ЦЬшх: ф миграции рабочих станций и серверов в том числе с помощью эмуляторов
О дистрибутивы бШ /Упих и 8$0 навШ /Упих с других операционных Ыгга и ъ Ш Ф й ж в Н
0 свободное программное обеспечение систем ф техническое сопровождение рабочих
Ф аппаратное обеспечение ф запуск КлПредлршша и другого станций и серверов под управлением
Ф журналы, книги, атрибутика ПО на рабочих станциях и серверах ОМЦ/Упух
Ф купоны на техническую поддержку под управлением Ш Ш г т х , Ф обучение работе с 6М1Шпих

+7(499)271 4954 (Москва) « +7 (812) 309 0686 (Санкт-Петербург) • www.linuxcenter.ru


п ред м етн ы й у к а за тел ь

А н
ACN 503 HTML5 459,507
Android 464— 466 HTTP
Apache, модуль M O D R E WRITE 511 запросы, вставка параметров 123
Арр Inventor 465 операторы 125
Arduino 49 GET 123, 124
аналоговый ввод 63 POST 125, 126, 147
вводы и выводы платы 54 переменные среды 417
клоны 49 протокол 122
коммуникационные опции 489
компоненты платы 54 I
подсоединение компонентов 62
I2C 347
среда IDE 49
установка ПО 54, 55
цифровой ввод 63
J
шилды 50 JitterBox 108
ASCII 89 JSON 505

В м
Bluetooth 69—71,79,99— 101, 104— 107 MIDI 496, 497
MiniMod 342
Mifare 400, 406
С
MoSync 460
Chat server. См. сервер групповых дискуссий
CoolTerm 45,48 N
Nano 41,42
NFC 391
DDNS 450
DMX512 503 О
DNS 450 OpenCelllD 320
OpenSSH 38
G
Google ADK 484
P
Google Voice 429 PhoneGap 460
GPRS 463 PHP 35, 37, 38, 4 2 -4 5
GPS 314, 316, 320—322, 327, 334, 337—339 загрузка файла 141,142
GPS-приемник 342 исполнение сценариев 43
534 Предметный указатель

переменные среды 45 V
SFILES 141
Virtual Terrain Project 319
$_GET 45
VoIP 454
$_POST 45
$_REQUEST 45, 123
работа с электронной почтой 127, 128 w
PostScript 89 Worldkit 319
Power Switch Tail 435
Processing 34—37,44,49, 50, 57, 58,467, 468 X
PuTTY 38, 39,45—47
XBee
адаптерная плата 242
Q обнаружение узлов 280
QuickTime 143 пакет 292
XML 455
R
REST 507—509
А
RFID Адаптер
метки 378, 391, 399,400 Arduino LilyPad 252
метки Mifare 400,406 Arduino USB/Serial 72
считыватели FTDI Basic 72
ID Innovations 379 FTDI Friend 72
SonMicro 396 USB/RS-232 75
SM130 391—393 USB/TTL-Serial 75,79
RS-232 74—79, 99 USB/XBee 241
RS-485 503 Адрес
localhost. См. адрес кольцевой
s кольцевой 120
локального узла. См. адрес кольцевой широко­
SCL, линия 347
вещательный UDP 276
SDA, линия 347
Адрес 2007 313,354
SDK Android 465
Адреса
SD-карта 441,442
IP 116— 119
SIMbaLink 485
MAC 116,117
SIP 453
Акселерометр
SMS 429,461
ADXL320 317
ADXL335 314
T
Антенна
TCP/IP 158 для считывателя RFID SM130 358
Telnet 38 прямая проволочная 236
Twilio 455 Асинхронный обмен данными 74
TwiML 454—456
Б
u Балансировочная доска 207, 208, 211
UART 489 Батарейка «Крона» 30
UDP 277, 278, 280, 299, 305, 306 Беспаечные макетные платы 34
Unicode 89 Беспроводная связь
USB-кабели 30 инфракрасная 228, 231, 232
Предметный указатель 535

недостатки 227,228 3
устройства 229
Зарядное устройство
Библиотека
LiPo Charger Basic - Micro USB 472
BtSerial 477
Button 345 USB Lilon/LiPoly charger 472
Ethernet 161 Защитные очки 30
Защитный интервал 243
LSM303DLH 345
Зиготы 223
Multi Camera 233
Network 277
OpenCV 364 И
pqrcode 373
Идентификация
SoftwareSerial 382,497
RFID 376—379
SonMicro 409
SonMicroReader 399 физических объектов 362
TextFinder 176,177 Индикация хода выполнения 67
WinVDIG 143 Индукция 236
Wire 343 Инструменты 28
Wise 345 длинногубцы 30
X10 382,383 для монтажа накруткой 113
Биометрический мониторинг 470 для снятия изоляции 30
Буфер последовательный 97 защитные очки 30
кусачки 30
В мини-отвертка 30
мультиметр 30
Вольтметр, калибровка 172 осциллограф 30
Время реакции обратной связи 194 отсос для удаления припоя 30
паяльник 29
Г припой 30
Геокодирование 319 тестовые проводники 30
Гнездовые разъемы 34 третья рука 30
Интегральная схема МАХ8212 301
д Интервал, защитный 243
Интерфейс
Дальномер
GP2Y0A21 314,315,488 I2C 347
GP2Y0A21YK 322 RS-232 77
LV-EZ1 314,315,322,490 RS-485 503
ультразвуковые 325 SPI 159, 160
Датчик TWI См. Протокол I2C
газа, MQ-6 287 голосовой 432
света, TAOS TCS230 367 на основе браузера 431
цвета, TAOS TCS230 367 на основе сообщений SMS или электронной
Дейтаграмма 276 почты 431
Делитель напряжения 63 на основе специального приложения 431
Джойстик 202, 203 на основе текстовых сообщений 461
Динамическая DNS 450 принципы выбора 431
Диоды 33 программный 24
Длинногубцы 30 физический 24, 67
Дребезг контактов 206 электрический 24
536 Предметный указатель

Инфракрасная связь 228,231,232


Исполнение приложения Android 466
Макетная плата 31
Источник постоянного тока 30
Маска подсети 117
Местонахождение, определение 317—321
К Метки
Кабели RFID 391
Ethernet 32 Mifare 400,406
USB 30 запись 399,400
USB-A/Mini-B 72 Метод
USB/TTL-Serial 72, 75, 76 analogRead() 203
Камеры 450, 451 beginPacket() 279
Каскады 369 blink(), дуплексная связь ХВее 250
Клетка Фарадея 237 blink(), скетч Bluetooth Analog Duplex sender 260
Ключ\¥ЕР 266 BTConnect(), скетч Bluetooth Analog Duplex
Кнопки 33 sender 261
Кожно-гальваническая реакция 470 BTDisconnect(), скетч Bluetooth Analog Duplex
Команда sender 262
+++ 280 buttonRead(), скетч Bluetooth Analog Duplex
$$$ 255 sender 260
ATDL 298 checkTags(), проверка меток RFID 390
ATIS 288 connectToServer() 179
ATMY 280, 298 connectToServer(), веб-клиент для Twitter RFID
ATND 280 413
ATNI 281 connect(), регистратор данных 481
ATRE 286 decoderEvent(), считыватель QR-кодов 375
ATVR 281 display(), работа с модулем RFID SonMicro 405
available() 161 display(), регистратор данных 483
connected() 161 doButtonAction(), работа с модулем RFID
devmgmt.msc 46 SonMicro 404
mode character 197 draw()
ping 119, 120 GPS parser 338, 339
set mode stream 197 измеритель уровня сигнала радио ХВее 329
SO,ВТ 256 наклон акселерометра 353
Командная строка 37—39 обнаружение лиц с помощью OpenCV 370
Коммутатор 115 определитель версии микропрограммы считы­
Компас LSM303DLH 314,316,343—345 вателя SonMicro 397
Конденсаторы 32, 33 работа с модулем RFID SonMicro 402
Контакты из токопроводящей ткани 474 регистратор данных 479,480
Крен 347—351 скетч Распознавание цвета с OpenCV 365, 366
«Крона» 30 сервера сетевого пинг-понга 215
Кусачки 30 считыватель QR-кодов 374
считыватель RFID ID 12 381
drawArrow(), GPS parser 339
Л
drawButtons(), работа с модулем RFID SonMicro
Лев 425 403
Линия drawGame() 217,218
SCL 347 drawGraph() 308
SDA 347 drawGraph(), проект сетевого кота 135, 136
Предметный указатель 537

drawReadings() 308, 309 makeResponse() 296,297


endPacket() 279 makeResponse(), проект RGB-сервера 166, 167
formatData(), регистратор данных 482 minutesToDegrees(), GPS parser 341
getAverageReading() 297 mousePressed()
getData(), регистратор данных 481 работа с модулем RFID SonMicro 404
getDecodedString(), считыватель QR-кодов 375 скетч распознавания цвета c OpenCV 367
getGGA(), GPS parser 341 moveBall() 218,219
getGSV(), GPS parser 341 movePaddle() 210,212
getLastState(), регистратор данных 483 newGame() 219
getRMC(), GPS parser 340 noteOff(), демо инструмента General MIDI 500
getTime(), регистратор данных 482 noteOn(), демо инструмента General MIDI 500
handleSerial(), дуплексная связь XBee 250 parseData() 294, 307
handleSerial(), скетч Bluetooth Analog Duplex parseData(), измеритель уровня сигнала радио
sender 262, 263 XBee 330
isPressed(), регистратор данных 483 parseString(), GPS parser 339
keyReleased() 198 pause(), регистратор данных 480
Определитель версии микропрограммы pause(), тестирование Processing для Android 469
считывателя SonMicro 397 playStinger(), Stinger player 502
Считыватель QR-кодов 374 postPicture() 145, 146
keyTyped(), работа с модулем RFID SonMicro postPicture(), проект сетевого кота 151
403, 404 readAcceleration(), считыватель акселерометра 351
listenO 278, 279 readByte(), проверка меток RFID 389
listenToClient() 296 readResponse(), веб-клиент для Twitter RFID 413
listenToClients() 216,217 readSensor(), дуплексная связь XBee 250
HstenToSerialO 292—294 readSensor(), считывание термодатчика
loopO и управление реле
Stinger player 501 исходная версия 438
демо инструмента General MIDI 499 receive() 277
дуплексная связь XBee 250 resetBall() 220
веб-клиент для Twitter RFID 411,412 resetMidi(), Stinger player 502
веб-сервер с чтением карточки SD 443 resume(), тестирование Processing для Android 469
ИК дальномер с датчиком Sharp GP2xx 323 scrollLongStringO, веб-клиент для Twitter RFID
ИК управление камерой 235 412
клиента джойстика 205,206 sendData(), регистратор данных 482
проверка ЖК-дисплея 408 sendFile(), веб-сервер с чтением карточки SD 446
проверка меток RFID 389 sendHttpHeader(), веб-сервер с чтением
скетч Bluetooth Analog Duplex sender 259, 260 карточки SD 446
скетч компаса 346 sendMail(), проект сетевого кота 137, 138, 151
считыватель акселерометра 351 sendMidi(), демо инструмента General MIDI 500
считыватель акселерометра через I2C 352 sendPacket() 279, 280
считыватель версии микропрограммы модуля serialEvent()
SM130 409 GPS parser 339, 340
считыватель кожно-гальванической реакции 476 измеритель уровня сигнала радио XBee 330
ультразвуковой дальномер LV-EZ1 327 наклонение акселерометра 354
makeButtons(), работа с модулем RFID SonMicro определитель версии микропрограммы
403 считывателя SonMicro 397
makeNewPlayer() 215,216 проект сетевого кота 135, 136, 150, 151
makeRequest() 179 считыватель RFID ID 12 381
538 Предметный указатель

Serial.printO 88 AVR 52
Serial.write() 88 BASIC Stamp 76
serverEvent() 198 Beagle Board 158
serverEvent(), сервера сетевого пинг-понга 215 PIC 52
setDestination(), дуплексная связь ХВее 249 RabbitCore 158
setLastState(), регистратор данных 483 сопряжение с мобильными телефонами 430
setLeds() 180 Микросхема
setMeter() 180 MAX232 79
setup() MAX3233 77,78,79
GPS parser 338 W5100 158
Stinger player 501 Многолучевое распространение сигнала 332, 333
веб-клиент для Twitter REID 411 Множественное отражение сигнала 332
веб-сервер с чтением SD-карточки 443—446 Мобильные телефоны
демо инструмента General MIDI 499, 500 операционные системы 464
дуплексная связь ХВее 249 Android 464,466
измеритель уровня сигнала радио ХВее 329 Модель
ИК управление камерой 235 цветовые 363
наклонение акселерометра 353 OSI 72
клиента джойстика 205 Модем 115
обнаружение лиц с помощью OpenCV 370 Модуль
проверка ЖК-дисплея 408 ADH80667 463
проверка меток RFID 389 Apache MOD_REWRITE 511
работа с модулем RFID SonMicro 401 GPRS для микроконтроллеров 463
регистратор данных 479 Arduino Fio 252
скетч распознавания цвета с OpenCV 365 Arduino LilyPad Simple 474
сервера сетевого пинг-понга 214,215 Bluetooth 99, 104— 107
скетч Bluetooth Analog Duplex sender 259 Ethernet 161
скетч Wi-Fi веб-сервер цветов дня 267 GE865 463
скетч компаса 345 GM862 463
считыватель QR-кодов 373, 374 Power Switch Tail 435
считыватель RFID ID 12 379 X10, 358, 382
считыватель акселерометра 351 Xbee 240—245, 251
считыватель акселерометра через I2C 352 микроконтроллер Wi-Fi 265
считыватель версии микропрограммы модуля Монтажный провод 32, 34
SM130 408,409 Музыкальный ящик 191, 221
считыватель кожно-гальванической реакции Мультиметр 30
475 Мультиплексирование 238
showPaddleO 210,212
showScore() 220
Н
sonMicroEvent(), работа с модулем
RFID SonMicro 402, 403 Набор
tilt(), наклонение акселерометра 353 Android SDK 465
update(), работа с модулем RFID SonMicro 405 Arduino Mega ADK 485
Микроконтроллер 26, 31 Google ADK 484
8-разрядные 52 Набор протоколов ACN 503
32-разрядные 53 Направленные сообщения 298
ATmega 49 Нюхач 357
Предметный указатель 539

О Fritzing 56
Inkscape 56
Обмен данными 74
less 41
Обнаружение узлов 280
nano 41
Оборудование для проектов 30, 31
Processing 34, 35
Обратная связь 194
PuTTY 38, 105
Объекты, сетевые 26—28
SM13XFU 398
Операционные системы для мобильных телефонов
SMRFIED Mifare vl.2 398
464, 466
telnet 38
Определение
X-CTU 281
местонахождения 317—321
последовательного обмена данными 61, 62
расстояния 322, 327, 333, 334
тестирования клиента 185
Оптоизолятор 496
тестирования сервера 188
Осциллограф 30, 66, 232
удаленного доступа 37
Отладка скетчей 183,184,185
Проект
OpenCellID 320
П Poker Face 470
Панель управления Twilio 455 SIMbaLink 485
Переменные Virtual Terrain Project 319
processing 36 Возвращение Cat Cat
среды HTTP 417 главная страница интерфейса 448
среды PHP 141,504 страница интерфейса 447
$_REQUEST 123 страница ответа 448, 449
среды электронной почты 420, 422 Телефонируем термостату 453
экземпляра 211 Проигрыватель QuickTime 143
Перенаправление портов 168 Протокол
Переходник USB/TTL-Serial 30 ASCII 84
Плата Bluetooth 99
Arduino Ethernet 158 DHCP 118
GPRS GM862 464 DMX512 503
адаптерная для модуля радио ХВее 242 DNS 118
Положение 347 Hayes AT 104
вращения 348 HTTP 122
крен 347 I2C 159
рыскание 348 IMAP 127
Порт MIDI 496
перенаправление 168 NMEA0183 334,336,504
последовательный 45, 59, 60, 386 POP 127
сетевые 121 RFID EM4001 377
Последовательный буфер 97 RFID Mifare 377
Последовательный протокол 491 RS-232 77
Потенциометр 32, 34, 63 SIP 453
Почта, электронная 127,128 SMTP 127
Приемопередатчик 25 SonMicro 395
Проверка схемы реле 435 TCP 118, 195
Программа UDP 118, 195, 276, 277, 279, 298, 305
Adobe Illustrator 56 X10 382,385,388
CoolTerm 45, 105 двоичные 493
540 Предметный указатель

последовательные 25,491,492 устройства 229


последовательный TTL 74 на основе сеансов 275
последовательный USB 74, 76 на основе сообщений 275
последовательный синхронный 159 обратная 194
связи 25 Сервер
сетевые 25 DNS 118
текстовые 493 SIP 453
уровни 489
веб 120
групповых дискуссий 194
Р программа тестирования 188
Радио 255 сетевого пинг-понга 197,210
Радиопомехи 236,237 Сервис SIP 453
Радиосигнал Сетевой пинг-понг 196
мощность 331 Сетевые камеры 450,451
радиус действия 236 Сетевые объекты
Радиочастотная идентификация 362 работа с 26—28
Разметка 506, 507 Сетевые порты 121
Разрешения файлов 41 Сети
Разряды, старшинство 494 бессеансовые 310
Разъем ячеистые 301
DB-9 77 Сеть 69
D-sub-9 77
звездообразная 113, 114
mini-USB
кольцевая 114
модуль Arduino Fio 252
многоуровневая звездообразная 114
батарейки 34
батарейки «Крона» 30 полносвязная 114
источника питания 30 телефонная 428
устройства DMX512 503 Сигнал, распространение 332, 333
штыревые 34 Силоизмерительное сопротивление 130
Распознавание объектов по цвету 364 Синхронный обмен данными 74
Распространение сигнала многолучевое 332, 333 Система
Расстояние 322, 327, 333, 334 GPS 327
Реакция кожно-гальваническая 470 Skyhook 322
Регулятор напряжения 31, 33 Wireless Е911 334
LD1117-33V 288,301 Скетч 35, 37
Реле, проверка схемы 435 Bluetooth Analog Duplex sender 257
Рыскание 348 Cat webcam uploader/emailer 148— 150
DHCP 181
С GPS parser 337
Светодиод 31,33 Stinger player 500
трехцветный 80, 81 TTL-Serial/Ethemet 185, 186
Связь WiFi веб-сервер цветов дня 266
беспроводная XBee на UDP 305
инфракрасная 230—232 веб-клиент для Twitter RFID 410—414
недостатки 227 веб-сервер 163, 164
радио 229 веб-сервер с чтением SD-карточки 443
типы 228 демо инструмента General MIDI 499
Предметный указатель 541

для определения уровня сигнала сети WiFi 268 Слово, компьютерное 244
для сканирования на доступные сети WiFi 268 Смартфон 429
для считывания и вывода в графике ХВее пакетов Смещения 348
306 Сокет 195
захват и загрузка изображений 143, 144 Сообщения
измеритель уровня сигнала радио ХВее 329 MIDI 497
ИК дальномер с датчиком Sharp GP2xx 323 направленные 298
ИК управление камерой 233 Сопротивление 31, 32
клиент джойстика 204 нагрузочное 63
мигалка Х10 387,388 силоизмерительное 130
наклон акселерометра 352 утечки 63
обнаружение лиц с помощью OpenCV 369 Сопряжение микроконтроллеров с мобильными
обход микроконтроллера модуля Arduino 394, 395 телефонами 430
определитель версии микропрограммы считыва­ Старшинство разрядов 494
теля SonMicro 397 Стек протоколов TCP/IP 158
ответчик на запрос UDP 278 Схема
отладка 183— 185 Monksi Pong 86
отправитель/получатель широковещательного Monski Pong, компактная 103
запроса UDP 277
Monski Pong на Bluetooth 102
отправитель/получатель широковещательного
RGB-сервера 162
или направленного запроса UDP 299
автоматического управления электроприборами
последовательный считыватель строк 89, 134
383
проверка вольтметра 172
ввода и вывода MIDI 496
проверка ЖК-дисплея 408
взаимодействия модуля Bluetooth с последова­
проверка меток RFID 388
тельным портом компьютера 107
проверки работы датчиков изгиба 87
взаимодействия с контроллером управления кон­
проверка запросов HTTP TTL-Serial/Ethemet 187
диционером 434
работа с модулем RFID SonMicro 400—405
распознавание цвета с OpenCV 365 для наблюдения за инфракрасным сигналом 232
регистратор данных 478 для солнечной панели 303
считывание термодатчика и управление реле клиента балансировочной доски, монтажная
исходная версия 438 на беспаечной плате 209
модификация для управления реле 439 клиента балансировочной доски, монтажная
модификация для чтения карточки SD 440 на перфоплате 210
считыватель QR-кодов 373 клиента балансировочной доски, принципиаль­
считыватель RFID 386 ная 209
считыватель RFID ID 12 379 клиента джойстика, монтажная на беспаечной
считыватель акселерометра 351 плате 200
считыватель акселерометра через I2C 352 клиента джойстика, монтажная на перфоплате 201
считыватель версии микропрограммы модуля клиента джойстика, принципиальная 201
SM130 408,409 клиентов сетевого пинг-понга 199
считыватель кожно-гальванической реакции 475 маршрута доставки веб-страниц 120
считыватель показаний аналоговых датчиков 133 подключение считывателя RFID ID-12 к адаптеру
считыватель сообщений ХВее 292 USB/TTL-Serial 380
тестирование Processing для Android 468 подключение акселерометра ADXL335 к модулю
тестовая серверная программа 188, 189, 197 Arduino 349
ультразвуковой дальномер LV-EZ1 327 подключения вольтметра к сети Ethernet 171
управление трехцветным светодиодом 82, 83 подключения датчиков давления 132
542 Предметный указатель

подключения компаса LSM303DLH к модулю Mail reader 421


Arduino 344 RESTful reader 511
подключения кота к сети 129 RESTfiil reader, модифицированный 512
подключения модуля ХВее к плате Arduino 248 доставщик SMS 462
подключения приемника GPS ЕМ-406А к радио загрузка файла 141,142
Bluetooth 335 отображение переменных среды 417
подключения считывателя RF1D к модулю отправитель почты 127
Arduino посредством шины I2C 392—394 отправитель почты, проект сетевого кота 138,139
подключения ультразвукового датчика LV-EZ1 проверка возраста 124
к модулю Arduino, принципиальная 326 регистратор данных 476
подсоединения двигателя 290 считыватель параметров 123
подсоединения ЖК-дисплея и потенциометра Счисление места 321
к перфоплате 415 Считыватель
подсоединения ЖК-дисплея к модулю Arduino 407 RFID 377
подсоединения ИК дальномера GP2Y0A21YK 324 ID Innovations 379
подсоединения платы реле 437 SM130 391—393
подсоединения радио Bluetooth Mate к плате SonMicro 396, 398
Arduino 258 меток RFID 358
подсоединения радио ХВее к модулю Arduino 303
подсоединения радио ХВее к модулю Arduino T
с шилдом Ethernet 291
Тактирование 347
подсоединения радио ХВее к солнечной панели
Тангаж 348, 350, 351
302
Теги разметки 506
подсоединения реле в розеточной коробке 437
Терменвокс 500
подсоединения сигнального устройства 289
Терминал, команды 39—41
подсоединения шилда Arduino Ethernet к плате
Тестовые проводники 30
Arduino 161
Технология
простейшего инфракрасного контроллера 234
NFC 391
простого сервера, логическая 165
PhoneGap 460
радиоретранслятора 303, 304
Ткани, токопроводящие 473
сетевого измерителя качества воздуха 170
Транзистор 33
сети для проекта солнечной панели 300
2N3906 302
системы выявления токсических газов 283
TIP120 31
системы для проекта мобильного регистратора
Третья рука 30
данных 471
Трехцветный светодиод 80, 81
системы удаленного управления кондиционером,
Триангуляция 333
принципиальная 436
Триггер 66
скетча Cat Саш 147
Трилатерация 333
создания входа и выхода MIDI для микрокон­
троллера 498
управления кондиционером 433 У
Сценарий РНР УАПП 489
AirNow Web Page Scraper 177— 179 Удаленный доступ, программы 37, 38
AIRNow Web Page Scraper 173, 174 Уплотнение во времени. См. Мультиплексирование
Date page 123 Уплотнение по частоте. См. Мультиплексирование
IPgeocoder 418,419 Установка приложений Android 465
Предметный указатель 543

Ф Широковещательный адрес UDP 276


Шифрование 266
Файл
Шлюз
блокировки 46
SMS 429
разрешения 41
SMS-email 461
Формат
Twilio 455, 457
CSV 504
Штрихкод 370
JSON 505
двумерные 372
TSV 504
QR 364, 372
пакета ХВее 292
Semacode 372
генераторы 373
X систем EAN, JAN, UPC 371
Хаб 115 улучшение распознавания 375
Штыревые разъемы 31, 34
ч
Чтение пакета ХВее 292
э
Экранирование 236
Ш Электронная почта 127
отправка по SMS 461, 462
Шестнадцатеричное представление 495, 496 переменные среды 420,422
Шилд протоколы 127, 128
Adafruit Ethernet 158 Эмулятор устройств Android 466
Arduino Ethernet 158
GPRS 463,464 Я
Music Instrument 488, 497, 501
RFID TinkerKit 358 Язык РНР 42
Super DMX 503 Язык разметки 505
Tinker DMX 503 TwiML 454
WiFi 266, 267 XML 455
WiFi Arduino 264 сравнение с языками программирования 507
WiFly 265 теги 506
беспроводной связи для модуля Arduino 246 Ячеистые сети 301
ШИМ 169 Ящик музыкальный 191, 221

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