Uploaded by inkøgñítô

20 простых проектов на Raspberry Pi Игрушки, инструменты, гаджеты

advertisement
ʟ˖ˋʠ˃ː˕ˑ˔ ˋ ʠ˃˓˃ʠ˃ː˕ˑ˔
ʞʟʝʠʡʪʤ
ʞʟʝʔʙ ʡʝʑ
ː˃
ʗʒʟʢʧʙʗǡ
ʗʜʠʡʟʢʛʔʜʡʪǡ
ʒʏʓʕʔʡʪ
ˋˏːˑˆˑˈ
ˇ˓˖ˆˑˈ
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○ . Игрушки,
инструменты, гаджеты и многое другое / Р. Сантос,
С. Сантос ; пер. с англ. М. А. Федотенко. — Электрон. изд. — М. : Лаборатория знаний, 2020. — 323 с. —
Систем. требования: Adobe Reader XI ; экран 10". —
Загл. с титул. экрана. — Текст : электронный.
ISBN 978-5-00101-884-1
R
Эта книга подходит для всех новичков, которые хотят
максимально использовать возможности 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 ГК РФ при устранении ограничений, установленных техническими средствами защиты авторских прав, правообладатель
вправе требовать от нарушителя возмещения убытков или выплаты компенсации
ISBN 978-5-00101-884-1
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.
Все права защищены.
c Лаборатория знаний, 2020
○
Оглавление
Благодарности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Для кого эта книга?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
О книге . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Что вам понадобится для реализации проектов данной книги? . . . . . .
Структура книги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Руководство для начинающих . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Начало работы с платой Raspberry Pi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Возможности использования Raspberry Pi . . . . . . . . . . . . . . . . . . . . . . . . .
Различия между версиями плат Raspberry Pi . . . . . . . . . . . . . . . . . . . . . . .
Знакомство с Raspberry Pi и ее компонентами . . . . . . . . . . . . . . . . . . . . . .
Список необходимых компонентов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Загрузка операционной системы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
• Загрузка NOOBS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
• Форматирование карты microSD в Windows или macOS . . . . . . . . .
• Форматирование карты microSD в Linux . . . . . . . . . . . . . . . . . . . . . . .
• Загрузка Raspbian на карту памяти microSD . . . . . . . . . . . . . . . . . . . .
Настройка Raspberry Pi в качестве настольного компьютера . . . . . . . .
• Подключение Raspberry Pi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
• Первый запуск вашей Pi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
• Обзор рабочего стола . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
• Выключение, перезагрузка и выход из системы . . . . . . . . . . . . . . . . .
Знакомство с языком Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Интегрированная среда разработки Python 3 . . . . . . . . . . . . . . . . . . . . . . .
Основные команды Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Редактор Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ваша первая программа на Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Разработка простого калькулятора . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
12
13
13
14
14
17
17
19
20
21
24
26
27
27
29
31
31
32
34
37
41
42
42
44
46
47
52
55
СВЕТОДИОДЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Проект 1. Мигание светодиодом. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Знакомство с портами GPIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Оглавление
6
Знакомство со светодиодами. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Подбор подходящего резистора . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Сборка схемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
• Написание скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
• Запуск скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
61
62
63
65
66
67
67
Проект 2. Кнопочный светодиодный фонарик . . . . . . . . . . . . . . . . . . . . .
Знакомство с переключателями и кнопками . . . . . . . . . . . . . . . . . . . . . . .
Сборка схемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
69
71
72
73
Проект 3. Регулятор яркости светодиода . . . . . . . . . . . . . . . . . . . . . . . . . .
Знакомство с потенциометрами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Чтение аналоговых сигналов с помощью Raspberry Pi. . . . . . . . . . . . . . .
• Аналого-цифровые преобразователи. . . . . . . . . . . . . . . . . . . . . . . . . . . .
• Широтно-импульсная модуляция . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Сборка схемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
• Написание скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
• Запуск скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
75
75
76
77
78
79
81
81
83
83
Проект 4. Графический пользовательский интерфейс для
управления многоцветным светодиодом . . . . . . . . . . . . . . . . . . . . . . . . . . .
Знакомство с RGB-светодиодами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Сборка схемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
• Управление интенсивностью цвета и закрытие окна . . . . . . . . . . . .
• Проектирование пользовательского интерфейса с помощью
Tkinter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
• Запуск скрипта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Идеи для продолжения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
85
85
87
88
90
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
Модель В
700 МГц,
700 МГц,
900 МГц, чеодноядерный одноядерный тырехъядерARMv6
ARMv6
ный ARMv7
Pi 3
Модель В
1,2 ГГц, четырехъядерный
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.
29.
30.
31.
32.
33.
34.
Модуль MotoZero.
Двухколесная платформа Smart robot.
Четыре батарейки AA.
Портативное зарядное устройство.
Зажигалка.
Монитор с динамиками и кабелем HDMI.
Наушники.
ПРИМЕЧАНИЕ
Компоненты, обозначенные *, мы рекомендуем покупать сразу наборами. Вам понадобится много таких деталей, а в наборах они
будут дешевле.
Вам также понадобится паяльник, а к нему припой, медная оплетка
для снятия припоя и зажим для пайки «Третья рука». Еще не мешает приобрести острогубцы (плоскогубцы с зауженными губками),
небольшие кусачки и стриппер для снятия изоляции с проводов.
Загрузка операционной системы
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 / downloads /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 /formatter_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
Рис. 0.20. Меню панели задач
Раскройте каждый пункт меню
и посмотрите, что в нем содержится.
Например, пункт Programming (программирование) в своем подменю содержит несколько инструментов для
написания программ на языках Java
и Python.
Файловый менеджер. В левой
части панели задач вы можете найти
значок папки, при нажатии на который запускается файловый менеджер
(рис. 0.21). Файловый менеджер —
это папка с множеством папок внутри нее1, в которых вы можете размещать свои файлы и таким образом
структурировать информацию на вашем компьютере. Папки можно создавать, переименовывать, перемещать
и удалять.
Рис. 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
b
c
d
=
=
=
=
5
7.2
'Привет'
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):
сделать_что-то_третье()
Например, следующий фрагмент кода пытается «угадать» фрукт,
который вы загадали, на основании введенного вами цвета:
1
3
4
5
print('Загадайте фрукт:')
print('клубника, банан или киви?')
color = input ('Введите цвет загаданного фрукта: ')
if (color == 'красный'):
2 print('Загаданный фрукт — клубника.')
elif (color == 'желтый'):
print('Загаданный фрукт — банан.')
elif (color == 'зеленый'):
print('Загаданный фрукт — киви.')
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
Powered by TCPDF (www.tcpdf.org)
Их еще называют колодкой универсальных контактов GPIO. — Прим. перев.
Мигание светодиодом
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
Питание, пост. ток
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
2
Знакомство со светодиодами
61
Окончание табл.
2
Функция
Имя
Номер
вывода
Номер
вывода
Имя
Функция
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
I C ID EEPROM
DNC
27
28
DNC
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
SPI_CE1_N
2
I C ID EEPROM
Серым цветом в таблице выделены выводы 27 и 28 — это выводы DNC (do not connect — не подключаться), к ним нельзя ничего
подключать. Также на вашей Pi есть восемь выводов GND (ground —
земля) для подключения заземления. Они выделены черным цветом.
Красным и оранжевым цветами выделены четыре вывода питания
(5 V и 3.3 V соответственно). Выводы, выделенные желтым цветом,
используются для соединения с шиной SPI, а выделенные зеленым —
для связи между интегральными схемами (I2C). Об этих протоколах
связи вы узнаете в проектах 3 и 7.
ПРЕДУПРЕЖДЕНИЕ
Выводы GPIO рассчитаны на работу при напряжении 3,3 В. Поэтому, если вы подадите на них более высокое напряжение, то можете серьезно повредить свою Pi.
Знакомство со светодиодами
Светодиоды бывают самых разных размеров, цветов и форм. Некоторые из них даже могут смешивать цвета, в результате чего можно получить почти любой цвет. В этом проекте вы будете работать
с простым 5-миллиметровым красным светодиодом.
Мигание светодиодом
62
Рис. 1.2. Красный светодиод
диаметром 5 мм
Светодиод (LED — light-emitting
diode), как понятно из названия, —
это диод, излучающий свет. Диоды —
это электронные компоненты, имеющие полярность, поэтому ток через
них течет только в одном направлении — от положительного вывода
(анода) к отрицательному (катоду).
Две ножки (два вывода) светодиода имеют разную длину, чтобы было
легче отличить положительный вывод
от отрицательного (рис. 1.2). Длинная ножка — анод (+), а короткая —
катод (–).
Подбор подходящего резистора
Сила тока, протекающего через светодиод, не должна превышать
максимального значения, на которое он рассчитан, иначе он может
быстро перегореть. А это может повредить и вашу 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. Микросхема аналого-цифрового преобразователя
MCP3008
Рис. 3.4. Расположение выводов микросхемы 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
Рис. 4.1. Простое смешивание цветов RGB
упрощенная диаграмма смешивания
цветов RGB, которая дает представление о том, как смешивать красный,
зеленый и синий цвета для получения различных цветов.
Существует два вида RGB-светодиодов:
1. Cветодиод с общим анодом, в котором соединены положительные выводы всех светодиодов (рис. 4.2, слева).
2. Cветодиод с общим катодом,
в котором соединены отрицательные
выводы всех светодиодов (рис. 4.2,
справа).
Рис. 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-светодиода с общим катодом к Raspberry 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 -=
return
else:
pos -=
return
85
Color(255 - pos * 3, 0, pos * 3)
170
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. Для этого проекта
мы рекомендуем выбрать именно
этот тип ЖК-дисплеев. Большинство имеющихся в продаже экранов 16 × 2 подойдут вам, однако,
Рис. 6.1. Калькулятор с ЖКчтобы не ошибиться, перед подисплеем
купкой проверьте спецификацию
компонента. Также можно остановиться на ЖК-дисплее 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://openweathermap.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()
6
#запрос данных погоды с openWeatherMap.org
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,
X,
N,
N,
X,
X,
N,
N,
N,
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, X, N, N, N, N,
X, N, X, N, N, X,
X, N, N, X, N, N,
лица
N,
X,
N,
N,
N,
N,
X,
X,
Программирование
151
X,
X,
N,
N,
]
N,
N,
X,
N,
N,
X,
N,
X,
X,
N,
N,
X,
N,
N,
N,
X,
N,
X,
N,
X,
N,
N,
X,
N,
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, как показано в следующей формуле:
⎛
F =⎜ C×
⎝
9⎞
⎟ + 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).
В корпусе зуммера находится диск,
который вибрирует с определенной частотой, когда на него подается напряжение. Подключить пьезоэлектрический
зуммер совсем несложно: подключите
один провод к выводу GND на вашей Pi,
а другой — к порту GPIO.
Рис. 11.2. Пьезоэлектрический зуммер
Сборка схемы
Вам нужно подключить к 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
3
4
5
6
camera = picamera.PiCamera()
camera.resolution = (640, 480)
camera.start_recording('videotest.h264')
camera.wait_recording(60)
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/xmixed-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:
1
2
3
header {
background: url(background.jpg);
background-size: cover;
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. Существует бесконечное множество способов изменить и улучшить созданную вами веб-страницу. Например, вы можете:
• Добавить к главной странице еще несколько страниц и организовать навигацию между ними с помощью гиперссылок.
• Создать веб-страницу для одного из ваших проектов с Raspberry 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 позволяет просто и быстро прототипировать сложные системы домашней
автоматизации, оставляя больше времени на разработку и создание
вещей, которые вам действительно интересны.
В данном проекте мы не будем разбирать все возможности NodeRED, но если вы заинтересуетесь ими, вот краткий перечень функций, которые можно реализовать:
• Доступ к портам 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 nodedht-sensor
pi@raspberrypi:~ $ sudo npm install --unsafe-perm -g nodered-contrib-dht-sensor
pi@raspberrypi:~ $ sudo npm install --unsafe-perm -g nodered-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
В данном проекте в качестве скрипта вы создадите поток в NodeRED. Этот поток позволит вам сделать следующее:
Создание центра управления Интернетом вещей с помощью 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
В вашем приложении есть: переключатель для управления первым
светодиодом, который, кроме того, может автоматически загораться
и выключаться в заданное вами время; слайдер для управления яркостью второго светодиода; график для отображения температуры
и индикатор влажности.
Идеи для продолжения
Сейчас вы познакомились лишь с некоторыми возможностями NodeRED. Вот несколько идей для дальнейшего развития этого проекта:
• Замените светодиод на лампу и реле (с ними вы уже работали
в проекте 16).
• Добавьте в ваше приложение еще какие-нибудь датчики, например датчик дыма и датчик движения.
Игры
и игрушки
СТОИМОСТЬ: $
ПРИМЕРНОЕ ВРЕМЯ СБОРКИ: 1 час
ПЕРЕЧЕНЬ КОМПОНЕНТОВ:
• Raspberry Pi
• Макетная плата
• Кнопки, 8 шт.
• Наушники или монитор с динамиками, подключаемый к Pi через HDMI
• Соединительные провода
НЕОБХОДИМОЕ ПО:
• avconv
18
Цифровая барабанная
установка
В этом проекте вы создадите цифровую барабанную установку с кнопочным управлением. Для этого понадобится лишь макетная плата и несколько
кнопок. При нажатии кнопок будут воспроизводиться различные звуки барабана, в том числе
две барабанные дроби.
В проекте будут использоваться семплы (образцы звуков) из библиотеки семплов Sonic Pi, но вы можете взять любые найденные вами
звуковые файлы.
Подготовка аудиофайлов
Сначала нужно правильно настроить звук Raspberry Pi и активировать возможность использования семплов из Sonic Pi.
Настройка аудио
Итак, подключите наушники или динамики к аудиоразъему Raspberry 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
ambi_dark_woosh.flac
drum_cowbell.flac
drum_cymbal_closed.flac
elec_ping.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. Выбор фона
из библиотеки
В левой части области управления спрайтами можно выбрать фон для своей игры.
Там вы найдете набор значков для фона.
Чтобы выбрать фон из библиотеки, щелкните по первому значку (рис. 19.4). Мы выбрали фон с именем blue sky (синее небо).
Теперь ваша область управления спрайтами должна выглядеть, как показано
на рис. 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.
1
2
3
Рис. 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 в качестве
настольного компьютера, она должна автоматически запускать NodeRED при включении. Для удаленного выключения 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. Эта модель имеет видеоразъем miniHDMI и два разъема 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, нажав значок WiFi в правом верхнем углу рабочего стола. После этого введите пароль
своей сети 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 nodered-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 уже занята — установлена на двухколесную
платформу робота, поэтому проще всего создавать приложение NodeRED, а затем и управлять роботом с помощью обычного настольного
компьютера или ноутбука.
В первую очередь вам нужно узнать 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 Должен открыться веб-сервер NodeRED вашей Raspberry Pi.
ПРИМЕЧАНИЕ
Для знакомства с Node-RED см. проект 17.
Робот с дистанционным Wi-Fi-управлением
310
В правом верхнем углу окна выберите вкладку dashboard, внутри
которой на вкладке Layout (макет)
создайте новую вкладку с именем
Робот. Затем внутри вкладки Робот создайте две группы — Главная
и Выключение (рис. 20.5). В группе
Главная (Main) вы разместите кнопки для управления роботом, а в группе Выключение (Poweroff) — кнопку
Рис. 20.5. Макет приложения
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
–M1
Enable
M2
+M2
–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
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
SPI_MISO
GPIO 9
21
22
GPIO 25 GPIO_ GEN6
SPI_CLK
GPIO 11
23
24
GPIO 8
Питание, пост. ток
GND
GND
SPI_CE0_N
Приложения
318
Окончание табл.
Функция
2
I C ID EEPROM
Обозначение
Номер
вывода
Номер
вывода
Обозначение
GND
25
26
GPIO 7
DNC
27
28
DNC
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
Функция
SPI_CE1_N
I2C ID EEPROM
Платы 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
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
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
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
SDA0, I C
Питание, пост. ток
GND
GND
Приложение Б. Таблица цветовой маркировки резисторов
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%
±0,05%
Серый
8
8
8
10 Ом =
= 100 МОм
Белый
9
9
9
109 Ом =
= 1000 МОм
8
Погрешность
Золотой
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)
Download