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

ʟ˖ˋʠ˃ː˕ˑ˔ ˋ ʠ˃˓˃ʠ˃ː˕ˑ˔

ʞʟʝʠʡʪʤ
ʞʟʝʔʙ ʡʝʑ
ː˃
ʗʒʟʢʧʙʗǡ
ʗʜʠʡʟʢʛʔʜʡʪǡ
ʒʏʓʕʔʡʪ
ˋˏːˑˆˑˈ
ˇ˓˖ˆˑˈ
20
20 EASY
PROJECTS

S A N F RA N C I S C O
Руи Сантос и Сара Сантос

20 простых проектов
на RASPBERRY PI
ИГРУШКИ, ИНСТРУМЕНТЫ, ГАДЖЕТЫ
и многое другое

Электронное издание

Перевод с английского
М. А. Федотенко

Москва
Лаборатория знаний
2020
УДК 087.5:004
ББК 32.816
С18

Сантос Р.
С18 20 простых проектов на Raspberry Pi○ . Игрушки,
R

инструменты, гаджеты и многое другое / Р. Сантос,


С. Сантос ; пер. с англ. М. А. Федотенко. — Элек-
трон. изд. — М. : Лаборатория знаний, 2020. — 323 с. —
Систем. требования: Adobe Reader XI ; экран 10". —
Загл. с титул. экрана. — Текст : электронный.
ISBN 978-5-00101-884-1
Эта книга подходит для всех новичков, которые хотят
максимально использовать возможности Raspberry Pi, будь
то дети, мечтающие открыть для себя мир электроники
и программирования, родители и педагоги, желающие им
помочь, или же любители и изобретатели, намеревающиеся
с помощью Raspberry Pi воплотить свои идеи в жизнь.
Мы совсем не предполагаем, что вы знакомы с Raspberry Pi
и к тому же разбираетесь в схемотехнике или программиро-
вании. Этому вы научитесь, прочитав книгу. Но если у вас
уже есть некоторые базовые навыки, то эта книга поможет
развить их и дать вам идеи, что делать дальше.
УДК 087.5:004
ББК 32.816

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


стых проектов на Raspberry Pi○R . Игрушки, инструменты,
гаджеты и многое другое / Р. Сантос, С. Сантос ; пер. с англ.
М. А. Федотенко. — М. : Лаборатория знаний, 2020. — 320 с. :
ил. — ISBN 978-5-00101-231-3.

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


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

c 2018 by Rui Santos and Sara Santos.


Copyright ○
Англоязычное оригинальное
название: 20 Easy Raspberry Pi
Projects: Toys, Tools, Gadgets,
and More! ISBN 978-1-59327-843-4,
опубликовано No Starch Press.
Все права защищены.
ISBN 978-5-00101-884-1 c Лаборатория знаний, 2020

Оглавление
Благодарности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Для кого эта книга?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
О книге . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Что вам понадобится для реализации проектов данной книги? . . . . . . 14
Структура книги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Руководство для начинающих . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Начало работы с платой Raspberry Pi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Возможности использования Raspberry Pi . . . . . . . . . . . . . . . . . . . . . . . . . 19
Различия между версиями плат Raspberry Pi . . . . . . . . . . . . . . . . . . . . . . . 20
Знакомство с Raspberry Pi и ее компонентами . . . . . . . . . . . . . . . . . . . . . . 21
Список необходимых компонентов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Загрузка операционной системы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
• Загрузка NOOBS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
• Форматирование карты microSD в Windows или macOS . . . . . . . . . 27
• Форматирование карты microSD в Linux . . . . . . . . . . . . . . . . . . . . . . . 29
• Загрузка Raspbian на карту памяти microSD . . . . . . . . . . . . . . . . . . . . 31
Настройка Raspberry Pi в качестве настольного компьютера . . . . . . . . 31
• Подключение Raspberry Pi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
• Первый запуск вашей Pi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
• Обзор рабочего стола . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
• Выключение, перезагрузка и выход из системы . . . . . . . . . . . . . . . . . 41
Знакомство с языком Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Интегрированная среда разработки Python 3 . . . . . . . . . . . . . . . . . . . . . . . 42
Основные команды Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Редактор Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Ваша первая программа на Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Разработка простого калькулятора . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
СВЕТОДИОДЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Проект 1. Мигание светодиодом. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Знакомство с портами GPIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Оглавление
6

Знакомство со светодиодами. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Подбор подходящего резистора . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Сборка схемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
• Написание скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
• Запуск скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Проект 2. Кнопочный светодиодный фонарик . . . . . . . . . . . . . . . . . . . . . 69
Знакомство с переключателями и кнопками . . . . . . . . . . . . . . . . . . . . . . . 69
Сборка схемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Проект 3. Регулятор яркости светодиода . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Знакомство с потенциометрами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Чтение аналоговых сигналов с помощью Raspberry Pi. . . . . . . . . . . . . . . 76
• Аналого-цифровые преобразователи. . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
• Широтно-импульсная модуляция . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Сборка схемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
• Написание скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
• Запуск скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Проект 4. Графический пользовательский интерфейс для
управления многоцветным светодиодом . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Знакомство с RGB-светодиодами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Сборка схемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
• Управление интенсивностью цвета и закрытие окна . . . . . . . . . . . . 90
• Проектирование пользовательского интерфейса с помощью
Tkinter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
• Запуск скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Проект 5. Радужная светодиодная лента . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Знакомство с адресуемой лентой RGB-светодиодов WS2812B . . . . . . 95
Знакомство с преобразователем логического уровня . . . . . . . . . . . . . . . . 97
Сборка схемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
• Установка библиотеки WS281X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
• Подключение интерфейса SPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
• Написание скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
• Запуск скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Оглавление
7

ДИСПЛЕИ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Проект 6. Отображение напоминаний на ЖК-дисплее . . . . . . . . . . . . . 111
Знакомство с ЖК-дисплеями . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
• Пайка штыревого разъема . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
• Назначение выводов ЖК-модуля . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Сборка схемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
• Подключение библиотеки Python для символьных ЖК-
дисплеев . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
• Вывод символьного сообщения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
• Добавление дополнительных функций. . . . . . . . . . . . . . . . . . . . . . . . . . 118
• Прокрутка сообщения напоминания . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
• Запуск скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Проект 7. Мини-устройство прогноза погоды. . . . . . . . . . . . . . . . . . . . . . 125
Знакомство с OLED-дисплеями . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Использование API-сервиса OpenWeatherMap . . . . . . . . . . . . . . . . . . . . . 126
• Структура синтаксиса JSON. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
• Создание API-запроса. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Сборка схемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
Программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
• Установка библиотеки для OLED-дисплея . . . . . . . . . . . . . . . . . . . . . . 133
• Активация протокола I2C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
• Написание скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
• Запуск скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Проект 8. Игра в Pong с Sense HAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Знакомство с Pong . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Знакомство с платой расширения Sense HAT для Raspberry Pi . . . . . . 142
• Монтаж платы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
• Применение эмулятора платы Sense HAT . . . . . . . . . . . . . . . . . . . . . . . 143
Работа с функциями и управлением Sense HAT. . . . . . . . . . . . . . . . . . . . . 144
• Управление светодиодной матрицей . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
• Чтение данных с джойстика . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
• Написание скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
• Запуск скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
ДАТЧИКИ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
Проект 9. Сенсорная погодная станция «все-в-одном» . . . . . . . . . . . . 159
Sense HAT как метеостанция. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
• Датчик температуры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
• Датчик влажности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
• Датчик атмосферного давления. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Оглавление
8

Чтение показаний температуры, влажности и давления . . . . . . . . . . . . . 161


Создание пользовательского интерфейса для считанных данных . . . . 163
Программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
• Создание пользовательского интерфейса . . . . . . . . . . . . . . . . . . . . . . . 166
• Автоматическое обновление данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
• Запуск скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Проект 10. Охранная сигнализация с уведомлением по e-mail . . . . . 171
Знакомство с PIR-датчиком движения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
Отправка e-mail из Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
• Поиск настроек вашего SMTP-сервера. . . . . . . . . . . . . . . . . . . . . . . . . . 172
• Скрипт для отправки e-mail-сообщения. . . . . . . . . . . . . . . . . . . . . . . . . 173
• Запуск скрипта, отправляющего e-mail-сообщение . . . . . . . . . . . . . . 175
Сборка схемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Проект 11. Газовая и дымовая сигнализация. . . . . . . . . . . . . . . . . . . . . . . 183
Знакомство с датчиком газа и дыма MQ-2 . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Знакомство с пьезоэлектрическим зуммером . . . . . . . . . . . . . . . . . . . . . . . 185
Сборка схемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
Программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
• Установка порогового значения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
• Запуск скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
Проект 12. Регистратор температуры и влажности . . . . . . . . . . . . . . . . 193
Знакомство с датчиком DHT22 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Сборка схемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
• Установка библиотеки DHT22. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
• Написание скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
• Создание, редактирование и закрытие файлов .txt. . . . . . . . . . . . . . . 198
• Запуск скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
КАМЕРЫ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
Проект 13. Детектор взлома с фоторегистрацией . . . . . . . . . . . . . . . . . 203
Знакомство с модулем камеры V2 Raspberry Pi . . . . . . . . . . . . . . . . . . . . . 203
Создание детектора взлома . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
• Активация камеры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
• Подключение камеры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Сборка схемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
Программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
• Написание скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
• Запуск скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Оглавление
9

Проект 14. Система домашнего видеонаблюдения . . . . . . . . . . . . . . . . 213


Запись видео в файл . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
• Написание скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
• Запуск скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
ВЕБ-ПРИЛОЖЕНИЯ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Проект 15. Ваш первый веб-сайт . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Создание файлов проекта. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Создание веб-страницы на языке HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
• Создание базовой структуры веб-страницы . . . . . . . . . . . . . . . . . . . . . 224
• Добавление названия веб-страницы, заголовков и абзацев . . . . . . . 225
• Просмотр вашей веб-страницы в браузере . . . . . . . . . . . . . . . . . . . . . . 227
• Добавление ссылок, изображений и кнопок . . . . . . . . . . . . . . . . . . . . . 227
Изменение стилей веб-страницы с помощью CSS . . . . . . . . . . . . . . . . . . 231
• Подключение таблицы стилей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
• Применение стилей к HTML-файлу . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
• Применение стилей к верхнему колонтитулу. . . . . . . . . . . . . . . . . . . . 232
• Применение стилей к классу title . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
• Применение стилей к заголовкам, абзацам и ссылкам . . . . . . . . . . . 236
• Применение стилей к кнопкам . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Проект 16. Подключение электроники к Интернету . . . . . . . . . . . . . . . 241
Знакомство с веб-серверами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Знакомство с релейным модулем. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
• Контакты релейного модуля . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
• Использование реле . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
Обзор проекта. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
Сборка схемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Подготовка Pi к работе в качестве веб-сервера . . . . . . . . . . . . . . . . . . . . . . 248
• Установка Flask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
• Организация файлов проекта. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
Программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
• Создание веб-сервера . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
• Создание HTML-файла . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
• Создание файла CSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
• Запуск веб-сервера. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Проект 17. Создание центра управления Интернетом вещей
с помощью Node-RED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Знакомство с Node-RED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
• Установка узлов DHT22 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
• Начало работы с Node-RED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Сборка схемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Оглавление
10

Создание потока Node-RED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263


• Создание панели инструментов пользовательского интерфейса . 264
• Подключение узлов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Запуск приложения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
ИГРЫ И ИГРУШКИ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
Проект 18. Цифровая барабанная установка . . . . . . . . . . . . . . . . . . . . . . 275
Подготовка аудиофайлов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
• Настройка аудио . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
• Получение нужных семплов аудиофайлов . . . . . . . . . . . . . . . . . . . . . . 276
Сборка схемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
Программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Проект 19. Игра Hungry Monkey на языке Scratch. . . . . . . . . . . . . . . . . 283
Знакомство со Scratch 3.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Сборка схемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Создание скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
• Создание спрайтов и выбор фона сцены . . . . . . . . . . . . . . . . . . . . . . . . 287
• Редактирование спрайтов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
• Добавление элементов управления в спрайт обезьянки . . . . . . . . . . 289
• Тестирование скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
• Создание таймера обратного отсчета. . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
• Подсчет и отображение результатов . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
• Падение бананов с неба . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
• Добавление гнилых бананов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Запуск игры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Проект 20. Робот с дистанционным Wi-Fi-управлением . . . . . . . . . . . 301
Краткое описание проекта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
Подготовка Raspberry Pi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
Сборка схемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
• Подключение двигателей к модулю MotoZero . . . . . . . . . . . . . . . . . . 305
• Управление двигателями с помощью MotoZero . . . . . . . . . . . . . . . . . 307
Разработка приложения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
• Определение IP-адреса Raspberry Pi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
• Создание потока Node-RED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
• Написание скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
Запуск приложения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Запуск робота . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
Приложения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
Приложение А. Руководство по портам GPIO Raspberry Pi . . . . . . . . . 317
Приложение Б. Таблица цветовой маркировки резисторов . . . . . . . . . . 319
Посвящается удивительным людям (помимо нас самих),
благодаря которым выход этой книги стал возможным

Благодарности
Мы хотим поблагодарить команду No Starch Press, которая проделала
такую огромную работу по созданию этой книги. Особая благодар-
ность Лиз Чэдвик за приглашение написать эту книгу и за ее беско-
нечное терпение, проявленное при редактировании книги, написанной
на неродном нам английском языке. Мы также хотим поблагодарить
Лорел Чун за ее внимание к деталям и за красивый макет этой кни-
ги. Спасибо Лесу Паундеру за его технический вклад и предложения.
Огромная благодарность Фонду Raspberry Pi за разработку этого
крошечного, но мощного компьютера, сделавшего электронику и про-
граммирование гораздо доступнее для широкой публики.
Мы также должны поблагодарить наших друзей и семью за их под-
держку на протяжении всего этого приключения. И наконец, мы хо-
тели бы поблагодарить сообщество Random Nerd Tutorials, которое,
хотя и косвенно, но тоже способствовало выходу этой книги.

Написание этой книги было бы невозможным без помощи и под-


держки Сары Сантос и ее неустанного старания делать все вовремя.
Я безмерно благодарен ей.
Руи Сантос

Я хотела бы поблагодарить моего соавтора Руи Сантоса за при-


глашение принять участие в этом приключении. Спасибо, что показал
мне, что мы можем вместе работать над чем-то, что мы любим. Нам
нужно лишь следовать нашим мечтам.
Сара Сантос
Введение
Вы когда-нибудь предполагали, что сможете купить компьютер за 35
долларов? Нет, мы не имеем в виду старый б / у компьютер. Мы го-
ворим о Raspberry Pi — одноплатном компьютере размером с кре-
дитную карту. Но не обманывайтесь его хрупким внешним видом —
Raspberry Pi гораздо мощнее, чем кажется.
Плата Raspberry Pi была разработана в Великобритании Эбеном
Аптоном, основателем Фонда Raspberry Pi. Аптон и его коллеги за-
метили общее снижение навыков студентов, поступающих в Кем-
бриджский университет на информатику, и связали это с тем, что
новые поколения студентов выросли с компьютерами, которыми про-
сто пользоваться. Студентам крайне редко приходилось разбираться
в том, как именно устроены и работают компьютеры, программиро-
вать непосредственно аппаратную часть компьютера или возиться
с его «внутренностями». Аптон разработал Raspberry Pi для попу-
ляризации преподавания основ информатики в школах. Вот почему
Raspberry Pi — это не компьютер в привычном нам виде, а «голая»
плата, без корпуса. Так каждый может видеть все ее компоненты.
Более 10 млн плат Raspberry Pi было продано с момента ее по-
явления в 2012 году. Raspberry Pi стала популярной не только среди
студентов, но и у любителей электроники, изобретателей, ученых-ин-
форматиков, а также «детей» всех возрастов.
Плата Raspberry Pi способна работать как обычный компьютер.
С ее помощью вы сможете искать что-то в Интернете, отправлять
электронные письма, создавать документы, смотреть видео и так да-
лее, но это не основное ее назначение. Главное, Raspberry Pi — это то,
с чем вы можете экспериментировать, взламывать и играть, создавать
свои собственные программы и изобретения. Появление Raspberry
Pi и других подобных плат вызвало волну креативных изобретений
по всему миру, потому что теперь попасть в мир электроники и про-
граммирования стало не только возможно, но и легко. Попробуйте
и вы что-нибудь изобрести!
О книге
13

Для кого эта книга?


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

О книге
«20 простых проектов на Raspberry Pi» — это коллекция из 20 про-
ектов, создаваемых с использованием Raspberry Pi. Мы считаем, что
лучший способ открывать для себя новые направления — это прак-
тика, а книга с проектами — отличный способ начать работу.
Книга начинается с быстрого введения в Raspberry Pi и язык
программирования Python, а затем переходит к проектам. Она при-
держивается концепции обучения на практике, а это значит, что вам
не придется тратить долгие часы на изучение теории, прежде чем
создать что-то свое и действительно классное.
Вы будете учиться, создавая забавные интерактивные проекты,
такие как домашняя система наблюдения и управляемый по Wi-Fi
робот. Вы также разработаете удобные пользовательские интерфейсы
для управления электроникой, создадите проекты для Интернета ве-
щей, разработаете веб-сайт, придумаете и реализуете свои собствен-
ные игры и многое другое.
Не переживайте, если у вас нет опыта программирования или сбор-
ки схем. В каждом проекте даются пошаговые инструкции по сборке
схем и код для программирования Raspberry Pi. Вы можете перепе-
чатывать код из книги или перейти на сайт http://pilotlz.ru/books/
files/10857/ и скачать его оттуда.
Ваше обучение Raspberry Pi не должно ограничиваться предложен-
ными в книге проектами. С этой целью в каждом из них есть раздел
«Идеи для продолжения», где мы предлагаем решения по дальней-
шему развитию ваших проектов и обобщению понятий, изученных
Введение
14

в книге, для создания более сложных и интересных вещей. Мы на-


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

Что вам понадобится для реализации


проектов данной книги?
Проекты в этой книге были разработаны с использованием платы
Raspberry Pi 3. Если у вас уже есть более старая модель Raspberry
Pi, вы можете использовать и ее, но все же проще будет создавать
предлагаемые проекты именно с третьей версией. Более старые вер-
сии имеют низкую производительность, а совсем старые — меньше
портов GPIO.
Мы не знаем, когда будет выпущена Raspberry Pi 4 и выйдет ли
она вообще, но до сих пор все версии Raspberry Pi были совместимы
с более старыми, поэтому есть надежда, что будущие версии также
будут подходить для проектов этой книги.
В большинстве наших проектов Raspberry Pi применяется для вза-
имодействия с окружающим миром при помощи электронных схем.
Это значит, что помимо Raspberry Pi вам понадобятся и другие элек-
тронные компоненты. В начале каждого проекта дается список необ-
ходимых компонентов, указываются их примерная стоимость и рас-
четное время сборки. Проекты, отмеченные одним символом доллара
$, скорее всего, будут стоить не больше $10, а проекты с двумя
символами $ могут стоить от $10 до $50. Широкий диапазон цен
на детали объясняется зависимостью от места покупки. Если вы за-
хотите купить все сразу, обратитесь к разделу «Список необходимых
компонентов». Там вы найдете полный список всех компонентов, ис-
пользуемых в этой книге.

Структура книги
Книга разделена на семь частей. Первая часть «Руководство для на-
чинающих» знакомит читателя с Raspberry Pi; ее нужно обязательно
прочитать, чтобы правильно настроить свою Pi. В последующих ча-
стях содержатся сами проекты. Расскажем кратко о каждой части.
Руководство для начинающих. В этой части мы расскажем о том,
что вам нужно, чтобы начать работу с Raspberry Pi и настроить ее
при первом подключении. Мы также познакомим вас с основами
языка программирования Python, используемого в этой книге.
Структура книги
15

Светодиоды. Вы начнете с создания проектов со светодиодами.


Если вы новичок в мире электроники, эта часть научит вас основам
сборки схем.
Дисплеи. Здесь вы узнаете, как с помощью различных дисплеев
сделать ваши проекты более интерактивными. Кроме вывода просто-
го текста на экран, как вам могло показаться, вы также узнаете, как
собирать данные из Интернета, и напишете программу игры в пинг-
понг.
Датчики. В этих проектах применяются датчики нескольких типов.
Датчики — замечательные устройства! Они позволяют вашим проек-
там реагировать на внешние события и взаимодействовать с окружа-
ющим миром. В настоящее время существуют датчики буквально для
всего, что вы только можете придумать. Вы узнаете, как использовать
датчик температуры, датчик движения PIR и многие другие.
Камеры. В проектах этой части используется собственный модуль
камеры Raspberry Pi. Вы узнаете, как фотографировать этой камерой
и как передавать видео, а затем примените полученные навыки для
создания интересных проектов, например детектора взлома и домаш-
ней системы наблюдения.
Веб-приложения. В этой части вы разработаете свой собствен-
ный веб-сайт, а затем научитесь удаленно управлять портами GPIO
Raspberry Pi, создав собственный веб-сервер. Вы также познакоми-
тесь с Node-RED — мощным инструментом создания приложений
для Интернета вещей.
Игры и игрушки. Проекты этой части помогут вам создать вещи,
с которыми можно поиграть: цифровую ударную установку, свою
собственную игру на языке Scratch и Wi-Fi-робота, управляемого
со смартфона.
В приложении вы найдете справочную информацию, в том числе
руководство по портам GPIO для всех доступных на сегодняшний
день плат Raspberry Pi, а также таблицу цветовой маркировки рези-
сторов для определения значений номиналов сопротивления разных
резисторов.
Проекты в книге не зависят друг от друга, поэтому вы можете
начинать с любого проекта.
Надеемся, что вам понравится создавать проекты вместе с этой
книгой и вы получите удовольствие от процесса обучения.
10
Руководство для
начинающих
В этой части вы сможете настроить все, что вам
понадобится в следующих проектах. Мы познако-
мим вас с платой Raspberry Pi и ее наиболее важ-
ными и интересными компонентами. Затем мы
расскажем вам, как настроить Raspberry Pi и ка-
кое для этого необходимо оборудование и про-
граммное обеспечение.

Процесс настройки достаточно простой. После него вы сможете при-


менять Raspberry Pi для многих целей, в том числе как обычный
компьютер! Мы произведем настройку Raspberry Pi для работы в ка-
честве компьютера и покажем вам, как ориентироваться на рабочем
столе и в файловой системе. Мы научим вас пользоваться термина-
лом для ввода команд для Raspberry Pi (его еще называют команд-
ной строкой). И наконец, мы познакомим вас с языком программи-
рования Python, с помощью которого вы будете программировать
проекты.
Освоив сведения, изложенные в этом руководстве, вы будете гото-
вы приступить к проектам.

Начало работы с платой Raspberry Pi


Мы начнем с изучения возможностей платы Raspberry Pi, а затем пе-
рейдем к сбору всего необходимого для ее запуска и к загрузке опе-
Руководство для начинающих
18

рационной системы на отформатированную карту памяти microSD,


которая устанавливается в слот вашей Pi.
Raspberry Pi — это плата (одноплатный компьютер) размером
с кредитную карту, которую вы можете купить за 35 долларов.
У Raspberry Pi есть все, что есть и у обычного компьютера: процес-
сор, оперативная память (RAM), порты для подключения монитора,
мыши и клавиатуры и даже возможность подключения к Интернету.
Сверх того, плата Raspberry Pi даже имеет одну особенность, которой
нет у обычных компьютеров, — универсальные порты ввода-вывода
(General Purpose Input Output Pins — GPIO). Эти порты позволяют
Pi взаимодействовать с окружающим миром, а вам — собирать умные
электронные проекты и управлять ими с помощью Raspberry Pi.
На основе Raspberry Pi вы можете делать почти все, что делаете
на обычном компьютере: просматривать веб-страницы, редактировать
документы, играть в игры, писать программы и так далее (рис. 0.1).
Однако не забывайте, что Pi не такая мощная, как более доро-
гие компьютеры, и потому имеет ряд ограничений. Во-первых, она
не может соответствовать всем требованиям некоторого современного
программного обеспечения, в результате чего не все программы бу-
дут работать с Pi. Во-вторых, она работает с операционной системой
Linux, которая, возможно, не так хорошо вам знакома, как Windows
или macOS.

Рис. 0.1. Использование Raspberry Pi в качестве настольного ком-


пьютера
Возможности использования Raspberry Pi
19

Возможности использования
Raspberry Pi
Так в чем же преимущество Raspberry Pi, если она похожа на обыч-
ный компьютер, но имеет ограничения? В том, что Pi дает вам свобо-
ду экспериментировать так, как вы не смогли бы или побоялись экс-
периментировать со своим компьютером. Компьютеры стоят дорого,
и их гораздо сложнее чинить, поэтому вы вряд ли захотите лишний
раз разбирать их, не будучи уверенными на 100% в том, что именно
вы делаете. Но, как сказал в интервью BBC News Линус Торвальдс
(основатель ОС Linux), c Raspberry Pi вы можете «позволить себе
ошибаться». Вы можете играть с ее компонентами и программным
обеспечением и не переживать, что сломаете дорогую вещь или по-
теряете все свои важные файлы!
С Pi вы можете экспериментировать в двух направлениях.
Написание своих собственных программ. Pi поставляется с на-
бором бесплатных инструментов для написания программного обе-
спечения. Если вы допустили ошибку, то можете просто все стереть
и начать заново.
Создание собственных электронных проектов. На плате Raspberry
Pi есть порты ввода-вывода GPIO, к которым можно подключать
датчики и другие электронные устройства для взаимодействия с ре-
альным миром. Вы можете создавать полезные вещи, и они будут
работать круглосуточно, не тратя много электроэнергии.
Можно бесконечно перечислять возможности Raspberry Pi. Вот
только некоторые примеры проектов, созданных людьми в разных
уголках мира:
• игровая ретро-консоль для старых аркадных игр;
• суперкомпьютер, собранный путем соединения нескольких
Raspberry Pi;
• облачный сервер для хранения ваших данных и доступа к ним;
• медиацентр для воспроизведения музыки и видео на телевизоре;
• система «Умный дом» для управления разными домашними
устройствами;
• множество интересных и полезных роботов, таких как роботы-
фермеры и автономные роботы-машины.
Чтобы увидеть действительно классный проект с Pi, взгляните
на скульптуру SeeMore (рис. 0.2), приводимую в движение 256-уз-
ловым кластером Raspberry Pi. Она демонстрирует всю красоту па-
раллельных алгоритмов.
Руководство для начинающих
20

Рис. 0.2. Проект SeeMore (Источник: ©Jud


Froelich, с любезного разрешение SeeMoreProject)

Различия между версиями


плат Raspberry Pi
На рисунке 0.3 представлен модельный ряд Raspberry Pi.
В этой книге мы будем использовать Raspberry Pi 3 Model B,
и именно ее советуем вам приобрести. Но если у вас уже есть бо-
лее старая модель Raspberry Pi, большинство проектов в этой книге
должны работать и с ней. Однако, если вы используете модель с 26
портами GPIO вместо 40, возможно, вам придется изменить некото-
рые схемы проектов, а это потребует дополнительных поисков. За-
гляните в приложение А «Руководство по портам GPIO Raspberry
Pi» для уточнения распиновки1 более старых плат.

Рис. 0.3. Хронология выпуска плат Raspberry Pi

1
Распиновка — это разговорное название распайки электронных схем, которое при-
шло из практики прототипирования без пайки. Сегодня в большинстве случаев
достаточно соединить гнезда и штекеры контактов. — Прим. перев.
Знакомство с Raspberry Pi и ее компонентами
21

Таблица 0.1. Характеристики плат модели В

Характеристики Pi 1 Pi 1 Pi 2 Pi 3
Модель В Модель В+ Модель В Модель В
Процессор 700 МГц, 700 МГц, 900 МГц, че- 1,2 ГГц, четы-
одноядерный одноядерный тырехъядер- рехъядерный
ARMv6 ARMv6 ный ARMv7 ARMv8
Оперативная память 512 Мб 512 Мб 1 Гб 1 Гб
USB-порты 2 4 4 4
Порты GPIO 26 40 40 40
Порт Ethernet + + + +
Разъем HDMI + + + +
Карта памяти SD microSD microSD microSD
Wi-Fi – – – +
Bluetooth – – – +
Цена $35 $25 $35 $35
Разъем питания MicroUSB MicroUSB MicroUSB MicroUSB

Модели Raspberry Pi отличаются по ряду параметров, например


по количеству портов GPIO, по типу и количеству разъемов. В та-
блице 0.1 показаны различия плат модели B. Обратите внимание,
что новые платы имеют улучшенные характеристики, например
больший объем оперативной памяти и более мощные процессоры.
Вы также можете заметить, что Pi 3 — это первая модель, под-
держивающая Bluetooth и Wi-Fi-подключение без дополнительных
датчиков.

Знакомство с Raspberry Pi
и ее компонентами
Давайте поближе познакомимся с платой Raspberry Pi 3 модели В
(рис. 0.4).
Итак, модель В состоит из следующих компонентов:
• USB-порты для подключения периферийных устройств, таких
как мышь и клавиатура;
• порт Ethernet для подключения Raspberry Pi к Интернету;
• аудиоразъем Audio jack (3,5 мм) для подключения аудио-
устройств;
Руководство для начинающих
22

Рис. 0.4. Плата Raspberry Pi 3 модель B

• CSI-разъем (Camera Serial Interface) для подключения неболь-


шой камеры;
• разъем HDMI (High-Definition Multimedia Interface) для под-
ключения монитора или телевизора;
• разъем питания microUSB только для подачи питания платы
Raspberry Pi. (На плате Raspberry Pi нет выключателя питания.);
• разъем DSI (Display serial interface) для подключения диспле-
ев, совместимых с DSI, например сенсорного жидкокристалли-
ческого дисплея с 15-контактным плоским кабелем (шлейфом);
• слот для подключения карты памяти microSD, на которой хра-
нятся операционная система и все программы, необходимые для
работы Pi;
• процессор Broadcom BCM2837 четырехъядерный 64-разрядный
с архитектурой ARM Cortex-A53, работающий на максимальной
частоте 1,2 ГГц. Это мозг вашей Raspberry Pi;
• антенна для беспроводной передачи сигналов Wi-Fi и Bluetooth;
• порты ввода-вывода GPIO, к которым подключаются датчики для
сбора данных или отправки выходных сигналов для управления
внешними устройствами, например двигателем или светодиодом.
Знакомство с Raspberry Pi и ее компонентами
23

Рис. 0.5. Клавиатура и (слева направо) кабель HDMI, карта памяти


microSD, мышь и адаптер питания для подключения к электросети

Как видите, Raspberry Pi — это простая электронная плата, кото-


рая не так уж много может сама по себе. Для начала работы с ней
вам понадобятся некоторые дополнительные аксессуары (рис. 0.5).
Вот список периферийных устройств и аксессуаров, которые вам
также понадобятся для работы с Raspberry Pi:
• Адаптер питания. Raspberry Pi 3 должна заряжаться от источ-
ника питания с напряжением 5 В и током 2,5 А.
• Карта microSD. Мы рекомендуем приобрести карту microSD
класса 10, с объемом памяти 8 Гб и больше. Однако если у вас
Raspberry Pi 1 модели B, то вместо microSD вам понадобится
полноразмерная SD-карта.
• Монитор и кабель HDMI. Через видеовыход HDMI можно под-
ключить Raspberry Pi к монитору или телевизору. Большинство
современных телевизоров и мониторов имеет HDMI-разъем,
поэтому вы можете подключить их непосредственно к плате
Pi с помощью только одного кабеля HDMI. Старые мониторы
и телевизоры имеют разъемы VGA или DVI, поэтому подключить
их к Pi можно только через адаптер VGA-HDMI или DVI-HDMI.
• Мышь и клавиатура. Вы можете взять любую мышь и любую
клавиатуру, даже беспроводные. Главное, чтобы у них были
USB-разъемы.
Руководство для начинающих
24

ПРИМЕЧАНИЕ
Вы также можете запускать свою Raspberry Pi через компьютер
в так называемом безголовом режиме (headless mode), то есть
без клавиатуры, мыши или монитора.

• Адаптер для карты памяти microSD или считывающее устрой-


ство для вашего ПК (по желанию). Большинство современных
компьютеров уже имеет слот для SD-карт. Чтобы подключить
карту microSD к компьютеру, достаточно вставить ее в адаптер
для SD-карт. Но если на вашем компьютере нет слота для SD-
карт, вам придется приобрести устройство для чтения-записи
SD-карт, подключаемое через USB.
• Кабель Ethernet или Wi-Fi-модем (по желанию). Raspberry
Pi 3 поддерживает Wi-Fi-подключение, а более старые версии
платы не поддерживают. Поэтому, чтобы подключить их к Ин-
тернету, вам понадобится кабель Ethernet или Wi-Fi-модем. Пе-
ред покупкой модема обязательно убедитесь, что он совместим
с вашей Pi. Узнать это вы можете на сайте https://elinux.org /
RPi_USB_Wi-Fi_Adapters.
• Защитный чехол (по желанию). Raspberry Pi продается без кор-
пуса и отлично работает без него. Но мы все же рекомендуем
вам приобрести защитный чехол для вашей Pi, чтобы сделать ее
чуть более защищенной. Если вам жаль тратить на это деньги,
сделайте чехол самостоятельно. Напечатайте его на 3D-принтере,
соберите из LEGO, воспользуйтесь пластиковыми контейнерами
для еды, прорезав в них отверстия для портов, или придумайте
что-нибудь свое. Главное, чтобы ваш чехол не закрывал порты
GPIO, которые нужны для создания проектов.
Убедиться в том, что ваши периферийные устройства совмести-
мы с вашей Raspberry Pi, поможет список совместимых и несовме-
стимых периферийных устройств на сайте https://elinux.org / RPi_
VerifiedPeripherals.

Список необходимых компонентов


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

необходимых для сборки этого проекта. Вы легко найдете их в боль-


шинстве известных интернет-магазинов электроники или написав со-
ответствующий запрос в Google. Мы же рекомендуем вам такие ма-
газины, как Element14 / Farnell, Adafruit, ThePiHut и SparkFun1. Еще
можно приобрести детали на Amazon, но предварительно убедитесь,
что покупаете товары с хорошими отзывами.
Вот полный список компонентов, которые вам понадобятся для
проектов этой книги:
1. Raspberry Pi 3 Model B.
2. Raspberry Pi Zero W (по желанию).
3. Макетная плата.
4. * 5-миллиметровые светодиоды (как минимум два, разных цве-
тов).
5. * Соединительные провода двух типов:
— с двумя концами типа «штекер»
— с одним концом типа «штекер» и с одним концом типа «гнездо».
6. * Резисторы 330 Ом (не менее трех).
7. Резистор 4,7 кОм.
8. * Кнопки (не менее восьми).
9. Потенциометры 10 кОм (не менее двух).
10. Аналого-цифровой преобразователь MCP3008.
11. RGB-светодиод с общим катодом.
12. Светодиодная адресуемая RGB-лента WS2812B.
13. Гребенка контактов (Рin Нeader).
14. Преобразователь уровня логических сигналов BSS 138.
15. ЖК-дисплей 16 × 2, совместимый с Hitachi HD447802.
16. 0,96-дюймовый OLED-дисплей.
17. Плата расширения Sense HAT.
18. Датчик движения PIR HC-SR501.
19. Пьезоэлектрический зуммер (звукоизлучатель).
20. Датчик газа и дыма MQ-2.
21. Модуль v2 камеры Raspberry Pi.
22. Релейный модуль HL-52S.
23. Пластиковый корпус.
24. Светодиодная лампа на 12В с патроном.
25. Адаптер питания на 12В.
26. Разъем питания DC типа «гнездо» для подачи напряжения пи-
тания постоянного тока.
27. Датчик температуры и влажности DHT22.

1
Эти магазины в Россию доставляют не весь ассортимент, поэтому мы рекоменду-
ем рассмотреть отечественные компании, например «Амперка». — Прим. перев.
2
Для поддержки кириллицы лучше приобрести ЖК-дисплей российского произ-
водства НЭЛТ или аналог с указанием такой поддержки. — Прим. ред.
Руководство для начинающих
26

28. Модуль MotoZero.


29. Двухколесная платформа Smart robot.
30. Четыре батарейки AA.
31. Портативное зарядное устройство.
32. Зажигалка.
33. Монитор с динамиками и кабелем HDMI.
34. Наушники.

ПРИМЕЧАНИЕ
Компоненты, обозначенные *, мы рекомендуем покупать сразу на-
борами. Вам понадобится много таких деталей, а в наборах они
будут дешевле.

Вам также понадобится паяльник, а к нему припой, медная оплетка


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

Загрузка операционной системы


Raspberry Pi работает на операционной системе Linux. ОС Linux —
система с открытым исходным кодом. Она создавалась многими во-
лонтерами со всего мира, и до сих пор любой желающий имеет до-
ступ к ее исходному коду.

ПРИМЕЧАНИЕ
Для Raspberry Pi существуют также версии операционных систем
Android и Windows, но все же они не так хорошо работают с Pi,
как Linux. Поэтому мы будем использовать именно Linux.

Существует несколько дистрибутивов Linux для Raspberry Pi,


но для новичков рекомендуется Raspbian. Он бесплатный для скачи-
вания и больше всего обсуждается в сообществе Raspberry Pi, а зна-
чит, вы сможете гораздо быстрее решать свои проблемы и получать
ответы на возникающие вопросы.
Загрузка операционной системы
27

У Raspberry Pi нет жесткого диска, поэтому операционную систе-


му нужно устанавливать на карту памяти microSD. Для этого вам
понадобится обычный персональный компьютер.
Проще всего установить Raspbian с помощью программы New Out
Of the Box (NOOBS) — простого установщика операционных систем,
в котором уже есть нужный нам дистрибутив Raspbian.

Загрузка NOOBS

Скачать NOOBS можно с сайта https://www.raspberrypi.org / down-


loads /noobs / NOOBS выпускается в двух версиях: NOOBS и NOOBS
LITE. Однако в NOOBS LITE не входит дистрибутив Raspbian, сле-
довательно, нужно выбрать просто NOOBS (рис. 0.6).
Нажмите кнопку Download ZIP (скачать Zip-архив), чтобы ска-
чать архив с NOOBS. (Это большой по объему файл, поэтому его
скачивание займет некоторое время.) Затем найдите скачанный архив
в папке Загрузки или в той папке, куда вы его сохранили, но не рас-
паковывайте.
Следующий шаг — копирование содержимого архива с NOOBS
на пустую карту памяти
microSD, но сначала эту
карту нужно отформатиро-
вать. Объем памяти карты
должен быть не менее 8 Гб.
Выполните форматирова-
ние, следуя инструкциям
для операционной системы,
которая установлена на ва-
шем компьютере. Рис. 0.6. Скачивание NOOBS

Форматирование карты microSD


в Windows или macOS

Чтобы отформатировать карту microSD, подключите ее к компьюте-


ру, а затем следуйте этим инструкциям:
1. Перейдите на сайт https://www.sdcard.org / downloads /format-
ter_4 / и скачайте программу форматирования SD-карт SD Memory
Card Formatter для Windows или Mac (рис. 0.7).
2. После того как вы примете условия использования, должно на-
чаться скачивание ZIP-архива с программой.
Руководство для начинающих
28

Рис. 0.7. Скачивание программы SD Memory Card Formatter

3. Запустите установочный файл, чтобы установить SD Memory


Card Formatter на свой компьютер. Затем подключите карту microSD
к компьютеру и запустите программу.
4. Если у вас установлена система Windows, то в диалоговом окне
открывшейся программы выберите из выпадающего списка диск ва-
шей SD-карты и ниже опцию Overwrite format (формат перезаписи).
Теперь нажмите кнопку Format (форматировать) для начала форма-
тирования (рис. 0.8).
5. Если ваша система macOS, то в диалоговом окне открывшей-
ся программы выберите диск вашей microSD в выпадающем списке.
Далее выберите опцию Overwrite format (формат перезаписи) и пе-
реименуйте вашу карту в BOOT (рис. 0.9). В завершение нажмите
кнопку Format (форматировать).

Рис. 0.8. Диалоговое окно SD Memory Card Formatter в Windows


Загрузка операционной системы
29

Рис. 0.9. Диалоговое окно SD Memory Card Formatter в macOS

Форматирование карты microSD в Linux

Чтобы отформатировать карту microSD в ОС Linux, подключите ее


к компьютеру и следуйте нашим инструкциям:
1. Перейдите на сайт http://gparted.org / и скачайте программу
GParted.
2. Установите и запустите GParted.
3. В правом верхнем углу открывшегося окна программы выбери-
те свою карту microSD (рис. 0.10).
4. В нижней половине окна вы увидите список разделов памя-
ти, уже имеющихся на вашей карте. Щелкните правой кнопкой
мыши по любому из разделов и удалите его. Таким же образом
удалите все остальные разделы, чтобы память карты стала нераз-
меченной.
5. Щелкните правой кнопкой мыши по неразмеченной области па-
мяти и выберите Create New Partition (создать новый раздел).
6. В открывшемся окне выберите файловую систему fat32, введите
для создаваемого диска метку BOOT и нажмите кнопку Add (доба-
вить) (рис. 0.11).

Powered by TCPDF (www.tcpdf.org)


Руководство для начинающих
30

Рис. 0.10. GParted в Linux Ubuntu

Наконец, нажмите зеленую галочку в верхней части окна, чтобы


завершить форматирование. В итоге ваша карта microSD должна вы-
глядеть как на рис. 0.12.

Рис. 0.11. Создание нового раздела памяти карты microSD в про-


грамме GParted
Настройка Raspberry Pi в качестве настольного компьютера
31

Рис. 0.12. Карта microSD, отформатированная в GParted

Загрузка Raspbian на карту памяти microSD

После того как ваша карта microSD отформатирована, подключите


ее к компьютеру и скопируйте на нее файлы из ранее скачанного
архива NOOBS.zip. Затем безопасно извлеките карту.
Теперь ваша карта памяти готова к работе. Подключив ее
к Raspberry Pi, вы можете настроить свою Pi как полноценный на-
стольный компьютер.

Настройка Raspberry Pi в качестве


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

Подключение Raspberry Pi

Вот список того, что вам понадобится для использования вашей Pi


в качестве настольного компьютера:
• Карта памяти microSD с установленной на ней NOOBS
• Монитор или телевизор
• Кабель HDMI
• Мышь
• Клавиатура
• Адаптер питания

ПРИМЕЧАНИЕ
Если вы по какой-то причине еще не установили NOOBS на кар-
ту памяти microSD, вернитесь в раздел «Загрузка NOOBS», чтобы
вспомнить, как это делается.

Адаптер питания нужно подключать последним, а остальные ком-


поненты — в любом порядке. Но если вы все-таки боитесь запутать-
ся, просто выполните пошагово следующие действия:
1. Вставьте карту памяти microSD в слот для карт microSD на Pi.
2. Подключите монитор или телевизор к разъему HDMI на плате
Raspberry Pi с помощью кабеля HDMI.
3. Подключите мышь и клавиатуру к свободным USB-портам.
4. Вставьте адаптер питания в разъем питания microUSB.
5. Подключите адаптер питания к розетке.

Все эти подключения показаны на рис. 0.13.


При подаче питания на Raspberry Pi должны загореться красный
и зеленый светодиоды (рис. 0.14). Эти светодиоды, которые на-
зываются светодиодами состояния, могут дать вам много полезной
информации о вашей Pi. Красный светодиод горит, когда плата Pi
подключена к источнику питания. Зеленый светодиод мигает, когда
активна карта памяти microSD.
Настройка Raspberry Pi в качестве настольного компьютера
33

Рис. 0.13. Соединение платы Raspberry Pi с основными периферий-


ными устройствами

Рис. 0.14. Светодиоды состояния Raspberry Pi


Руководство для начинающих
34

Первый запуск вашей Pi

Raspberry Pi включается автоматически, как только вы подключите


к ней питание. Если вы правильно перенесли NOOBS на карту па-
мяти, то через несколько секунд на экране монитора появится окно
установки (рис. 0.15).

Рис. 0.15. Окно установки NOOBS

По умолчанию должна быть выбрана система Raspbian. В нижней


части экрана (под окном установки NOOBS) выберите язык и рас-
кладку клавиатуры.

ПРИМЕЧАНИЕ
Очень важно выбрать правильную раскладку клавиатуры. Иначе,
когда вы печатаете, на экране будут появляться не те символы,
что вы набираете.
Настройка Raspberry Pi в качестве настольного компьютера
35

Рис. 0.16. Рабочий стол Raspbian

После выбора языка и раскладки клавиатуры нажмите Install


(установить) в левом верхнем углу установочного окна. Затем ваша
Pi спросит, нужно ли перезаписать карту памяти, — выберите Yes.
Далее начнется установка.
Когда установка будет завершена, нажмите OK — появится сооб-
щение с просьбой перезагрузить Pi. После перезагрузки вы должны
увидеть рабочий стол Raspbian (рис. 0.16).

ПРИМЕЧАНИЕ
Установочное окно появляется только при первом запуске Pi. При
последующих запусках вы сразу будете попадать на рабочий стол.

Поздравляем! Вы успешно настроили свою Raspberry Pi на работу


в качестве настольного компьютера.
На этот раз вам не нужно было вводить имя пользователя и па-
роль, но в будущем вас могут попросить сделать это. Запомните,
по умолчанию имя пользователя — pi, а пароль — raspberry, однако
вы можете изменить их в любой момент. Для этого перейдите в глав-
ное меню панели задач, выберите пункт Preferences→Raspberry Pi
Configuration. Чтобы изменить пароль, нажмите кнопку Change
Password (изменить пароль) на вкладке System (рис. 0.17).
Руководство для начинающих
36

Рис. 0.17. Смена пароля на Raspberry Pi

Что касается смены учетной записи пользователя, то для выпол-


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

СОЗДАНИЕ НОВОЙ УЧЕТНОЙ ЗАПИСИ ПОЛЬЗОВАТЕЛЯ


Чтобы добавить новую учетную запись пользователя для вашей
Raspberry Pi, запустите терминал и наберите в нем следующую
команду:

pi@raspberrypi:~ $ sudo adduser username

где username — имя пользователя, которое вы хотите задать.


После этого нужно ввести пароль и повторить его (вводимые
символы не будут отображаться в терминале). Затем вам будет
предложено ввести дополнительную информацию о пользовате-
ле, но этот шаг можно пропустить, нажав клавишу ENTER. Нако-
нец, терминал предложит вам проверить введенную информацию
о пользователе. Если все правильно, введите Y и нажмите клавишу
ENTER. Теперь у вас есть новая учетная запись пользователя.
Настройка Raspberry Pi в качестве настольного компьютера
37

Обзор рабочего стола

Посмотрев на рабочий стол Raspbian, вы заметите, что он очень по-


хож на рабочий стол вашего обычного компьютера. Здесь тоже есть
панель задач, рабочая область, корзина. Вы можете открывать окна
программ, перетаскивать их, изменять размеры окон и закрывать их.
Вы можете работать с папками (создавать, переименовывать, пере-
мещать и удалять их), запускать приложения и делать большинство
вещей, которые вы обычно делаете на своем настольном компьютере.
Работа с панелью задач. Панель задач находится в верхней части
экрана. В ее правой части расположено несколько полезных значков
(рис. 0.18).

Рис. 0.18. Значки в правой части панели задач

В левой части панели задач есть кнопка вызова меню панели задач
и несколько значков быстрого запуска программ (рис. 0.19). Пона-
жимайте эти значки и посмотрите, какие программы они запускают.

Рис. 0.19. Значки быстрого запуска программ в левой части панели


задач

Меню панели задач. Если нажать кнопку вызова меню панели


задач (значок Raspberry Pi — малинка — в левой части панели за-
дач), откроется выпадающее меню с раскрывающимися подменю
(рис. 0.20).
Руководство для начинающих
38

Раскройте каждый пункт меню


и посмотрите, что в нем содержится.
Например, пункт Programming (про-
граммирование) в своем подменю со-
держит несколько инструментов для
написания программ на языках Java
и Python.
Файловый менеджер. В левой
части панели задач вы можете найти
значок папки, при нажатии на кото-
рый запускается файловый менеджер
(рис. 0.21). Файловый менеджер —
это папка с множеством папок вну-
три нее1, в которых вы можете раз-
мещать свои файлы и таким образом
структурировать информацию на ва-
шем компьютере. Папки можно соз-
давать, переименовывать, перемещать
Рис. 0.20. Меню панели задач и удалять.

Рис. 0.21. Файловый менеджер

1
Файловый менеджер — это программа для работы с файлами, хранящимися на ва-
шем компьютере. В нем ваша файловая система представлена как структура папок,
лежащая в одной (корневой) папке. — Прим. перев.
Настройка Raspberry Pi в качестве настольного компьютера
39

Доступ к терминалу. Еще одна важная программа — терминал. При


работе с Raspberry Pi вы будете много и часто обращаться к нему. По-
просту говоря, терминал передает введенные через командную стро-
ку текстовые инструкции для взаимодействия с Raspberry Pi. Чтобы
получить доступ к терминалу, нажмите на значок быстрого запуска
терминала на панели задач (см. рис. 0.19) или откройте меню пане-
ли задач и выберите пункт Accessories→Terminal. Должно открыться
окно, как на рис. 0.22.

Рис. 0.22. Окно терминала Raspberry Pi

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


Raspberry Pi. Например, с помощью команды ls foldername (где
foldername — имя вашей папки) вы можете узнать, что находится
внутри заданной папки, а с помощью команды mkdir foldername
создать новую папку с именем foldername. Таким образом, в ос-
новном вы можете делать все, что делаете на своем обычном компью-
тере, но вместо «кликания по значкам» вы вводите соответствующую
текстовую команду.
Не пугайтесь терминала! Поначалу работа с ним может показать-
ся сложной, но в каждом проекте этой книги вам будут даны все
необходимые команды. Их нужно будет просто ввести в командную
строку терминала, а это совсем несложно.
Подключение вашей Pi к Интернету. Вы можете подключить
свою Pi к Интернету с помощью Wi-Fi подключения или через мо-
дем с помощью кабеля Ethernet. Подключение через Wi-Fi выполня-
ется так же просто, как и на обычном компьютере.
Нажмите второй значок в правой части панели задач (рис. 0.23).
Выберите нужную вам сеть из списка доступных подключений и вве-
дите свои учетные данные. Готово.
Если вы используете кабель Ethernet, то просто подключите его
к порту Ethernet вашей Pi.
Руководство для начинающих
40

Рис. 0.23. Подключение к сети Wi-Fi

Доступ к Интернету и просмотр веб-сайтов. Браузер по умол-


чанию для Raspberry Pi — Chromium (рис. 0.24). Чтобы запустить
Chromium, щелкните по его значку на панели задач (синий глобус)
или выберите в меню панели задач пункт Internet→Chromium.
Как видите, Chromium очень похож на Google Chrome. И действи-
тельно, Chromium — это браузер с открытым исходным кодом, на ко-
тором изначально основан Google Chrome.

Рис. 0.24. Браузер Chromium

Подключение внешних устройств. Для работы с внешним устрой-


ством, например USB-флеш-накопителем (флешкой), просто вставьте
его в один из доступных USB-портов на вашей Pi. Чтобы записать
файлы на флешку или посмотреть, что на нее уже записано, выбе-
рите в открывшемся окне (рис. 0.25) пункт Open in File Manager
(открыть в файловом менеджере).
Настройка Raspberry Pi в качестве настольного компьютера
41

Рис. 0.25. Это окно открывается, когда вы подключаете внешнее


устройство

Когда вы закончите работать с флешкой, не забудьте безопасно из-


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

Выключение, перезагрузка и выход из системы

Когда вы хотите выключить свою Raspberry Pi, позаботьтесь, чтобы


это было сделано правильно. Если вы просто выдерните вилку адап-
тера питания из розетки, то можете повредить свою Pi. Самый про-
стой способ правильно выключить Pi — выбрать в меню панели за-
дач пункт Shutdown (выключение) и в нем нажать кнопку Shutdown
(рис. 0.26).
Дождитесь, пока переста-
нет мигать зеленый светодиод,
и только после этого отключайте
адаптер питания.
С помощью меню Shutdown
вы можете также перезагрузить
(Reboot) свою Pi или выйти
(Logout) из системы. Опция вы-
хода из системы полезна, если Рис. 0.26. Опции меню выключения
Руководство для начинающих
42

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


последующего входа в учетную запись просто введите имя пользо-
вателя и пароль.
Теперь ваша Pi готова к запуску программ! Но сначала давайте
познакомимся с основами программирования на языке Python: поль-
зовательским вводом данных, переменными, математическими опера-
торами, условными операторами и циклами.

Знакомство с языком Python


Python — это язык программирования, на котором вы будете писать
программы в большинстве проектов этой книги. Это один из самых
простых и легких в освоении языков программирования, а значит, вы
справитесь с ним, даже если никогда не программировали раньше.
На вашей Raspberry Pi изначально установлены две версии Python:
Python 2 и Python 3. В этой книге мы будем в основном использо-
вать Python 3 как самую современную версию. Python 2 до сих пор
используют многие программисты, эта версия пока еще обновляется,
но все же постепенно выходит из употребления.

ПРИМЕЧАНИЕ
На Python 2 мы будем программировать только в проекте 12, по-
тому что в нем используются пакеты, которых не было в Python 3
на момент написания этой книги.

Интегрированная среда
разработки Python 3
Чтобы писать код на Python, вам понадобится интегрированная сре-
да разработки Python 3 IDLE (Integrated DeveLopment Environment).
Она устанавливается автоматически при установке дистрибутива
Raspbian, поэтому никаких дополнительных действий от вас не по-
требуется.
Подключите к вашей Pi монитор, мышь и клавиатуру и запусти-
те IDLE. Для этого выберите в главном меню панели задач пункт
Интегрированная среда разработки Python 3
43

Рис. 0.27. Оболочка Python

Programing→Python 3 (IDLE). Откроется окно оболочки Python


(Python Shell). Это и есть IDLE (рис. 0.27).
В оболочке Python вы будете вводить и запускать команды, чтобы
дать понять Python, что нужно делать. Python запускает ваши ко-
манды с помощью интерпретатора. Именно интерпретатор понимает
и запускает ваш код.
Когда оболочка откроется, вы должны увидеть три стрелки >>>
(см. рис. 0.27). Эти стрелки называются приглашением, а их появле-
ние указывает на то, что оболочка готова к работе. К простейшим
командам, которые может выполнить Python, относятся математиче-
ские операции. Попробуйте ввести следующий код:

>>> 2 + 2

Нажмите клавишу ENTER и получите результат:

4
>>>

Как видите, в начале строки с результатом нет приглашения. Бла-


годаря этому можно легко понять, какие строки являются выводом
Python, а какие введены вами.
Руководство для начинающих
44

Основные команды Python


Python может выполнять множество команд разных видов. Собирая
эти команды вместе, вы можете создавать программы. Давайте рас-
смотрим несколько видов таких команд, или операторов.
Математические операторы. Python может выполнять большин-
ство математических операций. В таблице 0.2 приведены основные
математические операторы, применяемые в Python.
Попробуйте использовать эти операторы, чтобы получить навык
работы с оболочкой.

Таблица 0.2. Математические операторы в Python

Оператор Математическая операция


+ Сложение
– Вычитание
* Умножение
/ Деление
// Целочисленное деление
% Получение остатка от деления

Операторы сравнения в Python. В Python с помощью операто-


ров сравнения (табл. 0.3) сравниваются различные значения, стоящие
по разные стороны от оператора, и выявляется связь между ними.
Значение (обычно число или буква) — это один из основных ком-
понентов, с которыми работает программа.

Таблица 0.3. Операторы сравнения в Python

Оператор Описание
== Равно
!= Не равно
> Больше
< Меньше
>= Больше или равно
<= Меньше или равно

Например, введите в оболочке Python следующий код:

>>> 2 > 4
Основные команды Python
45

Вы должны получить результат:

False
>>>

Python проверяет, действительно ли 2 больше 4, и говорит, что это


не так. Но если вы введете:

>>> 2 < 4

то получите результат:

True
>>>

Присвоение значений переменным. Переменная по сути своей по-


хожа на коробку, которую вы создаете для хранения в ней значения
(рис. 0.28). Вы задаете переменной имя, а когда вам нужно будет
использовать значение, то вводите вместо него имя этой переменной.
Чтобы присвоить переменной значение, введите имя переменной, за-
тем поставьте знак равенства (=) и после него введите значение.
Переменные нужны для хранения данных в программе, чтобы вы
могли позже ссылаться на эти данные или повторно их использовать.
Например, введите следующий код:

>>> my_variable = 10

В этой строке вы создали переменную с именем my_variable


и присвоили ей значение 10 (см. рис. 0.28).
Если теперь вы введете имя переменной в оболочку Python, на-
пример так:

>>> my_variable

то в выводе должно быть возвращено


присвоенное ей значение:

10
>>>

Имена переменных не долж- Рис. 0.28. Присвоение значе-


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

они чувствительны к регистру, поэтому my_variable, my_Variable


и MyVariable — это три разные переменные.
Типы данных. В переменных могут храниться не только целые
числа, но и самые разные виды значений (текст, дробные числа и так
далее). Для этого вводится понятие типов данных. Тип данных — это
классификатор значений, который сообщает интерпретатору Python,
какие операции могут выполняться с данным значением и как его
следует хранить. В таблице 0.4 приведены основные типы данных,
которые вы будете использовать наиболее часто.

Таблица 0.4. Типы данных в Python

Тип данных Описание


Int Целое число
Float Десятичная дробь
String Строка (набор символьных данных в кавычках)
Boolean Логическое значение — True (истина) или False (ложь)

Рассмотрим на примерах каждый из этих типов данных:


>>> a = 5
>>> b = 7.2
>>> c = 'Привет'
>>> d = True

Здесь вы видите четыре различных типа присвоенных значений.


Первое из них, присвоенное переменной a, — целое число, то есть
имеет тип данных integer. Переменная b содержит десятичную
дробь, то есть значение типа float. Третье значение c с текстом
«Привет» — это строка (последовательность символов), она имеет
тип данных string. (Обратите внимание, что строка всегда заклю-
чается в одинарные или двойные кавычки.) Наконец, переменной d
присвоено значение True, а значит, она имеет тип данных boolean
и может принимать только логическое значение True или False.
Вы уже познакомились с этим типом данных, когда рассматривали
оператор сравнения (>).

Редактор Python
Оболочка Python удобна для экспериментов с простыми фрагмента-
ми кода, но в нее можно вводить код только по одной строке. Чтобы
написать более серьезную программу (скрипт), нужно собрать вместе
Ваша первая программа на Python
47

много команд и выполнить их за один раз. Скрипты пишутся в ре-


дакторе Python, который похож на текстовый процессор для написа-
ния кода. В редакторе можно создавать, изменять и сохранять файлы
Python. Затем вы выполняете эти скрипты, запустив файл. Файлы
Python имеют расширение .py.
Чтобы открыть новый файл в редакторе Python, перейдите в обо-
лочку Python и выберите пункт меню File→New File (Файл→Новый
файл). Откроется окно редактора (рис. 0.29).

Рис. 0.29. Редактор и оболочка Python

В редакторе Python вы уже не увидите приглашения, потому что


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

Ваша первая программа на Python


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

«Hello, world!» (Здравствуй, мир!). Чтобы сделать это на Python, на-


берите в редакторе следующий код:

#Этот скрипт выводит сообщение 'Здравствуй, мир!'


print('Здравствуй, мир!')

Первая строка — это комментарий. Комментарии должны начинать-


ся с метки хэша (#), которая указывает на то, что любой текст после
# и до конца строки должен игнорироваться интерпретатором Python1.
Комментарии очень полезны, они напоминают вам или тому, кто ис-
пользует ваш скрипт, что именно должен делать данный фрагмент кода.
Вторая строка непосредственно выводит на экран сообщение
«Здравствуй, мир!» с помощью функции print(). Функция «ука-
зывает» интерпретатору Python на необходимость выполнить опре-
деленное действие. В данном случае функция print() указывает
интерпретатору Python отображать все, что вы введете в круглых
скобках. Данные в круглых скобках называются аргументом функ-
ции. Функция print() — это встроенная функция Python, а значит,
вы всегда можете ее использовать.
Прежде чем вы сможете запустить свой код, нужно сохранить
скрипт. Выберите пункт меню File→Save as (Файл→Сохранить как)
и задайте имя вашему скрипту, например hello_world.py. Затем
выберите папку, в которой он будет сохранен.

ПРИМЕЧАНИЕ
Все скрипты, написанные на Python, должны иметь расширение
.py. Не забывайте добавлять расширение к имени файла.

Чтобы запустить скрипт, нажмите клавишу F5 или выберите пункт


меню Run→Run Module (Запуск→Запустить модуль). Результаты вы-
полнения кода отображаются не в редакторе кода, а снова в оболочке
Python. Вы должны увидеть сообщение «Здравствуй, мир!» (рис. 0.30).
Теперь попробуйте самостоятельно изменить аргумент функции
print() и посмотрите, как в оболочке Python отобразятся другие
сообщения.
Пользовательский ввод данных. Вы можете усовершенствовать
свою программу, запросив пользовательский ввод данных. Это озна-

1
Далее вам встретятся термины «закомментируйте» и «раскомментируйте» строку.
Это означает добавить или убрать метку хэша в начале строки. — Прим. ред.
Ваша первая программа на Python
49

Рис. 0.30. Запуск скрипта hello_world.py

чает, что для продолжения своей работы программа «попросит» поль-


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

username = input('Как тебя зовут?')


print('Привет ', username)

Функцию input() вы используете, чтобы запросить пользова-


тельский ввод данных. В этом примере ваша программа спрашивает
у пользователя «Как тебя зовут?». Это сообщение отображается поль-
зователю, и программа не продолжит свою работу, пока пользователь
что-нибудь не введет с клавиатуры. То, что введет пользователь (не-
зависимо от содержания), будет присвоено переменной username
и может быть использовано дальше в программе.
Сохраните эти две строки кода в новом файле с именем username.py
и запустите его, чтобы узнать, что произойдет. Программа попросит
вас ввести ваше имя в оболочке. Когда вы его введете, то должны
увидеть приветственное сообщение: «Привет, введенное_имя».
Функция input() принимает в качестве входных данных толь-
ко строки. Поэтому, если вы хотите запросить число, которое затем
можно будет использовать в программе, вам необходимо преобразо-
вать введенные данные в другой тип данных — integer или float.
Например, если вы хотите запросить возраст пользователя как целое
число, используйте функцию int():

age = int(input('Сколько тебе лет? '))


Руководство для начинающих
50

По аналогии, чтобы преобразовать входные данные во float, ис-


пользуйте функцию float():

height = float(input('Какой у тебя рост? '))

Преобразование строк в числа необходимо, если вы хотите выпол-


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

если (if) какое-то условие выполняется (true):


сделать_что-то()
иначе если (elif) выполняется другое условие:
сделать_что-то_другое()
(...)
или (else):
сделать_что-то_третье()

Например, следующий фрагмент кода пытается «угадать» фрукт,


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

print('Загадайте фрукт:')
print('клубника, банан или киви?')
color = input ('Введите цвет загаданного фрукта: ')
1 if (color == 'красный'):
2 print('Загаданный фрукт — клубника.')
3 elif (color == 'желтый'):
print('Загаданный фрукт — банан.')
4 elif (color == 'зеленый'):
print('Загаданный фрукт — киви.')
5 else:
print('Введено неверное значение.')

Первое условие if проверяет, задал ли пользователь «красный»


цвет 1. Если это так, программа «догадывается», что загаданный
фрукт — клубника и отображает сообщение «Загаданный фрукт —
клубника» 2.
Оператор elif означает «else if» и выполняется, только если пер-
вое условие if не выполнится, то есть ложно. Поэтому, если пользо-
Ваша первая программа на Python
51

ватель ввел не «красный», программа проверяет, задан ли «желтый»


3. Если да, программа отображает сообщение о том, что загаданный
фрукт — банан. Если нет, программа идет дальше и проверяет «зеле-
ный» цвет 4. Если пользователь действительно ввел «зеленый», про-
грамма угадывает фрукт — киви.
Теперь обратите внимание на очень важную вещь. Некоторые
строки кода начинаются с нескольких (точнее с четырех) пробелов.
Эти пробелы называются отступом. Отступы важны для выделения
блоков кода и разделения их между собой. Например, у вас есть опе-
ратор if в 1 и следующая строка имеет отступ 2. Отступ указывает
Python, что строка в 2 относится к предыдущему оператору if, по-
этому строка будет выполняться только в том случае, если условие
if истинно. Строка 3 не имеет отступа, и это означает, что строка
не относится к предыдущему блоку кода и будет выполняться от-
дельно. Отступы в Python очень важны, благодаря им интерпретатор
знает, какой код нужно выполнять сейчас. Поэтому всегда обращайте
внимание на отступы при работе с этой книгой.

ПРИМЕЧАНИЕ
Стандартный отступ в коде на языке Python — это именно четыре
пробела, а не табуляция. Однако в IDLE вы все же можете нажать
клавишу TAB — нужные четыре пробела будут вставлены автома-
тически.

Наконец, если пользователь ошибся в написании цвета или набрал


его не в нижнем регистре, выполняется строка else 5. В этом слу-
чае программа сообщает пользователю, что «Введено неверное зна-
чение».
Таким образом, программа проверяет каждое условие по поряд-
ку. Когда условие ложно, она переходит к следующему, и так далее.
Если условие истинно, программа исполняет соответствующий код
с отступом, и оператор выполняется. Обратите внимание, что огра-
ничений на количество операторов elif в программе нет. Также нет
необходимости добавлять оператор else, но если он все-таки есть,
то должен стоять в самом конце.
Чтобы лучше понять, как работать с условными операторами, при-
думайте несколько собственных примеров и попробуйте реализовать
их, используя функции print() и input().
Циклы while и for. Циклы позволяют выполнять блок кода не-
сколько раз до тех пор, пока выполняется некоторое условие. Су-
Руководство для начинающих
52

ществует два типа циклов: цикл while и цикл for. Например, вы


можете вывести на экран все числа от 1 до 10 с помощью цикла
while. Наберите в редакторе Python следующий код:

number = 1
while(number <= 10):
print(number)
number = number + 1

Код, относящийся к циклу while, обозначен отступом. Он выпол-


няется до тех пор, пока значение переменной number меньше или
равно (<=) 10. При каждом выполнении цикла на экран выводится
текущее значение, а затем к нему прибавляется 1.
Вы также можете вывести на экран числа от 1 до 10, используя
цикл for. Это можно сделать следующим образом:

number = 1
for number in range(1,11):
print(number)

Цикл for выполняется до тех пор, пока значение переменной


number находится в пределах от 1 до 11. Функция range() ав-
томатически присваивает следующее значение числовой переменной
до тех пор, пока не дойдет до 10 (значения, которое на 1 меньше
указанного конечного числа).
Используйте цикл for, если хотите повторить блок кода опреде-
ленное количество раз. Если же код должен повторяться до тех пор,
пока не перестанет выполняться определенное условие, — используй-
те цикл while. В некоторых случаях вы можете использовать любой
из них, но, как вы убедитесь при работе с этой книгой, обычно один
очевидно эффективнее другого.

Разработка простого калькулятора


Чтобы применить свои новые навыки программирования, прямо сей-
час вы напишете программу-калькулятор. Скрипт для этой програм-
мы очень прост и задействует все операторы, с которыми вы только
что познакомились. Итак, ваш калькулятор будет выполнять следу-
ющие действия:
• отобразит приветственное сообщение;
• спросит пользователя, какая операция должна выполняться сейчас;
Разработка простого калькулятора
53

• попросит пользователя ввести первое число;


• попросит пользователя ввести второе число;
• выполнит расчеты;
• выведет результат на экран.
Перейдите в оболочку Python и выберите пункт меню File→New
File (Файл→Новый файл). Скопируйте приведенный ниже код в ре-
дактор Python. (Помните, что все скрипты из этой книги также до-
ступны для скачивания по ссылке http://pilotlz.ru/books/files/10857 /)

1 #Мой калькулятор на языке Python


2 running = True
3 welcome_message = '***Добро пожаловать в мой калькулятор
на Python***'
4 print(welcome_message)

5 while running:
print('Операции')
print('1 = Сложение')
print('2 = Вычитание')
print('3 = Умножение')
print('4 = Деление')
print('5 = Выход из программы')

6 operation = int(input('Введите номер для выбора


операции: '))
7 if operation == 1:
print( 'Сложение')
8 first = int(input('Введите первое число: ' ))
second = int(input('Введите второе число: '))
9 print('Результат = ', first + second)
7 elif operation == 2:
print('Вычитание')
8 first = int(input('Введите первое число: ' ))
second = int(input('Введите второе число: '))
9 print('Результат = ', first — second)
7 elif operation == 3:
print('Умножение')
8 first = int(input('Введите первое число: ' ))
second = int(input('Введите второе число: '))
9 print('Результат = ', first * second)
7 elif operation == 4:
print('Деление')
Руководство для начинающих
54

8 first = int(input('Введите первое число: ' ))


second = int(input('Введите второе число: '))
9 print('Результат = ', first / second)
7 elif operation == 5:
print('Выход из программы... ' )
0 running = False

Давайте разберемся, как работает программа этого калькулятора.


Первая строка — это просто комментарий, который говорит всем, кто
читает программу, что делает наш скрипт 1. Затем мы присваиваем
значения переменным в 2 и 3 и выводим приветственное сообще-
ние 4.
Следующим шагом мы запускаем цикл while 5. Он будет рабо-
тать до тех пор, пока переменная running имеет значение True,
то есть до тех пор, пока пользователь не закроет программу. Мы
просим пользователя выбрать математическую операцию для вы-
полнения. Для этого ему нужно ввести число от 1 до 5. Программа
сохраняет введенное значение в переменной operation 6. Мы ис-
пользуем серию операторов if / elif для выбора правильной опера-
ции для запуска в зависимости от введенного пользователем значения

Рис. 0.31. Запуск скрипта calculator.py


Идеи для продолжения
55

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


нужно выполнить операцию 8. Заключительная строка каждого бло-
ка if / elif выполняет выбранную математическую операцию и ото-
бражает результат 9.
Если пользователь вводит 5, то для переменной running устанав-
ливается значение False, а цикл while останавливается 0.
Запуск скрипта. Сохраните свой скрипт с именем calculator.py.
Затем, чтобы запустить его, нажмите клавишу F5 или выберите
пункт меню Run→Run Module (Запуск→Запустить модуль) На ри-
сунке 0.31 показан результат, который вы должны получить.

Идеи для продолжения


Поздравляем! Вы создали первую собственную программу — работа-
ющий калькулятор. Теперь подумайте, как можно улучшить его. На-
пример, вы могли заметить, что ваш калькулятор принимает на вход
только целые числа. Но ведь настоящий калькулятор работает
и с дробными числами. Подумайте, как это сделать. Еще один спо-
соб усовершенствовать ваш калькулятор — реализовать возможность
выполнять вычисления, в которых задействовано более двух чисел.
Светодиоды
СТОИМОСТЬ: $
ПРИМЕРНОЕ ВРЕМЯ СБОРКИ: 15 минут

ПЕРЕЧЕНЬ КОМПОНЕНТОВ:
• Raspberry Pi
• Макетная плата
• Красный светодиод диаметром 5 мм
• Резистор 330 Ом
• Соединительные провода
1
Мигание светодиодом
Вот вы и добрались до своего первого проек-
та с Raspberry Pi. В этом проекте вы подключите
к вашей Pi светодиод, напишете скрипт на Python
и с его помощью заставите светодиод мигать.
Научиться мигать светодиодом, используя пор-
ты GPIO, — очень важный шаг в освоении Pi. Как
только вы поймете, как управлять светодиодом,
вы сможете управлять практически любыми под-
ключенными устройствами, будь то мотор, лампа
или даже тостер.

Знакомство с портами GPIO


Универсальные порты ввода-вывода GPIO (General Purpose
Input / Output)1 служат для подключения к Raspberry Pi разнообраз-
ного электронного оборудования, например светодиодов и датчиков.
Через них ваша Pi может взаимодействовать с реальным миром, при-
нимая и передавая информацию.
Raspberry Pi 3 модели B имеет 40 портов GPIO, расположен-
ных в два ряда (рис. 1.1). Столько же портов имеют Pi 2 модели B
и Pi 1 модели B+. А вот Pi 1 моделей A и B немного отличаются —
на них только по 26 портов GPIO. Поэтому, если вы используете

1
Их еще называют колодкой универсальных контактов GPIO. — Прим. перев.

Powered by TCPDF (www.tcpdf.org)


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

Рис. 1.1. Макет портов GPIO Raspberry Pi

не Raspberry Pi 3 модели B, загляните в приложение А «Руководство


по портам GPIO Raspberry Pi» в конце книги.
Существует два способа именования порта GPIO: по его имени
(это называется нумерацией GPIO или нумерацией Broadcom) или
по номеру позиции, которую он занимает на колодке (это физическая
нумерация). Например, GPIO 25 соответствует выводу 22. В этой
книге мы будем упоминать порты GPIO, называя их имена.
Порты GPIO могут находиться в двух состояниях:
• HIGH — когда на этот вывод подается напряжение 3,3 В и под-
ключенное к нему устройство включено;
• LOW — когда напряжение на выводе составляет 0 В и подклю-
ченное к нему устройство выключено.

Функция Имя Номер Номер Имя Функция


вывода вывода
Питание, пост. ток 3.3 V 1 2 5V Питание, пост. ток
SDA1, I2C GPIO 2 3 4 5V Питание, пост. ток
2
SCL1, I C GPIO 3 5 6 GND
GPIO_GCLK GPIO 4 7 8 GPIO 14 TXD0
GND 9 10 GPIO 15 RXD0
GPIO_GEN0 GPIO 17 11 12 GPIO 18 GPIO_GEN1
GPIO_GEN2 GPIO 27 13 14 GND
GPIO_GEN3 GPIO 22 15 16 GPIO 23 GPIO_GEN4
Питание, пост. ток 3.3 V 17 18 GPIO 24 GPIO_GEN5
SPI_MOSI GPIO 10 19 20 GND
Знакомство со светодиодами
61

Окончание табл.
Функция Имя Номер Номер Имя Функция
вывода вывода
SPI_MISO GPIO 9 21 22 GPIO 25 GPIO_GEN6
SPI_CLK GPIO 11 23 24 GPIO 8 SPI_CE0_N
GND 25 26 GPIO 7 SPI_CE1_N
2 2
I C ID EEPROM DNC 27 28 DNC I C ID EEPROM
GPIO 5 29 30 GND
GPIO 6 31 32 GPIO 12
GPIO 13 33 34 GND
GPIO 19 35 36 GPIO 16
GPIO 26 37 38 GPIO 20
GND 39 40 GPIO 21

Серым цветом в таблице выделены выводы 27 и 28 — это выво-


ды DNC (do not connect — не подключаться), к ним нельзя ничего
подключать. Также на вашей Pi есть восемь выводов GND (ground —
земля) для подключения заземления. Они выделены черным цветом.
Красным и оранжевым цветами выделены четыре вывода питания
(5 V и 3.3 V соответственно). Выводы, выделенные желтым цветом,
используются для соединения с шиной SPI, а выделенные зеленым —
для связи между интегральными схемами (I2C). Об этих протоколах
связи вы узнаете в проектах 3 и 7.

ПРЕДУПРЕЖДЕНИЕ
Выводы GPIO рассчитаны на работу при напряжении 3,3 В. Поэто-
му, если вы подадите на них более высокое напряжение, то мо-
жете серьезно повредить свою Pi.

Знакомство со светодиодами
Светодиоды бывают самых разных размеров, цветов и форм. Неко-
торые из них даже могут смешивать цвета, в результате чего мож-
но получить почти любой цвет. В этом проекте вы будете работать
с простым 5-миллиметровым красным светодиодом.
Мигание светодиодом
62

Светодиод (LED — light-emitting


diode), как понятно из названия, —
это диод, излучающий свет. Диоды —
это электронные компоненты, имею-
щие полярность, поэтому ток через
них течет только в одном направ-
лении — от положительного вывода
(анода) к отрицательному (катоду).
Две ножки (два вывода) светодио-
да имеют разную длину, чтобы было
легче отличить положительный вывод
от отрицательного (рис. 1.2). Длин-
Рис. 1.2. Красный светодиод ная ножка — анод (+), а короткая —
диаметром 5 мм катод (–).

Подбор подходящего резистора


Сила тока, протекающего через светодиод, не должна превышать
максимального значения, на которое он рассчитан, иначе он может
быстро перегореть. А это может повредить и вашу Pi. Чтобы это-
го не произошло, всегда подключайте светодиоды к плате последо-
вательно с резистором. Резистор — это небольшой электрический
элемент, который ограничивает силу проходящего по цепи тока.
Существуют резисторы с самыми разными значениями сопротив-
ления. Поэтому для каждого устройства есть возможность подобрать
резистор с подходящим значением сопротивления: с одной стороны,
достаточно большим, чтобы защитить ваше устройство от перегора-
ния, а с другой — не настолько большим, чтобы ограничивать его
возможности. Например, резистор со слишком большим для вы-
бранного светодиода сопротивлением может просто не дать ему за-
гореться. Правильное значение сопротивления подбирается исходя
из характеристик светодиода. Большинство светодиодов, которые вы
будете использовать в электронике, рассчитаны на максимальный ток
20 мА. Для светодиода в этом проекте подойдет резистор с любым
значением сопротивления в пределах от 220 до 470 Ом. Учтите, что
чем меньше значение сопротивления, взятое из этого диапазона, тем
ярче будет гореть светодиод.
Значение сопротивления обычно указывается на резисторе четырь-
мя цветными полосками (рис. 1.3). Первые две полоски — первые
две цифры значения сопротивления (номинал). Третья полоска — де-
сятичный множитель, показывающий, какое число нулей нужно до-
Сборка схемы
63

Рис. 1.3. Резистор с сопротивлением 330 Ом

бавить к первым двум цифрам. Четвертая полоска отражает допуск


по сопротивлению, то есть с какой допустимой погрешностью из-
готовлено сопротивление — на сколько процентов фактическое со-
противление может быть выше или ниже номинального значения1.
Например, резистор 330 Ом с допуском в 5% может иметь любое
значение сопротивления между 313,5 и 346,5 Ом.

ПРИМЕЧАНИЕ
Мы рекомендуем вам приобрести набор резисторов с мощностью
рассеивания 1 / 4 Вт. Он будет содержать резисторы с довольно
широким диапазоном сопротивления и подойдет для решения
большинства ваших задач.

Если вам нужна помощь в определении значения сопротивле-


ния резистора, откройте таблицу цветовой маркировки резисторов
в приложении Б в конце книги.

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

1
В России продаются также резисторы с пятью полосками. Для них номинал —
первые три (а не две) полоски. — Прим. перев.
Мигание светодиодом
64

Чтобы подключить светодиод к плате Raspberry Pi, последователь-


но выполните шаги 1—5, представленные ниже. Сверяйте свои дей-
ствия со схемой подключения (рис. 1.4) и, если нужно, с макетом
портов GPIO (см. рис. 1.1).
1. Соедините проводом синюю шину GND на макетной плате
с одним из земляных выводов GND на Raspberry Pi (напоминаем,
это выводы 6, 9, 14, 20, 25, 30, 34 и 39).
2. Вставьте ножки светодиода в отверстия на макетной плате.
3. Установите на макетной плате резистор 330 Ом так, чтобы один
из его выводов был подключен к аноду светодиода (длинной ножке).
4. Соедините проводом второй вывод резистора с портом GPIO
25 (вывод 22).
5. Соедините катод светодиода (короткую ножку) с синей шиной
GND на макетной плате.
Мы показали вам, где именно разместить резистор, но на самом
деле неважно, подключен он к аноду или катоду светодиода. Главное,
чтобы резистор был подключен к одному из выводов светодиода. Вы
также можете спросить, почему мы не подключили катод светодиода
непосредственно к выводу 6 на Pi, ведь нам нужно только одно под-
ключение GND. Все потому, что в более сложных схемах вам при-
дется задействовать шины на макетной плате, поэтому привыкайте
к этому сразу.

Рис. 1.4. Подключение светодиода к плате Raspberry Pi. Изогнутый


вывод светодиода — это анод
Программирование
65

КАК УСТРОЕНА МАКЕТНАЯ ПЛАТА?


Сборка схемы на макетной плате очень проста: концы проводов,
ножки микросхем, светодиодов и других радиодеталей в корпусах
с выводами просто вставляются в отверстия платы и так же про-
сто извлекаются из них. Отверстия на макетной плате с обратной
стороны соединены медными полосками, поэтому сначала вам
нужно вставить компоненты в эти отверстия, а затем соединить
их друг с другом проводами в нужном порядке. Соединение от-
верстий макетной платы в своем ряду между собой показано
оранжевыми линиями на рисунке ниже.
Горизонтальными линиями отмечены шины питания. Синие шины
используются для подключения за-
земления (GND), а красные — для
подключения питания. В середине
макетной платы проходит борозда,
разделяющая на две части ряды
по пять отверстий в каждом. Каж-
дый ряд отверстий электрически
изолирован от других. Устанавли-
вайте свои компоненты в эти ряды.

Программирование
Привыкайте хранить ваши проекты упорядоченно. С этой целью
создайте на рабочем столе папку с именем Projects и сохраняйте
в ней все свои проекты из этой книги. Для начала создайте внутри
этой папки новую папку с именем LEDs и сохраняйте в ней скрипты,
относящиеся к проектам со светодиодами.
Ваш первый проект «Мигание светодиодом» должен работать так:
1. Светодиод загорается на одну секунду (для порта GPIO 25
установлен режим HIGH).
2. Светодиод отключается на одну секунду (для порта GPIO 25
установлен режим LOW).
3. Светодиод снова включается на одну секунду (для порта GPIO
25 установлен режим HIGH).
4. Светодиод снова отключается на одну секунду (для порта
GPIO 25 установлен режим LOW).
Этот алгоритм должен выполняться до тех пор, пока вы не оста-
новите программу.
Во всех проектах этой книги мы будем управлять портами GPIO
Raspberry Pi, используя библиотеку Python gpiozero. Библиотека
Мигание светодиодом
66

gpiozero представляет собой набор интерфейсов для управления


такими распространенными компонентами, как светодиоды, кнопки,
потенциометры, датчики и др.

Написание скрипта
Чтобы создать новый скрипт, запустите Python 3 (IDLE) и выбери-
те пункт меню File→New File. Скопируйте приведенный ниже код
в редактор Python и сохраните скрипт с именем blinking_led.py
в папку LEDs. Напоминаем, что все скрипты можно скачать с сайта
http://pilotlz.ru/books/files/10857 /

#подключаем необходимые библиотеки


1 from gpiozero import LED
2 from time import sleep

#создаем объект с именем led, который связан с GPIO 25


3 led = LED(25)

#объявляем переменную с именем delay, которая хранит


время задержки в секундах
4 delay = 1

5 while True:
#включаем светодиод на время, равное времени задержки
6 led.on()
print ('светодиод включен')
7 sleep(delay)
#выключаем светодиод на время, равное времени задержки
8 led.off()
print('светодиод выключен')
sleep(delay)

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


каждую строку кода отдельно.
Импорт (подключение) библиотек. В 1 вы импортируете LED
из библиотеки gpiozero для управления портом GPIO, к кото-
рому подключен ваш светодиод. Затем вы импортируете функцию
sleep() из модуля time 2.
Объявление вывода. В 3 вы объявляете объект типа LED с име-
нем led, который относится к GPIO 25 (порту, к которому подклю-
чен светодиод). После того как вы это сделали, Python будет пони-
мать, что GPIO 25 — вывод, а значит, ему должен быть установлен
Идеи для продолжения
67

режим HIGH или LOW. Теперь для управления GPIO 25 вы можете


вызывать led.
Начало цикла while. В 5 вы запускаете цикл while с условием
True, которое означает, что этот цикл будет работать вечно, точнее,
до тех пор, пока вы сами не остановите программу. Все строки кода
после объявления цикла имеют отступ, чтобы Python понимал, что
они все — содержимое цикла, который должен выполняться до тех
пор, пока выполняется условие while.
Настройка цифрового вывода. Следующий шаг — настройка циф-
рового вывода для светодиода. Используйте функцию led.on()
6, чтобы установить GPIO 25 в режим HIGH (включить светоди-
од) и функцию led.off() 8, чтобы установить GPIO 25 в режим
LOW (выключить светодиод). Для получения эффекта мигания по-
сле каждого включения и выключения светодиода делается пауза
в одну секунду. Эта пауза прописывается в функции sleep() 7.
Дойдя до нее, интерпретатор Python приостанавливает выполнение
кода на указанное в скобках время (в секундах) 4 и только потом
переходит к следующей строке кода. Это и позволяет включать или
выключать светодиод на определенное время.

Запуск скрипта

Чтобы запустить скрипт, сначала сохраните его, а затем нажмите кла-


вишу F5 или выберите пункт меню Run→Run Module. Ваша схема
должна выглядеть примерно так же, как показано на рис. 1.4, а ваш
светодиод должен включаться и выключаться каждую секунду. Чтобы
остановить выполнение программы, нажмите Ctrl+C.
Поздравляем, вы создали свой первый работающий проект!

Идеи для продолжения


Лучший способ разобраться в электронике и программировании —
эксперименты. Вот вам две простые идеи для экспериментов с соз-
данным проектом:
• измените время паузы в скрипте;
• измените схему и скрипт для управления несколькими свето-
диодами.
Убедитесь в том, что навыков, полученных вами в этом проекте,
достаточно, чтобы выполнить обе эти задачи.
СТОИМОСТЬ: $
ПРИМЕРНОЕ ВРЕМЯ СБОРКИ: 15 минут

ПЕРЕЧЕНЬ КОМПОНЕНТОВ:
• Плата Raspberry Pi
• Макетная плата
• Светодиод диаметром 5 мм
• Резистор 330 Ом
• Кнопочный переключатель
• Соединительные провода
2
Кнопочный светодиодный
фонарик
Этот светодиодный фонарик научит вас приме-
нять кнопочные переключатели и кнопки, что очень
важно для работы с электронными схемами. Вы
узнаете, как использовать переключатели в вашей
схеме для запуска некоторого события при нажа-
тии кнопки и прекращения события, когда кнопка
будет отпущена. В данном проекте событием бу-
дет включение светодиода.

Знакомство с переключателями
и кнопками
Переключатели нужны повсюду. С их помощью вы включаете свет,
регулируете скорость блендера, включаете микроволновую печь и так
далее. Существует множество различных переключателей, некоторые
из них вы можете постоянно видеть вокруг себя и использовать: кно-
почные переключатели, тумблеры, поворотные и магнитные переклю-
чатели. На рисунке 2.1 показано несколько типов переключателей,
которые обычно используются в электронике.
Переключатель может работать как прерыватель, прерывая элек-
трический ток, или как ответвитель, отводя ток в другую часть схе-
мы. В этом проекте будет использоваться простой кнопочный пере-
Кнопочный светодиодный фонарик
70

Рис. 2.1. Типы переключателей, применяемых в электронике

ключатель — переключатель прерывания, который отлично подходит


для схем электроники: он дешевый, идеально вписывается в макет-
ную плату и им легко управлять.
Существует два основных типа кнопочных переключателей: нор-
мально разомкнутые (NO) и нормально замкнутые (NC). Нормально
разомкнутые переключатели (рис. 2.2) имеют по умолчанию разо-
мкнутый контур, предотвращая протекание тока по цепи. Когда вы
нажимаете кнопку, две стороны соединяются, цепь замыкается и ток
протекает.
В нормально замкнутых кнопочных переключателях, если кнопка
не нажата, цепь замкнута. Ток протекает до тех пор, пока вы не на-
жмете кнопку, чтобы разомкнуть цепь и остановить ток.
Кнопочные переключатели имеют две или четыре ножки. Пере-
ключатели с четырьмя ножками чаще встречаются в проектах прото-
типирования, потому что они отлично устанавливаются на макетной
плате. В правой части рис. 2.2 показана схема типичного нормаль-
но разомкнутого переключателя с четырьмя ножками. Ножки 1 и 2
Сборка схемы
71

Рис. 2.2. Внутреннее соединение нормально разомкнутого кнопочно-


го переключателя

всегда соединены между собой, так же как и ножки 3 и 4, то есть


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

Сборка схемы
В этом проекте требуется, чтобы светодиод включался только при
нажатии кнопки, поэтому ваша Raspberry Pi должна различать, когда
кнопка нажата, а когда нет. Эту информацию Pi будет получать через
порты GPIO.
Чтобы собрать схему, выполните следующие шаги (в качестве при-
мера ориентируйтесь на рис. 2.3):
1. Соедините один из выводов GND на Raspberry Pi с синей ши-
ной GND на макетной плате.
2. Установите светодиод на макетной плате и подключите анод
светодиода к GPIO 25 через резистор 330 Ом, как уже делали в про-
екте 1. Соедините катод светодиода с синей шиной GND.
3. Вставьте ножки переключателя в отверстия на середине макет-
ной платы так, чтобы пары его ножек находились по разные стороны
от разделительной борозды. Убедитесь, что между верхней и нижней
парами нет связи. (Помните, что соединение отверстий в рядах раз-
рывается бороздой.)
Кнопочный светодиодный фонарик
72

Рис. 2.3. Схема светодиодного фонарика

4. Подключите одну сторону переключателя к GPIO 2, а другую


к GND (см. рис. 2.3).

Программирование
Этот скрипт должен инициировать разные события в зависимости
от того, нажата кнопка или отпущена. Приведенный ниже псевдо-
скрипт — упрощенная версия кода, изложенная на русском языке,
которая поможет вам понять скрипт на языке Python. Написание
псевдоскрипта — отличный способ сделать «набросок» вашей про-
граммы, описать и понять ее основные функции. Вот как выглядит
псевдоскрипт нашей будущей программы:
• Когда кнопка нажата — светодиод включается.
• Когда кнопка не нажата (то есть отпущена), светодиод остается
выключенным (или выключается, если был включен).
Чтобы создать новый скрипт, запустите Python 3 (IDLE) и вы-
берите пункт меню File→New File. Скопируйте приведенный
ниже код в редактор Python, а затем сохраните скрипт с именем
led_flashlight.py в папке LEDs (напоминаем, что можно скачать
все скрипты с сайта http://pilotlz.ru/books/files/10857 / ):
Идеи для продолжения
73

1 from gpiozero import LED, Button


from signal import pause

2 led = LED(25)
button = Button(2)
3 button.when_pressed = led.on
4 button.when_released = led.off

5 pause()

Этот скрипт достаточно простой. Сначала вы импортируете библи-


отеки LED и Button для управления светодиодом и кнопкой, затем
импортируете pause из библиотеки сигналов 1. Функция pause()
5 поддерживает работу программы даже после того, как весь код
выполнен, для того чтобы обнаруживать новые события. В данном
случае функция pause() постоянно отслеживает состояние кнопки
(нажата / не нажата).
Далее вы создаете объект LED с именем led, который относится
к порту GPIO 25 (порт, к которому подключен светодиод), и объ-
ект Button с именем button, который относится к порту GPIO 2
(порт, к которому подключена кнопка) 2.
Функция button.when_pressed включает светодиод, ког-
да кнопка нажата. При обнаружении нажатия кнопки она вызыва-
ет функцию led.on 3. По аналогии, функция button.when_
released вызывает функцию led.off, чтобы выключить светодиод,
когда кнопка не нажата или отпущена 4.
Чтобы запустить скрипт, нажмите клавишу F5 или выберите пункт
меню Run→Run Module. Светодиод должен светиться, пока нажата
кнопка. Чтобы остановить программу, нажмите Ctrl+C.

Идеи для продолжения


На основе того, чему вы научились в этом простом проекте, вы уже
можете создать множество других проектов. Вот несколько идей, ко-
торые помогут вам проверить свои навыки:
• Добавьте еще несколько кнопок и светодиодов.
• Измените код таким образом, чтобы после нажатия кнопки вы
могли бы отпустить ее, а светодиод продолжал гореть.
• Создайте собственный светофор.
СТОИМОСТЬ: $
ПРИМЕРНОЕ ВРЕМЯ СБОРКИ: 30 минут

НЕОБХОДИМЫЕ ДЕТАЛИ:
• Raspberry Pi
• Макетная плата
• Потенциометр 10 кОм
• Микросхема MCP3008
• Светодиод диаметром 5 мм
• Резистор 330 Ом
• Соединительные провода
3
Регулятор яркости
светодиода
В этом проекте вы соберете регулятор силы света,
управляющий яркостью светодиода с помощью
потенциометра. Важность этого проекта заклю-
чается в том, что вы научитесь преобразовывать
с помощью Raspberry Pi входные аналоговые сиг-
налы в выходные сигналы с широтно-импульсной
модуляцией. Это будут очень полезные навыки
для будущих проектов и для вашего обучения ис-
пользованию Pi в целом.

Знакомство
с потенциометрами
Потенциометры находят широкое примене-
ние в повседневной жизни как регуляторы
мощности, например для управления гром-
костью радиоприемника, регулировки ярко-
сти дисплея, установки скорости вращения
вентилятора и многого другого. Вы буде-
те использовать потенциометр на 10 кОм Рис. 3.1. Потенциометр
(рис. 3.1). на 10 кОм
Регулятор яркости светодиода
76

Потенциометр — это регулируемый вручную переменный рези-


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

Рис. 3.2. Как работает потенциометр: слева — меньшее значение со-


противления, справа — большее

Положение скользящего контакта определяет величину напряже-


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

Чтение аналоговых сигналов


с помощью Raspberry Pi
Порты GPIO вашей Raspberry Pi работают только с цифровыми сиг-
налами, то есть они могут считывать только сигналы уровня HIGH
(высокий) (3,3 В) или LOW (низкий) (0 В) и не различают промежу-
точных значений напряжения между ними. Но потенциометр — ана-
логовое устройство, и при вращении ручки напряжение на его вы-
ходе плавно изменяется от 0 В до 3,3 В. Поэтому вам нужно, чтобы
Pi могла считывать все промежуточные значения в этом диапазоне
(например, 1 В, 1,4 В, 1,8 В и так далее). Только в этом случае мож-
но будет плавно изменять яркость свечения светодиода, а не пере-
ключать его между режимами «включено» и «выключено». В этом
Чтение аналоговых сигналов с помощью Raspberry Pi
77

вам поможет микросхема аналого-цифрового преобразователя (АЦП),


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

Аналого-цифровые преобразователи

Показанная на рис. 3.3 микросхема аналого-цифрового преобразо-


вателя MCP3008 преобразует аналоговые сигналы потенциометра
в цифровые сигналы.
Эта микросхема имеет 16 выводов. Из них восемь являются
аналоговыми входами, которые вы можете подключить к аналого-
вым устройствам. Остальные восемь подключаются к портам GPIO
Raspberry Pi. Схема расположения выводов микросхемы показана
на рис. 3.4. Чтобы идентифицировать каждый вывод, расположите
микросхему полукруглой вырезкой кверху, как показано на рисунке.

Рис. 3.3. Микросхема анало-


го-цифрового преобразователя Рис. 3.4. Расположение выводов микро-
MCP3008 схемы MCP3008

Ниже представлено описание каждого вывода.

Вывод Обозначение Описание


1 CH0 Аналоговый вход (канал 0)
2 CH1 Аналоговый вход (канал 1)
3 CH2 Аналоговый вход (канал 2)
4 CH3 Аналоговый вход (канал 3)
5 CH4 Аналоговый вход (канал 4)
Регулятор яркости светодиода
78

Окончание табл.
Вывод Обозначение Описание
6 CH5 Аналоговый вход (канал 5)
7 CH6 Аналоговый вход (канал 6)
8 CH7 Аналоговый вход (канал 7)
9 DGND Цифровое заземление
10 CS / SHDN Выбор ввода / выключение микросхемы
11 DIN Вход последовательных данных
12 DOUT Выход последовательных данных
13 CLK Синхронизация
14 AGND Аналоговое заземление
15 VREF Вход опорного напряжения
16 VDD Напряжение питания от +2,7 до 5,5 В

Широтно-импульсная модуляция

Как мы уже упоминали ранее, порты GPIO Raspberry Pi могут выда-


вать сигналы только уровня HIGH или LOW и никаких промежуточ-
ных уровней (значений напряжения). Однако вы можете выводить
«поддельные» промежуточные значения напряжения с использовани-
ем широтно-импульсной модуляции (ШИМ) и с их помощью уста-
навливать различные уровни яркости светодиодов для этого проекта.
Если вы будете очень быстро переключать напряжение на свето-
диоде между уровнями HIGH и LOW, ваши глаза не будут успе-
вать за скоростью, с которой светодиод включается и выключается.
Вы просто увидите некоторые градации яркости. На этом и основан
принцип работы ШИМ — вырабатывается выходной сигнал, уровень
которого изменяется между HIGH и LOW с очень высокой (для гла-
за) частотой (рис. 3.5). Градации яркости зависят от коэффициента
заполнения сигнала ШИМ.
Коэффициент заполнения сигнала показывает, какую часть периода
сигнал находится на уровне HIGH. При коэффициенте заполнения
50% светодиод имеет 50-процентную яркость, при нулевом — свето-
диод полностью выключен, при коэффициенте заполнения 100% све-
тодиод полностью включен. Так, изменяя коэффициент заполнения,
можно изменять яркость свечения светодиода.
Сборка схемы
79

Рис. 3.5. Как работает ШИМ

Сборка схемы
Для сборки этой схемы вам необходимо подключить к Pi светодиод,
микросхему MCP3008 и потенциометр, выполняя следующие шаги
(в качестве примера ориентируйтесь на рис. 3.6):
1. Соедините один из выводов GND на Raspberry Pi с синей ши-
ной GND на макетной плате.
2. Соедините контакт питания 3.3 V с красной шиной на макетной
плате.
3. Установите светодиод на макетной плате, подключив его длин-
ную ножку к GPIO 17 через резистор 330 Ом, а короткую ножку —
к GND-шине.
Регулятор яркости светодиода
80

Рис. 3.6. Схема управления яркостью светодиода с помощью потен-


циометра

4. Разместите микросхему MCP3008 на середине макетной платы


и подключите ее, как показано в таблице ниже:

MCP3008 Raspberry Pi

1 Выходной контакт потенциометра

9 GND

10 GPIO 8

11 GPIO 10

12 GPIO 9

13 GPIO 11

14 GND

15 3.3 V

16 3.3 V
Программирование
81

ПРИМЕЧАНИЕ
Перед подачей питания убедитесь, что микросхема MCP3008 под-
ключена правильно, сверившись со схемой расположения выводов
на рис. 3.4. Иначе микросхема может быть повреждена.

5. Подключите один из внешних контактов потенциометра (не важ-


но, какой из них) к GND, а другой к 3.3 V. Выходной контакт по-
тенциометра соедините с выводом 1 микросхемы MCP3008, если вы
этого не сделали ранее.

Программирование
Raspberry Pi читает аналоговые сигналы от микросхемы MCP3008
через шину SPI, поэтому вам необходимо сначала включить ее.
В главном меню панели задач выберите Preferences→Raspberry Pi
Configuration. На вкладке Interfaces включите SPI (как показано
на рис. 3.7) и нажмите OK.
Ваш скрипт должен уметь:
• считывать сигналы с потенциометра через аналоговый вход ми-
кросхемы MCP3008;
• регулировать яркость светодиода с помощью ШИМ;
• изменять коэффициент заполнения сигнала ШИМ в соответ-
ствии с уровнем входного сигнала, считанного с потенциометра.

Написание скрипта

Чтобы создать новый скрипт, за-


пустите Python 3 (IDLE) и вы-
берите пункт меню File→New
File. Скопируйте приведенный
ниже код в редактор Python, а за-
тем сохраните скрипт с именем
brightness_controller.py
в папке LEDs (все скрипты мож-
но скачать с сайта http://pilotlz.
ru/books/files/10857 / ): Рис. 3.7. Включение шины SPI
Регулятор яркости светодиода
82

#подключаем необходимые библиотеки


from gpiozero import PWMLED, MCP3008
from time import sleep

#создаем объект с именем pot, который связан с каналом 0


микросхемы MCP3008
1 pot = MCP3008(0)

#создаем объект для PWMLED с именем led, который связан


с GPIO 17
2 led = PWMLED(17)

3 while True:
#сравниваем значение pot с текущими значениями
выхода потенциометра
4 if(pot.value < 0.001):
#если значение pot очень мало — выключаем
светодиод
5 led.value = 0
6 else:
#изменяем яркость светодиода в соответствии
со значением pot
led.value = pot.value
#выводим значение pot
print(pot.value)
#пауза на 0.1 секунды
sleep(0.1)

Как обычно, вы начинаете написание кода с подключения необхо-


димых библиотек. Затем создается объект pot 1, который ссылается
на канал 0 микросхемы MCP3008 (к этому каналу подключен потен-
циометр). Канал 0 соответствует контакту 1 микросхемы MCP3008,
канал 1 — контакту 2 и так далее по аналогии.
Установка вывода ШИМ и чтение аналоговых сигналов. Библи-
отека gpiozero позволяет управлять яркостью светодиода посред-
ством ШИМ с помощью объекта PWMLED. Таким образом, в 2 вы
создаете объект PWMLED с именем led, относящийся к порту, к ко-
торому подключен светодиод, в данном случае GPIO 17.
Считывая аналоговый сигнал с помощью библиотеки gpiozero,
вы получите сигнал потенциометра со значением pot.value. Пом-
ните, что pot относится к каналу 0 микросхемы MCP3008. Вы бу-
дете получать десятичные значения в промежутке от 0 до 1.
Идеи для продолжения
83

Регулировка яркости. Для регулировки яркости светодиода ме-


тодом ШИМ необходимо изменять коэффициент заполнения сиг-
нала ШИМ. Для регулировки коэффициента заполнения присвойте
переменной led.value значение от 0 до 1, где 0 соответствует
полностью выключенному светодиоду, а 1 — полностью включенному.
В данном скрипте цикл while 3 всегда возвращает значение
True, и работа программы не прекращается. Этот цикл постоянно
проверяет сигнал потенциометра. Если уровень сигнала, считанного
с потенциометра, ниже 0,001 4, то коэффициенту заполнения уста-
навливается значение 0 и светодиод выключается 5. Иначе выпол-
нение кода переходит в блок else 6, в котором коэффициент за-
полнения изменяется в соответствии с уровнем сигнала, считанного
с потенциометра.

Запуск скрипта

Чтобы запустить скрипт, сначала сохраните его, а затем нажмите кла-


вишу F5 или выберите пункт меню Run→Run Module. Теперь вы
можете изменять яркость светодиода, поворачивая ручку потенцио-
метра.

Идеи для продолжения


Знание того, как считывать аналоговые сигналы и управлять выход-
ными сигналами с помощью ШИМ, открывает перед вами огромные
возможности для новых проектов. Для начала вы можете попробо-
вать реализовать следующие:
• Управление несколькими светодиодами с помощью одного по-
тенциометра.
• Создание гистограммы (столбика, ряда) светодиодов, которой
вы можете управлять с помощью потенциометра.
• Управление скоростью мигания светодиода с помощью потен-
циометра.
СТОИМОСТЬ: $
ПРИМЕРНОЕ ВРЕМЯ СБОРКИ: 20 минут

ПЕРЕЧЕНЬ КОМПОНЕНТОВ:
• Raspberry Pi
• Макетная плата
• RGB-светодиод с общим катодом
• Резистор 330 Ом, 3 шт.
• Соединительные провода
4
Графический
пользовательский
интерфейс для
управления многоцветным
светодиодом
В этом проекте мы познакомим вас с многоцвет-
ным RGB-светодиодом, и вы узнаете, как создать
простой графический пользовательский интер-
фейс в Tkinter для управления электроникой.

Знакомство с RGB-светодиодами
RGB-светодиод — это три светодиода в одном (Red — красный,
Green — зеленый и Blue — синий). Комбинируя эти цвета, можно
получить практически любой цвет.
Используя RGB-светодиоды вы, разумеется, можете получить
чистый красный, зеленый или синий свет. Но если менять соот-
ношение интенсивностей элементарных светодиодов, можно по-
лучить любой другой цвет спектра. Например, чтобы получить
чистый синий свет, нужно установить синему светодиоду самую
высокую интенсивность, а зеленому и красному — самую низкую.
Для получения белого света вы должны установить всем трем све-
тодиодам самую высокую интенсивность. На рисунке 4.1 показана
Графический пользовательский интерфейс
86

упрощенная диаграмма смешивания


цветов RGB, которая дает представ-
ление о том, как смешивать красный,
зеленый и синий цвета для получе-
ния различных цветов.
Существует два вида RGB-свето-
диодов:
1. Cветодиод с общим анодом, в ко-
тором соединены положительные выво-
ды всех светодиодов (рис. 4.2, слева).
2. Cветодиод с общим катодом,
в котором соединены отрицательные
Рис. 4.1. Простое смешива- выводы всех светодиодов (рис. 4.2,
ние цветов RGB справа).

Рис. 4.2. RGB-cветодиоды с общим анодом и с общим катодом

RGB-светодиоды имеют четыре вывода — по одному для каждого


элементарного светодиода и еще один для общего анода или катода.
Каждый вывод можно определить по его длине (рис. 4.3).
Если повернуть светодиод так, чтобы общий анод или катод (са-
мый длинный вывод) был вторым слева, то порядок выводов будет
следующий: красный светодиод, общий анод или катод, зеленый све-
тодиод, синий светодиод. В этом проекте мы будем использовать све-
тодиод с общим катодом. Если же у вас уже есть светодиод с общим
анодом, можете использовать и его, но в этом случае следите за раз-
личиями, отмеченными в схеме сборки.
Сборка схемы
87

Рис. 4.3. Выводы светодиодов с общим анодом


и с общим катодом

Сборка схемы
Процесс подключения RGB-светодиода к Raspberry Pi на самом деле
прост и не слишком отличается от подключения обычного светодио-
да. Только в этом случае вам понадобятся три резистора, ограничи-
вающих ток, — по одному для светодиода каждого цвета.
Чтобы собрать схему, выполните следующие шаги (в качестве при-
мера ориентируйтесь на рис. 4.4):
1. Вставьте все четыре вывода светодиода в отверстия макетной
платы и подключите последовательно с каждым цветовым выводом
резистор 330 Ом.
2. Соедините GND с синей шиной макетной платы. Затем соеди-
ните RGB-светодиод с портами GPIO Raspberry Pi в соответствии
с таблицей ниже. Красный светодиод подключите к GPIO 23, катод
к GND, зеленый светодиод — к GPIO 24, синий — к GPIO 25. Про-
верьте правильность соединения по рис. 4.3.

RGB-светодиод Raspberry Pi
Первый вывод: красный GPIO 23
Второй вывод: катод GND
Третий вывод: зеленый GPIO 24
Четвертый вывод: синий GPIO 25

ПРИМЕЧАНИЕ
Если вы используете RGB-светодиод с общим анодом, подключите
самый длинный вывод (анод) к красной шине питания 3,3 В.
Графический пользовательский интерфейс
88

Рис. 4.4. Подключение RGB-светодиода с общим катодом к Rasp-


berry Pi

Программирование
Управлять RGB-светодиодом вы будете с помощью окна пользова-
тельского интерфейса в среде рабочего стола Raspbian. Для создания
такого окна вы будете использовать в вашем скрипте библиотеку
Tkinter. Tkinter уже установлена в вашей системе Raspbian, поэтому
вам просто нужно импортировать ее в свой скрипт.
В окне будут располагаться три слайдера (со значениями от 0
до 1) для управления яркостью красного, зеленого и синего свето-
диодов, а также кнопка закрытия для завершения программы. Регу-
лируя уровни яркости с помощью слайдеров, вы сможете изменять
цвет RGB-светодиода.
Чтобы создать новый скрипт, запустите Python 3 (IDLE) и выбе-
рите пункт меню File→New File. Скопируйте приведенный ниже код
в редактор Python, а затем сохраните скрипт с именем rgb_led_
Программирование
89

controller.py в папке LEDs (все скрипты можно скачать с сайта


http://pilotlz.ru/books/files/10857 / ):

#подключаем необходимые библиотеки


1 from gpiozero import PWMLED
from tkinter import *

#изменяем цвет RGB-светодиода


2 def change_color(self):
red.value = red_slider.get()
green.value = green_slider.get()
blue.value = blue_slider.get()
print(self)

#закрываем окно
3 def close_window():
window.destroy()

#создаем объект PWMLED для каждого цвета


4 red = PWMLED(23)
green = PWMLED(24)
blue = PWMLED(25)

#создаем окно
5 window = Tk()
window.title ('Управление RGB-светодиодом')
window.geometry ('300x200')

#создаем три слайдера для управления светодиодами


6 red_slider = Scale(window, from_=0, to=1,
resolution=0.01, orient=HORIZONTAL, label='Красный',
troughcolor='red', length=200, command=change_color)
red_slider.pack()

green_slider = Scale(window, from_=0, to=1,


resolution = 0.01, orient=HORIZONTAL, label='Зеленый',
troughcolor='green', length=200, command=change_color)
green_slider.pack()

blue_slider = Scale(window, from_=0, to=1,


resolution = 0.01, orient=HORIZONTAL, label='Синий',
troughcolor='blue', length=200, command=change_color)
blue_slider.pack()

Powered by TCPDF (www.tcpdf.org)


Графический пользовательский интерфейс
90

#создаем кнопку закрытия окна


7 close_button = Button(window, text='Закрыть',
command=close_window)
close_button.pack()

8 mainloop()

Сначала вы импортируете объект PWMLED из библиотеки gpiozero


для управления светодиодом с использованием ШИМ и библиотеку
Tkinter для создания пользовательского интерфейса 1. После этого
вы создаете функцию управления цветом светодиода. Помните, что
изначально функция представляет собой блок многократно испол-
няемого кода, который должен выполнять определенные действия.
Python имеет множество встроенных функций, таких как print(),
int() и input(), но вы также можете создавать свои собственные
пользовательские функции, как сделали в этом скрипте. Прочтите раз-
дел «Пользовательские функции», чтобы узнать больше о них.

ПОЛЬЗОВАТЕЛЬСКИЕ ФУНКЦИИ
Для определения новой (пользовательской) функции используется
слово def, за ним следует имя, которое вы хотите задать функции,
и круглые скобки.
После скобок вы добавляете двоеточие (:), а затем указываете
вашей функции, какие инструкции ей нужно выполнять. Python
узнает, какие инструкции являются частью определения функции
с помощью двоеточия и отступов: каждая строка с отступом после
двоеточия является частью функции. Позже вы можете вызвать
эту функцию, то есть запустить выполнение инструкций, из кото-
рых она состоит. Для этого нужно только ввести в код имя этой
функции.

Управление интенсивностью цвета и закрытие окна

Функция change_color() 2 изменяет коэффициент заполнения


сигнала светодиода при изменении значения слайдера. При этом из-
меняются яркость светодиода и, следовательно, цвет, который он из-
лучает. Функция change_color() вызывается каждый раз, когда
изменяется положение слайдеров, поэтому при перемещении слайде-
ра вы должны сразу же увидеть изменение на светодиоде.
Программирование
91

В 4 вы создаете три объекта PWMLED, по одному для обозначения


каждого цвета светодиода RGB.
Функция close_window() 3 закрывает окно с помощью
window.destroy(). Эта функция вызывается, когда вы нажимаете
кнопку «Закрыть» в пользовательском интерфейсе Tkinter.
Далее мы рассмотрим, как создать пользовательский интерфейс
с помощью Tkinter.

Проектирование пользовательского
интерфейса с помощью Tkinter

В 5 вы создаете основное окно вашего пользовательского интерфей-


са. Вы объявляете переменную с именем window, которая является
окном tkinter, с помощью строки window = Tk(). Затем вы за-
даете вашему окну название и размеры с помощью методов title()
и geometry() соответственно.
Создание слайдеров и кнопок. После создания окна вы можете
приступить к добавлению элементов управления (виджетов), таких
как кнопки, заголовки и слайдеры. Используйте виджет Button для
создания кнопки закрытия окна и виджет Scale, чтобы добавить
в ваше окно слайдеры.
Затем вы создаете три слайдера, по одному для каждого цвета
RGB 6, используя следующую конструкцию:

slider_name = Scale(master, option, option, …)

Аргумент master — это окно, в которое вы добавите виджет,


а каждый аргумент option позволяет определить слайдеры, то есть
задать их параметры. В скрипте rgb_led_controller.py вы ис-
пользуете следующие параметры:
• from_ определяет нижний предел диапазона шкалы.
• to определяет верхний предел диапазона шкалы. В нашем слу-
чае это диапазон от 0 до 1.
• resolution задает разрешение слайдера — минимальное различие
между двумя последовательными значениями. В данном случае
разрешение равно 0,01.
• orient определяет ориентацию слайдера: либо HORIZONTAL,
либо VERTICAL. В этом скрипте используются горизонтальные
слайдеры (HORIZONTAL).
Графический пользовательский интерфейс
92

• label устанавливает название слайдера. В этом скрипте вы за-


даете каждому слайдеру в качестве названия цвет светодиода,
которым он управляет.
• troughcolor устанавливает цвет фона слайдера. Фон каждого
слайдера — это цвет светодиода, которым он управляет.
• length определяет длину слайдера в пикселях. Для всех слайде-
ров установлено значение 200.
• command определяет функцию, которая будет вызываться каж-
дый раз при перемещении слайдера. В данном случае переме-
щение слайдера вызывает функцию change_color(), которая
изменяет коэффициент заполнения сигнала светодиода и, следо-
вательно, цвет, который он излучает.
После создания слайдера вы используете функцию pack() для
размещения виджетов в главном окне. Поскольку вы не передаете
функции pack() никаких аргументов, виджеты размещаются в окне
в соответствии с настройками по умолчанию. Это значит, что видже-
ты имеют минимальные размеры и прижимаются к верхней границе
окна или к виджету, расположенному выше них.
Затем вы создаете кнопку «Закрыть» 7, используя следующую
конструкцию:

Button_name = Button(master, option, option, …)

В своем коде вы используете следующие параметры:


• text определяет текст, который будет отображаться на кнопке.
• command определяет функцию, которая будет вызываться при
нажатии на кнопку. В данном случае это функция close_
window(), которая закрывает окно.
Использование цикла Main. Последний оператор скрипта вызы-
вает функцию mainloop() 8. Эта функция представляет собой
бесконечный цикл, позволяющий отрисовывать окна и обрабатывать
события. Функция mainloop() — это то, что поддерживает работу
вашей программы.

Запуск скрипта

Нажмите клавишу F5 или выберите пункт меню Run→Run Module.


Должно появиться окно пользовательского интерфейса (рис. 4.5).
Идеи для продолжения
93

Рис. 4.5. Окно пользовательского интерфейса для управления RGB-


светодиодом

Поздравляем! Вы реализовали свой собственный пользовательский


интерфейс! Теперь попробуйте переместить слайдеры, чтобы изме-
нить цвет светодиода. При изменении положения каждого слайдера
цвет RGB-светодиода должен измениться соответствующим образом.
Чтобы закрыть программу, просто нажмите кнопку «Закрыть».

Идеи для продолжения


Теперь, когда вы умеете создавать графический пользовательский ин-
терфейс, настройте его внешний вид по своему вкусу. Вот некоторые
идеи, которые вы могли бы попробовать реализовать уже сейчас:
• Создайте графический пользовательский интерфейс для управ-
ления включением и выключением обычного светодиода.
• Усовершенствуйте этот интерфейс, чтобы с его помощью можно
было управлять еще и яркостью обычного светодиода.
• Доработайте свой интерфейс, чтобы управлять несколькими све-
тодиодами.
СТОИМОСТЬ: $$
ПРИМЕРНОЕ ВРЕМЯ СБОРКИ: 2 часа

ПЕРЕЧЕНЬ КОМПОНЕНТОВ:
• Raspberry Pi
• Макетная плата
• Адресуемая лента RGB-светодиодов WS2812B
• Модуль преобразования логического уровня BSS 138
• Два потенциометра по 10 кОм
• Микросхема MCP3008
• Кнопочный переключатель
• Трехконтактный соединитель
• Соединительные провода

НЕОБХОДИМОЕ ПО:
• Библиотека WS281X
5
Радужная
светодиодная лента
В этом проекте вы создадите эффект радуги на ос-
нове адресуемой ленты RGB-светодиодов. Кнопка
и два потенциометра — вот все, с помощью чего
вы будете включать и выключать эффект радуги,
а также управлять ее скоростью и яркостью.

Знакомство с адресуемой лентой


RGB-светодиодов WS2812B
Для создания эффекта радуги вы будете использовать ленту RGB-
светодиодов WS2812B. Лента бывает самых разных размеров. Обыч-
но она намотана на катушку (рис. 5.1), и вы можете отрезать от нее
кусок необходимой длины.
На рисунке 5.1 показана лента, которая имеет длину 5 метров
и состоит из 300 адресуемых RGB-светодиодов WS2812B, соединен-
ных последовательно. Для этого проекта отрежьте секцию из 14 све-
тодиодов. По всей длине ленты нанесены метки, по которым и нуж-
но отрезать (рис. 5.2).
Цветом и яркостью каждого светодиода можно управлять инди-
видуально, что позволяет легко создавать удивительные эффекты.
Каждый светодиод имеет встроенную интегральную схему (ИС),
благодаря чему можно управлять всей лентой с использованием
Радужная светодиодная лента
96

только одного порта GPIO, под-


ключенного к среднему выводу
DATA PIN на конце ленты (см.
рис. 5.2).
Для этого проекта нужно про-
делать две операции с лентой:
1. Отрезать кусок ленты с 14
светодиодами по меткам для от-
резания, показанным на ленте.
2. Припаять трехконтактный
соединитель с выводами 5 V,
DATA и GND, как показано на
рис. 5.2.
Теперь вам нужно подобрать
источник питания. Для светоди-
Рис. 5.1. Адресуемая лента RGB- одной ленты необходим источ-
светодиодов WS2812B на катушке ник питания c напряжением 5 В.
Требуемую мощность источника
питания можно определить исходя из мощности, потребляемой каж-
дым светодиодом. При полной яркости (что дает белый свет) один
светодиод потребляет до 60 мА. Но поскольку вам редко понадобит-
ся максимальный ток для всех светодиодов одновременно в течение
длительного времени, можете смело брать по 20 мА на светодиод.
Таким образом, если лента имеет 14 светодиодов, то вам понадобится
источник питания 5 В на ток примерно 20 мА ⋅ 14 = 280 мА.
Вывод DATA, который управляет лентой, требует сигнала с уров-
нем 5 В, но порты GPIO Pi работают от 3,3 В. Поэтому для полу-
чения требуемых 5 В для DATA вы будете использовать компонент,
называемый преобразователем логического уровня.

Рис. 5.2. Устройство адресуемой ленты RGB-светодиодов WS2812B:


ИС — интегральная схема
Знакомство с преобразователем логического уровня
97

ПРИМЕЧАНИЕ
Мы обнаружили, что вывод 5 V Raspberry Pi (например, GPIO 2 или
GPIO 4) способен работать с лентой до 20 светодиодов. Но если
у вас в проектах будет задействована более длинная лента,
то придется использовать внешний источник питания на 5 В для
обеспечения достаточного тока.

Знакомство с преобразователем
логического уровня
Преобразователь логического уровня может преобразовывать сигна-
лы с уровнем 3,3 В в сигналы с уровнем 5 В. Из множества типов
преобразователей логического уровня мы выбрали для этого проекта
двухканальный двунаправленный модуль преобразования логического
уровня (рис. 5.3). Такой же модуль вы можете найти в Интернете
по запросу «модуль преобразования логического уровня bss138».
Двунаправленность этого модуля позволяет конвертировать данные
в обоих направлениях: с 3,3 до 5 В и с 5 до 3,3 В. В этом проекте
вам не нужно преобразовывать 5 В в 3,3 В, но более универсальная
модель в вашем наборе инструментов (по сравнению с однонаправ-
ленной моделью) может пригодиться для будущих проектов. Кроме
того, этот преобразователь логического уровня имеет два канала: ка-
нал 1 и канал 2. Это тоже задел на будущее, потому что в этом про-
екте вы будете использовать только один из каналов для управления
выводом DATA светодиодной ленты.
Скорее всего, выводные контакты к вашему модулю будут постав-
ляться отдельно. Поэтому, чтобы присоединить модуль к макетной
плате, вам придется припаять к нему контакты. Отломите два ряда
по шесть контактов и припаяйте по одному контакту к каждому ма-
ленькому отверстию.
На одной стороне модуля расположены контакты с меньшим на-
пряжением (левая сторона рис. 5.3). Сюда подключается оборудова-
ние, работающее от 3,3 В. На другой стороне — контакты с большим
напряжением (правая сторона рис. 5.3). Сюда присоединяется все,
что должно работать от 5 В. Для этого проекта вам нужно задей-
ствовать один из выводов, отмеченных красной стрелкой, так как вы
хотите преобразовать данные с уровнем 3,3 В в уровень 5 В.
Радужная светодиодная лента
98

Рис. 5.3. Двухканальный двунаправленный модуль преобразования


логического уровня

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


к нему GND с обеих сторон, выводы 3,3 V на стороне низкого напря-
жения и 5 V на стороне высокого напряжения. Затем подайте данные
от Pi на один из выводов последовательного порта TX1 (вы можете
использовать либо канал 1, либо канал 2) и получите данные с уров-
нем 5 В на соответствующем выводе TX0.

Сборка схемы

Итак, вы уже отрезали фрагмент ленты необходимого размера


(14 светодиодов), припаяли выводы на конец ленты и к преобразо-
вателю логического уровня и теперь готовы собрать схему. Для это-
го подключите к Pi кнопку и два потенциометра (через микросхему
MCP3008), а адресуемую ленту RGB-светодиодов — к модулю пре-
образователя логического уровня, как показано на рис. 5.4.

ПРЕДУПРЕЖДЕНИЕ
Помните, что нельзя подключать 5 В непосредственно к портам
GPIO вашей Pi, так как это может повредить ее.
Сборка схемы
99

Рис. 5.4. Схема управления лентой RGB-светодиодов

ПРИМЕЧАНИЕ
Чтобы идентифицировать выводы MCP3008, расположите микро-
схему так, чтобы она была обращена своей лицевой стороной
к вам и полукруглый вырез был вверху. В таком положении пер-
вый вывод — верхний левый, а последний — верхний правый.
Полное описание выводов MCP3008 см. в разделе «Аналого-циф-
ровые преобразователи» в проекте 3.

Пошаговая сборка схемы:


1. Соедините выводы GND и 3.3 V с синей и красной шинами ма-
кетной платы соответственно.
2. Установите микросхему MCP3008 на середине макетной платы
так, чтобы ряды ее ножек находились по разные стороны раздели-
тельной борозды.
Радужная светодиодная лента
100

3. Установите на макетной плате два потенциометра, присоединив


один из внешних выводов к GND, а другой — к 3.3 V.
4. Подключите микросхему MCP3008, как показано в таблице
ниже. Не имеет значения, какой потенциометр к каким контактам
вы подключаете, — они будут работать одинаково.

MCP3008 Вывод
1 Выходной контакт одного из потенциометров
2 Выходной контакт другого потенциометра
9 GND
10 GPIO 8
11 GPIO 10
12 GPIO 9
13 GPIO 11
14 GND
15 3.3 V
16 3.3 V

5. Установите кнопку на макетной плате, расположив ее поверх


борозды. С одной из сторон от борозды подключите одну ножку
к GND, а другую — к GPIO 2.
6. Вставьте выводы ленты RGB-светодиодов в макетную плату.
7. Установите преобразователь логического уровня на макетной
плате. Подключите сторону с меньшим напряжением, как показано
ниже:

Преобразователь Raspberry Pi
логического уровня
TX1 (канал 2) GPIO 18
LV 3.3 V
GND GND

8. Подключите сторону с большим напряжением, как показано


ниже:

Преобразователь Присоединить к
логического уровня
TX0 (канал 2) выводу Data (средний вывод) ленты RGB-светодиодов
HV 5V
GND GND
Программирование
101

9. После подключения преобразователя логического уровня присо-


едините к нему ленту RGB-светодиодов:

Лента RGB-светодиодов Присоединить к


5V 5V
Din выводу TX0 преобразователя логического уровня
GND GND

ПРИМЕЧАНИЕ
Если вы решите выполнить этот проект с лентой в 20 и более све-
тодиодов, вам нужно будет присоединить вывод 5 V ленты к вы-
воду 5 V внешнего источника питания, а GND внешнего источника
питания к GND шине макетной платы.

Программирование
Этот скрипт для управления отдельными светодиодами основывает-
ся на использовании библиотеки WS281X, поэтому вам необходимо
установить эту библиотеку, а затем подключить последовательный
периферийный интерфейс (Serial Peripheral Interface — SPI), который
должен связать светодиодную ленту с Pi.

Установка библиотеки WS281X

Прежде чем установить библиотеку WS281X, установим несколько


дополнительных библиотек, необходимых для ее работы.
1. Откройте окно терминала и установите библиотеки scons,
python3-dev и swig:

pi@raspberrypi:~ $ sudo apt install scons python3-dev swig

2. Находясь в терминале, перейдите на Рабочий стол, создайте


папку Libraries (Библиотеки), а затем перейдите во вновь соз-
данную папку:

pi@raspberrypi:~ $ cd ~ / Desktop
Радужная светодиодная лента
102

pi@raspberrypi:~ / Desktop $ mkdir Libraries


pi@raspberrypi:~ / Desktop $ cd Libraries
pi@raspberrypi:~ / Desktop / Libraries $

3. Клонируйте библиотеку для ее загрузки:

pi@raspberrypi:~ / Desktop / Libraries $ git clone


https://github.com / jgarff / rpi_ws281x.git

4. Перейдите в папку библиотеки rpi_ws281x и запустите ко-


манду scons:

pi@raspberrypi:~ / Desktop / Libraries $ cd rpi_ws281x


pi@raspberrypi:~ / Desktop / Libraries / rpi_ws281x $ sudo scons

5. Перейдите в папку python и установите на свою Pi библио-


теку WS281X:

pi@raspberrypi:~ / Desktop / Libraries / rpi_ws281x $ cd python


pi@raspberrypi:~ / Desktop / Libraries / rpi_ws281x / python $
sudo python3 setup.py install

Теперь вы можете использовать библиотеку WS281X в своем коде.

Подключение интерфейса SPI

Чтобы подключиться к микросхеме MCP3008, необходимо включить


интерфейс SPI. Перейдите в главное меню панели задач и выберите
Preferences→Raspberry Pi Configuration. На вкладке Interfaces найдите
строку SPI и нажмите Enabled (рис. 5.5), а затем нажмите кнопку OK.

Написание скрипта

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


как должна работать схема:
• ваша лента RGB-светодиодов отображает движущуюся радугу;
• один потенциометр управляет скоростью радуги;
• другой потенциометр управляет ее яркостью;
• кнопка запускает и останавливает анимацию радуги.
Программирование
103

Рис. 5.5. Включение интерфейса SPI

ИСПРАВЛЕНИЕ ОШИБКИ «СУМАСШЕДШИЕ СВЕТОДИОДЫ»


Во время работы над рукописью этой книги авторы заметили
ошибку со светодиодами ленты в новых версиях Raspbian.
Вывод, используемый для управления лентой, может применяться
и как аналоговый аудиовыход. Поэтому при подключении светоди-
одной ленты отдельные светодиоды могут словно «сойти с ума»
и работать не так, как должны.
Если что-то подобное будет происходить, когда вы запустите код
на выполнение, для исправления этой ошибки добавьте две стро-
ки в файл config.txt. Запустите терминал и введите в него ко-
манду:

pi@raspberrypi:~ $ sudo nano / boot / config.txt

В открывшемся файле добавьте следующие две строки (в любом


месте):

hdmi_force_hotplug = 1
hdmi_force_edid_audio = 1

Нажмите CTRL+X, чтобы сохранить файл, а затем, когда появит-


ся запрос, введите Y и нажмите клавишу ENTER. Перезагрузите
свою Pi, чтобы изменения вступили в силу.
Теперь можете вернуться к установке библиотек.
Радужная светодиодная лента
104

Чтобы создать новый скрипт, запустите Python 3 (IDLE) и выбе-


рите пункт меню File→New File. Скопируйте приведенный ниже код
в редактор Python, а затем сохраните скрипт с именем rainbow_
effect.py в папке LEDs (помните, что все скрипты можно скачать
с сайта http://pilotlz.ru/books/files/10857 / ).

Листинг 5.1. Код для радужной светодиодной ленты:


#на основе классического примера использования библиотеки
Тони ДиКола NeoPixel

#подключаем необходимые библиотеки


1 from neopixel import *
from time import sleep
from gpiozero import Button, MCP3008

#настраиваем светодиодную ленту


2 LED_COUNT = 14 #количество светодиодов в ленте
LED_PIN = 18 #порт GPIO, к которому подключается лента
(должен поддерживать ШИМ!)
LED_FREQ_HZ = 800000 #частота светодиодов в герцах
(обычно 800 кГц)
LED_DMA = 5 #канал DMA для генерирования сигнала
(попробуем 5)
LED_INVERT = False #задайте True если нужно инвертировать
сигнал

#создаем объекты pot для обращения к каналам 0 и 1


микросхемы MCP3008
3 pot_brightness = MCP3008(0)
pot_speed = MCP3008(1)

# объявляем переменную для управления кнопкой и ставим ее


в соответствие GPIO 2
button_start = Button(2)

#объявляем переменную для управления анимацией


running_animation = False

#генерируем цвета радуги в диапазоне 0—255 градаций


4 def wheel(pos):
if pos < 85:
return Color(pos * 3, 255 - pos * 3, 0)
elif pos < 170:
Программирование
105

pos -= 85
return Color(255 - pos * 3, 0, pos * 3)
else:
pos -= 170
return Color(0, pos * 3, 255 - pos * 3)

#рисуем радугу, которая равномерно распределяется по всем


пикселям
5 def rainbowCycle(strip):
for j in range(256):
for i in range(strip.numPixels()):
strip.setPixelColor(i, wheel((int(i *
256 / strip.numPixels()) + j) & 255))
strip.show()
6 sleep((pot_speed.value*40) / 1000.0)

#функция для запуска и остановки анимации


7 def start_animation():
global running_animation
if running_animation == True:
running_animation = False
else:
running_animation = True

#вызов функции, которая выполняется при нажатии кнопки


8 button_start.when_pressed = start_animation

#создаем объект NeoPixel с заданными настройками


9 strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_
HZ, LED_DMA, LED_INVERT, int(pot_brightness.value*255))

#объявляем ленту
strip.begin()
0 while True:
if running_animation == True:
#задаем яркость светодиодной ленты
strip.setBrightness(int(pot_brightness.value*255))
rainbowCycle(strip)

Сначала вы подключаете библиотеки, которые будете использо-


вать для управления проектом 1. Вам нужны библиотека neopixel
для управления светодиодной лентой и библиотека time для под-
ключения функции sleep(), которая будет управлять временем
задержки. Из gpiozero вы импортируете интерфейсы Button()
Радужная светодиодная лента
106

и MCP3008() для считывания данных от кнопки и потенциометра


соответственно.
Настройка параметров ленты. В 2 вы создаете переменные для
настройки параметров ленты RGB-светодиодов, таких как количе-
ство светодиодов и порт GPIO, используемый для подключения лен-
ты. Затем в 3 вы создаете объекты для двух потенциометров, один
из которых будет управлять яркостью светодиодов через канал 0
микросхемы MCP3008 (контакт 1), а другой — управлять скоростью
смены цветов через канал 1 MCP3008 (контакт 2). Также вы создаете
еще один объект для кнопки, подключенной к GPIO 2. Помимо этих
объектов, вы объявляете переменную для запуска и остановки анима-
ции с именем running_animation, типом Boolean и значением
False по умолчанию (то есть анимация выключена).
Функции создания эффекта радуги. В 4 и 5 вы объявляете функ-
ции, которые создают эффект движущейся (переливающейся) раду-
ги. Эти функции аналогичны тем, которые используются в примере
strandtest.py, поставляемом с библиотекой neopixel. Функ-
ция wheel() генерирует цветовой спектр, изменяя значение цвета
в интервале от 0 до 255. Каждый цвет состоит из красного, зеленого
и синего (RGB) параметров. Изменяя каждый параметр от 0 до 255,
можно получить различные цвета, а в результате получается эффект
радуги. Функция rainbowCycle() распределяет радугу по числу
светодиодов на вашей ленте.
В 6 вы задаете время паузы для функции sleep(). Чтобы рас-
считать время паузы, умножьте значение, считанное с одного из по-
тенциометров (от 0 до 1) на 40, а затем разделите этот результат
на 1000. Умножение значения потенциометра на 40 дает более замет-
ное время паузы. Иначе пауза будет настолько коротка, что эффект
радуги будет слишком быстрым и вы просто не заметите переклю-
чение цветов. Деление на 1000 представляет время паузы в милли-
секундах.
Управление кнопкой. Используя библиотеку gpiozero, вы мо-
жете назначить определенное действие для нажатия на кнопку. Для
этого используется следующий код:

button.when_pressed = function_name

Вместо function_name следует прописывать имя функции,


которая будет вызываться при нажатии на кнопку. Учтите, что эта
функция обязательно должна быть определена до ее вызова. В дан-
ном случае это функция start_animation 8, определенная в 7.
Программирование
107

Обратите внимание, что function_name не имеет круглых ско-


бок. Все потому, что таким образом мы просто выполняем функцию
из другой функции, а не запускаем ее выполнение непосредственно.
В нашем случае мы говорим, что код запускает start_animation,
когда запускается функция button_start.when_pressed.
При нажатии на кнопку значение running_animation изме-
няется. Если до момента нажатия кнопки переменная running_
animation имела значение False, то в момент нажатия оно
изменяется на True, и наоборот. Это позволит вам запускать и оста-
навливать эффект радуги.
Управление анимацией с использованием цикла while. В 9
вы создаете объект Adafruit_Neopixel с именем strip, кото-
рый принимает параметры ленты, заданные вами ранее в 2. Чтобы
управлять яркостью светодиодов ленты, вы используете значение
int(pot_brightness.value*255). Яркость изменяется в соот-
ветствии со значением, считанным с одного из потенциометров (от 0
до 1). Вы умножаете это значение на 255, потому что яркость све-
тодиода ленты имеет диапазон от 0 до 255. Использование функции
int() округляет значение до целого числа. Таким образом, вы смо-
жете настраивать яркость светодиода, поворачивая ручку потенцио-
метра.
Затем вы обращаетесь к функции strip.begin(), которую
необходимо вызвать перед тем, как вызывать объект Adafruit_
Neopixel.
Цикл while 0 поддерживает работу программы. В нем вы уста-
навливаете яркость ленты перед запуском анимации. Если перемен-
ная running_animation имеет значение True, то будет вызвана
функция rainbowCycle() и анимация начнется. Если вы снова
нажмете на кнопку, переменная running_animation изменит свое
значение на False, и анимация остановится.

Запуск скрипта

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


Запустив скрипт как обычно, из редактора Python 3 IDLE, вы полу-
чите ошибку разрешений.
Сохраните скрипт с именем rainbow_effect.py в папке LEDs,
которая находится в папке Projects, и откройте терминал. В нем
перейдите в папку LEDs и запустите свой скрипт:
Радужная светодиодная лента
108

pi@raspberrypi:~ $ cd ~ / Desktop / Projects / LEDs


pi@raspberrypi:~ / Desktop / Projects / LEDs $ sudo python3
rainbow_effect.py

Теперь вы можете управлять скоростью и яркостью радуги, пово-


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

Идеи для продолжения


Вот несколько простых идей, которые вы можете попробовать реали-
зовать, если хотите развить свои навыки управления лентой:
• Зажгите определенный светодиод в середине ленты.
• Зажгите все светодиоды одним цветом.
• Добавьте кнопку переключения между предустановленными эф-
фектами.
• Сделайте так, чтобы светодиоды мигали, словно новогодние огни.
• Придумайте свои собственные эффекты.
Дисплеи
СТОИМОСТЬ: $
ПРИМЕРНОЕ ВРЕМЯ СБОРКИ: 40 минут

ПЕРЕЧЕНЬ КОМПОНЕНТОВ:
• Плата Raspberry Pi
• Макетная плата
• Hitachi HD44780-совместимый ЖК-дисплей 16×2
• Потенциометр на 10 кОм
• Соединительные провода

НЕОБХОДИМОЕ ПО:
• Библиотека Adafruit_CharLCD
6
Отображение напоминаний
на ЖК-дисплее
В этом проекте вы подключите символьный
жидкокристаллический (ЖК) дисплей к плате
Raspberry Pi, чтобы отображать на этом экране
прокручивающиеся сообщения-напоминания. Вы
начнете с вывода статического текста для корот-
ких сообщений, а затем научитесь отображать
на экране прокручивающийся текст для более
длинных сообщений.

Знакомство с ЖК-дисплеями
Жидкокристаллические дисплеи (Liquid Crystal Display — LCD) —
это самые простые и дешевые дисплеи, которые встречаются в по-
вседневной жизни. ЖК-дисплеи можно найти в привычных бытовых
устройствах, таких как торговые автоматы, калькуляторы (рис. 6.1),
парковочные счетчики и принтеры. Они идеально подходят для ото-
бражения текста и небольших значков.
Основная характеристика ЖК-дисплея — это количество строк
и столбцов символов, которые помещаются на экране. ЖК-дисплей
16 × 2 может отобразить 2 строки по 16 символов в каждой. Встре-
чаются и размеры от 8 × 1 до 40 × 4.
Отображение напоминаний на ЖК-дисплее
112

Кроме того, ЖК-дисплеи раз-


личаются по цвету фоновой под-
светки. Вы можете найти множе-
ство фонов самых разных цветов
и даже фоновую RGB-подсветку,
которая позволит вам создать
любой цвет.
В наиболее распространенных
ЖК-модулях работает микросхе-
ма Hitachi HD44780, которая по-
зволяет применять пользователь-
ские символы. На рисунке 6.2
показан стандартный Hitachi
HD44780-совместимый ЖК-дисп-
лей 16 × 2. Для этого проекта
мы рекомендуем выбрать именно
этот тип ЖК-дисплеев. Большин-
ство имеющихся в продаже экра-
Рис. 6.1. Калькулятор с ЖК-
нов 16 × 2 подойдут вам, однако,
дисплеем чтобы не ошибиться, перед по-
купкой проверьте спецификацию
компонента. Также можно оста-
новиться на ЖК-дисплее 20 × 4, если он совместим с микросхемой
Hitachi HD44780.
Если вы внимательно присмотритесь к рис. 6.2, то вы увидите 32
прямоугольника, состоящих из 5 × 8 пикселей. Комбинации включен-
ных и выключенных пикселей образуют фигуры символов.

Рис. 6.2. Стандартный Hitachi HD44780-совместимый ЖК-дисплей


размером 16 × 2
Знакомство с ЖК-дисплеями
113

Пайка штыревого разъема

Обычно ЖК-модуль продается с незапаянным штыревым разъемом


(его еще называют колодкой, рис. 6.3), и вам придется самостоя-
тельно припаять его к модулю, чтобы установить на макетной плате.
Вставьте выводы штыревого разъема в свободные отверстия (должно
быть 16 выводов и 16 отверстий, длинные концы должны быть на-
правлены вниз) и припаяйте их.

Рис. 6.3. ЖК-дисплей с незапаянным штыревым разъемом

Назначение выводов ЖК-модуля

Выводы ЖК-модуля нумеруются от 1 до 16 слева направо, если по-


вернуть модуль так, чтобы выводы были над экраном.

№ контакта Название Описание


1 VSS Земля
2 VDD Питание
3 V0 Регулятор контрастности
4 RS Выбор регистра
5 R/W Выбор чтения / записи
6 E Включение
7–14 DB0—DB7 Порты данных
15 LEDA Анод фоновой подсветки (5 V)
16 LEDK Катод фоновой подсветки (–)
Отображение напоминаний на ЖК-дисплее
114

VSS — это контакт заземления, который подключается к GND.


VDD — вывод питания, подключается к 5 V или к 3.3 V в зависи-
мости от типа ЖК-дисплея, который у вас есть; обычно требуется 5 В.
V0 позволяет регулировать контрастность между символами и фо-
ном с помощью построечного потенциометра, подключенного к дис-
плею.
RS, R / W и E — это управляющие выводы. Если вы используете
дисплей только для вывода текста на экран, то вывод R / W должен
быть постоянно замкнут на землю; в этом случае вы всегда будете
записывать на ЖК-дисплей и не будете читать с него.
Выводы с 7 по 14 — это выводы данных, по ним передается ин-
формация. Контакты 15 и 16 — это анод и катод подсветки.
Из имеющихся у ЖК-модуля 16 выводов для взаимодействия
с Raspberry Pi понадобятся только шесть: выводы 4, 6, 11, 12, 13
и 14.

ПРЕДУПРЕЖДЕНИЕ
Порты GPIO платы Raspberry Pi рассчитаны на 3,3 В, а выводы
большинства ЖК-дисплеев — на 5 В. Это не будет проблемой,
если вы только посылаете данные от Pi к модулю и не считываете
данные с модуля на Pi. Не подключайте вывод R / W 5-вольтового
дисплея напрямую к Pi. Этот вывод отправляет данные с уровнем
5 В, и скорее всего это сожжет вашу Pi.

Сборка схемы
Теперь, когда ваш ЖК-дисплей готов к работе, можно приступить
к сборке схемы этого проекта. Подключайте ЖК-дисплей к Pi со-
гласно шагам 1–4 и ориентируясь на схему, показанную на рис. 6.4.
1. Подключите 5 V и GND Raspbery Pi к шинам макетной платы.
2. Для питания ЖК-дисплея подайте 5 В от шины питания
к выводам 2 (VDD) и 15 (LEDA) ЖК-дисплея. Соедините выводы
1 (VSS), 5 (R / W) и 16 (LEDK) ЖК-дисплея с шиной GND на ма-
кетной плате.
3. Установите подстроечный потенциометр для регулировки кон-
трастности: один из крайних его контактов подключите к GND,
а другой — к 5 V. Затем средний контакт подключите к выводу 3
(V0) дисплея.
Программирование
115

Рис. 6.4. Подключение ЖК-дисплея к Raspberry Pi

4. Подключите порты GPIO платы Pi согласно следующей таблице:

ЖК-дисплей Raspberry Pi
4 (RS) GPIO 27
6 (E) GPIO 22
11 (DB4) GPIO 25
12 (DB5) GPIO 24
13 (DB6) GPIO 23
14 (DB7) GPIO 18

Ну вот, сборка схемы закончена, порегулируйте контрастность вра-


щением потенциометра; при этом вы должны увидеть изменение под-
светки. Если контрастность не меняется, перепроверьте соединение
схемы перед тем, как продолжить проект.

Программирование
Прежде чем писать скрипт для отображения сообщений на ЖК-
дисплее, необходимо установить библиотеку Python Adafruit_
CharLCD для символьных ЖК-дисплеев. Эта библиотека содержит
набор функций, делающих управление ЖК-дисплеем намного проще.
Отображение напоминаний на ЖК-дисплее
116

Подключение библиотеки Python для


символьных ЖК-дисплеев

Перейдите в панель задач рабочего стола Raspberry Pi и откройте


терминал. Перед загрузкой библиотеки Adafruit_CharLCD необ-
ходимо установить следующие зависимости:

pi@raspberrypi:~ $ sudo apt update


pi@raspberrypi:~ $ sudo apt install build-essential
python3 python-dev python-smbus python3-pip git-core

При появлении запроса введите y и нажмите Enter.


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

pi@raspberrypi:~ $ cd ~ / Desktop
pi@raspberrypi:~ / Desktop $ mkdir Libraries
pi@raspberrypi:~ / Desktop $ cd Libraries
pi@raspberrypi:~ / Desktop / Libraries $

Загрузите установочные файлы следующей командой:

pi@raspberrypi:~ / Desktop / Libraries $ git clone https://


github.com / adafruit / Adafruit_Python_CharLCD.git

Перейдите в директорию Adafruit_Python_CharLCD:

pi@raspberrypi:~ / Desktop / Libraries $ cd Adafruit_Python_


CharLCD

И наконец, запустите следующей командой установку библиотеки


Adafruit_CharLCD:

pi@raspberrypi:~ / Desktop / Libraries / Adafruit_Python_CharLCD


$ sudo python3 setup.py install

Поздравляем! Вы успешно установили библиотеку Python для


символьных ЖК-дисплеев. Теперь перейдите в папку Examples
и просмотрите ее содержимое.
Программирование
117

Вывод символьного сообщения

Перейдите в папку Projects и создайте новую папку с именем


Displays. Откройте Python 3 (IDLE), выберите File→New File
и создайте новой скрипт. Затем введите следующий код в редакторе
Python и сохраните скрипт как character_lcd.py (напоминаем,
что все скрипты можно скачать по адресу http://pilotlz.ru/books/
files/10857 / ):

1 import Adafruit_CharLCD as LCD

#конфигурация портов Raspberry Pi


2 lcd_rs = 27
lcd_en = 22
lcd_d4 = 25
lcd_d5 = 24
lcd_d6 = 23
lcd_d7 = 18
lcd_backlight = 4

#определение размеров ЖК-дисплея


3 lcd_columns = 16
lcd_rows = 2

#инициализация ЖК-дисплея
4 lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_
d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows, lcd_backlight)

#вывод вашего сообщения


5 lcd.message('It works \ n You rock!')

Сначала вы импортируете недавно установленную библиотеку для


символьных ЖК-дисплеев 1. Затем в 2 настраиваете конфигурацию
портов Pi. В 3 вы задаете размер ЖК-дисплея. Если у вас дисплей
20 × 4, внесите соответствующие изменения в эти две строчки кода.
После инициализации ЖК-дисплея 4 выводите ваши сообщения
с помощью функции lcd.message(строка) между одинарными
кавычками 5. Экранированный символ \n указывает ЖК-дисплею,
что дальнейший текст надо выводить с новой строки. Вы можете из-
менять это сообщение и вводить все, что вам понравится!1

1
У дисплеев этого типа не предусмотрена поддержка кириллицы «из коробки», по-
этому вам придется выводить текст через дополнительные символы или найти
пользовательскую библиотеку. Самое простое решение — использовать похожие
буквы латиницы ('РА \ хА0ОТАЕТ!'). — Прим. ред.
Отображение напоминаний на ЖК-дисплее
118

Для запуска скрипта нажмите F5 или выберите Run→Run Module,


и ваш дисплей отобразит заданный текст (рис. 6.5).

Рис. 6.5. Ваша схема отображает статическое сообщение

Добавление дополнительных функций

Стоит узнать еще несколько полезных функций, которые можно ис-


пользовать не только для отображения текста. Например, вы може-
те задать установку курсора на определенную позицию или очистку
дисплея при подготовке вывода новых сообщений. Библиотека, кото-
рую вы установили, предоставляет вам следующие функции:
• lcd.message(string) отображает сообщение, введенное
между кавычками;
• lcd.clear() очищает дисплей;
• lcd.show_cursor(boolean) показывает курсор после со-
общения;
• lcd.blink(boolean) показывает мигающий курсор;
• lcd.move_right() перемещает выведенное сообщение
на один символ вправо;
• lcd.move_left() перемещает выведенное сообщение на один
символ влево;
Программирование
119

• lcd.home() устанавливает курсор в первом столбце первой


строки (0,0);
• lcd.set_cursor(int, int) устанавливает курсор в задан-
ном столбце заданной строки.
Например, lcd.set_cursor(2, 1) устанавливает курсор в тре-
тьем столбце второй строки.
Типы данных, выделенные курсивом, указывают, какой тип значе-
ний нужно вводить в качестве аргумента; например, вместо boolean
вы должны ввести True или False.

Прокрутка сообщения напоминания

ЖК-дисплей 16 × 2 довольно маленький, поэтому вы столкнетесь


со сложностями, если попытаетесь отобразить сообщения длиной бо-
лее 32 символов. Но выход есть: мы покажем вам, как писать скрипт
для отображения более длинного сообщения, которое прокручивается
по экрану. Например, это может быть напоминание о визите к вра-
чу, который вы не можете пропустить. В первой строке помещается
заголовок вашего сообщения, например «Напоминание» или «Не за-
быть», а во второй строке будет прокручиваться текст напоминания.
Отображение прокручивающегося сообщения не так просто, как
отображение статического сообщения. Поэтому, прежде чем писать
код, подумаем о том, что мы хотим получить в результате:
• первая строка дисплея отображает статический заголовок;
• вторая его строка отображает прокручивающееся сообщение;
• прокручивающееся сообщение движется справа налево;
• символы должны появляться из крайнего правого столбца;
• символы должны исчезать в крайнем левом столбце.
Сообщение прокручивается непрерывно, пока его не остановят.
В папке Displays создайте новый скрипт в Python 3 (IDLE)
с именем scrolling_text.py, содержащий следующий код:

import Adafruit_CharLCD as LCD


1 import time

#конфигурация портов Raspberry Pi


lcd_rs = 27
lcd_en = 22
lcd_d4 = 25
lcd_d5 = 24

Powered by TCPDF (www.tcpdf.org)


Отображение напоминаний на ЖК-дисплее
120

lcd_d6 = 23
lcd_d7 = 18
lcd_backlight = 4

#определение размеров ЖК-дисплея


lcd_columns = 16
lcd_rows = 2

#инициализация ЖК-дисплея
lcd = LCD.Adafruit_CharLCD (lcd_rs, lcd_en, lcd_d4, lcd_
d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows, lcd_backlight)

#ввод вашего сообщения


2 title = "Не забыть!"
3 reminder = "У вас назначен визит к врачу в следующий
понедельник"

#установка задержки прокрутки


4 delay = 0.3

#функция прокручивания сообщения


5 def scroll_message(reminder, delay):
padding = ' ' * lcd_columns
reminder_message = padding + reminder + ' '
6 for i in range(len(reminder_message)):
lcd.set_cursor(0, 1)
lcd.message(reminder_message[i:(i+lcd_columns)])
time.sleep(delay)

7 lcd.clear()
lcd.home()
lcd.message(title)

#прокрутка сообщения в бесконечном цикле


8 while True:
scroll_message(reminder, delay)

Вы уже знакомы с импортом библиотеки Adafruit_CharLCD,


конфигурацией портов Raspberry Pi, установкой размеров экрана
и инициализацией ЖК-дисплея.
Например, в этом проекте вам также надо импортировать библи-
отеку time 1 для использования функций, связанных со временем.
В 2 и 3 вы вводите текст, который будет отображаться как заго-
Программирование
121

ловок и само сообщение-напоминание соответственно. Переменная


delay 4 задает время, в течение которого символы стоят на месте
перед тем, как сместиться влево. Здесь установлена задержка 0,3 се-
кунды; чем меньше задержка, тем быстрее прокручивается текст.
В 5 вы создаете функцию scroll_message(string, float),
которой будут передаваться два параметра: строка reminder и ве-
щественное число delay. Внутри функции вы сначала создаете пере-
менную padding, содержащую пустой символ, умноженный на чис-
ло столбцов ЖК-дисплея. Она заполнит на экране все слоты для
символов, создав эффект постепенного появления сообщения. Затем
вы создаете новую переменную reminder_message, которая со-
держит переменные padding, reminder и один пустой символ.
Пустой символ нужен, чтобы создать эффект плавного исчезновения
сообщения.
В функции выполняется цикл for 6 от 0 до длины строки
reminder_message. Функция len(object) возвращает длину
объекта — в данном случае число символов в строке reminder_
message, которое говорит, сколько раз надо выполнить цикл.

ПРИМЕЧАНИЕ
В Python используется индексация с нуля — это значит, что все
индексы начинают счет с нуля. Для примера, первый символ стро-
ки имеет индекс 0.

Внутри цикла код начинается с установки курсора в первый


столбец второй строки, где вы будете выводить ваше напоминание.
В следующей строке команда reminder_message[i:(i+lcd_
columns)] обрезает переменную reminder_message, оставляя
только символы от индекса i до индекса i+lcd_columns не вклю-
чительно.
При каждой итерации цикла вы будете выводить разные части ва-
шего сообщения, что и создаст эффект прокрутки (рис. 6.6).
После отображения каждой части сообщения скрипт будет ждать,
пока истечет время, указанное в секундах в переменной delay.
В 7 вы очищаете экран и выводите сообщение-заголовок title
на первую строку, начиная с первого столбца.
И наконец, в 8 вы создаете бесконечный цикл while с условием
True. Эта маленькая хитрость позволяет запускать что-либо снова
и снова до бесконечности. Внутри цикла loop вы вызываете функ-
цию scroll_message(string, float) с вашими аргументами:
reminder и delay.
Отображение напоминаний на ЖК-дисплее
122

Рис. 6.6. Обрезание строки для создания эффекта прокрутки

Запуск скрипта

Нажмите F5 или выберите Run→Module Run для запуска скрипта.


К сожалению, мы не можем показать перемещающийся текст в кни-
ге, но надеемся, что вы поняли идею!

Идеи для продолжения


Мы советуем вам изменить этот скрипт, применяя изученные здесь
и ранее приемы, и поэкспериментировать с функциями, описанными
несколькими страницами ранее в разделе «Добавление дополнитель-
ных функций», чтобы лучше ознакомиться с возможностями ЖК-
дисплея. Далее попробуйте выполнить следующие проекты:
• Создайте предсказатель погоды на ЖК-дисплее. Загляните
в проект 7, где мы показываем, как получить данные о погоде.
• В зависимости от погодных условий, сделайте отображение та-
ких сообщений как, например, «Не забыть зонтик».
• Выведите данные датчика на ЖК-дисплей. Просмотрите проек-
ты 9–12, чтобы узнать, как считывать данные с датчика.
СТОИМОСТЬ: $
ПРИМЕРНОЕ ВРЕМЯ СБОРКИ: 1 час

ПЕРЕЧЕНЬ КОМПОНЕНТОВ:
• Raspberry Pi
• Макетная плата
• OLED-дисплей размером 0,96 дюйма
• Соединительные провода

НЕОБХОДИМОЕ ПО:
• Библиотека Adafruit_SSD1306
7
Мини-устройство
прогноза погоды
В этом проекте вы создадите предсказатель по-
годы на день в выбранной вами местности. Вы
научитесь делать API-запросы, которые бывают
очень полезны для проектов, использующих ка-
кие-либо часто обновляемые данные, а также на-
учитесь управлять OLED-дисплеем.

Знакомство с OLED-дисплеями
В этом проекте используется органический светодиодный дисплей
(Organic Light-Emitting Diode — OLED) модели SSD1306: одно-
цветный, размером 0,96 дюйма, с разрешением 128 × 64 пикселей
(рис. 7.1). По сравнению с ЖК-дисплеем, в котором было зарезер-
вировано 5 × 8 пикселей для каждого символа, OLED-дисплей более
универсальный. Он позволяет выбирать, какие пиксели включать,
а какие выключать, в результате чего можно создавать любой текст
или изображение в любом месте экрана. OLED-дисплей также не тре-
бует подсветки экрана, что обеспечивает очень хорошую контраст-
ность при плохой освещенности. Кроме того, его пиксели потребляют
энергию, только пока они включены, благодаря чему OLED-дисплей
потребляет меньше энергии, чем LCD.
Обычно OLED-дисплеи имеют четыре вывода: GND, VCC, SCL
и SDA (см. рис. 7.1), но можно встретить модели с дополнительным
Мини-устройство прогноза погоды
126

Рис. 7.1. Одноцветный OLED-дисплей SSD1306 размером 0,96 дюйма

выводом Reset. Иногда у некоторых моделей дисплеев выводы мо-


гут быть расположены в другом порядке, например VCC, GND, SCL,
SDA, поэтому при монтаже схемы обращайте внимание на обозначе-
ния выводов.
OLED-дисплей на рис. 7.1 использует встроенный протокол I2C
для обмена информацией с Raspberry Pi, для которого вам потре-
буется задействовать порты SDA и SCL (GPIO 2 и GPIO 3 соот-
ветственно).

ПРИМЕЧАНИЕ
Некоторые OLED-дисплеи используют SPI-протокол вместо I2C
и соответственно имеют другой набор выводов. Проверьте набор
выводов OLED-дисплея перед покупкой.

Использование API-сервиса
OpenWeatherMap
Программный интерфейс приложения (Application Programming
Interface — API) — это набор функций, написанных разработчи-
ками ПО для того, чтобы кто-либо мог использовать их данные
или сервисы. Например, в проекте OpenWeatherMap (https://
Использование API-сервиса OpenWeatherMap
127

openweathermap.org / ) есть API, позволяющий пользователям запра-


шивать данные погоды с помощью различных языков программиро-
вания. В этом проекте вы будете применять API для запроса прогно-
за погоды на день для вашего местонахождения. Умение пользоваться
API с помощью платы Pi даст вам большие возможности получать
широкий спектр непрерывно изменяющейся информации, например
текущие цены на акции, курсы обмена валют, последние новости,
свежая информация о пробках, твиты и многое другое.
Сервис OpenWeatherMap бесплатно предоставит вам все, что нуж-
но для этого проекта, но, чтобы воспользоваться его API, требуется
ключ API, называемый APIID. Для этого:
1. Откройте браузер и перейдите по адресу https://openweather-
map.org / appid /
2. Нажмите кнопку Sign Up и создайте новый аккаунт.
3. Вы попадете на страницу с несколькими вкладками. Выберите
вкладку API keys (рис. 7.2).

Рис. 7.2. Ключи API-сервиса OpenWeatherMap

4. На вкладке API keys вы увидите ключ с именем Default


(по-умолчанию, см. рис. 7.2); с помощью этого уникального ключа
можно запрашивать информацию с сайта. Скопируйте его и сохра-
ните где-нибудь, скоро он вам понадобится. Для каждого отдельного
проекта можно создавать новый ключ, но если вы не очень хорошо
знакомы с применением интерфейсов API, то рекомендуем пользо-
ваться ключом Default.
Мини-устройство прогноза погоды
128

ПРЕДУПРЕЖДЕНИЕ
Ключи API уникальны для пользователя и не следует ни с кем ими
делиться. В нашем случае любой, у кого есть ваш ключ API, может
только запрашивать погоду. Однако если вы, например, использу-
ете интерфейсы API социальных сетей, то у вас могут возникнуть
проблемы с приватностью — кто-то получит доступ к вашей личной
информации. Поэтому не делитесь вашими ключами API ни с кем.

5. Чтобы получить информацию о погоде в выбранном вами ме-


сте, введите следующий URL:

http://api.openweathermap.org / data / 2.5 / weather?q=your_


city, your_country_code&APPID=your_unique_API_key

Замените your_city на название города, для которого вы хотите


получить прогноз, your_country_code на код страны для этого
города и your_unique_API_key на ваш уникальный API-ключ,
полученный на предыдущем шаге. В качестве примера ниже дан ис-
правленный API URL для города Порту в Португалии:

http://api.openweathermap.org / data / 2.5 / weather?q=Porto, PT


&APPID=801d2603e9f2e1c70e042e4f5f6e0-

6. Скопируйте ваш URL в браузер, и API вернет вам пакет ин-


формации о погоде в интересующем вас месте. Листинг 7.1 показы-
вает погоду в г. Порту на день написания этого проекта.

Листинг 7.1. Ответ API:


{"coord":{"lon":8.61,"lat":41.15},"weather":[{"id":802,
"main":"Clouds","description":"scattered clouds",
"icon":"03d"}],"base":"stations","main":{"temp":280.704,
"pressure":1010.06,"humidity":96,"temp_min":280.704,
"temp_max":280.704,"sea_level":1041.03,"grnd_level":
1010.06},"wind":{"speed":1.01,"deg":74.0017},"clouds":
{"all":36},"dt":1487153693,"sys":{"message":0.0042,
"country":"PT","sunrise":1487143701,"sunset":1487182157},
"id":2735943,"name":"Porto","cod":200}

Сейчас это выглядит не очень понятно, но далее вы узнаете, как


с помощью отступов и абзацев организовать эти данные и сделать
их более читаемыми.
Использование API-сервиса OpenWeatherMap
129

ПРИМЕЧАНИЕ
Более подробно прочитать о получении информации о погоде
с помощью API можно по адресу https://openweathermap.org /
current

Структура синтаксиса JSON

Как видите, данные о погоде для вашей местности пришли в специ-


фическом формате с такими символами, как { } [ ] : " " и ,. Этот
синтаксис называется JavaScript Object Notation (JSON) — стандарт
обмена данными, удобный для взаимодействия компьютеров. В син-
таксисе JSON:
• Данные представлены парами имя / значение.
• За каждым именем следует двоеточие (:).
• Пары имя / значение разделяются между собой запятыми.
• Фигурные скобки содержат объекты.
• Квадратные скобки содержат массивы.
Листинг 7.2 показывает, как можно организовать API информацию
в более понятном виде.

Листинг 7.2. Информация API JSON, структурированная для луч-


шего понимания:
{
"coord":{
"lon":-8.61,
"lat":41.15
},
"weather":[{
"id":803,
"main":"Clouds",
"description":"broken clouds",
"icon":"04d"
}
],
"base":"stations",
"main":{
Мини-устройство прогноза погоды
130

"temp":288.15,
"pressure":1020,
"humidity":93,
"temp_min":288.15,
"temp_max":288.15
},
"visibility":10000,
"wind":{
"speed":3.6,
"deg":230
},
"clouds":{
"all":75
},
"dt":1488726000,
"sys":{
"type":1,
"id":5959,
"message":0.002,
"country":"PT",
"sunrise":1488697277,
"sunset":1488738646
},
"id":2735943,
"name":"Porto",
"cod":200
}

Теперь вам будет проще увидеть все различные виды информации,


полученной через API.

Создание API-запроса

Теперь у вас есть URL, который возвращает вам данные о погоде


в вашей местности. В следующем примере показано, как получить
эту информацию с помощью языка Python.
Простейший отрывок кода (листинг 7.3) запрашивает текущую
максимальную температуру в градусах Кельвина в г. Порту и выво-
дит его в оболочке Python. Замените URL в коде на свой, и вы по-
лучите эту информацию для выбранной местности.
Использование API-сервиса OpenWeatherMap
131

Листинг 7.3. Запрос максимальной температуры:


1 import requests
2 weather_data = requests.get('http://api.openweathermap.
org / data / 2.5 / weather?q=Porto,PT&APPID=801d2603e9f2e1c70e
042e4f5f6e0---')
3 temp_max = weather_data.json().get('main').get('temp_
max')
print(temp_max)

В 1 вы импортируете библиотеку requests, необходимую для


совершения API-запросов.
В 2 вы создаете переменную weather_data, в которой сохраня-
ются данные, полученные после API-запроса. Для совершения API-
запроса вы используете команду requests.get('your_url')
с вашим URL в качестве аргумента в одинарных кавычках.
В 3 вы создаете переменную temp_max для выделения части
данных из вашего запроса. В данном случае это максимальная тем-
пература.
Чтобы получить это значение, надо сначала сконвертировать пере-
менную weather_data в формат JSON методом .json(). Затем,
используя метод .get(), получить значение temp_max, которое
и содержит максимальную температуру. В листинге 7.2 main — это
родительский элемент верхнего уровня для данных temp_max, к ко-
торым вы хотите получить доступ, поэтому сначала требуется полу-
чить данные main.
Точно так же можно получить информацию о скорости ветра:

weather_data.json().get('wind').get('speed')

Для этого вам нужно через родительский объект скорости, кото-


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

weather_data.json().get('name')

Когда вы освоите, как делать API-запросы в Python, можете на-


чинать собирать этот проект!
Мини-устройство прогноза погоды
132

БИБЛИОТЕКА REQUESTS
Библиотека requests, также известная как «HTTP для людей», —
это библиотека Python с лицензией Apache2, используемая для от-
правки запросов через HTTP (hypertext transfer protocol — протокол
передачи гипертекста). Эта мощная библиотека упрощает подклю-
чение к веб-серверам через HTTP, что позволяет легко запраши-
вать информацию с любой веб-страницы, как вы это делали выше.

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

OLED-дисплей Raspberry Pi
VCC 3.3 V
GND GND
SDA GPIO 2 (SDA)
SCL GPIO 3 (SCL)
RST (если есть) GPIO 24

Проверьте свою схему по рис. 7.3 и переходите к программе.

Рис. 7.3. Схема подключения OLED-дисплея к Raspberry Pi


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

Программирование
Перед вводом самого скрипта следует установить библиотеку
Adafruit_SSD1306, чтобы можно было использовать OLED-
дисплеи с Raspberry Pi. Эта библиотека упрощает вывод текста
и изображений на экран. Кроме того, вам также надо активировать
протокол I2C для взаимодействия OLED-дисплея с Pi.

Установка библиотеки для OLED-дисплея

Создайте папку Libraries на рабочем столе, если вы еще не соз-


дали ее. Затем откройте терминал и перейдите в эту папку:

pi@raspberrypi:~ $ cd Desktop / Libraries

Склонируйте библиотеку OLED:

pi@raspberrypi:~ / Desktop / Libraries $ git clone https://


github.com / adafruit / Adafruit_Python_SSD1306.git

Установите библиотеку Adafruit_Python_SSD1306:

pi@raspberrypi:~ / Desktop / Libraries $ cd adafruit / Adafruit_


Python_SSD1306
pi@raspberrypi:~ / Desktop / Libraries / adafruit / Adafruit_
Python_SSD1306 $ sudo python3 setup.py install

Активация протокола I2C

Для взаимодействия OLED-дисплея с Pi применяется протокол


I2C, который надо активировать в вашей Pi. Перейдите в глав-
ное меню рабочего стола и выберите Preferences→Raspberry Pi
Configuration (Настройки→Конфигурация Raspberry Pi). Во вклад-
ке Interfaces (Интерфейсы) активируйте I2C (рис. 7.4) и на-
жмите OK.
Мини-устройство прогноза погоды
134

Рис. 7.4. Активация протокола I2C

ПРОТОКОЛ ВЗАИМОДЕЙСТВИЯ I2C


I2C — Inter-Integrated Circuit — это протоколом связи, с помощью
которого осуществляется взаимодействие между несколькими ве-
домыми (slave) интегральными схемами и одним ведущим (master)
чипом. Ведущий чип может связываться с любым ведомым устрой-
ством, но ведомый может связываться только с ведущим. Оба,
и ведомый, и ведущий, могут передавать данные, но передача
всегда контролируется ведущим. В данном случае Raspberry Pi —
это ведущее устройство, а интегральная схема OLED-дисплея —
ведомое. Raspberry Pi осуществляет взаимодействие по протоколу
I2C через GPIO-порты SDA и SCL. Самое большое преимущество
использования этого протокола состоит в том, что вы можете под-
ключить более одного устройства через I2C, используя только пор-
ты SDA и SCL, и нет необходимости использовать дополнительные
порты в разъеме.

Написание скрипта

Откройте Python 3 (IDLE) и выберите File→New File для создания


нового скрипта. Скопируйте код, показанный в листинге 7.4, в ре-
дактор Python и сохраните скрипт как weather_forecast.py
Программирование
135

в папку Displays. (Напоминаем, что можно скачать все скрипты


по адресу: http://pilotlz.ru/books/files/10857 / )

Листинг 7.4. Скрипт weather_forecast.py:


1 import time
import Adafruit_SSD1306
import requests

from PIL import Image


from PIL import ImageDraw
from PIL import ImageFont

#конфигурация портов Raspberry Pi


2 RST = 24

3 #128x32 дисплей с поддержкой I2C


#disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST)

#128x64 дисплей с поддержкой I2C


disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)

#вставьте ваш уникальный OpenWeatherMap.org URL


4 open_weather_map_url = 'http://api.openweathermap.
org / data / 2.5 / weather?q=Porto, PT&APPID=801d2603e9f2e1c70e0
42e4f5f6e0---'

#инициализация дисплея
5 disp.begin()
while True:

#очистка дисплея
disp.clear()
disp.display()

#создание пустого изображения для вывода


#проверьте, что создаете изображение в режиме «1» для
1-битного цвета
width = disp.width
height = disp.height
image = Image.new ('1',(width, height))

#получение объекта рисунка для рисования


на изображении
Мини-устройство прогноза погоды
136

draw = ImageDraw.Draw(image)

#нарисуйте черный прямоугольник, чтобы очистить


изображение
draw.rectangle((0,0,width, height), outline=0, fill=0)

#задание констант для определения области рисования


padding = 2
top = padding

#перемещение слева направо, отслеживание текущей


позиции x для рисования текста
x = padding

#загрузка шрифта по умолчанию


font = ImageFont.load_default()

#запрос данных погоды с openWeatherMap.org


6 weather_data = requests.get(open_weather_map_url)

#отображение местоположения
7 location = weather_data.json().get('name') + ' — ' +
weather_data.json().get('sys').get'('country')
draw.text((x, top), location, font=font, fill=255)

#отображение описания
description = 'Desc ' + weather_data.json().
get('weather')[0].get('main')
draw.text((x, top+10), description, font=font,
fill=255)

raw_temperature = weather_data.json().get('main').
get('temp') –273.15

#температура по Цельсию
temperature = 'Temp ' + str(raw_temperature) + '*C'

#раскомментируйте, чтобы температура отображалась


по шкале Фаренгейта
#temperature = 'Temp ' + str(raw_temperature*
(9 / 5.0) +32) + '*F'
Программирование
137

#отображение температуры
draw.text((x, top+20), temperature, font=font,
fill=255)

#отображение давления
pressure = 'Pres ' + str(weather_data.json().
get('main').get('pressure')) + 'hPa'
draw.text((x, top+30), pressure, font=font, fill=255)

#отображение влажности
humidity = 'Humi ' + str(weather_data.json().
get('main').get('humidity')) + '%'
draw.text((x, top+40), humidity, font=font, fill=255)

#отображение ветра
wind = 'Wind ' + str(weather_data.json().get('wind').
get('speed')) + 'mps ' + str(weather_data.json().
get('wind').get('deg')) + '*'
draw.text((x, top+50), wind, font=font, fill=255)

#вывод изображения на дисплей


8 disp.image(image)
disp.display()
time.sleep(10)

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


библиотеки 1. Библиотека Adafruit_SSD1306 содержит классы
драйверов OLED-дисплеев. Из библиотеки PIL (Python Imaging
Library) вы импортируете три модуля — Image, ImageDraw
и ImageFont — для создания изображения с текстом, который вы
хотите отображать на OLED-дисплее.

БИБЛИОТЕКИ OLED
Библиотека Adafruit_SSD1306 относится ко всему, что выводится
на дисплей, как к изображению, даже к тексту. Три модуля, ис-
пользуемые вами в скрипте, выполняют следующее:
• Image создает новое изображение (объект).
• ImageDraw рисует текст или значки внутри изображения и по-
казывает, что вы увидите на самом OLED-дисплее.
• ImageFont устанавливает шрифт текста.
Мини-устройство прогноза погоды
138

Инициализация OLED-дисплея. Даже если у вашего дисплея нет


вывода Reset, вам все равно нужно установить состояние вывода RST
в вашем скрипте. Если же у вашего дисплея есть вывод Reset, то он
должен быть подключен к порту GPIO 24. В любом случаем вы уста-
навливаете RST на порт GPIO 24 2.
В 3 вы создаете класс для вашего дисплея: для дисплея
128×32 — класс SSD1306_128_32, а для дисплея 128×64 — класс
SSD1306_128_64. Мы дали оба варианта кода, поэтому раском-
ментируйте строку, соответствующую размеру вашего экрана, и за-
комментируйте другую.
В 5 вы инициализируете библиотеку дисплея и подготавливаете
дисплей для рисования текста на нем. Мы прокомментировали этот
код, чтобы вы поняли цель каждой строки.
Создание API-запроса. В 4 вы создаете переменную open_
weather_map_url, в которой хранится API URL. Не забудьте за-
менить URL в этой строке на свой собственный.
В 6 вы делаете API-запрос, после которого идут несколько блоков
кода, работающих аналогично. Поэтому мы объясним только один
из них 7. Вы создаете переменную location, в которой хранится
местоположение. Эта переменная является объединением нескольких
строк. Сначала вы получаете местоположение, используя команду
weather_data.json().get('name'), которая в данном приме-
ре возвращает Porto. Далее добавляете дефис с помощью + ' - '
и после добавляете код страны, используя команду weather_data.
json().get('sys').get('country'); в этом примере она вер-
нет значение «PT». Таким образом в переменной location окажет-
ся значение Porto — PT.
Рисование текста на OLED-дисплее. Функция draw.text(),
рисующая текст на дисплее, принимает следующие параметры:
• x и y — координаты, где текст начинает отрисовываться.
• text — текст для вывода на дисплей.
• font — шрифт, которым текст будет печататься на дисплее.
• fill — яркость пикселей (максимум 255).
Например, для отображения местоположения в верхней строке
экрана применяется следующая команда:

draw.text((x, top), location, font=font, fill=255)

Координаты x и top заданы в (5). В этом примере используется


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

Аналогично устроены блоки кода, отображающие описание пого-


ды, температуру, давление, влажность и ветер. Обратите внимание,
что вам нужно увеличить переменную top, чтобы нарисовать текст
в следующей строке дисплея.
В завершение строки кода в 8 выводят изображение на OLED-
дисплей. Время задержки в последней строке определяет, как быстро
цикл будет обновлять информацию о погоде — в данном случае это
происходит каждые 10 секунд.

Запуск скрипта

Нажмите F5 или выберите Run→Run Module для запуска скрипта.


Поздравляем! Теперь у вас есть крошечный предсказатель погоды,
который даст вам постоянно обновляемые данные о погоде в вы-
бранном вами месте!

Идеи для продолжения


Вы можете использовать API, чтобы получить и другую информа-
цию, а не только прогноз погоды. С помощью поисковой системы
введите запрос, например бесплатный API для <что-то>, чтобы
найти API, к которому вы можете получить доступ. Несколько идей
для начала:
• Пробки на дорогах.
• Твиты.
• Свежие новости.
• Скидки.
• Текущий курс биткойна.
СТОИМОСТЬ: $$
ПРИМЕРНОЕ ВРЕМЯ СБОРКИ: 30 минут

ПЕРЕЧЕНЬ КОМПОНЕНТОВ:
• Raspberry Pi (модель с 40 портами GPIO)
• Плата расширения Sense HAT
8
Игра в Pong с Sense HAT
В этом проекте вы будете создавать свою соб-
ственную игру Pong на светодиодах, используя
плату расширения Sense HAT. Плата Sense HAT
чрезвычайно расширяет возможности Pi благода-
ря дополнительным функциям, таким как свето-
диодная матрица, джойстик и различные датчики
для получения информации из внешнего мира.

Вы будете использовать светодиодную матрицу платы Sense HAT для


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

Знакомство с Pong
Pong — одна из первых видеоигр, когда-либо созданных, Это очень
популярная игра в двумерный настольный теннис (пинг-понг), в ко-
торую можно играть как одному, так и вдвоем. Вы будете делать
версию для одного игрока, которая больше похожа на игру в сквош:
вы отбиваете мяч к стене своей битой и ловите его битой, когда он
возвращается. Если вы пропустили мяч, то проиграли.
Игра в Pong с Sense HAT
142

Знакомство с платой расширения


Sense HAT для Raspberry Pi
На плате Sense HAT для Raspberry Pi расположены светодиодная
RGB-матрица 8×8, пятипозиционный джойстик, гироскоп, акселе-
рометр, магнитометр, датчики температуры, давления и влажности
(рис. 8.1).

Рис. 8.1. Плата расширения Sense HAT для Raspberry Pi

Монтаж платы
В этом проекте монтаж очень прост — вставьте плату Sense Hat в Pi,
а все остальное делается в коде.

ПРИМЕЧАНИЕ
Плата Sense HAT не совместима с Raspberry Pi 1 моделей А и В.
Однако вы можете это преодолеть с помощью эмулятора, если
у вас как раз такая Pi.

Поставьте Sense HAT поверх вашей Raspberry Pi так, чтобы все 40


штифтов колодки Pi точно вошли в 40 отверстий разъема Sense HAT;
платы должны идеально встать одна над другой. Когда вы первый
раз успешно подключите Sense HAT к питанию через Pi, светодиод-
ная матрица отобразит светящуюся радугу (рис. 8.2).
Знакомство с платой расширения Sense HAT для Raspberry Pi
143

Рис. 8.2. Приветственная радуга Sense HAT

Применение эмулятора платы Sense HAT

Если у вас нет платы расширения, или ваша модель Pi не совмести-


ма с ней, или вы хотите сначала опробовать этот скрипт, то можете
воспользоваться эмулятором платы Sense HAT для создания игры
Pong на вашем компьютере. Эмулятор — это виртуальная Sense HAT,
с которой вы можете взаимодействовать, чтобы протестировать ваши
скрипты. Для ее запуска перейдите в главное меню рабочего стола
и выберите Programming→Sense HAT Emulator. Откроется окно эму-
лятора (рис. 8.3).

Рис. 8.3. Окно эмулятора Sense HAT


Игра в Pong с Sense HAT
144

Эмулятор Sense HAT поставляется с примерами, хранящимися


в File→Examples; выберите нужный пример и запустите файл, что-
бы увидеть действие кода в окне эмулятора.

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

Управление светодиодной матрицей

Светодиодная матрица Sense Hat имеет восемь столбцов и восемь


строк, содержащих в сумме 64 RGB-светодиода. Вы можете выводить
текст или создавать изображение на матрице, управляя каждым све-
тодиодом индивидуально. Кроме того, вы можете управлять цветом
каждого светодиода по отдельности.
Отображение текста. Код в листинге 8.1 выводит на матрицу про-
кручивающийся текст «Hello World!» синими светодиодами.

Листинг 8.1. Отображение текста на матрице Sense HAT:


1 from sense_hat import SenseHat
#раскомментируйте следующую строку, если вы используете
эмулятор
2 #from sense_emu import SenseHat
sense = SenseHat()
3 sense.show_message('Hello World!', text_colour = [0, 0,
255])

Сначала импортируется класс SenseHat 1. Если у вас эмуля-


тор, то удалите или закомментируйте эту строку и раскомментируйте
строку 2.
Функция show_message() 3 позволяет отобразить сообщение
text_string — первый аргумент функции. Так же можно исполь-
зовать следующие опции:
• text_colour = [r, g, b] — устанавливает RGB-цвет текста;
вместо r, g и b подставьте целочисленные значения от 0 до 255
(как вы делали в проекте 5).
Работа с функциями и управлением Sense HAT
145

• scroll_speed = x, где x — дробное число типа float устанав-


ливает скорость, с которой текст двигается по экрану. По умол-
чанию скорость движения текста такая, что сдвиг на один пик-
сель влево происходит каждые 0,1 секунды.
• back_colour = [r, g, b] — устанавливает RGB-цвет фона,
на котором будет отрисовываться текст; вместо r, g и b под-
ставьте целочисленные значения аналогично параметру text_
colour.

ПРИМЕЧАНИЕ
В библиотеке sense_hat применяется британское написание
«colour», поэтому и в коде вам придется использовать слово
именно в этой форме.

Управление отдельными светодиодами. Для управления отдель-


ными светодиодами нужно указать местоположение на матрице каж-
дого светодиода, который вы хотите зажечь. Для этого в SenseHAT
используется система координат (x, y). Для примера на рис. 8.4 пе-
речислены координаты нескольких светодиодов в матрице.

Рис. 8.4. Система координат Sense HAT


Игра в Pong с Sense HAT
146

Чтобы зажечь светодиоды, показанные на рис. 8.4, соответствен-


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

Листинг 8.2. Использование функции set_pixel() для управ-


ления отдельными светодиодами:
from sense_hat import SenseHat
#раскомментируйте следующую строку, если используете
эмулятор
#from sense_emu import SenseHat
sense = SenseHat()
#включение синего пикселя
sense.set_pixel(0, 1, 0, 0, 255)
#включение зеленого пикселя
sense.set_pixel(7, 6, 0, 255, 0)
#включение розового пикселя
sense.set_pixel(2, 5, 255, 51, 153)

Функция sense.set_pixel(x, y, r, g, b) включает отдель-


ный светодиод. Ее аргументы: x — координата по горизонтали, y —
координата по вертикали, а переменные — r, g, b, задающие цвет.
Отображение рисунка. Для более быстрого вывода рисунка
на экран вместо управления отдельными светодиодами можно при-
менить функцию sense.set_pixel(). Для этого передайте этой
функции в качестве аргумента список яркостей всех 64 светодиодов,
который определит цвет каждого светодиода. Взгляните на код в ли-
стинге 8.3, в котором отображается грустное лицо.

Листинг 8.3. Вывод на светодиодную матрицу изображения с по-


мощью функции set_pixel():
from sense_hat import SenseHat
#раскомментируйте следующую строку, если вы используете
эмулятор
#from sense_emu import SenseHat
sense = SenseHat()

#красный цвет
X = [255, 0, 0]
#нет цвета
N = [0, 0, 0]

#массив, отображающий грустное лицо


sad_face = [
Работа с функциями и управлением Sense HAT
147

N, N, X, X, X, X, N, N,
N, X, N, N, N, N, X, N,
X, N, X, N, N, X, N, X,
X, N, N, N, N, N, N, X,
X, N, N, X, X, N, N, X,
X, N, X, N, N, X, N, X,
N, X, N, N, N, N, X, N,
N, N, X, X, X, X, N, N
]

sense.set_pixels(sad_face)

ПРИМЕЧАНИЕ
Красные буквы X в массиве sad_face не будут отображаться
красным в вашем редакторе кода. Мы выделяем их, чтобы было
легче визуализировать, как будет выглядеть матрица светодиодов.

Вы создаете переменную, содержащую цвет зажженных светодио-


дов (X), и переменную, содержащую цвет фона (N). В качестве фона
можно установить любой цвет или просто 0, оставив их выключен-
ными. Затем вам нужно создать массив, в котором будут содержаться
значения X или N для каждого из 64 светодиодов. Итоговый резуль-
тат кода в листинге 8.3 показан на рис. 8.5.

Рис. 8.5. Отображение грустного лица на светодиодной матрице


Игра в Pong с Sense HAT
148

Рисуя, вы можете задействовать столько цветов, сколько захотите;


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

Чтение данных с джойстика

Джойстик, установленный на Sense HAT, имеет пять вариантов дви-


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

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


джойстика:
from signal import pause

from sense_hat import SenseHat


#раскомментируйте следующую строку, если вы используете
эмулятор
#from sense_emu import SenseHat
sense = SenseHat()

1 def move_up(event):
print('джойстик сдвинут вверх')

def move_down(event):
print('джойстик сдвинут вниз')

def move_right(event):
print('джойстик сдвинут вправо')
Программирование
149

def move_left(event):
print('джойстик сдвинут влево')

def move_middle(event):
print('джойстик нажат')

2 sense.stick.direction_up = move_up
sense.stick.direction_down = move_down
sense.stick.direction_right = move_right
sense.stick.direction_left = move_left
sense.stick.direction_middle = move_middle

pause()

Сначала вам нужно сообщить вашей Pi, какое действие долж-


но быть выполнено в ответ на срабатывание каждого из элементов
управления джойстиком. Для этого вы определяете ряд функций, вы-
полняющих определенные действия. Например, если джойстик сдви-
нут вверх, то вы вызываете функцию move_up() 1, печатающую
сообщение «джойстик сдвинут вверх». Аргумент event указывает
Pi, что джойстик будет отправлять информацию этим функциям. За-
тем в 2 вы связываете функцию move_up с движением джойстика
вверх: sense.stick.direction_up = move_up.
Другие функции движения работают аналогично.

Программирование
Теперь вы знаете, как отображать текст, рисовать на светодиодной
матрице, а также делать что-либо с помощью джойстика, поэтому
можно приступать к написанию скрипта для вашей игры.
Сначала давайте разберемся, как игра должна работать:
• Ракетка, состоящая из трех пикселей в длину и одного в шири-
ну, находится в столбце 0.
• Каждый раз, когда вы сдвигаете джойстик вверх или вниз, ра-
кетка передвигается в соответствующую сторону.
• Мяч стартует с произвольного места и двигается по диагонали.
• Когда мяч касается чего-либо — стены, потолка или ракетки, —
он должен продолжить движение по диагонали, но в противо-
роложную сторону.
• Если мяч достиг столбца 0, это означает, что вы пропустили мяч
и проиграли.

Powered by TCPDF (www.tcpdf.org)


Игра в Pong с Sense HAT
150

Написание скрипта

Откройте Python 3 (IDLE) и выберите File→New File, чтобы соз-


дать новый скрипт. Затем скопируйте код из листинга 8.5 в создан-
ный файл и сохраните его как pong_game.py в папку Displays
(не устаем напоминать, что все скрипты можно загрузить по адресу:
http://pilotlz.ru/books/files/10857 / ).

Листинг 8.5: Код игры Pong:


#основан на примере для Sense HAT Pong с сайта
raspberrypi.org

#импорт необходимых библиотек


1 from random import randint
from time import sleep

#используйте эту строку, если у вас установлена плата


Sense HAT
from sense_hat import SenseHat
#раскомментируйте следующую строку, если у вас эмулятор
#from sense_emu import SenseHat

#создание объекта с именем sense


2 sense = SenseHat()

#задание позиции ракетки, случайной позиции мяча и его


скорости
3y = 4
4 ball_position = [int(randint(2,6)), int(randint(1,6))]
5 ball_velocity = [1, 1]

#красный цвет
X = [255, 0, 0]
#нет цвета
N = [0, 0, 0]

#массив грустного лица


sad_face = [
N, N, X, X, X, X, N, N,
N, X, N, N, N, N, X, N,
X, N, X, N, N, X, N, X,
X, N, N, X, N, N, N, X,
Программирование
151

X, N, N, X, N, N, N, X,
X, N, X, N, N, X, N, X,
N, X, N, N, N, N, X, N,
N, N, X, X, X, X, N, N
]

#отрисовка ракетки на позиции y


6 def draw_bat():
sense.set_pixel(0, y, 0, 255, 0)
sense.set_pixel(0, y+1, 0, 255, 0)
sense.set_pixel(0, y-1, 0, 255, 0)

#перемещение ракетки вверх


7 def move_up(event):
global y
if y > 1 and event.action=='pressed':
y -= 1

#перемещение ракетки вниз


def move_down(event):
global y
if y < 6 and event.action=='pressed':
y += 1

#перемещение мяча на следующую позицию


8 def draw_ball():
#отображение мяча на текущей позиции
sense.set_pixel(ball_position[0], ball_position[1],
75, 0, 255)
#следующая позиция мяча
ball_position[0] += ball_velocity[0]
ball_position[1] += ball_velocity[1]
#расчет следующей позиции, если мяч касается потолка
if ball_position[0] == 7:
ball_velocity[0] = -ball_velocity[0]
#расчет следующей позиции, если мяч касается стены
if ball_position[1] == 0 or ball_position[1] == 7:
ball_velocity[1] = -ball_velocity[1]
#если мяч достиг позиции 0, то игрок проиграл и игра
заканчивается
if ball_position[0] == 0:
sleep(0.25)
sense.set_pixels(sad_face)
quit()
Игра в Pong с Sense HAT
152

#расчет следующей позиции, если мяч отбивается


ракеткой
if ball_position[0] == 1 and y — 1 <= ball_
position[1] <= y+1:
ball_velocity[0] = -ball_velocity[0]

#установка соответствующих функций на движение джойстика


вверх и вниз
9 sense.stick.direction_up = move_up
sense.stick.direction_down = move_down

#запуск игры
0 while True:
sense.clear()
draw_bat()
draw_ball()
sleep(0.25)

В этом коде происходит много событий, поэтому давайте пройдем


его шаг за шагом.
Импорт необходимых библиотек. В 1 вы импортируете функцию
randint() из библиотеки rand для генерирования псевдослучай-
ных целых чисел и функцию sleep() из библиотеки time для
установки времени задержки.
В 2 вы создаете объект по имени sense, который будет исполь-
зован для связи с платой Sense HAT через код.
Создание ракетки. Ракетка — это трехпиксельная полоска, которая
перемещается вверх и вниз в самом левом столбце. В 3 вы задаете
начальную позицию ракетки на 4-ом пикселе сверху: y = 4. Ракетка
полностью отрисовывается зеленым цветом в функции draw_bat()
6, которая добавляет по одному пикселю сверху (y — 1) и снизу
(y + 1) от стартовой позиции, чтобы длина ракетки составила три
пикселя.
Движение ракетки. Ракетка перемещается только по оси y, поэто-
му ее x-координата всегда равна 0, но y-координату надо изменять,
когда игрок передвигает ракетку. Другими словами, игрок может пе-
ремещать ракетку только вверх или вниз. Этим движением управля-
ют функции move_up() и move_down(), определенные в 7. В 9
вы говорите своей Pi, что надо вызывать функцию move_up() или
move_down(), когда игрок сдвигает джойстик вверх или вниз соот-
ветственно.
Программирование
153

Давайте подробнее рассмотрим, как работает функция move_up()


(функция move_down() работает аналогично):

#перемещение ракетки вверх


def move_up(event):
global y
if y > 1 and event.action=='pressed':
y -= 1

Функция move_up() принимает event в качестве аргумента.


Вообще говоря, параметр event позволяет передавать функции не-
которую информацию о джойстике, например время, когда он был
применен; в каком направлении нажат; уже отпущен или удерживает-
ся, если он был нажат. В результате Pi будет знать, как реагировать.
Когда игрок двигает джойстик вверх, то функция меняет
y-координату ракетки, вычитая 1 из переменной y. Однако перед
этим программа проверяет, что y > 1, иначе верхний край ракетки
уйдет за пределы матрицы.
Подсказка. В Python команда y -= 1 эквивалента y = y – 1.
Объявление области видимости переменной. Обратите внимание,
что переменная y определена как глобальная переменная (global).
Не все переменные в программе доступны изо всех мест программы.
Это означает, что могут быть области программы, где определенные
переменные нельзя вызвать. Область видимости переменной — это
область программы, в которой она доступна. В Python есть два типа
переменных: локальные и глобальные.
Переменная, объявленная в основном блоке кода, является гло-
бальной, то есть она доступна в любом месте кода. Переменная, опре-
деленная внутри функции, будет локальной, то есть то, что вы дела-
ете с локальной переменной внутри функции, не влияет на внешние
переменные, даже если они имеют такое же имя.
Например, если вы хотите использовать переменную y как внутри
функции, где она определена, так и во всем коде, то ее надо объявить
как global. В противном случае при смещении джойстика ничего
не будет происходить, поскольку переменная y будет изменяться
только внутри функции, а не в основной части кода.
Создание мяча. Для создания движущегося мяча требуется за-
дать его начальную позицию и скорость. В 4 вы задаете началь-
ную позицию мяча с помощью списка. Списки определяются вну-
три квадратных скобок [0-й элемент, 1-й элемент, …, n-й элемент],
и каждый элемент отделен запятой. Нумерация элементов в списке
начинается с 0, то есть номер первого элемента списка — это 0,
Игра в Pong с Sense HAT
154

а не 1. В данном случае 0-й элемент — это х-позиция, а 1-й эле-


мент — y-позиция.
Когда вы запустите игру, мяч займет случайную позицию, сгенери-
рованную функцией randint(). Эта позиция должна быть между 1
и 6 по оси y и между 2 и 6 по оси x. Выбор таких чисел гарантирует,
что мяч не окажется на стене, потолке или рядом с ракеткой.
Движение мяча. Теперь, когда вы определили начальную позицию
мяча, необходимо задать и его скорость 5, чтобы получить движение.
Вы создаете список для скорости мяча, в котором 0-й элемент будет
скоростью по оси х, а 1-й элемент — скоростью по оси y.
Чтобы мяч двигался вперед или назад, вам нужно соответ-
ственно прибавлять или вычитать скорость из текущей позиции
мяча 1. В функции draw_ball() 8 происходит отображение
и перемещение мяча, который всегда двигается по диагона-
ли. Если он двигается вперед, то продолжает двигаться вперед,
если же назад, то продолжает двигаться назад, а вот если он по-
падает в потолок или ракетку, то меняет направление движения
на противоположное.
Удерживание игры запущенной. После того как все настроено,
вы добавляете в программу цикл while, чтобы удержать игру за-
пущенной 0. Цикл while начинается с очистки экрана, затем вы-
зывается функция draw_bat(), которая рисует ракетку, и функция
draw_ball(), отображающая мяч.
Функция sleep() в последней строке определяет время перехода
мяча от одной позиции к другой, то есть с помощью этой функции
вы задаете скорость мячу. При увеличении времени задержки игра
становится медленнее и проще, при уменьшении игра становится бы-
стрее. Попробуйте поэкспериментировать с разными временами за-
держки.

Запуск скрипта

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


нец получить свою награду: возможность играть в Pong на Sense
HAT! Нажмите F5 или выберите Run→Run Module, чтобы запу-
стить игру.
Если вы проиграете и игра закончится, то на светодиодной матри-
це должно отобразиться грустное лицо (рис. 8.6).

1
Имеется в виду расстояние, пройденное мячом с этой скоростью. — Прим. ред.
Идеи для продолжения
155

Рис. 8.6. Грустное лицо на светодиодной матрице по окончании игры

Идеи для продолжения


Вот несколько идей для усовершенствования игры:
• Уменьшайте время задержки, чтобы постоянно увеличивать уро-
вень сложности игры.
• Добавьте систему подсчета очков, чтобы каждый раз, когда вы
зарабатываете очко при попадании мяча по ракетке, число очков
отображалось на экране.
• Добавьте перезапуск игры при нажатии на джойстик.
Датчики
СТОИМОСТЬ: $$
ПРИМЕРНОЕ ВРЕМЯ СБОРКИ: 40 минут

ПЕРЕЧЕНЬ КОМПОНЕНТОВ:
• Raspberry Pi (модель с 40 портами GPIO)
• Плата расширения Sense HAT
9
Сенсорная погодная
станция «все-в-одном»
В этом проекте вы построите локальную мете-
останцию, которая будет определять темпера-
туру, влажность и давление с помощью датчи-
ков платы Sense HAT. Кроме того, вы сделаете
графический пользовательский интерфейс для
отображения температуры, влажности и давле-
ния в реальном времени.

Sense HAT как метеостанция


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

Датчик температуры

Как видно из названия, датчик температуры измеряет температуру.


По умолчанию плата Sense HAT считывает температуру в градусах
Цельсия. Если вы предпочитаете температуру в градусах Фаренгей-
та, нужно преобразовать полученные показания. Для этого умножьте
Сенсорная погодная станция «все-в-одном»
160

градусы по Цельсию на 9, разделите на 5 и прибавьте 32, как пока-


зано в следующей формуле:
⎛ 9⎞
F =⎜ C× ⎟ + 32.
⎝ 5⎠
Вы можете добавить эту формулу в код, если хотите перевести
градусы Цельсия в градусы Фаренгейта.

ПРИМЕЧАНИЕ
Показания температуры могут отличаться от реального значения
температуры на несколько градусов. Это объясняется тем, что пла-
та Sense HAT находится над Pi и тепло от процессора Raspberry
Pi может немного изменить результаты.

Датчик влажности

Влажность можно выразить двумя способами: как относительную


влажность и как абсолютную. Абсолютная влажность — это масса во-
дяного пара в определенном объеме воздуха. Она не зависит от тем-
пературы и выражается в килограммах на кубический метр (кг / м3).
Количество водяного пара, которое может удерживать воздух, изме-
няется с температурой. Чем выше температура, тем больше водяного
пара может быть в воздухе. Относительная влажность выражается
в процентах и является отношением текущего количества водяного
пара в воздухе к максимально возможному количеству пара при дан-
ной температуре.
Sense HAT регистрирует относительную влажность — это более
информативно для прогнозов погоды: чем выше процент относи-
тельной влажности, тем больше вероятность осадков. Относительная
влажность зависит от температуры, поэтому они всегда измеряются
вместе.

Датчик атмосферного давления

Датчик атмосферного давления измеряет атмосферное давление,


то есть «вес» воздуха в данной точке, измеренный в гектопаскалях
(гПа), которые эквивалентны миллибарам (мбар). Зачем измеряют
Чтение показаний температуры, влажности и давления
161

давление? По изменению атмосферного давления можно предсказы-


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

Чтение показаний температуры,


влажности и давления
Давайте теперь посмотрим, как в оболочке Python можно считать по-
казания датчиков и вывести их на экран.
Установите плату Sense HAT на свою Pi, как вы делали это в про-
екте 8, и убедитесь, что она установлена правильно и контакты обеих
плат надежно сцеплены. При первом включении плата Sense HAT
должна отображать радугу (рис. 9.1), похожую на ту, которую вы
видите при загрузке вашей Pi.

Рис. 9.1. Радуга на Sense Hat


Сенсорная погодная станция «все-в-одном»
162

Создайте новую папку с именем Sensors в папке Projects.


Затем откройте Python 3 (IDLE) и создайте новый скрипт, выбрав
File→New File. Назовите его weather_data.py и скопируйте
в него код из листинга 9.1 (как и прежде, все скрипты можно за-
грузить по адресу: http://pilotlz.ru/books/files/10857 / ).

Листинг 9.1. Чтение температуры, влажности и давления с платы


Sense HAT:
1 from sense_hat import SenseHat
#импорт класса SenseHat из sense_emu

from time import sleep

#создание объекта sense


2 sense = SenseHat()

while True:
3 temperature = sense.temperature
4 temperature = str(round(temperature, 2))
5 print('Температура: ' + temperature + '*C \ n')
humidity = sense.humidity
humidity = str(round(humidity, 2))
print('Влажность: ' + humidity + '% \ n')

pressure = sense.pressure
pressure = str(round(pressure, 2))
print('Давление: ' + pressure + 'hPa \ n')

sleep(1)

Сначала вы импортируете класс SenseHat из библиотеки sense_


hat 1. Затем создаете объект по имени sense, связанный в платой
Sense HAT 2.
Чтение данных с датчиков 3 происходит очень просто с помощью
следующих функций, имеющих соответствующие имена:
• sense.temperature возвращает значение температуры.
• sense.humidity возвращает значение влажности.
• sense.pressure возвращает значение давления.
Значения передаются дробными числами с несколькими десятич-
ными знаками после запятой, поэтому для округления чисел и по-
лучения более легкочитаемых результатов используется функция
round(). Функция round() 4 в качестве аргументов принимает
Создание пользовательского интерфейса для считанных данных
163

число, которое вы хотите округлить, и количество значимых разря-


дов, которые вы хотите оставить, — в данном случае это два знака
после запятой. Кроме того, вы используете функцию str(), преоб-
разующую аргумент в строку. Вам нужно преобразовать данные, счи-
тываемые с датчика, в строку, чтобы объединить их текстом, который
вы выведете в командную строку оболочки Python 5.
Вы уже почти метеоролог! Далее вы создадите пользовательский
интерфейс для отображения своих погодных данных.

Создание пользовательского
интерфейса для считанных данных
Давайте переведем этот проект на новый уровень и создадим класс-
ный пользовательский интерфейс для отображения показаний датчи-
ков. В вашем интерфейсе должно быть:
• Окно на рабочем столе, которое отображает температуру, влаж-
ность и давление.
• Отображение влажности вертикальным индикатором состояния
от 0 до 100%.
• Отображение температуры и давления числами.
• Подписи для каждого значения.
На рисунке 9.2 показан макет пользовательского интерфейса, ко-
торый поможет вам понять, как устроен код.

Рис. 9.2. Макет графического пользовательского интерфейса (GUI)


Сенсорная погодная станция «все-в-одном»
164

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


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

Виджет Опция
Заголовок окна Текст: «Локальная метеостанция»
Заголовок влажности Текст: «Влажность», шрифт: Helvetica, размер: 18,
вертикальный отступ: 3
Значение влажности Шрифт: Courier, размер: 20, цвет: синий, расположение:
север
Полоса индикатора Ориентация: вертикальная, размер 20, цвет: синий,
влажности расположение: север, длина: 200, максимальное
значение: 100
Заголовок температуры Текст: «Температура», шрифт: Helvetica, размер: 18,
расположение: юг
Значение температуры Шрифт: Courier, размер: 20, цвет: красный,
расположение: север
Заголовок давления Текст: «Давление», шрифт: Helvetica, размер: 18,
расположение: юг
Значение давления Шрифт: Courier, размер: 20, цвет: зеленый,
расположение: север

Программирование
Откройте Python 3 (IDLE) и создайте новый файл, выбрав File→New
File. Скопируйте код из листинга 9.2 в редактор Python и сохраните
скрипт как weather_station.py в папку Sensors (напоминаем,
что все скрипты можно загрузить по адресу: http://pilotlz.ru/books/
files/10857 / ).

Листинг 9.2. Вывод данных с платы Sense HAT через графический


пользовательский интерфейс:
#импорт необходимых библиотек
1 from tkinter import *
from tkinter import ttk
import time
from sense_hat import SenseHat
#from sense_emu import SenseHat

#создание объекта sense


sense = SenseHat()
Программирование
165

#создание окна
2 window = Tk()
window.title('Локальная метеостанция')
window.geometry('200x480')

#создание метки «Влажность» для заголовка и значения


3 humidity_label = Label(window, text = 'Влажность', font =
('Helvetica', 18), pady = 3)
humidity_label.pack()

4 humidity = StringVar()

5 humidity_value=Label(window, textvariable = humidity,


font = ('Courier', 20), fg = 'blue', anchor = N, width =
200)
humidity_value.pack()

#создание холста (сanvas) для отображения влажности


6 humidity_canvas = Canvas(window, width = 200, height =
200)
humidity_canvas.pack()

#создание индикаторной полосы для влажности


7 humidity_bar = DoubleVar()

8 progressbar_humidity = ttk.Progressbar(humidity_canvas,
variable = humidity_bar, orient = VERTICAL, length = 200,
maximum = 100)
progressbar_humidity.pack(fill=X, expand=1)

#создание метки «Температура» для заголовка и значения


temperature_label = Label(window, text = 'Температура',
font = ('Helvetica', 18),anchor = S, width = 200, height =
2)
temperature_label.pack()

temperature = StringVar()

temperature_value = Label(window, textvariable =


temperature, font = ('Courier', 20),fg = 'red', anchor = N,
width = 200)
temperature_value.pack()
Сенсорная погодная станция «все-в-одном»
166

#создание метки «Давление» для заголовка и значения


pressure_label = Label(window, text = 'Давление', font =
('Helvetica', 18), anchor = S, width = 200, height = 2)
pressure_label.pack()

pressure = StringVar()

pressure_value = Label(window, textvariable = pressure,


font = ('Courier', 20), fg = 'green', anchor = N, width =
200)
pressure_value.pack()

9 def update_readings():
humidity.set(str(round(sense.humidity, 2)) + '%')
humidity_bar.set(sense.humidity)
temperature.set(str(round(sense.temperature, 2)) +
'°C')
#temperature.set(str(round(sense.temperature* (9 / 5)
+32, 2)) + '*F')
pressure.set(str(round(sense.pressure)) + 'hPa')
window.update_idletasks()
window.after(3000, update_readings)

0 update_readings()
window.mainloop()

Как обычно, код начинается с подключения необходимых библио-


тек 1. Вы можете удивиться, зачем надо импортировать ttk, если
мы уже импортировали все с помощью символа * из библиотеки
tkinter строкой выше. В данном случае при импорте со специ-
альным символом * вы импортируете только подмножество того,
что находится непосредственно в папке библиотеки (для этого нет
какой-либо причины, кроме того, что так решил автор библиотеки).
Поэтому вам нужно еще импортировать библиотеку ttk, которая не-
обходима для этого пользовательского интерфейса.
Чтобы собрать данные о погоде, вам необходимы физическая пла-
та Sense HAT и библиотека sense_hat.

Создание пользовательского интерфейса

После импорта всех необходимых библиотек вы переходите к соз-


данию той части кода, в которой строится пользовательский интер-
фейс. Первым делом вы создаете окно размером 200 × 480 пикселей
Программирование
167

и его заголовок 'Моя метеостанция' 2. Затем создаете заголовок


для показаний влажности 3 с опциями, заданными в таблице, на-
ходящейся в разделе «Создание пользовательского интерфейса для
считанных данных». В 4 вы создаете переменную типа string, на-
званную humidity, которая содержит значение влажности. Потом
в 5 это значение будет отображено на экран.
В строке 6 вы создаете «холст» (canvas) — зарезервированное
место для размещения полосы индикатора состояния. Следом вы
объявляете переменную humidity_bar типа double 7, которая
связана с полосой индикатора состояния. И наконец, в 8 создаете
индикатор состояния влажности и размещаете его на холсте.
Процесс отображения заголовков и значений температуры и дав-
ления аналогичен тому, что происходит в 3, 4 и 5.

Автоматическое обновление данных

В 9 вы определяете функцию update_readings(). Эта функция


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

temperature.set(str(round(sense.temperature, 2)) + '*C')

Давайте разложим эту строку на составляющие:


• sense.temperature читает значение температуры с платы
Sense HAT.
• round(sense.temperature,2) — округляет прочитанное
значение температуры до второго знака после запятой.
• str(round(sense.temperature,2) — преобразует полу-
ченное значение в строку.
• (str(round(sense.temperature,2)) + '*C') — добав-
ляет знак градуса к строке.
• temperature.set(str(round(sense.temperature,
2)) + '*C') — обновляет переменную temperature в соот-
ветствии с последним прочитанным значением.

Обновление значений влажности и давления происходит аналогично.


Функция window.update_idletasks() удерживает окно от-
крытым, пока данные обновляются. И наконец, window.after
Сенсорная погодная станция «все-в-одном»
168

(3000, update_readings) добавляет update_readings как


событие в mainloop() и говорит Pi вызывать эту функцию каждые
3000 миллисекунд (мс) или 3 секунды.
В 0 вы вызываете функцию update_readings() и функцию
window.mainloop(), которая удерживает окно запущенным.
Завершая написание программы, вы, если хотите, можете отобра-
жать температуру в градусах Фаренгейта, закомментировав первую
и раскомментировав вторую строку, как показано ниже:

#temperature.set(str(round(sense.temperature, 2)) +
'*C')
temperature.set(str(round(sense.temperature* (9 / 5) +32,
2)) + '*F')

Запуск скрипта

Нажмите F5 или выберите Run→Run Module для запуска скрипта.


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

Идеи для продолжения


Несколько идей для модернизации проекта:
• Добавьте в код преобразование значений температуры в градусы
Фаренгейта и выведите ее как °F.
• Измените графический пользовательский интерфейс (располо-
жение, цвет шрифта, размер и тип) в соответствии с вашими
пожеланиями.
• Используйте светодиодный матричный дисплей на Sense HAT
для отображения информации о погоде. Например, вы може-
те отображать текст, относительные гистограммы или зеленые
и красные стрелки, обозначающие подъем либо падение темпе-
ратуры, влажности или давления.
Идеи для продолжения
169

• В остальных проектах этой части вы узнаете, как отправить


электронное письмо с помощью Python и как сохранить по-
казания датчиков. Используйте эти навыки, чтобы отправлять
данные о погоде на электронную почту или создать регистратор
данных метеорологической станции. Не пройдите мимо следую-
щих проектов!
СТОИМОСТЬ: $
ПРИМЕРНОЕ ВРЕМЯ СБОРКИ: 45 минут

ПЕРЕЧЕНЬ КОМПОНЕНТОВ:
• Raspberry Pi
• Макетная плата
• PIR-датчик движения HC-SR501
• Два светодиода диаметром 5 мм (разных цветов)
• Три резистора по 330 Ом
• Кнопка
• Соединительные провода
10
Охранная сигнализация
с уведомлением по e-mail
В этом проекте вы создадите охранную сигнали-
зацию, отправлющую уведомления на e-mail. Сиг-
нализация обнаруживает проникновение на охра-
няемую территорию с помощью пассивного
инфракрасного датчика (PIR). Когда датчик засе-
чет движение, будет отправлено предупреждаю-
щее письмо.

Знакомство с PIR-датчиком движения


Вы, вероятно, встречали датчик движения в самых разных областях
применения. Они используются в охранном освещении, при освеще-
нии коммерческих зданий, где свет включается, когда вы проходите
мимо, и в охранной сигнализации.
Датчик движения PIR (рис. 10.1) измеряет интенсивность ин-
фракрасного света, испускаемого объектами в его поле зрения. Он
обнаруживает движение в результате изменения инфракрасного из-
лучения в виде изменения температуры. Такой датчик идеален для
обнаружения людей или животных, потому что он будет реагировать
на живых существ, перемещающихся в его поле зрения, но не будет
срабатывать при движении неодушевленных предметов, например ли-
стьев на ветру. Вы можете запрограммировать свою Pi реагировать
Охранная сигнализация с уведомлением по e-mail
172

на изменения ИК-света с помощью световых сигналов, звуковой тре-


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

Рис. 10.1. PIR-датчик движения

Датчик выдает HIGH, если обнаружил движение, и LOW, если


движения нет. Он имеет всего всего три вывода: VCC, GND и data.
Вывод данных data выдает сигнал с уровнем 3,3 В, что идеально
для вашей Pi!

Отправка e-mail из Python


Библиотека e-mail позволяет отправлять письма напрямую с Python.
Мы напишем этот скрипт прежде, чем перейти к сборке схемы.

Поиск настроек вашего SMTP-сервера

Для отправки e-mail-сообщения через код вам надо использовать


свои настройки SMTP-сервера (Simple Mail Transfer Protocol — про-
стой протокол передачи почты). SMTP — это интернет-стандарт для
электронной почты; любой провайдер электронной почты имеет тот
или иной SMTP-сервер.
Эти настройки включают в себя адрес и порт почтового сервера,
а также сведения о том, используется ли протокол TLS (Transport
Отправка e-mail из Python
173

Layer Security — протокол защиты транспортного уровня). TLS —


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

Скрипт для отправки e-mail-сообщения

Откройте Python 3 (IDLE) и выберите File→New File, чтобы соз-


дать новый скрипт. Скопируйте в него код листинга 10.1 и со-
храните как send_email.py в папке Sensors (напоминаем,
что все скрипты можно скачать по адресу: http://pilotlz.ru/books/
files/10857 / ).

ПРИМЕЧАНИЕ
Не называйте ваш скрипт email.py, потому что в Python есть биб-
лиотека с таким именем и ваш скрипт не будет работать.

Листинг 10.1. Скрипт отправки e-mail-письма:


1 import smtplib
from email.mime.text import MIMEText

#введите ваши учетные данные в следующие три строки


2 from_email_addr = 'YOUR_EMAIL@gmail.com'
from_email_password = 'YOUR_EMAIL_PASSWORD'
to_email_addr = 'TO_YOUR_OTHER_EMAIL@gmail.com'

#ввод тела вашего e-mail-письма


3 body = 'Зарегистрировано движение в вашей комнате!'
msg = MIMEText(body)

# установка отправителя и получателя


msg['From'] = from_email_addr
msg['To'] = to_email_addr

#установка темы письма


msg['Subject'] = 'ПРЕДУПРЕЖДЕНИЕ О ВТОРЖЕНИИ'
Охранная сигнализация с уведомлением по e-mail
174

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


#введите в следующий строке настройки SMTP-сервера вашего
e-mail-провайдера
4 server = smtplib.SMTP('smtp.gmail.com', 587)
#Закомментируйте следующую строку, если ваш e-mail-
провайдер не использует TLS
server.starttls()
5 server.login(from_email_addr, from_email_password)
server.sendmail(from_email_addr, to_email_addr,
msg.as_string())
server.quit()
print('Письмо отправлено')

ПРЕДУПРЕЖДЕНИЕ
Если вы используете фрагмент кода 5 внутри цикла while без
задержки, то вы будете заполнять свой почтовый ящик тысячами
писем и ваша учетная запись, скорее всего, будет заблокирова-
на. Поэтому обязательно включите задержку, если вы используете
этот фрагмент в любом другом проекте!

Сначала вы импортируете библиотеки, необходимые для SMTP


и функций, связанных с e-mail: smtplib и MIMEText 1. Затем соз-
даете переменные для e-mail-адреса, с которого вы будете отправлять
письмо, пароля от этой электронной почты и e-mail-адреса, на кото-
рый вы хотите отправить письмо 2. Мы советуем вам создать второй
адрес электронной почты для отправки уведомлений на ваш обыч-
ный адрес, потому что вам придется предоставлять сторонним при-
ложениям доступ к вашей учетной записи, с которой вы отправляете
сообщение. Убедитесь, что в этих строках введена ваша собственная
информация.
В блоке кода 3 вы пишете само письмо. Сначала создаете перемен-
ную body, в которой содержится основной текст e-mail-письма. Затем
создаете объект под именем msg и генерируете сам e-mail с помощью
msg = MIMEText(body). Если вы хотите изменить основной текст
и тему электронного письма, спокойно измените строку в переменной
body и переменную msg['Subject'] соответственно.
В 4 вы устанавливаете соединение с SMTP-сервером. Передайте
адрес SMTP-сервера провайдера как строку в качестве первого аргу-
мента smtplib.SMTP(), а порт как целое число в качестве второ-
го аргумента. В этом скрипте мы используем SMTP-сервер и порт
Gmail. Если вы пользуетесь другой почтовой службой, проверьте, из-
менили ли вы эти значения.
Сборка схемы
175

Функция server.starttls() необходима, если почтовая служ-


ба использует TLS для шифрования сообщений. Если это не так,
то удалите или закомментируйте эту строку.
Далее скрипт авторизуется в учетной записи, с которой отправ-
ляется электронное письмо 5, отправляет электронное письмо и от-
ключает связь с сервером. В завершение скрипт выводит в оболочке
Python 'E-mail отправлен', сообщая пользователю, что элек-
тронное письмо отправлено.

Запуск скрипта, отправляющего e-mail-сообщение

Пора посмотреть скрипт в действии! Сохраните ваш скрипт и запу-


стите его, нажав F5 или выбрав Run→Run Module. Затем проверьте
входящие сообщения вашего почтового ящика. У вас должно быть
новое письмо. На рисунке 10.2 показано отправленное с помощью
скрипта письмо, которое мы получили.

Рис. 10.2. E-mail, отправленный скриптом send_mail.py

Если же вы не получили этот e-mail, проверьте, что информация


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

Сборка схемы
Давайте подключим пассивный инфракрасный датчик движения (PIR)
к Raspberry Pi, чтобы она смогла отправлять сообщения по электрон-
ной почте, как только датчик засечет движение. Кроме того, вам по-
Охранная сигнализация с уведомлением по e-mail
176

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


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

Рис. 10.3. Схема устройства охранной сигнализации

1. Подключите земляной контакт GND вашей Pi к синей шине


на макетной плате.
2. Вставьте выводы зеленого и красного светодиодов в отверстия
на макетной плате. Подключите анод зеленого светодиода к циф-
ровому порту GPIO 18 через резистор на 330 Ом, а катод соеди-
ните с шиной земли макетной платы. Аналогично подключите анод
красного светодиода через резистор на 330 Ом к цифровому порту
GPIO 17 Raspberry Pi, а катод — к шине земли на макетной плате.
3. Разместите кнопку посередине макетной платы так, чтобы ее
ножки оказались по разные стороны от центральной борозды (см.
рис. 10.3). Правую нижнюю ножку кнопки подключите к шине зем-
ли, а нижнюю левую — к порту GPIO 2.
Программирование
177

4. Подключите PIR-датчик движения согласно таблице:

Датчик движения Raspberry Pi


GND GND
OUT GPIO 4
VCC 5V

Программирование
Откройте среду Python 3 (IDLE) и затем выберите File→New File,
чтобы создать новый скрипт. Введите код, представленный в листин-
ге 10.2, в созданный файл и сохраните его в папке Sensors под
именем intruder_alarm.py (напоминаем, что все скрипты можно
скачать на https://www.npstarch.com / RaspberryPiProject / ).

Листинг 10.2. Скрипт, уведомляющий о вторжении:


#Импортируем необходимые библиотеки
1 from gpiozero import LED, Button, MotionSensor
import smtplib
from email.mime.text import MIMEText
from signal import pause

#Создайте объекты для работы с обоими светодиодами,


кнопкой и PIR-датчиком
2 led_status = LED(17)
led_triggered = LED(18)
button = Button(2)
pir = MotionSensor(4)

#Управляющие переменные
3 motion_sensor_status = False
email_sent = False

#Включение или выключение PIR-датчика


4 def arm_motion_sensor():
global email_sent
global motion_sensor_status
if motion_sensor_status == True:
motion_sensor_status = False
led_status.off()
Охранная сигнализация с уведомлением по e-mail
178

led_triggered.off()
else:
motion_sensor_status = True
email_sent = False
led_status.on()

#Отправка электронного письма, когда PIR-датчик обнаружил


движение
5 def send_email():
global email_sent
global motion_sensor_status
if(motion_sensor_status == True and email_sent ==
False):

#Замените настройки в следующих трех строках


на свои
from_email_addr = 'ВАШ_АДРЕС@gmail.com'
from_email_password = 'ВАШ_ПАРОЛЬ'
to_email_addr = 'ВАШ_ВТОРОЙ_АДРЕС@gmail.com'

#Заполнение тела сообщения


body = 'В вашей комнате было обнаружено
движение.'
msg = MIMEText(body)

#Указание отправителя и получателя


msg['From'] = from_email_addr
msg['To'] = to_email_addr

#Установка темы письма


msg['Subject'] = 'ОХРАННАЯ СИГНАЛИЗАЦИЯ'

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


#В строке ниже замените настройки на SMTP-сервер
вашего провайдера
server = smtplib.SMTP('smtp.gmail.com', 587)
#Закомментируйте следующую строку, если ваш
провайдер не использует TLS
server.starttls()
server.login(from_email_addr, from_email_
password)
server.sendmail(from_email_addr, to_email_addr,
msg.as_string())
server.quit()
email_sent = True
Программирование
179

led_triggered.on()
print('Письмо отправлено')
#Указание, какую функцию вызовет нажатие кнопки
6 button.when_pressed = arm_motion_sensor
#Указание, какая функция запускается при обнаружении
движения
7 pir.when_motion = send_email

8 pause()

Этот код не имеет сложных конструкций и похож на листинг 10.1.


Вы начинаете с импорта нужных библиотек 1 и затем создаете объ-
екты типов, которые были описаны в библиотеке gpiozero: свето-
диоды, кнопку и датчик движения 2. В 3 вы создаете управляющие
переменные-флаги motion_sensor_status и email_sent, чтобы
в дальнейшем распознавать, сработал ли уже датчик и было ли от-
правлено сообщение. Также в 4 вы создали функцию arm_motion_
sensor(), которая активирует или деактивирует датчик движения
при нажатии кнопки. Функция send_email() 5 отправляет пись-
мо, когда датчик регистрирует движение, до тех пор, пока датчик на-
ходится в активном состоянии и переменная email_sent сравнима
с False.
Наконец, вы связываете функции и события: вызов arm_motion_
sensor() по нажатию кнопки 6 и вызов send_email() при об-
наружении движения 7. Функция pause(), указанная в конце кода,
удерживает скрипт запущенным для дальнейшего обнаружения этих
двух событий 8.
Обратите внимание, что функция send_email() отправляет со-
общение только в том случае, если движение зафиксировано и одно-
временно с этим переменная email_sent сравнима с False. Если
письмо уже было отправлено, переменная email_sent изменяется
на True, и скрипт больше не может отправлять письма. Чтобы пере-
запустить сигнализацию, снова сбросьте эту переменную до False
двойным нажатием кнопки.
Эта конструкция защищает скрипт от массовой рассылки ненуж-
ных писем. Например, вы вышли, а свою собаку оставили дома,
и датчик сработал на ее движение. С данным включением вы полу-
чите только одно-единственное сообщение о том, что в комнате обна-
ружено движение. Без него вы получили бы просто море писем, пока
ваша собака вертелась в зоне действия датчика.
Нажмите F5 или выберите Run→Run Module, чтобы запустить
скрипт. Активируйте датчик нажатием кнопки, загорится красный
светодиод, показывающий статус работы устройства. Протестируйте

Powered by TCPDF (www.tcpdf.org)


Охранная сигнализация с уведомлением по e-mail
180

сигнализацию, помахав перед датчиком рукой. В результате в почто-


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

Идеи для продолжения


В этом проекте вы познакомились с использованием PIR-датчика
движения с Raspberry Pi, а также с тем, как отправлять сообщения
через Python. Эти навыки вы сможете применить в других ваших
устройствах. Вот несколько простых идей для проектов с использо-
ванием датчика движения:
• Добавьте пьезопищалку (пьезоэлектрический звукоизлучатель)
в схему вашей охранной сигнализации, чтобы при обнаружении
движения отправлялось письмо и включался звуковой сигнал.
• Автоматизируйте освещение в вашей комнате, чтобы оно вклю-
чалось, как только вы входите. Для этого вам может понадо-
биться реле — посмотрите проект 16, где мы объясняем, как его
подключать.
• Вот еще идея: возьмите реле и фоторезистор и соберите схему
ночника, который включался бы после обнаружения движения
только в темноте.
СТОИМОСТЬ: $
ПРИМЕРНОЕ ВРЕМЯ СБОРКИ: 1 час

ПЕРЕЧЕНЬ КОМПОНЕНТОВ:
• Raspberry Pi
• Макетная плата
• Датчик газа и дыма MQ-2
• Микросхема MCP3008
• Звуковой пьезоизлучатель (зуммер)
• Светодиод диаметром 5 мм
• Резистор 330 Ом
• Кнопочный переключатель
• Газовая зажигалка
• Соединительные провода
11
Газовая и дымовая
сигнализация
В этом проекте вы создадите газовую и дымовую
сигнализацию на основе датчика газов и дыма
MQ-2 и пьезоэлектрического зуммера. Как толь-
ко датчик обнаружит наличие в воздухе газа или
дыма с концентрацией выше некоторого порого-
вого значения, зуммер начнет издавать звуковой
сигнал.

Знакомство с датчиком газа


и дыма MQ-2
Датчик газа и дыма MQ-2 (рис. 11.1) чувствителен к дыму и легко-
воспламеняющимся газам и парам, таким как пропан, бутан, метан,
пары спирта и водород.
Датчик MQ-2 может выдавать сигнал о концентрации газа двумя
способами:
1. Датчик измеряет текущий уровень концентрации газа в атмос-
фере и выдает его значение в виде аналогового сигнала с аналогового
вывода AO. При этом чем выше концентрация газа, тем выше вы-
ходное напряжение.
2. В датчике устанавливается определенное пороговое значение
концентрации. Если концентрация газа выше этого порога, то датчик
Газовая и дымовая сигнализация
184

Рис. 11.1. Датчик газа и дыма MQ-2, вид спереди и сзади

выдает с цифрового вывода DO сигнал HIGH, если же концентрация


газа ниже этого порога — то сигнал LOW.
На задней панели MQ-2 имеется встроенный потенциометр. Вра-
щая его ручку с помощью отвертки, можно изменять пороговое зна-
чение концентрации.
На задней панели датчика также расположены светодиод питания,
который указывает, включен ли датчик, и светодиод цифрового вы-
хода, который загорается, когда концентрация газа превышает уста-
новленный порог1.
Аналоговый сигнал датчика обеспечивает количественную оценку
концентрации газа и позволяет вам точнее определить пороговое зна-
чение, при котором должен срабатывать зуммер в случае превышения
концентрации газа. Вы знаете, что Pi может считывать только цифро-
вые сигналы, поэтому для считывания аналоговых сигналов с помо-
щью Pi понадобится микросхема преобразователя MCP3008, которую
вы уже использовали ранее, начиная с проекта 3.

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

Знакомство с пьезоэлектрическим
зуммером
Пьезоэлектрический зуммер издает зву-
ковой сигнал тревоги, когда получает
цифровой сигнал от Pi. Зуммер, кото-
рый вы будете использовать, имеет очень
простое устройство (рис. 11.2).
В корпусе зуммера находится диск,
который вибрирует с определенной ча-
стотой, когда на него подается напря-
жение. Подключить пьезоэлектрический
зуммер совсем несложно: подключите Рис. 11.2. Пьезоэлектриче-
ский зуммер
один провод к выводу GND на вашей Pi,
а другой — к порту GPIO.

Сборка схемы
Вам нужно подключить к Pi светодиод, кнопку, датчик MQ-2 (че-
рез микросхему MCP3008) и зуммер. Кнопку и светодиоды вы уже
много раз подключали в предыдущих проектах и знаете, что это не-
сложно. Для сборки выполните следующие шаги (в качестве примера
ориентируйтесь на рис. 11.3):
1. Подключите порт GND на Pi к синей шине на макетной плате,
а контакт питания 3.3 V — к красной шине.
2. Установите микросхему MCP3008 на середине макетной платы
так, чтобы ряды ее ножек разместились параллельно центральной
борозде по обе ее стороны (см. рис. 11.3), и подключите ее в соот-
ветствии со следующей таблицей:

Вывод MCP3008 Подключить к


1 MQ-2, вывод A0
9 GND
10 GPIO 8
11 GPIO 10
12 GPIO 9
13 GPIO 11
Газовая и дымовая сигнализация
186

Окончание табл.
Вывод MCP3008 Подключить к
14 GND
15 3.3 V
16 3.3 V

Имейте в виду, что, когда полукруглый вырез на MCP3008 нахо-


дится сверху, вывод 1 является верхним выводом на левой стороне.
Полную схему выводов микросхемы MCP3008 см. в разделе «Анало-
го-цифровые преобразователи» в проекте 3.
3. Установите датчик газа и дыма MQ-2 на макетную плату и вы-
полните подключения в соответствии со следующей таблицей:

Датчик MQ -2 Подключить к
VCC 5V
GND GND
DO Не присоединять
AO MCP3008, вывод 1

Рис. 11.3. Схема газовой и дымовой сигнализации


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

4. Вставьте светодиод в отверстия на макетной плате. Соедините


положительный вывод c GPIO 17 через резистор 330 Ом, а отрица-
тельный вывод — с синей шиной GND.
5. Вставьте ножки кнопки в отверстия на середине макетной платы
так, чтобы пары ее ножек находились по разные стороны от борозды.
Подключите нижнюю правую ножку к синей шине GND, а нижнюю
левую — к порту GPIO 2. Еще раз проверьте, что обе подключенные
к Pi ножки находятся на одной стороне от борозды.
6. Установите пьезоэлектрический зуммер на макетной плате
и подключите черный провод к шине GND, а красный провод к пор-
ту GPIO 27.
Готово! Ваша схема собрана, перейдем к написанию кода.

Программирование
Чтобы создать новый скрипт, запустите Python 3 (IDLE) и выбе-
рите пункт меню File→New File. Скопируйте приведенный ниже
код (листинг 11.1) в редактор Python, а затем сохраните скрипт
с именем smoke_detector.py в папке Sensors (помните,
что все скрипты можно скачать с сайта http://pilotlz.ru/books/
files/10857 / ).

Листинг 11.1. Скрипт для газовой и дымовой сигнализации:


#подключаем необходимые библиотеки
1 from gpiozero import LED, Button, Buzzer, MCP3008
from time import sleep

2 led = LED(17)
button = Button(2)
buzzer = Buzzer(27)
gas_sensor = MCP3008(0)

3 gas_sensor_status = False

4 threshold = 0.1

5 def arm_gas_sensor():
global gas_sensor_status
if gas_sensor_status == True:
gas_sensor_status = False
led.off()
Газовая и дымовая сигнализация
188

else:
gas_sensor_status = True
led.on()

6 button.when_pressed = arm_gas_sensor

7 while True:
8 #print(gas_sensor.value)
#проверяем, включен ли датчик и зафиксировано ли
пороговое значение
if(gas_sensor_status == True and gas_sensor.value >
threshold):
buzzer.beep()
else:
buzzer.off()
sleep(2)

Сначала вы подключаете классы LED, Button, Buzzer и MCP3008


из библиотеки gpiozero и функцию sleep() из библиотеки time
1. После этого создаете объекты gpiozero для обозначения све-
тодиода, кнопки, микросхемы MCP3008 (с датчиком газа MQ-2)
и зуммера 2. Затем объявляете переменную gas_sensor_status,
значение которой будет указывать, включен ли датчик дыма 3. Если
эта переменная имеет значение True — датчик включен, а если
False — отключен. Кроме того, нужно установить пороговое значе-
ние, чтобы зуммер издавал звуковой сигнал, только когда концентра-
ция газа выше этого порогового значения 4. Давайте разберемся, как
определить это пороговое значение в настоящий момент.
Функция arm_gas_sensor() 5 включает и отключает датчик,
изменяя значение переменной gas_sensor_status на противопо-
ложное тому, которое она имела на момент вызова функции (неза-
висимо от того, было ли оно True или False). В 6 вы определя-
ете функцию для отслеживания нажатия кнопки, чтобы можно было
вручную включать и отключать датчик. Вы также задаете включение
светодиода вместе с включением датчика, чтобы визуально опреде-
лять состояние датчика.
Последним блоком кода является цикл while 7, который посто-
янно проверяет, включен ли датчик и не превышает ли текущее зна-
чение концентрации газов пороговое значение. Если датчик включен
и уровень газа выше порогового значения, зуммер издает звуковой
сигнал с помощью функции buzzer.beep(). Последняя функция
buzzer.off() выключает зуммер.
Программирование
189

Установка порогового значения

Чтобы точно установить безопасный порог концентрации газа, снача-


ла необходимо выполнить калибровку датчика. Это означает, что вам
нужно измерить концентрацию газа в атмосфере, когда газа в ней
нет, а затем установить в качестве порога значение, которое немно-
го больше полученного. Для начала определите, какая концентрация
газа вокруг вас прямо сейчас:
1. Раскомментируйте строку в 8, а затем сохраните и запустите
скрипт.
2. Вы должны увидеть значение переменной gas_sensor, ко-
торое будет выведено в оболочке Python. Это значение, считанное,
когда вокруг датчика нет газа или дыма. Ваше пороговое значение
должно быть немного выше него. Например, если ваше значение
по умолчанию равно 0,07, рекомендуем вам установить свое поро-
говое значение равным 0,1, однако это зависит от желаемого уровня
чувствительности датчика.
3. Возьмите газовую зажигалку и слегка нажмите ее кнопку, чтобы
огонь не появился, но газ уже пошел. Удерживайте зажигалку рядом
с датчиком, чтобы из нее вышло некоторое количество газа. Значение
переменной gas_sensor, отображаемое в оболочке Python, долж-
но увеличиться. Ваше пороговое значение должно быть ниже мак-
симального значения, которое вы получили при направлении газа
на датчик.
4. Используя значения, полученные на предыдущих двух шагах,
задайте пороговое значение 4 где-то между ними, чтобы устройство
не обладало слишком большой или слишком малой чувствительно-
стью.
5. Снова закомментируйте ранее раскомментированную строку
в 8 и сохраните скрипт.

ПРЕДУПРЕЖДЕНИЕ
Будьте очень осторожны при использовании зажигалок и газа!
Не удерживайте кнопку зажигалки слишком долго и не зажигайте
огонь сразу после того как выпустили некоторое количество газа.
Газовая и дымовая сигнализация
190

Запуск скрипта

Нажмите клавишу F5 или выберите пункт меню Run→Run Module.


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

ПРЕДУПРЕЖДЕНИЕ
Собранная в этом проекте газовая и дымовая сигнализация —
всего лишь эксперимент. Она не может заменить собой ваш до-
машний датчик дыма.

Идеи для продолжения


Цель этого проекта состояла в том, чтобы показать вам, как исполь-
зовать датчики, выводящие аналоговые сигналы.
Теперь вы можете усовершенствовать этот проект. Например, от-
редактируйте скрипт таким образом, чтобы он оповещал вас о пре-
вышении порогового значения газа или дыма по электронной почте
(как вы уже делали в проекте 10).
СТОИМОСТЬ: $
ПРИМЕРНОЕ ВРЕМЯ СБОРКИ: 30 минут

ПЕРЕЧЕНЬ КОМПОНЕНТОВ:
• Raspberry Pi
• Макетная плата
• Датчик температуры и влажности DHT22 (также можно использовать
DHT11 или AM2302)
• Резистор 4,7 кОм
• Соединительные провода

НЕОБХОДИМОЕ ПО:
• Библиотека Adafruit_Python_DHT
12
Регистратор температуры
и влажности
В этом проекте вы соберете регистратор, который
автоматически фиксирует значения температуры
и влажности. Вы узнаете, как считать и записать
данные об окружающей среде и где это можно
применить с пользой.

Вы будете работать с датчиком температуры и влажности DHT22


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

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

Сборка схемы
Рис. 12.1. Датчик тем-
пературы и влажности Сборка схемы состоит всего-навсего в том,
DHT22
чтобы через резистор подключить датчик
DHT22 к Pi. Для этого выполните следую-
щие шаги (в качестве примера ориентируйтесь на рис. 12.2):
1. Подключите GND и 3,3 V вашей Pi к синей и красной шинам
макетной платы соответственно.

Рис. 12.2. Подключение датчика DHT22 к Pi


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

2. Подключите датчик DHT22 в соответствии с таблицей ниже.


Если расположить датчик лицевой стороной к себе, контакты будут
нумероваться от 1 до 4 слева направо. Обязательно вставьте резистор
между контактом 2 датчика и красной шиной макетной платы.

DHT22 Raspberry Pi
1 3.3 V
2 GPIO 4;
также подключить к 3.3 V
через резистор 4,7 кОм
3 Не подключать
4 GND

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

Установка библиотеки DHT22

Эта библиотека может работать не только с датчиком DHT22,


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

pi@raspberrypi:~ $ sudo apt update


pi@raspberrypi:~ $ sudo apt install build-essential python-dev

Далее через терминал перейдите на рабочий стол, создайте на нем


папку Libraries (если вы не сделали этого раньше) и перейдите
в эту папку:

pi@raspberrypi:~ $ cd ~ / Desktop
pi@raspberrypi:~ / Desktop $ mkdir Libraries
pi@raspberrypi:~ / Desktop $ cd Libraries
pi@raspberrypi:~ / Desktop / Libraries $
Регистратор температуры и влажности
196

Клонируйте библиотеку, введя следующие команды:

pi@raspberrypi:~ / Desktop / Libraries $ git clone https://


github.com / adafruit / Adafruit_Python_DHT.git

Наконец, перейдите в папку Adafruit_Python_DHT и устано-


вите необходимую библиотеку посредством следующих команд:

pi@raspberrypi:~ / Desktop / Libraries $ cd Adafruit_Python_


DHT
pi@raspberrypi:~ / Desktop / Libraries / Adafruit_Python_DHT $
sudo python setup.py install

Библиотека установлена, пришло время писать скрипт.

Написание скрипта

Библиотека DHT22 не поддерживается Python 3, поэтому в этом


проекте вам нужно использовать Python 2.71. Запустите Python 2.7
(IDLE) и выберите пункт меню File→New File. Скопируйте приве-
денный ниже код (листинг 12.1) в редактор Python, а затем сохра-
ните скрипт с именем temperature_humidity_data_logger.
py в папке Sensors (все скрипты можно скачать с сайта http://
pilotlz.ru/books/files/10857 / ).

Листинг 12.1. Скрипт для регистратора данных температуры


и влажности:
#подключаем необходимые библиотеки
1 import Adafruit_DHT
import time

#раскомментируем строку с нужным нам датчиком, остальные


закомментируем
#sensor = Adafruit_DHT.DHT11
2 sensor = Adafruit_DHT.DHT22
#sensor = Adafruit_DHT.AM2302

#подключаем вывод датчика к GPIO 4


sensor_pin = 4

1
На момент перевода книги эта библиотека уже поддерживалась Python 3, поэтому
вы можете выполнить этот проект в привычной Python 3 (IDLE). — Прим. ред.
Программирование
197

#объявляем переменную для управления циклом while


running = True

#создаем новый файл формата.txt с заданным именем


3 file = open('sensor_readings.txt', 'w')
4 file.write('Дата и время, температура, влажность \ n')

#бесконечный цикл
while running:
try:
#считываем значения влажности и температуры
5 humidity, temperature = Adafruit_DHT.read_
retry(sensor, sensor_pin)
#раскомментируем следующую строку, если нужно
перевести температуру в градусы Фаренгейта
6 #temperature = temperature * 9 / 5.0 + 32

#иногда при снятии показаний возникают ошибки,


и тогда фиксируется нулевой результат
#следующая строка обеспечивает сохранение только
корректных показаний
7 if humidity is not None and temperature is not None:
#print temperature and humidity
print('Температура = ' + str(temperature) + ',
Влажность = ' + str(humidity))
#записываем время, дату, температуру
и влажность в файл .txt
8 file.write(time.strftime('%H:%M:%S %d / %m / %Y') +
', ' + str(temperature) + ', '+ str(humidity) +
' \ n')
else:
print('Не удалось получить показания.
Попробуйте еще раз!')
#делаем паузу 10 секунд между снятиями показаний
9 time.sleep(10)
#если введено что-то с клавиатуры, останавливаем цикл
и закрываем текстовый файл
except KeyboardInterrupt:
print ('Программа остановлена')
running = False
0 file.close()
Регистратор температуры и влажности
198

Сначала вы подключаете библиотеку Adafruit_DHT 1, которую


вы ранее установили, а также встроенную библиотеку time. Затем
в 2 вы раскомментируете строку, которая соответствует использу-
емому вами датчику. Если вы используете DHT22, ничего менять
не нужно.
Строка 5 запускает снятие показаний температуры и влажности
и сохраняет показания в переменных temperature и humidity
соответственно. Учтите, что по умолчанию вы получите значение тем-
пературы в градусах Цельсия. Если вы захотите перевести их в гра-
дусы Фаренгейта, раскомментируйте строку 6.
Иногда при снятии показаний возникают ошибки. Тогда датчик
передает Pi нулевой результат. Оператор if 7 обеспечивает сохра-
нение данных только в том случае, если показания действительно
получены (не пусты). Вы также создаете метку времени, фиксиру-
ющую время каждого снятия показаний, с использованием функции
time.strftime('% H:% M:% S% d / % m / % Y'). Аргумент
в круглых скобках — это формат, в котором вы хотите отображать
дату и время: часы, минуты, секунды, день, месяц и год соответ-
ственно.
Этот скрипт считывает и фиксирует температуру и влажность
каждые 10 секунд, но вы можете изменить эту частоту в 9, изменив
время паузы. Датчик способен считывать показания каждые 2 секун-
ды, но не чаще.

Создание, редактирование и закрытие файлов .txt

Снятые датчиком DHT22 показания температуры и влажности ав-


томатически сохраняются в текстовом файле, который вы создаете
с помощью функции open() 3 и сохраняете в переменной file.
Функция open() принимает на вход два аргумента:
• имя файла, которое вы задаете сами;
• режим доступа к файлу. В данном случае значение «w» го-
ворит Python, что вы хотите, чтобы этот файл находился в ре-
жиме записи (write mode), то есть вы хотите, чтобы программа
могла вносить изменения в файл. В режиме записи файл посто-
янно перезаписывается с тем же именем.
Функция file.write() осуществляет запись в файл и в каче-
стве аргумента на вход принимает строку. Например, в случае с file.
write('Дата и время, температура, влажность \ n') в 4 вы
записываете в файл в качестве первой строки текст «Дата и время,
Программирование
199

температура, влажность». В 7 вы записываете в файл показания дат-


чика, а в 8 — метку времени. Символ \ n сообщает Python, что сле-
дующие полученные данные нужно записать в файл с новой строки.
Наконец, функция file.close() 0 сохраняет внесенные измене-
ния и закрывает файл.

Запуск скрипта

Чтобы запустить скрипт, нажмите клавишу F5 или выберите пункт


меню Run→Run Module. Пусть скрипт выполняется в течение не-
скольких часов, чтобы собрать значительное количество данных.
Остановить выполнение можно с помощью клавиш Сtrl+C. После
этого в папке Sensors у вас должен появиться файл sensor_
readings.txt, в котором записаны все собранные показания.

ПРИМЕЧАНИЕ
Каждый раз, когда вы запускаете код, он перезаписывает все, что
уже было в файле sensor_readings.txt. Если вы не хотите,
чтобы это происходило, при каждом запуске скрипта изменяйте
имя файла в 4, чтобы создавать новый файл.
Регистратор температуры и влажности
200

Идеи для продолжения


В этом проекте вы приобрели очень полезный навык — ведение жур-
нала данных. Теперь вы можете использовать регистрацию данных
в других проектах. Вот несколько идей:
• Задействуйте датчик движения PIR и пишите код для записи
временной метки каждый раз, когда датчик обнаруживает дви-
жение.
• Постройте регистратор данных метеостанции с помощью платы
расширения Sense HAT.
• Придумайте, где еще можно использовать датчики. Например,
вы можете создать регистратор данных для теплицы на основе
датчиков влажности почвы, дождя и освещенности.
Камеры
СТОИМОСТЬ: $$
ПРИМЕРНОЕ ВРЕМЯ СБОРКИ: 45 минут

ПЕРЕЧЕНЬ КОМПОНЕНТОВ:
• Raspberry Pi
• Макетная плата
• Модуль камеры V2
• Датчик движения PIR HC-SR501
• Кнопочный переключатель (кнопка)
• Соединительные провода разных типов
13
Детектор взлома
с фоторегистрацией
В этом проекте вы научитесь использовать модуль
камеры V2 Raspberry Pi, который в паре с датчиком
движения PIR будет обнаруживать злоумышлен-
ников и фотографировать их. Когда датчик обна-
руживает движение, запускается процесс фото-
съемки. Таким образом, вы всегда будете знать,
что происходит в вашем доме, когда вас там нет.

Знакомство с модулем
камеры V2 Raspberry Pi
Модуль камеры V2 Raspberry Pi (рис. 13.1) оснащен 8-мегапиксель-
ным сенсорным датчиком изображений Sony IMX219 и объективом
с фиксированным фокусом. Он способен делать снимки с разрешени-
ем 3280 × 2464 пикселей и снимать видео с разрешением 1080p при
частоте 30 кадров в секунду, 720p при частоте 60 кадров в секунду
и 640 × 480 при частоте 90 кадров в секунду. Все эти характеристики
говорят о том, что это довольно мощная камера для своих размеров!
В этом проекте вы будете использовать только часть возможностей
модуля — получение статичного изображения.
Эта камера совместима со всеми моделями Raspberry Pi (1, 2, 3
и zero). Она идет в комплекте с ленточным кабелем длиной 15 см,
Детектор взлома с фоторегистрацией
204

Рис. 13.1. Модуль камеры V2 платы Raspberry Pi

что упрощает подключение к порту CSI на Raspberry Pi, предназна-


ченному для взаимодействия с камерами. Если же вы хотите раз-
местить вашу камеру на расстоянии более 15 см от Pi, вы без труда
сможете найти и приобрести более длинные кабели.
Модуль камеры V2 Raspberry Pi является одним из самых попу-
лярных дополнений к Raspberry Pi, поскольку он предоставляет воз-
можность самым доступным способом делать снимки и записывать
видео в формате full HD. На рисунке 13.2 показан очень интересный
проект, выполненный с использованием модуля камеры V2 сообще-
ством Naturebytes. Это камера, направленная на кормушку для птиц,
для съемки дикой природы в действии.

Рис. 13.2. Камера Raspberry Pi с датчиком движения PIR, направлен-


ная на кормушку для птиц (Источник: ©Naturebytes)
Создание детектора взлома
205

В проекте Naturebytes также задействован датчик движения PIR,


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

Создание детектора взлома


Детектор взлома состоит из датчика движения PIR, кнопки и моду-
ля камеры V2, который вы подключите к Pi. Встроенная библиотека
picamera упростит управление камерой.

Активация камеры

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


ровать возможность использования программного обеспечения каме-
ры Pi. В среде рабочего стола перейдите в главное меню и выбе-
рите пункт Preferences→Raspberry Pi Configuration. В открывшемся
окне (рис. 13.3) найдите строку Camera, выберите для нее параметр
Enabled и нажмите ОК. Теперь к использованию камеры все готово.

Рис. 13.3. Активация программного обеспечения камеры


Детектор взлома с фоторегистрацией
206

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

После активации программного обеспечения камеры выключите Pi,


а затем подключите камеру к порту CSI. Убедитесь, что шлейф ка-
меры был подключен синими буквами вверх и расположен, как по-
казано на рис. 13.4. Затем снова включите Pi.

Рис. 13.4. Подключение камеры Raspberry Pi к порту CSI

ПРИМЕЧАНИЕ
Передвигая камеру, будьте внимательны. Шлейф камеры очень
хрупкий, и, если он будет тереться о штырьки портов GPIO, ваша
камера может быть серьезно повреждена. Для обеспечения без-
опасности камеры обмотайте ее кабель, например, скотчем.
Сборка схемы
207

Сборка схемы
После подключения камеры для завершения сборки выполни-
те приведенные ниже шаги (в качестве примера ориентируйтесь
на рис. 13.5):
1. Соедините GND платы Raspberry Pi с синей шиной GND ма-
кетной платы.
2. Установите кнопку на макетную плату так, чтобы ее ножки рас-
положились по разные стороны от борозды. Соедините одну ножку
с GND, а вторую (с той же стороны от борозды) с GPIO 2.
3. Подключите датчик движения PIR, как расписано в таблице:

Датчик движения PIR Raspberry Pi


GND GND
OUT GPIO 4
VCC 5V

Рис. 13.5. Схема детектора взлома


Детектор взлома с фоторегистрацией
208

Программирование
Для управления камерой вы будете использовать встроенную би-
блиотеку picamera. Это очень простая библиотека, поэтому и весь
скрипт будет предельно прост. Вот что он должен делать:
1. Вызывать камеру.
2. Делать снимок, когда датчик движения PIR обнаруживает ка-
кое-либо движение.
3. Сохранять фотографии в папке Desktop.
4. Именовать фотографии по порядку, чтобы вы знали, в какой
последовательности они были сделаны. Например, image_1.jpg,
image_2.jpg и так далее.
5. Останавливать камеру, когда нажимается кнопка. Если вы
не добавите эту функцию, вы просто не сможете закрыть окно пред-
варительного просмотра камеры, которое будет отображаться на ва-
шем экране.

Написание скрипта

Откройте папку Projects и создайте в ней новую папку с име-


нем Cameras. Затем запустите Python 3 (IDLE) и выберите пункт
меню File→New File. Скопируйте приведенный ниже код в редактор
Python, а затем сохраните скрипт с именем burglar_detector.py
(помните, что вы можете скачать все скрипты с сайта http://pilotlz.
ru/books/files/10857 / ).

ПРИМЕЧАНИЕ
Не называйте ни один из ваших файлов picamera.py, потому
что picamera — имя встроенной библиотеки Python и оно не мо-
жет использоваться.

#подключаем необходимые библиотеки


1 from gpiozero import Button, MotionSensor
from picamera import PiCamera
from time import sleep
from signal import pause
Программирование
209

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


2 button = Button(2)
pir = MotionSensor(4)
camera = PiCamera()

#запускаем камеру
camera.rotation = 180
3 camera.start_preview()

#создаем имена изображений


4i = 0

#останавливаем работу камеры, когда нажата кнопка


5 def stop_camera():
camera.stop_preview()
#выходим из программы
exit()

#делаем снимок, когда зафиксировано движение


6 def take_photo():
global i
i = i + 1
camera.capture(' / home / pi / Desktop / image_%s.jpg' % i)
print ('Снимок сделан')
7 sleep(10)

#определяем функцию, которая запускается при нажатии


кнопки
8 button.when_pressed = stop_camera
#определяем функцию, которая запускается при обнаружении
движения
9 pir.when_motion = take_photo

pause()

Сначала вы подключаете все необходимые библиотеки 1. Как уже


было сказано, эта программа использует библиотеку picamera для
управления камерой. Все остальные библиотеки вам уже знакомы
из предыдущих проектов.
Далее вы создаете объекты для кнопки, датчика движения PIR
и камеры 2 и включаете камеру с помощью функции camera.
start_preview() 3. В зависимости от того, как ориентирована
ваша камера, вам также может понадобиться повернуть ее на 180 гра-

Powered by TCPDF (www.tcpdf.org)


Детектор взлома с фоторегистрацией
210

дусов, чтобы она не выдавала перевернутые вверх ногами фотографии.


Это делается с помощью строки camera.rotation = 180. Если
при тестировании обнаружится, что изображение было перевернуто,
закомментируйте эту строку или задайте в ней значение 0.
Следующим шагом вы объявляете переменную i с начальным зна-
чением 0 4. Функция take_photo(), определенная в 6, будет ис-
пользовать эту переменную для подсчета и нумерации изображений,
увеличивая число в имени файла на единицу с каждым сделанным
снимком.
Затем вы определяете функцию stop_camera(), которая оста-
навливает работу камеры с помощью функции camera.stop_
preview() 5. В 6 вы определяете функцию take_photo(),
которая делает снимок. Для сохранения фото вы используете функ-
цию camera.capture(), указав в качестве аргумента папку, в ко-
торой вы хотите сохранить изображение. В данном случае мы со-
храняем изображения в папке Desktop и называем изображения
image_%s.jpg, где %s заменяется на значение переменной i, ко-
торое мы предварительно увеличили на 1. Если вы хотите сохранить
файлы в другой папке, замените указанный путь на путь к выбран-
ной вами папке.
В 7 вы устанавливаете 10-секундную паузу, то есть камера фото-
графирует с интервалом в 10 секунд. В это время датчик PIR обна-
руживает движение. Вы можете задать абсолютно любое время пау-
зы, но, если она будет слишком короткой, вы рискуете перегрузить
память своей Pi тоннами изображений.
В 8 вы вызываете функцию stop_camera(), когда нажата кноп-
ка. Эта функция останавливает работу камеры и производит выход
из программы. Функция exit() открывает окно с запросом о том,
хотите ли вы закрыть программу. Чтобы закрыть его, нажмите ОК.
И наконец, в 9 вы указываете камере сделать снимок при обна-
ружении движения, вызывая функцию take_photo().

Запуск скрипта

Чтобы запустить скрипт, нажмите клавишу F5 или выберите пункт


меню Run→Run Module. Пока скрипт выполняется, вы должны уви-
деть на вашем экране предварительный просмотр того, что видит ка-
мера. Чтобы отключить предварительный просмотр камеры, нажмите
кнопку и нажмите ОК в открывшемся окне.
Поздравляем! Ваш детектор взлома готов поймать грабителей. По-
местите детектор взлома в стратегически важном месте и вернитесь
Идеи для продолжения
211

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


На рисунке 13.6 показана фотография, снятая нашим детектором
взлома, на которой кто-то крадет компьютер из нашей лаборатории.

Рис. 13.6. Фотография, сделанная с помощью детектора взлома

Идеи для продолжения


Как видите, проекты с камерами — это весело! А теперь, используя
навыки, которые получили при выполнении проектов 9–12, вы мо-
жете усовершенствовать свою систему безопасности. Измените свой
проект так, чтобы при обнаружении движения звучал сигнал тревоги,
а сделанные фото отправлялись бы вам по электронной почте.
СТОИМОСТЬ: $$
ПРИМЕРНОЕ ВРЕМЯ СБОРКИ: 30 минут

ПЕРЕЧЕНЬ КОМПОНЕНТОВ:
• Raspberry Pi
• Модуль камеры V2 Raspberry Pi
14
Система домашнего
видеонаблюдения
В этом проекте вы создадите систему домашнего
видеонаблюдения, которая отправляет записан-
ное видео на веб-страницу. Таким образом, вы
сможете просматривать его со своей Pi или любо-
го устройства, подключенного к сети и способно-
го воспроизводить видео через браузер. Это зна-
чит, что вы сможете контролировать любой уголок
вашего дома, буквально не вставая с дивана!

В этом проекте вам снова понадобится подключить модуль камеры


к Raspberry Pi, а значит, и программное обеспечение камеры должно
быть активировано. Поэтому, если вы еще не выполняли проект 13,
перейдите к нему прямо сейчас и выполните действия, описанные
в разделах «Активация камеры» и «Подключение камеры».
Система домашнего видеонаблюдения
214

Запись видео в файл


Прежде чем создавать домашнюю систему видеонаблюдения, необхо-
димо научиться сохранять снятые видео в файл.
По образцу проекта 13 подключите модуль камеры V2 к порту CSI
вашей Pi. Затем создайте новый скрипт с именем record_file.py
в Python 3 (IDLE), введите код из листинга 14.1 и сохраните скрипт
в папке Cameras.

Листинг 14.1. Сохранение видео в файл:

1 import picamera

2 camera = picamera.PiCamera()
3 camera.resolution = (640, 480)
4 camera.start_recording('videotest.h264')
5 camera.wait_recording(60)
6 camera.stop_recording()

print('Запись видео завершена')

Как и во всех предыдущих проектах, сначала подключите библио-


теку picamera для управления камерой 1. Затем вы объявляете
объект с именем camera для обращения к камере 2 и устанавли-
ваете разрешение камеры 640 × 480 3. Разрешение камеры можно
настраивать: максимальное разрешение для видеозаписи составляет
1920 × 1080, а минимальное — 64 × 64. Чтобы получить максималь-
ное разрешение, вам также необходимо установить кадровую частоту
(количество кадров в секунду) равной 15. Это можно сделать, доба-
вив строку кода camera.framerate = 15. Теперь вы можете про-
тестировать скрипт и поэкспериментировать с разрешением камеры,
выбрав значение, которое вас устроит, или же оставить предложен-
ные нами настройки и вернуться к этому позже.
Следующим шагом вы прописываете команду начала записи видео
в файл с именем videotest.h264 4. Можно задать любое дру-
гое имя файла, но обязательно оставьте расширение .h264 — это
формат для видеофайлов. Затем в 5 вы указываете время, в течение
которого камера должна записывать видео. В данном случае камера
будет записывать видео 60 секунд. Функция wait_recording()
выполняет проверку на наличие ошибок, например достаточно ли
места на диске для продолжения записи.
Программирование
215

Наконец, вы останавливаете запись видео 6 и выводите сообще-


ние о ее завершении. Запустите скрипт нажатием F5 или выберите
пункт меню Run→Run Module. Записанный видеофайл будет нахо-
диться в папке скриптов Cameras. Чтобы посмотреть его, откройте
терминал и введите следующие команды:

pi@raspberrypi:~ $ cd ~ / Desktop / Projects / Cameras


pi@raspberrypi:~ / Desktop / Projects / Cameras $ omxplayer
videotest.h264

Откроется новое окно, в котором видео будет воспроизводиться


в полноэкранном режиме. На рисунке 14.1 показан скриншот нашего
тестирования этого проекта.

Рис. 14.1. Запись видео камерой Raspberry Pi

Программирование
Теперь перейдем к главному. Как было сказано в описании проекта,
для воспроизведения видео вы создадите веб-страницу. Веб-сервером
для этой страницы будет служить Raspberry Pi. (Более подробно веб-
серверы рассматриваются в проектах 15, 16 и 17.)
Система домашнего видеонаблюдения
216

Скрипт для этого проекта гораздо сложнее, чем вы писали раньше,


поэтому мы не будем подробно объяснять каждую строку. Вот что он
должен делать в целом:
1. Инициализировать веб-сервер и камеру Pi.
2. Установить веб-сервер, доступный по IP-адресу вашей Raspberry
Pi на порте 8000, для отображения веб-страницы, которую вы напи-
шете на HTML.
3. Настроить веб-страницу для воспроизведения видео.
4. Открыть доступ к веб-серверу из любого браузера, подключен-
ного к той же сети, что и ваша Pi.

Написание скрипта

Создайте новый скрипт, запустив Python 3 (IDLE) и выбрав пункт


меню File→New File. Введите код из листинга 14.2 в редактор Python,
а затем сохраните скрипт с именем surveillance_system.py
в папке Cameras (не забывайте, что все скрипты можно скачать
с сайта http://pilotlz.ru/books/files/10857 / ).
Этот скрипт основан на примере с сайта, посвященного исполь-
зованию камеры Raspberry Pi: http://picamera.readthedocs.io / en /
latest / recipes2.html

Листинг 14.2. Отображение видео через веб-страницу:


import io
import picamera
import logging
import socketserver
from threading import Condition
from http import server

1 PAGE="""\
<html>
<head>
<title>Система домашнего видеонаблюдения с Raspberry Pi</
title>
</head>
<body>
<center><h1>Raspberry Pi. Система домашнего
видеонаблюдения</h1></center>
<center><img src="stream.mjpg" width="640"
height="480"></center>
Программирование
217

</body>
</html>
"""

class StreamingOutput(object):
def __init__(self):
self.frame = None
self.buffer = io.BytesIO()
self.condition = Condition()

def write(self, buf):


if buf.startswith(b'\xff\xd8'):
#новый фрейм, который копирует текущее
содержимое буфера обмена и сообщает всем
пользователям, что буфер свободен
self.buffer.truncate()
with self.condition:
self.frame = self.buffer.getvalue()
self.condition.notify_all()
self.buffer.seek(0)
return self.buffer.write(buf)

class StreamingHandler(server.BaseHTTPRequestHandler):
def do_GET(self):
if self.path == '/':
self.send_response(301)
self.send_header('Location', '/index.html')
self.end_headers()
elif self.path == '/index.html':
content = PAGE.encode('utf-8')
self.send_response(200)
self.send_header('Content-Type', 'text/html')
self.send_header('Content-Length',
len(content))
self.end_headers()
self.wfile.write(content)
elif self.path == '/stream.mjpg':
self.send_response(200)
self.send_header('Age', 0)
self.send_header('Cache-Control', 'no-cache,
private')
self.send_header('Pragma', 'no-cache')
self.send_header('Content-Type', 'multipart/x-
mixed-replace; boundary=FRAME')
Система домашнего видеонаблюдения
218

self.end_headers()
try:
while True:
with output.condition:
output.condition.wait()
frame = output.frame
self.wfile.write(b'--FRAME\r\n')
self.send_header('Content-Type',
'image/jpeg')
self.send_header('Content-Length',
len(frame))
self.end_headers()
self.wfile.write(frame)
self.wfile.write(b'\r\n')
except Exception as e:
logging.warning('Подключенный удаленный
клиент %s: %s', self.client_address, str(e))
else:
self.send_error(404)
self.end_headers()
class StreamingServer(socketserver.ThreadingMixIn,
server.HTTPServer):
allow_reuse_address = True
daemon_threads = True

2 with picamera.PiCamera(resolution='640x480',
framerate=24) as camera:
output = StreamingOutput()
camera.start_recording(output, format='mjpeg')
try:
address = ('', 8000)
server = StreamingServer(address,
StreamingHandler)
server.serve_forever()
finally:
camera.stop_recording()

Листинг 14.2 гораздо сложнее, чем скрипты, которые вы писали


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

• В 1 вы описываете структуру и контент веб-страницы на языке


HTML. Здесь вы можете изменить надписи в заголовке и шапке
своей веб-страницы1. Узнать больше о HTML и о том, как из-
менить стиль веб-страницы с помощью CSS, вы можете в про-
екте 15.
• В 2 вы объявляете переменную камеры и задаете ее настройки.
Здесь можно изменить разрешение камеры и частоту кадров2.

Запуск скрипта

Чтобы запустить скрипт, нажмите F5 или выберите пункт меню


Run→Run Module. Когда скрипт запустится, видео с вашей камеры
начнет передаваться на веб-страницу. Чтобы получить доступ к этой
странице, вам нужно узнать IP-адрес вашей Pi и набрать в браузере
адрес http://<IP-адрес Pi>:8000, заменив <IP-адрес Pi> на IP-
адрес вашей Pi. Чтобы узнать его, откройте терминал и наберите ко-
манду:

pi@raspberrypi:~ $ hostname -I

Эта команда выведет IP-адрес вашей Pi (рис. 14.2).

Рис. 14.2. Как узнать IP-адрес своей Raspberry Pi

1
Эти надписи прописаны в тегах <title> и <h1>. — Прим. перев.
2
Для этого нужно изменить значение параметров resolution и framerate со-
ответственно. — Прим. перев.
Система домашнего видеонаблюдения
220

В этом примере мы вводим следующий адрес веб-страницы


http://192.168.1.112:8000, поскольку IP-адрес нашей Pi —
192.168.1.112. Убедитесь, что вы вводите собственный IP-адрес.
Поздравляем! Вы создали свою домашнюю систему видеонаблюде-
ния! Теперь вы можете получить доступ к видео с вашего компьюте-
ра, смартфона или планшета, подключенного к локальной сети.

Идеи для продолжения


В этом проекте вы узнали, как записывать видео и как создать веб-
сервер, который транслирует видео в реальном времени. А теперь
примените полученные навыки для усовершенствования других про-
ектов этой книги, например:
• Введите изменения в проект 13, чтобы Pi записывала видео в те-
чение определенного времени с момента обнаружения движения.
• Настройте стиль веб-страницы с видео с помощью CSS, исполь-
зуя новые умения, которые приобретете, выполнив проект 15.
Веб-
приложения
СТОИМОСТЬ: $
ПРИМЕРНОЕ ВРЕМЯ СБОРКИ: 2 часа

ПОЛИЦЕЙСКИЙ ПЕС МАКС


О Максе
Привет, я Макс. Я начинающий полицейский пес
из Португалии. Мне нравится лаять, бегать
и играть в мяч. Я люблю мясо и кости.
Мой любимый сериал – «Комиссар Рекс».

Забавная погоня полицейской собаки

ПЕРЕЧЕНЬ КОМПОНЕНТОВ:
• Raspberry Pi
15
Ваш первый веб-сайт
В этом проекте вы создадите простой веб-сайт
с заголовками, разделами, изображениями, ссыл-
ками и кнопками. Вы будете использовать язык
HTML, чтобы создать страницу, и CSS, чтобы
оформить ее на свой вкус. Эти навыки позволят
вам в дальнейшем создавать самые разные сай-
ты, какие только захотите.

Создание файлов проекта


Поскольку вам придется работать с несколькими файлами, мы ре-
комендуем создать для этого проекта отдельную папку. Запустите
файловый менеджер, найдите в нем папку Projects, где хранят-
ся все ваши проекты. Создайте в папке Projects новую папку
Web_Applications, а затем перейдите в нее и создайте папку
Project_15 специально для этого проекта.
В этом проекте вы не будете собирать никаких схем, вам понадо-
бятся только компьютер и Raspberry Pi. Создавать и редактировать
файлы HTML и CSS вы будете в текстовом редакторе — программе
Text Editor. Чтобы запустить Text Editor, вызовите главное меню ра-
бочего стола и выберите пункт Accessories→Text Editor.
Когда откроется Text Editor, нажмите Ctrl+N, чтобы создать но-
вый файл. Для выполнения проекта вам понадобятся два файла, по-
этому нажмите Ctrl+N еще раз. Затем сохраните эти файлы в папке
Project_15 с именами index.html и style.css (рис. 15.1).
Ваш первый веб-сайт
224

Рис. 15.1. Создание файлов HTML и CSS

Код для обоих файлов можно скачать с сайта http://pilotlz.ru/books/


files/10857 /

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


HTML (HyperText Markup Language) — гипертекстовый язык размет-
ки. Это один из самых популярных языков разметки, используемых
для создания веб-страниц. Веб-браузеры изначально были разработа-
ны для чтения HTML-тегов, которые сообщают браузеру, как именно
следует отображать содержимое страницы. Давайте разберемся, как
работают теги.

Создание базовой структуры веб-страницы

Давайте рассмотрим базовую структуру HTML-документа. Откройте


файл index.html с помощью текстового редактора и введите код
из листинга 15.1.

Листинг 15.1. Базовая структура веб-страницы на HTML:


<!DOCTYPE html>
1 <html>
2 <head>
< / head>
3 <body>
< / body>
< / html>

Этот код представляет собой просто список тегов HTML, поме-


щенных между символами < и >. Первая строка любого HTML-
документа всегда <!DOCTYPE html>. Она сообщает веб-браузеру,
что данный документ является HTML-файлом.
Создание веб-страницы на языке HTML
225

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


ми <html> 1 и < / html>, которые обозначают начало веб-страницы
и ее конец соответственно. Обратите внимание, что в закрывающем
теге после символа < должен ставиться символ /. Это относится
ко всем закрывающим тегам HTML1. Однако, как вы убедитесь поз-
же, не всем тегам HTML нужен закрывающий тег.
HTML-файлы состоят из двух основных частей: заголовка и тела.
Заголовок HTML-файла описывается между тегами <head> 2
и < / head>. В нем вы прописываете данные об HTML-файле, кото-
рые не отображаются непосредственно на веб-странице, но относятся
к ее функционированию, например название, которое отображается
на вкладке браузера, скрипты, стили веб-страницы и так далее. Тело
описывается между тегами <body> 3 и < / body>. В нем прописы-
вается непосредственно содержимое страницы, например заголовки,
текст, изображения, таблицы и так далее.

Добавление названия веб-страницы,


заголовков и абзацев

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


дите в меню панели задач и запустите веб-браузер Chromium. Затем
просто перетащите в Chromium файл index.html из файлового ме-
неджера. В данный момент вы должны увидеть только пустую стра-
ницу, потому что вы еще ничего не добавили в HTML-файл.
В этом разделе вы добавите на веб-страницу название, заголовки
и абзацы.
Использование тегов названия страницы. Название страницы про-
писывается между тегами <title> и < / title>, которые должны
находиться в заголовке HTML-файла, то есть между тегами <head>
и < / head>. Добавьте название страницы в свой файл index.html:

<head>
<title>Полицейский пес Макс< / title>
< / head>

Если вы сохраните и снова перетащите файл в свой браузер,


не удивляйтесь, что все еще видите пустую страницу. Название ото-

1
Многие теги в HTML — парные. Открывающий тег (<>) ставится перед на-
чалом содержимого, а закрывающий тег (< / >) — после его окончания. То есть
все содержимое HTML-файла оформляется следующим образом: <тег>содержи-
мое< / тег>. — Прим. перев.
Ваш первый веб-сайт
226

бразилось на вкладке веб-браузера, а не на самой странице. Мы на-


звали веб-страницу «Полицейский пес Макс», но вы можете задать
любое другое название.

ПРИМЕЧАНИЕ
После сохранения файла вам необязательно каждый раз перета-
скивать его в браузер. Просто обновите веб-страницу — измене-
ния тут же вступят в силу.

Использование тегов заголовков разного уровня. Для структу-


рирования содержимого веб-страницы вы можете использовать за-
головки и подзаголовки разных уровней. Теги заголовка начинаются
с буквы h, после которой ставится число, указывающее на уровень
заголовка. Например, <h1> и < / h1> — это теги для заголовка пер-
вого уровня (верхнего). Тегами <h2> и < / h2> обозначается заголо-
вок второго уровня и так далее до заголовка шестого уровня (нижне-
го). Теги заголовков должны находиться в теле HTML-файла, то есть
между тегами <body> и < / body>. Добавьте в тело вашего файла
несколько заголовков разного уровня:

<body>
<h1>ПОЛИЦЕЙСКИЙ ПЕС МАКС< / h1>
<h2>О Максе< / h2>
< / body>

Мы добавили на нашу веб-страницу о Максе два заголовка:


«ПОЛИЦЕЙСКИЙ ПЕС МАКС» на верхнем уровне и «О Максе»
на уровень ниже. Теперь настало время добавить текст под этими
заголовками.
Использование тегов абзацев. Текстовое содержимое страницы
нужно разделить на абзацы (paragraph). Каждый абзац должен распо-
лагаться между тегами <p> и < / p>. Добавьте в ваш файл несколько
абзацев:

<h2>О Максе< / h2>


<p>Привет, я Макс. Я начинающий полицейский пес
из Португалии. Мне нравится лаять, бегать и играть в мяч.
Я люблю мясо и кости.< / p>
<p>Мой любимый сериал — «Комиссар Рекс».< / p>

Здорово, теперь у вас есть собственная веб-страница!


Создание веб-страницы на языке HTML
227

Просмотр вашей веб-страницы в браузере

Сохраните index.html и обновите веб-страницу. Теперь веб-


страница о Максе должна выглядеть как на рис. 15.2.

Рис. 15.2. Простая HTML-страница

Как видите, HTML добавил ваш текст на страницу, выделил за-


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

Добавление ссылок, изображений и кнопок

Любой более-менее серьезный веб-сайт должен содержать нечто


большее, чем просто текст. В этом разделе мы покажем вам, как до-
бавлять изображения, кнопки, новые страницы и делать ссылки для
перехода на другие страницы.
Добавление гиперссылок. Чтобы добавить гиперссылку на другую
страницу в Интернете, добавьте парный тег <a> где-нибудь в теле
файла между тегами <body> и < / body>. Например, вы можете до-
бавить на свою страницу гиперссылку на страницу Википедии о се-
риале «Комиссар Рекс»:

<a href='https://ru.wikipedia.org / wiki / Комиссар_


Рекс'>«Комиссар Рекс»< / a>

Тег а обозначает anchor (якорь, ссылка), а текст, который прописан


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

это «Комиссар Рекс». Внутри тега <a> мы добавили атрибут href,


который указывает, куда именно должна вести указанная ссылка.
Текст ссылки — это текст, который видят посетители страницы. На-
жав на этот текст, они попадут на страницу Википедии о сериале
«Комиссар Рекс».
Большинство веб-сайтов состоит из нескольких страниц, между
которыми вы можете переключаться. Такая навигация по сайту также
реализуется с помощью гиперссылок. Например, если вы хотите до-
бавить новую страницу с фотографиями Макса, вам нужно добавить
гиперссылку на нее:

<a href='gallery.html'>Посетите мою фотогалерею< / a>

Сейчас эта ссылка никуда не ведет, потому что указанной страницы


gallery.html еще не существует. Вам необходимо создать новый
файл в текстовом редакторе и сохранить его с именем gallery.
html в той же папке, что и файл index.html1. Теперь вы знаете,
как создать новую веб-страницу.
Добавление изображений. Изображения украшают любой сайт.
Чтобы добавить изображение, используйте тег <img>. Этот тег
не имеет закрывающего тега, потому что имя нужного изображения
вы указываете внутри открывающего тега, в угловых скобках < >.
Файл изображения, которое вы хотите добавить на страницу, нужно
сохранить в той же папке, что и страницы веб-сайта (в данном слу-
чае Project_15). Чтобы добавить на страницу изображение с име-
нем max.jpg, вы должны прописать в HTML-файле следующее:

<img src='max.jpg'>

Атрибут src содержит путь к файлу изображения. Но, так как


наше изображение хранится в папке веб-сайта, вы можете просто
указать имя файла изображения. Если вы используете другое изобра-
жение, замените max.jpg в коде на имя своего файла изображения.
Вы также можете использовать гиперссылку на изображение, заменив
max.jpg на нужную ссылку.
Размер изображения можно изменить, отредактировав файл изо-
бражения вручную или прописав атрибут height в теге <img>. На-
пример, чтобы изменить высоту до 350 пикселей, напишите:

<img src='max.jpg' height='350'>

1
Именно потому, что файл gallery.html помещен в ту же папку, что и файл
index.html, в качестве гиперссылки мы можем указать сокращенный путь
к нему, то есть только имя самого файла "gallery.html". — Прим. перев.
Создание веб-страницы на языке HTML
229

Пропорции изображения при этом сохраняются, то есть ширина


настраивается автоматически в соответствии с высотой. Вы также
можете изменить ширину, прописав атрибут width, и тогда высота
будет скорректирована автоматически.
Тег <img> должен находиться внутри тега <p> или <div>. Тег
<div> используется для создания нового раздела на вашей странице
(см. далее в листинге 15.2).
Добавление кнопок. Чтобы добавить на веб-страницу кнопку, про-
пишите название, которое должно на ней отображаться, между тегами
<button> и < / button>. Мы, например, хотим добавить кнопку, ко-
торая будет открывать на YouTube забавное видео с погоней полицей-
ской собаки, поэтому задали для кнопки соответствующее название:

<button>Забавная погоня полицейской собаки< / button>

Чтобы при нажатии на кнопку происходила переадресация на страни-


цу с видео, скопируйте ссылку на эту страницу и вставьте ее в тег <a>:

<a href='https://youtu.be / znM9YD2J3Cw'><button> Забавная


погоня полицейской собаки < / button>< / a>

Просмотр получившейся веб-страницы о Максе. Мы добави-


ли на веб-страницу о Максе изображение, ссылку и кнопку. Теперь
HTML-файл выглядит, как в листинге 15.2.

Листинг 15.2. HTML-файл веб-страницы о Максе со ссылкой, изо-


бражением и кнопкой:
<!DOCTYPE html>
<html>
<head>
<title>Полицейский пес Макс< / title>
< / head>
<body>
1 <header>
2 <div class='title'>
<h1>ПОЛИЦЕЙСКИЙ ПЕС МАКС< / h1>
< / div>
4 < / header>
5 <main>
<h2>О Максе< / h2>
<p> Привет, я Макс. Я начинающий полицейский пес
из Португалии. Мне нравится лаять, бегать и играть в мяч.
Я люблю мясо и кости.< / p>
Ваш первый веб-сайт
230

<p> Мой любимый сериал — <a href='https://ru.wikipedia.


org / wiki / Комиссар_Рекс'>«Комиссар Рекс»< / a>.< / p>
<p><img src='max.jpg' width='350'>< / p>
<a href='https://youtu.be / znM9YD2J3Cw'><button>Забавная
погоня полицейской собаки< / button>< / a>
6 < / main>
< / body>
< / html>

Обратите внимание, что мы добавили три новых тега:


• <header> 1 и </header> 4 содержат заголовок первого уровня1.
• <div class = 'title'> 2 и < / div> 3 задают новый раздел
страницы. Атрибут class с именем title указывает на то, что
данный HTML-элемент является членом определенного класса,
в данном случае класса заголовков (но вы можете дать ему лю-
бое имя). Использовать атрибут class очень полезно, так вы
сможете впоследствии задать в CSS один и тот же стиль для
нескольких элементов, принадлежащих одному классу.
• <main> 5 и < / main> 6 содержат основное (главное) содержа-
ние файла. Здесь вы должны размещать уникальное содержи-
мое этого файла, то есть контент, который на веб-сайте не по-
вторяется. В одном HTML-файле должен быть только один тег
<main>.
Таким образом, мы структурировали содержимое HTML-файла,
чтобы позднее веб-страницу можно было форматировать с использова-
нием CSS. Посмотрите, как выглядит веб-страница теперь (рис. 15.3).

Рис. 15.3. Веб-страница о Максе с гиперссылкой, изображением


и кнопкой

1
Тегом header обозначается верхний колонтитул, то есть «шапка» веб-страницы.
В данном случае верхний колонтитул вашей веб-страницы содержит заголовок
первого уровня, который прописан в теге h1. — Прим. перев.
Изменение стилей веб-страницы с помощью CSS
231

Изменение стилей веб-страницы


с помощью CSS
Теперь вам предстоит добавить в проект CSS (Cascading Style Sheets —
каскадные таблицы стилей). Язык таблиц стилей применяется для
описания того, как будут выглядеть элементы веб-страницы. Вы мо-
жете добавить CSS либо непосредственно в HTML-файл, либо в от-
дельный CSS-файл, на который вы затем будете ссылаться в HTML-
файле. В этом проекте вы создадите для CSS отдельный файл. Так
вам будет легче читать как CSS, так и HTML-файлы и понимать, что
именно делает каждый из них.

Подключение таблицы стилей

Прежде чем перейти к созданию самого файла CSS, необходимо


подключить таблицу стилей, то есть прописать ее в файл index.
html и этим оповестить HTML, что нужно ссылаться на внешний
файл CSS. С этой целью добавьте между тегами <head> и < / head>
следующую строку:

<link rel='stylesheet' type='text / css' href='style.css'>

Тег <link> сообщает HTML-файлу, что для форматирования веб-


страницы вы используете внешнюю таблицу стилей. Атрибут rel
определяет тип внешнего файла, в данном случае это таблица сти-
лей — файл CSS. Атрибуту type задается значение 'text / css',
чтобы уточнить, что вы используете файл CSS для форматирования
(изменения внешнего вида страницы). В атрибут href прописыва-
ется путь к файлу, но, поскольку файл находится в папке веб-сайта,
вам нужно просто указать имя файла.
После того как вы добавили ссылку для обращения к таблице сти-
лей, ваш заголовок должен выглядеть так, как показано в листинге 15.3.

Листинг 15.3. Подключение таблицы стилей CSS к вашему HTML-


файлу:
<head>
<title>Полицейский пес Макс< / title>
<link rel='stylesheet' type='text/css' href='style.css'>
< / head>
Ваш первый веб-сайт
232

Итак, с помощью этого дополнительного тега файл таблицы сти-


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

Применение стилей к HTML-файлу

Чтобы стилизовать содержимое HTML-файла, CSS использует се-


лекторы (selectors), которые определяют, к каким элементам бу-
дет применен набор правил CSS. У селекторов есть свойства
(properties), которые, в свою очередь, имеют значения (values). Код
для селектора выглядит так:

selector {
property: value;
}

Набор свойств, определяющих стиль для конкретного селектора,


должен находиться между фигурными скобками {}. Вы присваивае-
те свойству значение через двоеточие (:), и каждое значение должно
заканчиваться точкой с запятой (;). Каждый селектор может и, как
правило, имеет более одного свойства.

Применение стилей к верхнему колонтитулу

Если вы выполняете все наши инструкции последовательно, в ва-


шей папке Project_15 сейчас должны быть файлы style.css
и index.html. Откройте файл style.css и отредактируйте верх-
ний колонтитул (шапку) вашей веб-страницы, набрав код, представ-
ленный в листинге 15.4.

Листинг 15.4. Стилизация заголовка с помощью CSS:

header {
1 background: url(background.jpg);
2 background-size: cover;
3 height: 70vh;
}
Изменение стилей веб-страницы с помощью CSS
233

В этом листинге селектор называется header. Это означает, что


правила стиля, которые вы опишете между фигурными скобками,
будут применяться к верхнему колонтитулу (шапке) вашей веб-
страницы. Помните, что верхний колонтитул — это то, что находится
между тегами <header> и < / header>. В данном случае мы добав-
ляем в верхний колонтитул фоновое изображение — красивую фото-
графию Макса. Для этого мы использовали свойство background
и задали ему значение url(background.jpg) 1. Внутри url()
прописывается путь к нужному изображению. И поскольку в данном
случае файл изображения лежит в той же папке, что и файлы HTML
и CSS, вы указываете только его имя. Вы также можете заменить
background.jpg на имя изображения, которое вы хотите исполь-
зовать в качестве фона.
Задайте свойству background-size значение cover 2. Это
означает, что фоновое изображение должно заполнить собой весь раз-
дел верхнего колонтитула.
Задайте свойству height значение 70vh 3, определив таким об-
разом высоту верхнего колонтитула. Существует несколько единиц
измерения высоты, но мы используем vh (высоту окна), которая со-
ставляет 1% от высоты окна веб-браузера и обеспечивает вмещение
всех элементов страницы в область просмотра. При заданном значе-
нии 70 верхний колонтитул будет заполнять 70% окна веб-браузера
независимо от его размера. Поэкспериментируйте с другими значени-
ями высоты и посмотрите, как будет выглядеть ваша страница.
Сохраните файл CSS и обновите вкладку браузера, в которой от-
крыта ваша веб-страница, чтобы увидеть, как она выглядит теперь.

Применение стилей к классу title

Теперь вы отформатируете класс title, который включает в себя


все, что прописано между тегами <div class = 'title'>
и < / div>. Эти теги, в свою очередь, должны находиться между те-
гами <header> и < / header>, а, значит, header является родите-
лем класса title1. Добавьте в ваш файл CSS код из листинга 15.5.

Листинг 15.5. Применение стилей к классу title:


.title {
1 position: absolute;
2 top: 50%;
3 left: 50%;

1
А title соответственно является наследником класса header. — Прим. перев.
Ваш первый веб-сайт
234

4 transform: translate(–50%, –40%);


5 color: white;
6 text-align: center;
}

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


этого класса, а перед ним поставьте точку (.), например: .title.
Далее мы рассмотрим каждый элемент подробнее.
Настройка расположения элементов. Вы можете настраивать рас-
положение элементов, используя для этого свойства top, bottom,
left и right. Но сначала вам нужно задать свойство position 1.
То, как элементы располагаются на веб-странице, напрямую зависит
от выбранного значения свойства position: static, relative,
fixed или absolute (статичное, относительное, фиксированное или
абсолютное).

СВОЙСТВО POSITION
Свойство position может иметь следующие значения:
• static
Элемент со значением static располагается независимо
от свойств top, bottom, left и right. По умолчанию элементы
HTML располагаются статично, с выравниванием по левому краю.
• relative
Элемент со значением relative с помощью свойств top,
bottom, left и right сдвигается относительно своей позиции
по умолчанию (относительно всех остальных элементов).
• fixed
Элемент со значением fixed остается в том же положении, даже
когда страница прокручивается. Скорректировать расположение
элемента в области просмотра можно с помощью свойств top,
bottom, left и right.
• absolute
Элемент со значением absolute расположен относительно его
ближайшего элемента-родителя. Скорректировать расположение
элемента внутри элемента-родителя можно с помощью свойств
top, bottom, left и right.

В данном случае мы используем значение absolute. Это озна-


чает, что каждый элемент расположен относительно его ближайшего
элемента-родителя, то есть сейчас относительно верхнего колонтиту-
ла (рис. 15.4).
Изменение стилей веб-страницы с помощью CSS
235

Рис. 15.4. Расположение элементов класса title внутри верхнего


колонтитула

Свойства top 2 и left 3 определяют, как расположен каждый


элемент по отношению к его родителю. Они задаются в процентах,
которые показывают, как элемент расположен относительно краев
элемента-родителя, где 0% — левый верхний угол. Значения 50% для
top и left одновременно перемещают верхний левый угол раздела
страницы с классом title на середину его элемента-родителя. Это
означает, что левый верхний угол раздела с классом title (обратите
внимание: не центральная точка) будет располагаться в центре верхне-
го колонтитула (рис. 15.4, а). А расположение относительно централь-
ной точки вы можете настроить с помощью свойства transform.
Свойство transform 4 со значениями translate (–50%,
–40%) сдвигает положение элемента. Значение –50% перемещает
элемент класса title на 50% влево относительно его собственного
размера, то есть центрирует его горизонтально внутри верхнего ко-
лонтитула (рис. 15.4, б). Значение –40% для вертикального располо-
жения сдвигает элемент на 40% вниз (рис. 15.4, в). Поэксперимен-
тируйте с этими значениями и посмотрите, что изменится. Значения
–50% и –40% отлично подходят для страницы Макса, но, в зависи-
мости от выбранного вами фонового изображения, вы можете задать
тексту и другое расположение.
Настройка цвета и выравнивания текста. Свойства color 5
и text-align 6 задают цвет и выравнивание текста соответствен-
но. Вы можете задавать цвета с помощью шестнадцатеричного кода
или цветового кода RGB, а также по их имени — HTML распоз-
нает основные названия цветов. Мы используем шестнадцатеричный
код. Для того чтобы узнать код нужного цвета, найдите, например,
сайт инструмента Google Color Picker. Свойство text-align имеет
несколько значений: left, right, center и justify для вырав-
нивания текста по левому краю, по правому краю, по центру или
по ширине соответственно.
Ваш первый веб-сайт
236

Применение стилей к заголовкам, абзацам и ссылкам

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


добавьте в свой файл CSS код из листинга 15.6.

Листинг 15.6. Применение стилей к заголовкам, абзацам и гипер-


ссылкам:
h1 {
1 font-size: 4rem;
}
h2 {
font-size: 2.5rem;
}
p {
font-size: 1.3rem;
}
2 main {
max-width: 500px;
margin:0 auto;
}
a {
3 text-decoration: none;
}

Чтобы задать размер текста, используйте свойство font-size


1. Существует несколько единиц измерения для определения разме-
ра шрифта, но мы будем использовать rem. Rem — это вычисляе-
мое значение font-size, которое задается для всего родительского
элемента. Это означает, что все размеры шрифта указываются от-
носительно друг друга, что уменьшает проблемы, возникающие при
просмотре веб-страницы на разных экранах из-за старых единиц из-
мерения размера шрифта.
При использовании в свойстве font-size единицы rem ссыла-
ются на начальное значение свойства корневого элемента. Таким об-
разом, 1 rem равен размеру стандартного шрифта элемента в HTML,
то есть 16 пикселям по умолчанию в большинстве браузеров.
В листинге 15.6 мы задаем размер шрифта 4 rem, 2,5 rem и 1,3 rem
для заголовка уровня 1, заголовка уровня 2 и абзацев соответствен-
но, чтобы размер шрифта заголовка уменьшался со снижением его
уровня, но чтобы самый меньший был немного больше, чем размер
шрифта по умолчанию.
Изменение стилей веб-страницы с помощью CSS
237

Раздел main определяет формат основного содержимого вашей


страницы 2. Мы задали максимальную ширину содержимого 500 пик-
селей. Установленное значение ширины элемента предотвращает его
растяжение до границ его родительского элемента. В данном случае
предотвращается растяжение текста по горизонтали на всю ширину
окна веб-браузера. Затем мы задали отступы — с помощью значения
auto центрировали элемент по горизонтали.
Гиперссылки по умолчанию подчеркиваются. Чтобы удалить под-
черкивание, задайте свойству text-decoration значение none 3.

Применение стилей к кнопкам

Чтобы применить стиль к кнопке, скопируйте код из листинга 15.7


в ваш файл style.css.

Листинг 15.7. Применение стиля к кнопке:


button {
display: block;
margin: 0 auto;
padding: 10px 20px;
font-size: 1.7rem;
border-radius: 4px;
color: #fff;
background-color: #009933;
border: none;
}

Задав свойству display значение block, вы делаете кнопку эле-


ментом блока, например абзаца, и тогда кнопка не будет находиться
в той же строке, что и текстовый элемент, а располагаться с новой
строки. Для добавления отступов вокруг элемента воспользуемся
свойством padding. Мы задали отступ 10px для верхней и ниж-
ней границ кнопки и 20px для правой и левой. Обратите внимание,
что для установки цветов текста кнопки и ее фона мы использовали
шестнадцатеричный код. Остальные свойства кнопок дополнительных
пояснений не требуют. Поэкспериментируйте со значениями этих
свойств, чтобы задать кнопке стиль, который вам понравится. Найти
больше свойств и их значений вы можете в Интернете по запросу
«стили кнопок CSS».
Сохраните файл style.css и обновите браузер, чтобы увидеть
сделанные вами изменения. Теперь у вас получилась простая веб-
Ваш первый веб-сайт
238

страница, похожая на ту, что мы показали в самом начале этого


проекта.

Идеи для продолжения


Этот проект был просто кратким введением в создание веб-страниц
на HTML и CSS1. Существует бесконечное множество способов из-
менить и улучшить созданную вами веб-страницу. Например, вы мо-
жете:
• Добавить к главной странице еще несколько страниц и органи-
зовать навигацию между ними с помощью гиперссылок.
• Создать веб-страницу для одного из ваших проектов с Rasp-
berry Pi.
• Найти в Интернете больше свойств и значений CSS и карди-
нально изменить внешний вид вашей веб-страницы.

1
Больше информации о различных тегах и CSS-свойствах, а также об их примене-
нии можно получить в онлайн-справочнике htmlbook.ru. — Прим. ред.
Powered by TCPDF (www.tcpdf.org)
СТОИМОСТЬ: $
ПРИМЕРНОЕ ВРЕМЯ СБОРКИ: 2 часа

ПЕРЕЧЕНЬ КОМПОНЕНТОВ:
• Raspberry Pi
• Релейный модуль HL-52S
• Лампа на напряжение 12 В с патроном
• Адаптер для подачи питания на напряжение пост. тока 12 В
• Разъем питания типа штекер с клеммником
• Пластиковый корпус
• Соединительные провода

НЕОБХОДИМОЕ ПО:
• Фреймворк Flask
16
Подключение электроники
к Интернету
В этом проекте вы создадите собственный веб-
сервер для Интернета вещей, который сможете
применять для удаленного управления лампой
с помощью телефона. Этот веб-сервер пригодит-
ся вам и в других проектах для управления элек-
тронными устройствами.

В этом проекте вы создадите собственный веб-сервер для управления


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

Знакомство с веб-серверами
Веб-сервер — это компьютер, который обслуживает веб-страницы. Он
хранит файлы веб-сайта, включая все HTML-файлы и все, что с ними
связано, например изображения, таблицы стилей CSS, шрифты и ви-
део. Он также доставляет эти файлы в веб-браузер устройства поль-
зователя, когда пользователь делает запрос на URL-адрес сервера.
Когда вы получаете доступ к веб-странице в своем браузере, вы
фактически отправляете запрос через протокол передачи гипертекста
(Hypertexr Transfer Protocol — HTTP) на сервер. Это просто процесс
запроса и получения информации в Интернете. Сервер возвращает
запрошенную веб-страницу также через HTTP.
В этом проекте вы будете использовать свою Raspberry Pi для раз-
мещения веб-сервера в локальной сети (рис. 16.1).
Подключение электроники к Интернету
242

Рис. 16.1. Ваша Raspberry Pi, работающая в качестве веб-сервера

ПРИМЕЧАНИЕ
Доступ к веб-странице, размещенной на вашей Pi, могут получить
через браузер только устройства, подключенные к тому же роуте-
ру, что и ваша Pi.
Организовать доступ к вашему веб-серверу за пределами вашей
локальной сети сложнее. Вы можете сделать ваш веб-сервер
Raspberry Pi доступным с любого компьютера в любом месте, ис-
пользуя метод переадресации портов на роутере, но данный во-
прос выходит за рамки этой книги.

В качестве сервера ваша Raspberry Pi может обеспечить вывод


данных через порты GPIO. Другими словами, используя браузер
в вашей локальной сети, вы сможете получить доступ к веб-серверу
Pi для удаленного управления GPIO и включения чего-либо.
Веб-серверы могут обслуживать как статический, так и динамиче-
ский контент. Содержимое статического веб-сайта не изменится, пока
вы не отредактируете его HTML-файл. Веб-сайт, созданный вами
в проекте 15, — это пример статического веб-сайта. Контент динами-
ческого веб-сайта изменяется в зависимости от действий пользовате-
ля. В данном проекте вы создадите динамический веб-сайт, который
отслеживает и отображает текущее состояние 12-вольтовой лампы,
подключенной к релейному модулю, который мы сейчас рассмотрим
более подробно.
Знакомство с релейным модулем
243

Знакомство с релейным модулем


Реле представляет собой переключатель с электрическим приводом,
который можно включать, пропуская через него ток, и выключать, от-
ключая ток. Кроме того, реле можно управлять, подавая на него напря-
жения низкого уровня, например 3,3 В, что подходит для Raspberry Pi.
В этом проекте вы будете использовать двухканальный релейный мо-
дуль, который состоит из двух реле (два синих куба на рис. 16.2).

Рис. 16.2. Двухканальный релейный модуль

Шесть контактов на левой стороне релейного модуля соединены


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

Контакты релейного модуля

На стороне высокого напряжения расположены два разъема, каждый


из которых имеет три контакта: общий (COM), нормально замкнутый
(NC) и нормально разомкнутый (NO). Подключение к нормально
замкнутому контакту используется, когда контакты реле по умолча-
нию должны быть замкнуты. В этом случае ток протекает все вре-
мя, пока вы не передадите сигнал от Pi на релейный модуль, чтобы
разомкнуть цепь и остановить ток. При подключении к нормально
разомкнутому контакту все наоборот: контакты реле всегда разо-
мкнуты и ток не протекает до тех пор, пока вы не передаете сигнал
Подключение электроники к Интернету
244

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


на модуль через оптрон.
На стороне с низким напряжением расположены две штыревые
колодки. Одна имеет четыре контакта: VCC и GND для питания
модуля, контакт 1 (IN1) для управления нижним реле и контакт 2
(IN2) для управления верхним реле. На второй колодке три контакта:
GND, VCC и JD-VCC. Через контакт JD-VCC питаются электромаг-
ниты реле. Обратите внимание, что контакты VCC и JD-VCC соеди-
нены перемычкой (на рис. 16.2 она показана синим цветом, но у вас
она может быть любого цвета).
Перемычка позволяет вам выбрать, сделать или нет физическое
подключение цепи к схеме Pi. Когда контакты VCC и JD-VCC
соединены перемычкой, электромагнит реле напрямую питается
от контакта питания Pi. В этом случае релейный модуль и схема
Raspberry Pi физически не изолированы друг от друга. Именно это
подключение мы будем использовать в данном проекте. Однако
в случае аварийной ситуации, например скачка напряжения, ваша
Pi может сгореть.
Для полной изоляции Pi от модуля нужно снять перемычку и за-
питать электромагнит реле через контакт JD-VCC от независимого
источника питания.

ОПТРОН (ОПТОПАРА)
Мы не будем давать очень подробное описание оптрона. В двух
словах, оптрон — это компонент, который позволяет передавать
сигналы между двумя электрически изолированными цепями.
В результате цепь с высоким напряжением может управлять-
ся от цепи с низким напряжением без физического соединения
между ними. Оптрон «соединяет» эти цепи лучом светодиода. Под
действием света в фототранзисторе начинает протекать ток, кото-
рый включает или выключает реле.

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

В этом проекте вы будете использовать вариант с нормально разо-


мкнутым контактом. Вам нужно, чтобы лампа горела только тогда,
когда вы ее включили, в другое время цепь должна быть разомкнута.
Для этого вы задействуете контакты COM и NO.
Обзор проекта
245

При нормально разомкнутых контактах, если вы не активируете


реле, соединения между контактами COM и NO нет. Реле срабаты-
вает, когда входной сигнал опускается чуть ниже 2 В. Значит, если
вы подаете от Pi сигнал LOW, реле включается, а если сигнал HIGH,
реле выключается. Это называется инвертированной логикой. В данном
проекте вы будете управлять только одним реле, поэтому при сборке
схемы подключите только IN1 к одному из контактов GPIO вашей Pi.
Список компонентов для выполнения данного проекта включа-
ет адаптер питания на 12 В, который может обеспечить релейный
модуль током в 1 ампер для управления 12-вольтовой лампой. Мы
будем использовать «переходник» — разъем питания DC типа ште-
кер с клеммником, чтобы упростить соединение адаптера с релейным
модулем (рис. 16.3).

Рис. 16.3. Кабель питания и разъем питания DC типа штекер с клемм-


ником

ПРЕДУПРЕЖДЕНИЕ
Если вы опасаетесь работать с более высоким напряжением, на-
пример 12 В, но все же хотите выполнить данный проект, замени-
те релейный модуль на светодиод. При этом вам придется внести
некоторые изменения в скрипт Python, поскольку реле работает
с инвертированной логикой, а светодиод нет.

Обзор проекта
Прежде чем приступать к выполнению этого проекта, рассмотрим его
стуктурную схему (рис. 16.4), чтобы вам было проще понимать каж-
дый шаг.
Кроме того, для выполнения данного проекта вам понадобится зна-
ние основ языков HTML и CSS. Поэтому, если вы еще не выполняли
проект 15, мы рекомендуем вам вернуться и выполнить сначала его.
Подключение электроники к Интернету
246

Рис. 16.4. Структурная схема проекта

Вы построите свой веб-сервер с использованием Flask — веб-


фреймворка на языке Python. Для этого вам нужно создать файл app.
py. Когда вы получите доступ к IP-адресу порта 801 Raspberry Pi,
ваш веб-браузер запросит файлы веб-страниц, хранящиеся в памяти
Raspberry Pi, — уже знакомые вам index.html и style.css, а за-
тем отобразит веб-страницу. На вашей веб-странице будут располо-
жены две кнопки: «Включить» и «Выключить», каждая из которых
соответственно будет включать или выключать лампу.

Сборка схемы
Из соображений безопасности релейный модуль лучше поместить
в пластиковый корпус. Возможно, в этом корпусе вам потребуется
просверлить отверстия для проводов: одно отверстие для подключе-
ния Raspberry Pi, еще одно — для подключения лампы и третье —
для адаптера питания. На рисунке 16.5 показана внутренность кор-
пуса без крышки. Провода Raspberry Pi в данном случае пройдут
через отверстие в крышке.
Отключите питание Pi и выполните следующие шаги:
1. Подключите одну из клемм лампы к отрицательной (–) клемме
на клеммнике разъема питания.
2. Подключите положительную (+) клемму разъема к контакту
COM релейного модуля.

1
По умолчанию в протоколе HTTP, отвечающем за передачу html-страниц, исполь-
зуется порт 80. Самим его указывать не нужно. — Прим. ред.
Сборка схемы
247

Рис. 16.5. Схема с релейным модулем в пластиковом корпусе

3. Подключите другую клемму лампы к контакту NO релейного


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

ПРИМЕЧАНИЕ
Проверьте, соединены ли перемычкой контакты JD-VCC и VCC.

Релейный модуль Raspberry Pi


VCC 5V
IN2 Не подключать
IN1 GPIO 17
GND GND

По завершении сборки схемы и перепроверки всех подключений


подайте питание на Raspberry Pi, соедините переходник с адапте-
ром питания 12 В и подключите адаптер питания 12 В к сетевой
розетке.
Если вы захотите вместо лампы управлять светодиодом, исполь-
зуйте как образец схему проекта 1, подключив светодиод к GPIO 17.
Подключение электроники к Интернету
248

Рис. 16.6. Управление лампой на 12 В сигналом от Raspberry Pi че-


рез релейный модуль

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

Подготовка Pi к работе в качестве


веб-сервера
Raspberry Pi поддерживает несколько типов веб-серверов, но мы со-
бираемся использовать Flask, веб-фреймворк Python, превращающий
Pi в динамический веб-сервер.

Установка Flask

Прежде чем установить Flask, вам нужно установить pip — инстру-


мент для импорта библиотек из Python Package Index. Откройте тер-
Подготовка Pi к работе в качестве веб-сервера
249

минал и введите следующие команды, чтобы обновить Pi и устано-


вить pip:

pi@raspberrypi:~ $ sudo apt update && sudo apt upgrade


pi@raspberrypi:~ $ sudo apt install python3-pip

Затем примените pip для установки Flask и его компонентов, вве-


дя следующую команду:

pi@raspberrypi:~ $ sudo pip3 install flask

Если Flask установлен правильно, терминал отобразит сообщение


об успешно завершенной установке.

Организация файлов проекта

В данном проекте чрезвычайно важен порядок хранения ваших фай-


лов, потому что для правильной работы Flask требуется, чтобы ваши
файлы были структурированы определенным образом. Создайте для
этого проекта папку Project_16 в папке Web_Applications. За-
тем создайте папки и файлы, которые вам понадобятся для выполне-
ния проекта, следуя структуре, показанной на рис. 16.7.
С помощью текстового редактора создайте файлы index.html
и style.css, а также файл app.py с помощью Python 3 (IDLE).
Папка static будет хранить статические файлы, такие как файл

Рис. 16.7. Структура файлов и папок Проекта 16


Подключение электроники к Интернету
250

CSS. В папке templates (шаблоны) будут храниться файлы, кото-


рые можно изменить; например, файл index.html — это шаблон,
который динамически изменяет метку состояния реле в соответствии
с данными, введенными пользователем.

Программирование
Для выполнения данного проекта вам необходимо:
• написать скрипт на языке Python, в котором вы создадите веб-
сервер Pi;
• создать файл HTML для описания вашей веб-страницы;
• создать файл CSS для стилизации вашей веб-страницы.

Создание веб-сервера

Чтобы создать веб-сервер, откройте файл app.py, который сейчас


пуст, и введите в него код из листинга 16.1. Этот код создает веб-
сервер на порте 80 Raspberry Pi и веб-страницу, доступ к которой
вы можете получить из любого веб-браузера в локальной сети. Как
всегда, вы можете скачать весь код с сайта: http://pilotlz.ru/books/
files/10857 /

Листинг 16.1. Создание веб-сервера с помощью фреймворка Flask:


#подключаем необходимые библиотеки
1 from gpiozero import LED
from flask import Flask, render_template, request
#создаем объект Flask
2 app = Flask (__name__)
#создаем объект, который связан с релейным модулем
3 relay = LED(17)
#выключаем реле, при этом помним, что реле работает
по инвертированной логике
relay.on()
#фиксируем текущее состояние реле
relay_state = 'Реле выключено'
#отображаем главную веб-страницу
4 @app.route(' / ' )
def main():
global relay_state
Программирование
251

#записываем состояние реле в файл index.html


и отображаем его пользователю
5 return render_template('index.html', relay_
state=relay_state)
#когда нажата кнопка включения / выключения, вызываем
функцию control()
6 @app.route(' / <action>' )
def control(action):
global relay_state
#если значение 'action' из URL — on, включаем реле
7 if action == 'on':
#включаем реле (помним про инвертированную логику)
relay.off()
#сохраняем состояние реле
relay_state = 'Реле включено'
if action == 'off':
relay.on()
relay_state = 'Реле выключено'
#записываем состояние реле в файл index.html
и отображаем его пользователю
return render_template('index.html', relay_
state=relay_state)
#запускаем веб-сервер
if __name__ == '__main__':
8 app.run(host='0.0.0.0', port=80, debug=True)

Сначала вы подключаете необходимые библиотеки 1, затем созда-


ете объект Flask с именем app 2. Следующим шагом создаете объект
relay, связанный с GPIO 17 3, и задаете реле состояние по умол-
чанию off. Реле работает по инвертированной логике, поэтому, чтобы
отключить его, вы используете relay.on().
Декоратор @app.route(' / ' ) 4 вызывает функцию main(),
когда кто-то обращается к root URL — основному IP-адресу Pi-
сервера. Декоратор — это функция, которая выполняет внутри себя
другую функцию. В Python он начинается с символа @ и прописыва-
ется в коде выше определения функции.
Далее вы загружаете файл index.html в веб-браузер и отобража-
ете текущее состояние реле, используя значение переменной relay_
state в файле HTML 5. Следом вы добавляете динамический путь
с переменной action 6. Когда кто-то обращается к этому пути, вы-
полняется функция control(). Если значение «action» из URL —
on, программа включает реле и сохраняет его текущее состояние 7.
Это означает, что при обращении к вашей Raspberry Pi по ее IP-
Подключение электроники к Интернету
252

адресу, за которым следует /on (например, http://192.168.1.112 / on),


реле включается.
Если значение «action» из URL — off, программа выключает реле
и сохраняет его текущее состояние. Для выявления любых ошибок
сервер прослушивает порт 80, который передает контрольное значе-
ние True 8.

Создание HTML-файла

Листинг 16.2 — это простой HTML-файл, в котором описана струк-


тура веб-страницы. Вы можете взять эту структуру за основу, но,
опираясь на то, что вы узнали в проекте 15, настроить страницу
по своему вкусу — добавить абзацы, заголовки и так далее. Скопи-
руйте код из листинга в файл index.html, который должен нахо-
диться в папке templates, как было показано ранее на рис. 16.7.

Листинг 16.2. Создание HTML-файла для вашей веб-страницы:


<!DOCTYPE html>
<html>
<head>
<title>RPi Web Server< / title>
<link rel="stylesheet" type="text / css" href="{{url_for
('static', filename='style.css')}}">
1 <meta name="viewport" content="width=device-width,
initial-scale=1">< / head>
<body>
<h2>Веб-сервер Raspberry Pi< / h2>
2 <p>{{relay_state}}< / p>
3 <a href=" / on"><button>Включить< / button>< / a>
4 <a href="/off"><button class="off">Выключить</button></a>
< / body>
< / html>

Этот HTML-файл имеет достаточно простую структуру, и мы


не будем останавливаться на подробном описании данного HTML-
кода, потому что после выполнения проекта 15 он не должен вызвать
у вас трудностей. Если вы что-то забыли, то всегда можете вернуться
к этому проекту.
Тег <meta> с заданными атрибутами делают так, чтобы ваша веб-
страница открывалась в любом браузере для мобильных устройств 1.
С помощью этого тега браузер адаптирует ширину страницы к ши-
Программирование
253

рине экрана смартфона. В строке 2 между двойными фигурными


скобками {{}} прописана переменная relay_state, которую вы
используете в app.py, чтобы сохранить текущее состояние реле.
В этом абзаце просматриваемой веб-страницы отобразится состояние
реле, сохраненное на данный момент в переменной relay_state.
Когда вы нажимаете кнопку «Включить», вы передаете / on в каче-
стве значения «action» в URL 3, которое включает реле, как описано
в app.py. Когда вы нажимаете кнопку «Выключить», вы передаете
/ off в качестве значения «action» в URL, которые выключает реле.

Создание файла CSS

Код в листинге 16.3 применяет стили к содержимому вашей веб-


страницы. Это всего лишь пример того, как вы можете стилизовать
свою страницу; изменять значения свойств вы можете по своему
усмотрению. Ваш файл style.css должен находиться в папке
static (см. рис. 16.7).

Листинг 16.3. Применение стилей к содержимому веб-страницы


с помощью CSS:
1 h2 {
font-size: 2.5rem;
}
p {
font-size: 1.8rem;
}
2 body {
display: inline-block;
margin: 0px auto;
text-align: center;
}
3 button {
display: inline-block;
margin: 0 auto;
padding: 15px 25px;
font-size: 3rem;
border-radius: 4px;
color: #fff;
background-color: #009933;
border: none;
}
Подключение электроники к Интернету
254

.off{
color: #fff;
background-color: #604f43;
}
a {
text-decoration: none;
}

Итак, мы установили размер шрифта для заголовка 2 и абзаца 1.


Затем выровняли все тело страницы 2. Наконец, мы отредактирова-
ли внешний вид кнопок «Включить» и «Выключить» 3.

Запуск веб-сервера

После создания скрипта Python, файла HTML и файла CSS пришло


время запустить ваш веб-сервер. Откройте окно терминала и перей-
дите в папку Project_16, введя команду:

pi@raspberrypi:~ $ cd ~ / Desktop / Projects / Web_


Applications / Project_16

Затем запустите файл app.py следующей командой:

pi@raspberrypi:~Desktop / Projects / Web_


Applications / Project_16 $ sudo python3 app.py

Ваш веб-сервер запущен. Откройте любой браузер в локальной


сети и введите IP-адрес своей Raspberry Pi.
Чтобы узнать IP-адрес Pi, снова откройте терминал и введите ко-
манду:

pi@raspberrypi:~ $ hostname –I

На экран будет выведен IP-адрес вашей Pi.


Когда ваша схема готова и ваш сервер работает, откройте брау-
зер и перейдите по IP-адресу Raspberry Pi. В вашем браузере ото-
бразится страница веб-сервера. Теперь, нажимая кнопки, вы можете
дистанционно управлять лампой! На рисунке 16.8 показано, как ото-
бразится веб-страница в браузере смартфона.
Идеи для продолжения
255

Рис. 16.8. Страница веб-сервера Raspberry Pi в браузере смартфона

Чтобы остановить работу веб-сервера, просто нажмите Ctrl+C.

Идеи для продолжения


В этом проекте вы узнали, как работать с релейным модулем и как
настроить веб-сервер для обслуживания веб-страницы. Кроме того,
вы применили свои навыки использования языков HTML и CSS. Вот
несколько идей для будущего развития этого проекта:
• Измените проект таким образом, чтобы была возможность
управлять несколькими портами Pi.
• Измените файлы CSS и HTML, чтобы веб-страница выглядела
так, как захотите вы.
• Попробуйте управлять таким же образом другими электронны-
ми приборами.
• Усовершенствуйте предыдущие проекты, заменив в них светоди-
оды на лампы, управляемые с помощью реле.
СТОИМОСТЬ: $
ПРИМЕРНОЕ ВРЕМЯ СБОРКИ: 1,5 часа

ПЕРЕЧЕНЬ КОМПОНЕНТОВ:
• Raspberry Pi
• Макетная плата
• Датчик температуры и влажности DHT22
• Резистор 4,7 кОм
• Два светодиода диаметром 5 мм
• Два резистора по 330 Ом
• Соединительные провода разных типов

НЕОБХОДИМОЕ ПО:
• Node-RED узел для датчика DHT
• Панель управления Node-RED
17
Создание центра
управления Интернетом
вещей с помощью
Node-RED
В этом проекте вы создадите приложение для Ин-
тернета вещей, чтобы управлять вашей любимой
домашней электроникой через веб-сервер с по-
мощью Node-RED — мощного и простого в ис-
пользовании инструмента.

Node-RED-приложение может управлять выходами устройств и счи-


тывать входные данные через локальную сеть. В этом проекте с по-
мощью приложения вы будете управлять светодиодами, а также
считывать и отображать показания температуры и влажности, полу-
ченные от датчика DHT221. И все это вы будете делать удаленно
через веб-сервер.

Знакомство с Node-RED
Node-RED — это инструмент визуального проектирования с откры-
тым исходным кодом для создания приложений для Интернета ве-
щей. Он уже установлен в операционной системе вашей Pi и пре-
красно взаимодействует с ней.

1
Подойдет и датчик DHT11. Он немного отличается диапазоном работы, но для
данного проекта его будет вполне достаточно. — Прим. перев.
Создание центра управления Интернетом вещей с помощью Node-RED
258

В Node-RED применяется визуальное программирование, кото-


рое представляет собой перетаскивание нужных блоков в рабочую
область. Эти блоки называются узлами. Для решения поставленной
задачи вы просто соединяете их вместе, как фрагменты пазла, что
значительно упрощает процесс программирования. Node-RED позво-
ляет просто и быстро прототипировать сложные системы домашней
автоматизации, оставляя больше времени на разработку и создание
вещей, которые вам действительно интересны.
В данном проекте мы не будем разбирать все возможности Node-
RED, но если вы заинтересуетесь ими, вот краткий перечень функ-
ций, которые можно реализовать:
• Доступ к портам GPIO Raspberry Pi.
• Установка соединения с другими платами, например Arduino
и ESP8266.
• Создание удобного графического пользовательского интерфейса.
• Связь со сторонними сервисами.
• Получение данных из Интернета.
• Создание событий, привязанных к времени.
• Хранение и извлечение данных из базы данных.

Установка узлов DHT22

Хотя программное обеспечение Node-RED уже установлено в опера-


ционной системе Pi, в нем нет узла, способного считывать данные
с датчика DHT22. Поэтому первым делом вам необходимо инсталли-
ровать его посредством установки npm (Node Package Management):

pi@raspberrypi:~ $ sudo apt install npm

В ответ на отобразившийся вопрос введите Y и нажмите клави-


шу ENTER. Установка может занять несколько минут. Затем введите
команду для обновления npm до последней версии (3.x), которая ре-
комендована к использованию с Node-RED:

pi@raspberrypi:~ $ sudo npm install -g npm@3.x


pi@raspberrypi:~ $ hash –r
Знакомство с Node-RED
259

После ввода этих команд появится предупреждающее сообщение.


Это предупреждение не помешает дальнейшему выполнению проекта,
поэтому вы можете его пропустить и перейти к следующему шагу.
Теперь скачайте и распакуйте библиотеку C для Raspberry Pi. Эта
библиотека нужна для управления датчиком DHT22 через Node-RED.
На момент написания этой книги последней была версия библиотеки
1.55. Перед установкой библиотеки перейдите на сайт http://www.
airspayce.com / mikem / bcm2835 / и уточните номер текущей версии.
В терминале наберите следующие команды (заменив выделенную
курсивом версию 1.55 на последнюю версию):

pi@raspberrypi:~ $ wget http://www.airspayce.com /


mikem / bcm2835 / bcm2835–1.55.tar.gz
pi@raspberrypi:~ $ tar zxvf bcm2835–1.55.tar.gz

В завершение введите приведенную ниже последовательность ко-


манд для компиляции и установки узлов, необходимых для управле-
ния датчиком DHT22 и добавления поддержки панели управления:

pi@raspberrypi:~ $ cd bcm2835–1.55
pi@raspberrypi:~ / bcm2835–1.55 $ . / configure
pi@raspberrypi:~ / bcm2835–1.55 $ make
pi@raspberrypi:~ / bcm2835–1.55 $ sudo make check
pi@raspberrypi:~ / bcm2835–1.55 $ sudo make install
pi@raspberrypi:~ / bcm2835–1.55 $ cd
pi@raspberrypi:~ $ sudo npm install --unsafe-perm -g node-
dht-sensor
pi@raspberrypi:~ $ sudo npm install --unsafe-perm -g node-
red-contrib-dht-sensor
pi@raspberrypi:~ $ sudo npm install --unsafe-perm -g node-
red-dashboard

Когда все это будет установлено, перезагрузите свою Pi. Теперь


давайте кратко познакомимся с Node-RED.

Начало работы с Node-RED

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

pi@raspberrypi:~ $ sudo node-red start

В окне вашего терминала должна отобразиться информация, как


на рис. 17.1. Выделенная на рисунке строка содержит IP-адрес ва-
Создание центра управления Интернетом вещей с помощью Node-RED
260

шей Raspberry Pi в качестве Localhost’а, а затем номер порта, на кото-


ром запущен сервер Node-RED. Localhost — это имя хоста, которое
означает «данный компьютер». Оно преобразуется в IP-адрес, указанный
в окне терминала: http://127.0.0.1 Используя этот IP-адрес, вы можете
получить доступ к Node-RED только в браузере Raspberry Pi. Чтобы
получить доступ к Node-RED в любом браузере на любом устройстве
в вашей локальной сети, вам нужно узнать IP-адрес вашей Pi.

ПРИМЕЧАНИЕ
Обычно вы можете запускать Node-RED и не через терминал. Для
этого перейдите в главное меню панели задач и выберите пункт
Programming→Node-RED.
Однако в этом проекте вам нужно запустить Node-RED именно
через терминал, поскольку для использования узлов DHT22 тре-
буются права администратора.

Рис. 17.1. Запуск Node-RED через терминал

Чтобы узнать IP-адрес вашей Raspberry Pi, введите в терминале


команду:

pi@raspberrypi:~ $ hostname –I

Откройте браузер Chromium и введите в адресную строку


http://<IP-адрес вашей Pi>:1880 / , заменив <IP-адрес ва-
Знакомство с Node-RED
261

шей Pi> на отобразившийся в терминале. Должна открыться страни-


ца сервера Node-RED (рис. 17.2).

Рис. 17.2. Редактор Node-RED, открытый в вашем браузере

В левой части страницы находится список блоков (узлов). Узлы


группируются по категориям в соответствии с их функциями. Про-
крутите список вниз, чтобы узнать, какие у вас есть. В этом про-
екте мы рассмотрим лишь небольшую часть существующих узлов
из категорий input (ввод), function (функция), Raspberry_Pi
и dashboard (панель инструментов) (рис. 17.3).
Рабочая область в центре страницы Node-RED называется Flow 1
(поток 1). Поток (flow) — это секция, в которую вы перетаскиваете
узлы и соединяете их между собой, чтобы создать свое приложение.
Справа от нее расположены несколько вкладок: на вкладке info ото-
бражается информация о выбранном узле, вкладка debug использу-
ется при отладке, а на вкладке dashboard вы размещаете виджеты
пользовательского интерфейса вашего приложения. Наконец, кнопка
Deploy сохраняет и применяет изменения, внесенные в проект.
Теперь вам предстоит сборка схемы, после чего вы продолжите
работу с Node-RED.
Создание центра управления Интернетом вещей с помощью Node-RED
262

Рис. 17.3. Часть узлов Node-RED

Сборка схемы
Вам уже хорошо знакомы светодиоды и датчик DHT22, но если вы
забыли, как работать с датчиком, вернитесь к проекту 12. Для того
чтобы собрать схему, выполните следующие шаги:
1. Соедините контакт питания 5 V и GND вашей Pi с красной
и синей шинами на макетной плате соответственно.
2. Установите на макетной плате два светодиода. Соедините катод
(более короткую ножку) каждого светодиода с шиной GND через ре-
Создание потока Node-RED
263

зистор 330 Ом. Соедините анод (более длинную ножку) одного све-
тодиода с GPIO 18, а другого — с GPIO 17.
3. Установите на макетной плате датчик DHT22 (лицевой сторо-
ной к себе) и выполните подключения в соответствии с приведенной
ниже таблицей. Собранная схема должна соответствовать рис. 17.4.

DHT 22 Raspberry Pi
1 3.3 V
2 GPIO 4 и 3.3 V
(через резистор 4,7 кОм)

3 Не подключать

4 GND

Рис. 17.4. Подключение DHT22 и двух светодиодов к Pi

Создание потока Node-RED


В данном проекте в качестве скрипта вы создадите поток в Node-
RED. Этот поток позволит вам сделать следующее:
Создание центра управления Интернетом вещей с помощью Node-RED
264

• Управлять светодиодом с помощью переключателя. Светодиод


также будет автоматически загораться и гаснуть в определенное
время, которое вы сами установите.
• Управлять вторым светодиодом с помощью ШИМ и слайдера
в качестве регулятора яркости.
• Считывать с датчика DHT22 показания температуры и отобра-
жать их на графике время — температура.
• Считывать с датчика DHT22 значения влажности и отображать
их на индикаторе влажности.
В первую очередь вы создадите пользовательский интерфейс для
управления вышеперечисленными компонентами через ваш сервер.

Создание панели инструментов


пользовательского интерфейса

Узлы из категории dashboard содержат виджеты, которые отобра-


жаются в пользовательском интерфейсе приложения для управления
электронными компонентами. Каждый виджет, который вы добав-
ляете в поток, например кнопка, слайдер или график, должен быть
связан с группой, которая сообщает виджету, где он должен отобра-
жаться в пользовательском интерфейсе.
Вам также понадобятся вкладки, которые будут переключать
страницы вашего приложения (вы работаете с вкладками, например,
в браузере). Группы — это разделы на вкладке, с помощью которых
вы можете группировать виджеты. Вкладки и группы на панели
управления понадобятся вам в любом проекте, чтобы организовать
виджеты в пользовательском интерфейсе. В данном проекте вы соз-
дадите вкладку с именем «Главная» (Home) и на ней одну группу
с именем «Панель управления» (dashboard).
Используя рис. 17.5 в качестве образца, перейдите на вкладку
dashboard 1 в правом верхнем углу, а затем выполните следующие
действия:
1. Создайте новую вкладку в списке вкладок Tabs. Для этого на-
жмите кнопку «+ tab» 2.
2. Переименуйте созданную вкладку. Чтобы изменить имя вклад-
ки, нажмите кнопку edit 3. Введите имя Главная.
3. Создайте новую группу. Для этого нажмите кнопку «+ group» 4.
4. Задайте созданной группе новое имя — Панель управле-
ния. По аналогии с вкладкой переименовать группу можно нажатием
кнопки edit 5.
Создание потока Node-RED
265

Рис. 17.5. Создание вкладок и групп на панели управления

Чтобы посмотреть, как теперь выглядит ваша панель управле-


ния, откройте в своем браузере страницу http://<IP-адрес вашей
Pi>:1880 / ui, заменив <IP-адрес вашей Pi> на IP-адрес вашей
Raspberry Pi, как вы уже делали раньше. Как видите, на данный мо-
мент ваш пользовательский интерфейс пуст (рис. 17.6), потому что
вы еще не добавили в него никаких виджетов. Давайте сделаем это
и реализуем некоторые функции.

Рис. 17.6. Пользовательский интерфейс Node-RED

Подключение узлов

Пришло время добавить узлы в ваш поток. Поток будет управлять


светодиодами, подключенными к GPIO Raspberry Pi, и считывать по-
казания температуры и влажности с датчика DHT22.
Создание центра управления Интернетом вещей с помощью Node-RED
266

Добавление переключателя и запланированных событий. Вер-


нитесь в редактор Node-RED и перетащите в поток два узла ввода
inject из категории input. Обратите внимание, что при добавле-
нии узлов в поток их имена изменятся на timestamp (метка време-
ни). Перетащите в поток узел переключателя switch из категории
dashboard и узел вывода rpi gpio (тот, у которого соединение рас-
положено слева) из категории Raspberry_Pi. Расположите и соеди-
ните узлы, как показано на рис. 17.7.

Рис. 17.7. Поток для управления первым светодиодом

Этот набор узлов будет управлять первым светодиодом, подклю-


ченным к GPIO 17. Светодиод можно будет дистанционно вклю-
чать и выключать с помощью переключателя. Кроме того, он будет
автоматически включаться и выключаться в определенное время:
узел timestamp 1 будет определять время включения светодиода,
а timestamp 2 — время выключения.
Если дважды щелкнуть по узлу, откроется новое окно, в котором
можно редактировать свойства этого узла. Щелкните дважды по пер-
вому узлу timestamp и отредактируйте его свойства следующим
образом (рис. 17.8):
1. В поле Рayload установите числовое значение 1. Когда этот
узел будет инициирован, на порт GPIO 17 Raspberry Pi будет по-
слано значение 1 и светодиод включится.
2. Для поля Repeat выберите из выпадающего списка значение at
a specific time (в заданное время), а затем выберите время и день,
когда вы хотите, чтобы ваш индикатор включился. Мы задали время
включения 19:00 во все дни недели, но вы можете легко изменить
эти настройки. Время отключения светодиода вы зададите позднее
в timestamp 2.
3. В поле Name измените имя узла. Для нашего случая мы задали
On at 7PM (включить в 7 вечера), но вы можете задать другое имя
в соответствии с выбранными настройками.
Создание потока Node-RED
267

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


Done. На рисунке 17.8 показаны свойства, которые вы установили
для этого узла.

Рис. 17.8. Редактирование свойств узла ввода

Измените свойства других узлов в соответствии с приведенной


ниже таблицей:

Узел Свойства
timestamp 1 Payload: числовое значение 1
Repeat: at a specific time
At: 19:00
On: выберите все дни
timestamp 2 Payload: числовое значение 0
Repeat: at a specific time
At: 23:00
On: выберите все дни
switch Group: Панель управления [Главная]
Label: Светодиод 1
On Payload: 1
Off Payload: 0
Name: LED 1 — Switch
pin GPIO: GPIO17–11
Type: Digital output
Name: LED 1 — GPIO 17
Создание центра управления Интернетом вещей с помощью Node-RED
268

Чтобы запустить приложение Node-RED, нажмите кнопку Deploy


(применить) в правом верхнем углу. Все внесенные изменения при
этом будут сохранены автоматически. Чтобы посмотреть, как вы-
глядит ваше приложение теперь, откройте или обновите в браузере
страницу http://<IP-адрес вашей Pi>:1880 / ui. На данном этапе при-
ложение должно выглядеть, как на рис. 17.9.

Рис. 17.9. Пользовательский интерфейс с переключателем для управ-


ления первым светодиодом

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


управляет первым светодиодом. Если светодиод не включился, вер-
нитесь к началу этого раздела и убедитесь, что вы правильно под-
ключили узлы и задали им нужные свойства.
Добавление слайдера. Теперь вам нужно добавить узлы для управ-
ления яркостью второго светодиода, который подключен к GPIO 18.
Перетащите узлы slider и rpi gpio в поток и расположите их,
как показано на рис. 17.10.

Рис. 17.10. Поток для управления двумя светодиодами


Создание потока Node-RED
269

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


ной ниже таблицей:

Узел Свойства
slider Group: Панель управления [Главная]
Label: Светодиод 2
Range: min:0; max:100; step:1
Name: LED 2 — Slider
pin GPIO: 12 — GPIO18
Type: PWM output
Name: LED 2 — GPIO 18

Этот набор узлов управляет светодиодом 2, подключенным


к GPIO 18, с помощью слайдера и ШИМ. Перемещение слайдера
изменяет яркость светодиода. Нажмите кнопку Deploy, откройте или
обновите в браузере страницу http://<IP-адрес вашей Pi>:1880 / ui
и протестируйте приложение. На данный момент оно должно выгля-
деть, как показано на рис. 17.11.

Рис. 17.11. Пользовательский интерфейс с переключателем для


управления светодиодом 1 и слайдером для управления светодио-
дом 2

Добавление графика температуры и индикатора влажности. На-


конец, чтобы построить график температуры и индикатор влажности,
перетащите в поток узлы inject, rpi dht22, function, chart
и gauge. Последние два узла из этого списка (chart и gauge)
вы найдете в категории dashboard. Расположите узлы, как показано
на рис. 17.12.

Powered by TCPDF (www.tcpdf.org)


Создание центра управления Интернетом вещей с помощью Node-RED
270

Рис. 17.12. Финальный вид потока Node-RED

Задайте новым узлам свойства в соответствии с приведенной ниже


таблицей:

Узел Свойства
timestamp Payload: логическое значение true
Repeat: interval
Every: 1 minute
Name: Read DHT22
rpi-dht22 Sensor model: DHT22
Pin numbering: BCM GPIO
Pin number: 4
Name: DHT22 — GPIO 4
chart Group: Панель управления [Главная]
Label: Температура
Type: Line Chart
X-axis: 1 hour
X-axis Label: HH: mm
Name: Temperature — Chart
f Name: Get humidity
Function:
msg.payload = msg.humidity;
return msg;
gauge Group: Панель управления [Главная]
Type: Gauge
Label: Влажность
Value format: { {value}}
Units: %
Range: min:0; max:100
Name: Humidity — Gauge
Запуск приложения
271

Нажмите кнопку Deploy и снова протестируйте приложение. Если


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

Запуск приложения
Поздравляем! Вы создали свое первое приложение для Интерне-
та вещей с помощью Node-RED. Откройте в браузере страницу
http://<IP-адрес вашей Pi>:1880 / ui, чтобы посмотреть, как выгля-
дит ваш пользовательский интерфейс. Вы можете получить доступ
к этой странице с помощью любого браузера в локальной сети на ва-
шем компьютере или смартфоне. На рисунке 17.13 показан финаль-
ный вариант схемы данного проекта, которой вы можете управлять,
используя приложение Node-RED.

Рис. 17.13. Общий вид сборки проекта для Интернета вещей


с Node-RED
Создание центра управления Интернетом вещей с помощью Node-RED
272

В вашем приложении есть: переключатель для управления первым


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

Идеи для продолжения


Сейчас вы познакомились лишь с некоторыми возможностями Node-
RED. Вот несколько идей для дальнейшего развития этого проекта:
• Замените светодиод на лампу и реле (с ними вы уже работали
в проекте 16).
• Добавьте в ваше приложение еще какие-нибудь датчики, напри-
мер датчик дыма и датчик движения.
Игры
и игрушки
СТОИМОСТЬ: $
ПРИМЕРНОЕ ВРЕМЯ СБОРКИ: 1 час

ПЕРЕЧЕНЬ КОМПОНЕНТОВ:
• Raspberry Pi
• Макетная плата
• Кнопки, 8 шт.
• Наушники или монитор с динамиками, подключаемый к Pi через HDMI
• Соединительные провода

НЕОБХОДИМОЕ ПО:
• avconv
18
Цифровая барабанная
установка
В этом проекте вы создадите цифровую барабан-
ную установку с кнопочным управлением. Для это-
го понадобится лишь макетная плата и несколько
кнопок. При нажатии кнопок будут воспроизво-
диться различные звуки барабана, в том числе
две барабанные дроби.

В проекте будут использоваться семплы (образцы звуков) из библи-


отеки семплов Sonic Pi, но вы можете взять любые найденные вами
звуковые файлы.

Подготовка аудиофайлов
Сначала нужно правильно настроить звук Raspberry Pi и активиро-
вать возможность использования семплов из Sonic Pi.

Настройка аудио
Итак, подключите наушники или динамики к аудиоразъему Rasp-
berry Pi. Если ваш монитор имеет встроенные динамики и подклю-
чен к Pi кабелем HDMI, то ничего не нужно подключать к аудио-
разъему — звук можно прослушивать через динамики монитора.
В правом верхнем углу рабочего стола щелкните правой кнопкой
мыши по значку динамика и выберите источник звука (рис. 18.1).
Цифровая барабанная установка
276

Рис. 18.1. Выбор источника звука

Выберите Analog, если пользуетесь наушниками, или HDMI — при


мониторе с динамиками.

Получение нужных семплов аудиофайлов

Программное обеспечение Sonic Pi изначально устанавливается в опе-


рационной системе Pi и позволяет вам создавать свою собственную
цифровую музыку с помощью кода. Но в этом проекте у вас будут
готовые семплы Sonic Pi.

ПРИМЕЧАНИЕ
Мы не будем подробно рассматривать Sonic Pi в этой книге,
но если вы хотите изучить его самостоятельно, выберите в глав-
ном меню панели задач пункт Programming→Sonic Pi, чтобы от-
крыть программное обеспечение и ознакомиться с ним.

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


ка. Откройте терминал и введите следующие команды для создания
новой папки с именем Games_and_Toys внутри папки Projects
и перехода в нее:

pi@raspberrypi:~ $ cd ~ / Desktop / Projects


pi@raspberrypi:~ / Desktop / Projects $ mkdir Games_and_Toys
pi@raspberrypi:~ / Desktop / Projects $ cd Games_and_Toys

Затем введите еще одну команду, чтобы скопировать папку


samples Sonic Pi в папку Games_and_Toys (обратите внимание
на пробел между последним знаком / и точкой в конце):
Подготовка аудиофайлов
277

pi@raspberrypi:~ / Desktop / Projects / Games_and_Toys $ cp


-r / opt / sonic-pi / etc / samples / .

Следующим шагом введите команды для перехода в папку


samples вашего проекта и отображения списка ее содержимого
(чтобы проверить, все ли правильно скопировалось):

pi@raspberrypi:~ / Desktop / Projects / Games_and_Toys $ cd


samples
pi@raspberrypi:~ / Desktop / Projects / Games_and_Toys / samples $
ls

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


такой список файлов:

ambi_choir.flac drum_cowbell.flac elec_ping.flac


ambi_dark_woosh.flac drum_cymbal_closed.flac elec_plip.flac

Вы, наверное, обратили внимание, что файлы в списке имеют не-


обычное расширение .flac. Такой формат применяется в Sonic Pi,
но чтобы использовать эти файлы с Python, придется конвертировать
их в формат .wav с помощью программы avconv. Для установки
avconv введите команду

pi@raspberrypi:~ / Desktop / Projects / Games_and_Toys / samples $


sudo apt install libav-tools

Теперь введите команду, которая будет выбирать по порядку и кон-


вертировать все файлы в папке samples .flac-файл в файл .wav:

pi@raspberrypi:~ / Desktop / Projects / Games_and_Toys / samples $


for f in *.flac; do avconv -i "$f" "${f%.flac}.wav"; done

После этого с помощью команды ls выведите на экран содержи-


мое папки samples и убедитесь, что в ней теперь есть файлы с рас-
ширением .wav:

pi@raspberrypi:~ / Desktop / Projects / Games_and_Toys / samples $


ls
Цифровая барабанная установка
278

Итак, теперь в папке для каждого семпла должны быть как .wav-,
так и .flac-файлы. Чтобы удалить файлы .flac из папки samples,
введите следующую команду:

pi@raspberrypi:~ / Desktop / Projects / Games_and_Toys / samples $


rm *.flac

Убедиться в правильности выполнения этой операции вам помо-


жет команда ls.
Воспроизводить созданные файлы вы можете с помощью про-
граммы omxplayer, которая установлена в операционной системе
по умолчанию. Например, чтобы прослушать семпл с именем drum_
snare_soft.wav, введите команду

pi@raspberrypi:~ / Desktop / Projects / Games_and_Toys / samples $


omxplayer drum_snare_soft.wav

Если вы посмотрите на список файлов семплов, то увидите мно-


жество разнообразных звуков: от гитарных аккордов до коровьего
колокольчика и барабанов. Выберите из этого списка восемь различ-
ных звуков барабанов для вашей барабанной установки (или любые
другие звуки на свой вкус).
Вот звуки, которые выбрали мы:
• drum_cymbal_open.wav
• drum_heavy_kick.wav
• drum_snare_hard.wav
• drum_cymbal_closed.wav
• drum_roll.wav
• perc_snap.wav
• loop_amen_full.wav
• loop_mika.wav
Последние два файла из этого списка содержат вариации барабан-
ной дроби, а все остальные — одиночные удары барабанов.

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

Соберите схему, следуя приведенным ниже шагам и ориентируясь


на рис. 18.2 в качестве примера:
1. Соедините один из выводов GND на Raspberry Pi с синей ши-
ной GND на макетной плате.
2. Вставьте ножки восьми кнопок в отверстия макетной платы так,
чтобы они попарно находились по разные стороны от борозды. Кноп-
ки должны стоять на одинаковом расстоянии друг от друга.
3. Соедините нижние левые ножки кнопок с GND, а нижние пра-
вые — с портами GPIO 2, 3, 14, 15, 17, 18, 22 и 27 по порядку (см.
таблицу).

Кнопка Raspberry Pi
1 GPIO 2
2 GPIO 3
3 GPIO 14
4 GPIO 15
5 GPIO 17
6 GPIO 18
7 GPIO 22
8 GPIO 27

Рис. 18.2. Схема цифровой барабанной установки


Цифровая барабанная установка
280

Программирование
Чтобы создать новый скрипт, запустите Python 3 (IDLE) и выберите
пункт меню File→New File. Скопируйте приведенный ниже код в ре-
дактор Python, а затем сохраните скрипт с именем digital_drum_
set.py в папке Games_and_Toys (как всегда, все скрипты можно
скачать с сайта http://pilotlz.ru/books/files/10857/ ):

#подключаем необходимые библиотеки


1 import pygame.mixer
from pygame.mixer import Sound
from gpiozero import Button
from signal import pause
#создаем объект для модуля mixer, который загружает
и воспроизводит звуки
2 pygame.mixer.init()
#назначаем каждой кнопке определенный звук
3 button_sounds = {
Button(2): Sound("samples / drum_cymbal_open.wav"),
Button(3): Sound("samples / drum_heavy_kick.wav"),
Button(14): Sound("samples / drum_snare_hard.wav"),
Button(15): Sound("samples / drum_cymbal_closed.wav"),
Button(17): Sound("samples / drum_roll.wav"),
Button(18): Sound("samples / perc_snap.wav"),
Button(22): Sound("samples / loop_amen_full.wav"),
Button(27): Sound("samples / loop_mika.wav"),
}
#воспроизводим звук, когда нажата кнопка
4 for button, sound in button_sounds.items():
button.when_pressed = sound.play
#продолжаем выполнение программы для отслеживания
событий — нажатия кнопок
5 pause()

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


мых библиотек 1. Здесь есть новая для вас библиотека — pygame.
mixer, применяемая для загрузки и воспроизведения звуков.
Из pygame.mixer вы также импортируете модуль Sound, который
используется для создания звуковых объектов.
Затем вы инициализируете Pygame mixer 2 и создаете словарь,
содержащий звуки 3. Словарь в Python представляет собой струк-
туру данных, используемую для хранения элементов и взаимосвязей
между ними внутри нее. В данном случае вы ассоциируете кнопку
Идеи для продолжения
281

с определенным звуком. В общем виде словарь имеет следующую


структуру:

имя_словаря = {ключ_1: значение_1, ключ_2: значение_2}

Содержимое словаря заключается в фигурные скобки {} и состоит


из пар «ключ—значение». Чтобы назначить каждому ключу соответ-
ствующее ему значение, используется двоеточие (:), а для разделения
пар «ключ—значение» — запятая (,).
В нашем проекте ключами являются кнопки, а значениями —
звуки. Чтобы создать звуковой объект, вы задаете путь к звуковому
файлу в качестве параметра функции Sound(). Как и в предыду-
щих проектах, вам не нужно указывать весь путь, если вы сохранили
звуковые файлы в папке samples, которая находится внутри папки
Games_and_Toys. В этом случае вам достаточно указать имя пап-
ки, а за ним — имя звукового файла. Если вы решили использовать
другие звуковые файлы, то нужно изменить имена наших звуковых
файлов, выделенные в этом скрипте полужирным шрифтом.
После этого вы назначаете каждой кнопке определенный звуко-
вой эффект 4. В результате при нажатии любой кнопки будет вос-
производиться соответствующий именно ей звук. Наконец, функция
pause() 5 в конце скрипта поддерживает непрерывную работу
программы, чтобы события нажатия кнопок могли быть обнаружены
в любой момент.
Чтобы запустить скрипт, нажмите F5 или выберите пункт меню
Run→Run Module.
Поздравляем! Вы только что создали свою собственную цифровую
барабанную установку! Теперь нажимайте кнопки и создавайте свои
собственные музыкальные треки.

Идеи для продолжения


Это был классный проект, а главное, его было совсем несложно сде-
лать. Усовершенствуйте его, реализовав следующие идеи:
• Добавьте в свою цифровую барабанную установку другие звуки.
• Запишите собственные звуки или найдите в Интернете свободно
распространяемые звуки.
• Создайте цифровое пианино, цифровую гитару или даже соб-
ственный микшерный пульт.
СТОИМОСТЬ: $
ПРИМЕРНОЕ ВРЕМЯ СБОРКИ: 2 часа

ПЕРЕЧЕНЬ КОМПОНЕНТОВ:
• Raspberry Pi
• Две кнопки
• Макетная плата
• Соединительные провода
19
Игра Hungry Monkey
на языке Scratch
В этом проекте вы познакомитесь с блочным
языком программирования Scratch и с его помо-
щью создадите собственную игру, которой можно
управлять двумя кнопками и Raspberry Pi.

В этом проекте вы создадите собственную игру «Hungry Monkey»


(«Голодная обезьянка»). Цель игры: за 30 секунд обезьянка должна
поймать как можно больше падающих сверху спелых бананов, «уво-
рачиваясь» при этом от гнилых. Вы сможете перемещать обезьянку
влево и вправо с помощью двух кнопок, которые вы подключите
к своей Raspberry Pi.

Знакомство со Scratch 3.0


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

ПРИМЕЧАНИЕ
Чтобы узнать больше о Scratch, посетите его официальный сайт:
http://scratch.mit.edu /
Игра Hungry Monkey на языке Scratch
284

В этом проекте вы будете работать с версией среды программи-


рования Scratch 3.0. Если у вас в ОС Raspbian по умолчанию уста-
новлена версия Scratch 2.0, замените ее Scratch 3.0. Для обновления
введите в терминале:

pi@raspberrypi:~ $ sudo apt -get update


pi@raspberrypi:~ $ sudo apt -get install scratct3

Для запуска среды программирования вызовите главное меню ра-


бочего стола и выберите в нем пункт Programming→Scratch 3.0. По-
сле запуска откроется окно (рис. 19.1):

Рис. 19.1. Окно Scratch 3.0

Окно Scratch содержит четыре основные рабочие области. Сцена


(Stage) 1 — это область, в которой будет запускаться ваша игра или
анимация. В левом верхнем углу сцены расположены зеленый фла-
жок для запуска скрипта (например, игры) и красный восьмиуголь-
ник (значок stop) для остановки игры. При первом запуске среды
Сборка схемы
285

Scratch на сцене появляется созданный по умолчанию персонаж вашей


игры — кот1. Все персонажи игр или любые задействованные в вашем
проекте объекты называются спрайты. Все спрайты текущей игры ото-
бражаются в области управления спрайтами (Sprites) 2 внизу справа.
Середину окна занимает рабочая область 3, которая имеет
три вкладки: Код (Scripts), Костюмы (Costumes) и Звуки
(Sounds)2. Вкладка Код содержит программные блоки, из которых
вы будете строить вашу программу. Каждый блок — это отдельная
инструкция, которую можно перетащить в программу как часть паз-
ла. Блоки рассортированы по категориям в соответствии со своим
назначением. Каждая категория имеет свой цвет. Например, блоки
из категории Движение (Motion), которые указывают, как должны
перемещаться ваши спрайты, окрашены в синий цвет.
На вкладке Костюмы 4 показаны параметры настройки и созда-
ния новых костюмов для спрайтов, а вкладка Звуки 5 позволяет
«озвучивать» спрайты. Область скриптов 6 — это область экрана,
в которую вы перетаскиваете блоки из рабочей области и складыва-
ете их в единый скрипт.
Главное меню 7 в верхней части экрана содержит в своей ле-
вой части пункты Файл (File), Редактировать (Edit), Руко-
водства (Tutorials) и строку поиска. Значки в центре главного
меню позволяют дублировать, удалять, растягивать и сжимать спрай-
ты, а также вызвать справку Scratch.

Сборка схемы
Схема состоит из двух кнопок, макетной платы и платы Raspberry Pi.
Выполните приведенные ниже шаги, сверяясь с рис. 19.2:
1. Соедините один из выводов GND на Raspberry Pi с синей ши-
ной GND на макетной плате.
2. Установите две кнопки на макетной плате, как показано
на рис. 19.2.
3. Соедините правые нижние ножки кнопок с синей шиной GND.
4. Соедините левую нижнюю ножку одной кнопки с GPIO 2,
а другой кнопки — с GPIO 3.

1
Слово «scratch» в переводе с английского означает «царапать». По мнению не-
официального сообщества Scratch, кота, который является символом языка, зо-
вут Scratch (Царапка). В то же время словосочетание «from scratch» означает
«с нуля». Этим и объясняется название языка — играя с очаровательным котом
Царапкой, вы с нуля изучаете основы программирования. — Прим. перев.
2
Если при запуске среды программирования все названия отображаются на ан-
глийском языке, вы всегда можете это изменить. Просто нажмите на значок гло-
буса в главном меню и выберите русский язык. — Прим. перев.
Игра Hungry Monkey на языке Scratch
286

Рис. 19.2. Подключение двух кнопок к Raspberry Pi

Вот и все! Теперь можно перейти к написанию скрипта для игры.

Создание скрипта
Перед созданием игры полезно составить список функций, которые
вы хотите в ней реализовать. Имея такой список перед глазами, вы
будете точно знать, что вам нужно делать сейчас.
В игре «Hungry Monkey» игрок управляет обезьянкой, которая
старается поймать как можно больше спелых бананов, пропуская
гнилые. За каждый пойманный спелый банан игрок получает один
балл, за пойманный гнилой — лишается одного балла. Вот описание
основных шагов для создания игры «Hungry Monkey»:
1. Создать спрайт главного героя — обезьянки и реализовать воз-
можность управлять ее движением с помощью двух кнопок: одна
кнопка отвечает за перемещение обезьянки вправо, а другая — влево.
Кроме того, нужно реализовать управление обезьянкой с помощью
клавиш со стрелками на клавиатуре.
Создание скрипта
287

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


они падали с неба, то есть от верхнего края экрана.
3. Запрограммировать обезьянку так, чтобы она «ловила» бананы,
когда касается их.
4. Создать систему подсчета баллов, которая будет прибавлять
один балл, когда обезьянка ловит спелый банан, и вычитать один
балл, когда она ловит гнилой.
5. Создать таймер с обратным отсчетом, чтобы игра завершалась,
когда его значение достигнет 0.
6. Организовать отображение итогового счета игрока, когда игра
закончится.
Файл Scratch для этого проекта вы, как всегда, можете скачать
с сайта: http://pilotlz.ru/books/files/10857 / Чтобы загрузить ска-
чанный файл в среду Scratch, выберите пункт меню File→Load
Project. Для создания скрипта выполните следующие разделы это-
го проекта.

Создание спрайтов и выбор фона сцены

В игре «Hungry Monkey» вы будете использовать спрайты обезьян-


ки и бананов из библиотеки спрайтов. Вам не нужен стандартный
спрайт кота, который появляется на экране по умолчанию, поэто-
му вы можете удалить его, щелкнув по нему правой кнопкой мыши
и выбрав пункт Удалить (Delete).
Чтобы открыть библиотеку спрайтов, перейдите в область управ-
ления спрайтами и нажмите на значок в виде кошачьей мордочки
в нижнем правом углу (рис. 19.3).

Рис. 19.3. Значок для создания новых спрайтов


Игра Hungry Monkey на языке Scratch
288

В категории Животные выберите спрайт


Monkey2 и нажмите ОК. Затем снова от-
кройте библиотеку Sprite, выберите спрайт
Bananas из категории Еда и нажмите ОК.
В левой части области управления спрай-
тами можно выбрать фон для своей игры.
Там вы найдете набор значков для фона.
Чтобы выбрать фон из библиотеки, щелкни-
те по первому значку (рис. 19.4). Мы вы-
брали фон с именем blue sky (синее небо).
Теперь ваша область управления спрай-
Рис. 19.4. Выбор фона тами должна выглядеть, как показано
из библиотеки на рис. 19.5.

Рис. 19.5. Список выбранных спрайтов и фон

ПРИМЕЧАНИЕ
Вы можете создать спрайт с нуля, нарисовав его с помощью знач-
ка кисти, загрузить свой собственный спрайт, щелкнув по знач-
ку папки, или сделать снимок с помощью веб-камеры, щелкнув
по значку камеры.

Редактирование спрайтов

В Scratch можно увеличивать или уменьшать размер спрайта, изме-


нять его цвет и редактировать его так же, как в привычном вам гра-
фическом редакторе. Встроенный редактор изображений Scratch на-
Создание скрипта
289

зывается Paint Editor. В нем вы можете изменять внешний вид


ваших спрайтов.
Выберите в списке спрайтов Monkey2. Выбранный спрайт будет
обведен по контуру синей линией (см. рис. 19.5). Затем нажмите
на спрайт Monkey2 на вкладке Костюмы и отредактируйте первый
костюм, который называется monkey2-a. Мышью тяните спрайт
за угол до тех пор, пока его размер не будет равен 98 × 138 пик-
селей, или примените инструмент сжатия, пока не получите жела-
емый размер (текущий размер спрайта отображается под костюмом
monkey2-a). Таким же образом измените размер спрайтов бананов
до 28 × 28 пикселей.
При настройке размера спрайтов убедитесь, что они находятся
точно по центру сцены, чтобы сохранить ориентацию спрайта.

Добавление элементов управления


в спрайт обезьянки

Сейчас вы добавите элементы управления обезьянкой, чтобы в про-


цессе игры можно было двигать ее влево или вправо, нажимая кноп-
ки или стрелки на клавиатуре.
Чтобы порты GPIO Raspberry Pi могли взаимодействовать
со Scratch и программа реагировала на нажатия кнопок, вам необ-
ходимо еще добавить в Scratch библиотеку расширений. Выберите
спрайт Monkey2 на вкладке Код, а затем нажмите самую нижнюю
кнопку слева Добавить расширение. В открывшейся вкладке выбе-
рите значок Pi GPIO (рис. 19.6) и нажмите ОК.

Рис. 19.6. Добавление расширения Pi GPIO


Игра Hungry Monkey на языке Scratch
290

Библиотека расширений добавляет в список блоков новые блоки


(для управления портами GPIO), которые должны появиться под ка-
тегорией Другие блоки.
В Scratch существует много разных способов заставить спрайт
двигаться. Здесь вы будете использовать систему координат (x, y),
в которой точка (0,0) находится в самом центре сцены. Увеличение
x-координаты перемещает спрайты вправо, а уменьшение — влево.
Соответственно увеличение y-координаты перемещает спрайты вверх,
а уменьшение — вниз. Блоки для управления перемещениями нахо-
дятся в синей категории Движение.
Чтобы управлять обезьянкой, выберите спрайт Monkey2 и пере-
тащите в область скриптов блоки, показанные на рис. 19.7. Затем,
ориентируясь на рисунок, измените настройки в блоках в соответ-
ствии с ним.

Рис. 19.7. Блоки управления обезьянкой

ПРИМЕЧАНИЕ
Найти нужные блоки несложно. Помните, что каждая катего-
рия блоков имеет свой цвет и каждый блок внутри нее окрашен
в тот же цвет.
Создание скрипта
291

Сначала установите значение 0 для x-координаты спрайта Monkey2


и значение –110 для y-координаты. Эти координаты центрируют ваш
спрайт по горизонтали и сместят его в нижнюю часть экрана соответ-
ственно. Теперь спрайт будет находиться в этом положении каждый
раз, когда вы начинаете игру.
Следующие два блока «активируют» порты GPIO 2 и GPIO 3.
Теперь программа сможет определить, были ли нажаты кнопки.
Далее вы добавляете бесконечный цикл, который непрерывно про-
веряет, нажаты ли кнопки или клавиши со стрелками. Если игрок на-
жимает кнопку, подключенную к GPIO 3, или клавишу со стрелкой
«вправо», x-координата спрайта увеличивается на 30, перемещая его
вправо. Если же игрок нажимает кнопку, подключенную к GPIO 2,
или клавишу со стрелкой «влево», x-координата спрайта изменяется
на –30, перемещая его влево. Вы можете увеличить это число, чтобы
ваша обезьянка двигалась быстрее, или уменьшить его, чтобы обе-
зьянка двигалась медленнее.
После того как вы добавили нужные блоки, еще раз сверьтесь
с рис. 19.7. Теперь вы можете протестировать работу скрипта.

Тестирование скрипта

Для запуска скрипта в Scratch используется блок .


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

Создание таймера обратного отсчета

Игра длится всего 30 секунд, и игрок должен знать, сколько времени


осталось до конца игры. Поэтому ваш следующий шаг — создание
таймера обратного отсчета.
Чтобы добавить в свою игру такой таймер, выберите спрайт
Monkey2, а затем перетащите в область скриптов блоки, показан-
ные на рис. 19.8. Вы наверняка заметите, что настроить блок По-
Игра Hungry Monkey на языке Scratch
292

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


ния времени нужно создать новую переменную. Для этого перейдите
к категории блоков Переменные (Data) и нажмите кнопку Создать
переменную. Назовите новую переменную time и сделайте ее до-
ступной для всех спрайтов, установив галочку Для всех спрайтов
(For all sprites). Теперь перетащите этот блок в область скриптов.

Рис. 19.8. Блоки для создания таймера обратного отсчета

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


зовать блок Таймер из категории Сенсоры. Этот блок подсчитывает
время, прошедшее с момента запуска скрипта. Когда вы нажимаете
зеленый флажок, скрипт сбрасывает значение таймера, так что при
каждом новом запуске игры отсчет начинается с 0. Затем вы до-
бавляете блок, который отображает переменную time на сцене. Вы
можете изменить расположение переменной time, перетаскивая ее
внутри сцены. Обычно в играх таймер располагается в правом верх-
нем углу, перетащите его туда.
Далее, цикл Повторять всегда (Forever) обновляет переменную
time таким образом, чтобы она начиналась с 30 и уменьшалась
на единицу каждую секунду. У вас задействован блок Округлить
(Round), поэтому время обратного отсчета отображается целым чис-
лом. Если вы хотите изменить продолжительность игры, измените
число в блоке Округлить.
Создание скрипта
293

Обратите внимание на вложенность в этом фрагменте (рис. 19.9):


блок Задать time значение выполняется первым, а затем выполня-
ется блок Округлить. Кроме того, вам нужно перетащить в блок
Округлить еще один зеленый блок — (вычитание) с двумя пустыми
кругами. В первый пустой круг введите число 30, а во второй пере-
тащите блок Таймер.

Рис. 19.9. Вложенность блока Если, то

Блок Если, то в конце скрипта (см. рис. 19.8) делает переменную


time невидимой, когда обратный отсчет достигает 0. Теперь попро-
буйте выполнить скрипт и посмотрите, что получится!

Подсчет и отображение результатов

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


ременную для отслеживания текущего счета. В категории Перемен-
ные создайте новую переменную с именем score (счет) и сделайте
ее доступной для всех спрайтов. Выберите спрайт Monkey2, а затем
перетащите в область скриптов блоки, как на рис. 19.10.

Рис. 19.10. Блоки для отображения счета и остановки игры


Игра Hungry Monkey на языке Scratch
294

Задайте блоку Задать score значение значение 0, чтобы ваш те-


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

Падение бананов с неба

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


Monkey2, вам нужно сделать так, чтобы спрайт Bananas падал
с неба. Для этого нужно реализовать следующие функции спрайта
Bananas:
• Бананы должны падать с неба (от верхнего края сцены), появ-
ляясь в случайной координате х, и затем уменьшать координату
у, пока не упадут на пол (достигнут нижнего края сцены).
• После падения на пол бананы должны исчезать.
• Когда бананы касаются обезьянки, должен звучать сигнал и до-
бавляться один балл к текущему счету, а сами бананы должны
исчезать.
• После завершения игры бананы не должны падать, то есть при
достижении таймером значения 0 все бананы должны быть уда-
лены.
Начните с добавления звука в раздел блоков из Библиотеки
звуков.
Добавление звука из Библиотеки звуков. Вы добавите звук
pop для спрайта Bananas, чтобы он звучал, когда банан касается
спрайта Monkey2 (то есть когда обезьянка ловит банан). Для это-
го выберите спрайт Bananas, а в разделе блоков выберите вкладку
Звуки→Включить звук. Затем, чтобы выбрать звук из Библиотеки
звуков, щелкните по значку динамика (Выбрать звук) и выберите
pop. Для редактирования звуков и выбора их из Библиотеки зву-
ков перейдите во вкладку Звуки на панели сверху, а затем нажмите
на значок динамика с плюсом и выберите нужный файл.
Перейдите на вкладку Код, чтобы добавить блоки действий.
Создание скрипта
295

Реализация падения бананов. Чтобы реализовать все перечислен-


ные выше функции, выберите спрайт Bananas, а затем перетащите
в область скриптов блоки, как на рис. 19.11.

Рис. 19.11. Блоки для создания и управления спрайтом Bananas

С помощью верхнего левого набора блоков 1 (см. рис. 19.11) вы


каждую секунду создаете клон спрайта Bananas, другими словами,
новый спрайт Bananas.
Используя набор блоков справа 3, вы задаете значения для клонов
Bananas. Блок Показаться из категории Внешний вид обеспечива-
ет отображение бананов на сцене. Вы задаете y-координату бананов,
Игра Hungry Monkey на языке Scratch
296

равную 170, что соответствует верхней части сцены, и x-координату,


равную случайному числу между –230 и 230, что составляет всю ши-
рину сцены.
Следом вы добавляете блок Повторять пока не, который будет
выполняться до тех пор, пока переменная time не станет равна 0.
Блок Изменить y на внутри блока Повторять пока не (Repeat Until)
уменьшает y-координату бананов, создавая видимость падения с неба.
В данном случае мы уменьшаем y-координату на 5, но вы можете
задать свое значение. Если вы хотите, чтобы бананы падали быстрее,
увеличьте значение y, а чтобы падали медленнее — уменьшите его.
Первый блок Если, то внутри блока Повторять пока не уда-
лит бананы, когда они достигнут нижнего края сцены, то есть при
y < –160. Второй блок Если, то добавляет единицу к переменной
score, воспроизводит звук pop, когда бананы касаются обезьянки,
и делает их невидимыми. Наконец, когда блок Повторять пока не за-
вершается, все клоны Bananas исчезают со сцены.
Блоки в нижнем левом углу 2 (см. рис. 19.11) прекращают соз-
дание новых клонов Bananas, когда переменная time принимает
нулевое значение.

Добавление гнилых бананов

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


счет баллов. Не хватает только гнилых бананов. Скрипт для созда-
ния гнилых бананов похож на скрипт создания спелых бананов (см.
рис. 19.11), но внести кое-какие изменения все же нужно:
• Гнилые бананы должны появляться реже — каждые 2 секунды
вместо одной.
• Счет игрока должен уменьшаться на один балл, когда гнилые
бананы касаются обезьянки.
• Касание обезьянки гнилыми бананами должно сопровождаться
другим звуком. Мы, например, выбрали звук с именем Felec
bass.
• Отредактируйте внешний вид бананов, чтобы они были похожи
на гнилые.
Поскольку этот скрипт очень похож на предыдущий, гораздо бы-
стрее и проще для вас скопировать его, а затем внести изменения.
Щелкните правой кнопкой мыши по спрайту Bananas и выберите
пункт меню Дублировать. Спрайт и его скрипт должны дублировать-
ся и автоматически получить имя Bananas2. Переименуйте спрайт
Создание скрипта
297

Bananas2, задав ему новое имя Rotten (гнилой). Изменения, ко-


торые необходимо внести в скрипт, обведены рамкой на рис. 19.12.

Рис. 19.12. Блоки для управления гнилыми бананами

Измените значение блока Ждать на 2 1, чтобы новый клон Rotten


появлялся каждые 2 секунды. Кроме того, измените звуковой блок,
чтобы воспроизводился звук Felec bass 2, и блок Изменить score
на, чтобы уменьшать счет на один балл 3. Имейте в виду, что снача-
ла нужно добавить звук из библиотеки на вкладку Звуки.
В завершение измените цвета спрайта Rotten, чтобы бананы вы-
глядели гнилыми. Выберите спрайт Rotten и перейдите на вклад-
ку Костюмы. Появится экран редактора изображений Paint Editor
(рис. 19.13).
В левой части окна выберите значок ведра 1. Затем выше выбе-
рите разные цвета, например коричневый, оливково-зеленый и тем-
Игра Hungry Monkey на языке Scratch
298

но-зеленый 2, чтобы залить каждый банан отдельным цветом и по-


казать, что они гнилые.

Рис. 19.13. Редактирование цветов спрайта Rotten

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

Идеи для продолжения


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

• Пусть скорость падения бананов по ходу игры возрастает.


• Пусть количество гнилых бананов по ходу игры тоже увеличи-
вается.
• Реализуйте многопользовательский режим — создайте еще один
спрайт со своими элементами управления. (Не забудьте доба-
вить другую переменную score для подсчета баллов, чтобы
оценивать результат второго игрока.)
• Добавьте в свою схему другие электронные компоненты, с по-
мощью которых можно взаимодействовать со Scratch, например
кнопки, зуммеры или датчики.
Создавайте свои собственные игры и развлекайтесь!

Powered by TCPDF (www.tcpdf.org)


СТОИМОСТЬ: $$
ПРИМЕРНОЕ ВРЕМЯ СБОРКИ: 3 часа

ПЕРЕЧЕНЬ КОМПОНЕНТОВ:
• Raspberry Pi Zero W (или другая модель Raspberry Pi с 40 портами GPIO)
• Двухколесная платформа Smart Robot
• Модуль MotoZero (или другой драйвер моторов)
• Четыре батарейки типа AA
• Портативное зарядное устройство
• Соединительные провода разных типов

НЕОБХОДИМОЕ ПО:
• Панель управления Node-RED
20
Робот с дистанционным
Wi-Fi-управлением
В этом проекте вы соберете двухколесного ро-
бота на основе Raspberry Pi модели Zero W и до-
полнительного модуля MotoZero. Ваш робот будет
питаться от батареек, и вы сможете дистанционно
управлять им по Wi-Fi с помощью веб-приложения,
которое сделаете сами в приложении Node-RED.

Краткое описание проекта

Прежде чем приступать к самому проекту, рассмотрим наиболее


важные части робота, чтобы вы могли представить, как он будет
работать.
Wi-Fi. Вы будете управлять роботом с помощью приложения
Node-RED, которое требует подключения Raspberry Pi к сети Wi-Fi.
Модели Raspberry Pi 3 и Zero W уже имеют встроенный Wi-Fi. Для
других моделей потребуется внешнее устройство, совместимое с Pi.
Плата Raspberry Pi. Мы выбрали модель Raspberry Pi Zero W
за ее компактные размеры, которые идеально подходят для размеще-
ния на небольшой двухколесной платформе робота. Однако для этого
проекта подойдет любая модель Pi, которая имеет 40 портов GPIO
и поддерживает подключение к Wi-Fi.
Робот с дистанционным Wi-Fi-управлением
302

Двухколесная платформа. Мы взяли комплект двухколесной


платформы для роботов, который поставляется со всеми компонен-
тами, необходимыми для построения робота, включая колеса, двига-
тели и винты. Вы можете найти такой комплект в одном из много-
численных интернет-магазинов, например в Amazon или eBay. Просто
наберите в поисковой строке «двухколесная платформа Smart
Car Robot». Для данного проекта вам нужен комплект с двумя дви-
гателями.
Модуль MotoZero. Двигатели постоянного тока приводят робо-
та в движение, и вы будете управлять ими через плату расширения
MotoZero. Такую плату можно найти, например, в интернет-магазине
The Pi Hut (https://thepihut.com / motozero / ). Вообще можно задей-
ствовать любой другой, совместимый с Raspberry Pi драйвер мото-
ров или даже самостоятельно собрать схему на основе микросхемы
LC293D. Мы не будем сейчас останавливаться на том, как собрать
такую схему, поскольку существует множество онлайн-руководств,
как это сделать.
Питание. Мы не хотим подключать Pi-робот к настенной розет-
ке — нам нужно, чтобы он был портативным. Такой робот должен
питаться от портативного зарядного устройства — универсального
внешнего аккумулятора. Блок питания должен обеспечивать на своем
выходе напряжение 5 В и ток нагрузки 2 А. Мы успешно протести-
ровали этот проект с универсальным внешним аккумулятором емко-
стью 2200 мАч. Если вы выберете аккумулятор с большей емкостью,
робот будет работать дольше.
Двигатели постоянного тока должны питаться независимо от Pi,
значит, вам понадобятся два независимых источника питания. Вы
будете питать двигатели от четырех батареек типа АА, установив
их в отсеки, входящие в комплект с двигателями.
Приложение Node-RED. Для управления роботом вы будете ис-
пользовать приложение Node-RED. С его помощью вы заставите ро-
бота ездить вперед и назад, поворачивать вправо и влево, а также
останавливаться. Поскольку вы не используете плату Pi в качестве
настольного компьютера, она должна автоматически запускать Node-
RED при включении. Для удаленного выключения Raspberry Pi вам
потребуется добавить в приложение кнопку.
Подготовка Raspberry Pi
303

Рис. 20.1. Структурная схема робота

На рисунке 20.1 дана структурная схема вашего робота.

Подготовка Raspberry Pi
Плата Raspberry Pi Zero W (рис. 20.2) является модификацией
платы Raspberry Pi Zero. Она имеет встроенную беспроводную сеть
WLAN и Bluetooth. Но, как мы уже говорили, можно взять лю-
бую другую, совместимую с Wi-Fi модель Pi или добавить внешнее
Wi-Fi-устройство. Raspberry Pi Zero W имеет совсем небольшой
размер, всего 2,56 × 1,18 × 0,20 дюйма (65 × 30 × 5 мм) и стоит
около 10 долл.
Pi Zero имеет 40 портов GPIO, которые расположены так же, как
и на уже знакомой вам Pi 3. Эта модель имеет видеоразъем mini-
HDMI и два разъема microUSB, один из которых предназначен ис-
ключительно для питания (см. рис. 20.2). Чтобы превратить Pi Zero
Робот с дистанционным Wi-Fi-управлением
304

в настольный компьютер, понадобится несколько дополнительных ак-


сессуаров: USB-концентратор (USB-хаб), адаптер USB — microUSB
и адаптер HDMI — mini-HDMI для подключения периферийных
устройств. Чтобы не покупать лишние переходники, мы подготовим
все на привычной нам Raspberry Pi 3, а затем просто переставим кар-
ту microSD на Pi Zero W.

Рис. 20.2. Плата Raspberry Pi Zero W

В этом проекте мы рекомендуем вам использовать очищенную


и отформатированную карту microSD. Загляните в раздел «Загрузка
операционной системы» в начале книги, чтобы вспомнить, как уста-
новить на нее последнюю версию Raspbian.
После установки операционной системы вставьте карту microSD
в свою Pi 3, включите питание Pi и подождите несколько секунд,
чтобы система запустилась. Затем настройте Wi-Fi, нажав значок Wi-
Fi в правом верхнем углу рабочего стола. После этого введите пароль
своей сети Wi-Fi и подождите несколько секунд, пока установится
соединение.
Программное обеспечение Node-RED предустановлено в операци-
онной системе Pi, но вам нужно дополнительно установить панель
управления Node-RED. Для этого сначала обновите репозитории би-
блиотек, а затем установите npm (Node Package Management), введя
в командной строке терминала следующие команды:

pi@raspberrypi:~ $ sudo apt update


pi@raspberrypi:~ $ sudo apt install npm
Сборка схемы
305

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


Enter. Установка может занять несколько минут. Затем введите сле-
дующие команды для обновления npm до последней версии 3.x, ко-
торая рекомендована для использования с Node-RED:

pi@raspberrypi:~ $ sudo npm install -g npm@3.x


pi@raspberrypi:~ $ hash –r

А теперь можно установить панель управления Node-RED. Для


этого введите следующую команду:

pi@raspberrypi:~ $ sudo npm install --unsafe-perm -g node-


red-dashboard

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


этого введите в терминал следующую команду:

pi@raspberrypi:~ $ sudo systemctl enable nodered.service

После этого выключите свою Pi, извлеките карту microSD и пере-


ставьте ее на Raspberry Pi Zero W.

Сборка схемы
Для сборки робота вам понадобится двухколесная платформа для
робота, два двигателя постоянного тока с соответствующими ко-
лесами, модуль MotoZero, соединительные провода и ваша Pi
(с возможностью Wi-Fi-подключения). При сборке рис. 20.1 будет
служить вам в качестве образца. Для начала установите модуль
MotoZero поверх вашей Raspberry Pi, а затем подключите к нему
двигатели.

Подключение двигателей к модулю MotoZero

Модуль MotoZero может независимо управлять четырьмя двигате-


лями, но в данном проекте их только два. Обычно модуль MotoZero
доставляется из интернет-магазинов в разобранном виде, поэтому
вам нужно соединить его части при помощи пайки. На странице
модуля на сайте интернет-магазина The Pi Hut, помимо описания
Робот с дистанционным Wi-Fi-управлением
306

товара, вы найдете руководство по его сборке. Перейдите по ссыл-


ке https://thepihut.com / motozero / и, следуя инструкциям, собе-
рите свой модуль. В итоге ваш MotoZero должен выглядеть, как
на рис. 20.3.

Рис. 20.3. Собранный модуль MotoZero

На рисунке 20.3 показаны четыре пары (+ и –) клемм для под-


ключения двигателей к MotoZero и пара клемм (+ и –) для под-
ключения питания. Здесь нужно сказать, что двигатели при запуске
потребляют очень большой ток, в результате чего падает напряжение
питания Pi. По этой причине двигатели нужно питать от отдельного
источника напряжения.
Подключение двигателей к батарейкам, установленным в отсеки
для батареек, выполняйте согласно следующим шагам (сверяйте свои
действия с рис. 20.1):
1. Соедините красный провод правого двигателя с положительным
(+) контактом Motor 1 на MotoZero, а черный провод — с отрица-
тельным (–) контактом Motor 1. Для этого сначала ослабьте винты,
затем вставьте концы проводов в гнезда контактов и снова затяните
винты.
2. Повторите предыдущий шаг для левого двигателя, подключив
провода питания к контактам Motor 2 на MotoZero.
3. Не вставляя батарейки в их отсек, подключите красный про-
вод отсека к положительному (+) контакту питания MotoZero, а его
черный провод — к отрицательному (–) контакту (см. нижнюю часть
платы на рис. 20.3).
Сборка схемы
307

ПРИМЕЧАНИЕ
Если при тестировании приложения на этапе завершения проекта
вы обнаружите, что колеса робота вращаются не в том направле-
нии, в котором нужно вам, поменяйте местами красные и черные
провода двигателей, подключенные к положительным (+) и отри-
цательным (–) контактам Motor 1 или Motor 2 на MotoZero.

Управление двигателями с помощью MotoZero

Каждый двигатель подключается к трем портам GPIO. Один из пор-


тов (enable), управляет включением и выключением двигателя. Два
других порта управляют положительным и отрицательным проводами
питания двигателя. При подключении одного контакта двигателя к кон-
такту питания, а другого контакта к GND, двигатель вращается в одном
направлении. Если же подключить контакты двигателя в обратном по-
рядке, двигатель будет вращаться в противоположном направлении.
После установки MotoZero поверх Pi подключите контакты
Motor 1 и Motor 2 в соответствии с приведенной ниже таблицей:

Motor 1 Motor 2
enable: GPIO 5 enable: GPIO 6
Motor 1 (+): GPIO 27 Motor 2 (+): GPIO 22
Motor 1 (–): GPIO 24 Motor 2 (–): GPIO 17

ПРИМЕЧАНИЕ
Информацию о том, к каким портам GPIO можно подключать
Motor 3 и Motor 4, вы можете найти в руководстве по использо-
ванию модуля MotoZero на его странице в интернет-магазине The
Pi Hut: https://thepihut.com / motozero /

Чтобы двигатель запустить, на контакт enable нужно подать сиг-


нал с уровнем HIGH (он включит двигатель). Кроме того, сигнал
с уровнем HIGH должен получать один из положительных или от-
рицательных выводов (но только один). Например, если вы хотите,
Робот с дистанционным Wi-Fi-управлением
308

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


щую настройку:
• GPIO 5: HIGH
• GPIO 27: HIGH
• GPIO 24: LOW,
а чтобы он же вращался в противоположном направлении:
• GPIO 5: HIGH
• GPIO 27: LOW
• GPIO 24: HIGH
Чтобы выключить двигатель, нужно подать сигнал уровня LOW
на все три порта GPIO. Так же настраиваются другие двигатели.

Разработка приложения
Итак, сборка закончена, пора приступать к разработке приложения
Node-RED. Но ваша Pi уже занята — установлена на двухколесную
платформу робота, поэтому проще всего создавать приложение Node-
RED, а затем и управлять роботом с помощью обычного настольного
компьютера или ноутбука.
В первую очередь вам нужно узнать IP-адрес вашей Raspberry Pi
Zero W, чтобы получить доступ к панели управления Node-RED ва-
шей Pi. Именно на ней вы сможете создать приложение для управ-
ления роботом.
Прежде чем продолжить, убедитесь, что Raspberry Pi включена
и что ваш компьютер и Pi подключены к одной сети.

Определение IP-адреса Raspberry Pi

Включите Raspberry Pi, подключив ее через адаптер питания на 5 В


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

ПРЕДУПРЕЖДЕНИЕ
Плата Raspberry Pi Zero W имеет два порта mini-USB. Один из них,
обозначенный PWR IN, предназначен для питания Pi.
Разработка приложения
309

Для определения IP-адреса Pi вам понадобится программа Angry


IP Scanner. Ее можно бесплатно скачать на свой компьютер или но-
утбук с сайта http://angryip.org / download / , а затем установить, сле-
дуя инструкциям.
По завершении установки запустите Angry IP Scanner и нажмите
кнопку Start. Подождите несколько секунд, пока в окне программы
не отобразятся все доступные IP-адреса. IP-адрес вашей Pi должен
иметь имя хоста raspberrypi.lan, найдите и запишите его. На ри-
сунке 20.4 выделен IP-адрес нашей Raspberry Pi — 192.168.1.122.

Рис. 20.4. Определение IP-адреса Raspberry Pi с помощью програм-


мы Angry IP Scanner

Создание потока Node-RED

Запустите любой браузер на вашем компьютере, убедившись, что


он находится в той же сети, что и ваша Pi. Перейдите по ссылке
http://<IP-адрес вашей Pi>:1880, заменив <IP-адрес вашей Pi>
на IP-адрес, который вы только что определили. В нашем случае это
ссылка http://192.168.1.122:1880 Должен открыться веб-сервер Node-
RED вашей Raspberry Pi.

ПРИМЕЧАНИЕ
Для знакомства с Node-RED см. проект 17.
Робот с дистанционным Wi-Fi-управлением
310

В правом верхнем углу окна вы-


берите вкладку dashboard, внутри
которой на вкладке Layout (макет)
создайте новую вкладку с именем
Робот. Затем внутри вкладки Ро-
бот создайте две группы — Главная
и Выключение (рис. 20.5). В группе
Главная (Main) вы разместите кноп-
ки для управления роботом, а в груп-
Рис. 20.5. Макет приложения пе Выключение (Poweroff) — кнопку
Node-RED «dashboard» для удаленного выключения вашей
Raspberry Pi.
Перетащите из панели инструментов в поток пять кнопок, функ-
цию, шесть выходных узлов rpi gpio и узел exec. Соедините узлы
и переименуйте их в соответствии с рис. 20.6.
Настройте параметры функции таким образом, чтобы у нее было
шесть выходов с параметрами, как в табл. 20.1.

Рис. 20.6. Узлы приложения Node-RED


Разработка приложения
311

Таблица 20.1. Параметры узлов

Узел Свойства
Forward Group: Главная [Робот]
Size: auto
Icon: fa-arrow-up
Label: Вперед
Payload: forward
Left Group: Главная [Робот]
Size: auto
Icon: fa-arrow-left
Label: Налево
Payload: left
Right Group: Главная [Робот]
Size: auto
Icon: fa-arrow-right
Label: Направо
Payload: right
Reverse Group: Главная [Робот]
Size: auto
Icon: fa-arrow-down
Label: Назад
Payload: reverse
Stop Group: Главная [Робот]
Size: auto
Icon: fa-hand-paper-o
Label: Остановка
Payload: stop
f Function: введите код из листинга 20.1
Outputs: 6
Enable M1 GPIO: GPIO 5–29
Type: Digital output
+ M1 GPIO: GPIO 27–13
Type: Digital output
– M1 GPIO: GPIO 24–18
Type: Digital output
Enable M2 GPIO: GPIO 17–11
Type: Digital output
+ M2 GPIO: GPIO 6–31
Type: Digital output
– M2 GPIO: GPIO 22–15
Type: Digital output
Робот с дистанционным Wi-Fi-управлением
312

Окончание табл. 20.1


Узел Свойства
Poweroff Group: Выключение [Робот]
Size: auto
Icon: fa-power-off
Label: Выключение
Background: red
exec Command: / usr / bin / sudo
+ Append: снять галочку, в поле для ввода ввести:
poweroff
Name: Poweroff

На рисунке 20.7 показаны настройки узла exec.

Рис. 20.7. Свойства узла exec

Все узлы должны находиться в группе Главная, кроме кнопки


«Выключение» (ее следует разместить в группе Выключение).

Написание скрипта

Введите в поле Function узла f приведенный ниже код JavaScript


(листинг 20.1). Этот код вы также можете скачать по ссылке: http://
pilotlz.ru/books/files/10857 /
Разработка приложения
313

Листинг 20.1. Скрипт для робота с дистанционным управлением:

1 var msg1 = {payload: 0};


var msg2 = {payload: 0};
var msg3 = {payload: 0};
var msg4 = {payload: 0};
var msg5 = {payload: 0};
var msg6 = {payload: 0};
2 if (msg.payload === "прямо") {
msg1.payload = 1;
msg2.payload = 1;
msg4.payload = 1;
msg5.payload = 1;
}
else if (msg.payload === "налево") {
msg1.payload = 1;
msg2.payload = 1;
}
else if (msg.payload === "направо") {
msg4.payload = 1;
msg5.payload = 1;
}
else if (msg.payload === "назад") {
msg1.payload = 1;
msg3.payload = 1;
msg4.payload = 1;
msg6.payload = 1;
}
3 return [msg1, msg2, msg3, msg4, msg5, msg6];

Эта функция отправляет сообщения на подключенные выходные


узлы rpi gpio в том порядке, в котором они подключены к узлу
функция. Это означает, что сообщение msg1 отправляется на узел
Enable M1, msg2 — на узел +M1, msg3 — на узел –M1 и так далее
(см. рис. 20.6).
Сначала вы устанавливаете все значения переменных payload
равными 0 1. Затем ряд операторов if и else if проверяет, ка-
кая кнопка была нажата 2. Например если вы нажмете кнопку
«Прямо», команда payload, получаемая узлом function, при-
мет значение forward. Поэтому условие в точке 2 будет выпол-
нено и в коде изменятся значения payload msg1, msg2, msg4
и msg5 — они станут равными 1, в то время как msg3 и msg6
останутся равными 0.
Робот с дистанционным Wi-Fi-управлением
314

Затем узел function отправляет значения msg.payload соот-


ветствующим узлам 3. Чтобы робот мог двигаться вперед, значения
payload должны быть следующими:
• Enable M1: 1
• + M1: 1
• – M2: 0
• Enable M2: 1
• + M2: 1
• – M2: 0
В этом случае оба двигателя включены и вращаются в одном на-
правлении — вперед. В приведенной ниже табл. 20.2 показаны со-
общения, которые узел function должен отправлять каждому узлу
для каждого действия.

Таблица 20.2. Сообщения узла function

Действие Enable +M1 –M1 Enable +M2 –M2


M1 M2
Прямо 1 1 0 1 1 0
Налево 1 1 0 0 0 0
Направо 0 0 0 1 1 0
Назад 1 0 1 1 0 1
Остановка 0 0 0 0 0 0

Когда нажата кнопка «Остановка», ни одно из условий, установ-


ленных в коде, не выполняется и функция отправляет значения,
установленные в самом начале скрипта 1.
Вне узла function, когда нажата кнопка «Выключение», узел
exec выполняет команду poweroff, чтобы выключить Pi. Пом-
ните, что вы заполнили свойство exec с помощью команды
/ usr / bin / sudo / poweroff (см. табл. 20.1).
Когда все будет готово, нажмите кнопку «Deploy» в правом верх-
нем углу окна, чтобы сохранить изменения и запустить проект.

Запуск приложения
Теперь ваше Node-RED-приложение готово. Откройте в браузере
страницу http://<IP-адрес вашей Pi>:1880 / ui (не забудьте заменить
Запуск робота
315

<IP-адрес вашей Pi> на свой), чтобы увидеть панель управления


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

Рис. 20.8. Приложение Node-RED для удаленного управления ро-


ботом

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


лении, поменяйте местами черные и красные провода этих двигате-
лей на MotoZero или измените сообщения payload в соответствии
с требуемыми направлениями.

Запуск робота
Теперь, когда приложение готово, нажмите кнопку выключения
Raspberry Pi и подождите несколько секунд до полного ее отклю-
чения.
Замените источник питания Pi на внешний аккумулятор. Подожди-
те несколько минут, пока включится Pi и автоматически запустится
Робот с дистанционным Wi-Fi-управлением
316

Node-RED. На смартфоне или любом другом устройстве, находящем-


ся в той же сети, что и ваша Pi, откройте в новой вкладке браузера
ссылку http://<IP-адрес Pi>:1880 / ui Теперь вы можете дистанцион-
но управлять роботом, нажимая на соответствующие кнопки.
Поздравляем! Вы создали собственного робота с дистанционным
управлением!

Идеи для продолжения


Существует множество возможностей усовершенствования вашего ро-
бота. Вот несколько идей, реализация которых потребует изменений
как в схеме, так и в скрипте:
• Создайте робота с четырьмя колесами и управляйте четырьмя
двигателями вместо двух.
• Подключите к роботу светодиоды и зуммеры, чтобы сделать его
более интерактивным.
• Подключите к роботу датчики, например ультразвуковые, чтобы
робот мог самостоятельно обнаруживать препятствия на своем
пути и обходить их.
Вам нужно будет хорошенько поэкспериментировать с Node-RED,
чтобы воплотить в жизнь эти идеи. Успехов!
Приложения
Приложение А.
Руководство по портам
GPIO Raspberry Pi
Это руководство содержит обзор портов GPIO всех плат Raspberry Pi,
доступных на сегодняшний день. Используйте эти таблицы при вы-
полнении проектов, чтобы вспомнить расположение нужного вам
порта, его имя и назначение.
В следующей таблице приведена схема портов GPIO для мо-
делей Raspberry Pi 3 Model B, Raspberry Pi 2 Model B, Raspberry
Pi 1 Model A+, Raspberry Pi 1 Model B+, Raspberry Pi Model Zero
и Raspberry Pi Zero W.

Функция Обозна- Номер Номер Обозна- Функция


чение вывода вывода чение
Питание, пост. ток 3.3 V 1 2 5V Питание, пост. ток
SDA1, I2C GPIO 2 3 4 5V Питание, пост. ток
SCL1, I2C GPIO 3 5 6 GND
GPIO_ GCLK GPIO 4 7 8 GPIO 14 TXD0
GND 9 10 GPIO 15 RXD0
GPIO_ GEN0 GPIO 17 11 12 GPIO 18 GPIO_ GEN1
GPIO_ GEN2 GPIO 27 13 14 GND
GPIO_ GEN3 GPIO 22 15 16 GPIO 23 GPIO_ GEN4
Питание, пост. ток 3.3 V 17 18 GPIO 24 GPIO_ GEN5
SPI_MOSI GPIO 10 19 20 GND
SPI_MISO GPIO 9 21 22 GPIO 25 GPIO_ GEN6
SPI_CLK GPIO 11 23 24 GPIO 8 SPI_CE0_N
Приложения
318

Окончание табл.
Функция Обозна- Номер Номер Обозна- Функция
чение вывода вывода чение
GND 25 26 GPIO 7 SPI_CE1_N
2
I C ID EEPROM DNC 27 28 DNC I2C ID EEPROM
GPIO 5 29 30 GND
GPIO 6 31 32 GPIO 12
GPIO 13 33 34 GND
GPIO 19 35 36 GPIO 16
GPIO 26 37 38 GPIO 20
GND 39 40 GPIO 21

Платы Raspberry Pi 1 Model A и Raspberry Pi 1 Model B Rev. 2


имеют только первые 26 портов, но с точно таким же расположением.
Исключение составляет только плата Raspberry Pi 1 Model B
Rev. 1. Это самая первая плата Raspberry Pi, поэтому ее конфигу-
рация несколько отличается от остальных моделей. На сегодняшний
день ее уже трудно найти в продаже, но если вдруг у вас именно
эта модель Raspberry Pi, в таблице ниже приведена схема ее портов
GPIO.

Функция Обозна- Номер Номер Обозна- Функция


чение вывода вывода чение
Питание 3.3 V 1 2 5V Питание, пост. ток
2
SDA0, I C GPIO 0 3 4 5V Питание, пост. ток
2
SCL0, I C GPIO 1 5 6 GND
GPIO_ GCLK GPIO 4 7 8 GPIO 14 TXD0
GND 9 10 GPIO 15 RXD0
GPIO_ GEN0 GPIO 17 11 12 GPIO 18 GPIO_ GEN1
GPIO_ GEN2 GPIO 21 13 14 GND
GPIO_ GEN3 GPIO 22 15 16 GPIO 23 GPIO_ GEN4
Питание, пост. ток 3.3 V 17 18 GPIO 24 GPIO_ GEN5
SPI_MOSI GPIO 10 19 20 GND
SPI_MISO GPIO 9 21 22 GPIO 25 GPIO_ GEN6
SPI_CLK GPIO 11 23 24 GPIO 8 SPI_CE0_N
GND 25 26 GPIO 7 SPI_CE1_N
Приложение Б. Таблица цветовой маркировки резисторов
319

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

Цвет Первая Вторая Третья Множитель Погрешность


полоска полоска полоска
Черный 0 0 0 1 Ом
Коричневый 1 1 1 10 Ом ±1%
Красный 2 2 2 100 Ом ±2%
Оранжевый 3 3 3 1 кОм
Желтый 4 4 4 10 кОм
Зеленый 5 5 5 100 кОм ±0,5%
Синий 6 6 6 1 МОм ±0,25%
Фиолетовый 7 7 7 10 МОм ±0,10%
Серый 8 8 8 10 Ом =
8
±0,05%
= 100 МОм
Белый 9 9 9 109 Ом =
= 1000 МОм
Золотой 0,1 Ом ±5%
Серебряный 0,01 Ом ±10%

Обычно на резисторы наносятся четыре полоски1. Первые две по-


лоски обозначают первые две цифры значения сопротивления (но-
минал). Третья полоска — множитель, показывающий, какое число

1
В России продаются также резисторы с пятью полосками. Для них номинал —
первые три (а не две) полоски. — Прим. перев.
Приложения
320

нулей нужно добавить к первым двум цифрам. Четвертая полоска


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

Рис. Б.1. Резистор с четырьмя полосками

Итак, вот что означают его полоски:


• Первая полоса зеленого цвета (5), то есть первая цифра номи-
нала равна 5.
• Вторая полоса — голубая (6), то есть вторая цифра номинала
равна 6.
• Третья полоса — желтая (4), показывает, что предыдущие две
цифры нужно умножить на 10 000 (добавить четыре нуля).
• Четвертая полоса — золотая, то есть допуск составляет ±5%.
Следовательно, значение сопротивления составляет 56 ⋅ 10 000
(10 кОм), то есть 560 кОм. Допуск составляет 5%, что показыва-
ет, что значение сопротивления может быть между 560 кОм ±5%,
то есть между 532 кОм и 588 кОм. Но вам не нужно слишком бес-
покоиться о допуске, если вы не используете действительно чувстви-
тельные компоненты. Во всех проектах этой книги можно применять
резисторы с допуском 5%.
Минимальные системные требования определяются соответствующими
требованиями программ Adobe Reader версии не ниже 11-й либо Adobe
Digital Editions версии не ниже 4.5 для платформ Windows, Mac OS,
Android и iOS; экран 10"
Учебное электронное издание
Сантос Руи
Сантос Сара
20 ПРОСТЫХ ПРОЕКТОВ НА RASPBERRY PI○ . R

ИГРУШКИ, ИНСТРУМЕНТЫ, ГАДЖЕТЫ И МНОГОЕ ДРУГОЕ


Для детей старшего школьного возраста
Ведущий редактор Т. Г. Хохлова
Научный редактор А. А. Салахова
Художник В. А. Прокудин
Технический редактор Т. Ю. Федорова
Корректор И. Н. Панкова
Компьютерная верстка: В. И. Савельев
Подписано к использованию 24.03.20.
Формат 155×225 мм
Издательство «Лаборатория знаний»
125167, Москва, проезд Аэропорта, д. 3
Телефон: (499) 157-5272
e-mail: info@pilotLZ.ru, http://www.pilotLZ.ru
ʞʟʝʠʡʪʤʞʟʝʔʙʡʝʑ
ː˃ RASPBERRY PI
®

ʗʒʟʢʧʙʗǡʗʜʠʡʟʢʛʔʜʡʪǡ
ʒʏʓʕʔʡʪˋˏːˑˆˑˈˇ˓˖ˆˑˈ
Открой для себя дверь в мир электроники и программирования с помощью
Raspberry Pi®!
Придумывайте и реализуйте свои фантазии в виде всевозможных забавных и полезных про-
ектов на основе Raspberry Pi! Этот крошечный недорогой компьютер позволит вам быстро
создавать настоящие электронные гаджеты. Ознакомьтесь с кратким вводным курсом по
настройке Raspberry Pi, выберите проект, который вам приглянулся, и начинайте творить!
Каждый проект снабжен всем, что требуется для его воплощения: пошаговые инструк-
ции, красочные фотографии, электрические схемы и даже готовые программные коды. По
мере усложнения проектов вы освоите работу с ЖК-дисплеями, камерой и датчиками, а также
настроите собственный веб-сервер.
20 проектов с пошаговыми инструкциями:
1. Мигание светодиодом
2. Кнопочный светодиодный фонарик
3. Регулятор яркости светодиода
4. Графический пользовательский интерфейс
для управления многоцветным светодиодом
5. Радужная светодиодная лента
6. Отображение напоминаний на ЖК-дисплее
7. Мини-устройство прогноза погоды
8. Игра в Pong с Sense Hat
9. Сенсорная погодная станция «все-в-одном»
10. Охранная сигнализация с уведомлением по e-mail
11. Газовая и дымовая сигнализация
12. Регистратор температуры и влажности
13. Детектор взлома с фоторегистрацией
14. Система домашнего видеонаблюдения
15. Ваш первый веб-сайт
16. Подключение электроники к Интернету
17. Создание центра управления Интернетом вещей
с помощью Node-RED
18. Цифровая барабанная установка
19. Игра Hungry Monkey на языке Scratch
20. Робот с дистанционным Wi-Fi управлением

6+

Powered by TCPDF (www.tcpdf.org)

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