/
Автор: Монк С.
Теги: программные средства компьютерные технологии микроэлектроника операционные системы машинное обучение
ISBN: 978-601-08-4607-4
Год: 2024
Текст
FOURTH EDITION
Raspberry Pi Cookbook
Software and Hardware
Prohlems and Solutions
Dr. Simon Monk
Beijing • Boston • Farnham • Sebastopol • Tokyo
o·REILLY'
Саймон Монк
Raspberry Pi
Сборник рецептов
4-е издание
Астана
«АЛИСТ»
2024
УДК
ББК
004.4
32.973.26-018.2
М77
МонкС.
М77
Raspberry Pi. Сборник рецеmов. 2024. - 592 с.: ил.
4-е изд.: Пер. с англ.
Астана:
-
АЛИСТ,
ISBN 978-601-08-4607-4
Книга содержит более
Pi,
200
рецепrов по работе с микрокомпьютером
Raspberry
рассматривающих как программные, так и аппаратные задачи. Показана уста
новка и настройка операционной системы для
Raspberry Pi, подкmочение датчиков
Raspberry Pi в систему умного дома и сеть Ин
тернета вещей. Рассмотрен язык Python в контексте программирования микрокон
троллеров, разобраны продвинутые возможности Python, важные при создании
и двигателей, способы инrеграции
сценариев и автомагизации процессов. В четвертом издании добавлены главы, рас
сказывающие о возможностях машинного обучения и о работе с уменьшенной вер
сией платы -
Raspberry Pi Pico.
Для специш,истов по
Raspberry Pi и
программированию электроники
ББК
УДК 004.4
32.973.26-018.2
© 2024 ALIST LLP
Authoriz.ed Russian translation ofthe English edition of RtlSJ]Ьnтy Pi CookЬook, 4Е, ISBN 9781098130923
© 2023 Simon Monk.
•
This translation is puЬlished and sold Ьу permission ofO'Reilly Media, Inc., which owns or controls all rights to puЬlish
and sell the same.
Авторизованный перевод с английского языка на русский ~nдання
ISBN 9781098130923
С,
RtlSJ]beny Pi Cookbook,
4Е,
2023 Sirnon Monk.
Перевод опубликован н продастся с разрешения компании-правообладателя
ISBN 978-1-098-13092-3 (англ.)
ISBN 978-601-08-4607-4 (каз.)
О
O'Reilly Media, Inc.
Sirnon Monk, 2023
О Издание на русском языке. ТОО "АЛИСТ",
2024
Оглавление
Предисловие к четвертому изданию .......................................................................... 14
Как пользоваться этой книгой?
.................................................................................................... 15
Условные обозначения .................................................................................................................. 16
Использование примеров кода ..................................................................................................... 16
Как с нами связаться? .................................................................................................................... 17
Благодарности ................................................................................................................................ 18
Глава
1. Настройка
и управление .............................................................................. 19
1.0. Введение .................................................................................................................................. 19
1.1. Выбор модели Raspberry Pi .................................................................................................... 19
1.2. Подключение компонентов системы .................................................................................... 24
1.3. Как снабдить устройство Raspberry Pi корпусом? ............................................................... 26
1.4. Выбор источника питания ..................................................................................................... 29
1.5. Выбор операционной системы .............................................................................................. 32
1.6. Установка операционной системы с помощью программы Raspberry Pi Imager .............. 33
1.7. Первая загрузка устройства Raspberry Pi ............................................................................. 35
1.8. Настройка Raspberry Pi для работы в бездисплейном режиме ........................................... 37
1.9. Загрузка с внешнего жесткого диска или флеш-накопителя с интерфейсом USB ........... 39
1.1 О. Подключение монитора с разъемом DVI или VGA .......................................................... .41
1.11. Использование монитора/телевизора с композитным видеовходом ............................... 42
1.12. Настройка размера изображения, выводимого на экран монитора .................................. 44
1.13. Обеспечение максимальной производительности устройства ........................................ .46
1.14. Изменение своего пароля ..................................................................................................... 48
1.15. Выключение устройства Raspberry Pi ................................................................................ .49
1.16. Подключение к Raspberry Pi модуля камеры ..................................................................... 51
1.17. Использование интерфейса Bluetooth ................................................................................. 54
Глава
2. Работа
с сетями
.............................................................................................. 57
2.0. Введение .................................................................................................................................. 57
2.1. Подключение к проводной сети ............................................................................................ 57
2.2. Определение IР-адреса устройства ....................................................................................... 59
2.3. Настройка статического IР-адреса ........................................................................................ 60
2.4. Задание сетевого имени устройству Raspberry Pi ................................................................ 63
2.5. Настройка беспроводного подключения .............................................................................. 65
2.6. Подключение с помощью консольного кабеля .................................................................... 67
2. 7. Удаленное управление устройством Raspberry Pi с использованием протокола SSH ........ 72
2.8. Удаленное управление устройством Raspberry Pi с использованием протокола VNC ....... 74
2.9. Использование Raspberry Pi в качестве сетевого хранилища ............................................. 76
2.1 О. Настройка сетевого принтера .............................................................................................. 79
6
Оглавление
Глава
3.
Операционная система ................................................................................. 82
3.0. Введение .................................................................................................................................. 82
3.1. Работа с файлами с использованием графического интерфейса ........................................ 82
3.2. Копирование файлов на флеш-накопитель с интерфейсом USB ....................................... 84
3.3. Открытие окна терминала ...................................................................................................... 85
3.4. Перемещение по файловой системе с использованием терминала .................................... 87
3.5. Копирование файла или папки .............................................................................................. 90
3.6. Переименование файла или папки ...................................................................................... .,92
3.7. Редактирование файла ............................................................................................................ 92
3.8. Просмотр содержимого файла .............................................................................................. 95
3.9. Создание файла без использования редактора .................................................................... 95
3.10. Создание каталога ................................................................................................................ 96
3.11. Удаление файла или каталога .............................................................................................. 97
3.12. Выполнение задач с правами суперпользователя .............................................................. 98
3.13. Что такое права доступа к файлам? .................................................................................... 99
3.14. Изменение прав доступа к файлам .................................................................................... 101
3.15. Изменение информации о владельце файла ..................................................................... 102
3 .16. Получение снимка экрана .................................................................................................. 103
3.17. Установка программного обеспечения с помощью менеджера пакетов apt ................. 104
3.18. Удаление программного обеспечения, установленного с помощью менеджера
пакетов apt ........................................................................................................................... 106
3 .19. Установка Руthоn-пакетов с помощью утилиты рiрЗ ...................................................... 107
3 .20. Скачивание файлов в окне терминала .............................................................................. 107
3.21. Скачивание исходного кода с помощью утилиты Git ..................................................... 108
3.22. Скачивание кода, используемого в этой книге ................................................................ 111
3 .23. Автоматический запуск программы на этапе начальной загрузки ................................ 113
3 .24. Автоматический запуск программы в качестве службы ................................................. 114
3.25. Автоматический запуск программы с регулярным временным интервалом ................ 116
3 .26. Поиск файла ........................................................................................................................ 117
3.27. Использование истории командной строки ..................................................................... 118
3.28. Отслеживание степени загруженности процессора ......................................................... 120
3.29. Работа с файловыми архивами .......................................................................................... 122
3.30. Отображение списка подключенных USВ-устройств ..................................................... 123
3.31. Пере направление вывода из командной строки в файл .................................................. 123
3.32. Конкатенация файлов ......................................................................................................... 124
3.33. Использование конвейеров ................................................................................................ 125
3.34. Скрытие вывода команд в окне терминала ...................................................................... 125
3.35. Запуск программ в фоновом режиме ................................................................................ 126
3.36. Создание псевдонима команды ......................................................................................... 127
3.37. Настройка даты и времени ................................................................................................. 128
3.38. Получение информации об объеме доступного пространства на SD-карте .................. 128
3.39. Получение информации об используемой версии операционной системы .................. 129
3.40. Обновление операционной системы Raspberry Pi OS ..................................................... 130
Глава
4.0.
4.1.
4.2.
4.3.
4. Использование
готового программного обеспечения
.......................... 132
Введение ................................................................................................................................ 132
Создание медиацентра
......................................................................................................... 132
Установка рекомендуемого программного обеспечения .................................................. 134
Использование офисного программного обеспечения ...................................................... 136
Оглавление
7
4.4. Запуск эмулятора винтажной игровой приставки ............................................................. 138
4.5. Превращение устройства Raspberry Pi в FМ-передатчик ................................................. 140
4.6. Редактирование растровых изображений ........................................................................... 142
4.7. Редактирование векторных изображений .......................................................................... 143
4.8. Использование приложения Bookshelf ............................................................................... 145
4.9. Прослушивание интернет-радио ......................................................................................... 146
4.1 О. Использование программы Visual Studio Code ................................................................ 147
4.11. Управление лазерным гравером ........................................................................................ 149
Глава
5.
Основы программирования на языке
Python ........................................ 154
5.0. Введение ................................................................................................................................ 154
5.1. Выбор между Python 2 и Python 3 ....................................................................................... 154
5.2. Выбор редактора кода для языка Python ............................................................................ 155
5.3. Редактирование Руthоn-программ в редакторе Thonny ..................................................... 156
5.4. Редактирование Руthоn-программ в редакторе Mu ........................................................... 158
5.5. Использование консоли языка Python ................................................................................ 162
5.6. Запуск Руthоn-программ из терминала ............................................................................... 164
5.7. Присвоение значений переменным ..................................................................................... 165
5.8. Отображение результатов .................................................................................................... 166
5.9. Чтение пользовательского ввода ......................................................................................... 167
5 .1 О. Использование арифметических операторов ................................................................... 167
5.11. Создание строк .................................................................................................................... 169
5.12. Конкатенация (объединение) строк .................................................................................. 170
5.13. Преобразование чисел в строки ........................................................................................ 171
5.14. Преобразование строки в число ........................................................................................ 171
5.15. Определение длины строки ......................... :..................................................................... 172
5.16. Определение позиции подстроки в строке ....................................................................... 173
5.17. Извлечение части строки ................................................................................................... 173
5.18. Замена в строке одной подстроки на другую ................................................................... 175
5.19. Перевод строки в верхний или нижний регистр .............................................................. 17 5
5.20. Условное выполнение команд: оператор if...................................................................... 176
5.21. Сравнение значений ........................................................................................................... 177
5.22. Использование логических операторов ............................................................................ 179
5.23. Выполнение цикла определенное количество раз ........................................................... 180
5.24. Выполнение цикла до изменения результата условия .................................................... 181
5.25. Выход из цикла ................................................................................................................... 181
5.26. Определение функции в языке Python .............................................................................. 182
Глава
6.0.
6.1.
6.2.
6.3.
6.4.
6.5.
6.6.
6.7.
6.8.
6.
Списки и словари в языке
Python ............................................................ 186
Введение ................................................................................................................................
186
Создание списка .................................................................................................................... 186
Осуществление доступа к элементам списка ..................................................................... 187
Определение длины списка
................................................................................................. 188
Добавление элементов в список .......................................................................................... 188
Удаление элементов из списка ............................................................................................ 189
Создание списка путем синтаксического анализа строки .................................................
Итеративный обход списка ..................................................................................................
190
191
Итеративный обход элементов списка с одновременным извлечением индекса
элементов ............................................................................................................................... 192
8
Оглавление
6.9. Проверка наличия в списке определенного элемента ....................................................... 193
6.1 О. Сортировка списка .............................................................................................................. 194
6.11. Вырезание части списка ..................................................................................................... 194
6.12. Использование генератора списков .................................................................................. 195
6.13. Создание словаря ................................................................................................................ 197
6.14. Доступ к словарю ............................................................................................................... 199
6.15. Удаление элементов словаря ............................................................................................. 200
6.16. Итеративный обход словаря .............................................................................................. 200
Глава
7. Продвинутые
возможности языка
Python .............................................. 202
7.0. Введение ................................................................................................................................ 202
7.1. Форматирование чисел ........................................................................................................ 202
7.2. Форматирование значений даты и времени ....................................................................... 204
7.3. Возвращение нескольких значений .................................................................................... 205
7.4. Определение класса .............................................................................................................. 206
7.5. Определение метода ............................................................................................................. 208
7.6. Наследование ........................................................................................................................ 209
7.7. Запись данных в файл .......................................................................................................... 210
7.8. Чтение данных из файла ................................................... :.................................................. 211
7.9. Использование модулярiсklе для выгрузки и загрузки данных из файла ....................... 212
7.10. Обработка исключений ...................................................................................................... 213
7.11. Использование модулей ..................................................................................................... 215
7.12. Генерирование случайных чисел ...................................................................................... 217
7.13. Выполнение сетевых запросов из Python-кoдa ................................................................ 218
7 .14. Указание аргументов командной строки в языке Python ................................................ 219
7.15. Запуск команд Linux из Python-кoдa ................................................................................. 220
7.16. Отправка электронных писем из Python-кoдa .................................................................. 221
7.17. Создание простого веб-сервера на языке Python ............................................................. 224
7.18. «Ничегонеделание» в языке Python .................................................................................. 226
7.19. Одновременное выполнение нескольких задач ............................................................... 227
7.20. Синтаксический анализ данных в формате JSON ........................................................... 229
7.21. Сохранение словарей в виде JSОN-файла ........................................................................ 231
7.22. Создание пользовательских интерфейсов ........................................................................ 232
7.23. Применение регулярных выражений для поиска совпадений в тексте
по заданному шаблону ....................................................................................................... 234
7.24. Применение регулярных выражений для проверки корректности
введенных данных .............................................................................................................. 23 7
7.25. Применение регулярных выражений для автоматического извлечения данных
из веб-страниц ..................................................................................................................... 238
Глава
8. Компьютерное зрение ............................................................................ а••·· 240
8.0. Введение ................................................................................................................................ 240
8.1. Установка библиотеки OpenCV .......................................................................................... 240
8.2. Настройка USВ-камеры для использования в системе компьютерного зрения ............. 241
8.3. Использование модуля камеры для RаsрЬепу Pi в системе компьютерного зрения ......... 243
8.4. Подсчет количества монет ................................................................................................... 244
8.5. Распознавание лиц ................................................................................................................ 247
8.6. Регистрация движения ......................................................................................................... 250
8.7. Извлечение текста из изображения ..................................................................................... 253
Оглавление
Глава
1
9
9. Машинное обучение .................................................................................... 254
9.0. Введение ................................................................................................................................ 254
9.1. Распознавание объектов в видеопотоке с помощью библиотеки TensorFlow Lite ......... 255
9.2. Реагирование на наличие объектов в видеопотоке с помощью библиотеки
TensorFlow Lite ..................................................................................................................... 257
9.3. Распознавание звуков с помощью библиотеки TensorFlow Lite ...................................... 260
9.4. Реагирование на свист с·помощью библиотеки TensorFlow Lite ..................................... 261
9.5. Установка платформы Edge Impulse .............. ;.................................................................... 264
9.6. Распознавание речевых команд (с помощью облачного сервиса) ................................... 265
9.7. Распознавание речевых команд (локальное) ...................................................................... 270
9.8. Реагирование на речевые команды в Python-кoдe ............................................................. 273
Глава
10. Основы
работы с оборудованием ........................................................... 276
1О.О. Введение .............................................................................................................................. 276
10.1. Знакомство с разъемом GPIO ............................................................................................ 276
10.2. Использование разъема GPIO на устройстве Raspberry Pi 400 ...................................... 279
10.3. Как не вывести из строя Raspberry Pi при использовании разъема GPIO ..................... 281
10.4. Настройка интерфейса I2C ................................................................................................. 282
10.5. Использование пакета i2c-too/s ......................................................................................... 284
10.6. Настройка интерфейса SPI ................................................................................................. 286
10.7. Установка библиотекируsеriа/ для обеспечения доступа
к последовательному порту из Python-кoдa ..................................................................... 287
10.8. Установка утилиты Minicom для тестирования последовательного порта ................... 288
10.9. Использование макетной платы и соединительных проводов ....................................... 290
10.1 О. Использование «осьминожноrо» модуля RaspЬerry Squid ............................................ 29 l
10.11. Использование «осьминожноrо» модуля кнопки Raspberry Squid Button ................... 293
10.12. Преобразование уровня сигнала с 5 до 3,3 В с помощью двух резисторов ................ 295
10.13. Преобразование уровня сигналов с 5 до 3,3 В с помощью модуля
преобразователя уровней ................................................................................................. 296
10.14. Запитывание Raspberry Pi от литий-полимерного аккумулятора ................................. 297
10.15. Основы работы с платой Sense НАТ ............................................................................... 299
10.16. Основы работы с платой Explorer НАТ Pro .................................................................... 301
10.17. Создание собственной платы стандарта НАТ ................................................................ 302
10. 18. Использование моделей Raspberry Pi Zero 2 и Zero 2 W ............................................... 305
Глава
11. Управление оборудованием ..................................................................... 307
11.0. Введение .............................................................................................................................. 307
11.1. Подключение светодиода ................................................................................................. .307
11.2. Перевод контактов GPIO в безопасное состояние перед выходом из программы ....... 311
11.3. Управление яркостью светодиода ..................................................................................... 312
11.4. Коммутация мощных устройств постоянного тока с помощью транзистора ............... 314
11.5. Коммутация мощных устройств с помощью реле .......................................................... .317
11.6. Коммутация устройств с помощью твердотельного реле ............................................... 320
11. 7. Управление высоковольтными устройствами переменного тока .................................. 322
11.8. Управление оборудованием с помощью смартфона на ОС Android и технологии
Bluetooth .............................................................................................................................. 323
11.9. Создание пользовательского интерфейса для включения и выключения устройств ...... 326
11.1 О. Создание пользовательского интерфейса для ШИМ-управления мощностью
светодиодов и двигателей ................................................................................................ 327
Оглавление
10
11.11.
11.12.
Создание пользовательского интерфейса для изменения цвета RGВ-светодиода ........ 329
Использование аналогового измерителя в качестве устройства отображения
Глава
........... 331
12. Двигатели .................................................................................................... 334
12.0. Введение .............................................................................................................................. 334
12.1. Управление сервоприводами ............................................................................................. 334
12.2. Прецизионное управление сервоприводами .................................................................... 339
12.3. Прецизионное управление несколькими сервоприводами ............................................. 342
12.4. Управление скоростью вращения двигателя постоянного тока ..................................... 345
12.5. Управление направлением вращения двигателя постоянного тока ............................... 347
12.6. Использование униполярного шагового двигателя ......................................................... 350
12.7. Использование биполярного шагового двигателя ........................................................... 355
12.8. Управление биполярным шаговым двигателем с помощью платы стандарта НАТ ....... 357
Глава
13. Цифровые
входы
....................................................................................... 360
13.0. Введение .............................................................................................................................. 360
13.1. Подключение кнопки ......................................................................................................... 360
13.2. Использование кнопки для переключения между двумя состояниями ......................... 363
13.3. Использование двухпозиционного или ползункового переключателя .......................... 365
13.4. Использование трехпозиционного переключателя с выключением
в среднем положении ......................................................................................................... 366
13.5. Устранение дребезга контактов, возникающего при нажатии кнопки .......................... 369
13.6. Использование внешнего подтягивающего резистора .................................................... 370
13.7. Использование импульсного датчика угла поворота ...................................................... 372
13.8. Использование цифровой клавиатуры .............................................................................. 375
13.9. Обнаружение движения ..................................................................................................... 379
13.1 О. Подключение к Raspbeпy Pi GРS-модуля ...................................................................... 381
13 .11. Перехват нажатий клавиш ............................................................................................... 383
13.12. Перехват движений мыши ............................................................................................... 385
13.13. Снабжение устройства Raspbeпy Pi кнопкой питания .................................................. 386
Глава
14. Датчики ....................................................................................................... 390
14.0. Введение .............................................................................................................................. 390
14.1. Использование резистивных датчиков ............................................................................. 390
14.2. Измерение освещенности .................................................................................................. 394
14.3. Измерение температуры с помощью термистора ............................................................ 396
14.4. Обнаружение загазованности метаном ............................................................................. 398
14.5. Измерение качества воздуха (концентрации СО 2 ) ......................................................... .401
14.6. Измерение влажности почвы ............................................................................................ .403
14.7. Измерение напряжения ...................................................................................................... 406
14.8. Снижение напряжения перед его измерением ................................................................ .409
14.9. Использование резистивных датчиков совместно с АЦП .............................................. 411
14.10. Измерение температуры с помощью АЦП ..................................................................... 413
14.11. Измерение температуры процессора устройства Raspbeпy Pi ..................................... 415
14.12. Измерение температуры, влажности и давления с помощью платы Sense НА Т ........ 416
14.13. Измерение температуры с помощью цифрового датчика ............................................ .418
14.14. Измерение ускорения с помощью модуля MMA8452Q ............................................... .421
14.15. Определение направления на магнитный север с помощью платы Sense НА Т ......... .426
14.16. Использование инерциального измерительного блока платы Sense НА Т ................. .427
Оглавление
11
14.17. Обнаружение магнита с помощью геркона .................................................................... 428
14.18. Обнаружение магнита с помощью платы Sense НА Т ................................................... 429
14.19. Измерение расстояния с помощью ультразвука ............................................................ 430
14.20. Измерение расстояния с помощью датчика времени пролета (Time-of-Flight) ......... .433
14.21. Наделение устройства Raspberry Pi тактильным интерфейсом .................................... 436
14.22. Чтение смарт-карт с помощью устройства для чтения/записи RFID-кapт ................. .438
14.23. Отображение показаний датчика ................................................................................... .442
14.24. Сохранение результатов измерений на флеш-накопителе с интерфейсом USB ......... 443
Глава
15. Дисплеи ........................................................................................................ 447
15.0. Введение .............................................................................................................................. 447
15 .1. Использование четырехразрядного светодиодного индикатора ................................... .44 7
15.2. Отображение графики на светодиодной матрице с интерфейсом I2c ........................... 450
15.3. Использование светодиодного матричного дисплея платы Sense НАТ ........................ 452
15.4. Использование графического ОLЕD-дисплея .................................................................. 454
15.5. Использование адресуемой светодиодной ленты из RGВ-светодиодов ........................ 457
15.6. Использование платы Pimoroni Unicom НА Т .................................................................. 461
15. 7. Использование дисплея на основе «электронной бумаги» ............................................. 462
Глава
16.
Звук
.............................................................................................................. 465
16.0. Введение ............................................................................................................................. .465
16.1. Подключение акустической системы ............................................................................... 465
16.2. Выбор выходного аудиоустройства ................................................................................. .467
16.3. Воспроизведение звука на устройстве Raspberry Pi, не имеющем аудиоразъема ........ 468
16.4. Воспроизведение звука из командной строки ................................................................. .470
16.5. Воспроизведение звука из Python-кoдa ............................................................................ 471
16.6. Использование USВ-микрофона ...................................................................................... .472
16.7. Генерирование зуммерного сигнала ................................................................................ .474
Глава
17.
Интернет вещей
......................................................................................... 476
17.0. Введение .............................................................................................................................. 476
17.1. Управление выходами GPIO с помощью веб-интерфейса ............................................. .476
17 .2. Отображение показаний датчиков на веб-странице ........................................................ 481
17.3. Основы работы с редактором Node-RED ........................................................................ .484
17.4. Отправка электронных писем и других уведомлений с помощью сервиса IFТТТ ........ .488
17 .5. Отправка твитов с помощью сервиса ThingSpeak .......................................................... .493
17.6. Изменение цвета светодиодов с помощью сервиса CheerLights .................................... 495
17. 7. Отправка показаний датчика в канал сервиса ThingSpeak .............................................. 497
17 .8. Реагирование на твиты с использованием сервисов Dweet и IFTTT ............................. 500
Глава
18. Домашняя
автоматизация
....................................................................... 504
18.0. Введение .............................................................................................................................. 504
18.1. Превращение Raspberry Pi в брокер сообщений с помощью Mosquitto ........................ 504
18.2. Использование редактора Node-RED совместно с МQТТ-сервером ............................. 507
18.3. Прошивка умного выключателя Sonoffнa основе Wi-Fi под использование
протокола MQTT ................................................................................................................ 513
18.4. Настройка умного выключателя Sonoffнa основе Wi-Fi ................................................ 519
18.5. Управление подключаемым к Интернету выключателем Sonoff
с помощью протокола MQTT ............................................................................................ 521
18.6. Управление выключателем Sonoff с помощью редактора Node-RED ........................... 524
Оглавление
12
18.7.
Включение и выключение различных приборов с помощью расширения
Dashboard
Node-RED ................................................................................................... 527
18.8. Выполнение запланированных действий с помощью редактора Node-RED ................ 532
18.9. Публикация МQТТ-сообщений с помощью платы Wemos DI ...................................... 534
18.10. Управление платой Wemos DI с помощью редактора Node-RED ............................... 537
ДJIЯ редактора
Глава
19. Raspberry Pi Pico и Pico W ....................................................................... 540
19.0. Введение .............................................................................................................................. 540
19.1. Подключение устройства Pico или Pico W к компьютеру .............................................. 542
19.2. Использование консоли языка Python на устройстве Pico .............................................. 545
19.3. Использование устройства Pico совместно с макетной платой ...................................... 547
19.4. Использование цифровых выходов устройства Pico ....................................................... 549
19.5. Использование цифровых входов устройства Pico .......................................................... 552
19.6. Использование аналоговых выходов (ШИМ) устройства Pico ...................................... 554
19. 7. Использование аналоговых входов устройства Pico ....................................................... 555
19.8. Управление сервоприводом с помощью устройства Pico ............................................... 558
19.9. Использование файловой системы устройств Pico и Pico W .......................................... 561
19.1 О. Использование второго ядра процессора ....................................................................... 564
19.11. Запуск веб-сервера с интерфейсом Wi-Fi на устройстве Pico W .................................. 565
19.12. Использование аналогов устройства Pico ...................................................................... 569
19.13. Использование устройства Pico с питанием от батареек .............................................. 572
Приложение
1. Поставщики
и комплектующие .................................................... 574
Поставщики .................................................................................................................................. 574
Оборудование и комплекты ДJIЯ прототипирования
................................................................ 575
......................................................................................................... 576
Транзисторы и диоды .................................................................................................................. 576
Интегральные схемы ................................................................................................................... 577
Оmоэлектроника ......................................................................................................................... 577
Модули ......................................................................................................................................... 577
Прочее ........................................................................................................................................... 579
Резисторы и конденсаторы
Приложение
2.
Схема расположения выводов устройства
Raspberry Pi ......... 580
Raspberry Pi 400/4/3/2, модели В, В+, А+, Zero ......................................................................... 580
Raspberry Pi, модель В второй ревизии, модель А ................................................................... 580
Raspberry Pi, модель В первой ревизии ..................................................................................... 581
Raspberry Pi Pico .......................................................................................................................... 581
Предметный указатель ............................................................................................... 582
Об авторе ....................................................................................................................... 590
Об изображении на обложке ...................................................................................... 591
Моей покойной матери Энн Кемп (Аппе Кетр, 1924-2022),
чье умение радоваться жизни и смеяться перед лицом невзгод
были примером для нас всех
Предисловие
к четвертому изданию
Появившийся на свет в
2011
году мини-компьютер
Raspberry Pi
нашел свое приме
нение одновременно и в качестве очень дешевого компьютера на базе
Linux,
и в качестве платформы встраиваемых компьютеров. Эти устройства стали в рав
ной мере популярными и среди преподавателей, и среди любителей электроники.
На момент подготовки этой книги продано уже более
Raspberry Pi.
Модель
Raspberry Pi 4
в версии с
8
40
миллионов устройств
Гбайт памяти наделяет эту плат
форму более чем достаточной мощностью для ее использования в качестве замены
настольного компьютера, а версия
Pi 400
со встроенной клавиатурой делает ее еще
более подходящей для этой цели.
В немалой степени популярности платформы способствует также возможность ис
пользования на ней свободно распространяемого ПО для
Linux,
включая браузеры,
программы для работы с электронной почтой, офисные пакеты, графические редак
торы и все такое прочее.
В то же время даже последние модели
ны разъемом
GPIO,
Raspberry Pi 4 и Pi 400
по-прежнему снабже
с помощью которого любители электроники могут легко под
ключать к ним созданные ими собственные электронные схемы.
В это издание внесено,
по сравнению с предыдущим,
множество изменений,
имеющих целью включения в него информации о новых моделях
Raspberry Pi
и
о тех дополнениях и улучшениях, которые были сделаны в операционной системе
Raspberry Pi OS,
на которой работают эти устройства. В частности, в книгу добав
лены главы по следующим темам:
♦
машинное обучение;
♦
Raspberry Pi Pico
и
Pico W.
Книга организована таким образом, чтобы ее можно было читать последовательно,
как обычную книгу, или выбирать рецепты в произвольном порядке. При желании
вы можете сразу перейти к нужному вам рецепту, найдя ссылку на него в оглавле
нии или в предметном указателе. Если рецепт предполагает знание некоторых дру
гих тем, то в нем даются ссылки на соответствующие другие рецепты, подобно
тому, как кулинарная книга может делать отсылки к рецептам приготовления про
стейших соусов перед описанием более сложных рецептов.
Мир мини-компьютеров
Raspberry Pi
подвержен стремительным изменениям. Бла
годаря большому и активному сообществу поклонников, для этой платформы по
стоянно разрабатываются новые интерфейсные платы и библиотеки программного
Предисловие к четвертому изданию
15
1
обеспечения. Наряду с примерами использования определенных интерфейсных
плат или программ, в книге также рассматриваются базовые принципы использова
ния этой платформы, чтобы вам было проще разобраться в том, как следует ис
пользовать те новые технологии, которые появляются по мере развития экосистемы
Raspberry Pi.
Как и можно бьmо ожидать, текст книги сопровождается большим количеством
кода
(значительная часть
Python).
которого
представляет собой
программы
на языке
Все эти программы являются свободно распространяемыми и доступны
GitHub. Для выполнения большинства программных ре
для скачивания на сайте
цептов вам не потребуется что-либо еще, помимо устройства
мендую использовать
Raspberry Pi 3 или 4 модели В.
Raspberry Pi.
Я реко
А приводя рецепты, предпола
гающие создание собственного оборудования для взаимодействия с
Raspberry Pi,
я старался использовать готовые модули или беспаечную макетную плату в сочета
нии с соединительными проводами, чтобы вам не нужно было что-либо паять.
Если вы хотите, чтобы проекты, скомпонованные вами на базе беспаечной макет
ной платы, бьmи в дальнейшем выполнены более основательно, я рекомендую вам
использовать платы для прототипирования такой же компоновки, что и у макетной
платы половинного размера,
наподобие тех, что предлагает компания
-
Adafruit.
Это позволит вам легко перенести свою схему на плату с паяными соединениями.
Как пользоваться этой книгой?
Поскольку книга представляет собой сборник рецептов, ее необязательно читать
последовательно от первой до последней страницы. Отдельные рецепты сгруппи
рованы в ней в главы. Если для выполнения определенного рецепта требуется зна
ние другой темы, читателю дается ссьmка на тот рецепт, который эту тему освеща
ет. Это позволит вам последовательно переходить от рецепта к рецепту, пытаясь
добиться нужного результата от своей схемы на базе
Raspberry Pi.
В зависимости от того, к какой разновидности читателей вы относитесь, вы можете
воспользоваться одним из нескольких способов прочтения этой книги:
♦
читатель, впервые знакомящийся с
Raspberry Pi.
Прочитайте основную часть материала, изложенного в главах
мум рецепты
1.1, 1.2
и
1.4,
1-3, -
как мини
после чего можно продолжить чтение в произволь
ном порядке;
♦
читатель, изучающий
Python.
Raspberry Pi научиться
4-7. Возможно, при этом
Если вы хотите с помощью
Python,
прочитайте главы
программировать на языке
вам потребуется несколько
раз вернуться к рецептам, изложенным в предыдущих главах;
♦ читатель, увлекающийся сборкой электронных схем.
Если вы еще не умеете писать программы на
стоит этому
научиться, прочитав предварительно главы
главы
Python, вам сначала
4-7. Затем прочитайте
8
и
9
16
Предисловие к четвертому изданию
и уже после этого приступайте к созданию собственных электронных схем на базе
Raspberry Pi,
выбирая интересующие вас рецепты в следующих далее главах.
Условные обозначения
В этой книге используются следующие типографские обозначения:
♦ Курсив.
Им выделяются новые термины.
♦ Полужирный шрифт.
Им выделяются интернет-адреса
♦
(URL)
и адреса электронной почты.
Рубленый шрифт.
Им выделяются имена файлов, расширения имен файлов и пуrи.
♦
Моноширинный шрифт.
Им выделяются листинги программного кода, а также встречающиеся внутри
абзацев текста ссьшки на элементы программ,
-
такие как имена переменных
или функций, базы данных, типы данных, переменные среды, операторы и клю
чевые слова.
♦ ПОJIУ11ИРЮ,1Й моноширинный шрифт.
Им выделяются команды или другой текст, который должен быть введен поль
зователем с клавиатуры.
♦ Моноширинный курсивный шрифт.
Им выделяется текст, который следует заменить значениями, заданными поль
зователем, или значениями, определяемыми контекстом.
"'
Э,о, знаЧО< обозначает roвer, подсказ,у или примечание общею харакrера.
~1
/ ~ Этот значок обозначает предупреждение или предостережение.
Использование примеров кода
Вспомогательные материалы (примеры кода и пр.) доступны для скачивания со
страницы этой книги на сайте ресурса
1
GitHub 1.
См. https://gitbub.corn/simonmonk/гaspbeггypi _ cookbook_ ed4.
Предисловие к четвертому изданию
Предназначение этой книги
-
1
17
помочь вам в решении ваших задач. Вы можете
использовать любой пример кода, содержащийся в ней, в своих программах и до
кументации. При этом вам не требуется обращаться к нам за разрешением, если
только вы не воспроизводите существенную часть кода. Это, например, касается
ситуаций, когда вы включаете в свою программу несколько фрагментов кода, при
веденного в книге. Однако продажа или распространение примеров из книг изда
тельства
O'Reilly требует
отдельного разрешения. Вы можете свободно цитировать
эту книгу, включая примеры, при ответе на вопрос, но если хотите включить суще
ственную часть приведенного здесь кода в документацию своего продукта, то вам
следует связаться с нами.
Ссылка на оригинал приветствуется, но не является обязательной. Указание автор
ISBN. Напри
Simon Monk (O'Reilly). Copyright
ства обычно включает название книги, автора (авторов), издателя и
мер: «Raspberry Pi Cookbook, Fourth Edition,
2023 Simon Monk, 978-l-098-13092-3».
Ьу
Если вы сочтете, что ваше обращение с примерами кода выходит за рамки добро
совестного использования или условий, упомянутых ранее, можете обратиться
к нам по адресу:
permissions@oreilly.com.
Как с нами связаться?
Пожалуйста, адресуйте все комментарии и вопросы относительно этой книги изда
телю:
O'Reilly Media, lnc.
1005 Gravenstein Highway North
Sebastopol,
СА
954 72
800-998-9938
(в Соединенных Штатах и Канаде)
707-829-0515
(международные или местные звонки)
707-829-0104 (факс)
У этой книги есть веб-страница, где мы приводим ошибки, примеры и любую до
полнительную информацию. Она находится по адресу:
https://oreil.ly/raspberry-pi-
cookbook-4e.
Для комментариев и технических вопросов об этой книге используйте электронную
почту:
bookquestions@oreilly.com.
Новости и информацию о наших книгах можно найти сайте
Найдите нас на
http://www.oreilly.com.
Linkedln: https://linkedin.com/company/oreilly-media.
Следите за нами в
Смотрите нас на
Twitter: https://twitter.com/oreillymedia.
YouTube: https://www.youtube.com/oreillymedia.
18
1
Предисловие к четвертому изданию
Благодарности
Как и всегда, я хочу поблагодарить за терпение и поддержку свою жену Линду.
Большое спасибо техническим рецензентам Яну Хантли
(lan Huntley), Майку Бас
(Mike Bassett), Кевину Макалиру (Kevin McA\eer) и Мэтью Монку (Matthew
Monk) за эффективную помощь и предложения, позволившие сделать эту книгу
сетгу
намного лучше!
Хочется также поблагодарить за хорошую организацию работы и постоянную
готовность прийти на помощь Джеффа Блеэля
тельства
O'Reilly.
зоркие глаза.
(Jeff Bleiel) и весь коллектив
(Penelope Perkins) -
А в особенности Пенелопу Перкинс
изда
за ее
ГЛАВА
1
Настройка и управление
1.0. Введение
Покупая
Raspberry Pi, вы фактически получаете полностью собранную печатную
Raspberry Pi 400, ту же печатную плату, но дополнительно раз
плату или, в случае
мещенную в корпусе с клавиатурой. Чтобы создать полностью функционирующую
систему, к такому устройству необходимо добавить как минимум подходящий
источник питания, операционную систему на карте памяти
microSD
и мышь.
Представленные в этой главе рецепты позволят вам настроить свое устройство
Raspberry Pi
и подготовить его к работе.
Raspberry Pi использует стандартные клавиатуры и мыши с интерфей
USB и/или Bluetooth, большая часть процесса настройки не представляет
Поскольку
сами
никаких сложностей, и вам надо будет сосредоточиться лишь на специфичных для
Raspberry Pi задачах.
1.1. Вь16ор
модели
Raspberry Pi
Задача
Определиться с тем, какой из множества предлагаемых моделей
Raspberry Pi
вам
следует обзавестись.
Решение
Выбор подходящей модели
во многом зависит от того, для чего вы
Raspberry Pi
собираетесь использовать этот мини-компьютер.
ния
Raspberry Pi
в табл. 1.1.
Некоторые
Таблица
Области применения
Использование
в качестве замены
настольного
области примене
вместе с моими рекомендациями по выбору модели приведены
1
1.1. Выбор модели Raspberтy Pi
Предлагаемая модель
Примечания
Raspberry Pi 400 или
Raspberry Pi 4 модели
(4 Гбайт)
4
Для запуска интернет-браузера потребуется
Гбайт памяти. Дополнительным удобством Raspberry Pi 400 является то, что эта
В
модель совмещена в одном корпусе
компьютера
1
с клавиатурой
20
Глава
1
Таблица
Области применения
Предпагаемая модель
Создание любитель-
RaspЬerry
Pi 2
или З В
ской электроники
1.1 (окончание)
Примечания
Благодаря достаточно современному аппаратному решению этих устройств у вас не
будет проблем с программным обеспечением. Указанная область применения не требует более высокой производительности
Компьютерное зрение
RaspЬerry
Pi 4
В
(4
Гбайт)
Требуется максимальная производительность
Raspberгy
Домашняя
Pi 2
или З В
Низкое энергопотребление при вполне
достаточной мощности
автоматизация
Медиацентр
RаsрЬеггу
Pi 3
или
Эти модели хорошо подходят
4
для воспроизведения видео
Вывод информации
Любая модель
Модели с поддержкой Wi-Fi также позволяют обеспечить удаленный доступ
на дисплей
Встраиваемая
беспроводная
Raspberry Pi
PicoW
Zего
Низкая стоимость и поддержка
2W
или
Wi-Fi
делает эти устройства подходящими для
проектов на базе технологии Интернета
вещей (loT) и других беспроводных
электроника
проектов
Встраиваемая
Очень низкая стоимость этих устройств,
имеющих мало общего с остальными
Raspberry Pi Pico
электроника
устройствами RaspЬerry
Pi.
Более подроб-
ную информацию вы найдете в главе
19
Если вам требуется универсальное устройство, которое хорошо бы вело себя при
решении большинства стоящих перед вами задач, я рекомендую выбрать модель
Raspberry Pi 4
модели В. Благодаря четырехъядерному процессору и в четыре раза
большему объему памяти по сравнению с первой моделью
Raspberry Pi эта модель
Raspberry Pi Zero,
будет справляться с большинством задач намного лучше, чем
и в то же время не станет столь сильно нагреваться или потреблять так много энер
гии, как
Raspberry Pi 4.
Вы также можете выбрать модель RaspЪerry
рой тоже имеется встроенная поддержка
ходимости подключать через разъем
Wi-Fi и Bluetooth, что
USB дополнительный
Pi 3 В+,
у кото
избавит вас от необ
адаптер
Wi-Fi
или
Bluetooth.
Raspberry Pi 4
На момент подготовки этого издания книги модель
новейшим решением среди устройств
В
Raspberry Pi 4
В (рис.
1.1)
является
Raspberry Pi.
Эта модель таюке впервые позволила пользователям выбирать приобретаемое устрой
ство с учетом его цены в зависимости от объема установленной в нем памяти:
или 8 Гбайт.
1, 2, 4
Одним из наиболее значительных нововведений в этой модели стала замена разъема
через который подавалось питание в предыдущих моделях, на разъем USB-C.
Кроме того, один полнораз1111ерный разъем HDMI заменен в нем двумя разъемами
micro-HDMI. Соответственно теперь вы можете одновременно подключить к устройству
micro-USB,
Настройка и управпение
Рис .
1.1. Raspberry Pi 4
21
модели В
два монитора , но для этого вам придется обзавестись кабелем с соответствующим
разъемом или переходником .
Raspberгy
Pi 4
модели В существенно превосходит предыдущие модели в плане произ
водительности (особенно в случае версий с объемом памяти в 4 и 8 Гбайт) . Как показы
вают результаты сравнительных тестов , она работает в три-четыре раза быстрее , чем
любая из предыдущих моделей. Платой за такой прирост производительности является
то , что процессор этой модели может очень сильно греться , а иногда становится даже
обжигающе горячим.
Если , с дру гой стороны , вы пред пол агаете и с пользовать
Raspberry Pi
в составе
электронной схемы , реали зующей только одну з адачу , то, возможно, имеет смысл
сэ кономить несколько ты с яч рублей ,
выбрав компактную модель
Raspberry Pi
Zero W.
Raspberry Pi 400
Устройства Raspberгy
Pi
можно с успехом использовать в качестве замены настольного
компьютера, и лучше всего для этой цели подходит модель RаsрЬеггу
Pi 400
(рис .
1.2).
по сути , представляет собой то же устройство, что и модель
Модель Raspberry Pi 400,
Raspberry Pi 4, с тем лишь отличием, что здесь оно упаковано в корпус с клавиату
рой, - подобно тому как были устроены домашние компьютеры в 1990-е годы 1 . Порты
HDMLиJ.JSB расположены на обратной стороне корпуса клавиатуры . Там же находятся
GPIO, но здесь они не столь легкодоступны, как в обычных моделях Raspberry
и выводы
Поэтому если вы покупаете Raspberry Pi с целью изучения электроники, то , вероят
но , будет лучше выбрать что-то из других моделей . Однако если вы ищете устройство,
Pi.
1
Вспомним , например. ZX Spectrum, многочисленные клоны которого в н ач але 1990-х 1·одов получил и
https://tinyurl.com/4ap2kck8).
широкое р ас простр ан е 11и е н а те рритории бывш е го ССС Р ( с м .
22
1
Глава
1
Рис.
1.2. Raspberry Pi 400
способное заменить настольный компьютер,
то модель
Raspberry Pi 400
окажется
весьма подходящим вариантом.
Пояснение
На рис.
1.3
показаны модели Raspbetтy
Pi Zero W,
Raspbetтy
Как можно здесь увидеть, плата модели Raspbetтy
меньше, чем плата моделей Raspbeiтy
micro-USB,
Pi 3
В и
4
Pi 3 В
Pi Zero W
и Raspbetтy
Pi 4 В.
примерно в два раза
В, и снабжена двумя разъемами
- для подачи
Raspberry Pi Zero W также используется
USB On-The-Go (USB OTG). То есть, чтобы под
один из которых служит для коммуникации, а другой
питания. В целях экономии места в модели
разъем
mini-HDMI
и технология
ключить к этой модели клавиатуру , монитор и мышь со стандартными интерфей
USB и HDMI, потребуется задействовать специальные переходники. Модель
Raspberry Pi А+ отличается более крупным размером, чем модель Raspbetтy Pi Zero,
и снабжена полноразмерными портами USB и HDMI.
сами
Рис.
1.3.
Слева направо:
Raspberry Pi Zero W, Raspberry Pi 3
В и
Raspberry Pi 4
В
Настройка и управление
1
23
1.2 отмечены особенности всех существующих на сегодняшний день моде
Raspberry Pi, которые отсортированы здесь по дате выпуска от новых к старым.
В табл.
лей
Таблица
Процессор
ОЗУ
Модель
Разъемь1
(кол-во ядер х
х тактовая частота)
400
4
4В
Гбайт
х
4
4
1/2/4/8
1,8
х
1,5
ГГц
ЗА+
З В+
зв
х USBЗ)
(2
х USBЗ)
4
ГГц
Raspberry Pi
[
Устройство встроено
да
(2
4х1,5ГГц
1/2/4/8
Порт
Модели
Ethernet Примечания
4
Гбайт
Compute
Module 4
I
USB
1.2.
в клавиатуру
•
2 видеоразъема
micro-HDMI
да
1
Для встраивания в продук-
нет
нет
ты (см. далее описание)
Гбайт
4
х
1,4
ГГц
1
нет
Wi-Fi
и
Bluetooth
Гбайт
4
х
1,4
ГГц
4
да
Wi-Fi
и
Bluetooth
1 Гбайт
4
х
1,2
ГГц
4
да
Wi-Fi
и
Bluetooth
Мбайт
512
1
Zero 2 W
512
Мбайт
4
1 ГГц
1
(micro USB)
нет
Wi-Fi
и
Bluetooth
ZeroW
512
Мбайт
1 х 1 ГГц
1
(micro USB)
нет
Wi-Fi
и
Bluetooth
Zero
512
Мбайт
1 х 1 ГГц
1 (micro
USB)
нет
Низкая стоимость
4
да
1
нет
4
да
Выпуск прекращен
нет
Выпуск прекращен
2В
А+
1
Гбайт
256
Мбайт
х
4
х
900
МГц
1
х
700
МГц
1
В+
512 Мбайт
1
х
700
МГц
1
А
В
rev2
256
Мбайт
1 х 700
512
Мбайт
1
х
700
МГц
1
'
i
МГц
1
2
1
да
1
Выпуск прекращен
1
В
rev1
256
Мбайт
1
х
700
МГц
2
да
Выпуск прекращен
1
Если вы уже располагаете одной из старых моделей
Raspberry Pi
или даже той, вы
пуск которой прекращен, то и такое устройство может оказаться вполне пригодным
для вашей области применения. Хотя старые модели сильно уступают в производи
тельности последней модели
Raspberry Pi 4,
во многих случаях это не будет иметь
особого значения.
Когда же вы покупаете новое устройство
для
использования
Raspberry Pi 4
и
в
качестве
Raspberry Pi 400.
Raspberry Pi,
универсального
то наиболее подходящими
компьютера
я
считаю
или вы хотите иметь менее габаритное устройство, можно выбрать модель
или
Zero W.
модели
В случае, если вам не требуется поддержка
Wi-Fi
3 В, 2 В
24
1
Глава
1
Raspberry Pi Compute Module 4
Устройства
Raspberry Pi
настолько удобны в использовании, что часто включаются в состав
многих коммерческих продуктов. Причем иногда это выглядит излишним расточительством,
поскольку далеко не каждому продукту требуются все разъемы и другие функциональные
элементы таких моделей, как
Raspberry Pi 4.
Модель Raspberry Pi Compute Module 4 (и предыдущие модели этой серии) представля
ет собой аккуратный модуль (рис. 1.4), все разъемы которого для подключения к плате
носителю расположены на его нижней стороне, что позволяет очень легко встроить
в тот или иной продукт такой компьютер на базе ОС Linux. Благодаря тому, что этот мо
Wi-Fi и Bluetooth уже имеют сертификаты соот
ветствия СЕ и FCC, задача обеспечения совместимости продукта с необходимыми
дуль и используемые в нем интерфейсы
стандартами становится намного проще.
Рис.
1.4. Raspberry Pi Compute Module 4
Дополнительные сведения
Подробную информацию о моделях Raspberтy
Pi
oreil.ly/oY-A_, а ознакомиться с особенностями
Module - по адресу https://oreil.ly/3HjzD.
Низкая стоимость моделей
Pi Zero
и
можно найти по адресу
моделей Raspberтy
Pi Zero W позволяет
использовать их в составе
электронных схем, не беспокоясь о величине расходов (см. рецепт
1.2. Подключение
https://
Pi Compute
10.18).
компонентов системы
Задача
Подключить всё то, что вы собираетесь использовать вместе с устройством
berтy
Pi.
Rasp-
Настройка и управление
1
25
Решение
Если вы не ставите себе целью встроить устройство
Raspbeny Pi
в электронную
схему или задействовать его в качестве медиацентра, вам понадобится подключить
к нему клавиатуру ( если у вас не модель
Pi 400),
Как выглядит типичная система на базе
Raspbeny Pi,
модели
мышь и монитор.
показано на рис.
1.5.
В случае
вы при желании сможете подключить сразу два монитора.
Raspbeny Pi 4
Однако, если вы решили использовать только один монитор, подключите его
к тому разъему micro-НDMI, который расположен ближе к разъему
USB-C,
исполь
зуемому для подачи питания.
Телевизор/монитор
Блок питания
с интерфейсом
Домашний
маршрутизатор
USB
Клавиатура
□□□□□□□□□□□□□
□□□□□□□□□□□□□
□□□□□□□□□□□□□
□□□□□□□□□□□□
Мышь
Рис.
1.5. Типичная
система на базе
Raspberry Pi
Пояснение
Для
Raspbeny Pi сгодится практически любая
USB - как проводная, так и беспроводная.
Модель RaspЬeny
Pi 4
клавиатура или мышь с интерфейсом
позволяет подключить к системе сразу два монитора. При
этом вы сможете перемещать курсор мыши с одного экрана на другой, но вам нуж
но будет указать операционной системе
Raspbeny Pi OS,
как эти экраны располо
жены по отношению друг к другу. Для этого откройте меню устройства
Pi ( щелкнув
на значке в виде ягодки малины), перейдите в раздел
Raspbeny
Preferences (На-
26
1
Глава
1
стройки) и откройте
(рис.
инструмент
Screen Configuration
(Конфигурация экрана)
1.6).
Здесь путем перетягивания с помощью мыши расположите прямоугольники с надпи
сями
HDMI-1
и
HDMI-2
в соответствии с физическим расположением двух мони
торов. В показанной на рис.
1.6
конфигурации два монитора касаются друг друга
одной стороной, и монитор, подключенный к разъему
!•
1
•
'
V
А
HDMI-1,
расположен слева.
Х
File Conf,gure View Help
HDMl-2
Рис.
1.6.
Настройка конфигурации нескольких экранов
Если вы используете одну из более старых моделей
Raspberry Pi (модель
USB. В таком
модель А+), то вам может не хватить имеющихся разъемов
А или
случае
вам потребуется USB-xaб.
Дополнительные сведения
Ознакомиться с официальным кратким руководством по началу работы с
Pi
можно по адресу
Raspberry
https://oreil.Iy/GZtqA.
1.3. Как снабдить устройство Raspberry Pi
корпусом?
Задача
Снабдить устройство
Raspberry Pi
каким-нибудь корпусом.
Решение
За исключением модели
Raspberry Pi 400
устройства
Raspberry Pi
могут быть раз
мещены в корпусе лишь в том случае, когда корпус приобретается дополнительно
как часть расширенного комплекта. Отсутствие корпуса делает эти устройства
весьма уязвимыми, поскольку вы можете легко закоротить незащищенные провод-
Настройка и управление
1
27
ники на нижней стороне печатной платы, случайно положив ее на что-либо метал
лическое.
Поэтому будет совсем не лишним защитить свое устройство
Raspberry Pi,
купив
для него какой-либо корпус. Если вы собираетесь использовать конта1<ты интер
фейса
GPIO (General-Purpose Input/Output,
ввод/вывод общего назначения), предна
значенные для подключения внешней электроники, то хорошим вариантом может
стать
корпус
Pibow Coupe
(рис.
1.7),
выполненный одновременно
и практичном дизайне и вполне пригодный для размещения как
в
красивом
Raspberry Pi 4,
так
и более ранних моделей.
Рис.
1.7.
Устройство
Raspberry Pi 2
в корпусе
Pibow Coupe
Пояснение
Вы можете использовать самые разные виды корпусов:
♦
простые пластиковые корпуса из двух защелкивающихся частей;
♦
корпуса с креплением стандарта
VESA
(для закрепления на обратной стороне
монитора или телевизора);
♦
LЕGО-совместимые корпуса;
♦
корпуса, создаваемые путем 3D-печати;
♦
корпуса, создаваемые путем лазерной резки акрила;
♦
корпуса, выступающие в качестве большого радиатора, обеспечивающего охла
ждение устройства;
♦
корпуса со встроенным вентилятором;
♦
корпуса с DГN-рейками для использования в лабораториях и на семинарах.
28
Глава
1
Хотя выбор корпуса
это в значительной мере дело вкуса, примите во внимание
-
следующие моменты:
♦
требуется ли вам доступ к разъему
подключать к
♦
Raspberry Pi
GPIO?
Это понадобится, если вы собираетесь
внешнюю электронику;
обеспечивает ли корпус хорошую вентиляцию? Это будет нужно, если вы соби
раетесь разгонять процессор (см. рецепт
ройство
Raspberry Pi
1. 13)
или сильно нагружать свое уст
играми и воспроизведением видео, поскольку при этом вы
деляется повышенное количество тепла;
♦
наконец, убедитесь, что размеры выбранного корпуса позволяют разместить
в нем используемую вами модель
Raspberry Pi.
Если у вас есть доступ к 3D-принтеру, вы, как уже было отмечено ранее, можете
создать собственный корпус путем 3D-печати. Зайдите на сайт
Myminifactory
3
Thingiverse 2
и произведите поиск по ключевым словам Raspberry Pi -
или
там вы
найдете много возможных вариантов дизайна печатного корпуса.
В продаже также имеются комплекты крошечных самоклеящихся радиаторов для
микросхем устройств
Raspberry Pi.
Хотя такие радиаторы могут быть в какой-то
мере полезными, если вы, например, воспроизводите много требовательных к ре
сурсам видео, обычно от них не больше толку, чем от полосок, украшающих кузов
гоночного автомобиля.
Для снижения температуры устройств модели Raspberry
небольшой вентилятор, наподобие показанного на рис.
Fan SHIM.
Рис.
2
См. https://www.thingiverse.com/.
3
См. https://www.myminifactory.com/.
1.8.
Вентилятор
Pimoroni Fan SHIM
Pi 4 можно использовать
I .8 вентилятора Pimoroni
Настройка и управление
1
29
Дополнительные сведения
Множество различных корпусов также можно найти у поставщиков устройств
Raspberry Pi и на сайте еВау.
1.4. Выбор источника питания
Задача
Выбрать источник питания для устройства
Raspberry Pi.
Решение
Чтобы источник питания подходил для запитъ1вания
должен выдавать стабилизированное напряжение
5В
Raspberry Pi,
он, преЖде всего,
постоянного тока.
Какой должна быть выдаваемая сила тока, зависит от того, какую модель
Pi
Raspberry
и какие периферийные устройства вы используете. В идеале ее должно бьпь дос
таточно для вашего устройства
Raspberry Pi, да
Raspberry Pi она должна составлять не менее 1 А.
и для любой другой модели
Если вы приобретаете источник питания у того же поставщика, у которого поку
паете
Raspberry Pi, поставщик должен
Raspberry Pi.
сообщить вам, будет ли он работать с вашим
устройством
Для модели RaspЬerry
Pi 4
следует использовать источник питания, выдающий
3 А.
Огчасти это объясняется тем, что более высокие вычислительные возможности
этой модели требуют и более высоких затрат энергии, а отчасти
снабжена двумя портами USBЗ, которые могут выдавать до
рийным устройствам с интерфейсом
1,2 А
-
тем, что она
мощным перифе
USB, таким как внешние USВ-диски.
Если вы собираетесь использовать мощные периферийные устройства с интерфей
сом Wi-Fi или USB в сочетании с одной из моделей, предшествовавших модели
Raspberry Pi 4, проследите за тем, чтобы источник питания мог вьщавать ток в 1,5
или даже 2 А. Также остерегайтесь очень дешевых источников питания, которые
зачастую не способны вьщавать 5 В с необходимой стабильностью и надежностью.
Пояснение
Raspberry Pi 4 USB-C. В
емом
первая модель
Raspberry Pi, снабженная
micro-USB, которым
отличие от разъема
более современным разъ
оснащались предыдущие
модели, этот разъем симметричен, и потому не требует соблюдения определенной
ориентации подключаемого к нему кабеля.
На рис.
1.9
показаны разъемы для подачи питания и подключения видеоустройств
в моделях RaspЬerry
Pi 3 и Raspberry Pi 4. При этом видно, что разъем питания
USB-C модели Raspberry Pi 4 (расположенной внизу) явно отличается от разъема
micro-USB модели RaspЬerry Pi 3 (расположенной вверху). Здесь также можно за-
Глава
30
Рис.
1.9.
1
Разъемы для подачи питания и подключения видеоустройств в моделях
и
Raspberry Pi 4
Raspberry Pi 3
метить, что вместо одного полноразмерноrо разъема
модели) в новой модели используются два видеопорта
HDMI (как
micro-HDMI.
в более старой
Вне зависимости от того, какой разъем установлен в вашем устройстве
(USB-C
или
micro-USB),
(вверху)
(внизу)
Raspberry Pi
его, как правило, можно запитывать от того же источника
питания и через тот же кабель, что используется во многих зарядных устройствах
для смартфонов. Если кабель зарядного устройства снабжен разъемом
то оно, скорее всего, обеспечивает выдачу
5
В постоянного тока
micro-USB,
(однако
лучше
убедитесь в этом). Тогда остается лишь выяснить, выдает ли такое зарядное уст
ройство достаточную силу тока.
В противном случае вы можете столкнуться со следующими неприятными послед
ствиями:
♦
зарядное устройство в процессе эксплуатации может сильно нагреться, что по
тенциально чревато пожаром;
♦
зарядное устройство может просто выйти из строя;
♦
при росте нагрузки (например, когда устройство
вать интерфейс
Wi-Fi
снизиться, что приведет к сбросу устройства
Если вы используете
Raspberry Pi
начнет использо
или воспроизводить видео) напряжение может сильно
Raspberry Pi 3
Raspberry Pi.
или одну из более ранних моделей, то вам сле
дует обзавестись источником питания, способным выдавать как минимум
в
характеристиках источника
питания
вместо
силы тока
в
1 А.
амперах указана
Если
мощ
ность в ваттах, то силу тока в амперах можно получить, разделив мощность в ват
тах на выдаваемое напряжение в вольтах (в нашем случае на
точник питания, выдающий согласно характериситкам
ток в
2 А (2000
мА).
5
5). Так, например, ис
1О Вт, обеспечивает
В и
Настройка и управление
З1
Также помните о том, что источник питания с максимальным током, скажем в 2 А,
будет потреблять ничуть не больше энергии, чем источник питания с максималь
ным током в
700
мА, поскольку устройство
Raspberry Pi
всегда потребляет лишь то
количество тока, которое ему необходимо.
1.1 О показано, сколько тока потребляют
Raspberry Pi 2 В и Raspberry Pi 4 В .
На рис.
Pi
В,
на этапе загрузки модели
Raspberry
(начиная с модели Raspberry Pi А+ и вплоть
намного энергоэффективнее предыдущих моделей, при
полной загрузке процессора и большом количестве подключенных периферийных
устройств они могут потреблять ничуть не меньше энергии, а в случае модели
Хотя более новые модели
до модели
Raspberry Pi
Raspberry Pi 4)
Raspberry Pi 4
и намного больше.
Как показывает представленный на рис. 1.1 О график, постоянно работающее уст
ройство модели Raspberry Pi 2 будет меньше греться и потреблять намного меньше
энергии, чем новейшая модель
Здесь также видно, что
Raspberry Pi 4.
Raspberry Pi
очень редко потребляют больше
700
мА. Одна
ко надо учесть, что на этапе загрузки процессор выполняет не так уж много работы.
Если бы мы решили воспроизвести видео формата НО, то потребление тока суще
ственно бы возросло. Поэтому выбирать источник питания всегда лучше с некото
рым запасом
.
...
Raspberry Pi 4
Raspberry Pi
"
о
Рис.
1.1 О.
11
..
21
"
Время (с)
Потребление тока устройствами
. . ..
-~-
Raspberry Pi
.,
..
В
Raspberry Pi 2
о
В
В
00
.,
на этапе загрузки
Дополнительные сведения
Raspberry Pi бесперебойный источник питания4.
Raspberry Pi будет работать еще 10-30 минут после
Вы также можете приобрести для
Оснащенное им устройство
аварийного отключения электроэнергии .
4
См . https://oreil.ly/F0Pn2.
32
Глава
1
Хотя устройства
Raspberry Pi
не снабжаются собственным выключателем питания,
в продаже можно найти модуль, обеспечивающий отключение питания при выклю
чении устройства
Raspberry Pi 5 .
1.5. Выбор операционной
системы
Задача
Выбрать одну из тех операционных систем, которые можно использовать на уст
ройстве
Raspberry Pi.
Решение
Выбор операционной системы зависит от целей, которых вы хотите достичь, обза
водясь устройством
Raspberry Pi.
Если вы собираетесь использовать его в качестве универсального компьютера или
в составе электронных схем, лучше выбрать
циальный дистрибутив для устройств
то можно посоветовать взять один из
Raspberry Pi OS - стандартный офи
Raspberry Pi. А если в качестве медиацентра,
нескольких дистрибутивов Linux, специально
предназначенных для этой цели (см.рецепт
4.1).
В этой книге мы почти всегда будем ориентироваться на
Raspberry Pi OS,
хотя
большинство приводимых здесь рецептов будут работать и при использовании
любого другого дистрибутива
Linux
на базе
Debian.
Пояснение
Если вы хотите опробовать в деле несколько дистрибутивов, то можете приобрести
несколько недорогих карт памяти
microSD
и загрузить на них разные дистрибути
вы. Перед проведением таких экспериментов рекомендуется перенести важные для
вас файлы на USВ-накопитель, подключенный к устройству
Raspberry Pi.
Обратите внимание, что для реализации представленных далее рецептов по записи
нужной вам информации на карту
microSD,
надо обзавестись компьютером со сло
том для SD-карт (и адаптером, позволяющим задействовать этот слот для работы
с картами формата
с интерфейсом
microSD)
или купить недорогой считыватель microSD-кapт
USB.
Дополнительные сведения
Ознакомиться с официальной страницей дистрибутива
ченного для устройств
5
См. https://oreil.ly/Шc2G.
Raspberry Pi,
можно по адресу
Raspberry Pi OS, предназна
https://oreil.ly/1X8oa.
Настройка и управпение
1.6. Установка
1
33
операционной системы
с помощью программы
Raspberry Pi lmager
Задача
Разместить операционную систему на карте памяти
зования устройством
microSD,
готовой для исполь
Raspberry Pi.
Решение
Raspberry Pi, необходимо под
системой Raspberry Pi OS, записав
Перед тем как приступить к работе с устройством
готовить карту памяти
microSD
с операционной
на такую карту памяти соответствующий образ диска.
Чтобы записать образ диска на карту памяти
1.
Используя компьютер с операционной системой
не ваше устройство
2.
microSD,
Raspberry Pi),
выполните следующие шаги:
macOS, Windows или Linux
Raspberry Pi Imager6 •
(но
скачайте программу
Вставьте в компьютер карту памяти
microSD.
Полезно при этом отключить все
другие съемные носители, чтобы случайно не перезаписать их содержимое.
Raspberry Pi Imager (рис . 1.11 ).
3.
Запустите программу
4.
Выберите в поле для операционной системы
версию
Raspberry Pi OS
и
-
в поле для
(Operating System) 32-разрядную
устройства хранения (Storage) - свою
microSD-кapтy .
•
RaspЬerry
Pi lmager v1.7.2
Raspberry Pi
Рис .
6
1.11.
Запись образа на SD-карту с помощью программы
См. https://oreil.ly/lX8oa .
Raspberry Pi lmager
34
5.
Глава
1
Щелкните на кнопке
Write
(Записать) и дождитесь завершения процесса записи
файла образа на съемный носитель.
Подготовив таким образом microSD-кapry, подключите его к своему устройству
Raspberry Pi. Тогда после включения устройства на этапе начальной загрузки в него
будет загружаться записанный вами на карrу дистрибутив операционной системы.
Пояснение
Производители аппаратного обеспечения часто предлагают собственные варианты
образа дисков со встроенной поддержкой предлагаемого ими аппаратного обеспе
чения. Старайтесь по возможности не использовать такие образы, потому что вы
тогда не сможете задействовать все возможности и предустановленные программы
стандартного дистрибутива
Raspberry Pi OS.
Кроме того, в случае некорректной
работы какого-либо элемента такого программного обеспечения вам будет гораздо
труднее получить помощь в устранении проблем, поскольку вы имеете дело с не
стандартным дистрибутивом.
Хотя в моделях
Raspberry Pi 4
и
Raspberry Pi 400
установлен 64-разрядный процес
сор, что позволяет задействовать 64-разрядную версию операционной системы, на
момент подготовки этого издания книги использование предлагаемой по умолча
нию 32-разрядной операционной системы обеспечивает намного более стабильные
результаты
Карты памяти
microSD
Не все карты microSD одинаково хороши и могут сильно различаться по скорости чте
ния и записи . Естественно, что ваше устройство Raspberry Pi будет работать лучше при
использовании более производительной карты. Поэтому в идеале в характеристиках
карты памяти должно быть указано, что она относится к классу 10.
Проверить скорость работы своей карты памяти microSD можно с помощью соответст
вующей утилиты операционной системы Raspberry Pi OS (рис. 1.12). Для запуска этой
Raspberry Р 01agnost1cs
V
А
)(
Result
Test
SD Card Speed Test
Oeterm1nes whether an SD card can read and wnte
data fast enough to provide adequate performance.
Should Ье run оп а new or newly-format1ed SO card.
Close
Рис.
1.12.
Showlog
Reset
Проверка скорости работы SD-карты с помощью утилиты
Raspberry Pi Diagnostics
Настройка и управление
1
35
утилиты выберите в меню устройства Raspberry Pi пункт Accessories (Стандартные), а
затем - пункт Raspberry Pi Diagnostics (Диагностика Raspberry Pi).
Что же касается объема карты памяти, то он должен составлять как минимум
16
Гбайт.
Впрочем, учитывая небольшую разницу в цене, рекомендую вам выбрать карту с объ
емом в
Гбайт
32
в таком случае у вас всегда будет достаточно места для установки
-
расширений.
Дополнительные сведения
Ознакомиться с официальным руководством по установке
по адресу
1. 7.
Raspberry Pi OS
можно
https://www.raspberrypi.com/software.
Первая загрузка устройства
Raspberry Pi
Задача
Вы подготовили карту памяти
вом
microSD
и теперь хотите начать работу с устройст
Raspberry Pi.
Решение
При первой загрузке устройства
ответив на ряд вопросов (рис.
Raspberry Pi
1.13 ).
вам будет предложено его настроить,
SetCountry
Enter the deta,ls of your location. Тhis is used to set the
language, time zone, keyЬoard and other intemational settings.
Country:
United Ktngdom
language.
British Eлglish
Тimezone:
Вelfзst
Use English language
...
...
...
Use US keyboard
Press 'Next' when you have made your selection.
Next
Рис.
1.13.
Настройка устройства
Щелчок на кнопке
(рис.
Next
Raspberry Pi
после установки операционной системы
(Далее) откроет панель создания новой учетной записи
1.14).
До апреля
записи,
вателя
2022
года процедура настройки не содержала шага создания учетной
поскольку
«pi».
вы
автоматически
получали учетную
запись
с
именем пользо
Вследствие этого во многих обучающих материалах и книгах по
36
1
Глава
1
Raspberry Pi
предполагается использование в качестве домашнего каталога папки
/home/pi. Если для вас не так уж важно, каким будет имя пользователя, я рекомен
дую вам оставить предложенное по умолчанию имя пользователя
создать надежный
«pi», но при этом
пароль (вместо предлагаемого по умолчанию пароля «raspberry»).
Creвteu.r
You need to create а user account to log in to your RaspЬerry
Pi.
The usemame can only oontain lower-caae letters, digit.s and
hyphens, and must start with а letter.
Enter usemame:
pi
Enter password:
Confirm password:
Нide characters
Press 'Next' to create your aooount.
Рис.
1.14.
Подготовив свое устройство
Соэдание учетной заnиси пользователя
Raspberry Pi
к работе, вам надо будет, прежде всего,
обеспечить его соединение с Интернетом (см.рецепты
2.1
и
2.5),
поскольку на сле
дующем шаге мастер установки предложит подключить устройство к сети
Wi-Fi,
чтобы проверить наличие обновлений. Поскольку для установки обновлений тре
буется интернет-соединение, этот шаг можно будет выполнить только после под
ключения к Сети. Если вы уже подключились к Интернету (используя интерфейс
Wi-Fi
или
Ethemet),
проверьте наличие обновлений прямо сейчас. Если же вы еще
не подключились, проверить наличие обновления можно будет позже, как описано
в рецепте
3.40.
Пояснение
Весьма полезно задать надлежащий часовой пояс. Если вы этого не сделаете,
устройство
Raspberry Pi
будет отображать неправильное время, поскольку оно по
лучает информацию о текущем времени от сервера времени, расположенного в Ин
тернете.
Дополнительные сведения
Ознакомиться с официальным руководством по установке
по адресу
https://www.raspberrypi.com/software.
Raspberry Pi OS
можно
Настройка и управление
1
37
1.8. Настройка Raspberry Pi
для работы в бездисплейном режиме
Задача
Вы хотите использовать устройство
Raspberry Pi
без подключения к нему клавиа
туры, мыши и монитора.
Решение
В
программы
настройках
Raspberry Pi с
SSH
протокола
Raspberry Pi Imager
разрешите
запуск
устройства
использованием сетевых учетных данных и включите поддержку
(см. рецепт
2. 7),
чтобы к устройству
Raspberry Pi
можно было под
ключаться с другого компьютера.
Raspberry Pi Imager операционной системы на экране
появляется значок настроек в виде шестеренки ф. Щелкнув на этом значке, вы
откроете окно с рядом настроек (рис. 1.15), позволяющих подготовить устройство
Raspberry Pi, чтобы к нему можно было подключаться с других компьютеров, рас
После выбора в программе
положенных в вашей сети.
Для обеспечения возможности удаленного доступа к
Raspberry Pi
как минимум
нужно сделать следующее:
♦
включить поддержку протокола
SSH (Secure Shell),
установив флажок ЕnаЫе
SSH;
♦
♦
задать в разделе
Set the username and password
имя пользователя и пароль;
в настройках беспроводной локальной сети (раздел
указать имя вашей сети (идентификатор
Полезно также в разделе
Set hostname
SSID)
Configure wireless LAN)
и соответствующий пароль;
задать имя хоста, особенно если вы собирае
тесь использовать в своей сети сразу несколько устройств
и хотите
Raspberry Pi
указать, какую роль будет играть каждое из них.
Пояснение
Когда вы вставите подготовленную таким образом microSD-кapтy в свое устройст
во
Raspberry Pi
и произведете загрузку операционной системы, к нему можно будет
подключиться с другого компьютера, используя протокол
SSH.
Для этого останется
лишь выяснить, какой IР-адрес присвоил ваш домашний хост устройству
Pi
Raspberry
при подключении его к сети. Временно подключите к устройству клавиатуру,
мышь и монитор и выясните IР-адрес своего устройства в порядке, описанном
в рецепте
2.2,
Подключать к
а затем сделайте его фиксированным, как описано в рецепте
Raspberry Pi
2.3.
клавиатуру, мышь и монитор на начальном этапе на
стройки не всегда может быть удобно. Если вы хотите обойтись без этого, можно
воспользоваться одной из утилит для
Android
и
iOS,
позволяющих просканировать
38
Глава
1
R_
as'pЬe
__,.
rry~lma--=ge
_
r_
v1_.
i_
2 _ _ _ _ _ __
i1-•- • - •_ _ _ _ _ _ _ _ _ _
Adw8no8d opllone
lmage customlzatJon opllona
х
for this sesslon only
11 Set hostname: raspЬerrypl
.local
11 ЕnаЫе SSH
@
Use password authentk:a\Jon
О Allow puЬlk:-key authentlcation only
Set aU1ho<iztd..J<evs tor 'pl': wCКZP snnonk@gmail.com
11 Set usemame and password
t
Usemame: pl
1
Puswon:I:
11 Configure wireless LAN
MoniLSG
SSID:
0
Hidden SSID
PasswoRI:
О S1юw password
Wlr.less LAN country: GB
О Set locale settings
Тlme
zone:
Кeyt,oard
Europe/London
lavout: gb
Perslstent settlngs
О Р1ау sound wllen finished
11 Eject media wllen finished
11 ЕnаЫе telemetry
Рис.
1.15.
-
Настройка сетевого доступа к
Raspberry Pi
в программе Raspberгy
Pi lmager
сеть со своего смартфона и получить список присутствующих в сети устройств
с указанием IР-адреса каждого из них (рис.
1.16).
Дополнительные сведения
Более подробную информацию о подключении к
протокола
SSH вы
найдете в рецепте
2. 7.
Raspberry Pi
с использованием
Настройка и управление
Рис.
1.16.
1
39
Выяснение IР-адреса
устройства
путем сканирования сети
1.9. Загрузка с
внешнего жесткого диска
или флеш-накопителя с интерфейсом
USB
Задача
Используемая вами microSD-кapтa обладает слишком малым объемом, и вы также
опасаетесь, что при размещении операционной системы только на microSD-кapтe
устройство будет работать недостаточно надежно .
Решение
Хотя загрузка с внешнего жесткого диска или флеш-накопителя через интерфейс
USB
была возможна и до выхода моделей
Raspberry Pi 4
и
Raspberry Pi 400,
на
более ранних моделях для этого приходилось использовать несколько опасных
команд, рискуя в случае ошибки превратить свое устройство
пич» . В последних моделях
Raspberry Pi 4
и
Raspberry Pi 400
Raspberry Pi
в «кир
реализация этой воз-
40
Глава
1
можности не представляет больших проблем и заключается в соответствующей на
стройке устройств с помощью программы
Raspberry Pi Imager.
Этот процесс во многом напоминает ранее описанную процедуру подготовки за
грузочной карты памяти
microSD.
Чтобы все организовать правильно, вам потребу
ется компьютер с операционной системой
SSD-диск с интерфейсом
USB
и еще одна
Windows, macOS или Linux,
карта памяти microSD. Хотя в
внешний
итоге вы
получите вместо загрузочной microSD-кapты другой загрузочный носитель, сейчас
вам понадобятся две microSD-кapты: ваша загрузочная карта и еще одна пустая.
1.
Вставьте пустую microSD-кapтy в считыватель карт своего компьютера.
2.
Запустите программу
Raspberry Pi Imager
(рис.
1.17) и в поле для операционной
Misc Utility Images (Прочие
системы выберите из выпадающего списка пункт
служебные образы), а затем пункты
мы) и
USB Boot
Bootloader (Загрузчик
операционной систе
(Загрузка с USВ-накопителя). Если этих пунктов нет в вашей
версии программы
Raspberry Pi Imager,
попробуйте установить ее более новую
версию 7 •
Raspberry Pi
Рис.
3.
1.17.
Настройка загрузки с USВ-накопителя с помощью программы
Выберите свою пустую microSD-кapтy в поле для устройства хранения и щелк
ните на кнопке
4.
Raspberry Pi lmager
Write (Записать).
Вставьте только что записанную microSD-кapтy в устройство
Raspberry Pi
и
включите его. Единственной задачей образа, записанного на эту карту, является
Raspberry Pi на загрузку с USВ-накопителя. Когда он
перенастройка устройства
выполнит свою работу, экран окрасится в зеленый цвет.
7
См. https://oreil.ly/1X8oa.
Настройка и управление
5.
Выключите устройство
Raspbeny Pi
и вставьте в него свою исходную
1
41
microSD-
кapтy с операционной системой.
6.
Включите устройство
Raspbeny Pi и в его меню выберите пункт Accessories
SD Card Copier (Средство копирования SD-карт)
(Стандартные), а затем пункт
(рис.
1.18).
Выберите свою microSD-кapтy с операционной системой (в качестве
источника) и внешний USВ-накопитель (в качестве получателя) и нажмите
кнопку
Start (Начать).
so Card Copief
V
А
1(
CopyFromDevioe;
Сору То
Рис.
7.
1.18.
Devioe;
Копирование содержимого microSD-кapты на внешний флеш-накопитель
После завершения процесса копирования можно снова выключить устройство
Raspbeny Pi
и достать из него microSD-кapтy. Если все прошло нормально, то
Raspbeny Pi загрузится с USВ-нако
при следующем включении устройство
пителя.
Пояснение
Если вам нужно записать новый образ вместо того, чтобы копировать текущее
содержимое загрузочной microSD-кapты, можно обойтись только одной microSDкapтoй. Для этого между шагами 4 и 5 запишите на microSD-кapтy новый образ
операционной системы
Raspbeny Pi OS,
как описано в рецепте
1.6.
Дополнительные сведения
Ознакомиться с документацией по программе
Raspbeny Pi Imager
можно по адресу
https://oreil.ly/Q2F96.
1.1 О.
Подключение монитора
с разъемом
DVI или VGA
Задача
Подключить к
Raspbeny Pi
монитор, не имеющий разъема НDMI.
Решение
Это достаточно распространенная проблема. К счастью, она легко устраняется
-
если у вашего монитора нет разъема НDMI, можно использовать переходник для
имеющегося у него разъема:
DVI или VGA.
42
1
Глввв
1
Переходники для разъема
DVI
устроены проще и стоят дешевле. Выполнив в Сети
поиск по ключевой фразе переходник штекер DVI - гнездо HDMI, вы найдете множество
предложений по цене, в основном не превышающей
300
рублей.
Пояснение
В случае разъема
VGA
VGA
дело обстоит чуть сложнее, поскольку переходник
HDMI-
должен включать в себя электронные компоненты для преобразования циф
рового сигнала в аналоговый, поэтому постарайтесь не попасться на устройство,
которое их не содержит.
Официально признанная версия подходящего переходника НDMI-VGA называется
Pi-View
и предлагается всеми поставщиками
Raspberry Pi. Переходник Pi-View
Raspberry Pi и всегда будет с ними
протестирован на совместимость с устройствами
работать. Имейте в виду, что имеющиеся в Интернете более дешевые альтернативы
не всегда корректно работают с устройствами
Raspberry Pi.
Впрочем, учитывая, что все новые мониторы обладают разъемом НDMI, возможно,
будет лучше не искать переходник, а потратить чуть больше денег и приобрести
новый монитор.
Дополнительные сведения
Ознакомиться с советами по выбору переходника можно на сайте
eLinux
по адресу
https://oreil.ly/nQmSB.
1.11. Использование
монитора/телевизора
с композитным видеовходом
Задача
При выводе текста на экран вашего монитора с композитным видеовходом и низ
ким разрешением он становится неразборчивым.
Решение
Необходимо настроить устройство
Raspberry Pi
на использование разрешения, под
ходящего для небольших экранов.
Устройство
Raspberry Pi может выдавать два вида видеосигнала: 1)
2) композитный видеосигнал от аудиоразъема, для
ема НDMI и
сигнал от разъ
подсоединения
к которому требуется специальный кабель. При этом использование разъема НDMI
обеспечивает намного более высокое качество изображения по сравнению со вто
рым вариантом. Поэтому, если вы решили использовать монитор с композитным
входом в качестве своего основного монитора, лучше пересмотрите свое решение.
Однако если вы действительно собираетесь задействовать монитор с композитным
видеовходом
-
например, потому, что хотите иметь небольшой экранчик, то вам
Настройка и управлвнив
1
43
понадобится изменить несколько настроек в файле /booVconfig.txt с тем, чтобы выво
димое видео соответствовало размеру экрана.
Этот файл можно отредактировать на компьютере с операционной системой
или
Windows,
macOS
вставив свою SD-карту в считыватель SD-карт компьютера, либо не
посредственно на устройстве
Raspberry Pi,
не доставая из него карту памяти. Для
редактирования файлов непосредственно на устройстве
пользуется текстовый редактор
Raspberry Pi
обычно ис
Пользоваться им не так уж просто, и перед
nano.
редактированием своего первого файла я рекомендую вам внимательно ознако
миться с рецептом
3. 7.
Если вы уже готовы приступить к редактированию файла
в этом редакторе, введите в окне терминала следующую команду:
$ sudo nano /boot/config.txt
Чтобы выйти из редактора
клавиш
<Ctrl>+<X>,
nano
-
а затем
с сохранением результатов, нажмите комбинацию
клавишу <У> (для подтверждения) и клавишу
<Enter>.
Терминал
Если вы имеете дело с компьютером на операционной системе macOS или Windows, то,
возможно, не знаете, что такое терминал или командная строка. Поскольку операцион
ная система Raspberry Pi OS создана на основе Linux, далеко не вс~ в ней можно сде
лать с помощью графического интерфейса. При установке некоторых программ и на
стройке ряда возможностей операционной системы вам все же потребуется использо
вать консольные команды. Чтобы иметь общее представление о работе в терминале,
рекомендую вам немного забежать вперед и ознакомиться с рецептом
3.3.
Если при попытке редактирования файла непосредственно на устройстве
Pi
Raspberry
окажется, что текст на экране практически невозможно разобрать, лучше достать
SD-карту из устройства
Raspberry Pi
и вставить ее в компьютер. Найдите нужный
вам файл в каталоге SD-карты и отредактируйте его на компьютере с операционной
системой
Windows,
используя текстовый редактор типа
Notepad++.
Перед внесением изменений надо выяснить разрешение своего экрана
-
у многих
небольших экранов оно составляет 32Ох240 пикселов. Найдите в файле следующие
две строки:
#framebuffer width=1280
#framebuffer_height=720
Удалите знаки
#, стоящие в начале этих строк, и скорректируйте указанные здесь
значения ширины (width) и высоты (height) в соответствии с размерами вашего
экрана. Удаление знака
# ведет к активации строки. В частности, в случае экрана
с разрешением 32Ох240 следует внести следующие изменения:
framebuffer width=320
framebuffer_height=240
Сохраните файл, верните карту в свое устройство
Raspberry Pi
и перезапустите его.
Вы увидите, что текст на экране станет гораздо разборчивее. Возможно, вы также
обнаружите, что вокруг содержимого экрана теперь отображается толстая рамка.
Как это исправить, описано в рецепте
1.12.
44
1
Глава
1
Пояснение
Если, к примеру, вы хотите создать на базе
Raspberry Pi что-то вроде ретро
4.4), то для этой цели
консоли, позволяющей играть в старые игры (см. рецепт
хорошо подойдут многие из предлагаемых на рынке дешевых мониторов, исполь
зуемых в системах видеонаблюдения. Однако помните о том, что у таких монито
ров часто очень низкое разрешение.
Дополнительные сведения
Дополнительные указания по использованию мониторов с композитным входом вы
найдете в
обучающем
материале
компании
Adafruit
по адресу
https://oreil.ly/
Fykbw.
Для настройки изображения при использовании видеовыхода
с рецептами
HDMI
ознакомьтесь
1.10 и 1.12.
1.12. Настройка
размера изображения,
выводимого на экран монитора
Задача
Подключив монитор к устройству
Raspberry Pi,
вы можете обнаружить, что часть
текста не помещается на экране, или, наоборот, выводимое изображение занимает
не все доступное пространство.
Решение
Если проблема состоит в том, что изображение окружено толстой черной рамкой,
вы можете растянуть изображение на все доступное пространство, используя сред
ство настройки рабочего стола устройства
Raspberry Pi. Чтобы открыть этот инст
Raspberry Pi команду Preferences (Настрой
ки) 1 Raspberry Pi Configuration (Конфигурация Raspberry Pi) и перейдите в от
крывшейся панели (рис. 1.19) на вкладку Display (дисплей).
румент, выберите в меню устройства
Выйдите здесь из режима сжатой развертки,
Underscan
переведя переключатель режима
в выключенное положение. Обратите внимание, что внесенные вами
изменения вступят в силу лишь после щелчка на кнопке ОК, и перезагрузки уст
ройства
Raspberry Pi.
Противоположная проблема, при которой часть текста выходит за пределы экрана,
решается таким же образом
-
включением режима сжатой развертки.
Второй шаг сводится к тому, чтобы отредактировать файл /boot/config.txt. Это можно
сделать на компьютере с операционной системой
macOS
или
Windows,
вставив
свою SD-карту в считыватель SD-карт компьютера, либо непосредственно на уст
ройстве
Raspberry Pi,
не доставая из него карту памяти. Для редактирования файлов
непосредственно на устройстве
Raspberry Pi
обычно используется текстовый редак-
Настройка и управление
1
45
Sa-een Blanking:
Нeadless
Рис.
тор
1.19.
nano.
Resolution:
Управление режимом развертки с помощью инструмента RaspЬerry
Pi Configuration
Как уже упоминалось ранее, пользоваться им не так уж просто, и перед
редактированием своего первого файла я рекомендую вам внимательно ознако
миться с рецептом 3.
Если вы уже готовы приступить к редактированию файла
7.
в этом редакторе, введите в окне терминала следующую команду:
$ sudo nano /boot/config.txt
Найдите в файле раздел, относящийся к режиму растянутой развертки
(overscan).
Вам нужно отредактировать четыре строки, которые начинаются со знака
# и слова
overscan (на рис. 1.20 они расположены посередине).
w.wawit if you
get no picture on 11МI for о defau\t
•sof•• _ .
·~1
I.IX'JQl8МL tm.s if your displgy has о Ыасlс Ьorder of IRISed pixels
ond your displgy oan output wi:thaut eмtrsoan
visiЫe
sC3Ь1L.Ollel'scan-1.
-.,L the fo\lowi.ng to adjust 0\/erscan. Use positi.ve l'1LIIЬers if ccnso\e
off sueen, ond negotive i.f there is too ateh Ьorder
lfovlerscx1n.:left.16 ~
righЬ-16
IIIOlllll!t'SCXll'l....:'top.16
I.IIQJIN11L
t:o force
о
cxinsole size.
Ву
defau\t it wi\1
Ье
disp\41 1 s size lllinus
0\/erscan.
raneЬl.tffer_wi.dth-1288_
raneЬl.tffer..hei~728
lli WritelМ
1] Justi.fy
Рис.
1.20.
В Read File
IZ lhre Is
I
Prev PQll8 II C.ut Text lf Cur Pos
Next PQg8 ■ t.W:ut Textli То Scie\1
Управлением режимом растянутой развертки
46
1
Глава
1
Чтобы активировать эти строки, сначала удалите символ #, стоящий в начале каж
дой из них.
Затем экспериментальным путем подберите в этих строках те значения, при кото
рых изображение будет заполнять максимальный объем доступного пространства.
Обратите внимание, что эти четыре числа должны быть отрицательными. Так,
в качестве отправной точки можно присвоить им всем значение -20. Это приведет
к уменьшению используемой области экрана.
Чтобы выйти из редактора
клавиш
<Ctrl>+<X>,
nano
-
а затем
с сохранением результатов, нажмите комбинацию
клавишу <У> (для подтверждения) и клавишу
<Enter>.
Пояснение
Поскольку для проверки результата вносимых изменений требуется многократно
перезагружать устройство
Raspberry Pi,
эта процедура может оказаться довольно
утомительной. К счастью, ее придется выполнить лишь один раз. Кроме того,
большинство мониторов и телевизоров будут прекрасно работать без какой-либо
настройки размеров выводимого изображения.
Дополнительные сведения
Для настройки размеров выводимого изображения также можно использовать ути
литу
raspi-config,
доступную по адресу
https://oreil.ly/OQyQi.
1.13. Обеспечение
максимальной производительности устройства
Задача
Ваше устройство
Raspberry Pi
работает слишком медленно, и вы хотите сделать его
проворнее путем разгона процессора.
Решение
Ваше устройство вряд ли будет работать слишком медленно, если вы используете
модель
Raspberry Pi 3, 4 или 400 с четырехъядерным процессором. Однако
Raspberry Pi 1 и 2 действительно могут слегка «тормозить».
более
старые модели
Вы можете несколько повысить скорость работы модели
Raspberry Pi 1 или 2,
при
подняв тактовую частоту их процессоров. При этом устройство начнет потреблять
чуть больше энергии и чуть сильнее разогреваться (более подробно об этом расска
зано в разд. «Пояснение»).
Описываемый здесь метод разгона называется динамическим, поскольку подразу
мевает автоматическое отслеживание температуры устройства со снижением час
тоты при слишком большом нагреве. Такое снижение частоты называется дроссе
лированием.
Настройка и управление
Запустите утилиту
raspi-config,
1
47
выполнив в SSН-терминале команду:
$ sudo raspi-config
Выберите опцию
Overclock
(Разгон процессора)
ты разгона, показанные на рис.
-
вам будут предложены вариан
1.21.
Choose overclock preset
None 900MHz ARH, 250MHz core, 450MHz SDRAH, О overvolt
High 1ееемнz ARH, 500MHz core, 500MHz SDRAН, 2 overvolt
<Ok>
Рис.
1.21.
<Cancel>
Настройка разгона процессора с помощью консольной утилиты
Выберите один из предложенных вариантов. Если после этого
raspi-config
Raspberry Pi
начнет
работать нестабильно и время от времени зависать, попробуйте выбрать более
сдержанный вариант разгона. Если и это не поможет, отключите разгон процессо
ра, снова выбрав вариант
None
(Нет).
Пояснение
Разгон процессора может обеспечить весьма существенное повышение производи
тельности. Для оценки степени ускорения работы я провел ряд измерений, исполь
зуя модель Raspberry Pi В без корпуса при окружающей температуре в 15°С.
Проверочная программа содержала приведенный далее код на языке
Python.
Этот
код просто сильно загружает процессор вычислениями, не затрагивая какие-либо
другие операции вроде записи SD-карт, работы графики и т. п. Тем не менее это
позволяет получить общее представление о производительности процессора и та
ким образом оценить влияние разгона на скорость работы устройства
iq)ort
tiп.
def factorial (n):
if n == О:
return 1
else:
return n * factorial(n-1 )
before_time = time . process_time ()
for i in range (l, 10000):
factorial (200 )
after_time = time.process_time ()
print(after_time - before_time )
Raspberry Pi.
48
Глава
1
Мы немного забегаем здесь вперед, поэтому, если вы еще не знакомы с языком
Python,
вернитесь к этому месту, прочитав предварительно главу
Результаты проведенных мной тестов представлены в табл.
1.3.
5.
Измерение потреб
ляемого тока и температуры проводилось с помощью специальной измерительной
аппаратуры.
Таблица
Частота процессора
700
Время теста на скорость
МГц
1 ГГц
1.3. Разгон процессора
Потребляемый ток
Температура ( 0 С)
15,8 с
360
мА
27
с
420
мА
30
10,5
Как видите, производительность возросла на
33%,
но за это пришлось заплатить
ростом потребления тока и некоторым повышением температуры.
Заставить устройство
Raspberry Pi
работать на полную мощность вам поможет хо
рошо вентилируемый корпус. Хотя некоторые энтузиасты предпринимают попытки
по обеспечению платформы
Raspberry Pi
водяным охлаждением, я не вижу в этом
большого смысла.
Дополнительные сведения
Более подробную информацию о консольной утилите
адресу
raspi-config
можно найти по
https://oreil.ly/llwy6.
1.14. Изменение своего
пароля
Задача
Вам нужно изменить свой пароль.
Решение
После установки операционной системы
Raspberry Pi OS
на SD-карту вам будет
предложено создать учетную запись пользователя и соответствующий пароль. Этот
Raspberry Pi
Raspberry Pi). Чтобы открыть этот инструмент,
выберите в меню устройства команду Preferences (Настройки) Raspberry Pi
Configuration (Конфигурация Raspberry Pi) и перейдите на вкладку System (Систе
ма), где вы увидите кнопку Change Password (Изменить пароль) (рис. 1.22).
пароль можно всегда изменить в дальнейшем, используя инструмент
Configuration
(Конфигурация
1
Изменение пароля является тем единственным изменением, которое вступает в силу
без перезагрузки устройства
Raspberry Pi.
Настройка и управление
Нostлame.
raspЬeпypi
Вооt
0
То Desktop
O То Cll
О Wa1t for network
0
Splash Screen·
O DisaЫed
EnaЫed
Set Resolution
Resolutton:
Underscan:
0
EnaЫed
0
D1saЫed
Pixel DouЫing.
О EnaЫed
0
DisaЫed
ок
Canoel
1.22.
49
As curтent user
Autolog,n:
Network at Вооt
Рис.
1
Изменение пароля с помощью инструмента
Raspberry Pi Configuration
Пояснение
Изменить пароль также можно в окне терминала, просто выполнив команду
passwd:
$ passwd
Changing password for pi.
(current) UNIX password:
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successf ully
Дополнительные сведения
Для изменения пароля можно использовать и утилиту
адресу
raspi-config,
доступную по
https://oreil.ly/OQyQi.
1.15. Выключение устройства Raspberry Pi
Задача
Вам нужно выключить устройство
Raspberry Pi.
Решение
Откройте меню
Raspberry Pi,
щелкнув на соответствующем значке в левом верхнем
углу экрана . В открывшемся диалоговом окне вам будут предложены следующие
три варианта завершения работы (рис.
1.23):
Глава
50
1
Рис.
♦
Shutdown
1.23.
Выключение устройства
Raspberry Pi
(Завершение работы).
Выключение устройства
Raspberry Pi.
Для повторного включения устройства
надо будет отключить и снова подключить кабель питания, либо, в случае моде
ли
♦
Raspberry Pi 400,
Reboot
нажать кнопку питания на клавиатуре.
(Перезагрузка).
Перезагрузка устройства
♦
Logout
Raspberry Pi.
(Выход из системы).
Выход из системы с отображением полей, позволяющих ввести имя пользовате
ля и пароль для повторного входа в систему.
Перезагрузить устройство также можно, выполнив следующую команду в окне
терминала:
$ sudo reboot
Необходимость в такой перезагрузке может возникнуть, например, после установки
определенной программы. Запустив эту команду на выполнение, вы увидите пока
занное на рис.
1.24
предупреждение для всех пользователей устройства, что еще раз
демонстрирует многопользовательский характер операционной системы
Linux:
Широковещательное сообщение от root@raspberrypi 'pts/1' 'Пятница, 7 июня, 06: 23: 35
2013': Система СЕЙЧАС отключается для перезагрузки!
Рис.
1.24.
Завершение работы с устройством
Raspberry Pi
в окне терминала
Настройка и управление
1
51
Пояснение
Старайтесь всегда выключать устройство одним из описанных здесь способов
-
вместо того , чтобы просто отключать кабель питания. Дело в том , что в момент от
ключения питания устройство
кapтy,
Raspberry Pi
и неожиданное отключение питания
может что-то записывать на
microSD-
может привести к повреждению запи
сываемых файлов .
Выключение устройства
Raspberry Pi
одним из указанных способов в действитель
ности не ведет к реальному отключению питания. Устройство просто переходит
в режим пониженного энергопотребления , снижая и без того не слишком большое
его значение (к сожалению , само устройство
не управляет подведени
Raspberry Pi
ем питания к устройству.)
В случае модели
Raspberry Pi 400
(встроенной в корпус с клавиатурой) выключен
ное таким образом устройство можно снова включить , нажав клавишу
<Fl0>,
на
которую дополнительно нанесен символ кнопки питания .
Дополнительные сведения
При желании вы можете приобрести модуль , выполняющий реальное отключение
питания при выключении
Raspberry Pi
Raspberry Pi 8 .
О том, как можно снабдить устройство
кнопкой питания, рассказано в рецепте
1.16. Подключение к Raspberry Pi
13.13 .
модуля камеры
Задача
Вы хотите использовать устройство
Raspberry Pi
с подключенным к нему модулем
камеры.
Решение
Модуль камеры для
Raspberry Pi
(рис.
1.25)
подключается к устройству с помощью
ленточного кабеля-шлейфа .
'Н"" i.o•i."
-
,.,_ •W"-'
•
аос
2.l)e~
,-.wм
'°'t
to~
"А......
"'
Рис.
8
См. https://oreil.ly/Jsx_t:.
1.25.
Модуль камеры для
Raspberry Pi
.
Глава
52
1
Существуют три версии камеры для
зана на рис.
и
камера
1.25),
высокого
Raspberry Pi: исходная версия 1 (которая пока
2 - с чуть более высоким разрешением
более новая версия
!)азрешения,
объективов и разрешением в
которая
может
похвастаться
наличием
сменных
12 мегапикселов.
Шлейф камеры подключается к специальному разъему, расположенному на моде
лях
Raspberry Pi 2, 3
и
4
между звуковым разъемом и разъемом НDMI (рис.
1.26).
Высвободите защелки этого разъема, слегка потянув за рычажки с обеих его
сторон, а затем вставьте в него шлейф камеры таким образом, чтобы блестящие
металлические контактные площадки шлейфа бьши направлены в сторону от разъ
ема
Ethemet.
Затем зафиксируйте шлейф в разъеме, вернув на место откинутые за
щелки.
Рис.
1.26.
Подключение модуля камеры для
Raspberry Pi
к модели
Raspberry Pi 4
В
В документации к модулю камеры утверждается, что он боится статического элек
тричества. Поэтому, прежде чем взять его в руки, снимите с себя статический за
ряд, прикоснувшись к какому-либо заземленному объекту вроде металлического
корпуса компьютера.
Обратите внимание, что для модели
Raspberry Pi Zero
вам потребуется специаль
ный кабель или переходник, потому что в этой модели используется не полнораз
мерный, а уменьшенный разъем для камеры (см.разд. «Модули» приложения
1).
Чтобы задействовать модуль камеры, вам также нужно будет произвести некото
рую донастройку программного обеспечения. На момент подготовки книги произ-
53
Настройка и управление
водился постепенный переход от испол ьзования специфичного для
Raspberry Pi
программного интерфейса камеры к использованию библиотеки l ibcamera. Поэтому,
прежде
чем
следовать
далее
приведенным
инструкциям,
сначала
уточните ,
какое
программное обеспечение пригодно для вашего модуля камеры 9 .
Приведенные здесь инструкции предполагают использование « устаревшего » про
граммного обеспечения камеры для
Raspberry Pi ,
которое работает даже на доста
точно старых моделях устройств .
Поскольку
графическая
утилита
Raspberry Pi Configuration
(Конфигурация
не предлагает вам кнопки или переключателя для активации камеры ,
Raspberry Pi)
запустите в окне терминала консольную утилиту
raspi-config:
$ s udo ra sp-config
и в появившемся на э кране диалоговом окне с параметрами конфигурации устрой
ства
Raspberry Pi
выберите пункт
Interfacing Options
(Параметры интерфейсов)
откроется список команд для включения/отключения поддержки различных интер
фейсов, в том числе, помимо прочего , и камер (рис .
1.27).
Чтобы активировать под
держку устаревших камер, выберите в этом списке первый пункт и перезагруз ите
устройство
Raspberry Pi .
Raspberry Pi Software Configuration Tool (raspi - config)
Legocy Comero
SSH
VNC
SPl
12(
Seriol Port
I7 1-Wire
18 Remote GPlO
11
12
I3
14
15
16
EnoЫe/disoЫe
EnoЫe/disaЫe
EnaЫe/disaЫe
EnoЫe/disaЫe
EnaЫe/disaЫe
ErюЫe/disaЫe
EnoЫe/disoЫe
EnaЫe/disaЫe
legocy comero support
remote commond line occess using SSH
graphicol remote access using ReolVNC
automatic loading of SPI kernel module
automatic loading of I2C kernel module
shell messages on the seriol connection
one-wire interface
remote occess to GPIO pins
<Back>
<Select>
Рис.
Захват
неподвижных
raspis t ill
♦
1.27. Активация
И
камеры с помощью консольной утилиты
изображений
и
видео
производ ится
raspi-config
с
помощью
команд
rasp i vid :
чтобы захватить одно неподвижное изображение , выполните команду raspistill:
$ raspistil l
-о
i mage l . j pg
На экране появится окно предварительного просмотра , и спустя примерно
5
се
кунд полученный снимок будет сохранен в файле image1 .jpg, расположенном
внутри текущего каталога;
9
См. https://oгeil.ly/JNOwm.
54
♦
1
Глава
1
чтобы захватить видео, воспользуйтесь командой
$ raspivid
-о
Последнее
raspivid:
video.h264 -t 10000
число
в миллисекундах
-
в этой
строке задает длительность захватываемого видео
в показанном случае она составляет
1О
секунд.
Пояснение
Команды
raspistill и raspivid могут принимать множество параметров, список ко
торых можно отобразить путем их запуска без параметров.
Вы также можете купить версию модуля камеры для
инфракрасного фильтра,
Raspberry Pi,
лишенную
такую камеру можно будет использовать ночью при
-
инфракрасном освешении.
Альтернативу описанному здесь модулю камеры для
веб-камера с интерфейсом
USB
(см. рецепт
Raspberry Pi
может составить
Raspberry Pi
можно найти по
8.2).
Дополнительные сведения
Более подробную информацию о модуле камеры для
адресу
https://oreil.ly/diUuB.
1.17. Использование интерфейса Bluetooth
Задача
Вы хотите задействовать на своем устройстве
Raspberry Pi
интерфейс
Bluetooth.
Решение
Если вы используете
Raspberry Pi 3, 4
или
400,
то я могу вас обрадовать сообщени
ем, что эти устройства снабжены встроенной аппаратной поддержкой и интерфейса
Wi-Fi,
и интерфейса
старое устройство
терфейсом
USB.
Bluetooth.
Raspberry Pi,
Если же в вашем распоряжении находится более
к нему можно подключить Bluetooth-aдaптep с ин
И в том и в другом случае поддержка интерфейса
Bluetooth
обес
печивается с помощью программного обеспечения, входящего в состав операцион
ной системы
Raspberry Pi OS.
При использовании более старых моделей
с
Raspberry Pi
Raspberry Pi
следует иметь в виду, что
совместимы не все Bluetooth-aдanтepы. Хотя несовместимые адапте
ры встречаются очень редко, для пущей уверенности лучше выберите адаптер,
в описании которого явно говорится о совместимости с
Raspberry Pi. На рис. 1.28
Raspberry Pi 2 с подключенными к нему
Bluetooth-aдaптepoм с интерфейсом USB (в расположенном по центру разъеме
USB) и адаптером Wi-Fi с интерфейсом USB (в крайнем справа разъеме USB).
в качестве примера показано устройство
Настройка и управлвнив
Рис.
1.28.
Устройство
55
Raspberry Pi 2 с адаптерами Bluetooth и Wi-Fi с интерфейсом USB
Работа с Вluеtооth-подключениями реализована в операционной системе
Pi OS
1
примерно так же, как это сделано в операционной системе
верхнем углу экрана вы увидите значок интерфейса
Bluetooth
Raspberry
macOS.
1.29).
(рис .
В правом
Щелкнув
на этом значке, можно открыть меню настройки Вluеtооth-подключений (рис.
1.29).
1536
Tum 0ff Bluetooth
Make o,scoveraЫe
Рис.
1.29. Меню
настройки Вluеtооth-подключений в операционной системе
Чтобы подключить с помощью интерфейса
устройство вроде
клавиатуры,
выберите в
Bluetooth
Raspberry Pi OS
какое-либо периферийное
Add Device (Добавить
Add New Device (Добавить новое
меню пункт
устройство). В открывшемся диалоговом окне
устройство) вам будет предложен список из тех устройств, которые в настоящий
момент доступны для подключения , или, иначе говоря , для сопряжения (рис.
1.30).
Выберите здесь то устройство, сопряжение с которым вам нужно осуществить,
и просто следуйте инструкциям, выводимым на экран вашего
Raspberry Pi.
Пояснение
Вы можете произвести сопряжение с мобильным телефоном , Вluеtооth-динами
ками , клавиатурой или мышью. Как показывает мой опыт, новое Bluetooth-ycт-
56
1
Глава
1
Рис.
1.30.
Сопряжение
Raspberry Pi
с Вluеtооth-устройством
ройство не всегда удается подключить с первого раза. Поэтому, если сопряжение
с каким-то устройством не удается обеспечить с первой попытки, не сдавайтесь
сразу и попробуйте сделать это еще пару раз.
Хотя в большинстве случаев для добавления Bluetooth-ycтpoйcтв проще исполь
зовать описанный ранее графический интерфейс, это также можно делать и с по
мощью консольных команд.
Для настройки Вluеtооth-подключений из командной строки выполните команду
Ыuetoothctl:
$
Ыuetoothctl
[NEW] Controller В8:27:ЕВ:50:37:ВЕ raspberrypi [default]
[NEW] Device 51:6D:A4:B8:Dl:M 51-6D-A4-B8-Dl-M
[NEW] Device ЕВ:06:88:58:В2:В5 si's keyboard #1
[Ьluetooth]#
Эта команда проверяет наличие Bluetooth-ycтpoйcтв и делает доступной команду
pair для сопряжения с устройством, обладающим указанным идентификатором:
[Ьluetooth]#
pair
ЕВ:06:88:58:В2:В5
Дополнительные сведения
Ознакомиться
со
списком
Raspberry Pi,
можно по адресу
Приложение
Blue Dot для
Bluetooth-aдaптepoв,
совместимых
с
устройствами
https://oreil.ly/pULy3.
смартфонов на операционной системе
Android позволяет
Raspberry Pi оборудованием со своего смартфона, ис
Bluetooth. Пример такого подхода описывается в рецепте 11.8.
управлять подключенным к
пользуя интерфейс
При подключении к
Raspberry Pi
Вluеtооth-динамика вам также потребуется задать
этот динамик в звуковых настройках устройства в качестве звукового выхода
(см.рецепт
16.2).
ГЛАВА2
Работа с сетями
2.0. Введение
Мини-компьютер
Raspberry Pi
рассчитан на работу с подключением к Интернету.
Это одна из его ключевых особенностей, открывающая для него очень широкий
круг областей применения, включая домашнюю автоматизацию, поддержку веб
сервисов, сетевой мониторинг и т. д.
Большинство моделей
Raspberry Pi
позволяют устанавливать проводное подключе
ние к сети с помощью Еthеmеt-кабеля, а в более новых моделях имеется также
встроенная поддержка
Wi-Fi.
Работа с подключением к сети также означает возможность удаленного доступа
к
Raspberry Pi
с другого компьютера. Наличие такой возможности может быть
весьма полезным в тех случаях, когда
Raspberry Pi
используется в качестве бездис
плейного сервера, без подключения к нему клавиатуры, мыши и монитора.
В этой главе вам будут предложены рецепты действий по подключению устройства
Raspberry Pi
2.1.
к Интернету и удаленному управлению им по сети.
Подключение к проводной сети
Задача
Подключить
Raspberry Pi
к сети Интернет, используя проводной способ подклю
чения.
Решение
Прежде всего, надо сказать, что старые модели
не имеют разъема
RJ45
Raspberry Pi
А и
Raspberry Pi Zero
для подключения Еthеmеt-кабеля. Поэтому наилучший спо
соб организации доступа к сети этих устройств сводится к использованию адаптера
беспроводной сети, подключаемого к разъему
USB
(см.рецепт
Если же вы являетесь счастливым обладателем моделей
400),
Raspberry Pi (l, 2, 3, 4 или
- в этом случае на
RJ45 устройства Raspberry
а также моделей В или В+, то считайте, что вам повезло,
до лишь воткнуть один конец Еthеmеt-кабеля в разъем
Pi,
2. 5).
а другой его конец
маршрутизатора (рис.
- в
2.1 ).
одно из свободных гнезд на задней стороне домашнего
58
Глава
2
Ethernet-кaбeль
i
Рис .
2.1.
Подключение
Raspberry Pi
к домашнему маршрутизатору
Сразу после этого начнут мигать светодиодные индикаторы сетевого соединения,
свидетельствуя о том, что устройство
Raspberry Pi
подключается к сети.
Пояснение
Raspberry Pi OS по умолча
DHCP (Dynamic Host Configuration Protocol, протокол
При подключении к любой сети операционная система
нию использует протокол
IIUlo ► L,Nj ► DHCP
Elhlrnll
DНСР
...
.
1
DHCP1oмr.
S18111Plddrм1:
End IP lddl881:
1 1e2. 1&&.1.2s◄
Lии durolon :
llour(1)
О
mlr!Ulo{I) 0
DNSDom81n:
Pnm8f)'DNS•-•ddrм■ : \1e2.16&. l.l
-81)'0NS 1.-lddrм■ : (
----~-~
.
..
..... .
Do _ _,
1m
OpeoneO:
818111Р ■ddrмa:
о.о. о.о
End IP8ddrм ■ :
Q.0.0.0
онер,_,.
Рис.
2.2. Активация
протокола
о-
DHCP
на домашнем маршрутизаторе
Работа с сетями
1
59
динамической настройки узла). Поэтому, если ваша сеть поддерживает этот прото
кол, устройству
будет автоматически присвоен некоторый IР-адрес.
Raspberry Pi
Если индикаторы сетевого соединения мигают, но вы не можете войти в Интернет
на устройстве
используя браузер, проверьте, включена ли поддержка
протокола
управления сетью. Зайдите на страницу администрато
Raspberry Pi,
DHCP в консоли
ра домашнего маршрутизатора, авторизуйтесь, используя пароль администратора,
и установите соответствующий флажок, как показано на рис.
2.2.
Дополнительные сведения
Если вам нужно подключиться к беспроводной сети, обратитесь к рецепту
2.2.
2.5.
Определение IР-адреса устройства
Задача
Вам нужно узнать IР-адрес устройства
Raspberry Pi
для обеспечения связи с ним
при подключении к нему как к веб-серверу, пересылки файлов или удаленного
управления им с использованием протокола
VNC
(см. рецепт
SSH
(см. рецепт
2. 7)
или протокола
2.8).
Решение
Локальный адрес в формате
1Pv4
представляет собой число из четырех разделен
ных точками частей, однозначно идентифицирующее
в пределах сети сетевой
интерфейс отдельного компьютера.
Чтобы узнать IР-адрес своего устройства
Raspberry Pi,
введите в окне терминала
следующую команду:
$ hostname -I
192.168.1.16 fd84:be52:5bf4:ca00:618:fd51:lc
Первым элементом показанного ответа и будет локальный IР-адрес устройства
Raspberry Pi
в пределах домашней сети.
Пояснение
Устройство
Raspberry Pi
может иметь сразу несколько IР-адресов (по одному на
каждое сетевое соединение). Поэтому при использовании и проводного, и беспро
водного способа подключения ваше устройство получит два IР-адреса. Однако
в большинстве случаев вы будете использовать только один способ подключения.
Вывести информацию обо всех имеющихся сетевых подключениях можно с по
мощью команды
ifconfig:
$ ifconfig
Link encap:Ethernet HWaddr b8:27:eb:d5:f4:8f
ethO
inet addr:192.168.1.16 Bcast:192.168.255.255 Mask:255.255.0.0
Глава
60
2
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:l
RX packets:1114 errors:O dropped:l overruns:O frame:O
ТХ packets:1173 errors:O dropped:0 overruns:O carrier:O
collisions:O txqueuelen:1000
RX bytes:76957 (75.1 KiB) ТХ bytes:479753 (468.5 KiB)
lo
Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:O errors:0 dropped:O overruns:O frame:O
ТХ packets:0 errors:O dropped:0 overruns:O carrier:O
collisions:O txqueuelen:O
RX bytes:O (О.О В) ТХ bytes:O (О.О В)
wlanO
Link encap:Ethernet HWaddr OO:Of:53:a0:04:57
inet addr:192.168.1.13 Bcast:192.168.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST МТU:1500 Metric:l
RX packets:38 errors:O dropped:O overruns:O frame:O
ТХ packets:28 errors:O dropped:O overruns:O carrier:O
collisions:O txqueuelen:1000
RX bytes:6661 (6.5 KiB) ТХ bytes:6377 (6.2 KiB)
Показанные здесь результаты выполнения команды
устройство
Raspberry Pi
единения
( ethO)
192.168.1.13. В
ifconfig говорят о том, что
подключено одновременно и по проводному способу со
с IР-адресом
192.168.1.16,
и по беспроводному ( wlanO) с IР-адресом
качестве сетевого интерфейса 10 здесь указан виртуальный интер
фейс, позволяющий компьютеру общаться с самим собой.
Дополнительные сведения
Всю необходимую вам информацию об IР-адресах можно найти в Википедии по
адресу
2.3.
https://oreil.ly/71IwC.
Настройка статического IР-адреса
Задача
Вам нужно настроить IР-адрес устройства
Raspberry Pi
таким образом, чтобы он не
изменялся.
Решение
Хотя задать статический IР-адрес для устройства
Raspberry Pi
можно на нем самом,
лучше производить такую настройку в рамках сети, во избежание проблем в случае
перемещения устройства
Raspberry Pi
в другую сеть.
Все те компьютеры, телевизоры, смартфоны и другие посещающие Интернет уст
ройства, которые имеются у вас дома, как правило, подключаются к Интернету
Работа с сетями
1
61
через маршрутизатор, подсоединенный, в свою очередь, к подведенной к дому те
лефонной линии связи, беспроводной сети
зависимости
устройств
-
от
того,
как
подключено
4G
или к оптоволоконному кабелю. Вне
к
маршрутизатору
каждое
из
этих
с помощью беспроводного или проводного соединения, все они счи
таются элементами локш,ьной вычислительной сети
(Local Area Network, LAN).
И в случае подсоединения через Еthеmеt-кабель, и в случае подсоединения на
основе
Wi-Fi при подключении к локальной сети нового устройства (такого как
Raspberry Pi) контроллер локальной сети (маршрутизатор) по умолчанию выделяет
ему IР-адрес по протоколу DHCP. Адрес выделяется из некоторого пула IР-ад
ресов например, в диапазоне от 192.168.1.2 до 192.168.1.199 (или, возможно, от
10.0.0.2 до 10.0.0.199). То есть у всех устройств, входящих в одну локальную сеть,
варьируется только последняя, четвертая часть IР-адреса.
Выделяя устройству IР-адрес, протокол
DHCP
также указывает срок его аренды,
в течение которого устройству гарантируется возможность использования этого
IР-адреса без риска передачи его другому устройству. Обычно по умолчанию на
значается достаточно короткий срок аренды
-
так, на моем маршрутизаторе этот
срок составляет одну неделю. Это означает, что, возобновив работу над проектом
после недельной паузы, я могу обнаружить, что IР-адрес устройства
был без каких-либо предупреждений изменен. Если устройство
Raspberry Pi
Raspberry Pi при
этом используется без клавиатуры, мыши и монитора, то узнать его новый IР-адрес
и снова к нему подключиться будет достаточно сложно. В силу этого часто требу
ется задать для устройства
Обеспечить устройству
Raspberry Pi статический IР-адрес.
Raspberry Pi
неизменный IР-адрес можно, в частности, про
сто указав очень большой срок аренды протокола
DHCP
в настройках маршрутиза
тора. Для доступа к этим настройкам следует воспользоваться компьютером (при
желании можно задействовать и само устройство
Raspberry Pi,
но это не обязатель
но) и перейти по некоторому конкретному адресу, который часто указывается на
ряду с друтими данными на корпусе маршрутизатора как адрес маршрутизатора,
или адрес консоли администратора. В случае моего маршрутизатора
http://192.168.1.1.
-
это адрес
Затем нужно ввести имя пользователя и пароль. Заметьте, что эти
учетные данные отличаются от учетных данных, вводимых для точки доступа сети
Wi-Fi.
Они тоже, как правило, указываются на корпусе маршрутизатора и по умол
чанию часто представляют собой слова
«admin» и «password».
Зайдя в консоль администратора, найдите там страницу с настройками протокола
DHCP
(она выглядит примерно так, как показано на рис.
2.3)
и задайте максималь
но возможный срок аренды адреса. (Хотя в показанном случае нужный нам пара
метр так и называется
-Lease duration
(Срок аренды), у вас он может называться
как-то иначе).
Одним из недостатков описанного метода увеличения срока аренды является то,
что он затрагивает все устройства вашей локальной сети, и если их будет достаточ
но много, у вас рано или поздно закончатся свободные IР-адреса, поскольку прото
кол
DHCP будет высвобождать
го срока аренды.
старые IР-адреса лишь по истечении очень большо
62
Глава
2
.,,. DНСР Server
.
EnaЬte DНСР server:
Start IP address:
End IP address:
0
DNSmode:
OЬtain DNS eutomatically
О Manually configure the DNS server for LAN devices
Primary DNS server address:
Sec:ondary DNS se<W1r address:
Lease duration:
Рис.
2.3.
Изменение срока аренды протокола
DHCP
Более эффективный подход сводится к использованию так называемого DНСР
резервирования. При этом DНСР-серверу дается указание всегда выделять один и
тот же IР-адрес определенному устройству. Так, в показанном на рис.
зарезервировал IР-адрес
Raspberтy
Pi,
192.168.1.3
2.4
примере я
для устройства raspberтypi-Ethernet (устройства
подключенного к маршрутизатору с помощью Ethernet-кaбeля).
После этого при каждом подключении устройства
ему будет выделяться IР-адрес
192.168.1.3,
Raspberry Pi
к локальной сети
и этот IР-адрес никогда не будет выде
ляться другим устройствам.
,,, DHCP Reservation
l2f
Use thls address: 111 BB:27:EB:95:3D:B9
ЕnаЫе thls
rule:
Х
Edlt
Delete
111
IPaddress:
[ 192.168.1 3
МАС address:
[
raspЬerrypi-Ethemet
Adddevice
Рис .
2.4.
--
Использование DНСР-резервирования
Пояснение
В разных версиях операционной системы
Raspberry Pi OS
работа с сетями выпол
няется немного по-разному. Предлагаемые здесь инструкции относятся к последней
версии этой операционной системы на момент подготовки книги. Если вы исполь-
Работа с сетями
зуете не самую последнюю версию операционной системы
Raspberry Pi OS,
1
63
обяза
тельно обновите ее, потому что каждая новая версия несет с собой определенные
новшества и улучшения. О том, как это можно сделать, рассказано в рецепте
3.40.
Чтобы узнать, какая версия операционной системы у вас установлена, воспользуй
тесь рецептом
3.39.
Дополнительные сведения
Всю необходимую вам информацию об IР-адресах можно найти в Википедии по
адресу
https://oreil.ly/71IwC.
2.4. Задание сетевого
имени устройству
Raspberry Pi
Задача
Вам нужно изменить имя, под которым устройство
шей сети, чтобы оно не называлось просто
Raspberry Pi
«raspberrypi».
фигурирует в ва
Решение
Существует несколько способов решения этой задачи. К какому бы способу вы ни
прибегли, проследите за тем, чтобы выбранное вами сетевое имя представляло со
бой не содержащую пробелов последовательность букв, цифр и знаков дефиса
Кроме того, после каждой процедуры присвоения устройству
Raspberry Pi
(-).
сетевого
имени потребуется перезагрузить устройство для того, чтобы изменения вступили
в силу.
Задание сетевого имени
с помощью инструмента
Если устройство
Raspberry Pi
Raspberry Pi Configuration
не используется в бездисплейном режиме (без под
ключения монитора и клавиатуры), то настроить его сетевое имя проще всего с по
мощью инструмента
Raspberry Pi Configuration
(Конфигурация
Raspberry Pi).
Raspberry Pi команду
Preferences (Настройки) 1 Raspberry Pi Configuration (Конфигурация Raspbeгry Pi)
и перейдите в открывшейся панели (рис. 2.5) на вкладку System (Система).
Чтобы открыть этот инструмент, выберите в меню устройства
Введите в поле
Hostname
(Имя хоста) нужное вам имя и щелкните на кнопке ОК.
Вам будет предложено перезагрузить устройство для применения внесенных изме
нений (см.рецепт
1.15).
Задание сетевого имени с использованием командной строки
(простой способ)
Изменить сетевое имя устройства
утилиты
raspi-config.
$ sudo raspi-config
Raspberry Pi
также можно с помощью консольной
Введите в окне терминала следующую команду:
64
Глава
2
_ System
Password:
Hostname
Вооt
As current user
Autol091n:
О Wa1t for network
Network at Вооt
Splash Screen:
O OisaЫed
@ EnaЫed
Set Resolution
Resolution:
Underscan.
@ EnaЫed
O OisaЫed
Pixel OouЫ1ng
@ EnaЫed
О OisaЫed
ОК
Gancel
Рис.
2.5.
Изменение имени хоста с помощью инструмента
Raspberry Pi Configuration
Используя клавиши управления курсором, выберите в открывшемся окне этой ути
литы пункт
Network Options
(Сетевые параметры) и нажмите клавишу
экране появится форма для ввода нового сетевого имени (рис.
2.6).
<Enter>.
На
Поскольку ути
лита использует только интерфейс командной строки, ее можно задействовать и
в SSH-ceaнce (см.рецепт
Please enter
2. 7).
а
l10stnane
pi -desktop_____________________________________________ _
<Car1cel ;,,
Рис.
2.6.
Задание имени хоста для устройства
Raspberry Pi
с помощью утилиты
raspi-config
Работа с сетями
1
65
Задание сетевого имени с использованием командной строки
(более сложный способ)
Если вы не ищете легких путей, то можете напрямую отредактировать те файлы,
в которых определяется сетевое имя устройства
Raspbeny Pi.
Редактировать при
дется два файла.
Сначала отредактируйте файл /etc/hostname. Для этого введите в окне терминала
следующую команду:
$ sudo nano /etc/hostname
Замените в открывшемся файле имя raspberrypi на то, которое вы хотите использо
вать.
Затем откройте в редакторе файл /etc/hosts, выполнив следующую команду:
$ sudo nano /etc/hosts
Содержимое открывшегося файла будет выглядеть примерно так:
127.0.0.l
localhost
localhost
::l
fe00:: О
ff00: :О
ff02::l
ff02: :2
ipб-localhost
ipб-loopback
ipб-localnet
ip6-mcastprefix
ipб-allnodes
ipб-allrouters
127.0.1.1
raspberrypi
Запишите нужное вам имя вместо имени, указанного в конце этого файла (в строке
127.0.1.1
raspberrypi).
Пояснение
Выбрать для устройства
но
-
Raspberry Pi
какое-нибудь другое имя бывает очень полез
особенно в том случае, когда в сети присутствует сразу несколько таких уст
ройств.
Дополнительные сведения
В рецепте
2.3
также показано, как можно изменить IР-адрес устройства
Raspber-
ry Pi.
2.5.
Настройка беспроводного подключения
Задача
Подключить устройство
фейс
Wi-Fi.
Raspberry Pi
к Интернету, используя беспроводной интер
66
1
Глава
2
Решение
несколько
Существует
настройки
способов
соединения
для
Wi-Fi
устройства
Raspberry Pi .
Настройка соединения Wi-Fi
с использованием графического окружения
В последней версии
Raspberry Pi OS
настройка соединения
не представляет
Wi-Fi
никаких проблем. Для этого щелкните в правом верхнем углу экрана на значке сети
(где изображены два маленьких компьютера) - вы увидите список доступных вам
сетей
Wi-Fi .
Выберите свою сеть, после чего вам будет предложено ввести предва
рительно заданный общий ключ (пароль). Введите свой пароль. Спустя некоторое
время значок сети превратится в стандартный символ соединения
те подключены к сети
Wi-Fi
(рис.
Wi-Fi,
и вы буде
2.7).
06.57
~ _ _ _...,
···_···_··....
Pre-shared Кеу \,_·_··_
.,, H1de characters
ок
Рис.
Настройка соединения
2.7.
Подключение к сети
Wi-Fi
Wi-Fi
с помощью командной строки
Этот метод окажется крайне уместен , если вам нужно, чтобы после настройки со
Wi-Fi можно было бы сразу приступить к использованию устройства
Raspberry Pi без подключения к нему клавиатуры и монитора. Однако при этом
единения
придется обеспечить
к устройству,
временный сетевой доступ
к маршрутизатору с помощью Ethernet-кaбeля (см. рецепт
Для запуска уже знакомой нам утилиты
raspi-config
подключив его
2.1).
введите следующую команду :
$ sudo raspi - config
Используя клавиши управления курсором, выберите в открывшемся окне этой ути
литы пункт
System Options
(Параметры системы) , нажмите клавишу
выберите из появившегося списка (рис .
2.8)
пункт
Wireless LAN
<Enter>
и
(Беспроводная
локальная сеть).
После этого вам будет предложено ввести имя сети
Wi-Fi
(идентификатор
SSID)
поэтому если
ваше
и соответствующий пароль.
Пояснение
Соединение
устройство
Wi-Fi потребляет достаточно много энергии,
Raspberry Pi перестанет нормально загружаться
или начнет время от
Работа с сетями
S2
S3
54
S5
S6
S7
SB
Audio
Password
Hostnuie
Boot / Auto Login
Network at Boot
Splash Screen
Роwег LED
Setect audio out through HDМI or 3.5- jack
Change password for the 'pi' user
Set name for this computer оп а network
Select boot into desktop or to coмand line
Setect wait for network connection оп boot
Choose graphical sptash screen ог text boot
Set behaviour of power LED
<Back>
<Select>
Рис.
2.8.
67
Настройка соединения
Wi-Fi
с помощью утилиты
raspi-config
времени уходить в неожиданную перезагрузку, то, возможно, вам потребуется сме
нить свой источник питания на более мощный. В таком случае лучше выбрать ис
точник питания, способный выдавать как минимум
1,5 А, а если вы используете
Raspberry Pi 4 в сочетании с мощными периферийными устройствами
интерфейсом USB, запитайте его от источника питания, выдающего 3 А.
устройство
с
При
использовании устройства
цепт./.
1)
установить соединение
Raspberry Pi
Wi-Fi можно
в
качестве
медиацентра (см. ре
на странице настройки параметров
медиацентра.
Дополнительные сведения
На сайте
найдете список адаптеров
вместимых с устройствами Raspbeпy
том, как производится подключение
к
eLinux (https://oreil.ly/67Mnl) вы
Pi. О
проводной сети, рассказано в рецепте 2.1.
2.6.
Wi-Fi,
со
Подключение с помощью консольного кабеля
Задача
Обеспечить возможность удаленного доступа к устройству
Raspberry Pi
с другого
компьютера при отсутствии доступных сетевых подключений.
Решение
Подключитесь к
Raspberry Pi
с помощью консольного кабеля (это кабель особого
типа, который вы можете приобрести дополнительно,
.10женuя
1).
-
см. разд. «Прочее» прu
1 Глава 2
68
Энерrопотребленме
При подведении питания с помощью консольного кабеля максимальный потреб
ляемый ток обычно составляет
RaspЬerry
Pi,
500
мА, что вполне подходит для старых моделей
но окажется недостаточным для моделей RaspЬerry
Pi 4
и
400.
Если
вы работаете с этими моделями, то их следует запитать от отдельного источника
питания (см. рецепт
кабеля (см. рис.
2.11)
1.4),
не подключая красный провод питания консольного
к выводу
5V
на устройстве RaspЬerry
Pi.
Для применения этого метода потребуется активировать последовательный интер
фейс. Это значит, что, по крайней мере, на этапе настройки к устройству
Pi надо будет подключить
Для
активации
Raspberry
клавиатуру, мышь и монитор.
последовательного
интерфейса
выберите
в
меню
устройства
Raspberry Pi команду Preferences (Настройки) 1 Raspberry Pi Configuration (Кон
фигурация Raspberry Pi), перейдите в открывшейся панели (рис. 2.9) на вкладку
Interfaces (Интерфейсы), щелчком переведите в· активное положение переключа
тель параметра Serial Port (Последовательный порт), после чего щелкните на кноп
ке ОК.
VNC:
SPI:
12С:
Serial Port:
Serial Console:
1-Wire:
Remote GPIO:
Рис.
2.9. Активация
последовательного интерфейса
с помощью инструмента RaspЬerry
Pi Configuration
Как и в случае большинства других настроек
можно сде
лать и с помощью консольной утилить1
Raspberry Pi, то же самое
raspi-config. Для этого введите
в окне тер
минала следующую команду:
$ sudo raspi-config
в появившемся на экране диалоговом окне с параметрами конфигурации устройст
ва
Raspberry Pi
выберите пункт
Interfacing Options
(Параметры интерфейсов) и
в открывшемся списке команд для включения/отключения поддержки различных
интерфейсов выберите пункт
Serial (Последовательный),
как показано на рис.
2.1 О.
Работа с сетями
69
Raspber·r•y Pi Soft1var·e Co11figuratio11 Tool (t'aspi - cot1fig)
EnaЬle / DisaЫe
Pl Camera
PZ SSH
Р3 VNC
Р4 SPI
Р5 IZC
ErюЬle /Di sаЫе
EnaЬle / Di sаЫ е
EnaЬle / DisaЫe
6 Serial
Р7
Р8
1-1\i re
Remote GPID
Enable /DisaЬle
shell ond kernel
ЕпаЫ e/
011е - щi
Di sаЫ е
EnaЫe /DisaЫe
2.10.
re i 11te1•face
1·e111ote access to G
<Вас!.. >
<Select >
Рис.
co11nectio11 to the
I i 11
gPapl1 i cal 1·е11юtе а
auto111atic loadi11g
auto111atic loading
ЕпаЫе / DisаЫе l'erпote com1nш1d
Активация последовательного интерфейса с помощью утилиты
raspi-config
Использование консольного кабеля вполне уместно, если устройство
будет эксплуатироваться в бездисплейном режиме
-
Raspberry Pi
т. е. без клавиатуры, мыши и
монитора.
В качестве примера на рис.
нии
2.1 1 показано,
как выглядит консольный кабель компа
Adafruit.
Рис.
2.11.
Консольный кабель
Подсоедините кабель в описанном далее порядке, сверяясь с рис.
1.
Подключите красный провод
второй справа вывод разъема
(5 В)
GPIO).
к выводу
5V
устройства
2.11:
Raspberry Pi
(это
Глава
70
2
Если ваш консольный кабель подводит к устройству напряжение
используете устройство
Raspberry Pi 4
или
400,
3
В, или вы
потребляющее больше тока, чем
может подать на него последовательный кабель, то оставьте этот провод непод
ключенным и запитайте свое устройство как обычно
через питающий разъем
-
USB.
2.
Подключите черный провод
berry Pi (это третий
3.
«земля») к выводу
(GND,
справа вывод разъема
Подключите белый провод
(Rx)
GND
устройства
Rasp-
GPIO).
к 14-му выводу разъема
GPIO (TXD)- слева
от
черного провода.
4.
Подключите зеленый провод (Тх) к 15-му выводу разъема
GPIO (RXD) -
слева
от белого провода.
При использовании другого кабеля цвета проводов могут отличаться от указанных
здесь, поэтому, чтобы не повредить свое устройство
Raspberry Pi,
на всякий случай
всегда проверяйте назначение проводов в документации.
Напряжение питания
с разъемом
В, в частности, подводит к устройству консольный кабель
5
этой мощности достаточно для работы устройства
USB -
Raspberry Pi
в отдельности, но не для того случая, когда к нем подключено много вспомогатель
ных устройств.
При использовании компьютера с операционной системой
Windows
или
потребуется установить драйвер для консольного кабеля с разъемом
macOS вам
USB - какой
именно это будет драйвер, зависит от того, какую микросхему использует произво
дитель консольного кабеля. Так что лучше сначала ознакомьтесь с информацией,
размещенной на сайте производителя. Руководство компании
ции драйвера для операционной системы
macOS
Adafruit
по инсталля
вы найдете по адресу
https://
oreil.ly/RF9uE.
Чтобы подключиться к
Raspberry Pi
из операционной системы
macOS,
введите
в окне терминала следующую команду:
$ sudo cu -1 /dev/cu.usbserial -s 115200
После установки соединения нажмите клавишу
вести логин и пароль для устройства
пользуется логин
pi
с паролем
Чтобы подключиться
Windows,
к
<Enter>, и вам будет предложено
Raspberry Pi (рис. 2.12). По умолчанию ис
raspberry.
Raspberry Pi
с компьютера с операционной системой
потребуется предварительно скачать эмулятор терминала
PuTTY.
Запустив программу
PuTTY, выберите для параметра Connection type (Тип соеди
Serial (Последовательный) и укажите, что скорость должна состав
115 200 единиц. Кроме того, в качестве значения параметра Serial line (После
нения) вариант
лять
довательная линия) задайте используемый кабелем СОМ-порт. Обычно это порт
СОМ7, однако, если этот вариант не сработает, обратитесь для уточнения порта
к содержимому раздела Порты Диспетчера устройств операционной системы
Windows.
Осталось только щелкнуть на кнопке
Open
(Открыть), нажать клавишу
и ввести в открывшемся окне терминала логин и пароль для устройства
<Enter>
Raspberry Pi.
Работа с сетями
1
71
C1kl1.
[
3.71'>3881 systern<I[ ll: C1·eote<I sl ice systern systeш<l \xZ<lfsck.s\ ice.
\.1\'>161] r,ystr11111[l]: t~oш1ti11g l)PIJUg ГilP <,yst,•m ...
l
[
l.~l/4KIJ ilc l drv r11trirs drivrr
,)
L
К. ~1 Hi4KJ IJ11de1· - vol toqe <letected! (Ox(J00';0(J0'_
Rospbiш1
(;Nu , Li1111x 9 l'(ISpbe1тypi ttyS0
l"(ISpbe1·1·ypi \ogi11: pi
f>055WOI'(\;
1 ost I ogi 11: 111е Jon К 1/: 11 :04 (,МТ 701'> 011 ttyl
1 i1шх ra5pl,e1·rypi 4.14.11 - v7+ #1145 SMP rri Sep Zl l~,:38:3~, BST /018
Ol'ПIV11
Т11е
p1.•og1·<1n1s irкl u<le<l wi tl1 tl,e DeЬi 011 GNU/ L i tн1х system ar·e f ree softwш·e;
the exoct dist1··ib11t io11 te1'П1s for eoclr pr·ogrrun are described i11 tl1e
i11divid1ю\ fi \es in / 11sP1shaPe l doc/ • ! copyrigl1t.
Deblan GNU / Li11ux cornes- witl1 ABSOLUT[LY NO WARRANTY, to tl1e exte11t
pe1·mitted Ьу арр\ iсаЬ\е \aw.
SSH is е1юЬ\еd ond the default password fot· tl1e 'pi • 11ser hos not been cfranged.
This is а secur·ity ri5k - p\ease login as the 'pi • rJser and type 'pas5wd' to set
о new pas5word.
pi@r·aspberтypi
Рис.
2.12.
:-$
Подключение к устройству
Raspberry Pi
с помощью консольного кабеля
Пояснение
Поскольку с помощью консольного кабеля можно одновременно и подвести пита
ние к устройству
Raspberry Pi,
и обеспечить удаленный доступ к нему, этот способ
подключения хорошо подходит для путешествий налегке.
В тот конец консольного кабеля, на котором находится разъем
микросхема, обеспечивающая сопряжение интерфейса
USB
USB,
встраивается
с последовательным
интерфейсом СОМ. Для ее надлежащей работы иногда (в зависимости от исполь
зуемой операционной системы) требуется произвести установку соответствующих
драйверов. У становив подходящие драйверы, вы сможете использовать кабель
с любым преобразователем интерфейса
Подключать гнезда кабеля
USB-COM.
к нужным выводам устройства будет проще, если
вы аккуратно склеите их (или скрепите клейкой лентой) в нужной последователь
ности так, чтобы их можно было подключать к разъему
(см. рис.
Поиск нужной позиции на разъеме
разъема
GPIO
как единое целое
2.11).
GPIO -
например, шаблона
ние выводов устройства
Raspberry Pi
GPIO упрощает использование шаблона для
Raspberry Leaf (см. рецепт 10.1). Расположе
показано в приложении
2.
Дополнительные сведения
Дополнительные указания по использованию последовательного консольного ка
беля вы найдете в руководстве компании
Adafruit
по адресу
https://oreil.ly/DUlmc.
72
Глава
1
2
В описанном здесь примере используется кабель компании
кодом
Adafruit
с товарным
954.
2.7. Удаленное управление устройством Raspberry Pi
с использованием протокола SSH
Задача
Организовать удаленный доступ к устройству Raspbeпy
с использованием протокола
Pi
с другого компьютера
Pi
с использованием про
Secure Shell (SSH).
Решение
Чтобы можно бьmо подключаться к устройству Raspbeпy
токола
SSH,
сначала нужно включить поддержку этого протокола. В последних
версиях операционной системы Raspbeпy
струмента
Pi OS
это можно сделать с помощью ин
Raspberry Pi Configuration (Конфигурация
Raspbeпy
Pi).
Чтобы открыть этот инструмент, выберите в меню устройства Raspbeпy Pi команду
Preferences (Настройки) 1 Raspberry Pi Configuration (Конфигурация Raspbeпy
Pi), перейдите в открывшейся панели (рис. 2.13) на вкладку Interfaces (Интерфей
сы), переведите в активное положение переключатель SSH и щелкните на кнопке
ОК. После этого вам будет предложено перезагрузиться.
Рис.
2.13. Активация
протокола
Активировать протокол
SSH
SSH
с помощью инструмента RaspЬerry
Pi Configuration
также можно в диалоговом окне
(Дополнительные параметры) программы RаsрЬепу
Advanced options
Pi Imager (см.рецепт 1.8).
Если вы предпочитаете использовать командную строку, воспользуйтесь утилитой
raspi-config.
Ее можно запустить в любой момент, выполнив в окне терминала
команду:
$ sudo raspi-config
Работа с сетями
1 73
В появившемся на экране диалоговом окне с параметрами конфигурации устройст
ва
Raspberry Pi
выберите пункт
Interfacing Options
(Параметры интерфейсов) и
в открывшемся списке команд для включения/отключения поддержки различных
интерфейсов выберите пункт
SSH.
Если вы используете компьютер с операционной системой
подключения к устройству
Raspberry Pi
macOS
или
Linux,
то для
достаточно открыть окно терминала и вве
сти следующую команду:
$ ssh 192.168 . 1.16 -1 pi
Указанный здесь IР-адрес (192.168.1.16) является IР-адресом устройства
(см. рецепт
2.2).
ния к устройству (рис.
Рис.
2.14).
2.14. Подключение с использованием протокола SSH
Если вы используете компьютер с операционной системой
ключения к устройству
программы
Raspberry Pi
После этого вам будет предложено ввести пароль для подключе
Raspberry Pi
Windows,
то для под
надо будет запустить SSH-ceaнc с помощью
PuTTY (см.рецепт 2.6).
Пояснение
Протокол
SSH
очень часто используется для доступа к удаленным компьютерам и
позволяет запускать на них все те команды, которые вы можете выполнять непо
средственно на своем устройстве. Кроме того, как и предполагает его полное на
звание
(Secure Shell,
безопасная оболочка), при этом обеспечивается безопасная
зашифрованная связь.
В отличие от решения с использованием консольного кабеля, описанного в рецеп
те
2. 6,
решение с использованием протокола
если устройство
Raspberry Pi
SSH
сработает только в том случае,
подключено к той же сети, что и компьютер, с кото
рого вы пытаетесь к нему подключиться .
Единственным недостатком этого подхода является то, что он требует использова
ния командной строки и не позволяет задействовать графический пользовательский
74
Глава
1
2
интерфейс . Для удаленного доступа ко всему графическому окружению рабочего
стола устройства Raspberry Pi следует воспользоваться протоколом VNC (см. ре
цепт
2.8).
Дополнительные сведения
Ознакомиться с соответствующим руководством компании
су
Adafruit
можно по адре
https://oreil.ly/l8foc.
2.8. Удаленное управление устройством Raspberry Pi
с использованием протокола VNC
Задача
Получить удаленный доступ ко всему графическому окружению рабочего стола
устройства Raspberry Pi с другого компьютера на операционной системе Windows,
Linux
или
macOS,
используя протокол
VNC (Virtua\ Network Computing,
виртуаль
ные сетевые вычисления).
Решение
Для решения этой задачи следует воспользоватся программным обеспечением для
работы с протоколом
OS .
входящим в состав операционной системы
VNC,
Raspberry Pi
Однако, чтобы его задействовать, сначала нужно включить поддержку прото
Raspberry Pi . Это , в частности, можно сделать
Raspberry Pi Configuration (Конфигурация Raspberry Pi).
Выберите в меню устройства Raspberry Pi команду Preferences (Настройки)
Raspberry Pi Configuration (Конфигурация Raspberry Pi), перейдите в открывшей
ся панели (рис . 2.15) на вкладку Interfaces (Интерфейсы), щелчком переведите
кола
VNC
в настройках устройства
с помощью инструмента
1
-------
Raspbeн, Р Сопf, guratюn
01 р
"v ,lf'-n
rr-t
v
lnterfaces
SSH
VNC:
SPI:
12С·
Serial Port.
Serial Console:
1-Wire
Remote GPIO.
Рис.
2.15. Активация
протокола
VNC
х
Работа с сетями
в активное положение переключатель параметра
VNC,
1
75
после чего щелкните на
кнопке ОК.
Если к устройству
Raspberry Pi
не подключен монитор, надо будет указать разре
шение виртуального монитора, отображаемого на экране компьютера, с которого
вы подключаетесь к устройству
можно сделать на вкладке
guration
(рис.
Raspberry Pi с использованием протокола VNC. Это
Display (Дисплей) инструмента Raspberry Pi Confi-
Чтобы вам не приходилось прокручивать содержимое вирту
2.16).
ального экрана, выберите для него чуть меньшее разрешение по сравнению с раз
решением монитора компьютера, на котором он будет отображаться.
Underscan:
Screen Blanking:
1280х1024
Headless Resolution:
Cancel
Рис.
2.16.
Настройка разрешения виртуального экрана
с помощью инструмента
Raspberry Pi Configuration
На удаленном компьютере, с которого вы будете подключаться к устройству
Raspberry Pi,
ве
такого
нужно установить программное обеспечение VNС-клиента. В качест
клиента
VNC Viewer
macOS.
многие
компании
Когда вы запустите
Windows
или
macOS,
пользователи
Rea!VNC1,
эту
предпочитают
использовать
у которой есть версии для
программу на
программу
Windows, Linux
компьютере с операционной
и
системой
вам будет предложено сначала указать IР-адрес того
VNC-
cepвepa, к которому вы хотите подключиться (т. е. IР-адрес вашего устройства
Raspberry Pi),
Поля
а затем ввести свои логин/пароль (рис.
Catchphrase
2.17).
(Любимая фраза) и
сации взлома вашего устройства
Signature (Подпись) здесь служат для фик
Raspberry Pi - если при следующей аутентифика
ции содержимое этих полей изменится, это будет говорить о том, что, возможно,
кто-то взломал ваше устройство.
Пояснение
Протокол
VNC
будет работать лишь в том случае, если устройство
Raspberry Pi
и
удаленный компьютер, с которого осуществляется доступ, находятся в одной сети.
Некоторые VNС-клиенты позволяют пересылать файлы между компьютером и
1
См. http://www.realvnc.com.
Глава
76
2
•••
Authen
,са
:on
VNC Setver: 192.168.1.210::5900
Usemame:
Password:
RememЬer
-----------pi
password
Catchphrase: Network percent Ыonde. Pagoda ship koala.
Signature:
27-с7-С7-Ос:-а0-61 -d7-ЗЬ
Connecting to 19:2.188.1.210...
Stop
Рис.
устройством
Raspberry Pi,
2.17.
Аутентификация VNС-подключения
а также удаленно производить копирование и вставку
текста.
Хотя почти все это можно делать и в командной строке, используя протокол
иногда бывает полезно иметь доступ к графической среде устройства
VNC-cepвep автоматически запускается на
Raspberry Pi при
VNC.
SSH,
Raspberry Pi.
его перезагрузке, если
в настройках системы включена поддержка протокола
Дополнительные сведения
Ознакомиться с соответствующим руководством компании
су
Adafruit
можно по адре
https://oreil.ly/НfМ9y.
Протокол
VNC также мож,ю активировать
Raspberry Pi (см.рецепт 1.6).
на этапе начальной настройки нового
устройства
2.9.
Использование
Raspberry Pi
в качестве сетевого хранилища
Задача
Использовать устройство
Raspberry Pi в качестве сетевого хранилища данных
(Network-Attached Storage, NAS) таким образом, чтобы входящие в вашу сеть ком
пьютеры могли получать доступ к USВ-накопителю. подключенному к устройству
Raspberry Pi.
Решение
Решить эту задачу можно путем установки и настройки сервера SашЬа. Для этого
введите в командной строке следующие команды:
Работа с сетями
$ sudo apt update
$ sudo apt install
$ sudo apt install
1 77
samЬa
samЬa-co111110n-bin
Затем подключите к устройству RaspЬerry
Pi
USВ-накопитель. Он автоматически
смонтируется в папку /media/pi. Чтобы убедиться в этом, выполните следующие
команды:
$ cd /media/pi
$ 1s
На экран будет выведено имя накопителя, присвоенное ему при форматировании.
Этот диск станет автоматически монтироваться при каждой перезагрузке устройст
ва
Raspberry Pi.
Запишите где-нибудь его имя, поскольку оно нам вскоре понадо
бится.
Теперь необходимо настроить сервер
Samba
таким образом, чтобы бьm обеспечен
совместный дос~уп к дяску по сети. Для этого надо сначала добавить нового поль
зователя сервера
$ sudo
Samba (pi).
SIIIЬpasnd -а
Выполните следующую команду и введите пароль:
pi
New SМВ password:
Retype new SМВ password:
Added user pi.
Теперь нужно немного изменить содержимое файла /etc/samba/smb.conf, поэтому
введите следующую команду:
$ sudo nano
/etc/samЬa/snt>.conf
Прежде всего, найдите в начале открывшегося файла строку:
workgroup =
WORКGROUP
Вносить изменения в нее следует лишь в том случае, если вы собираетесь подклю
чаться к хранилищу с компьютера с операционной системой
но быть указано имя рабочей группы
системы
Windows
Windows.
Windows.
Здесь долж
В последних версиях операционной
в качестве такового используется имя woRКGROUP. Следует заме
тить, что сетевое хранилище обычно прекрасно работает и в том случае, когда
в сети присутствуют компьютеры с разными операционными системами:
Windows
или
macOS,
Linux.
Затем перейдите в конец файла и добавьте следующие строки, подставив вместо
имени NAS имя USВ-накопителя, которое вы отметили для себя ранее:
[USB]
path = /media/pi/NAS
coпrnent = NAS Drive
valid users = pi
writeaЫe = yes
browseaЬle = yes
create mask = 0777
puЫic = yes
Глава
78
2
Сохраните этот файл и перезагрузите сервер
$
sudo systemctl restart
Samba с
помощью команды:
smЬd
Если все было сделано правильно, с этого момента совместный доступ к USВ
накопителю по сети будет обеспечен.
Пояснение
Чтобы подключиться к сетевому хранилищу с компьютера с операционной систе
мой
macOS,
пункт
выберите пункт
Connect to Server
Go
(Переход), а затем
-
в меню программы
(Подключение к серверу) и в поле
Finder -
Server Address
(Адрес
сервера) введите адрес smЬ: //raspberryp1/usв. После этого откроется диалоговое окно
для ввода учетных данных сервера
-
введите здесь имя пользователя
pi (рис.
2.18).
Enter your name and pusword for the server
•rupЬ.rrypi".
Connect as:
8
Cuest
Registered User
Pa11word: •••••••••
RememЬer thi1 pusword ln my keychaln
Рис.
2.18.
Подключение к сетевому хранилищу в операционной системе
с помощью программы
На компьютере с операционной системой
macOS
Finder
Windows
подключение к сетевому храни
лищу может выполняться по-разному в зависимости от установленной на нем вер
сии
Windows.
Однако в любом случае на определенном этапе вам нужно будет вве
сти сетевой адрес
-
используйте в этом качестве адрес
\ \raspberrypi \usв (рис. 2.19).
После этого вам будет предложено ввести имя пользователя и пароль для доступа
к сетевому диску. Это придется сделать только при первом подключении. К добав
ленному новому сетевому диску можно будет переходить непосредственно в про
грамме Проводник
(File Explorer)
На компьютере с операционной
(рис.
2.20).
системой Linux
смонтировать сетевой диск можно,
выполнив следующие команды:
sudo mkdir /pishare
$ sudo smЬmount -о username=pi,password=raspberry //192. 168,1.16/USB /pishare
$
Эти команды должны обеспечить вам возможность подключения к
с использованием соответствующего имени хоста
(raspberrypi).
Raspberry Pi
Если они не ера-
Работа с сетями
79
IR\
Add Helwork Pldt:e Wiza1 d
W'hat ia the address ol thia network place?
Туре
the .!lddreS$ of the \v'eb site, FТ Р $ite, or network loc.!ltion th.!lt tм shortcut w1I open
lnte,net or network ~esi:
vl I B1owse...
Yiew some exoroples.
1 <B~k
Рис.
2.19.
)1
Neнt >
l[
Подключение к сетевому хранилищу в операционной системе
C-,ncel
Windows
deleteme.doc
Мlcrosoft Offкe
Word 97 • 20 ...
21 кв
Рис.
2.20.
Просмотр содержимого сетевого храниnища в операционной системе
ботают, попробуйте указать IР-адрес устройства
smЬ:
Raspberry Pi
Windows
следующим образом :
/ /1 92. 168 . 1 . 16/USB.
Дополнительные сведения
При желании вы можете присвоить устройству
ное имя (см.рецепт
2.1 О.
Raspberry Pi
какое-нибудь необыч
2.4) .
Настройка сетевого принтера
Задача
Вам нужно производить печать с устройства
Raspberry Pi
на сетевом принтере .
ВО
Глава
2
Решение
Воспользуйтесь сервером печати
тема печати
CUPS (Common UNIX Printing System,
общая сис
UNIX).
Сначала установите эту программу, для чего введите в окне терминала следующие
команды (процесс установки может занять достаточно длительное время):
$ sudo apt update
$ sudo apt install cups
Чтобы сервер печати
CUPS
запускался с правами администратора,
выполните
команду:
$ sudo usermod
-а
-G lpadmin pi
Эта команда добавляет пользователя pi в группу lpadmin, используемую сервером
печати
CUPS,
тем самым обеспечивая вам право на выполнение печати.
Поскольку настройка сервера печати
фейса, запустите из меню устройства
в адресной строке адрес
CUPS производится с помощью
Raspberry Pi браузер Chromium
Administration (Администрирование) и щелкните на кнопке
- вы увидите список доступных сетевых принте
подключенных напрямую к USВ-порту устройства Raspberry Pi
(Добавить принтер)
ров и принтеров,
(рис.
2.21 ).
ф
localhost:631/admin/
Adпiлis1rafion
Add Printer
Add Printer
Local Pnnters:
Dtscovered Netwllrk Prtnfers:
8
8
8
8
VNC Remole Prinler (VNC Printer)
Вrotller DCP-9015COW (Вrother DCP-9015CDW)
Вrother DCP-9015COW (Вrolher DCP-9015COW)
Вrother DCP-9015COW (Вrother DCP-9015COW)
Olhet' Netwllrk Prtnters: Ф вaekend Вror Handler
•
AppSocketlНP Je!Dired
8
8
fntemet Priniing Prolocol {ippl4)
fnlemet Printing Prolocol (ipp)
ф LPOILPR Host Of Printer
О fntemet Priniing ProlDCol (hl!ps)
8
8
fntemet P!iniing Prolocol (htlp)
fntemet Priniing Prolocol (ipps)
Cootinue
Рис.
и введите
http: //localhost: 631.
Перейдите на вкладку
Add Printer
веб-интер
2.21.
Обнаружение принтеров с помощью сервера печати
CUPS
Работа с сетями
1
81
После этого нужно просто продолжить процесс настройки принтера в дальнейшей
серии диалоговых окон.
Пояснение
По завершении процесса настройки можно опробовать новый принтер, используя
программный пакет
LibreOffice
(как его установить, описано в рецепте
4.2).
Введи
те некоторый текст и попробуйте отправить его на печать. При этом среди доступ
ных принтеров вы должны увидеть и тот принтер, который только что добавили
(рис.
2.22).
-
: .
210mm
□
)(
А4
Printa File...
lllother...DCIЧI01 SCDW_vi<I_VNC.JюпLSjмadюok
+ Detals
........ c:..NumЬer of oopie,
0AНpages
о P.l!Jesl~1- - - - ~
[i21eollate
~~
О Se!Ect,on
о
f'r1nt
IП --pageo,d8r
Рr1м
Comments
None doa,m«1t on
ок
Не1р
Рис.
2.22. Диалоговое
окно печати документа
Дополнительные сведения
Посетите официальный сайт программы
CUPS
по адресу
http://www.cups.org.
ГЛАВА
3
Операционная система
3.0.
Введение
В этой главе мы рассмотрим многие из возможностей операционной системы
Linux,
реализуемые на устройствах
Raspberry Pi.
Значительная часть их требует
умения работать с командной строкой. Если вы привыкли использовать графиче
ский интерфейс операционной системы
Windows
или
macOS,
это может оказать на
вас шокирующее воздействие. Однако, хотя бы немного освоившись с выполнени
ем различных действий в командной строке, вы увидите, что такой подход спосо
бен быть на удивление эффективным.
Впрочем, ряд простейших файловых операций вроде перемещения, переименова
ния, копирования и удаления файлов можно и в
графического интерфейса
темах
3.1.
Windows и macOS,
-
Linux выполнять
с использованием
подобно тому, как это делается в операционных сис
и именно этому посвящен наш первый рецепт.
Работа с файлами
с использованием графического интерфейса
Задача
Вы хотите перемещать файлы с использованием графического интерфейса
как это делается в операционных системах
-
так,
Windows и macOS.
Решение
Воспользуйтесь программой
File Manager
(Файловый менеджер), окно которой
показано на рис.
3.1. Дnя ее запуска выполните из меню устройства Raspberry Pi
команду Accessories (Стандартные) File Manager (Файловый менеджер).
1
В окне этой программы можно перемещать файлы и каталоги из одного каталога
в другой путем перетаскивания или путем копирования и вставки с помощью меню
Edit (Правка). Все это делается примерно так же, как при использовании програм
мы File Explorer (Проводник) в операционной системе Windows или программы
Finder в операционной системе macOS.
Операционная система
fl:
~ ➔
•
1'
Ьооt
►
/home/pi
11
.
Вookshelf
Desktop
Music
Pictures
Ьiп
•
■
► - dev
etc
home
Documents Downloads
а а
11
PuЬlic
Templates
о
tmp
Videos
Pifm.tar.qz
Free space
Рис.
3.1.
83
Программа
23.б
G1B (Тotal 28.8 GiB)
Flle Manager
Пояснение
В левой области окна программы
File Manager
(Файловый менеджер) отображает
ся структура папок. В центральной его области показывается содержимое текущей
папки, по которому можно перемещаться, используя кнопки панели инструментов
или указывая путь к файлу в расположенном выше поле ввода.
Щелкнув на файле правой кнопкой мыши, можно открыть контекстное меню с дос
тупными для этого файла вариантами действий (рис.
-
•- -
- - - ~ -~----~--~1
•
1 ( О
3.2).
-~~
1
~
-
-~---
-·
V
-·
...
)(
File Ed1t View sort Go Tools
,i
~ ➔
1'
/home/p1/Bookshelf
V
---=====
Ореп
PDFVJftNer
Ореп
W1th.
COmpreaэ
Cut
Сору
Move to WasteЬasket
СОру
Path(t)
• Rename.
Propert1es
Рис.
б G1B (Тotal
28 В G1B)
3.2. Щелчок на файле правой кнопкой мыши открывает контекстное меню
с доступными вариантами действий с этим файлом
Вы также можете выбрать для копирования или перетаскивания сразу несколько
файлов. Для этого следует выполнять щелчки на нужных файлах, удерживая нажа
той клавишу
<Ctrl>,
или выбрать непрерывный диапазон файлов, щелкнув сначала
84
Глава
1
3
на первом файле этого диапазона, а затем, удерживая клавишу
<Shift>,
по послед
нему его файлу.
Дополнительные сведения
О том, как можно переименовать файл или папку, рассказывается в рецепте
3.2.
3. 6.
Копирование файлов на флеш-накопитель
с интерфейсом
USB
Задача
Вам нужно скопировать файл с устройства RaspЬerry
терфейсом
Pi
на флеш-накопитель с ин
USB.
Решение
Вставьте USВ-накопитель в USВ-порт устройства. На экране должно открыться
3.3. Щелкните на кнопке ОК,
File Manager (Файловый менеджер).
диалоговое окно, показанное на рис.
USВ-накопитель в программе
чтобы аrкрыть
RenlaAible . . . . . . . . . . .
T~ofmedt\.11'/1 iemovablecisk
Selec:t lhe ac:tion yotl W8nt to perform:
Рис.
3.3. Диалоговое
окно, отображаемое при вставке съемных носителей
Вставленный накопитель будет смонтирован в папку с тем же именем (в моем слу
чае это UNTITLED) внутри папки /media/pi. Чтобы скопировать в нее файл из своей
домашней папки, перетащите его в папку, представляющую флеш-накопитель, как
показано на рис.
3.4.
В операционных системах
Windows, macOS
и
Linux
используются разные форматы
дисков. Для максимальной совместимости с компьютерами на операционных сис
темах
macOS
и
Windows
ваш
USВ-накопитель должен быть отформатирован
Операционная система
Desktop
Network
MagP1
Music
python..gam
es
raspЬerrypi..
Documents Downloads
Pictures
PuЬlic
Trash Folder
85
cookЬook...e
d -
'il
~
Templates
Videos
1
testJxt
О lost+found
e □ media
е
1Т\..ЕD
Free s асе: 23 9 G1B (Тotal 28 9 GiB)
151
Рис .
в формате
3.4.
FА Т32
Копирование файла на USВ-накопитель путем его перетаскивания
или
exF АТ .
Надо отметить , что формат
зовать диски большего размера по сравнению с
exF АТ
позволяет исполь
FА Т32 .
Пояснение
На USВ-накопитель, подключенный к файловой системе устройства
также
можно копировать файлы с
и
использованием
Raspberry Pi,
командной строки . Так,
например, чтобы скопировать на флеш-накопитель файл
test.txt,
надо выполнить
в командной строке следующие команды :
$ cd /home/pi
$
ер
test . txt / media/pi/UNT ITLED/
Команда cd здесь используется для смены текущего каталога, а команда ер непо
средственно производит копирование . Более подробно эти команды рассматрива
ются в рецептах
3.4
и
3.5.
Дополнительные сведения
Основы работы с программой
в рецепте
в рецепте
3.1 .
3.4.
File Manager
(Файловый менеджер) рассмотрены
Копирование файлов с использованием командной строки описано
3.3. Открытие окна терминала
Задача
В процессе работы с устройством
команды в окне терминала.
Raspberry Pi
вам требуется вводить текстовые
86
Глава
3
Решение
Щелкните в верхней части рабочего стола устройства
Raspberry Pi
на значке терми
нала (где изображен черный экран компьютера) или выполните в меню
команду
Accessories
(Стандартные)
1
Terminal (Терминал)
(рис.
Raspberry Pi
3.5).
Progrвmming
~
0ff1ce
8
intemet
.W.Games
8
Qнelp
>
Archiver
11 C&lculator
File Manager
!il Preferences
lmage Viewer
<11/(}Run ...
•
PDFViewer
■ Shutdown ...
[]
SD card Copier
j
Task Manager
Рис.
3.5.
Открытие окна терминала
Пояснение
При открытии окна терминала в качестве исходного пути в нем задается ваш
домашний каталог (/home/pi).
Вы можете открыть любое нужное вам количество окон терминала. У доб но иметь
открытыми два окна с разными текущими каталогами, чтобы не приходилось по
стоянно переключаться между каталогами с помощью команды cd (см. рецепт
3.4).
Все, что вы вводите в окне терминала, чувствительно к регистру. Это значит, что
каждую команду следует вводить с использованием правильного регистра. Напри
мер, в случае команды ls, о которой пойдет речь в следующем рецепте, следует
вводить именно две буквы нижнего регистра: ls, а не какое-либо иное сочетание
букв: 1s, Ls или 1s. Такой же чувствительностью к регистру обладают и все вводи
мые вами имена файлов
-
т. е. имена picture.jpg и Picture.jpg будут относиться к двум
разным файлам.
Дополнительные сведения
О том, как с помощью терминала перемещаться по структуре каталогов, рассказано
в рецепте
3.4.
Операционная система
3.4.
87
Перемещение по файловой системе
с использованием терминала
Задача
Вы хотите узнать, как с помощью терминала производить смену текущего каталога
и перемещаться по файловой системе.
Решение
Для перемещения по файловой системе используется главным образом команда cd
сменить каталог). После собственно команды указывается тот ка
(change directory,
талог, в который вам нужно перейти. Он может быть задан либо своим относи
тельны:и путем к нему внутри текущего каталога, либо абсолютным путем к како
му-либо другому месту в вашей файловой системе.
Узнать, в каком каталоге вы сейчас находитесь, можно с помощью команды pwd
(print working directory,
распечатать рабочий каталог).
Пояснение
Давайте для ясности рассмотрим несколько примеров. Откройте окно терминала.
Вы должны увидеть примерно следующее приглашение командной строки:
pi@raspberrypi: ~ $
Такое приглашение (pi@raspberrypi:
~ $) отображается после выполнения каждой
команды в качестве напоминания о том, какое имя пользователя (pi) и имя компью
тера (raspberrypi) вы используете. Символом тильда
«~»
сокращенно обозначается
домашний каталог пользователя (каталог /home/pi или другой каталог, в зависимо
сти
от того,
Raspberry Pi).
какое
имя
пользователя
вы
выбрали
при
настройке
устройства
Соответственно, вы в любой момент можете перейти в свой домаш
ний каталог с помощью следующей команды:
$ cd
~
В начале всех строк, предполагающих ввод команд, в этой книге ставится пригла
шение командной строки в виде знака $. Ответный вывод команд не предваряется
никакими
символами
устройства
и
записывается
именно
так,
как
он
выглядит
на
экране
Raspberry Pi.
Убедиться в том, что вы действительно перешли в домашний каталог, можно с по
мощью команды
pwd:
$ pwd
/home/pi
Если вам надо подняться на один уровень вверх в структуре каталогов, то это мож
но сделать, поставив после команды cd специальное значение
..
(две точки):
88
Глава
3
$ cd ..
$ pwd
/ home
Как вы уже, вероятно, заметили, путь к конкретному файлу или каталогу составля
ется из слов, разделяемых симВО[Iами косой черты
«/».
При этом путь, обозначен
ный одной косой чертой, ведет к корневому каталогу всей файловой системы , а
чтобы сослаться на домашний каталог внутри корневого, нужно указать путь /home/ .
Чтобы найти внутри этого каталога каталог pi, надо задать путь / home/pi / . Послед
нюю косую черту при желании можно опустить .
Пути могут быть абсолютными (в этом случае они начинаются с косой черты и
указывают полный путь от корневого каталога) или относительными (в этом слу
чае они используют в качестве отправной точки текущий рабочий каталог и соот
ветственно не должны начинаться с косой черты) . Например, далее показано, как
можно перейти в домашний каталог из корневого, используя для этого относитель
ный путь (предполагается, что вы используете имя пользователя pi):
$ cd /
$ pwd
/
$ cd home / pi
$ pwd
/ home/pi
В своем домашнем каталоге вы будете иметь полные права на чтение и запись всех
файлов, но при переходе в те места, где хранятся системные файлы и приложения ,
права доступа к некоторым файлам будут ограничены до доступа только для
чтения. При желании эти ограничения можно снять (см. рецепт
3.12),
однако это
требует некоторой осмотрительности.
Проверьте содержимое корневого каталога структуры каtалогов, выполнив коман
ды cd / и l s, как показано на рис.
Рис.
3.6.
3.6.
Отображение содержимого корневого каталога
В нашем случае команда ls
(list,
список) выводит на экран названия всех файлов и
каталогов, расположенных в корневом каталоге
присутствует и каталог
home,
(/).
Помимо прочих, в этом списке
из которого мы только что перешли в корневой ката
лог.
Теперь перейдите в один из этих каталогов и отобразите его содержимое, как пока
зано на рис .
3.7.
Операционная система
Рис.
3.7.
89
Переход в другой каталог и отображение его содержимого
Как вы можете заметить, при отображении названий файлов и папок в окне тер
минала применяется определенное цветовое кодирование. Если для файлов могут
использоваться разные цвета, то папки всегда отображаются синим цветом.
Если вы не особенно любите вводить текст вручную, то можете немного облегчить
себе жизнь, воспользовавшись клавишей <ГаЬ>. После ввода начальных букв име
ни файла и нажатия клавиши <ГаЬ> система производит попытку автозавершения
ввода. Например, если вам нужно перейти в каталог network, введите команду cd
netw и нажмите клавишу <ТаЬ>. Поскольку фрагмент netw содержит достаточно ин
формации, чтобы однозначно идентифицировать файл или каталог с названием
network, по нажатию клавиши <ГаЬ> этот фрагмент будет автоматически дополнен
до полного слова.
Если введенного вами фрагмента слова окажется недостаточно, чтобы однозначно
идентифицировать файл или каталог, то следующее нажатие клавиши <ТаЬ> ото
бразит список тех вариантов, которые соответствуют введенному фрагменту. Так,
если вы нажмете клавишу <ГаЬ> после введения первых букв пе, то результат будет
выглядеть примерно так, как показано на рис.
3.8.
l
r,, "" ., ,; 1 •t· ·, :>' : ', , t• '!, cd /etc/ne
netv.,ork / newt/
, , • ; : , • t_, i cd /etc/ne
;J rr" ,, , 1
- - - - - - - - - - - - -----
- - - - --
- --- -
Рис. 3.8. Автозавершение ввода с помощью клавиши <ТаЬ>
При желании команду ls можно снабдить дополнительным аргументом
-
с тем,
чтобы сократить количество отображаемых файлов и папок. Перейдите в каталог
/etc и
выполните следующую команду:
1s f*
fake-hwclock.data
$
fonts:
conf.avail
conf.d
fЬ.modes
fonts.conf
foomatic:
defaultspooler direct
fstaЬ.d:
pi@raspberrypi
fstab
/etc $
fuse.conf
fonts.dtd
filter.conf
Глава
90
3
Представленный здесь символ
* называется
символом групповой подстановки.
С помощью комбинации f* мы даем команде 1s указание вывести все файлы и пап
ки, название которых начинается с буквы
«f».
Соответственно, в списке результатов сначала приводятся все файлы из папки
название которых начинается с буквы
папок, название которых начинается с
«f», а затем буквы «f».
/etc,
содержимое всех вложенных
Символ групповой подстановки часто используется для вывода на экран названий
всех файлов с определенным расширением (например, 1s
В операционной системе
Linux
* .docx).
(и многих других операционных системах) принято
ставить точку в начале имени всех тех файлов и папок, которые должны быть
скрыты от пользователя. Команда 1s отобразит файлы и папки с таким именем
лишь в том случае, если вы вызовете ее с параметром -а
(all,
все).
Например:
$ cd
~
$ 1s
-а
Adafruit-Raspberry-Pi-Python-Code
.advance
.AppleDB
.AppleDesktop
.AppleDouЫe
Asteroids.zip
atari roms
.bash_history
.bash_logout
.bashrc
.cache
.config
.dЬus
Desktop
.pulse
.d1llo
.pulse-cookie
python_games
.dmrc
.emulationstation
sales_log
. fltk
servo.py
.fontconfig
. stella
.gstreamer-0.10
stepper.py.save
.gvfs
switches.txt.save
indiecity
Temporary Items
.local
thermometer.py
.thumЬnails
motor.py
.mozilla
.vnc
mydocument.doc
.Xauthority
Network Trash Folder .xsession-errors
.xsession-errors.old
.profile
Как видите, почти все файлы и папки в вашем домашнем каталоге являются скры
тыми.
Дополнительные сведения
Если вам нужно изменить права доступа к файлам, обратитесь к рецепту
3.5.
Копирование файла или папки
Задача
Вы хотите скопировать файл, используя окно терминала.
3.14.
Операционная система
91
Решение
Скопируйте нужные файлы и каталоги с помощью команды ер.
Пояснение
Вы, конечно, можете скопировать файлы в программе
File Manager (Файловый
ме
неджер), перетаскивая их в нужное место, либо воспользоваться командами меню
программы для копирования и вставки и соответствующими сочетаниями клавиш
(см.рецепт
3.1),
но это также можно сделать и в окне терминала.
Самый простой пример копирования в окне терминала
-
создание копии файла
в текущем рабочем каталоге. Для этого нужно записать команду ер и
ней
-
следом за
имя копируемого файла и имя нового файла.
-
Например, в представленном далее примере сначала создается файл с именем
myfile.txt,
а затем
-
его копия с именем
myfile2.txt
(задействованный здесь хитрый
способ создания файлов с помощью команды перенаправления вывода > подробно
рассматривается в рецепте
3. 9):
$ echo "hello" > myfile.txt
$ 1s
myfile.txt
$ ер myfile.txt myfile2.txt
$ 1s
myfile.txt myfile2.txt
Хотя в этом примере используются только локальные пути к файлу в пределах
текущего рабочего каталога, вы можете указать путь к любому месту файловой
системы, к которому имеете доступ с правом записи. Так, представленная далее
команда копирует исходный файл в каталог
/tmp,
предназначенный для размещения
временных файлов (ни в коем случае не размещайте в нем ничего важного!):
$
ер
myfile.txt /tmp
Обратите внимание, что здесь указывается только каталог, в котором должен нахо
диться новый файл, но не прописывается его имя. При этом копии присваивается
то же имя, что и у исходного файла (т. е. в нашем случае в каталоге
копия с тем же именем:
/tmp
создается
myfile.txt).
Иногда требуется скопировать не один файл, а все содержащиеся в каталоге файлы
и вложенные каталоги. В таком случае копирование надо выполнять, используя
команду ер с параметром
$
ер
-r (recursive,
рекурсивное копирование):
-r mydireetory mydireetory2
Если при копировании файлов или папок окажется, что у вас нет необходимых прав
доступа, то об этом будет сказано в выдаваемых результатах выполнения команды.
Тогда вам следует либо изменить права доступа к целевому каталогу (см. ре
цепт
цепт
3.14),
3.12).
либо произвести копирование с правами суперпользователя
(см.
ре
92
Глава
1
3
Дополнительные сведения
Если вам нужно не скопировать файлы, а переименовать их, обратитесь к рецеп
ту
3. 6.
Ознакомиться со всеми возможными параметрами команды ер можно по адресу
https://oreil.ly/Cq2SJ.
3.6.
Переименование файла или папки
Задача
Вы хотите переименовать файл, используя окно терминала.
Решение
Переименуйте нужные файлы и каталоги с помощью команды mv.
Пояснение
Команда mv
(move,
перемещение) работает примерно так же, как и команда ер, но,
в отличие от нее, не дублирует исходный файл, а просто присваивает ему другое
имя.
Так, например, дать файлу my_file.txt новое имя my_file.rtf можно с помощью следую
щей команды:
$ mv my_file.txt my_file.rtf
Столь же простым образом можно изменить и имя каталога, причем для этого не
понадобится использовать рекурсивный параметр -r, как в случае копирования,
поскольку при переименовании каталога неявно предполагается, что все его содер
жимое будет перемещено в переименованный каталог.
Дополнительные сведения
Если вам нужно скопировать файл или каталог в окне терминала, обратитесь к ре
цепту
3.7.
3.5.
Редактирование файла
Задача
Запустить редактор из командной строки с тем, чтобы внести изменения в файл
конфигурации.
Решение
Воспользуйтесь редактором
операционной системы
nano, входящим
Raspbeny Pi OS.
в состав большинства дистрибутивов
Операционная система
1 93
Пояснение
Чтобы запустить редактор
nano,
просто введите команду nano, указав после нее имя
или путь к тому файлу, который вам нужно отредактировать. Если указанного фай
ла
не
существует,
то
при
сохранении
его
отредактированного
содержимого
он
будет создан. Однако это произойдет лишь в том случае, если вы имеете право
на запись в том каталоге, где хотите сохранить файл.
Находясь в своем домашнем каталоге, введите команду
nano
шy_file. txt, чтобы от
редактировать или создать файл my_file.txt. Как выглядит работа с редактором
показано на рис.
nano,
3.9.
Рис.
К сожалению, редактор
3.9.
nano
Редактирование файла в редакторе
nano
не позволяет перемещать курсор с помощью мыши
-
для этого вам придется использовать клавиши со стрелками.
В нижней части окна редактора отображаются названия команд, которые можно
вызывать путем нажатия указанной буквенной клавиши с удержанием клавиши
<Ctrl>.
Не все имеющиеся команды редактора в равной степени полезны
-
скорее
всего, вам пригодятся лишь следующие команды:
♦
<Ctrl>+<X>
Выход из программы. Перед завершением работы с редактором
nano
вам будет
предложено сохранить файл.
♦
<Ctrl>+<V>
Переход на следующую страницу. Эта команда действует подобно клавише
с направленной вниз стрелкой, позволяя вам постранично просматривать содер
жимое больших файлов.
♦
<Ctrl>+<Y>
Переход на предыдущую страницу.
♦
<Ctrl>+<W>
Поиск определенного текста.
♦
<Ctrl>+<O>
Вывод результата. Эта команда производит запись (сохранение) файла без вы
хода из программы.
Глава
94
3
Хотя в редакторе имеются также и неудобные для работы команды копирования и
вставки, как показывает практика, вместо них проще использовать обычные коман
ды для работы с буфером обмена, вызывая контекстное меню с помощью правой
кнопки мыши (рис.
3. 1О).
Рис.
3.1 О.
Использование буфера обмена в редакторе пап о
Задействуя таким образом буфер обмена, можно производить копирование и встав
ку в окно редактора текста из окон других приложений
-
например, из окна брау
зера.
Закончив работу с файлом, нажмите комбинацию клавиш
из редактора
<Ctrl>+<X>
nano с сохранением изменений. В ответ на запрос
- чтобы подтвердить свое желание сохранить
клавишу <У>
для выхода
редактора нажмите
файл. После этого
редактор по умолчанию предложит сохранить файл под исходным именем
жмите клавишу
<Enter>,
-
на
чтобы сохранить файл и выйти из программы.
Если вы хотите отказаться от внесенных изменений, нажмите вместо клавиши <У>
клавишу
<N>.
Дополнительные сведения
Выбор редактора
-
это во многом дело личного вкуса. На устройствах
Raspberry Pi
можно с успехом использовать и многие другие редакторы, доступные в операци
Linux. Так, например, в состав наиболее востребованных дистрибу
Raspberry Pi OS включен редактор Vim (Vi 1Mproved)1, весьма популярный
пользователей Linux. Надо, однако, отметить, что работать с этим редакто-
онной системе
тивов
среди
1 См.
https://oreil.ly/yOfym.
Операционная система
ром новичку будет не так уж и просто. Запускается редактор
редактор
команда
3.8.
nano,
с
тем
лишь
отличием,
что
вместо
команды
Vim
nano
1
95
так же, как и
здесь
вводится
vi.
Просмотр содержимого файла
Задача
Вы хотите просмотреть содержимое небольшого файла, не внося в него изменения.
Решение
Чтобы просмотреть содержимое файла, воспользуйтесь командами cat или more.
Например:
$ more myfile.txt
This file contains
some text
Пояснение
Команда cat отображает все содержимое файла, даже если это содержимое не по
мещается на экране.
Команда more позволяет просматривать содержимое файла постранично
-
для
перехода к следующей странице надо будет нажимать клавишу <Пробел>.
Дополнительные сведения
Команду cat также может применять для конкатенации (объединения) нескольких
файлов в один (см.рецепт
3.32).
Наряду с командой more также часто используют и сходную с ней по действию
команду less. В отличие от команды more, команда less позволяет продвигаться
в файле не только вперед, но и назад.
3.9.
Создание файла без использования редактора
Задача
Вы хотите создать однострочный файл, не используя для этого редактор.
Решение
Перенаправьте в файл введенный в командной строке текст, используя команды >
и
echo,
например:
96
Глава
3
$ echo "file contents here" > test.txt
$ more test.txt
file contents here
J..Q
Поскольку команда > перезаписывает любой существующий файл с тем же име; r ~ нем, при ее использовании спедует проявлять осмотрительность.
Пояснение
Если вы хотите просто создать пустой файл, чтобы в дальнейшем занести в него
какое-либо содержимое, то это можно сделать, вызвав команду touch и указав после
нее имя нового файла:
$ touch test.txt
Если при этом вы укажете уже существующий файл, то команда touch модифициру
ет его временную метку так, как если бы вы только что его отредактировали.
Дополнительные сведения
В рецепте
3.8
показано применение команды more для просмотра файлов без ис
пользования редактора. Применение команды
темного вывода рассматривается в рецепте
3.10. Создание
> для
выполнения других видов сис
3. 31.
каталога
Задача
Вы хотите создать новый каталог в окне терминала.
Решение
Создать новый каталог можно с помощью команды rnkctir.
Пояснение
Дпя создания новых каталогов используйте команду rnkdir. Попробуйте воспроиз
вести следующий пример
(обратите
внимание, что здесь показаны только сами
команды, но не их ответы):
$ cd ~
$ rnkdir my_directory
$ cd my_directory
$ ls
Вы должны иметь право на запись в том каталоге, внутри которого вы собираетесь
создать новый каталог.
Операционная система
97
Дополнительные сведения
Получить общее представление об использовании терминала для перемещения по
файловой системе можно, обратившись к рецепту
3.11. Удаление файла
3.4.
или каталога
Задача
Вы хотите удалить файл или каталог в окне терминала.
Решение
Удалить файл или каталог со всем его содержимым можно с помощью команды rm
(remove,
удалить). Выполняя эту команду, следует проявлять крайнюю осторож
ность.
Пояснение
Удаление отдельного файла
-
достаточно простая и не несущая большого риска
задача. Далее показано, как можно удалить файл my_file.txt из домашнего каталога,
а затем убедиться, что его там нет, с помощью команды 1s:
$ cd ~
$
rm my_file.txt
$ ls
Вы должны иметь право на запись в том каталоге, внутри которого вы собираетесь
произвести удаление.
При удалении файлов также можно использовать символ групповой подстановки*.
Так, с помощью следующей команды можно удалить из текущего каталога все
файлы, имена которых начинаются с фрагмента my_file.:
$
rm my_file.*
А с помощью следующей команды можно удалить из каталога все содержащиеся
в нем файлы:
$
rm *
Для рекурсивного удаления каталога (при котором удаляется и сам каталог, и все
содержащиеся в нем файлы и каталоги) следует использовать параметр -r:
$ rm -r mydir
При удалении файлов в окне терминала следует помнить о том, у вас нет страхов-
.
ки в виде корзины, позволяющей восстановить файлы в случае ошибочного удаления. Кроме того, от вас не требуется дополнительно подтверждать свое желание
'удалить файлы
-
они просто сразу же удаляются. Поэтому, если вы будете ис-
пользовать команду
цепт
3.12),
rm
небрежно, да еще в сочетании с командой
это может привести к катастрофическим последствиям.
sudo
(см. ре
Глава З
98
Дополнительные сведения
Об использовании терминала для перемещения по файловой системе рассказывает
ся в рецепте
3.4.
Если вы боитесь случайно удалить какие-либо файлы или каталоги, сделайте так,
чтобы при использовании команды rrn требовалось подтверждать удаление файлов.
Этого можно добиться путем создания псевдонима этой команды (см.рецепт
3.12.
3. 3 6).
Выполнение задач
с правами суперпользователя
Задача
Некоторые команды не работают по той причине, что вы не обладаете достаточ
ными правами доступа.
Решение
Выполняйте такие команды с правами суперпользователя. Обеспечить себе права
суперпользователя при выполнении тех или иных действий можно с помощью
команды sudo
(substitute user and do,
го надо просто записать команду
1
•
подменить пользователя и выполнить). Для это
sudo перед выполняемой командой.
Команда sudo требует крайней осторожности
Как говорилось в одной популярной серии фильмов, «с большой силой приходит
,
большая ответственность». Команда
• • ••• • •
sudo
позволит вам выполнить такие весьма
опасные действия, как удаление важных системных файлов, без которых устройст-
во
Raspberry Pi
может превратиться в бесполезный кусок железа, требующий пол
ной переустановки операционной системы
Пояснение
Большинство тех команд, которые вы будете отдавать в командной строке, обычно
можно выполнить и без прав суперпользователя. Исключение здесь, как правило,
составляют лишь задачи установки нового программного обеспечения и редактиро
вания конфигурационных файлов. Основной способ установки новых программ
в
Raspberry Pi OS
сводится к использованию утилиты apt, об использовании кото
рой мы поговорим в рецепте
3.17.
Еще одним примером ситуации, требующей наличия прав суперпользователя, явля
ется использование команды reboot. Если вы попробуете запустить эту команду
с правами обычного пользователя, то увидите несколько сообщений об ошибках:
$
reЬoot
Failed
Failed
Failed
Failed
to
to
to
to
set wall message, ignoring: Interactive authentication required.
reboot system via logind: Interactive authentication required.
open /dev/initctl: Perrnission denied
talk to init daemon.
Операционная система
1
99
Однако с выполнением этой команды не будет никаких проблем, если вы поставите
перед ней команду
$
sudo:
sudo reboot
Если с правами суперпользователя нужно запустить сразу несколько команд, а вы
не хотите записывать команду
sudo
перед каждой из них, можно воспользоваться
следующей командой:
$ sudo sh
#
Обратите
приглашение
что
внимание,
командной
строки
поменяло
свой
вид
(вместо знака $ теперь отображается знак#). Все последующие команды вы будете
выполнять как суперпользователь. Чтобы снова «превратиться» в обычного пользо
вателя, введите команду
exit:
# exit
$
Дополнительные сведения
Более подробно права доступа к файлам рассматриваются в рецепте
установки программ с помощью утилиты apt показан в рецепте
3.13.
3.13.
Процесс
3.17.
Что такое права доступа к файлам?
Задача
Вы заметили, что при отображении информации о файлах рядом с именем каждого
файла часто отображаются какие-то странные символы. Вы хотите знать, что они
означают.
Решение
Отобразить информацию о правах доступа и владельцах файлов и каталогов мож
но, выполнив команду
ls
с параметром
-1.
Пояснение
Введите в командной строке команду
ся буква
Lв
$ ls -1
total 16
-rw-r--r--rw-r--r--rw-r--r-drwxr-xr-x
1
1
1
2
ls -1 (в качестве параметра здесь записывает
нижнем регистре). На экране появится информация следующего вида:
pi
pi
pi
pi
pi
5
pi
5
pi
5
pi 4096
Apr
Apr
Apr
Apr
23
23
23
23
15:23
15:23
15:23
15:23
filel.txt
file2.txt
file3.txt
mydir
Глава З
100
Здесь в первой строке выданного ответа сообщается, что текущий каталог содержит
16
файлов.
Далее следуют строки с описанием файлов (из каких элементов состоит каждая та
кая строка, показано на рис.
3.11 ).
Начинает строку блок информации о правах дос
тупа. Число 1 во втором поле (помеченном на рис.
как Файлы) указывает,
3.11
к какому количеству файлов относится текущая строка. Это значение имеет смысл
лишь в том случае, когда строка содержит информацию о каталоге,
файла оно, как правило, равно
1.
-
в случае
Следующие два поля (которые в нашем случае
содержат значение pi) содержат информацию о владельце и группе файла. В пятом
поле указывается размер файла в байтах. За ним следует поле с датой и временем
последнего изменения файла и, наконец, поле с именем файла или каталога.
Владелец
Размер
Дата и время
последнего
Файлы
Права доступа
-гw-г--г--
г
1 pi pi 5
w
3.11.
!
Арг 2315:23
г
i
filel.txt
г
Группа
Владелец
Рис.
Имя файла
изменения
!
i
Тип
Группа
Остальные
Права доступа к файлам
Блок информации о правах доступа включает в себя четыре раздела: Тип, Владе
лец, Группа и Остальные. В первом разделе указывается тип файла. В случае
каталога здесь ставится буква d
вол
(directory,
каталог), а в случае файла
-
просто сим
«-».
Следующий раздел содержит три символа
-
с их помощью определяются права
доступа владельца файла. Каждый из этих символов представляет собой флаг, ко
торый может находиться в активном или неактивном положении. При наличии
у владельца права на чтение в первой позиции будет стоять буква r. При наличии
у владельца права на запись во второй позиции будет стоять буква w. В третьей по
зиции, где в нашем случае стоит символ
файл является исполняемым (т. е.
«-»,
ставится буква х в том случае, когда
представляет собой программу или скрипт),
а владельцу предоставлено право на его выполнение.
Третий раздел тоже содержит три флага, которые определяют права доступа членов
группы. Все множество пользователей можно разбивать на отдельные группы.
В нашем случае файлом владеет пользователь pi, который является членом группы
pi. Любой другой член группы р1 будет обладать такими же групповыми правами
доступа.
Операционная система
1
101
В последнем разделе определяются права доступа тех пользователей, которые не
являются ни пользователем
Поскольку устройство
pi,
ни членом группы
Raspberry Pi
pi.
обычно используется пользователем
pi,
наибо
лее важными являются права доступа, указываемые в первом разделе.
Дополнительные сведения
Если вам нужно изменить права доступа к файлам, обратитесь к рецепту
3.14.
3.14.
Изменение прав доступа к файлам
Задача
Вам нужно изменить права доступа к файлу.
Решение
Изменить права доступа к файлу можно с помощью команды
chmod.
Пояснение
Изменение прав доступа к файлу, в частности, может потребоваться в том случае,
когда нужно отредактировать файл с доступом только для чтения или сделать воз
можным выполнение программы или скрипта.
Для добавления и удаления прав доступа к файлам служит команда
chmod.
Она име
ет два варианта синтаксиса, один из которых предполагает использование восьме
ричных значений (с основанием
8),
а другой
-
текстовых. Мы будем использовать
более легкий для понимания текстовый метод.
Первый параметр команды
сти, а второй
-
chmod
указывает, какое изменение необходимо произве
какой файл или каталог оно должно затрагивать. Параметр для
описания вносимого изменения включает в себя область действия права доступа,
знак
«+», «-»
или
«=»
(что означает соответственно «добавить», «удалить» или
«установить») и тип права доступа.
Например, добавить право на выполнение х для владельца
u (user)
файла file2.txt
можно с помощью следующей команды:
$
chmod u+x file2.txt
Если мы теперь отобразим содержимое текущего каталога, то увидим, что у файла
file2.txt
появилось право доступа х:
$ 1s -1
total 16
-rw-r--r--rwxr--r--rw-r--r-drwxr-xr-x
1 pi
1 pi
1 pi
2 pi
pi
5 Apr
pi
5 Apr
pi
5 Apr
pi 4096 Apr
23
24
23
23
15:23 filel.txt
08:08 file2.txt
15:23 fileЗ.txt
15:23 mydir
102
1
Глава З
Добавить право на выполнение для группы или остальных пользователей можно
было бы, используя вместо буквы u соответственно букву g или букву о. С по
мощью буквы а можно добавить право доступа для всех пользователей.
Вы также часто будете сталкиваться и с примерами настройки прав доступа с по
мощью числовых значений. Например:
$ chmod 777 filel.txt
Каждая из трех цифр здесь содержит по три бита информации и определяет соот
ветственно права доступа для владельца, группы и остальных пользователей. Это
восьмеричные
в табл.
значения
-
соответствующие
им
двоичные
значения
приведены
3.1.
Таблица
Восьмеричные значения
Двоичные значения
о
ООО
1
001
2
010
3
011
4
100
5
101
6
11 О
7
111
3.1
Например, права доступа rwxr--r-- можно представить с помощью числа 744.
Дополнительные сведения
По адресу
https://chmod-calculator.com
можно найти удобный онлайн-калькулятор
для расчета используемых в команде chmod восьмеричных значений"
Получить более полное представление о правах доступа к файлам можно, ознако
мившись с рецептом
ется в рецепте
3.15.
3.13.
Изменение информации о владельце файла рассматрива
3.15.
Изменение информации о владельце файла
Задача
Вам нужно изменить информацию о владельце файла.
Решение
Изменить информацию о владельце файла или каталога можно с помощью коман
ды chown
(change owner,
сменить владельца).
Операционная система
103
Пояснение
Как мы узнали из рецепта
3.13,
любой файл или каталог снабжается информацией
о владельце и соответствующей ему группе пользователей. Поскольку у устройств
Raspberry Pi
обычно имеется только один пользователь
-
pi, нас, в общем-то, не
должна волновать информация о группе.
Но иногда вы все же будете встречать в своей системе файлы, установленные не
пользователем pi, а каким-то другим пользователем. В таком случае можно изме
нить информацию о владельце файла с помощью команды chown.
Для этого введите команду
chown и укажите после нее, через двоеточие, нового вла
дельца и группу, а затем
имя файла.
-
Для выполнения такой задачи часто требуются права суперпользователя. Тогда
перед командой chown следует записать команду sudo (см. рецепт
3.12).
Далее пока
зано, как можно сделать владельцем файла file2.txt пользователя с именем
$ sudo chown
$ ls -1
total 16
-rw-r--r-- 1
-rwxr--r-- 1
-rw-r--r-- 1
drwxr-xr-x 2
root:
root:root file2.txt
pi
root
pi
pi
pi
5
root 5
pi
5
pi 4096
Apr
Apr
Apr
Apr
23
24
23
23
15:23
08:08
15:23
15:23
filel.txt
file2.txt
file3.txt
mydir
Дополнительные сведения
Получить более полное представление о правах доступа к файлам можно, ознако
мившись с рецептом
3.13.
Вы также можете обратиться к рецепту
3.14,
где гово
рится об изменении прав доступа к файлам.
3.16.
Получение снимка экрана
Задача
Вы хотите сделать снимок экрана устройства
Raspberry Pi
и сохранить его в файл.
Решение
Воспользуйтесь программой для создания снимков экрана с удачно выбранным
названием scrot
(SCReenshOT,
скриншот).
Пояснение
Для создания снимка экрана можно просто ввести команду scrot. Это приведет
к немедленному созданию снимка основного экрана с сохранением его внутри те
кущего каталога в файле с именем следующего вида: 2023-04-25-080116_ 1024х768_
scrot.png.
104
Глава
3
Иногда на снимке экрана надо показать использование меню или какого-то другого
элемента, который обычно скрывается, когда окно теряет фокус. В таком случае
можно создать снимок экрана с некоторой предварительной задержкой, добавив
к команде
scrot
параметр
-d:
$ scrot -d 5
Размер задержки здесь указывается в секундах.
Сделав снимок всего экрана, вы можете обрезать его в дальнейшем с помощью
графического редактора
GIMP
(см. рецепт
4.6).
Однако более удобный подход со
стоит в том, чтобы изначально сделать снимок только необходимой области экрана,
добавив к команде scrot параметр -s.
Чтобы воспользоваться этим параметром, введите представленную далее команду и
определите нужную вам область экрана путем перетаскивания ее границ курсором
мыши:
$ scrot -s
Размеры полученного в итоге изображения будут отражены в имени созданного
файла.
Дополнительные сведения
Утилита scrot позволяет задействовать ряд и других параметров для управления
такими возможностями, как задание способа создания снимка при использовании
нескольких экранов или формата сохраняемого файла. Более подробные сведения
об утилите scrot можно получить, ознакомившись с соответствующей тап-стра
ницей. Для этого введите следующую команду:
$ man scrot
Маn-страницы
Доступная в
Raspberry Pi OS
система так называемых mап-страниц
(manual pages,
справочные страницы) содержит справочную информацию почти обо всех командах
этой операционной системы. Для получения такой информации следует ввести команду
man, указав после нее имя интересующей команды.
Однако надо отметить, что mап
страницы написаны не очень доступным языком, поскольку представляют собой скорее
полный справочник по командам системы, чем простое руководство по их использова
нию. Поэтому в большинстве случаев проще поискать нужную информацию в Интер
нете.
3.17. Установка
программного обеспечения
с помощью менеджера пакетов
apt
Задача
У становить программное обеспечение в окне терминала.
Операционная система
105
Решение
Наиболее распространенный способ установки программного обеспечения в окне
терминала сводится к использованию утилиты (менеджера пакетов) apt
Packaging Tool,
(Advanced
продвинутое средство управления пакетами).
Соответствующая команда вызывается с правами суперпользователя и имеет сле
дующий базовый формат:
<имя проrраммы>
$ sudo apt install
Например, установить текстовый редактор AЬiWord можно с помощью команды:
$ sudo apt install abiword
Пояснение
Менеджер пакетов apt ориентируется на список доступного программного обеспе
чения.
Этот
список
включен
в
состав
дистрибутива
операционной
системы
но может со временем устареть. Поэтому перед установкой нового
Raspberry Pi OS,
программного обеспечения рекомендуется с помощью утилиты apt обновить этот
список, выполнив команду:
$ sudo apt update
Поскольку и список предлагаемых для установки программных пакетов, и они сами
находятся в Интернете, для того чтобы это работало, устройство
Raspberry Pi
должно быть подключено к Интернету.
Если при попытке обновить список будет выведено сообщение об ошибке вида:
Е:
ProЫem
with MergeList
/var/liЬ/dpkg/status, попробуйте выполнить следующие
две команды, которые удалят проблемный файл и заменят его новым, пустым
файлом:
$ sudo rm
/var/liЬ/dpkg/status
$ sudo touch
/var/liЬ/dpkg/status
Процесс установки может длиться достаточно долго, поскольку менеджер пакетов
сначала скачивает установочные файлы и уже после этого производит установку.
В ходе установки некоторых программ также создаются ярлыки на рабочем столе и
в меню устройства
Raspberry Pi.
Вы можете попытаться самостоятельно найти нужное вам программное обеспече
ние в списке предлагаемых для установки программ. Для этого надо вызвать
команду apt search, указав после нее на-звание искомой программы,
-
например,
aЬiword. В качестве результата вам будет представлен список предлагаемых для ус
тановки пакетов, соответствующих вашему запросу.
Дополнительные сведения
В рецепте
3.18
показано, как производится у да.пение уже ненужных программ для
высвобождения занимаемого ими пространства.
106
1
Глава З
Вы также можете обратиться к рецепту
ванне исходного кода с сайта
3.21,
где показано, как производится скачи
GitHub.
Как выполняется установка Руthоn-пакетов с помощью менеджера пакетов pip,
показано в рецепте
3.19.
Установка программ с использованием графического пользовательского интерфей
са показана в рецепте
3.18. Удаление
4.2.
программного обеспечения,
установленного с помощью менеджера пакетов
apt
Задача
У становив с помощью менеджера пакетов apt большое количество программ, вы
обнаружили, что некоторые из них вам больше не нужны, и их уже можно удалить.
Решение
Утилита apt позволяет удалять пакеты с помощью команды apt remove, однако
таким образом можно удалить только те пакеты, которые были установлены с по
мощью команды
apt install.
Например, для удаления программы AЬiWord надо воспользоваться командой:
$ sudo apt remove abiword
Пояснение
При удалении пакета указанным способом не всегда удаляются все установленные
файлы, поскольку устанавливаемый пакет часто требует установки и ряда других
пакетов. Чтобы произвести полное удаление пакета вместе с такими вспомогатель
ными пакетами, можно воспользоваться командой
apt autoremove:
$ sudo apt autoremove abiword
$ sudo apt clean
Команда apt
clean здесь производит некоторую дополнительную зачистку про
странства от неиспользуемых установочных файлов.
Дополнительные сведения
В рецепте
ты
apt.
3.17
показано, как производится установка пакетов с помощью утили
Опврвционнвя систвмв
3.19. Установка
1
107
Руthоn-пакетов с помощью утилиты рiрЗ
Задача
Произвести установку Руthоn-библиотек с помощью утилиты рiрЗ или pip (это ре
курсивное сокращение от фразы «Pip Installs Packages», pip устанавливает пакеты).
Решение
Если вы используете последнюю версию
Raspberry Pi OS,
то у вас уже будет уста
новлена утилита рiрЗ, и вы сможете запускать ее из командной строки. Утилита рiрЗ
предназначена для установки программных пакетов, написанных на языке
Python 3.
Если у вас когда-либо возникнет необходимость в установке пакетов, написанных
на языке
Python 2,
просто воспользуйтесь утилитой pip.
Установка пакетов с помощью утилиты рiрЗ производится следующим образом:
$
рiрЗ
install pyserial
Если утилита рiрЗ не установлена в вашей операционной системе, установите ее
с помощью команды:
$ sudo apt install
pythonЗ-pip
Иногда требуется установить программный пакет как в виде версии, написанной на
так и в виде версии, написанной на Python 3. В таком случае вам нужно
Python 2,
будет выполнить одни и те же команды с использованием и утилиты pip, и утилиты
рiрЗ.
Пояснение
Хотя
многие
(см. рецепт
Руthоn-библиотеки
3.17),
можно
установить
с
помощью
утилиты
apt
в тех случаях, когда это невозможно, следует воспользоваться
утилитой pip.
Дополнительные сведения
Установка программ с помощью утилиты apt рассматривается в рецепте
3.17.
3.20. Скачивание файлов в окне терминала
Задача
Скачать файл из Интернета, не используя для этого веб-браузер.
Решение
Скачать файл из Интернета можно с помощью команды wget.
Например, чтобы
скачать
выполните команду:
файл
Pifm.tar.gz с сайта
https://www.icrobotics.co.uk,
108
Глава
3
$ wget http://www.i=oЬotics.eo.uk/wik.i/i.mages/c/cЗ/Pifm.tar.gz
--2013-06-07 07:35:01-- http://www.icrobotics.eo.uk/wiki/images/c/c3/Pifm.tar.gz
Resolving www.icrobotics.co.uk (www.icrobotics.co.uk) ... 155.198.3.147
Connecting to www.icrobotics.co.uk (www.icrobotics.co.uk) 1155.198.3.1471
:80 ... connected.
НТТР request sent, awaiting response ... 200 ОК
Length: 5521400 (5.3М) [application/x-gzip]
Saving to: 'Pifrn.tar.gz'
100%(------------------------------------------------>] 5,521,400
601K/s
2018-06-07 07:35:11 (601 KB/s) - 'Pifrn.tar.gz' saved [5521400/5521400]
Если URL-aдpec содержит какие-либо специальные символы, будет лучше заклю
чить его в двойные кавычки.
Пояснение
Вы можете обнаружить, что в инструкциях по установке программ вам часто пред
лагают использовать для скачивания файлов команду wget. И действительно, в ряде
случаев гораздо удобнее воспользоваться этой командой в окне терминала, вместо
того чтобы открывать браузер, искать ссылку на файл и производить сохранение
файла в нужное вам место.
Команда wget принимает в качестве параметра URL-aдpec скачиваемого файла и
скачивает его в текущий каталог. Хотя обычно ее используют для скачивания
архивного файла того или иного типа, с ее помощью также можно скачать и любую
веб-страницу. Так, например, выполнив следующую команду, вы можете скачать
домашнюю страницу сайта компании
Google
и сохранить ее в виде файла с именем
index.html:
$ wget google.corn
Дополнительные сведения
Установка программ с помощью утилиты apt рассматривается в рецепте
3.21. Скачивание
3. 17.
исходного кода
с помощью утилиты
Git
Задача
Руthоn-библиотеки и другое программное обеспечение часто размещаются в сете
вом Git-репозитории, расположенном на веб-сайте
GitHub
или в каком-либо другом
месте. Поэтому вам следует знать, как производится скачивание файлов на устрой
ство
Raspberry Pi
в таком случае.
Операционная система
109
Решение
Для использования кода, размещенного в Git-репозитории, нужно создать собст
венную копию нужных вам файлов с помощью команды git cl one .
Например, следующая команда скачает программный код всех примеров из этой
книги и сохранит его в новой папке:
https: //git huЬ. com/si monmo nk / ra spber rypi_cookЬook_ed4.git
$ git clone
копируемого
URL-aдpec
кода указывает
веб-страницу,
на некоторую
вы можете открыть в своем браузере. Так, страница этой книги на сайте
выглядит примерно так, как показано на рис.
с;)
sе,нс" о,
urrc 10
tssues
PUI rtquests
0
t' main •
8
D
lssU<ls
11
1' 1 ьranch
0
Pull r,qutsts
Мarketplace
~О
tags
Projects
Gototle
19
amonmonlr lnibl commit
У + • (; •
Explort
~ Pin
lfj
ktians
1D Wikl
Aadllla•
0
S8c\J'1ty
. .
ф
Clone
у roni.
..
(:)Ul'W8tcn ,
~ lnslghts
а
$ Settlngs
AЬout
Code to accompany the Ьооk RaspЬerry
Pi Cookl>ook fourth edition
!D
lnitialcommft
g111gnor.
GitHub2
3 .12.
Q s1monmonk / raspbe rrypi_cookЬook_.ed4 ...,,.
<>Co<lo
которую
Rнdme
.ф MIТIJl:ense
r)
LCENSE
lniЬal con,mlt
D
READМE.mc!
tnitilllcommit
ф Opon
REAOME.md
wlth GkHub Oosktop
*
7,.,...
0
1 walching
У
Olorlcs
1]'\ Download ZIP
Relнses
raspberrypi_cookbook_ed4
No releJИS puЬlished
~ t e • new rdeue
Code to accompany the
Ьооk RaspЬerry
Pi CookЬook fourth edition
Pac:Ьges
Рис.
Щелкнув по кнопке
3.12. Страница
Code
репоэитория этой книги на сайте
GitHub
(Код), вы можете скопировать URL-aдpec репозитория
и затем вставить его после команды
git
в окне терминала.
Пояснение
Следует понимать, что
Git
и
GitHub -
это совсем не одно и то же.
грамма для управления исходным кодом, а
GitHub -
Git -
это про
это один из многих веб
сайтов для хранения исходного кода, размещаемого там с помощью программы
Git.
Хотя при желании вы можете разместить свой Git-репозиторий непосредственно на
2
См. https://oгeil.ly/5f1 1 n .
Глава З
110
устройстве
Raspberry Pi,
или
дает вам целый ряд преимуществ:
GitLab
использование сетевого Git-хранилища вроде сайта
GitHub
♦ Ваш код хранится в облаке, что исключает риск потери кода в случае выхода из
строя диска или SD-карты;
♦
Код открыт для всеобщего доступа, что позволяет другим людям просматривать
и использовать его. При обнаружении в нем каких-либо ошибок они даже могут
предлагать вам помощь по их исправлению;
♦
Вы также можете разместить в репозитории общедоступную документацию по
проекту в виде файла
README.
Если вы работаете над проектом на базе
Raspberry Pi,
который, по вашему мнению,
может быть интересен для других людей, я настоятельно рекомендую вам размес
тить свой код на сайте
GitHub
или
GitLab.
Хотя для этого придется усвоить немно
го новой информации, эти усилия не будут напрасными.
Еще одним преимуществом использования Git-репозитория (будь то непосредст
венно на устройстве или в таком веб-хранилище, как
GitHub)
является то, что по
завершении каждой значительной части работ над проектом эти изменения автома
тически отражаются в основной копии кода. При этом новый код не замещает
ранее созданный, а сохраняется в виде новой версии. В случае ошибки вы всегда
можете вернуться к одной из предыдущих версий.
г- ·- ,
В литературе, посвященной IТ-технологиям, нередко можно встретить не совсем
политкорректные термины
.
L •••• •
•••
«master»
и
«slave»,
которые раньше означали «госпо
дин» и «раб», а теперь подразумевают сугубо технические вещи. (Так, применительно к веб-сервису GitHub сочетание «master сору» подразумевает основную
копию кода, а в случае интерфейсов
1-wire
и
SPI
слова
«master»
и
«slave»
означа
ют ведущее и ведомое устройство.) В последнее время предпринимаются усилия
по замене этой терминологии на что-то более современное (и более технически
точное). Однако, к сожалению, нам еще долго придется сталкиваться с этими тер
минами, поскольку полностью от них отказаться можно будет лишь тогда, как будут
обновлены соответствующие стандарты и библиотеки исходного кода.
Весь тот код, который я использую в своих книгах и других проектах, я размещаю
на сайте
GitHub.
Вот как при этом выглядит последовательность моих действий по
созданию нового репозитория:
1.
Перейти на свою домашнюю страницу на сайте
GitHub
(для этого нужно пред
варительно создать там учетную запись), щелкнуть на кнопке+ и выбрать пункт
New Repository (Новый
репозиторий).
2.
Ввести имя и краткое описание репозитория.
3.
Установить флажок
lnitialize this repository with а README
README»).
(Инициализиро
вать этот репозиторий с использованием файла
4.
Выбрать тип лицензии
-
я выбираю лицензию Массачусетского тех~ологи
ческого университета исключительно
потому,
что
очень уважаю это прослав
ленное учебное заведение и считаю, что продукт с такой лицензией просто не
может быть плохим.
Операционная система
5.
6.
Щелкнуть на кнопке
111
репозиторий).
Открыть окно терминала на своем компьютере (или на устройстве
(см.рецепт
7.
Create repository (Создать
1
Raspberry Pi)
3. 3).
Запустить команду git, указав после нее URL-aдpec репозитория. Эта команда
создаст папку для файлов проекта. Все сохраняемые в этой папке файлы будут
сохраняться на сайте GitHub после выполнения вами следующих команд:
$
git add .
$ git commit -m "message about what you changed or added"
$
git push
Первая команда здесь добавляет все измененные или новые файлы в список фай
лов, требующих фиксации изменений. Затем в команде commit вы объясняете, что
нового несут в себе фиксируемые изменения. Наконец, команда
изменения на сайт
GitHub.
GitHub.
push пересылает
При этом потребуется ввести лоrин и пароль для сайта
Это фактически те же учетные данные, которые требуется вводить для вхо
да в учетную запись на сайте
Вы увидите, что сайт
Raspberry Pi,
GitHub.
GitHub является богатым источником кода для устройств
Python и других языках программирования. Это осо
написанного на
бенно справедливо применительно к программным интерфейсам для различных
видов аппаратного обеспечения: дисплеев, датчиков и т. п.
Дополнительные сведения
Ознакомиться с более подробной информацией о программе Git3 и использующих
ее хостинrовых сервисах GitHub4 и GitLab 5 вы сможете, перейдя по адресам, ука
занным в соответствующих сносках.
О том, как можно скачать используемый в этой книге программный код, рассказы
вается в рецепте
3.22.
3.22. Скачивание
кода, используемого в этой книге
Задача
Скачать все используемые в этой книге примеры кода и другие файлы.
Решение
Вы можете либо клонировать эти файлы с сайта GitHub, как было показано в ре
цепте 3.21, либо, как будет показано здесь, скачать их в виде одного ZIР-архива.
3 См.
4
http://www.git-scm.com.
См. http://www.github.com.
1 См.
https://gitlab.com.
Глава
112
Хороший
3
первый
шаг
по
выполнению
поставленной
страницу этой книги в браузере на устройстве
позиторий книги на сайте
задачи
-
открыть
веб
Помимо ссылки на ре
Raspberry Pi 6 •
вы найдете там список выявленных опечаток и
GitHub,
другую информацию о книге.
В репозитории книги на сайте
шемся меню (рис.
3. 13 ),
щелкните на кнопке
GitHub 7
Code (Код). В появив
Download ZIP (Ска
помимо прочего, вы увидите и ссылку
чать ZIР-архив ).
tj
Sea.rct- or
1uЩ> tP
Pull requests
lssues
Marketplace
!;J slmonmonk / raspЬerrypl_cookboo~ed4 ....,..
<> COd•
0
1' m8in •
8
lssues
11
0
Pull requests
~ Pin
1Е1 Prnjects
Actions
1' 1 branch \) О tags
Go to file
Ц] Wikl
г Add flle.
0
Unwatch 1
ф Security
--
-
G)
(g Clone
simonmonk lnitial c:onmit
НТТРS SSН GtНtю
С)
4,
Exptor~
~ lnsi\ihts
lnhlal commlt
LCENSE
С)
lnitialcommit
README.md
1
7
$ Stttings
АЬоu\
Code to accompany the
Ьооk RaspЬerry
Pi CookЬook fourth edition
Ц]
Readme
,ф МIТ
С)
* ci.,
CLI
lnltblcommit
.gitigno,•
у Fork о
•
+ .. f"; •
Use Git or chectout witЬ ~ using the wеЬ URL
f ~ Open with GhHub Dod<top
IJce<1se
*
7.stan
0
1 watching
у
Oforl<s
README.md
Releases
raspberrypi_cookЬook_e
No releases puЫlshed
Crute
Code to accompany the
Ьооk RaspЬerry
Pi
CookЬool<
I
new relea,e
fourth edition
NooacЬgespubl,ned
PuЬlish \'OU'
Рис.
3.13.
fnt
pкkage
Скачивание ZIР-файла из GitНuЬ-репозитория этой книги
Щелкните на этой ссылке, и браузер
Chromium
скачает ZIР-архив, сохранив его
в папке Загрузки. Теперь щелкните на кнопке со стрелкой справа от скачанного ZIР
файла и выберите в появившемся меню пункт
откроется окно программы
File Manager
Show in folder
(Показать в папке)
-
(Файловый менеджер), отображающее
содержимое папки Загрузки. Найдите в нем тот ZIР-файл, который вы только что
скачали.
Двойной щелчок на ZIР-файле откроет его в программе
щелкните на значке
Extract files
Xarchiver,
после чего
(Извлечь файлы) на панели ее инструментов, в от
крывшемся диалоговом окне укажите, что извлекаемые файлы нужно сохранить
в папке /home/pi, и щелкните на кнопке
Extract (Извлечь).
По завершении процесса распаковки архива в вашем домашнем каталоге появится
новая папка, содержащая все используемые в этой книге файлы.
6
См. http://simonmonk.org/pi-cookbook-ed4.
7
См. https://oreil.ly/nHSyl.
Операционная система
1
113
Пояснение
Если вы теперь перейдете в свой домашний каталог в программе
File Manager
(Файловый менеджер), то увидите, что в нем появилась папка с именем
raspberry_
pi_cookbook_ed4-master.
Дополнительные сведения
Подробнее о
Git
и
GitHub
было рассказано в рецепте
3.21.
3.23. Автоматический запуск программы
на этапе начальной загрузки
Задача
Вам нужно, чтобы при загрузке устройства
Raspberry Pi
автоматически запускалась
определенная программа или скрипт.
Решение
Для автоматического запуска нужной вам программы надо внести соответствую
щие изменения в файл rc.local. Огкройте в редакторе файл /etc/rc.local, выполнив для
этого команду:
$ sudo nano /etc/rc.local
Добавьте следующую строку после первого блока комментариев, начинающихся
с символа#:
$ /usr/bin/python /home/pi/my_program.py &
Обратите внимание, что в конце этой команды всегда нужно ставить символ &, что
бы она запускалась в фоновом режиме,
berry Pi
-
в противном случае устройство
Rasp-
не сможет завершить этап начальной загрузки.
Пояснение
При использовании этого способа автоматического запуска программ нужно край
не внимательно редактировать файл rc.local, потому что ошибка в нем может при
вести к тому, что устройство
Raspberry Pi
перестанет загружаться.
Дополнительные сведения
Более
безопасный
в рецепте
3.24.
способ
автоматического
запуска
программ
рассматривается
114
1
Глава
3
3.24. Автоматический запуск программы
в качестве службы
Задача
Вам нужно, чтобы при каждой перезагрузке устройства
Raspberry Pi
автоматически
запускалась определенная программа или скрипт.
Решение
В дистрибутиве DeЬian
Pi OS,
Linux,
на основе которого созданы дистрибутивы
Raspberry
задействуется основанный на зависимостях механизм автоматического за
пуска команд на этапе начальной загрузки. Этот механизм довольно сложен в ис
пользовании и подразумевает создание конфигурационного файла для того скрипта
или программы, запуск которой вам нужно обеспечить, с размещением этого файла
в папке
init.d.
Пояснение
Давайте рассмотрим пример того, как можно обеспечить автоматический запуск
Руthоn-скрипта, расположенного в вашем домашнем каталоге. Хотя это может быть
абсолютно любой скрипт, сейчас предполагается, что речь идет о скрипте, запус
кающем простейший веб-сервер, написанный на языке
ворим в рецепте
Python,
о котором мы пого
7.17.
Чтобы обеспечить автоматический запуск, необходимо сделать следующее:
1.
Создать скрипт инициализации.
2.
Сделать скрипт инициализации исполняемым.
3.
Сообщить системе о наличии нового скрипта инициализации.
Понятно, что начать надо с создания скрипта инициализации. Его нужно размес
тить в папке /etc/init.d/. Хотя скрипту можно присвоить любое имя, в нашем случае
назовем его
my_server.
Чтобы создать новый файл с помощью редактора
$
nano,
введите следующую команду:
sudo nano /etc/init.d/my_server
Вставьте приведенный далее код в окно редактора и сохраните файл. Чтобы не вво
дить все это вручную в том случае, если вы читаете книгу в печатном виде, можно
перенести указанный код путем копирования и вставки с соответствующей веб
страницы 8 • (Прокрутите содержимое веб-страницы вниз до того места, где пред
ставлен код этой главы и этого рецепта.)
### BEGIN INIT INFO
# Provides: my_server
8
См. https://oreil.ly/otjSЗ.
Опврационнвя систвмв
115
# Required-Start: $remote_fs $syslog $network
# Required-Stop: $remote_fs $syslog $network
# Default-Start: 2 3 4 5
# Default-Stop: О 1 б
# Short-Description: Simple Web Server
# Description: Simple Web Server
### END INIT INFO
#!
/Ьin/sh
# /etc/init.d/my_server
export НОМЕ
"$1" in
start)
echo "Starting Му Server"
sudo /usr/bin/python /home/pi/myserver.py 2>&1 &
са••
stop)
echo "Stopping
PID='ps auxwww
kill -9 $PID
Му
I
Server"
grep myserver.py
I
head -1
1
awk '{print $21''
*)
echo "Usage: /etc/init.d/my_server {startlstopl"
exit 1
•••с
exit
О
Хотя на первый взгляд кажется, что это слишком большой объем работы для такой
простой задачи, как обеспечение автоматического запуска скрипта, большую часть
этого кода составляет шаблонный код, который остается неизменным при запуске
любой службы. Чтобы обеспечить запуск другого скрипта, нужно будет просто из
менить в этом скрипте имя и описание запускаемого Руthоn-файла.
Следующий шаг сводится к тому, чтобы сделать наш файл исполняемым для вла
дельца. Выполните для этого команду:
$ sudo chmod
о+х
/etc/init.d/my_server
Теперь, когда программа уже настроена в качестве службы, перед тем, как обеспе
чивать ее автоматический запуск путем включения в последовательность началь
ной загрузки, надо проверить, все ли с ней в порядке:
$ /etc/init.d/my_■ erver atart
Starting Му Server
Bottle v0.11.4 server starting up {using WSGIRefServer()) ...
Listening on http://192.168.1.16:80/
Hit Ctrl-C to quit.
116
1
Глава
3
Наконец, убедившись, что с вашей программой все в порядке, сообщите системе
о наличии новой службы:
$
sudo update-rc.d my_-~rver defaults
Дополнительные сведения
Более простой метод обеспечения автоматического запуска программ рассматрива
ется в рецепте
3.23.
О том, как производится изменение прав доступа к файлам
и папкам, рассказано в рецепте
3.13.
3.25. Автоматический запуск программы
с регулярным временным интервалом
Задача
Сделать так, чтобы определенный скрипт запускался ежедневно или с регулярным
временным интервалом.
Решение
Воспользуйтесь командой crontaЬ
операционной системы
(chronological
tаЫе, хронологическая таблица)
Linux.
При этом нужно проследить за тем, чтобы устройство
Raspberry Pi
было подключе
но к Интернету, поскольку оно должно располагать информацией о текущей дате и
времени.
Пояснение
Команда crontaЬ позволяет планировать выполнение задач с регулярным временнь1м
интервалом. Интервал может исчисляться в днях или часах или определяться ка
ким-то сложным образом,
-
например, можно сделать так, чтобы рассматриваемое
событие выполнялось в определенный день недели. Эrо, в частности, полезно
в случае задач резервного копирования, которые часто лучше выполнять в ночное
время.
Чтобы отредактировать список запланированных задач, введите команду:
$
crontab
-е
Если скрипт или программа, запуск которой вам нужно обеспечить, должна запус
каться с правами суперпользователя, поставьте перед командой crontaЬ команду
(см. рецепт
sudo
3.12).
Строка комментария (которая начинается со знака#) показывает, в каком формате
следует записывать строки в списке запланированных задач. Каждая строка должна
содержать
месяца,
последовательный
месяц и день
недели,
которой вам нужно обеспечить.
ряд чисел,
представляющих
минуты,
часы,
день
за которыми должна следовать та команда, запуск
Операционная система
Звездочка
( *)
117
в той или иной позиции означает, что указанную команду нужно
выполнять каждую минуту, час или день месяца. Число в той или иной позиции
означает, что указанный скрипт следует выполнять только в указанную минуту,
час или день месяца.
Например, чтобы скрипт
myscript.sh выполнялся
3.14.
ежедневно в час ночи, нужно доба
вить строку, показанную на рис.
command
# m h dom mon dow
О 1 * * * /home/pi/myscript.sh
1
Get Help
Exit
1
WriteOut
Justify
Рис.
3.14.
~ Read File 1;; Prev Page ~ Cut Text 11; Cur Pos
UnCut Textl; То Spell
Е] Where Is Е Next Page
fil
Редактирование списка запланированных задач
Если вы в позиции дня недели укажете диапазон чисел
-
например,
1-5
(поне
дельник-пятница), то скрипт будет выполняться в час ночи только в эти дни недели:
О
1 * * 1-5 /home/pi/myscript.sh
Если скрипт должен запускаться из некоторого конкретного каталога, добавьте
в строку команду смены каталога, отделив ее от второй команды с помощью точки
с запятой
О
(; ):
1 * * * cd /home/pi; python mypythoncode.py
Дополнительные сведения
Чтобы ознакомиться с полной документацией по команде crontab, отобразите соот
ветствующую тап-страницу:
$
man crontab
3.26.
Поиск файла
Задача
Вы знаете, что файловая система вашего устройства содержит определенный файл,
и хотите его найти.
Решение
Воспользуйтесь командой find операционной системы
Linux.
Пояснение
Команда finct производит поиск нужного файла, начиная с указанного каталога,
и в случае его обнаружения сообщает о том, где он расположен.
118
Глава З
Например:
$ find /home/pi -name gemgem.py
/home/pi/python_games/gemgem.py
Начинать поиск можно в любой точке структуры каталогов, даже в корневом ката
логе файловой системы
(/).
Поиск по всей файловой системе занимает гораздо
больше времени и может приводить к появлению сообщений об ошибках. Вы мо
жете исключить появление таких сообщений, добавив в конце команды выражение
2>/dev/null, которое будет перенаправлять их на нулевое устройство.
Произвести поиск файла по всей файловой системе можно следующим образом:
$ find / -name gemgem.py 2>/dev/null
/home/pi/python_games/gemgem.py
Выражение
2>/dev/null перенаправляет вывод команды на нулевое устройство, что
бы множество сообщений не загромождало собой информацию о расположении
файла. О перенаправлении вывода мы поговорим более подробно в рецепте
3. 31.
В команде find также можно использовать подстановочные знаки:
$ find /horne/pi -name match*
/home/pi/python_games/match4.wav
/home/pi/python_games/match2.wav
/home/pi/python_games/matchl.wav
/home/pi/python_games/matchЗ.wav
/home/pi/python_games/matchO.wav
/home/pi/python_games/matchS.wav
Дополнительные сведения
Команда find позволяет использовать и ряд других продвинутых возможностей.
Отобразить полную документацию по этой команде можно с помощью команды:
$
man find
3.27.
Использование истории командной строки
Задача
Вы хотите в окне терминала повторно использовать уже выполненные команды без
необходимости вводить их снова.
Решение
С помощью клавиш
<j>
и
<J>
выберите в истории команд одну из недавно введен
ных команд либо воспользуйтесь командами history и grep для поиска тех команд,
которые вводились достаточно давно.
Опврвционнвя систвмв
1
119
Пояснение
Нажав клавишу
<j>,
вы можете перейти к предыдущей команде. Нажав эту клави
шу еще раз, можно перейти к команде, которая была введена перед предыдущей
командой, и т. д. Если вы зайдете слишком далеко назад, можно будет снова про
двинуться вперед с помощью клавиши
<t>.
Чтобы прекратить поиск в истории без выполнения выбранной в текущий момент
команды, воспользуйтесь комбинацией клавиш
<Ctrl>+<C>.
В окне терминала эта
комбинация клавиш служит для прекращения выполняемых действий и во многих
случаях ведет к полной остановке выполняемой программы.
Со временем история команд становится слишком большой, чтобы можно было
найти одну из давно введенных команд с помощью клавиш со стрелками. В таком
случае следует воспользоваться командой
history:
$ history
1
2
3
4
5
6
7
8
sudo nano /etc/init.d/my_server
sudo chmod +х /etc/init.d/my_server
/etc/init.d/my_server start
ер /media/4954-5EF7/sales_log/server.py myserver.py
/etc/init.d/my_server start
sudo apt update
sudo apt install bottle
sudo apt install python-bottle
Эта команда выводит всю историю команд, которая может оказаться слишком
длинной, чтобы в ней можно было найти нужную вам команду. Чтобы исправить
это, состыкуйте команду history с командой grep, используя символ конвейера
1
grep при этом отобразит только те результаты, которые
соответствуют искомой строке. Так, например, найти все вызовы команды apt
Команда
(см. рецепт
3.33).
(см.рецепт
3.17) можно
с помощью команды:
$ history I qrep apt
6
7
8
55
sudo apt update
sudo apt install bottle
sudo apt install python-bottle
history I grep apt
Каждая команда в истории командной строки имеет определенный номер, поэтому
после обнаружения нужной вам команды вы можете запустить ее, записав воскли
цательный знак
( !)
и номер команды в истории:
$ !6
sudo apt update
Дополнительные сведения
Поиск файлов рассматривается в рецепте
3.26.
120
1
Глава
3
3.28. Отслеживание степени загруженности
процессора
Задача
Устройство
Raspberry Pi
иногда работает слишком медленно, и вы хотите выяснить,
на что расходуется вычислительная мощность процессора.
Решение
Task Manager (Диспетчер задач), для запуска которой
Raspberry Pi раздел Accessories (Стандартные)
соответствующий пункт (рис. 3.15).
Воспользуйтесь утилитой
следует открыть в меню устройства
и выбрать в нем
~
pi
712.ОIСВ
3.1"18
2014
1
cli&.is-d8wnon
pi
!184. ОКВ
3.2"18
20:15
s
о
..,_ьах
pi
1.0"18
14.1"18
2021
s
о
Ьц,.-181
pi
1.7"18
7t.1"18
2023
s
о
pm,8Пm
pi
11.1"18
,1.1 мв
2024
s
о
lxpol,it
pi
4.IMI
2'.31МВ
2027
о
g,,fsd
pi
2.1 "11
•.,мв
2О1О
s
s
~..t.d
pi
2032
s
о
s
о
Рис.
Утилита
Task Manager
3.15.
Утилита
о
о
Task Manager
(Диспетчер задач) позволяет моментально оценить степень
загруженности процессора и оперативной памяти. Вы также можете прекратить
выполнение любого процесса, щелкнув на нем правой кнопкой мыши и выбрав со
ответствующую команду в контекстном меню.
В верхней части окна располагаются индикаторы степени загруженности централь
ного процессора и памяти. Ниже перечисляются выполняемые процессы, с указа
нием используемой ими доли вычислительной мощности процессора.
Пояснение
Если вы предпочитаете выполнять подобные задачи в командной строке, восполь
зуйтесь командой top операционной системы
Linux,
которая отобразит практически
такие же данные о том, насколько загружен процессор и память и какие процессы
Операционная система
используют наибольшее количество ресурсов (рис.
3 .16).
121
Затем можно прекратить
выполнение любого процесса, выполнив команду kill с правами суперпользова
теля .
Рис .
3.16.
Отображение информации о степени использования ресурсов с помощью команды
t op
Как вы можете видеть, в показанном случае самым ресурсоемким процессом явля
ется Python-пporpaммa, использующая
97%
вычислительной мощности процессора.
Здесь также видно, что в первом столбце указан идентификатор этого процесса
(2447). Прекратить
$
его выполнение можно с помощью команды :
kill 2447
Если вы нечаянно остановите какой-то критически важный процесс операционной
системы, то, отключив и снова включив питание устройства, вы сможете восстано
вить его нормальную работоспособность.
Иногда определенный процесс не удается быстро найти с помощью команды top.
В таком случае можно получить перечень всех запущенных процессов, выполнив
команду ps, и с помощью конвейера (см. рецепт
команде
3.33)
передать эти результаты
grep (см. рецепт 3.27), которая найдет в этом списке нужные вам строки .
Например, с помощью следующей команды можно узнать, каким идентификатором
процесса обладает упомянутая ранее ресурсоемкая Python-пporpaммa :
$ ps -ef I qrep "python"
Pi
pi
2447 2397 99 07:01 pts / 0
245 6 23 97 О 07 :01 pts / 0
00:00:02 python speed.py
00:00:00 grep --color=auto python
Глава З
122
Здесь мы видим, что Python-nporpaммa speed.py обладает идентификатором процес
са
2447.
Вторая строка здесь содержит информацию о процессе самой команды ps.
Команда killall
Команда killall представляет собой модифицированный вариант команды kill. Поль
зоваться этой командой нужно крайне осторожно, поскольку она останавливает все
процессы, имена которых совпадают с ее аргументом. Так, например, с помощью сле
дующей команды можно прекратить выполнение всех запущенных на устройстве
Руthоп-программ:
$ sudo killall python
Если вам требуется более подробная информация о процессах, попробуйте вместо
команды
top
использовать команду
htop.
Дополнительные сведения
Вы также можете ознакомиться с содержимым тап-страниц, посвященных коман
дам top, ps, grep, kill и killall. Для этого введите команду man, указав после нее
название интересующей вас команды:
$ man top
3.29.
Работа с файловыми архивами
Задача
Вы скачали сжатый файл и хотите его распаковать.
Решение
В зависимости от того, какой именно файл нужно распаковать, воспользуйтесь
командой tar или gunzip.
Пояснение
Файл, снабженный только расширением gz, можно распаковать с помощью сле
дующей команды:
$ gunzip myfile.gz
Иногда вам также будут встречаться так называемые tаr-архивы, содержащие ката
лог, запакованный с помощью Linuх-утилиты tar и после этого сжатый с помощью
утилиты gzip в файл с именем вида myfile.tar.gz.
Извлечь исходные файлы и каталоги из tаr-архива можно с помощью команды tar:
$ tar -xzf myfile.tar.gz
Если вам встретится ZIР-архив, можно воспользоваться файловым менеджером и
программой
Xarchiver,
как было показано в рецепте
3.22.
Опврвционнвя система
1
123
Дополнительные сведения
Более подробную информацию о команде tar можно найти на соответствующей
mаn-странице, открыв ее с помощью команды
3.30.
man tar.
Отображение списка подключенных USВ-устройств
Задача
Вы подключили USВ-устройство и хотите убедиться в том, что операционная сис
тема его распознала.
Решение
Воспользуйтесь командой
lsusb (это аналог команды ls для USВ-устройств). При
этом на экран будет выведен список всех устройств, подключенных к USВ-портам
устройства Raspberгy
$
Pi:
lsusЬ
Bus 001 Device 002:
Bus 001 Device 001:
Bus 001 Device 003:
Bus 001 Device 004:
[Optical mouse]
ID 0424:9512 Standard Microsystems Corp.
ID ldбb:0002 Linux Foundation 2.0 root huЬ
ID 0424:есОО Standard Microsystems Corp.
ID 15d9:0a41 Trust International B.V. MI-25400
Пояснение
Команда lsusb позволяет выяснить, подключено ли определенное USВ-устройство,
но не дает гарантии в том, что само устройство будет корректно работать. Иногда
для этого еще требуется установить драйверы или произвести соответствующие
изменения конфигурации.
3.31.
Перенаправление вывода
из командной строки в файл
Задача
Вы хотите быстро создать файл, содержащий определенный текст, или сохранить
в файле список файлов, хранящихся в том или ином каталоге.
Решение
Воспользуйтесь командой > для перенаправления тех результатов, которые команда
обычно выводит в окне терминала после ее запуска.
Например, далее показано, как можно сохранить в файле myfiles.txt список файлов,
содержащихся в текущем каталоге:
124
Глава
1
3
$ 1s > myfiles.txt
$ more myfiles.txt
Desktop
indiecity
master.zip
mcpi
Пояснение
Команду
> можно использовать в сочетании с любой командой операционной сис
темы, генерирующей какой-либо вывод, даже если это, например, Ру1hоn-про
грамма.
С помощью противоположной ей команды < можно производить перенаправление
пользовательского ввода,
однако это далеко не так
вывода с помощью команды
полезно,
как
перенаправление
>.
Дополнительные сведения
В рецепте
3.32
показано, как с помощью команды cat можно объединить несколько
файлов в один.
3.32.
Конкатенация файлов
Задача
У вас есть несколько текстовых файлов, и вы хотите объединить их в один большой
файл.
Решение
С помощью команды cat произведите конкатенацию нескольких файлов с получе
нием ОДНОГО ВЫХОДНОГО файла. Например:
$ cat filel.txt file2.txt
fileЗ.txt
> full file.txt
Пояснение
Команда cat объединяет несколько файлов в один. Вы можете указать любое нуж
ное вам количество файлов, и все они будут записаны в указанный вами выходной
файл. Если вы не воспользуетесь перенаправлением вывода, результат будет просто
выведен в окне терминала. Учтите также, что процесс объединения больших фай
лов может занять достаточно длительное время.
Дополнительные сведения
В рецепте
3.8
показано, как можно использовать команду cat для отображения со
держимого файла.
Операционная система
3.33.
\
125
Использование конвейеров
Задача
Вам нужно подать вывод одной команды
Linux на вход другой
команды.
Решение
Чтобы подать вывод одной команды на вход другой команды, воспользуйтесь кон
вейером, который обозначается символом вертикальной черты:
!-
Например:
$ lз -1 *·'РУ I grep Jun
-rw-r--r-- 1 pi pi 226 Jun
7 06:49 speed.py
Эта команда находит в текущем каталоге файлы с расширением ру, последняя
модификация которых производилась в июне.
Пояснение
На первый взгляд, использование конвейера во многом напоминает перенаправле
ние вывода с помощью команды
> (см.
рецепт
3.31).
Однако команда
> не
будет
работать, если вы попробуете перенаправить вывод в другую программу. В качест
ве «пункта назначения» здесь может служить только некоторый файл.
Хотя вы можете состыковать, как показано далее, даже очень большое количество
программ, это требуется достаточно редко:
$
командаl
I
команда2
1
команда]
Дополнительные сведения
В рецепте
3.27
также показано, как можно использовать команды pipe и grep для
поиска команд в истории командной строки, а в рецепте
зовать команду
3.34.
grep
3.28- как
можно исполь
для поиска процессов.
Скрытие вывода команд в окне терминала
Задача
Вы хотите выполнить определенную кома}Jду без вывода ее результатов на экран.
Решение
Перенаправьте вывод по адресу /dev/null с помощью команды>. Например:
$ 1s > /dev/null
Каталог dev содержит файлы тех устройств, с которыми взаимодействует операци
онная система, включая, например, такие компоненты, как последовательные пор-
126
Глава
1
3
ты. В этом каталоге определено так называемое нулевое устройство, которое слу
жит исключительно для удаления передаваемых ему данных.
Пояснение
Будучи по сути бесполезной, представленная в этом рецепте команда приводится
здесь лишь с целью демонстрации ее синтаксиса. На практике скрытие вывода
обычно используется в том случае, когда разработчик программы оставил в коде
много ненужных пользователю сообщений трассировки. Так, следующий пример
показывает, как можно скрыть излишний вывод команды find (см. рецепт
3.36):
$ find / -name gemqem.py 2>/clev/null
/home/pi/python_games/gemgem.py
Дополнительные сведения
Более
те
подробно о перенаправлении стандартного
вывода рассказано
в рецеп
3.31.
3.35. Запуск программ
в фоновом режиме
Задача
Вам нужно выполнить определенную программу во время выполнения некоторой
другой задачи.
Решение
Запустите программу или команду в фоновом режиме, используя команду &. На
пример:
$ python speed.py &
[ 1] 2528
$ 1s
Вместо того чтобы дожидаться завершения выполнения программы, командная
строка отобразит идентификатор процесса (второе число) и сразу же позволит вам
продолжить дальнейший ввод команд.
Идентификатор процесса впоследствии
можно использовать для прекращения выполнения фонового процесса
цепт
(см.
ре
3.28).
Вывести фоновый процесс на передний план можно с помощью команды fg
ground,
(fore-
передний план):
$ fq
python speed.py
Эта команда сообщает о том, какая команда или программа выполняется в текущий
момент, и ждет, пока ее выполнение не завершится.
Операционная система
.1
127
Пояснение
Генерируемый фоновым процессом вывод будет по-прежнему отображаться в окне
терминала.
Вместо того чтобы запускать процессы в фоновом режиме, можно просто открыть
несколько окон терминала.
Дополнительные сведения
Более подробно об управлении процессами рассказано в рецепте
3.36. Создание
3.28.
псевдонима команды
Задача
Вы хотите создать псевдонимы (сокращенные имена) для часто используемых
команд.
Решение
Откройте файл ~/.bashrc в редакторе
nano
(см. рецепт
3. 7)
и добавьте в конце этого
файла строку следующего вида:
alias L='ls
-а'
Эта строка создает псевдоним с именем
при вводе как команда
ls
L,
который должен интерпретироваться
-а.
Чтобы закрыть редактор с сохранением изменений, произведеных в файле, нажмите
сначала комбинацию клавиш
<Ctrl>+<X>,
а затем <У>, после чего введите сле
дующую команду, чтобы обновить настройки окна терминала:
$ source .bashrc
Пояснение
Пользователи операционной системы
Linux
часто создают псевдоним для команды
пn, как показано далее, чтобы при ее выполнении приходилось бы подтверждать
удаление файлов:
$ alias rm='rrn -i'
Это очень разумный подход, но, прибегая к нему, следует помнить, что на другом
компьютере может не использоваться такой же псевдоним.
Дополнительные сведения
Более подробно команда rrn рассматривается в рецепте
3.11.
128
1
3.37.
Глава
3
Настройка даты и времени
Задача
Вам нужно вручную настроить дату и время на устройстве
Raspberry Pi,
потому что
оно не подключено к Интернету.
Решение
Воспользуйтесь командой date операционной системы
в формате ММДДччммГГГГ, где ММ
часы, мм
-
минуты, а ГГГГ
-
-
Linux,
-
номер месяца, ДД
указав дату и время
день месяца, чч
-
год.
Например:
$ sudo date 010203042019
Wed 2 Jan ОЗ:04:00 GМТ 2019
Пояснение
При наличии соединения с Интернетом устройство
Raspberry Pi
автоматически
устанавливает дату и время на этапе загрузки, ориентируясь на расположенный
в сети сервер времени.
Команду date также можно использовать для отображения локального времени. Для
этого ее нужно ввести, не указывая каких-либо данных:
$ date
Fri 19 Jul
3.38.
10:59:Оа
BST 2019
Получение информации
об объеме доступного пространства на SD-карте
Задача
Вам нужно узнать, сколько свободного пространства осталось на SD-карте.
Решение
Воспользуйтесь командой df
онной системы
$ df -h
Filesystem
rootfs
/dev/root
Devtmpfs
tmpfs
(disk filesystem,
Linux:
Size
З.6G
3.6G
la0M
зам
Used Avail Use% Mounted on
1.7G 1.9G 4а% /
1.7G 1.9G 4а% /
la0M
0% /dev
о
2З6К
зам
1% /run
дисковая файловая система) операци
Операционная система
tmpfs
tmpfs
/dev/ппncЫkOpl
5.ОМ
о
5.ОМ
75М
о
75М
56М
19М
звм
1
129
0% /run/lock
0% /run/shm
34% /boot
Параметр -h позволяет отобразить размер в килобайтах, мегабайтах и гигабайтах,
которые сокращенно обозначаются соответственно символами К, М и
G,
вместо
того чтобы просто отображать количество байтов.
Пояснение
Первая строка результатов в представленном примере показывает, что общий объ
ем SD-карты в нашем случае составляет
странства
-
1,7
3,6
Гбайт, а объем используемого про
Гбайт.
При отсутствии на диске свободного пространства система может выдавать неожи
данные сообщения об ошибках
-
например, сообщение о том, что определенный
файл не может быть сохранен на диске.
Дополнительные сведения
Дnя получения более подробной информации о команде df откройте соответст
вующую тап-страницу с помощью команды
3.39.
man df.
Получение информации
об используемой версии операционной системы
Задача
Вы хотите узнать, какую именно версию операционной системы
используете.
Решение
Введите следующую команду в окне терминала или SSH-ceaнca:
$ cat /etc/os-release
GNU/Linux 11 (bullseye)"
GNU/Linux"
PRETTY_NAМE="Raspbian
NAМE="Raspbian
VERSION ID="ll"
VERSION="ll (bullseye)"
VERSION_CODENAМE=bullseye
ID=raspbian
ID LIKE=debian
HOМE_lJRL="http://www.raspbian.org/"
SlJPPORT_lJRL="http://www.raspbian.org/RaspbianForums"
BlJG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
Raspberry Pi OS
вы
Глава З
130
Пояснение
Взглянув на представленный пример, можно увидеть, что нужная нам информация
содержится в первой строке результатов. В показанном случае мы видим, что на
Raspberry Pi установлена 11-я версия операционной
(Raspberry Pi OS), с условным названием Bullseye ( «Бычий глаз»).
моем устройстве
RaspЬian
системы
Номер используемой версии операционной системы, в частности, полезно знать
при возникновении проблем с каким-либо программным обеспечением. Перед тем
как давать осмысленные советы, работники служб поддержки, как правило, интере
суются, какую версию
Raspberry Pi OS
вы используете.
Вам также может потребоваться информация о том, какая версия ядра
пользуется на вашем устройстве
Raspberry Pi.
Linux
ис
Это можно выяснить с помощью сле
дующей команды:
$ uname -а
Linux raspberrypi S.15.32-v7l+ #1538 SMP Thu Mar 31 19:39:41 BST 2022
armv7l GNU/Linux
Как видите, на моем устройстве
используется ядро версии
Raspberry Pi
5 .15.
Дополнительные сведения
В рецепте
3.38
показано, как можно узнать, сколько свободного пространства
осталось на SD-карте или другом загрузочном накопителе.
3.40.
Обновление операционной системы
Raspberry Pi OS
Задача
Вы хотите обновить операционную систему
Raspberry Pi OS
на своем устройстве до
последней версии.
Решение
Если у вас установлена достаточно новая версия операционной системы
Pi OS (Bullseye
диться значок
(рис.
3.17).
Raspberry
или еще свежее), то в правом верхнем углу экрана должен нахо
в виде направленной вниз стрелки с расположенным ниже лотком
Щелкнув на кнопке с этим значком, можно открыть список доступных
обновлений и произвести их установку.
При желании установить обновления можно и с помощью командной строки. От
кройте окно терминала (см. рецепт
3.3)
и введите следующие команды, чтобы
обновить свою систему до последней версии:
$
sudo apt update
$ sudo apt full-upgrade
Процесс обновления может занять достаточно длительное время, особенно при
большом количестве обновлений. Перед тем как производить обновление, я на-
Операционная система
131
The follow1ng packages can Ье updated .
Package
Version
ffmpeg
7:4. 3.4-о+dеЫ 1ul+rptЗ
gstreamerl .O.plug1ns-good
1 . 18.4-2+dеЫ 1ul
libavcodec58
7.4.3. 4-o+deЫlul+rptЗ
libavdevice58
7 4 3 . 4-о+dеЫ 1ul +rptЗ
libavfilter7
7:4. 3.4-о+dеЫ 1ul+rptЗ
libavformat58
7·4 3.4-о+dеЫ lul+rptЗ
libavresample4
7 .4. 3. 4-о+dеЫ 1ul +rptЗ
libavutil5б
7'4. 3 .4-о+dеЫ 1ul +rptЗ
Close
Рис.
3.17.
lnstall
Установка обновлений с использованием графического окружения
стоятельно рекомендую скопировать все важные фай.1ы со своего устройства на
USВ-накопитель (см. рецепт
3.2).
Пояснение
Первая из этих двух команд обновляет не саму операционную систему
OS,
Raspberry Pi
а используемый менеджером пакетов apt список последних версий программ
ных пакетов операционной системы и сопутствующего программного обеспечения.
Команда full-upgrade обновляет уже сю1у 011ера111ю1111) ю систему. В ходе этого про
цесса вы будете предупреждены о размере необходимого пространства на диске,
поэтому, перед тем как запускать процесс обновления нажатием клавиши <У>,
стоит убедиться в том, что у вас хватает свободного пространства, как было пока
зано в рецепте
3.38.
Существует целый ряд доводов в пользу регулярного обновления операционной
системы. Один из основных доводов состоит в том, что многие из вносимых изме
нений служат для исправления ошибок.
Поэтому проблемы, выявленные после
установки программы, часто исчезают после обновления системы. Еще один довод
состоит в том, что установка более новой версии Raspberгy
Pi OS
на подключенное
к Интернету устройство часто позволяет устранить уязвимости с точки зрения
безопасности.
Дополнительные сведения
Если вы хотите заново произвести полную установку
крецепту
1.6.
Raspberry Pi OS,
обратитесь
ГЛАВА4
Использование
готового программного обеспечения
4.0.
Введение
В этой главе мы рассмотрим несколько рецептов использования готового про
граммного обеспечения на устройстве
Raspberry Pi.
Это будут как рецепты по превращению устройства
Raspberry Pi
в устройство
определенного назначения, так и рецепты по использованию на нем определенных
видов программ.
4.1. Создание
медиацентра
Задача
Вы хотите превратить свое устройство
Raspberry Pi
в превосходный медиацентр.
Решение
Если вы решили использовать
Raspberry Pi
в качестве медиацентра, вам стоит оста
новить свой выбор на высокопроизводительной модели
Raspberry Pi 4
В, поскольку
при воспроизведении видео очень активно используется процессор.
Настроить свое устройство
Raspberry Pi
на работу в качестве медиацентра можно
при записи образа операционной системы на microSD-кapтy с помощью программы
Raspberry Pi Imager
(см. рецепт
1.6).
бутива следует остановиться не на
Media Player OS
Дистрибутив
(ОС
Для этого при выборе записываемого дистри
Raspberry Pi OS,
медиапроигрывателя) (рис. 4.1).
LibreELEC
а на
LibreELEC
специально предназначен для использования
из раздела
Raspberry Pi
в качестве медиацентра. Он включает в себя программное обеспечение медиацен
тра
Kodi,
созданное на основе проекта с открытым исходным кодом ХВМС, целью
которого изначально бьшо превращение в медиацентр игровой приставки ХЬох.
Код этого проекта бьш со временем портирован на множество платформ, в том
числе и на
Raspberry Pi (рис. 4.2).
Устройства
мате
Full
Raspberry Pi
прекрасно справляются с воспроизведением видео в фор
НD, потоковой музыки, МРЗ-файлов и интернет-радио.
Использование готового программного обеспечения
133
• •
х
<
о
•0
Рис.
4.1.
Вкk
Go Ьасk to main menu
UЬnlELEC
А Кodi
оsмс
Enterteinment Center distriЬution
о
А fast and
feature filled open source media center
>
>
Vounlo 0
The Audiophile Music Player and Streamer
Запись на microSD-кapтy дистрибутива
Рис.
4.2.
Использование
LibreELEC с помощью программы Raspberry Pi lmager
Raspberry Pi в качестве медиацентра
Пояснение
Kodi -
мощная и легко настраиваемая программа с большим количеством возмож
ностей. Самый простой способ убедиться в ее работоспособности состоит в том,
чтобы записать несколько музыкальных или видеофайлов на флеш-накопитель или
внешний жесткий диск с интерфейсом
ключив диск к устройству
USB. Если Kodi работает нормально, то
Raspberry Pi, вы сможете воспроизвести эти файлы.
под
134
1
Глава
4
Поскольку медиацентр на базе
Raspberry Pi
обычно располагается поблизости от
телевизора, стоит проверить, не обладает ли телевизор USВ-портом, способным
предоставить
Raspberry Pi.
достаточное
количество
энергии
для
запитывания
устройства
Если это так, то вам не потребуется отдельный источник питания.
Неплохо было бы также приобрести комплект из беспроводной клавиатуры и мы
ши, использующих для связи с компьютером общий USВ-адаптер, занимающий
один USВ-порт,
это позволит вам не загромождать пространство проводами.
-
В некоторых случаях также удобно пользоваться мини-клавиатурой со встроенной
сенсорной панелью.
Проводной способ подключения к сети, как правило, обеспечивает более высокую
скорость обмена данными и работает надежнее, чем соединение
использовании проводного способа устройство
поблизости от гнезда
ить
Kodi
Kodi
Ethernet,
Raspberry Pi
Wi-Fi.
Однако при
должно находиться
что не всегда удобно. В таком случае можно настро
на использование соединения
Wi-Fi.
обладает очень простым и интуитивно понятным интерфейсом, и полную
документацию
по
использованию
этой
программы
можно
найти
по
адресу
http://kodi.wiki.
Дополнительные сведения
Помимо
LibreELEC, Raspberry Pi lmager позволяет
- OSMC 1.
установить еще один популяр
ный мультимедийный дистрибутив
Для управления программой
Kodi
также можно задействовать инфракрасный пульт
дистанционного управления 2 .
4.2. Установка
рекомендуемого программного обеспечения
Задача
Вы хотите установить на устройстве
Raspberry Pi
несколько часто используемых
программ.
Решение
Воспользуйтесь инструментом
ное обеспечение) (рис.
ства
Raspberry Pi
1
См. https://osmc.tv/.
2
См. https://oreil.ly/NhDEJ.
(Рекомендуемое программ
4.3), для запуска которого следует открыть в меню устрой
Preferences (Настройки) и выбрать в нем соответствую
раздел
щую опцию.
Recommended Software
Использование готового программного обеспечения
, 1 ,1 н
..~1'{:t;l ~.oftvv.::rP
135
-
..,
Appl1catюn
л.
х
lnstall
ВkJeJ
8
intemet
~
Offtce
ф Programming
~
О
BlueJ is an IDE for the Java programming
language.
Universal Access
6
ClewsMoil
ClawsMail is an email client supporting most
popular lnternet mail protocols.
о
Code The Clossics
Python versions of агсаdе games included in
the Ьооk Code the Classics Volume 1.
о
Greenfoot
о
Greenfoot is an IDE for the Java programming
language.
Close
Рис.
4.3.
Инструмент
Apply
Recommended Software
Этот инструмент позволяет установить многие ю тех программ, которые ранее
входили в число предустановленных программ в
Raspberry Pi OS, -
т. е. большин
ство наиболее распространенных и наиболее полезных программ для устройства
Raspberry Pi.
Просмотрите списки предлагаемых дпя установки программ и отметь
те флажком те, что вам нужны, после чего щелкните на кнопке
Apply
(Применить).
После этого установщик скачает и установит выбранные вами программы. По за
вершении процесса установки в меню устройства Raspbeпy
Pi
появятся ярлыки для
запуска новых программ.
Пояснение
Если вам не удается найти нужную программу с помощью инструмента
mended Software
Recom-
(Рекомендуемое программное обеспечение), можно расширить
область поиска, воспользовавшись аналогичным инструментом
Software
(Добавить/удалить
программное
обеспечение)
которого тоже потребуется открыть в меню устройства
ferences
- Add/Remove
4.4 ), для запуска
Raspberry Pi раздел Pre(рис.
(Настройки) и выбрать в нем соответствующую опцию.
Этот инструмент позволяет установить тысячи различных программ и программ
ных пакетов, поэтому, чтобы найти нужную программу, обычно проще начать ввод
ее названия в поле поиска, вместо того чтобы просматривать весь список пакетов.
Дополнительные сведения
Установка программ с помощью консольной утилиты apt рассматривается в рецеп
те
3.17.
Глава
136
4
sirщl~file puЬlic domain
(or МIТ lioensed) liЬraries for С/С++
libstЬ0-0.0-91!20180212. 15.ебаfЬ!ю-1
sirщl~file puЬlic domain
(or МIТ lioensed) libraries- development headers
libstЬ-dev-0. O-git20180212. 15.еба!Ь9с-1
Mineaaft for the RаsрЬепу Pi
minecraft-pi-0.1.1-6
Multiplayer infinit~wor1d Ыосk sandЬox
minetest-0.4 17.l+repack-1-tdelll Ou1
Multiplayer infinit~wor1d Ь1осk sandЬox (data files)
minetest-data-0.4.17. 1-кepack-1-юeЫ Ou1
Minetest mod - (most of) RаsрЬепу PI Mineaaft API
minetest-mod-pycraft-0.22-1
Multiplayer infinrt~wor1d block sandЬox (se,vEI)
minetest-se,ver-0.4 17 1-кepack-1 +1JeЬ10u1
RаsрЬепу PI M1neaaft API python dient liЬrary
pythonЗ.minecraftpi-0. 22-1
Oownload s1ze
Ucense
Source
Рис .
4.3.
4.4.
Инструмент
Add/Remove Software
Использование
офисного программного обеспечения
Задача
Обеспечить возможность работы на устройстве Raspberry
ментами, презентациями и электронными таблицами.
Pi
с текстовыми доку
Решение
У становите
цепт
пакет
программный
Recommended Software
LibreOffice,
(Рекомендуемое
используя
программное
для
этого
инструмент
обеспечение)
(см .
ре
4.2).
Пояснение
Программный пакет
LibreOffice,
включающий программы для редактирования тек
стовых документов, электронных таблиц, презентаций и векторных изображений,
является хорошей (и бесплатной) альтернативой программного пакета Microsoft
Office.
Текстовый редактор
LibreOffice Writer
(рис.
4.5)
позволяет открывать и со
хранять документы в формате, используемом в редакторе
совместимы с аналогами от
ций из этого пакета .
Microsoft
Microsoft Word.
Вполне
и редакторы электронных таблиц и презента
Использование готового программного обеспечения
~
sultr ot progams () make а good (and free) altemadYI! to Microsoft Offk:e. ln fact,
W11terw1U ореп and ЯУI! Мk:rosoft Word documenl!;, and thespreadsЬeetand
pre;entalloo. progmns
pretty сощ,аt!Ые wltЬ thtlr Мlaoson. counlerpal1Sj
ТЬе LIЬreOCfla!
L
=
LIЬreOftlce
I DefaUIIS\yte
39w"'1!s, 268chanкtens
Page 1 ol 1
137
Рис.
4.5.
Текстовый редактор
10010
LibreOffice Writer
Для работы с офисными приложениями лучше использовать
а не более старые модели
---o--+j
i:, i:,i:,w
Raspberry Pi 4 или 400,
Raspberry Pi.
В последнее время все большую популярность приобретает размещение докумен
тов в облаке с редактированием их в браузере. Наиболее широко известными при
мерами таких решений являются сервисы
и
Microsoft 365
Google Docs.
Для исполь
зования обоих этих сервисов сначала нужно зарегистрировать в них учетную
запись, после чего они оба будут прекрасно работать в браузере
~
➔
С
i docs gooqle.comlspreads11eets/d/1qofТcl.fyНKwm,(dNQ4.Нncss41R5Y.IUf-w-Ms62m8fl/ed~#9:d=0
~
RaspЬerry Pi CookЬook 4th edition
liil
Flle Ed~
"' ,,,.
е
А1
•
"
fx
v- lnlМ!rt Formв1
1oos. •
$
,.
De1a Tools
.о~ ~
*Eltensюn•
m
н,~р
а.
,n. , -•
•
с
,_
Fmntrмller
11
•
в
.r -s-
д.
~
mв -
D
G
2022,04-01
1
9мact11neleWrq
2022-04-01
2D
4
3 Openlllng Sysl8ln
4 Scllware
5Pyll1Drl6 Pyll1Drl Usts М111 OICllofwtes
1D~ЬOSial
2022.Q6.0l
Работа с электронной таблицей в
о
2
2
2
5
9
1
4
а
Sh<let1 •
4.6.
а
_ сс,,,,р_
71\dvзncedPyll>on
Netмxldng
н
2
&Ссmршв-.
2
11
"
-- (Pagn)
Oollwty
2022-00-01
2022-03-01
2022-03-01
2022-03-01
2022-04-01
2022-04-01
2022-04-01
2022-04-01
1~----
Рис.
~
Last edB was 4 ilaYJl\l!I
Rмpl>ony Pi Oool<Ьodt 41, в
+
Chromium (рис. 4.6).
Google Docs
с использованием браузера
Chromium
138
1
Глава
4
Дополнительные сведения
Более подробную информаuию о программном пакете
адресу
LibreOffice
можно найти по
https://www.libreoffice.org.
Для редактирования неформатированных текстовых файлов можно использовать
редактор
4.4.
nano
(см. рецепт
3. 7)
или
VisL1alStL1dio Code
(см. рецепт
4.10).
Запуск эмулятора винтажной игровой приставки
Задача
Вы хотите превратить свое устройство
Raspberry Pi
в винтажную игровую при
ставку.
Решение
Если вы не против вспомнить славные деньки своей юности и поиграть в игру
Asteroids
на эмуляторе приставки
внимание на проект
Рис.
4.7.
Atari 2600
(рис.
4. 7),
вам стоит обратить свое
RetroPie.
Игра
Asteroids
на эмуляторе
Существует много замечательных
Stella
проектов,
игровой приставки
направленных
Atari 2600
на
создание
собст
венной игровой приставки и игрового стола на базе игрового контроллера для
ретро игр.
Хотя дистрибутив RetюPie можно установить и поверх
Raspberry Pi OS,
более про
стой способ использования этой операuионной системы состоит в том, чтобы
Использование готового программного обеспечения
напрямую записать ее на microSD-кapтy с помощью программы
(см.рецепт
Г
-
1
139
Raspberry Pi Imager
1.6).
Несмотря на то что речь идет о старых играх, у них по-прежнему есть владелец.
И хотя вы легко найдете в Интернете RОМ-образы игр, необходимые для того,
•
чтобы играть в них на эмуляторе, ими не всегда можно свободно пользоваться.
Поэтому следите за тем, чтобы все соответствовало закону.
Пояснение
Поскольку эмулятор
RetroPie потребляет весьма значительную часть скудных ре
Raspberry Pi, для его установки лучше задействовать модель
Raspberry Pi 4, 3 или, в крайнем случае, 2. В Интернете можно найти много приме
сурсов устройства
ров того, как добавить к этой основе какой-либо из множества доступных на рынке
дешевых игровых контроллеров для ретроигр с интерфейсом
ройство
Raspberry Pi
USB
и встроить уст
и монитор в большой корпус, напоминающий игровой авто
мат. Собрать симпатичный игровой автомат также можно, купив комплект
компании
Pimoroni
(рис.
4.8).
Рис.
4.8.
Комплект
Picade
компании
Pimoroni
Дополнительные сведения
Полную документацию по проекту
https://retropie.org.uk.
RetroPie
можно найти по адресу
Picade
Глава
140
1
4.5.
Превращение устройства
4
Raspberry Pi
в FМ-передатчик
Задача
Вы хотите превратить свое устройство
Raspberry Pi
в маломощный FМ-передатчик,
способный передавать радиосигнал обычному FМ-приемнику (рис.
Рис.
4.9.
Использование
Raspberry Pi
4.9).
в качестве FМ-передатчика
Решение
Спустя некоторое время после появления платформы
Raspberry Pi,
умные ребята из
Имперского колледжа Лондона написали небольшой С-код, выполнявший как раз
эту задачу и, более того, даже проигрывавший в качестве примера главную тему из
«Звездных войю>. Этот код будет работать и сегодня, но только на первой модели
Raspberry Pi \ 3.
Исходное решение получило свое продолжение в виде более продвинутого проекта
rpitx,
рассчитанного на более новые модели
Raspberry Pi.
Из дополнительного оборудования вам потребуется лишь небольшой провод, под
ключенный к выводу
4
разъема
GPIO.
Вполне подойдет, например,
1О-сантимет
ровый провод с соответствующим гнездовым контактом на конце. В принципе,
можно обойтись вообще без антенны, если приемник будет расположен непосред
ственно возле устройства
нала.
3
См. https://oreil.ly/sl8aК.
Raspberry Pi, -
такова здесь мощность выдаваемого сиг
Использование готового программного обеспечения
Прежде всего, вы должны установить программу
rpitx,
1
141
используя для этого приве
денные далее команды. Следует отметить, что установка этой программы приведет
к изменению некоторых настроек устройства
Raspberry Pi,
включая, в частности,
рабочую частоту графического процессора. Поэтому, если вы решили установить
ее на своем основном устройстве
Raspberry Pi,
сначала скопируйте в другое место
все важные файлы. Итак, введите следующие команды:
$ git clone https://githuЬ.com/F5OEO/rpitx
$ cd rpitx
$ . / install. sh
Процесс установки будет длиться примерно
15
минут. На экране при этом могут
появляться информационные строки, похожие на сообщения об ошибках, но это
нормально. По завершении процесса установки установочный скрипт попросит вас
подтвердить внесение изменений в конфигурационный файл:
In order to run properly, rpitx need to modify /boot/config.txt. Are you sure (y/n)
Подтвердите внесение изменений, нажав клавишу <У>. Установочный скрипт со
общит о том,
250
что теперь
графический
процессор будет работать
на частоте
МГц:
Set GPU to
250Мhz
in order to
Ье staЬle
В случае необходимости это изменение можно будет откатить, удалив в файле
/Ьoot/config.txt последнюю строку с текстом
gpu_freq=250 и перезагрузив устройство.
Теперь настройте имеющийся у вас радиоприемник FМ-диапазона на частоту
103,0 МГц.
Если эта частота уже занята какой-то радиостанцией, выберите какую
то другую частоту и запомните, какой выбор вы сделали.
Далее введите следующую команду
(если
вам пришлось выбрать другую частоту,
укажите соответствующее значение вместо значения 103. о):
sudo ./pifmrds -freq "103.0" -audio src/pifmrds/stereo_44100.wav
Если все бьmо сделано правильно, вы должны услышать голос разработчика, рас
сказывающий о левом и правом каналах.
Пояснение
Должен вас предупредить, что описанный здесь передатчик выходит за рамки огра
ничений, установленных законами некоторых стран, поскольку выдает слишком
большую выходную мощность для FМ-передатчиков, используемых в сочетании
с МРЗ-проигрывателями.
Такой передатчик на базе
Raspberry Pi
можно с успехом использовать в легковом
автомобиле для передачи звуковых данных бортовой аудиосистеме.
Дополнительные сведения
Более подробные сведения о проекте
https://oreil.lyffrlOl.
rpitx можно
получить по адресу
Глава
142
1
4.6.
Редактирование растровых изображений
4
Задача
Вам нужно отредактировать фотографию или другое изображение.
Решение
Установите и запустите графический редактор
Program,
программа проекта
Рис.
4.10.
CilMP
GIMP (GNU lmage Manipulation
4.1 О).
для обработки изображений) (рис.
Использование программы
Графический редактор
Remove Software
GNU
GIMP
на устройстве Raspberгy
Pi
можно установить с помощью инструмента
(Добавить/удалить программное обеспечение) (см. рецепт
Add/
4.2).
Введите слово GIMP в поле поиска, и вам будет предложен список результатов, в ко
тором, наряду с самим редактором, вы увидите множество сопутствующих утилит.
Отыщите в этом списке пакет с нюванием
(«Программа
проекта
GNlJ
«GNU Image Manipulation Program»
для обработки юображений» ).
Если вы предпочитаете выполнять установку из командной строки, откройте окно
терминала и введите команду:
$
sudo apt instalJ gimp
Использование готового программного обеспечения
По завершении процесса установки в разделе
Graphics
1
143
(Графика) меню устройства
появится ярлык для запуска этой программы.
Raspberry Pi
Пояснение
Хотя редактор
GIMP
потребляет немало памяти и ресурсов процессора, его можно
с успехом использовать даже на модели
Raspberry Pi 2 В.
Тем не менее, чтобы тра
тить меньше времени на ожидание результатов производимых в редакторе манипу
ляций, лучше все же использовать его на модели
Raspberry Pi 4 или 400.
Дополнительные сведения
Более подробную информацию о редакторе
GIMP
можно найти на сайте этой про
граммы4.
Поскольку
Gimp -
достаточно продвинутый графический редактор, на освоение
всех его возможностей потребуется некоторое время. Онлайн-руководство по рабо
те с ним вы также найдете на его сайте.
В рецепте
3.17
рассказано о том, как можно произвести установку программы
с помощью утилиты
apt.
В рецепте
4. 7 описан
процесс редактирования векторных
изображений.
4.7.
Редактирование векторных изображений
Задача
Вам нужно создать или отредактировать высококачественные векторные изобра
жения наподобие файлов формата
SVG
(ScalaЬ\e
Vector Graphics,
масштабируемая
векторная графика).
Решение
Помимо прочего, инструмент
ное обеспечение) (см. рецепт
фики
Inkscape.
Add/Remove Software (Добавить/удалить программ
4.2) позволяет установить и редактор векторной гра
Откройте этот инструмент и найдите в нем программу с названием
lnkscape.
Если вы предпочитаете выполнять установку из командной строки, введите в окне
терминала команды:
$ sudo apt update
$ sudo apt install inkscape
По завершении процесса установки в разделе
Raspberry Pi
4
Graphics
(Графика) меню устройства
появится ярлык для запуска этой программы.
См, http://www.glmp.org.
144
Глава
4
Пояснение
Inkscape
(рис.
самый широко используемый редактор векторных изображе
4.11) -
ний с открытым исходным кодом. В отличие от растровых изображений, редакти
руемых с помощью таких программ, как
GIMP
(см. рецепт
4.6),
векторная графика
представляет собой комбинацию различных фигур, линий, текста и тому подобных
элементов, которые при сохранении файла не преобразуются в пикселы. Это озна
чает, что вы можете впоследствии заново отредактировать какой-либо элемент
изображения (например, положение линии), что невозможно в случае растровой
графики.
File Edit
у.,,, L:>)'Of
Cqcct Poth Tm fillcm
6t!O'ISIOnli
~~._
lidp
Q81/a l tэ1111QJ
"ttl.il
"'
Рис.
Inkscape -
4.11.
Использование программы
lnkscape
на устройстве
Raspberry Pi
очень мощная программа с множеством возможностей, для освоения
которых требуется некоторое время, поэтому не отчаивайтесь, если вам не удастся
сразу же добиться нужного результата. Возможно, вам просто нужно прочитать
какое-либо руководство по использованию этой программы.
Как и
GIMP, Inkscape
относится к числу тех программ, которым не помешает более
высокая вычислительная мощность моделей
Raspberry Pi 4
и
400.
Использование готового программного обеспечения
145
Дополнительные сведения
Более
подробную
информацию
о
программе
можно
lnkscape
найти
на
сайте
Inkscape.org.
Редактирование растровых изображений, к числу которых, в частности , относятся
фотографии, рассматривается в рецепте
4.8.
4.6.
Использование приложения
Bookshelf
Задача
Вы хотите использовать устройство
Raspberry Pi
для чтения предлагаемых бес
платно книг и журналов.
Решение
Bookshelf (Книжная полка), для
Raspberry Pi раздел Help
(Справка) и выбрать соответствующую опцию . В окне этой программы (рис . 4. 12)
вы увидите ссылки на опубликованные выпуски журналов The MagPi, Wireframe и
HackSpace, а также книги издательства Raspberry Pi Press.
Воспользуйтесь предустановленным приложением
запуска которого следует открыть в меню устройства
Рис.
4.12.
lssue 106
lssue 107
lssue 108
lssue 109
lssue 110
Приложение
Bookshelf
Пояснение
Это действительно полезный источник информации. В частности, выпуски журнала
The MagPi
содержат
много
статей
с
описанием
тех
или
иных особенностей
146
1
Глава
устройств
4
Raspberry Pi.
Представленная в них информация также подскажет вам,
разработкой каких проектов вам стоит заняться.
Дополнительные сведения
Много интересной информации об устройствах
сайте компании
Raspberry Pi
можно также найти на
Raspberry Pi Foundation'.
Вы также можете скачать опубликованные выпуски журнала
РDF-файлов 6
4.9.
The MagPi
в виде
или подписаться на бумажную версию этого журнала.
Прослушивание интернет-радио
Задача
Обеспечить возможность прослушивания на устройстве
Raspberry Pi
интернет
радио.
Решение
Raspberry Pi OS обычно предустанавливается и
VLC. Ярлык для запуска этой программы должен находиться
в меню устройства Raspberry Pi в разделе Sound & Video (Звук и Видео). Если его
там нет, установите эту программу с помощью инструмента Recommended
Software (Рекомендуемое программное обеспечение) (см. рецепт 4.2).
Наряду с другими приложениями в
медиапроигрыватель
Если вы предпочитаете выполнять установку из командной строки, введите команду:
sudo apt install vlc
Запустив программу
Stream
(Открыть
VLC, выберите в меню Media (Медиа) пункт Open Network
URL) - откроется диалоговое окно (рис. 4.13 ), позволяющее вам
ввести URL-aдpec той интернет-радиостанции, передачи которой вы хотите про
слушивать. Для прослушивания радио вам потребуется подключить наушники или
динамики со встроенным усилителем к аудиоразъему устройства
Raspberry Pi.
Обсуждение
Программу
VLC
также можно запустить из командной строки:
$ vlc http://www.a-lradio.com/listen.pls -1 dummy
При этом программа
VLC,
возможно, выдаст несколько сообщений об ошибках, но
затем начнет надлежащим образом
-r dummy обеспечивает запуск
5 См.
6
http~://oreil.ly/hRCSt:.
См. https://oreil.ly/11.JMHT.
воспроизводить ·1вуковой сигнал. Параметр
программы
VLC
без открытия ее окна.
Использование готового программного обеспечения
Рис.
4.13.
Использование программы
VLC
на устройстве RаsрЬеггу
147
Pi
Дополнительные сведения
Этот рецепт во многом основан на тексте инструкции, составленной Яном Холстом
Дженсеном
(Jan Holst Jensen)7, в которой он предлагает пойти еще дальше и под
Raspberry Pi кнопку для управления воспроизведением сиг
ключить к устройству
нала радиостанции.
Читатели
из Англии
могут воспользоваться списком
вещания радиостанции ВВС, представленным по адресу
4.10.
Использование программы
URL-aдpecoв потокового
https://oreil.ly/E_UPI.
Visual Studio Code
Задача
Вам требуется несложный редактор кода.
Решение
Установите редактор кода компании
как мы будем называть его далее, VS
7
См . https://oreil.ly/!IRYCq.
Microsoft
Code.
с названием
Visual Studio Code,
или,
148
Глава
4
Вы можете найти эту программу в разделе
инструмента
(см.рецепт
Recommended Software
Programming
(Программирование)
(Рекомендуемое программное обеспечение)
4.2).
Если вы предпочитаете выполнять установку из командной строки, воспользуйтесь
следующей командой:
$ sudo apt install code
Пояснение
Программисты очень любят редактор
VS Code по той
причине, что он представляет
собой золотую середину между простейшим текстовым редактором и полнофунк
циональной интегрированной средой разработки
(IDE).
Он очень прост в использо
вании и существенно упрощает ввод кода благодаря наличию функции автозавер
шения, при этом вам не придется осваивать всё то множество функций, которыми
обычно располагает более сложная среда разработки.
VS Code
поддерживает боль
шое количество языков программирования, что выражается в виде таких приятных
возможностей, как подсветка синтаксиса с целью сделать код более читабельным.
Если вы опытный программист, то, возможно, предпочтете задействовать для на
писания Python-кoдa для устройств
Raspbeny Pi
редактор
VS Code,
среду разработки для начинающих Руthоn-разработчиков вроде
Рис.
4.14.
Использование программы
а не какую-либо
Thonny
VS Code на устройстве Raspberry Pi
или
Mu
Использование готового программного обеспечения
(см. рецепты
и
5.3
Использование
5.4).
VS Code
1
149
будет особенно оправданным
в том случае, если ваш проект подразумевает создание большого количества фай
лов. Как показывает представленный на рис.
4.14
снимок экрана, в левой области
окна редактора находится файловый менеджер, позволяющий выбрать любой из
файлов вашего проекта. Щелкнув на каком-либо из этих файлов, вы можете от
крыть его содержимое в области редактирования, где для каждого открытого файла
выделяется отдельная вкладка.
Как можно здесь видеть,
VS Code
подсвечивает синтаксис языка программирова
ния разными цветами, что делает код более читабельным и облегчает поиск оши
бок.
Редактор
VS Code
относится к числу инструментов, которые всегда полезно иметь
под рукой, вне зависимости от того, какой язык программирования вы используе
те
-
Python
(см. главу
5)
или какой-то другой.
Дополнительные сведения
Для написания кода также можно использовать простейший текстовый редактор
nano
(см. рецепт
3. 7)
или редактор
разработчиков (см. рецепт
Thonny,
рассчитанный на начинающих Руtlюn
5.3).
4.11. Управление лазерным
гравером
Задача
Обеспечить с помощью устройства
Raspberry Pi
управление недорогим лазерным
гравером К40.
Решение
Если вы приобрели один из популярных и дешевых китайских лазерных граверов
серии К40 (рис.
Raspberry Pi
4.15),
то можете
использовать для управления им устройство
с установленной программой К40
Whisperer.
Это позволит вам спра
виться с гравером К40, не задействуя сравнительно дорогой компьютер на опера
ционной системе
Программа К40
Windows.
Whisperer
написана на языке
редактора векторной графики
это сейчас
lnkscape.
согласно рецепту 4. 7.
Python
и предполагает использование
Если вы его еще не установили, сделайте
Whisperer8. Выберите для скачива
столбце К40 Whisperer Source (Исход
Теперь скачайте исходный код программы К40
ния последнюю версию исходного кода в
ный код программы К40
Whisperer).
Выполнив двойной щелчок на скачанном ZIР
файле, извлеките его содержимое в свой домашний каталог (/home/pi). Внутри рас-
8
См. https://oreil.ly/n\'QIT.
150
Глава
4
пакованного каталога вы найдете файл
README_Linux.txt.
На основе изложенной
в этом файле универсальной инструкции для всех операционных систем
Linux
я
составил представленную далее конкретизированную инструкцию для устройств
Raspberry Pi.
Рис.
4.15.
Лазерный гравер К40
Прежде всего, необходимо выполнить следующие две команды, чтобы создать для
программы группу пользователей. Первая команда создает новую группу пользова
телей для лазерного гравера, а вторая добавляет в эту группу пользователя pi. Если
вы
использовали
Raspberry Pi,
$
$
другое
имя
пользователя
при
настройке
своего
устройства
укажите вместо pi это имя:
sudo groupadd lasercutter
sudo usermod -а -G lasercutter
р1
Подключите с помощью USВ-кабеля лазерный гравер к устройству
Raspberry Pi
и
включите его. Теперь следует выяснить, какие идентификаторы производителя
и продукта были присвоены ему как USВ-устройству. Хотя известно, что лазерным
граверам К40 присваивается идентификатор производителя
продукта
5512,
1а86
и идентификатор
на всякий случай убедитесь в том, что используются именно эти
номера. Это можно сделать с помощью команды lsusb:
$ lsusb
Bus 001 Device 004:
EPP/I2C adapter
Bus 001 Device 005:
Bus 001 Device 003:
Bus 001 Device 002:
Bus 001 Device 001:
ID
lаВб:5512
0424:7800
0424:2514
ID 0424:2514
ID ldбb: 0002
ID
ID
QinHeng Electronics
СН341
1n EPP/MEM/I2C mode,
Microchip Technology, Inc. (formerly SMSC)
Microchip Technology, Inc. (formerly SMSC) USB 2.0
Microchip Technology, Inc. (formerly SMSC) USB 2.0
Linux Foundation 2.0 root hub
НuЬ
НuЬ
Использование готового программного обеспечения
1
151
Эта команда выведет список всех USВ-устройств, подключенных к устройству
Raspberry Pi, -
найдите в полученном списке строку, относящуюся к лазерному
граверу. В нашем случае здесь есть только одна строка с названием китайской ком
пании
(QinHeng Electronics).
Но если в вашем случае нельзя сказать однозначно,
какая из строк списка вам нужна, отключите лазерный гравер и, выполнив команду
lsusb
еще раз, посмотрите, какая строка при этом из списка исчезнет.
Строка с информацией о нашем лазерном гравере содержит два разделенных двое
точием числа (lаВб:5512). Первое из этих чисел
фикатор производителя, а второе
(5512) -
(la86)
представляет собой иденти
идентификатор продукта. Эта инфор
мация потребуется вам при редактировании конфигурационного файла лазерного
гравера.
Теперь введите следующую команду, чтобы создать новый файл и открыть его
в редакторе
$
nano:
sudo nano /etc/udev/rules.d/97-ctc-lasercutter.rules
Как производится редактирование файлов, было рассказано в рецепте
3. 7.
Вставьте
в новый файл представленный далее текст. Если ваши идентификаторы производи
теля
и
продукта отличаются
от
моих,
измените
в
этом
тексте
соответствующие
места:
SUBSYSTEM=="usb", ATTRS{idVendor}=="[la86]", AТTRS(idProduct}=="[5512]",
ENV(DEVТYPE}=="usb_device", MODE="0664", GROUP="lasercutter"
Перезагрузите устройство
Raspberry Pi,
после чего выполните следующие команды,
чтобы установить еще несколько модулей, требующихся программе К40
Whisperer:
$ sudo apt install libxml2-dev libxslt-dev
$
sudo apt install libusb-1.0-0
$ sudo apt install libusb-1.0-0-dev
Затем
перейдите в тот каталог,
Whisperer,
$
рiрЗ
где были сохранены
программы
К40
install -r requirements.txt
Настало время запустить программу К40
$
файлы
и выполните команду:
pythonЗ
Whisperer,
выполнив команду:
k40_whisperer.py
В открывшемся окне откройте меню
File
(Файл) и выберите пункт
метры), чтобы произвести настройку программы (рис.
Options
(Пара
4.16).
Ознакомившись с прилагаемым к лазерному граверу руководством, выясните, ка
кая версия управляющей платы в нем используется. Если вам не удастся найти эту
информацию, попробуйте по очереди указать в поле
Board Name
(Название платы)
каждый из доступных вариантов. Никакие другие настройки менять не нужно.
Теперь можно закрыть окно настройки параметров и загрузить ту SVG-графику,
которую вы хотите выжечь (рис.
4.17).
152
Глава
4
К40 'Мiisperer V0.60
/home/pi{None
File Vlew Toals Sdtings
hllillliu t...er С.Ь.-
.,
Рис.
4.16.
Настройка программы К40
А
)(
Whisperer
Пояснение
Производители лазерных граверов часто включают в комплект поставки собствен
ное проприетарное программное обеспечение для управления гравером, обычно
предназначенное для установки на компьютер с операционной системой
Windows.
В комплект поставки также может входить USВ-адаптер, обеспечивающий под
ключение этого лазерного гравера к компьютеру.
Программа К40
Whisperer
производит лазерную резку и гравировку непосредст
венно на основе информации, содержащейся в SVG-файле. Вы должны лишь ис
пользовать контуры разных цветов с толщиной линии в О, 1 мм. Красным цветом
при этом обозначается резка, синим
-
векторная гравировка (выжигание контура
с использованием пониженной мощности), а черным
-
растровая гравировка (вы
жигание некоторой области поверхности путем перемещения луча туда-сюда).
Дополнительные сведения
Более подробную информацию о программе К40
https://oreil.ly/SRJth.
Whisperer
можно найти по адресу
Использование готового программного обеспечения
Рис.
4.17.
153
Лазерный гравер готов к использованию
Для создания той SVG-графики, которую вы будете выжигать с помощью гравера,
можно использовать редактор
С помощью программы
InkScape
OctoPrint
9
устройство
в отличный контроллер 3D-печати.
9
См. http~://octoprint.org.
(см. рецепт
4. 7).
Raspberry Pi
также можно превратить
ГЛАВА
5
Основы программирования
на языке
5.0.
Python
Введение
Хотя писать программы для устройств
Raspberry Pi можно и на многих других язы
Python. Недаром ведь в названии
«pi», навеянное словом «python».
ках, чаще всего для этой цели используется язык
этой платформы присутствует слово
Представленные в этой главе рецепты помогут вам написать свои первые програм
мы для устройств
5.1.
Raspberry Pi.
Выбор между
Python 2 и Python 3
Задача
Вы хотите приступить к работе с языком
Python,
но не знаете, какую его версию
лучше использовать в вашем случае.
Решение
Всегда используйте версию
Python 3,
откатываясь к версии
Python 2
лишь в тех
случаях, когда она обеспечивает более удачное решение задачи. Установить вер
сию
Python 2
в операционной системе
Raspberry Pi OS
можно, выполнив следую
щие команды:
$ sudo apt update
$ sudo apt install python2
После этого вы сможете запускать версию
Python 2 с
помощью команды python2.
Пояснение
Хотя последняя, 3-я версия языка
Python
появилась достаточно давно, многие про
граммисты по-прежнему используют версию
устанавливается в
Raspberry Pi OS
Python 2.
Версию
Python 3
(которая
по умолчанию) можно запустить с помощью
команды python или pythonЗ. За исключением тех случаев, когда явно указывается
иное, представленные в книге примеры кода рассчитаны на версию
Python 3.
В то
же время большинство этих примеров будут без каких-либо модификаций работать
и в версии
Python 2,
и в версии
Python 3.
Основы программирования на языке
Python
1
155
Нежелание Руthоn-сообщества сразу же отказываться от старой версии объясняется
главным образом тем, что некоторые из нововведений 3-й версии языка нарушают
совместимость со 2-й его версией. Как результат, многие из тех бесчисленных сто
ронних библиотек, которые были написаны для версии
в версии
Python 2,
не будут работать
Python 3.
Лично я стараюсь по возможности использовать
откатываясь к версии
Python 3,
только в тех случаях, когда это требуется из-за проблем с совмести
Python 2
мостью.
Дополнительные сведения
Хороший сравнительный анализ особенностей
в сетевой энциклопедии по языку
Python,
Python 2
и
Python 3 можно найти
https://oreil.ly/
расположенной по адресу
INjql.
Выбор редактора кода для языка
5.2.
Python
Задача
Среди множества редакторов кода, позволяющих писать код на языке
Python,
вам
нужно выбрать вариант, подходящий для начинающего программиста.
Решение
Большинство начинающих Руthоn-программистов использует либо
цепт
5.3),
либо
Mu
(см. рецепт
5.4).
Thonny
(см. ре
Обе эти программы представляют собой дос
таточно хорошие и легкие в использовании редакторы кода.
Thonny
входит в
нужно
будет установить.
Raspberry Pi OS
В
в число предустановленных программ, а
Интернете
можно
найти
множество
отдается предпочтение редактору
еще
информации
по обоим этим редакторам, но в большинстве материалов компании
Foundation
Mu
Raspberry Pi
Thonny.
Пояснение
В принципе, не так уж важно, в каком редакторе вы начнете писать свои первые
программы. При желании вы можете опробовать и
Thonny,
и
Mu,
и посмотреть,
какой из этих редакторов вам понравится больше.
Когда же вы немного освоитесь с написанием программ, можно будет перейти
к использованию редактора
VS Code
(см. рецепт
4.10) -
более профессионального
инструмента.
Дополнительные сведения
Работа с редакторами
тах
4.10
и
5.3.
VS Code
и
Thonny
описывается соответственно в рецеп
Глава
156
5.3.
5
Редактирование Руthоn-программ
в редакторе
Thonny
Задача
Вы хотите отредактировать свои Руthоn-программы в редакторе
Thonny.
Решение
Thonny обычно предустанавливается в Raspberry Pi OS . Однако если
Programming (Программирование) меню устройства Raspberry Pi вы не
можете найти эту программу, установите ее с помощью инструмента Recommended Software (Рекомендуемое программное обеспечение) (см. рецепт 4.2) .
Редактор
в разделе
Для начала запустите редактор
Thon11y,
щелкнув на соответствующем значке в раз
Programming (Программирование),
показано на рис. 5. 1:
деле
и введите следующие две строки, как
for i in range(l , 101 :
print (il
Обратите внимание, что при переходе на вторую строку с функцией print ( 1 редак
тор автоматически сделает отступ.
Stop
Zoom
1 for i in range(l, 10} :
print(i)
2
Python 3.9.2
(/usr/bin/pythonЗ)
>>>
Python 3.9 2
Рис.
Теперь с помощью кнопки
Run
5.1.
Редактор
Thonny
(Выполнить) можно запустить эту программу на
выполнение и посмотреть, что она делает. Перед тем, как выполнить программу,
редактор
имя -
Thonny
предложит вам сохранить файл. Присвойте файлу какое-либо
например, count.py 1 . После этого редактор выполнит программу и отобразит
ее результаты в нижней части окна (рис .
1
5.2).
Хотя Руthоn-программам можно давать любые име11а, обычно их сохраняют в файлах с расширением ру.
Основы программирования на языке
Тhonny
• /home/pi/countpy @ 2 •1з
v
Л)
New
loeo
DeЬug
Run
Jnto
Over
157
Python
°"'
Slop
•
х
~
t111111и
mmll
Zoom
coontpyx....__ _ _ _ _ _ _ _ _----''---~'--'--'"""'"----------'""-----'--------......_
1 for i in range( l, 18):
2
print(1)
SheП
Pyth"-o_n_З-.9-.-2~(-/u_s_r~/b-1-n/-p-yt_h_o_nЗ_)
_ _ __ _ _-'--.,___ __ _ _ _ _ _ _ _ _ _ _ _ _ _ ___
>>> %Run count.py
1
2
3
4
5
6
7
8
9
>>>
Рис.
5.2.
Выполнение программы в редакторе Тhоппу
Пояснение
Мы еще не приступили к программированию на
можете увидеть, что программа
программирования
Python.
-
Python,
но из этого примера вы
это передача инструкций компьютеру на языке
В этом случае инструкция состоит в том, чтобы распе
чатать серию чисел.
Хотя приведенный пример еще нельзя назвать реальным программированием на
Python,
он показывает, что программа представляет собой ряд инструкций на языке
программирования
Python,
которые мы даем компьютеру. В нашем случае мы дали
ему указание вывести на экран последовательный ряд чисел.
Дополнительные сведения
Более подробную информацию о редакторе
Tho11ny
можно найти на его официаль
ном сайте 2 .
Популярной
Mu (см. ре
цепт 5.4). Помимо редактирования и запуска Руthоn-программ в редакторе Mu, вы
также можете редактировать Руthоn-программы в редакторе nano (см. рецепт 3. 7) и
запускать их в окне терминала (см.рецепт 5.6).
2
альтернативой
См. https://tbonny.org.
редактору
Thonny
является
редактор
Глава
158
5.4.
5
Редактирование Python-nporpaмм в редакторе
Mu
Задача
Вы хотите редактировать свои Руthоn-программы в редакторе
Mu.
Решение
Редактор Mu не входит в число предустановленных программ в последних версиях
Raspberry Pi OS. Установите его, используя инструмент Recommended Software
(Рекомендуемое программное обеспечение) (см. рецепт
4.2). Когда вы это сделаете,
то сможете запустить этот редактор , щелкнув на соответствующем значке в разделе
Programming
(Программирование) (рис.
5.3).
> -О, BlueJ Java IDE
{ } Programm,ng
,
>
Education
Geany
~ Office
> " \ Greenfoot Java IDE
81ntemet
>•
Mathematica
Sound & Video
i
Graphics
.W.Games
) , . , Scratch
ф Accessories
>
Рис.
5.3.
Запуск редактора
При первом запуске редактора
рования (рис.
Mu
Mu
из меню устройства
Raspberry Pi
вам будет предложено выбрать режим редакти
5.4).
Выберите режим
Mu,
,tt, Scratch 2
Python 3
и щелкните на кнопке ОК
полностью готовое для ввода кода на языке
Python.
откроется окно редактора
Давайте попробуем это сделать . Для проверки того , как здесь всё работает, введите
в области редактирования ниже комментария # Write your code here
: - ) (Введите
здесь свой код:-)) следующий код:
for i in range(l, 10):
print (i)
Эта короткая программа выводит числа от
понятно, как она это делает,
-
1 до 9.
Не волнуйтесь, если вам пока не
мы подробно рассмотрим этот код в рецепте
5.23.
Обратите внимание, что , когда вы завершите ввод первой строки и нажмете клави
шу
<Enter>,
редактор автоматически сделает отступ перед второй строкой с функ
цией print() (рис .
5.5).
Чтобы можно было запустить эту программу, ее сначала нужно сохранить в файле .
Save (Сохранить)
count.py (рис. 5.6).
Для этого щелкните на кнопке
храните файл под именем
в верхнем меню редактора и со
Основы программирования на языке
Mu 1 02
r
Моdе
Select Mode
N
..
у
у
А
)(
Python
А
)(
Check
Please select the des,red mode then click ·ок· Otherw,se, click 'Cancel'
Adafrurt CircurtPython
Use CircuilPython on Adafrurt's line of Ьoards
Change mode at any t,rne Ьу click,ng the 'Mode' Ьutton conta,n,ng Mu's logo
~-~
ок
Python О
Рис.
New
Моdе
untitled •
1
2
з
5.4.
Выбор режима редактирования в редакторе
Run
L.oad
DeЬug
REPL Ploner
Zoom;n
Zoooн,ut
Mu
Theme
Check
Help
Х
Write your code here
for i in range(1, 10):
print i
:-)
#
Рис.
5.5.
Редактирование кода в редакторе
Mu 1 02 un~
,,, J
2
у
• sounds
А
◊Г' ШJ[!]
•
• fonts
• omages
• musк:
э
'ю
codc
Nэrne
Mu
Эzе
Туре
Dale
Folder
Folder
Folder
Folder
7/29/
7/29/
И9/
7/29/
<1
Fole!)Sme
._c_ou_nt~PY
........_ _ _ _ _ _ _ _ _ _ _ _ ___,
Files of type N FlleS ')
~--------Pytho<I о
Рис.
5.6.
Сохранение файла в редакторе
Mu
)(
Quit
159
Глава
160
5
Сохранив файл, запустите программу на выполнение, щелкнув на кнопке
Run
(Вы
полнить) в верхнем меню редактора. Окно редактора разделится на две части,
с отображением в нижней части результатов выполнения программы (рис.
Mu 1.0 2 - cou11lpy
Моdе
I New
Loed
5-
Stq)
IJe!>Ug
Plotter
REPL
Zoonнn
у
ZoomЫ
Theme
Q1l!Clt
Неiр
А
5.7).
)<
0..1t
CO\Jl\tpy х
1 t Write your code here :-)
2 for i in range(1, 18):
З
prinф
Rl.f1ntng count.py
1
2
3
4
5
б
7
8
9
>>>
Python
Рис.
5.7.
Выполнение программы
Если вы уже воспользовались рецептом
3.22
о
count.py
и скачали файлы используемых в кни
ге примеров кода, то можете просто открыть код этого примера в редакторе
Mu.
Для этого щелкните на кнопке
Open (Открыть) и перейдите в папку -/raspberrypi_
cookbook_ed4/python, как показано на рис. 5.8. Следует учесть, что редактор Mu под
держивает только версию
Python 3, в то время как некоторые примеры кода из этой
Python 2. Поэтому в случае проблем с выполнением
книги работают лишь в версии
какой-либо программы посмотрите в тексте рецепта, не предполагается ли в нем
использование версии
Python 2.
Пояснение
Уникальная особенность языка
Python
состоит в том, что одним из важных элемен
тов синтаксиса в нем являются отступы. Если в С-подобных языках границы бло
ков кода задаются с помощью фигурных скобок
{
и
},
то в языке
Python
это дела
ется с помощью уровней отступа. Так, в рассмотренном ранее примере отступ
в
4
пробела перед второй строкой говорит о том, что функция print является телом
цикла
for.
Начинающие Руthоn-проrраммисты часто сталкиваются с сообщением об ошибке
следующего содержания:
«IndentationError: unexpected indent»
(«Ошибка отступа:
Основы программирования на языке
161
Python
Mu 103-untJtled
Run
0eЬug
REPL
Plotter
Zoonнn
:zoom.out
1
2
~/home/pl/raspЬerr_okЬook.ed4/python ·~
•
Computer
8
р1
Name
-
+-
• Size
clt.10..ЬuttooJest.py
126_\es
14l _tes
247 _tes
118...tes
clt.l0_explore,JiaLЬlink.py
clt.HLsQUid..testpy
clt.l1 _Ьluedot.py
78б_tes
clt.11_guLsl!derJ1GB.py
clt.11 . gulslider.py
clt.l 1_gulswitch.py
317.. tes
498 . .tes
202...tes
133.. tes
182...tes
clt.11Jed.Ьl1nk..2.py
clt.11Jed.Ьl1nk.py
clt.11.Jed..Ьrightness. py
Туре
QaA
ру
1
F"lle
ру File
ру File
ру File
ру F"lle
pyFile
ру File
ру File
pyFile
ру File
10.
10
10
10
10
10
10
10
10
V
1>
Filename.
Files of type: 1• hex • ру *НЕХ *.РУ
----~-~--
Рис.
5.8.
Открытие в редакторе
Mu
одного из используемых в этой книге примеров Руthоп-кода
неожиданный отступ»). Оно как раз и говорит о том, что какая-то часть кода была
введена с неправильным отступом. Даже если вы не видите неправильных отступов
в своем коде, проследите за тем, чтобы отступы не содержали и символы пробела,
и символы табуляции, потому что эти символы интерпретируются в языке
Python
по-разному.
Вы можете использовать либо символы пробела, либо символы табуляции, но не
и те и другие одновременно. Нежелательно также и одновременное использование
и символов пробела, и символов табуляции в одной программе (несмотря на то, что
Python
позволяет это делать).
При выборе режима редактирования (см. рис.
5.4)
мы выбрали вариант
Python 3,
не
обратив внимания на наличие и других вариантов. Возвращаясь к этому моменту,
следует отметить, что режим
ве
Raspberry Pi
а режим ВВС micro:Ьit
компании ВВС. Оба эти
berry Pi
Adafruit CircuitPython позволяет писать на устройст
CircuitPython для ряда плат компании Adafruit,
- программы на языке MicroPython для платы Micro:Ьit
варианта предполагают использование совместно с Rasp-
программы на языке
дополнительных плат, которые не рассматриваются в этой книге, однако
будет совсем не лишним знать о том, что
Raspberry Pi
можно использовать и в со
четании с этими микроконтроллерными платами.
Дополнительные сведения
Еще одним популярным редактором кода для начинающих Руthоn-программистов
является
Thonny
(см. рецепт
5.3).
Глава
162
5
Помимо редактирования и запуска Python-nporpaмм в редакторе
можете редактировать Руthоn-программы в редакторе
пускать их в окне терминала (см.рецепт
5.5.
nano (см.
Mu,
рецепт
вы также
3. 7)
и за
5. 6).
Использование консоли языка
Python
Задача
Вы хотите вводить отдельные команды языка
Python
без необходимости писать код
всей программы. Это может быть полезным при изучении различных возможностей
языка
Python.
Решение
Воспользуйтесь консолью языка
Python
либо в редакторе
Thonny,
либо в окне тер
Python чем-то напоминает командную строку операционной
системы Raspberry Pi OS (см. рецепт 3.3), но, в отличие от нее, позволяет вводить
не команды операционной системы, а команды языка Python. Если вы используете
редактор Mu (см. рецепт 5.4), открыть консоль языка Python можно, щелкнув на
кнопке REPL (Read Eval Print Loop, цикл «чтение, вычисление, вывод») в верхнем
меню редактора (рис. 5.9).
минала. Консоль языка
1 import re
2 import urllib . request
з
4 regex = 'l([\d,]+) in Вooks'
5 url = 'https : //www . amazon . c011/RaspЬerry-Pi-CookЬook-Software-Solutions/dp/1
б
7 print("The
.ч.azon
rank is .... . ")
8
PythonЭ
(Jupyter) REPL
IPython
?
5.8.е
•· An enhanced Interact1ve Python.
-> Introduct1on and overv1ew of IPython•s features.
'6qu1ckref •> Qu1ck reference.
•> Python's own help system.
help
•> Deta11s about 'object', use 'object??' for extra deta11s.
object?
In [1]: 2 + 2
out[1]: 4
In [2]:
Python
Рис.
5.9.
Ввод команд языка
Python
в редакторе
Mu
Основы программирования на языке
В нижней части окна появится приглашение вида
будет ввести команду языка
Python.
rn
Python
163
[lJ :, после которого можно
В нашем случае после приглашения командной
строки было введено следующее выражение:
2 + 2
на что был получен надлежащий ответ:
4
Пояснение
Обеспечить возможность ввода отдельных команд языка
запустив в окне терминала консоль языка
Python 3 с
Python
также можно,
помощью команды pythonз.
Полученное при этом приглашение »> даст возможность вводить команды языка
Python.
При вводе многострочной команды консоль автоматически предоставит
строку продолжения, в начале которой будут стоять три точки. При этом все равно
нужно будет сделать отступ в четыре пробела, как показано в следующем примере:
>>> from time import sleep
»> while True:
print ( "hello")
sleep(l)
hello
hello
Завершив ввод последней строки, дважды нажмите клавишу
<Enter>.
Консоль вос
примет это как завершение блока команд с отступом и выполнит введенный код.
Консоль языка
Python
также обладает историей команд, в которой вы можете вы
брать одну из предыдущих команд, используя клавиши
Завершив работу с консолью языка
Python,
<j> и <t>.
введите команду exi t (), чтобы вернуть
ся в режим обычной командной строки.
Помощь всегда под рукой
Консолью языка Python часто удобно пользоваться в ходе разработки программы для
тестирования отдельных строк кода без запуска всей программы. При этом вы можете
получать справочную информацию по интересующим вас элементам языка Python, от
давая для этого команду
help (иwr_ элемента).
Например, попробуйте ввести команду
help (print).
Дополнительные сведения
Если вы хотите опробовать достаточно большое количество команд, то, возможно,
будет лучше сделать это путем редактирования и выполнения файла в редакторе
Thonny
или
Mu
(см.рецепты
5. 3 или 5. 4).
164
Глава
1
5
5.6. Запуск Python-nporpaмм
из терминала
Задача
Хотя нет ничего плохого в том, чтобы запускать Руthоn-программы в редакторах
Thonny (см.рецепт 5. 3) или Mu (см.рецепт 5. 4),
иногда все же требуется запустить
такую программу в окне терминала.
Решение
Введите в окне терминала команду python или pythonЗ, указав после нее имя файла
с той программой, которую вы хотите запустить. (Поскольку в
дустанавливается только
Python 3,
Raspberry Pi OS
пре
обе эти команды выполняют Руthоn-программу
с использованием 3-й версии языка. Поэтому решайте сами, какую из этих команд
вам лучше использовать.)
Пояснение
Чтобы выполнить в окне терминала Руthоn-программу с использованием 3-й версии
языка, введите команду следующего вида:
$
pythonЗ
myprogram.py
Если вам нужно выполнить программу с использованием 2-й версии языка, устано
вите
Python 2,
как было показано в рецепте
5. 1,
и введите вместо команды pythonЗ
команду python2. И в первом, и во втором случае запускаемая на выполнение
Руthоn-программа должна находиться в файле с расширением ру.
Хотя большинство Руthоn-программ можно запускать с правами обычного пользо
вателя, некоторые программы необходимо запускать с правами суперпользователя.
В таком случае поставьте перед запускающей командой команду sucto:
$ sudo
pythonЗ
myprogram.py
однако имейте при этом в виду, что, если программа бьmа написана злоумышлен
ником, запуск ее с такими правами может привести к катастрофическим последст
виям.
В приведенных здесь примерах мы запускали программы с помощью команды
pythonЗ, однако существует и альтернативный подход. При желании вы можете до
бавить в начало Руthоn-программы строку, сообщающую операционной системе
о том, что это программа на языке Python. В начале такой строки ставится
Linux
знак решетки и восклицательный знак: # ! . Вот как при этом может выглядеть про
грамма из одной строки:
#!/usr/Ьin/pythonЗ
print (" I 'm
а
program, I can run all
Ьу
myself")
Чтобы эту программу можно было запустить на выполнение из командной строки,
необходимо изменить ее права доступа, как показано в следующей строке кода
(см. также рецепт
$ chmod
+х
test.py
3.14):
Основы программирования на языке
Python
165
Здесь предполагается, что файл с программой называется test.py.
Поскольку в команде используется параметр +х, она добавляет право на выполне
ние файла test.py.
После этого Python-пporpaммy test.py можно будет запустить с помощью следую
щей команды:
$ ./test.py
I'm
а
program, I can run all
Ьу
myself
$
Символы
./
в начале строки здесь используются для того, чтобы интерпретатор
командной строки мог обнаружить файл с программой.
Если вы добавите в конце строки параметр -i, то команда запустит программу и
откроет консоль языка
Python.
Это может быть полезным при отладке программы,
потому что тогда вы будете иметь доступ к переменным программы, как если бы ее
текст был непосредственно введен в консоли.
Дополнительные сведения
В рецепте
объясняется, как можно запустить Руthоn-программу в заданный
3.25
момент времени, а в рецепте
3.23 -
как обеспечить автоматический запуск про
граммы на этапе начальной загрузки.
5.7.
Присвоение значений переменным
Задача
Сохранить некоторое значение в переменной.
Решение
Присвоить значение переменной можно с помощью оператора =.
Пояснение
В языке
Python
вам не нужно объявлять тип переменной
своить ей значение с помощью оператора присваивания
- достаточно просто при
=, как это делается в сле
дующих примерах:
а=
Ь
123
= 12.34
с=
"Hello"
d= 'Hello'
е
= True
Используя одинарные или двойные кавычки, вы можете определять строковые кон
станты. В языке
Python
есть и две логические константы: тrue и False, которые
необходимо записывать с соблюдением регистра.
166
1
Глава
5
Согласно принятым соглашениям по именованию, имена переменных должны на
чинаться со строчной буквы, и в случае имен, состоящих из нескольких слов, меж
ду этими словами должны стоять символы подчеркивания. Имя переменной не
может начинаться с цифры, но может содержать цифры, расположенные после пер
вого символа.
Рекомендуется присваивать переменным описательные имена, чтобы, вернувшись
к работе над программой после значительного перерыва, вы могли быстро разо
браться с тем, как она работает.
Вот несколько примеров допустимых имен переменных: х, total, nшnЬer_of_chars.
Дополнительные сведения
В переменных также можно сохранять такие типы значений, как список (см. ре
цепт
6.1)
и словарь (см.рецепт
В рецепте
5.1 О
6. 13).
рассказывается о том, как можно производить над переменными
арифметические операции.
5.8.
Отображение результатов
Задача
Отобразить значение переменной.
Решение
Воспользуйтесь функцией print. Например, попробуйте выполнить следующий код
в консоли языка
Python (см.рецепт 5. 5):
>» х = 10
>» print(x)
10
>>>
Обратите внимание, что функция print выводит значение в новой строке.
Пояснение
Если в
Python 2
функция print позволяла выводить не заключенное в круглые скоб
ки значение, то в
Python 3
она так сделать уже не даст. Поэтому для обеспечения
совместимости с обеими версиями языка
Python
рекомендуется всегда заключать
выводимое значение в круглые скобки.
Дополнительные сведения
В рецепте
ввода.
5. 9
рассказывается о том, как производится чтение пользовательского
Основы программирования на языке
Python
1
167
О том, как осуществлять форматирование выводимых значений, рассказано в ре
цептах
5.9.
7.1
и
7.2.
Чтение пользовательского ввода
Задача
Вы хотите предложить пользователю ввести определенное значение.
Решение
Python 3). Попробуйте
Python 3 (см.рецепт 5.5):
Воспользуйтесь функцией input (доступной в
следующий пример в консоли версии
выполнить
»> х ~ input("Enter Value:")
Enter Value:23
>» print (х)
23
»>
Пояснение
Python 3 функция input ведет себя совершенно не так, как она вела себя
Python 2. В Python 3 она возвращает строку даже в том случае, когда пользователь
вводит число. В Python 2 дело обстояло иначе: если введенный текст выглядел как
В
в
число, функция input преобразовывала его в число.
Дополнительные сведения
Более подробную информацию о том, как ведет себя функция input в
можно найти по адресу
5.1 О.
Python 2,
https://oreil.ly/EhqMt.
Использование арифметических операторов
Задача
Вам нужно произвести в Python-nporpaммe арифметические действия.
Решение
Воспользуйтесь операторами+,-,* и/.
Пояснение
Наиболее часто для выполнения арифметических действий в Python-nporpaммax
используются операторы
+, -, * и /,
вычитание, умножение и деление.
которые соответственно производят сложение,
168
1
Глава
5
Вы также можете группировать части арифметического выражения с помощью
круглых скобок, как это делается в следующем примере, где на основе значения
температуры в градусах Цельсия вычисляется значение температуры в градусах
Фаренгейта:
»> tempC = input("Enter temp in С: ")
Enter temp in С: 20
>>> tempF = (int(tempC) * 9) / 5 + 32
>>> print(tempF)
68.0
>>>
Функция
int здесь конвертирует в целое число строку символов, считанную с по
мощью функции input.
Существуют еще два арифметических оператора: % ( остаток от целочисленного
деления) и ** (возведение в степень). Например, возвести число
2
в 8-ю степень
можно следующим образом:
»> 2 ** 8
256
При получении результата вычислений важную роль играет порядок выполнения
арифметических операций. Например, попробуйте определить, какому из следую
щих двух значений будет равен результат выражения
♦
(2 + 3) * 2 = 10;
♦
2 + (3 * 2) = 8.
В
Python 3 результат этого
выражения будет равен
8,
2 + 3 * 2:
потому что умножение всегда
выполняется раньше, чем сложение.
Чтобы лучше запомнить правильную очередность выполнения операций, можно
использовать мнемоническое правило
♦
Brackets (Скобки);
♦
Orders (Степень);
♦
Division (Деление);
♦
Multiplication (Умножение);
♦
Adding (Сложение);
♦
Subtracting (Вычитание).
BODMAS:
Одна из часто выполняемых операций при написании кода
-
это увеличение зна
чения переменной на определенную величину. Так, например, если переменная х
содержит некоторое число, вот способ увеличить ее значение на единицу:
х
=
х
+ 1
Но поскольку подобные действия приходится выполнять достаточно часто, был
придуман сокращенный способ записи для операторов
+, -,
* и
/,
выполняемых
Основы программирования на языке
Python
1
169
с одновременным присвоением нового значения переменной. Например, увеличить
на единицу значение переменной х также можно следующим образом:
Дополнительные сведения
Обратитесь также к рецепту
ей input, и к рецепту
5.14,
5. 9,
где показано, как можно воспользоваться функци
где объясняется, как можно преобразовать в число стро
ковое значение, считанное с помощью функции input.
Много полезных математических функций содержит библиотека Math3 •
5.11.
Создание строк
Задача
Вам нужно создать строковую переменную
-
т. е. переменную, содержащую
текст.
Решение
Создайте новую переменную, присвоив ей строковую константу с помощью опера
тора присваивания
=.
При этом строковая константа может быть заключена либо
в одинарные, либо в двойные кавычки. Например:
>>> s = "аЬс def"
>» print(s)
аЬс
def
»>
Пояснение
Если одинарные или двойные кавычки присутствуют в самой строке, то строку
следует заключить в кавычки другого типа. Например:
>>> s = "Isn't it warm?"
»> print (s)
Isn't it warm?
>»
Иногда бывает необходимо включить в строку специальные символы вроде симво
ла табуляции или символа новой строки. Это можно сделать путем использования
так называемых еsсаре-последователъностей. Так, для включения в строку симво
ла табуляции
и
символа
последовательности \t и
3
См. https:l/oreil.ly/atv6D.
новой
строки
\n. Например:
используются
соответственно
еsсаре
170
Глава
5
»> s = "name\tage\nМatt\t14"
>» print (s)
name
age
Matt
14
»>
Дополнительные сведения
Полный список еsсаре-последовательностей, используемых в языке
найти
в
справочном
руководстве,
размещенном
на
Python,
официальном
можно
сайте этого
языка4 .
5.12.
Конкатенация (объединение) строк
Задача
Вам нужно объединить несколько строк в одну.
Решение
Воспользуйтесь оператором конкатенации:+. Например:
>>> s1 = "аЬс"
>>> s2 = "def"
>» s = s1 + s2
»> print (s)
abcdef
»>
Пояснение
Многие языки программирования позволяют подвергать конкатенации цепочки
значений, включающие в себя не только строки, но и значения других типов,
-
например, числа. При этом в процессе конкатенации числа автоматически преобра
зуются в строки. В языке
Python
так поступать нельзя, и при попытке ввести сле
дующую команду вы получите сообщение об ошибке:
>>> "аЬс" + 23
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ТypeError: can only concatenate str (not "int") to str
В языке
Python
все элементы подвергаемой конкатенации цепочки должны быть
перед выполнением конкатенации преобразованы в строку:
4
См. https://oreil.ly/mrYmw.
Основы программирования на языке
»>
"аЬс"
Python
1
171
+ str(23)
'аЬс23'
»>
Дополнительные сведения
Преобразование чисел в строки с помощью функции str показано в рецепте
5.13.
5.13.
Преобразование чисел в строки
Задача
Вам нужно преобразовать число в строку.
Решение
Воспользуйтесь функцией str языка
Python.
Например:
»> str(123)
'123'
>»
Пояснение
Преобразование числа в строку часто производится для того, чтобы полученную
строку можно было объединить с другой строкой (см.рецепт
5.12).
Дополнительные сведения
О том, как производится противоположная операция: преобразования строки в чис
ло, рассказывается в рецепте
5.14.
5.14.
Преобразование строки в число
Задача
Вам нужно преобразовать строку в число.
Решение
Воспользуйтесь функцией int или float языка
Python.
Например, преобразовать в число строку -123 можно следующим образом:
>» int ("-123")
-123
»>
172
Глава
5
Этот способ подходит и для положительных, и для отрицательных целых чисел.
В случае чисел с плавающей запятой вместо функции int следует использовать
функцию float:
>>> float("123.45")
123. 45
>>>
Пояснение
Обе эти функции корректно интерпретируют начальные нули и допускают наличие
любого количества пробелов и других пробельных символов вокруг числа.
Кроме используемой по умолчанию десятичной системы счисления, функция int
позволяет использовать и другие системы счисления. Для этого в качестве второго
аргумента нужно указать основание нужной системы счисления. Так, преобразо
вать в целое число строковое представление двоичного числа
1001
можно следую
щим образом:
>» int("1001", 2)
9
>>>
А вот так можно преобразовать в целое число строковое представление шестнадца
теричного числа
AFF0:
»> int("AFF0", 16)
45040
>>>
Дополнительные сведения
О том, как производится противоположная операция: преобразования числа в стро
ку, рассказывается в рецепте
5.13.
5.15. Определение длины
строки
Задача
Вам нужно узнать, сколько символов содержится в строке.
Решение
Воспользуйтесь функцией len языка
Python.
Обсуждение
Например, определить длину строки abcdef можно следующим образом:
Основы программирования на языке
Python
1
173
( см.
ре
>» len ( "aЬcdef")
6
>>>
Дополнительные сведения
Функцию len также можно использовать для определения длины списков
цепт
6.3).
5.16. Определение
позиции подстроки в строке
Задача
Вам нужно определить в строке позицию определенной подстроки.
Решение
Воспользуйтесь функцией find языка
Python.
Например, определить начальную позицию подстроки ctef в строке aЬcdefghi можно
следующим образом:
>>> s = "aЬcdefghi"
»> s.find("def")
з
>>>
Оrсчет позиций символов в
зиция
Python
3 соответствует четвертому
начинается с О (а не
l),
поэтому, например, по
символу в строке.
Пояснение
При отсутствии в строке искомой подстроки функция find возвращает значение
-1.
Дополнительные сведения
Функция replace позволяет найти и заменить в строке все вхождения определенной
подстроки (см. рецепт
5.17.
5.18).
Извлечение части строки
Задача
Вам нужно вырезать часть строки, расположенную между определенными пози
циями символов.
174
1
Глава
5
Решение
Воспользуйтесь имеющейся в языке
Python нотацией среза: [: J.
Например, далее показано, как можно вырезать в строке
abcdefghi фрагмент со вто
рого по пятый символ включительно:
»> s = "abcdefghi"
»> s[l:5]
'bcde'
>»
Отсчет позиций здесь начинается с О (а не
рому, а позиция
5-
1),
поэтому позиция
1 соответствует вто
шестому символу в строке. Верхняя граница диапазона в но
тации среза является эксклюзивной, поэтому последним символом в показанном
случае становится символ с позицией
4,
а не символ с позицией
5.
каемый фрагмент не включается буква f, расположенная в позиции
То есть в извле
5.
Пояснение
Нотация
[: J
предоставляет вам достаточно мощные возможности. Опуская первый
или второй аргумент, вы можете оставлять без изменений начало или конец строки.
Например:
»> s ~ "abcdefghi"
»> s[:5]
'abcde'
>»
Вот еще один пример:
>» s .. "abcdefghi"
»> s[З:]
'defghi'
»>
Для отсчета позиций от конца строки можно использовать отрицательные индексы.
Это, в частности, будет полезным в том случае, когда нужно извлечь трехсимволь
ное расширение имени файла:
»> "myfile.txt"[-3:]
'txt'
Дополнительные сведения
Противоположный процесс
вается в рецепте
В рецепте
6.11
-
объединения нескольких строк в одну
-
рассматри
5.12.
объясняется, как тот же синтаксис можно использовать в случае
списков.
Еще один, более мощный способ манипулирования строками, описывается в ре
цепте
7.23.
Основы программирования на языке
5.18. Замена
Python
1
175
в строке одной подстроки на другую
Задача
Вам нужно заменить в строке все вхождения одной подстроки другой подстрокой.
Решение
Воспользуйтесь функцией
replace.
Например, далее показано, как можно заменить в строке все вхождения буквы х
словом
times:
»> s = "It was the best of Х. It was the worst of Х"
»> s.replace l"X", "times"I
'It was the best of times. It was the worst of times'
»>
Функция
replace
принимает два параметра: заменяемую и замещающую подстроки.
Пояснение
Замена производится в случае полного совпадения с заменяемой подстрокой, с уче
том регистра символов и пробелов.
Дополнительнь1е сведения
В рецепте 5.16 рассматривается поиск подстроки без выполнения замены. Еще
один, более мощный способ манипулирования строками, описывается в рецеп
те 7.23.
5.19.
Перевод строки в верхний или нижний регистр
Задача
Вам нужно перевести все символы строки в верхний или нижний регистр.
Решение
Воспользуйтесь функцией
upper или lower.
Например, далее показано, как можно перевести в верхний регистр строку авсое:
>» "aBcDe",upper()
'ABCDE'
»>
Перевести ту же строку в нижний регистр можно следующим образом:
>» "aBcDe",lower(I
'аЬсdе'
»>
176
1
Глава
5
Несмотря на то что функции upper и lower не принимают параметров, после их на
звания все равно должны стоять круглые скобки:
().
Пояснение
Как и большинство других функций для работы со строками, функции upper и lower
в действительности не модифицируют строку, а возвращают ее модифицированную
копию.
Например, представленный далее код возвращает копию строки
s,
которая при этом
остается неизменной:
>>> s = "aBcDe"
»> s.upper()
'ABCDE'
>>> s
'aBcDe'
>»
Чтобы перевести в верхний регистр саму строку
s,
нужно сделать следующее:
>>> s = "aBcDe"
>» s = s. upper ()
>>> s
'ABCDE'
»>
Дополнительные сведения
В рецепте
5.18 показано,
5.20. Условное
как можно заменить один текст другим внутри строки.
выполнение команд: оператор
if
Задача
Вам нужно, чтобы некоторая часть Python-кoдa выполнялась только в случае ис
тинности определенного условия.
Решение
Воспользуйтесь оператором if языка
Python.
Следующий код выведет сообщение х is Ьig (х
случае, если значение переменной х превышает
>» х = 101
»> if х > 100:
... print 1"х is
х
is
Ьig
Ьig")
- большое
100:
значение) только в том
Основы программирования на языке
Python
1
177
Пояснение
После ключевого слова if записывается условие, которое обычно представляет со
бой операцию сравнения двух значений, дающую в результате значение True или
False. Если результат сравнения равен True, производится выполнение всех следую
щих далее строк кода с отступом.
Часто требуется выполнять какое-то одно действие в случае истинности условия
и какое-то другое действие в случае его ложности. Далее показано, как следует
использовать оператор
if
в сочетании с оператором
else:
= 101
х
> 100:
print ( "х is big")
else:
print ( "х is small")
print ("This will always print")
if
х
К оператору if также можно пристыковать длинную цепочку операторов elif ( else
if) с дополнительным условием. Если какое-либо из этих условий окажется истин
ным, будет выполнен соответствующий блок кода, и остальные условия уже не
будут проверяться.
Например:
90
> 100:
print ( "х is big")
elif х < 10:
print ( "х is small")
else:
print ("х is medium")
х =
if
х
Этот код выведет сообщение х is mectium (х- среднее значение).
Дополнительные сведения
В рецепте
5.21
более подробно рассказывается о том, какие виды сравнений вы
можете выполнять.
5.21. Сравнение значений
Задача
Вам нужно сравнить два числовых значения.
Решение
Воспользуйтесь одним из следующих операторов сравнения:<,>,<=,>=,==,
!=.
178
Глава
1
5
Пояснение
В рецепте
5.20
мы уже использовали операторы< (меньше чем) и> (больше чем).
Вот полный список операторов сравнения:
♦
♦
<Меньше чем;
>Больше чем;
<= Меньше или равно;
>= Больше или равно;
== Равно;
♦
!=Неравно.
♦
♦
♦
Некоторые программисты предпочитают вместо оператора
!= использовать
опера
тор<>, который действует точно так же.
Попробуйте
(см. рецепт
»>
применить
каждый из этих операторов в
консоли языка
Python
5.5):
1 !• 2
T:rue
»>
1 !• 1
ral••
»>
10
>•
10
10
>•
11
T:rue
>»
ra11a
»>
10 ... 10
T:rue
»>
Распространенной ошибкой является использование в условии «равно» одного зна
ка равенства(·) вместо двух(·•). Эту ошибку часто трудно заметить из-за того, что
один знак равенства просто присваивает значение переменной без какого-либо
сообщения об ошибке,
-
в итоге вы получаете не тот результат, на какой рассчи
тывали.
С помощью операторов сравнения можно сравнивать не только числа, но и строки:
»>
'аа'
<
'аЬ'
T:rue
>>>
'ааа'
< 'аа'
ral••
Строки сравниваются лексикографически
-
т. е. в соответствии с порядком их
следования в словаре.
Это не совсем корректно, потому что заглавная версия любой буквы при сравнении
считается меньшим значением, чем строчная версия той же буквы. Дело в том, что
Основь, программирования на языке
Python
1
179
каждой букве ставится в соответствие так называемый АSСП-код5, и у заглавной
версии буквы это значение меньше, чем у строчной версии той же буквы.
Например:
>>>
'В'
>
'а'
>
'А'
rala•
>>>
'В'
Trua
Дополнительные сведения
Более подробно об использовании оператора if и логических операторов рассказа
но в рецептах
5.20
и
5.22.
Еще один, более мощный способ манипулирования строками описывается в рецеп
те
7.23.
5.22. Использование логических операторов
Задача
Вам нужно определить сложное условие в операторе if.
Решение
Воспользуйтесь логическими операторами and, or и not.
Пояснение
Допустим, например, что вам надо произвести определенные действия в том слу
чае, если переменная х находится в диапазоне от 1О до 20 включительно. Тогда
можно воспользоваться оператором
>»
х
• 17
>>> if
х
>• 10 and
print ( 'х
х
and:
х
iз
<• 20:
in the middle')
ia in the middle
Вы можете использовать комбинацию из любого количества операторов and и or,
группируя их при необходимости с помощью круглых скобок.
Дополнительные сведения
Более подробно об использовании оператора if и сравнении значений рассказано
в рецептах
5 См.
5.20
и
5.21
https://orell.ly/87YKO.
соответственно.
180
1
5.23.
Глава
5
Выполнение цикла
определенное l(Оличество раз
Задача
Вам нужно выполнить некоторый программный код четко заданное количество раз.
Решение
Произведите итеративный обход диапазона значений, используя оператор for языка
Python.
Например, вызвать функцию print
1О
раз можно следующим образом:
>>> for i in range(l, 11):
print(i)
1
2
3
4
5
6
7
8
9
10
»>
Пояснение
В качесiве второго параметра функции range передается эксклюзивная верхняя гра
ница диапазона. Поэтому, чтобы подсчет производился до 10 включительно, второй
параметр должен быть равен 11.
Дополнительные сведения
Если вместо того чтобы просто выполнять цикл определенное количество раз, вам
надо выполнять его, пока не изменится результат проверки определенного условия,
обратитесь к рецепту
5.24.
Если вам требуется выполнить ряд команд для каждого элемента списка или слова
ря, обратитесь соответственно к рецептам
6. 7 и 6.16.
Основы программирования на языке
5.24.
Python
1
181
Выполнение цикла
до изменения результата условия
Задача
Вам нужно циклически выполнять некоторый программный код до тех пор, пока не
изменится результат проверки определенного условия.
Решение
Воспользуйтесь оператором while языка
Python.
Оператор while циклически выпол
няет вложенные в него команды до тех пор, пока его условие не станет ложным.
Так, например, в следующем примере цикл будет выполняться до тех пор, пока
пользователь не введет букву «Х» для выхода из цикла:
>>> answer = ' '
>>> while answer
1=
'Х':
answer = input ( 'Enter comrnand: ')
Enter comrnand:A
Enter comrnand:B
Enter command:X
»>
Пояснение
Обратите внимание на то, что до начала выполнения цикла while переменной answer
в качестве начального значения присваивается пустая строка. Если бы мы этого не
сделали, строка с оператором while сразу же выдала бы сообщение об ошибке, по
скольку в этой точке переменная answer еще не была бы определена и не содержала
бы того значения, которое мы подвергаем сравнению.
Дополнительные сведения
Если вам нужно просто выполнить ряд команд определенное количество раз, обра
титесь к рецепту
5. 23.
Если вам нужно выполнить ряд команд для каждого элемента списка или словаря,
обратитесь соответственно к рецептам
5.25.
6. 7 и 6.16.
Выход из цикла
Задача
Обеспечить выход из цикла при выполнении определенного условия.
182
Глава
5
Решение
Для выхода из цикла while или for можно использовать оператор break языка
Python.
Например, представленный далее код ведет себя точно так же, как пример кода из
рецепта
5.24:
»> while True:
answer = input ( 'Enter cornmand: ')
if answer == 'Х':
break
Enter cornmand:A
Enter cornmand:B
Enter cornmand:X
>>>
Хотя строка while тrue:, на первый взгляд, выглядит странно, она просто означает,
что цикл должен выполняться бесконечно или до того момента, пока вы не вос
пользуетесь каким-либо способом выхода из него.
Пояснение
В этом примере используется версия функции input, доступная в
такой пример заработал в
цию
Python 2,
Python 3.
Чтобы
вместо функции input следует применить функ
raw _ input.
Этот пример ведет себя точно так же, как пример кода из рецепта
за того, что в качестве условия цикла
while
5.24.
Однако из
здесь используется просто значение тrue,
такой цикл будет выполняться бесконечно, если мы не выйдем из него с помощью
оператора break при вводе пользователем буквы «Х».
Дополнительные сведения
Для выхода из цикла while также можно использовать его условие, как показано
в рецепте
5.24.
5.26. Определение функции
в языке
Python
Задача
Вы хотите избежать многократного повторения в программе одного и того же кода.
Решение
Создайте функцию, содержащую многократно используемые строки кода, и вызы
вайте ее в тех точках программы, где это необходимо.
Основы программирования на языке
Создать функцию в языке
Python
Python
183
можно следующим образом:
def count_to_l0():
for i in range(l, 111:
print (i)
В этом примере с помощью оператора def определяется функция count_to_l0, при
каждом вызове которой на экран будут выводиться числа от
1 до 10:
>>> count to 10()
1
2
3
4
5
6
7
8
9
10
>>>
Пояснение
При использовании функций действуют те же соглашения по именованию, что и
для переменных (см. рецепт
5. 7), -
т. е. имена функций должны начинаться
со строчной буквы, и в случае имен, состоящих из нескольких слов, между этими
словами должны стоять символы подчеркивания.
Созданная в этом примере функция не отличается гибкостью, поскольку способна
выводить только числа от
1 до 1О.
Чтобы она стала более гибкой
-
пусть бы, на
пример, выводимый ею ряд чисел заканчивался произвольно выбранным чис
лом,
-
мы можем передавать ей это число в качестве параметра, как показано
в следующем примере:
def count_to_n(n):
for i in range(l, n + 1):
print (i)
count_to_n(5)
>>> count_to_l0()
1
2
3
4
5
»>
Указанный в круглых скобках параметр n используется далее в функции range уже
после добавления к нему единицы.
Глава
184
5
При таком подходе указывать конечное число придется при каждом вызове функ
ции, даже если вам почти всегда надо выводить числа от
гда
-
от
1 до
1 до 1О,
и только ино
другого числа. Однако, определив для параметра значение по умол
чанию, вы можете получить решение, соединяющее в себе положительные стороны
обоих предыдущих подходов:
def count_to_n(n=l0):
for i in range(l, n + 1):
print(i)
count _to_n ()
Теперь наша функция будет выводить числа от
1 до 10,
если мы не передадим ей
другое конечное число при ее вызове.
Если в функции необходимо задействовать несколько параметров
-
например, для
вывода на экран чисел, расположенных между произвольно выбранными началь
ным и конечным числами, укажите эти параметры, разделив их запятыми:
def count
(from_nшn=l, to_num=l0):
for i in range(from_num, to num + 1):
print (i)
count ()
1
2
3
4
5
6
7
8
9
10
»>
count (5)
1
2
3
4
5
»>
count(5, 10)
5
6
7
8
9
10
»>
Основы программирования на языке
Python
1
185
Если значением по умолчанию нужно снабдить только часть параметров, то пара
метры, обладающие значением по умолчанию, следует указать в определении
функции после параметров, не обладающих таким значением. То есть вариант
count(from_num,
to_nшn=lO) является допустимым, а вариант
count(from_num=l, to_num) -
нет.
Во всех представленных здесь примерах функции просто производили определен
ные действия, не возвращая при этом никакого значения. Если вам нужно, чтобы
функция возвращала значение, воспользуйтесь оператором return.
Например. представленная далее функция принимает в качестве параметра строку
и возвращает ту же строку с добавленным в ее конец словом please (пожалуйста):
def make_polite(sentence):
return sentence + "please"
print (make _polite ("Pass the cheese"))
Когда функция возвращает значение, этот результат можно присвоить переменной
или, как в показанном здесь случае, просто вывести на экран.
Дополнительные сведения
Если вам нужно возвращать из функции сразу несколько значений, обратитесь
к рецепту
7. 3.
ГЛАВА&
Списки и словари
в языке
6.0.
Python
Введение
В главе
5 мы
познакомились с основами программирования на языке
главе мы рассмотрим два ключевых типа струюур данных языка
Python.
Python:
В этой
списки
и словари.
6.1.
Создание списка
Задача
Вам нужно сохранить в переменной некоторый набор значений, а не какое-то одно
значение.
Решение
Используйте список. В языке
Python
список представляет собой набор значений,
расположенных в определенном порядке, что позволяет осуществлять доступ к ним
по позиции.
Для создания списка надо заключить его исходное содержимое в квадратные скоб
ки[]:
>»
>»
а =
[34, 'Fred', 12, False, 72.3]
В отличие от массивов, используемых в таких языках, как С, списки языка
Python
отличаются большей гибкостью в том плане, что при их объявлении не требуется
указывать их размер. Вы также можете в любой момент изменить количество со
держащихся в списке элементов.
Пояснение
Как можно видеть в представленном здесь примере, списки могут содержать эле
менты разных типов, хотя нередко содержат элементы только одного типа. Доволь
но часто один список содержит в качестве элементов другие списки.
Создать пустой список с тем, чтобы заполнить его элементами позднее, можно сле
дующим образом:
Списки и словари в языке
>»
>»
а
6.2.
Python
1
187
= []
Осуществление доступа к элементам списка
Задача
Вам нужно извлекать или изменять отдельные элементы списка.
Решение
Используйте квадратные скобки
[J для
доступа к элементам списка по их позиции
в списке. Например, получить доступ к элементу списка с позицией
1
можно сле
дующим образом:
>»а=
(34, 'Fred', 12, False, 72.3]
>» a[l]
'Fred'
Пояснение
Отсчет позиций (индексов) в списке начинается с позиции О, соответствующей его
первому элементу (а не с позиции
Квадратные скобки
[J
1).
можно использовать не только для чтения содержащихся
в списке значений, но и для изменения значений, расположенных в той или иной
позиции:
»> а = (34, 'Fred', 12, False, 72.3]
»> a[l] = 777
>>> а
(34, 777, 12, False, 72.3]
Если вы попытаетесь изменить или считать элемент списка, используя слишком
большой индекс, вы получите сообщение об ошибке выхода за пределы диапазона
(index out of range):
>» a[SO] = 777
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
»>
У доб ной особенностью списков языка
Python
является то, что они позволяют осу
ществлять доступ к элементам, используя отрицательные индексы, отсчитываемые
от конца (правого края) списка. При этом индекс -1 будет соответствовать послед
нему элементу списка, индекс -2 использования такого подхода:
второму элементу с конца, и т. д. Вот пример
Глава б
188
>>>
а
= [34, 'Fred', 12, False, 72.3]
»>а[-1]
72.3
>»а[-2]
False
»>
6.3. Определение длины
списка
Задача
Вам нужно узнать, сколько элементов содержит список.
Решение
Воспользуйтесь функцией len языка
Python.
Например:
»> а = [34, 'Fred', 12, False, 72.3]
>» len(a)
5
Функция len присутствует в языке
Python
с самой первой его версии, и потому ее
синтаксис идет вразрез с ориентированными на использование объектов и классов
версиями
»>а=
»>
а.
2 и 3.
В этих версиях более логично выглядел бы следующий синтаксис:
[34, 'Fred', 12, False, 72.3]
length () #
Этот код не будет работать
Однако такой синтаксис использовать нельзя
-
так уж устроен этот язык.
Пояснение
Функцию len также можно использовать для определения длины строк (см. ре
цепт
5.15).
6.4. Добавление элементов
в список
Задача
Вам нужно произвести добавление элементов в список.
Решение
Используйте имеющиеся в языке
Python
функции append, insert и extend.
Для добавления одного элемента в конец списка можно использовать функцию
append:
Списки и словари в языке
Python
1
189
>>>а= [34, 'Fred', 12, False, 72.3)
>>> а. append ( "new")
>>> а
[34, 'Fred', 12, False, 72.3, 'new')
Пояснение
Иногда вместо добавления нового элемента в конец списка требуется вставить его
в определенную позицию. Это можно сделать с помощью функции insert, которая
принимает два параметра: целевой индекс вставляемого элемента и его значение:
»> a.insert(2, "new2")
>>> а
[34, 'Fred', 'new2', 12, False, 72.3)
Обратите внимание на то, что все элементы, которые должны расположиться в спи
ске после вставляемого элемента, сдвигаются на одну позицию назад.
Если функции append и insert добавляют в список только один элемент, то функция
extend добавляет в конец одного списка все элементы другого списка:
»> а = [34, 'Fred', 12, False, 72.3)
»> Ь = [74, 75)
>» a.extend(b)
»> а
[34, 'Fred', 12, False, 72.3, 74, 75)
Вместо функции append можно использовать оператор +=, как показано в следующем
примере:
»>
»>
»>
»>
а
Ь
а
= [34, 'Fred', 12, False, 72.3)
= [74, 75)
+= Ь
а
[34, 'Fred', 12, False, 72.3, 74, 75)
6.5. Удаление элементов из списка
Задача
Вам нужно произвести удаление элементов из списка.
Решение
Воспользуйтесь функцией рор языка
Python.
Вызов функции рор без параметров ведет к удалению последнего элемента списка:
»>
»>
72.3
а
= (34, 'Fred', 12, False, 72.3)
а.рор()
190
1
Глава б
>>> а
(34, 'Fred', 12, False]
Пояснение
Обратите внимание на то, что функция рор возвращает удаляемое из списка значе
ние в качестве результата.
Если надо удалить элемент, расположенный не в конце списка, а в какой-то другой
позиции, следует вызвать функцию рор с параметром, указывающим позицию этого
элемента:
»>а=
»>
34
[34, 'Fred', 12, False, 72.3)
а.рор(О)
Если указанный индекс будет больше индекса последнего элемента списка, вы по
лучите сообщение об ошибке выхода за пределы диапазона (index out of range).
Если нужно произвести удаление с выбором удаляемого элемента по его значению,
а не по индексу, воспользуйтесь функцией remove:
>»а= [34, 'Fred', 12, False, 72.3]
>>> a.remove(l2)
а
[34, 'Fred', False, 72.3)
»>
. 6.6.
Создание списка
путем синтаксического анализа строки
Задача
Вам нужно преобразовать строку, содержащую разделенные определенным симво
лом слова, в массив строк, в котором каждый элемент будет представлять собой
одно слово.
Решение
Воспользуйтесь строковой функцией split языка
Python.
При вызове функции split без параметров строка разбивается на отдельные слова
с представлением их в виде элементов массива:
»> "аЬс def ghi". split ()
[ 'аЬс' , 'def' , 'ghi' ]
При вызове функции spli t с параметром разбиение исходной строки производится
с использованием переданного в качестве параметра разделителя:
Списки и словари в языке
Python
1
191
»> "aЬc--de--ghi". spli t ( ' -- ' )
[ 'аЬс' , 'de' , 'ghi ' ]
Пояснение
Функция split, в частности, может быть очень полезной при импорте данных из
файла, поскольку способна дополнительно принимать параметр, представляющий
собой строку, которая будет использоваться в качестве разделителя при разделении
строки.
Так, например, строку, в которой в качестве разделителя используются запятые,
можно разбить на слова следующим образом:
»> "аЬс, def, ghi". split (', ')
[ 'аЬс', 'def', 'ghi' ]
Если вам, наоборот, надо преобразовать в одну строку список из нескольких строк,
воспользуйтесь функцией join:
>>>а=
['аЬс',
'def', 'ghi']
»> "" .join(a)
'abcdefghi'
Дополнительные сведения
Еще один, более мощный способ манипулирования строками описывается в рецеп
те
7.23.
6.7.
Итеративный обход списка
Задача
Вам нужно выполнить определенный код для каждого элемента списка.
Решение
Воспользуйтесь оператором for языка
»>а= (34, 'Fred', 12, False, 72.3]
»> for х in а:
print (х)
34
Fred
12
False
72.3
»>
Python.
192
Глава
6
Пояснение
Непосредственно после ключевого слова for указывается имя переменной цикла
(в нашем случае х). Этой переменной поочередно присваиваются элементы списка,
указанного после ключевого слова
in.
Следующие далее строки с отступом выполняются по одному разу для каждого
элемента списка. В начале каждой итерации переменной х присваивается значение
элемента с соответствующим индексом. Соответственно, мы можем использовать
эту переменную для вывода значений элементов, как и показано в приведенном
примере.
Дополнительные сведения
При работе со списками также можно использовать генераторы списков
цепт
6.12).
6.8.
Итеративный обход элементов списка
(см.
ре
с одновременным извлечением индекса элементов
Задача
Вам нужно выполнить определенный код для каждого элемента списка, зная на
каждой итерации индекс текущего элемента.
Решение
Используйте оператор for языка
Python
в сочетании с функцией enumerate:
>»а= [34, 'Fred', 12, False, 72.3]
>>> for (i, х) in enumerate(a):
print(i,
х)
(О, 34)
(1, 'Fred')
(2, 12)
(3, False)
14, 72.3)
>»
Пояснение
Такой способ обхода списка часто используется в тех случаях, когда на каждой
итерации нужно знать позицию текущего элемента. Альтернативный подход состо
ит в том, чтобы просто использовать индексную переменную и извлекать значение
текущего элемента с помощью квадратных скобок
[J:
Списки и словари в языке
Python
1
193
>>>а= [34, 'Fred', 12, False, 72.3]
>>> for i in range(len(a)):
print(i, a[i])
(О,
34)
(1, 'Fred')
(2, 12)
(3, False)
(4, 72.3)
»>
Дополнительные сведения
При работе со списками также можно использовать генераторы списков (см. ре
цепт
6.12).
Итеративный обход списка без извлечения индекса элементов рассматривается
в рецепте
6.9.
6. 7.
Проверка наличия в списке
определенного элемента
Задача
Вы хотите выяснить, содержит ли список определенный элемент.
Решение
Используйте ключевое слово in:
>>>
х
= [12, 66, 32, 6, 99]
>» 66 in
х
True
>» 77 in
х
False
»>
Пояснение
Хотя того же результата можно добиться, последовательно сравнивая элементы
списка с искомым значением, использование оператора
in
позволяет сделать код
более простым и читабельным.
Оператор in также можно задействовать при работе со строками.
Дополнительные сведения
Итеративный обход элементов списка также рассматривается в рецепте
6. 7.
Глава б
194
6.1 О.
Сортировка списка
Задача
Вам нужно отсортировать элементы списка.
Решение
Воспользуйтесь функцией sort языка
[ it
sort ()
>>>а=
>»
а.
11
11
11 ,
was't, "the
11 ,
11
best
11 ,
11
of
Python:
11 ,
"times"]
>>> а
['best', 'it', 'of', 'the', 'times', 'was']
Функция sort производит сортировку с использованием стандартных операторов
сравнения языка
Python.
Это значит, что в случае списка, содержащего строки, эле
менты будут отсортированы по алфавиту в возрастающем порядке.
Пояснение
Сортировка списка производится путем модификации исходного списка, а не путем
создания его отсортированной копии. Поэтому, если вам также нужна исходная
версия списка, скопируйте ее перед выполнением сортировки с помощью функции
сору из стандартной библиотеки:
>>> from
>>>а=
сору
[ 11 it 11 ,
import
11 was 11 ,
сору
11
the",
11
best", "of", "tirnes"]
»> Ь = сору (а)
»> b.sort()
>>> а
['it', 'was', 'the', 'best', 'of', 'times']
»>
ь
['best', 'it', 'of', 'the', 'times', 'was']
»>
Для копирования объектов вам потребуется импортировать модуль сору. Более под
робную информацию о модулях содержит рецепт 7.11.
6.11.
Вырезание части списка
Задача
Вам нужно создать подсписок, используя некоторый диапазон элементов исходно
го списка.
Решение
Воспользуйтесь имеющейся в языке
Python
нотацией среза:
[: J.
В качестве примера
далее показано, как можно создать подсписок, содержащий элементы исходного
Списки и словари в языке
списка с индексами
1 и 2 (поскольку индекс, указываемый после
3 не включается в итоговый диапазон):
Python
символа
:,
1
195
являет
ся эксклюзивным, индекс
>>> 1 = ["а",
»> 1[1:3]
[ 'Ь',
"Ь",
"с",
"d"]
'с']
Отсчет позиций здесь начинается с О (а не
рому, а позиция
3-
1), поэтому
позиция
1 соответствует
вто
четвертому элементу списка, однако, поскольку верхняя гра
ница диапазона в нотации среза является эксклюзивной, буква "d" не включается
в итоговый список.
Пояснение
[: J
Нотация
предоставляет вам достаточно мощные возможности. Опуская первый
или второй аргумент, вы можете оставлять без изменений начало или конец списка:
>>> 1 = ["а",
»> 1[:З]
['а',
>»
"Ь",
11
с 11 ,
'd"]
1
'с']
'Ь',
l[З:]
[ 'd']
>»
Также можно использовать отрицательные индексы для отсчета позиций от конца
списка.
Например, далее
показано,
как получить подсписок,
содержащий два
последних элемента исходного списка:
>» l[-2:]
['с',
'd']
Выражение l[:-2] при этом возвратит подсписок, содержащий два первых элемента
исходного списка:
[ 'а' ,
'ь'
J.
Дополнительные сведения
В рецепте
5.17
объясняется, как тот же синтаксис можно использовать в случае
строк.
6.12.
Использование генератора списков
Задача
Вы хотите использовать более элегантный способ создания нового списка путем
фильтрации или преобразования исходного списка.
Решение
Воспользуйтесь генератором списков.
196
Глава б
Хотя генераторы списков не делают ничего такого, чего нельзя бьшо бы сделать
с помощью обычного цикла, они тем не менее позволяют существенно упростить
работу со списками и тем самым сделать код более читабельным.
Генератор списков создает новый список на основе элементов исходного списка
либо путем фильтрации с включением в новый список только тех элементов, кото
рые удовлетворяют некоторому условию, либо путем выполнения манипуляций
над каждым элементом исходного списка.
Сначала давайте посмотрим, как можно отфильтровать в новый список только те
элементы исходного списка, которые начинаются с буквы а, не используя для этого
генератор списков:
new_list = []
people = ['agnes', 'andrew','jane','peter']
for person in people:
if person[O] = 'а':
new_list.append(person)
print(new_list)
Запустив эту программу (см. файл ch_06_filter.py в архиве вспомогательных материа
лов\ вы увидите, что новый список new list будет содержать только те имена,
которые начинаются с буквы а:
$
pythonЗ ch_Oб_filter.py
[ 'agnes', 'andrew']
Применив
генератор
списков,
мы
можем
существенно
сократить
этот
код
(ch_06_filter_comp.py):
people = ['agnes', 'andrew', 'jane','peter')
new_list = [person for person in people if person(O]
print(new_list)
'а')
Программа на основе генератора списков выдает в точности такой же результат,
что и программа ch_06_tilter.py, используя при этом гораздо меньше строк кода. За
ключенный в квадратные скобки генератор списков здесь начинается со слова
person. Это говорит о том, что в копию списка будет добавляться переменная person
(которую нам еще нужно определить). Далее следует выражение for person in
people, которое представляет собой стандартный способ итеративного обхода спи
название его элементов. Завершает
название списка, а person ска, где people определение генератора списков условие i f person [ о J == 'а' . Именно это условие
отбрасывает те элементы исходного списка, которые не начинаются с буквы а.
Условие является опциональным элементом генератора списков, что позволяет ис
пользовать его просто для модификации элементов исходного списка. Так, пред
ставленная далее программа (ch_06_change_comp.py) модифицирует элементы ис-
1
Напомним, что вспомогательные материалы (примеры кода и пр.) доступны для скачивания со страющы
этой книги на сайте ресурса
GitHub
по адресу
https://github.com/simonmonk/raspberrypi_cookbook_ed4.
Списки и словари в языке
Python
1
197
ходного списка таким образом, чтобы все имена в новом списке начинались с за
главной буквы:
people = ['agnes', 'andrew','jane','peter']
new_list = [person.capitalize() for person in people]
print(new_list)
$ pythonЗ ch_Oб_change_comp.py
['Agnes', 'Andrew', 'Jane', 'Peter']
Пояснение
Генераторы списков представляют собой очень мощный и удобный способ мани
пулирования списками. Хотя из-за использования квадратных скобок их синтаксис
поначалу может казаться странным, они позволяют существенно сократить объем
программы, нисколько не затрудняя понимание того, что делает ваш код.
Дополнительные све1ения
В рецепте
6. 7 рассматривается
итеративный обход списка без использования гене
ратора списков.
6.13.
Создание словаря
Задача
Вам нужно создать таблицу подстановки, в которой каждому значению будет соот
ветствовать определенный ключ.
Решение
Используйте словарь языка
Python.
Списки хорошо подходят для тех случаев, когда доступ к элементам производится
последовательно или когда вам всегда известен индекс нужного элемента. Словари
представляют собой альтернативный способ хранения наборов данных
шенно иным принципом размещения данных (рис.
-
с совер
6.1 ).
Словарь хранит пары «ключ-значение» таким образом, чтобы вы могли извлекать
значение с помощью ключа очень эффективно и без необходимости производить
поиск по всему набору данных.
phone_nu mЬers
Кey:Sinюn
Value: 01234 567899
Кey:Jane
Key:Pete
Value: 01234 бббббб
Value: 01234 777555
Кеу:
Value: 01234 887788
Linda
Рис.
6.1.
Словарь языка
Python
Глава б
198
Создать словарь можно с помощью фигурных скобок:
>>>
= {'Simon' :'01234 567899', 'Jane': '01234 666666')
phone_nurnЬers
Пояснение
Хотя обычно в качестве ключей используются строки, как это было сделано в пред
ставленном здесь примере, ключи словаря также могут представлять собой числа
или значения любого другого типа данных.
Значения словаря тоже могут представлять собой значения любого типа данных,
включая списки и словари. Так, далее показано, как можно один словарь (а) ис
пользовать в качестве значения в другом словаре (ь):
>>>а= {'keyl':'valuel', 'key2':2)
>>> а
{'key2': 2, 'keyl': 'valuel')
»> Ь = { 'b_keyl' :а)
»>
ь
{'b_keyl': {'key2': 2, 'keyl': 'valuel'))
Можно заметить, что при отображении содержимого словаря его элементы часто
располагаются
не
в
том
порядке,
в
котором
они
располагались
при определении
словаря и заполнении его исходным содержимым:
>>> phone_nurnЬers = {'Simon': '01234 567899', 'Jane': '01234 666666')
>>> phone_nurnЬers
{ 'Jane' : '01234 666666', 'Simon': '01234 567899')
В отличие от списков, словари не предусматривают какого-либо «правильного»
порядка расположения элементов.
В силу используемого способа внутреннего
представления данных, элементы словаря всегда располагаются в случайном по
рядке.
Это объясняется тем, что словари в языке
Python
реализуются с помощью хеш
таблиц. В хеш-таблицах место размещения каждого значения определяется с по
мощью функции hashing, которая вычисляет для каждого объекта некоторый число
вой эквивалент.
Более подробную информацию о хеш-таблицах можно найти в Википедии2 •
Дополнительные сведения
Словари имеют много общего с форматом данных
посвященрецепт
2
7.20.
См. https://oreil.ly/gUOOI.
JSON,
использованию которого
Списки и словари в языке
6.14. Доступ
Python
1
199
к словарю
Задача
Вам нужно производить поиск и изменение элементов словаря.
Решение
Используйте квадратные скобки
[J,
указывая внутри них ключ нужного вам эле
мента:
>>> phone_nurnЬers; {'Simon': '01234 567899', 'Jane': '01234 666666'}
»> phone _nurnЬers [ 'Simon']
'01234 567899'
»> phone _nurnЬers [ 'Jane']
'01234 666666'
Пояснение
Вы можете искать только значение по ключу, но не наоборот, ключ по значению.
Если в словаре нет указанного ключа, вы получите сообщение KeyError (Ошибка
ключа). Например:
>>> phone_nurnЬers; {'Simon': '01234 567899', 'Jane':'01234 666666'}
>>> phone_nurnЬers['Phil']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
КsyError: 'Phil'
»>
Квадратные скобки
[J
можно использовать не только для чтения содержащихся
в словаре значений, но и для изменения этих значений или добавления новых.
Так, далее показано, как можно добавить в словарь новый элемент с ключом Pete
и значением
01234 777555:
>>> phone_nurnЬers; {'Simon': '01234 567899', 'Jane':'01234 666666'}
>>> phone_nurnЬers['Pete'] ; '01234 777555'
>>> phone_nurnЬers['Pete']
'01234 777555'
Если указанный ключ еще не используется в словаре, в него будет сразу же добав
лен новый элемент. Если указанный ключ уже присутствует в словаре, то соответ
ствующее ему значение будет замещено новым значением.
Дополнительные сведения
О том, как производится обработка ошибок, рассказывается в рецепте
7.1 О.
Глава б
200
6.15. Удаление
элементов словаря
Задача
Вам нужно произвести удаление элементов из словаря.
Решение
Используйте функцию рор, указывая ключ удаляемого элемента:
>>> phone_nшnЬers = {'Simon' :'01234 567899', 'Jane':'01234 666666')
»> phone_nшnЬers .рор ( 'Jane')
'01234 666666'
>>> phone_nшnЬers
{ 'Simon': '01234 567899')
Пояснение
Функция рор возвращает значение удаляемого элемента. Так, при удалении элемен
та с ключом Jane в представленном здесь примере функция рор возвращает значение
этого элемента на тот случай, если вы хотите его каким-то образом использовать.
6.16.
Итеративный обход словаря
Задача
Вам нужно выполнить определенные действия над каждым элементом словаря.
Решение
Используйте оператор for для итеративного перебора ключей словаря:
>» phone_nшnЬers = {'Simon':'01234 567899', 'Jane':'01234 666666')
>>> for name in phone_nшnЬers:
print (name)
Jane
Simon
Можно заметить, что ключи при этом выводятся не в том же порядке, в каком они
были созданы. Так уж устроены словари
-
они никогда не запоминают порядок
расположения элементов.
Пояснение
Существует и ряд других способов итеративного обхода словаря. Так, если вам ну
жен доступ и к ключам, и к значениям словаря, можно использовать следующий
способ:
Списки и словари в языке
Python
201
>>> phone_nurnЬers = {'Simon': '01234 567899', 'Jane':'01234 666666'}
>>> for name, num in phone_nurnЬers.items():
print (name + " " + num)
Jane 01234 666666
Simon 01234 567899
Дополнительные сведения
Использование оператора for для других целей рассматривается также в рецеп
тах
5.23
и
6. 7.
ГЛАВА
7
Продвинутые возможности
языка
7.0.
Python
Введение
В этой главе мы познакомимся с рядом более продвинутых возможностей языка
Python,
включая, в частности, чтение и запись данных в файлы, обработку исклю
чений, использование модулей и основы веб-программирования.
Хотя мы уже сталкивались с такими элементами объектно-ориентированного под
хода, как классы и методы, в этой главе мы рассмотрим их более подробно и разбе
ремся с тем, как все это работает.
7.1. Форматирование чисел
Задача
Вам нужно форматировать числа таким образом, чтобы они отображались с опре
деленным количеством знаков после запятой.
Решение
Форматируйте числа с помощью функции format. Например:
>>> х = 1.2345678
>» "х={: .2f) ". format
'x=l.23'
(х)
>>>
Поскольку здесь мы работаем в интерактивном режиме, возвращаемая методом
format строка просто выводится в окне терминала. Однако в случае применения
этого метода в программе его результат обычно каким-то образом используется
-
например, выводится на экран с помощью функции print:
х = 1.2345678
print ("х={: .2f)". format
(х))
Пояснение
Строка форматирования функции format может содержать обычный текст и метки
формата, которые заключаются в фигурные скобки
{J.
Передаваемые в качестве
Продвинуть,е возможности языка
Python
1
203
параметров значения (количество которых может быть любым) подставляются
вместо меток формата в соответствии с указанными спецификаторами формата.
В представленном ранее примере используется спецификатор формата
: .2f,
кото
рый говорит о том, что значение должно выводиться как число с плавающей запя
той (отсюда f,
float)
с двумя разрядами после запятой.
Чтобы общая длина числа всегда составляла, например,
7 разрядов ( с
дополнением
при необходимости пробелами), можно добавить перед десятичной точкой еще
ОДНО ЧИСЛО:
»> "x={:7.2f)".format(x)
'х=
1. 23'
»>
Поскольку в нашем случае длина числа составляет только
десятичная точка), перед цифрой
1
выводятся
3
4
разряда
(3
разряда
+
дополнительных пробела. Чтобы
в качестве дополнительных символов использовались нули, а не пробелы, можно
изменить спецификатор формата следующим образом:
»> "x={:07.2f)".forrnat(x)
'x=000l.23'
»>
Теперь давайте рассмотрим пример посложнее. Вот как можно вывести значение
температуры и в градусах Цельсия, и в градусах Фаренгейта:
>»
»>
с =
20.5
{:5.2f) deg С, {:5.2f} deg F.".format(c,
20.50 deg С, 68.90 deg F.'
"Teпrperature
'Teпrperature
с*
9 / 5 + 32)
>»
Метод forrnat также можно использовать для представления чисел в шестнадцате
ричном или двоичном формате. Например:
»> " { :Х) ". forrnat (42)
'2А'
>» " { :Ь}". forrnat (42)
'101010'
Начиная с версии
3.6,
в языке
строк и других объектов
зволяют
вам
размещать
-
Python
появился новый способ форматирования
использование так называемыхfстрок. F-строки по
внутри
строки
подлежащие
вычислению
фрагменты
Python-кoдa (или просто имена переменных). Например:
>» teпrp = 20. 4
>>> humidity = 80
>» F"Teпrperature
'Teпrperature С:
Humidity: (humidity}"
20.4 Humidity: 80'
С:
(teпrp)
>»
Перед открывающим символом кавычек в f-строке ставится буква F, а все, что за
ключается в фигурные скобки
( },
интерпретируется как подлежащий вычислению
204
Глава
7
Python-кoд. Так, например, вывести значение температуры в градусах Фаренгейта
можно следующим образом:
»> temp = 20.4
>>> humidity = 80
»> F"Temperature F: {temp * 9 / 5 + 32) Humidity:
{hшnidity)"
'Temperature F: 68.72 Humidity: 80'
>»
В большинстве случаев синтаксис f-строки является более читабельным по сравне
нию синтаксисом метода foпnat.
Дополнительные сведения
Форматирование в языке
Python
предполагает использование специального языка
форматирования 1 .
Более подробную информацию об использовании f-строк можно найти на странице
Python's F-String for String Interpolation and Formatting2 •
7.2. Форматирование значений даты
и времени
Задача
Вам нужно представлять значения даты и времени в виде строки определенного
формата.
Решение
Форматируйте объекты даты и времени с помощью функции foпnat. Например:
»> from datetime import datetime
»> d = datetime. now {)
»> "{:%Y-%m-%d %H:%M:%S)".foпnat(d)
'2021-12-09 16:00:45'
»>
Поскольку здесь мы работаем в интерактивном режиме, возвращаемая методом
foпnat строка просто выводится в окне терминала. Однако в случае применения это
го метода в программе его результат обычно каким-то образом используется
пример, выводится на экран с помощью функции print:
from datetime import datetime
d = datetime. now {)
print (" {: %Y-%m-%d %Н: %М: %S)". format (d))
1
См. https://oreil.Iy/988vF.
2
См. https://realpython.com/python-f-stгings.
-
на
Продвинутые возможности языка
Python
1
205
Пояснение
Используемый в языке
Python
язык форматирования предусматривает ряд специ
альных символов для форматирования значений даты и времени, включая, в част
ности, спецсимволы %у (год без века в виде дополняемого нулями десятичного чис
ла), %m (месяц) и %d (день).
Могут оказаться полезными и такие спецсимволы, как %В (полное название месяца)
и %У (год в четырехзначном формате):
>» "{:%d %В %Y}".format(d)
'09 DecemЬer 2021'
При форматировании значений даты и времени также можно использовать упомя
нутый в рецепте
7.1
синтаксис f-строки:
>>> from dateti.me :iJDport datetime
»> d = datetime. now (}
»> F"{d:%B %d, %У}"
'August 19, 2022'
>»
Дополнительные сведения
Форматированию чисел также посвящен рецепт
7.1.
Краткое описание всех способов форматирования даты и времени, доступных при
использовании функции strftime языка
Python,
представлено в соответствующей
шпаргалке 3 .
7.3.
Возвращение нескольких значений
Задача
Вам нужно создать функцию, возвращающую несколько значений.
Решение
При определении функции укажите в качестве возвращаемого значения кортеж,
и используйте синтаксис множественного присваивания значений переменным.
Кортеж
-
это тип структур данных, который представляет собой что-то вроде спи
ска, но, в отличие от последнего, заключается не в квадратные, а в круглые скобки.
Кортежи также обладают фиксированным размером.
Допустим, например, что вам нужно создать функцию, преобразующую значение
температуры в градусах Кельвина в значения температуры в градусах Цельсия и
3 См.
http://strftime.org.
206
1
Глава
7
Фаренгейта. Чтобы заставить эту функцию возвращать сразу два значения темпера
туры, следует указать эти возвращаемые значения через запятую:
>>> def calculate_temperatures(kelvin):
celsius = kelvin - 273
fahrenheit = celsius * 9 / 5 + 32
retum (celsius, fahrenheit)
>>> (с, f) = calculate_temperatures(340)
»>
»> print (с)
67
»> print (f)
152.6
При вызове такой функции надо просто записать перед знаком = нужное количество
переменных, и каждое возвращаемое значение будет присвоено переменной, рас
положенной в соответствующей позиции.
Пояснение
Этот способ возвращения нескольких значений хорошо подходит для тех случаев,
когда из функции нужно возвращать не так много значений. Однако если необхо
димо возвращать много сложных данных, более элегантное решение может состо
ять в том, чтобы воспользоваться объектно-ориентированными возможностями
языка
Python
и определить для возвращаемых данных специальный класс. В таком
случае вместо кортежа можно будет возвращать экземпляр этого класса.
Дополнительные сведения
О том, как можно определить класс, рассказывается в рецепте
7.4. Определение
7.4.
класса
Задача
Вам нужно сгруппировать взаимосвязанные данные и функции в одном классе.
Решение
Концепция
классов является одним
ванного подхода. Классы в языке
из главных
Python
понятий объектно-ориентиро
напоминают модули в том плане, что объ
единяют в себе некоторый набор функций (и, надо сказать, многие модули в этом
языке фактически представляют собой классы). Однако класс формализует такую
структуру, предписывая использование определенного способа создания экземпля
ров класса и включение в класс всех относящихся к нему методов и переменных.
Классы также можно связать друг с другом системой иерархических отношений,
Продвинутые возможности языка
Python
1
207
где более конкретизированные классы будут наследовать методы от более универ
сальных классов, что позволяет избежать многократного повторения одного и того
же кода в различных частях программы.
Определите класс, снабдив его нужными вам переменными-членами.
В качестве примера далее приведено определение класса, представляющего от
дельную запись адресной книги:
class Person:
'''Этот класс представляет объект отдельного человека'''
def
init (self, name, tel):
self .name = name
self.tel = tel
В начале определения класса обычно записывается заключенная в тройные кавыч
ки строка документации, где описывается назначение класса. Хотя эта строка не
является обязательной, лучше все же ее добавить, чтобы другие программисты
могли понять, для чего предназначен класс. Это будет совсем не лишним, если вы
собираетесь сделать класс общедоступным.
Строки документации не являются активными строками кода, как и обычные ком
ментарии, но, в отличие от последних, привязываются к классу. Это позволяет
в любой момент прочитать строку документации класса с помощью следующей
команды (где с обеих сторон от слова
doc необходимо ставить по два символа под
черкивания):
Person.
doc
За строкой документации в определении класса следует метод-конструктор, кото
рый автоматически вызывается при создании каждого нового экземпляра класса.
Класс представляет собой своего рода шаблон, и, определяя класс Person, мы еще не
создаем реальных объектов
def
Person, откладывая это на потом:
init (self, name, tel):
self. name • name
self.tel • tel
Методу-конструктору всегда присваивается имя _init_ (где с обеих сторон от сло
ва init необходимо ставить по два символа подчеркивания), как это было сделано
в приведенном примере.
Пояснение
Одно из отличий языка
Python
от большинства других объектно-ориентированных
языков состоит в том, что в этом языке всем методам класса необходимо переда
вать в качестве параметра специальную переменную self. Представляя собой ссыл
ку на вновь создаваемый экземпляр класса, переменная
что и специальная переменная
вания.
this в
Java
self
выполняет ту же роль,
и некоторых других языках программиро
Глава
208
7
В рассматриваемом случае метод-конструктор присваивает значения переданных
ему
параметров переменным-членам.
Переменные-члены
могут не
объявляться
заранее, но всегда должны снабжаться префиксом self.
Таким образом, строка:
self. name = name
создает переменную
name,
доступную всем членам класса
Person,
и инициализирует
ее значением, указанным в вызове конструктора класса, который выполняется сле
дующим образом:
р
= Person("Simon", "1234567")
Создав таким образом новый экземпляр класса Person с именем р, мы можем убе
диться в том, что его переменная
name
содержит имя
Simon:
>>> p.name
Simon
В сложных программах рекомендуется размещать каждый класс в отдельном файле
с присвоением этому файлу имени, совпадающего с именем класса. Это также по
зволяет легко превратить тот или иной класс в модуль (см. рецепт
7.11).
Дополнительные сведения
Обратите также внимание на рецепт
7.5. Определение
7.5,
посвященный определению методов.
метода
Задача
Вам нужно добавить в класс немного кода.
Решение
Функции, привязанные к конкретному классу, называются методами.
Как можно добавить метод в определение класса, показано в следующем примере:
class Person:
'''Этот класс представляет объект пользователя'''
def
init (self, first_name, surname, tel):
self.first- name = first - name
self.surname = surname
self.tel = tel
def full_name(self):
return self. first name + " " + self. surname
Продвинутые возможности языка
Python
209
Метод ful l _narne объединяет атрибуты с именем и фамилией человека, ставя между
ними пробел, что дает в результате строку следующего вида:
Simon Monk
Пояснение
Можно считать, что метод
-
это функция, которая привязана к конкретному клас
су, и может использовать (или не использовать) переменные-члены этого класса
при выполнении своих вычислений. Поэтому, как и в случае обычной функции,
вы можете помещать внутри метода любой нужный вам код и при необходимости
вызывать из одного метода другой.
Дополнительные сведения
Обратите также внимание на рецепт
7.6.
7. 4,
посвященный определению классов.
Наследование
Задача
Вам понадобилась специализированная версия имеющегося у вас класса.
Решение
Используя механизм наследования, создайте подкласс имеющегося класса и до
бавьте в него новые переменные-члены и методы.
По умолчанию все создаваемые вами новые классы являются подклассами класса
object. При желании это можно изменить, указав тот класс, который вы хотите ис
пользовать в качестве суперкласса, в круглых скобках после имени класса в опре
делении класса. Так, далее показано, как можно определить новый класс (Employee)
как подкласс другого класса (Person), с добавлением в него новой переменной-члена
( salary) и дополнительного метода ( gi ve_ raise ):
class Employee (Person) :
def
init (self, first_narne, surname, tel, salary):
super(). init (first_name, surnarne, tel)
self.salary = salary
def give_raise(self, amount):
self.salary = self.salary + amount
Этот пример будет работать только в
Python 3.
зано здесь, воспользоваться функцией super, дующее:
В
Python 2
вы не можете, как пока
вместо этого следует записать сле
210
1
Глава
7
class Employee(Person):
def
init_(self, first_name, surname, tel, salary):
Person._init_(self, first_name, surname, tel)
self.salary = salary
def give_raise(self, amount):
self.salary = self.salary + amount
Пояснение
В обоих этих примерах метод-инициализатор подкласса сначала вызывает метод
инициализатор родительского класса (суперкласса), а затем производит инициали
зацию дополнительной переменной-члена. Это позволяет обойтись без повторного
использования того же кода инициализации в новом подклассе.
Дополнительные сведения
Обратите также внимание на рецепт
В языке
Python
7. 4,
посвященный определению классов.
вам предоставляются мощные возможности наследования, вклю
чающие в том числе возможность множественного наследования, при котором
подкласс наследует сразу от нескольких суперклассов. Подробную информацию
о множественном наследовании можно найти в официальной документации по
языку
Python4.
7.7. Запись данных в файл
Задача
Вам нужно записать определенные данные в файл.
Решение
Откройте файл, запишите в него данные и закройте файл, используя соответствен
но функции open, write И сlозе:
>» f = open('test.txt', 'w')
»> f .write ( 'This file iз not empty')
»> f. сlозе ()
Пояснение
Хотя в приведенном здесь примере используется текстовый файл с расширением
txt,
4
так можно производить запись в файл с любым расширением.
См. https://orell,ly/BCjqx.
Продвинутые возможности языка
Python
1
211
Открыв файл, вы можете выполнить любое нужное вам количество операций запи
си до его закрытия. Всегда закрывайте файл с помощью функции close -
несмотря
на то, что каждая операция записи обычно немедленно модифицирует файл, при
незакрытом файле записываемые данные могут быть потеряны из-за использования
механизма буферизации. Кроме того, не закрыв файл, вы можете сделать его недос
тупным для других программ.
Функция open принимает два параметра. В качестве первого параметра передается
путь к тому файлу, в который вы хотите записать данные. Это может быть относи
тельный путь из текущего рабочего каталога или абсолютный путь, начинающийся
с символа косой черты
(/).
С помощью второго (опционального) параметра можно указать, в каком режиме
необходимо открыть файл. В отсутствие этого параметра используется режим чте
ния
r. Чтобы перезаписать существующий файл или создать новый файл, если
-
файла с указанным именем не существует, следует использовать режим записи - w.
Полный список возможных режимов представлен в табл. 7 .1. Эти режимы также
можно комбинировать друг с другом, используя знак
+.
Так, например, одновре
менно активировать режим чтения и двоичный режим можно следующим образом:
»> f
open ( 'test. txt', 'r+b')
=
Таблице
Режим
7.1.
Режимы доступа к файлу
Описание
r
Чтение
w
Запись
а
Добавление в конец существующего файла без его перезаписи
ь
Двоичный режим
t
Текстовый режим (используется по умолчанию)
+
Сокращенное обозначение комбинации
r+w
Двоичный режим позволяет считывать или записывать данные не в текстовом виде,
а в виде двоичных потоков данных, как в случае изображений.
Дополнительнь1е сведения
Обратите также внимание на рецепт
7. 8,
посвященный чтению данных из файла.
Обработка ошибок рассматривается в рецепте
7.1 О.
7.8. Чтение данных из файла
Задача
Вам нужно считать содержимое файла в строковую переменную.
212
Глава
1
7
Решение
Для чтения содержимого файла следует использовать файловые методы open, read
и close. Так, например, считать все содержимое файла и присвоить его переменной s
можно следующим образом:
f = open ( 'test. txt')
s = f. read ()
f. close ()
Пояснение
Содержимое текстовых файлов также можно считывать построчно,
метод
используя
readline.
В том случае, если файл с указанным именем не существует или не может быть
считан по какой-то иной причине, представленный в решении код выбросит ис
ключение. Это можно исправить, вложив этот код в конструкцию try/except:
try:
f ~ open( 'test. txt')
s = f.read()
f .close ()
except IOError:
print ("Cannot open the file")
Дополнительные сведения
Описание процесса записи данных в файл и список возможных режимов доступа
к файлу приведены в рецепте
те
7. 7.
Обработка ошибок рассматривается в рецеп
7. 10.
Обратите также внимание на рецепт
сического анализа данных в формате
7.9.
7.20, в
JSON.
Использование модуля
котором описывается процесс синтак
pickle
для выгрузки и загрузки данных из файла
Задача
Вы хотите сохранить все содержимое структуры данных в файл, чтобы его можно
было прочитать при следующем запуске r1рограммы.
Решение
Воспользуйтесь имеющимся в языке
Python
модулем pick1e с тем, чтобы выгрузить
структуру данных в файл в формате, позволяющем впоследствии автоматически
загрузить эти данные в память в виде такой же структуры данных.
Продвинутые возможности языка
Python
213
Выгрузить сложный список в файл с именем mylist.pickle можно так:
>>>
>>>
»>
>>>
»>
import pickle
mylist = [ 'some text', 123, [ 4, S, True]]
f = open('mylist.pickle', 'wb')
pickle.dump(mylist, f)
f.close()
Снова загрузить содержимое этого файла в новый список можно следующим обра
зом:
>»
>>>
»>
»>
f = open('mylist.pickle', 'rb')
other_array = pickle.load(f)
f.close()
other_array
[ 'some text', 123, [ 4, 5, True]]
Пояснение
Сериализации с помощью модуля pickle можно подвергнуть практически любую
структуру данных,
-
совсем необязательно использовать список, как было сделано
в приведенном здесь примере. Абсолютно любым может быть и расширение того
файла, в который вы выгружаете данные. Хотя наиболее уместным здесь выглядит
расширение
pickle,
с тем же успехом можно использовать и расширение
txt
или
pic.
Файл сохраняется в нечитаемом человеком двоичном формате и должен откры
ваться для чтения и записи соответственно в режимах rb (чтение двоичных данных)
и wb (запись двоичных данных).
Дополнительные сведения
Описание процесса записи данных в файл и список возможных режимов доступа
к файлу приведены в рецепте
7. 7.
Альтернативой сериализации с помощью модуля pickle является сохранение объек
тов в файлах в формате
7.10. Обработка
JSON,
как описывается в рецепте
7.21.
исключений
Задача
Вы хотите в случае некорректной работы программы перехватывать ошибку или
исключение и отображать дружественное для пользователя сообщение об ошибке.
Решение
Используйте конструкцию try/except языка
Python.
Например, следующий код из рецепта
перехватывает все ошибки, которые воз
никают при открытии файла:
7.8
Глава
214
7
try:
f = open('test.txt')
s = f .read ()
f. close ( 1
except IOError:
print ("Cannot open the file")
Поскольку чреватые ошибками команды открытия и чтения файла вложены здесь
в конструкцию try/except, все возникающие ошибки перехватываются до отображе
ния ими сообщения об ошибке, что позволяет обрабатывать их по своему усмотре
нию. В показанном случае мы выводим дружественное для пользователя сообще
ние об ошибке cannot open the file (Не удалось открыть файл).
Пояснение
Помимо операций доступа к файлам, распространенным источником исключений
времени выполнения
также являются
попытки доступа к элементам списка с
ис
пользованием индекса, выходящего за его пределы. Например, вы получите исклю
чение, если попытаетесь обратиться к пятому элементу (с индексом
4)
в списке из
трех элементов:
>>> list = [1, 2, 3]
»> list [ 4]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
Различные виды ошибок и исключений организованы в виде иерархической систе
мы, и при перехвате исключений вы можете по своему усмотрению выбирать или
более специализированные, или более обобщенные классы.
Почти
в
самом
верху этой
иерархии
находится
наиболее обобщенный класс
Exception, который позволяет перехватывать практически любые исключения. Вы
также можете создать отдельные блоки except для нескольких типов исключений
с тем, чтобы обрабатывать их по-разному. Если вы не укажете конкретный класс
исключений в инструкции except, она будет перехватывать все исключения.
Язык
ции
Python
else
И
также позволяет использовать в коде обработки исключений инструк
finally:
list = [1, 2, 3]
try:
list[BJ
except:
print("out of range")
else:
print("in range")
finally:
print ("always do this")
Продвинутые возможности языка
Python
1
215
Инструкция else выполняется в том случае, если в блоке try не выбрасывается
исключение, а инструкция finally -
вне зависимости от того, выбрасывается ис
ключение или нет.
При возникновении исключения вы можете получить подробную информацию
о нем, используя объект Exception, который можно сделать доступным путем сохра
нения в переменной с помощью ключевого слова as:
>>> list = [1, 2, 3]
»> try:
list[8]
except Exception as е:
print ("out of range")
print (е)
out of range
list index out of range
>»
Такой подход позволяет использовать собственный способ обработки ошибок, в то
же время не упуская из виду исходное сообщение об ошибке.
Дополнительные сведения
Описание используемой в языке
Python иерархии классов
исключений можно найти
в официальной документации по этому языку5.
7.11.
Использование модулей
Задача
Вы хотите использовать в своей программе модули языка
Python.
Решение
Воспользуйтесь оператором irrport:
import random
Пояснение
В языке
Python
можно использовать большое количество модулей (или, как их еще
называют, библиотек). Многие из них включены в состав стандартной библиотеки
языка
Python,
в то время как другие можно скачать и установить дополнительно.
Стандартная библиотека языка
5 См.
https://oreil.lyfГQidm.
Python
включает в себя модули для генерирования
216
Глава
7
случайных чисел, работы с базами данных, использования различных сетевых про
токолов, сериализации объектов и т. д.
Одним из следствий наличия столь большого количества модулей является то, что
они могут конфликтовать друг с другом
например, два разных модуля могут
-
содержать функцию с одинаковым именем. Во избежание таких конфликтов при
импорте модуля всегда указывайте, какую его часть необходимо сделать доступ
ной.
Так, при выполнении команды импорта следующего вида:
import random
вероятность конфликта будет исключена, потому что для доступа к функциям или
переменным импортируемого модуля всегда придется использовать префикс random
(например: random. randint). Кстати, именно о модуле raпdom пойдет речь в следующем
рецепте.
Если же команда импорта будет выглядеть так:
from random import *
то все функции и переменные импортируемого модуля можно будет использовать,
не добавляя перед их именем никакого префикса. Такой подход существенно по
вышает вероятность конфликта между используемыми модулями, если вы не знаете
точно, какие функции содержатся в каждом из них:
Комilромисс между этими двумя крайностями заключается в явном указании необ
ходимых в программе компонентов модуля,
-
тогда их можно будет использовать
без префикса.
Например:
>>> from random import randint
>>> print(randint(l,6))
2
>»
Еще один возможный подход состоит в том, чтобы, используя ключевое слово as,
снабдить модуль более удобным или более информативным псевдонимом:
>» import random as R
»> P.randint (1, 6)
Дополнительные сведения
Точный перечень стандартных модулей языка
по стандартной библиотеке этого языка6 .
6
См. https://oгeil.ly/N6iF9.
Python
приводится в документации
Продвинутые возможности языка
7.12.
Python
217
Генерирование случайных чисел
Задача
Вам нужно сгенерировать случайное число в определенном диапазоне.
Решение
Используйте библиотеку raпdom:
>»
import random
>>>
random.rзndint(l,
6)
random.randiпt(l,
6)
2
>>>
6
>>> random.randint(l, 6)
5
Сгенерированное число будет находиться в диапазоне между указанными двумя
аргументами (с включением их в диапазон)
-
т. е. здесь мы имитируем процедуру
выбрасывания кубика.
Пояснение
Генерируемые таким образом числа не являются действительно случайными. Они
представляют собой элементы так называемой псевдослучайиой числовой последо
вательности
достаточно большой последовательности чисел, элементы которой
-
распределены статистически равномерным образом. Такой подход вполне уместен,
скажем, при разработке игр, но если вам нужно получить действительно случайные
числа, как, например, для розыгрыша лотереи, вероятно, лучше всего использовать
специальную
рандомизирующую
аппаратуру.
Компьютеры
откровенно
плохо
справляются с генерированием случайных чисел, потому что просто не предназна
чены для решения этой задачи.
Случайные числа часто используются для случайного выбора элементов некоторо
го списка. Хотя это можно делать путем генерирования случайного числа и исполь
зования его в качестве индекса при обращении к списку, для этой цели в модуле
random также предусмотрена специальная функция. Попробуйте, например, выполнить следующий код:
» > import random
>» random. choice ( ['а',
·ь·,
'с'))
1 [) 1 f
'с'))
»> random. choice ( ['а', 'Ь''
'с'])
'а'
»> random. choice ( ['а',
'Ь'
'а'
При выполнении подобных операций случайного выбора часто требуется исклю
чить вероятность многократного выбора одного и того же варианта. То есть, если
218
Глава
1
7
случайный выбор уже давал в результате вариант 'а', этот вариант не должен вы
бираться снова.
Добиться этого, в частности, можно путем создания копии списка и удаления из нее
всех выбираемых элементов с тем, чтобы их уже нельзя было выбрать опять. Вот,
например, как это реализовано в следующей небольшой программе из архива вспо
могательных материалов (ch_07_random.py), которую вы при желании можете ска
чать в порядке, описанном в рецепте
import random
from сору import
list ;
['а',
'Ь',
3.22:
сору
'с']
working_list; copy(list)
while len(working_list) > О
х; random.choice(working_list)
print (х)
working_list.remove(x)
Эта программа выводит на экран все элементы списка, выбирая их в случайном по
рядке и только по одному разу:
$
ch_07_random.py
pythonЗ
ь
с
а
Порядок элементов при этом, как правило, является разным при каждом запуске
программы.
Дополнительные сведения
Более подробную информацию о модуле
стандартной библиотеке языка
7.13.
random можно найти в документации по
Python7 .
Выполнение сетевых запросов из Python-кoдa
Задача
Вам нужно реализовать в Python-кoдe считывание содержимого веб-страницы
в строку.
Решение
В языке
Python
имеется обширная библиотека для работы с НТТР-запросами, кото
рая называется urllib
7 См.
(URL Library,
https://oгeil.ly/МAJOm.
URL-библиотека).
Продвинутые возможности языка
В качестве примера далее показано, как в
Python 3 можно
Google:
Python
1
219
считать в строку contents
содержимое домашней страницы сайта компании
illport urlliЬ.request
contents; urllib.request.urlopen("https://www.google.com/") .read()
print(contents)
Пояснение
В считанном НТМL-коде страницы обычно требуется найти некоторый нужный
вам текст. Это можно сделать, воспользовавшись функциями для работы со стро
ками, как показано в рецептах
5.16 и 5.17.
Дополнительные сведения
Примеры использования сетевых возможностей языка
в главе
Python
также приводятся
17.
Если сетевой запрос возвращает данные в формате
синтаксическому анализу, как описано в рецепте
7.14. Указание аргументов
в языке Python
JSON,
7.20.
их можно подвергнуть
командной строки
Задача
Вам нужно запустить Python-nporpaммy из командной строки и передать ей некие
параметры, т. е. снабдить запускаемую Python-nporpaммy рядом дополнительных
параметров, которые она будет использовать в ходе своей работы. Например:
$
pythonЗ
ch_07_cmdline.py
а Ь с
Решение
Воспользуйтесь переменной
argv из модуля sys, как показано в приведенном далее
примере. Эта переменная возвращает список, первым элементом которого является
имя программы. Остальные элементы представляют собой те параметры, которые
были введены через пробел в командной строке после имени программы.
При желании вы можете скачать эту программу (ch_07_cmdline.py) в порядке, опи
санном в рецепте
3.22:
illlport sys
for (i, value) in enumerate(sys.argv):
print(F"arg: {i) {value)")
Если вы запустите эту программу из командной строки, указав после ее имени
определенные параметры, на экран будет выведено следующее:
220
$
1
Глава
pythonЗ
7
ch_07_cmdline.py
а Ь с
arg: О cmd_line.py
arg: 1 а
arg: 2 Ь
arg: 3 с
Пояснение
Возможность указания аргументов командной строки может быть полезной как при
автоматическом запуске Руthоn-программ, так и в случаях их запуска на этапе на
чальной загрузки (см. рецепт
3.23)
и в заданный момент времени (см. рецепт
3.25).
Дополнительные сведения
Базовые сведения о запуске Руthоn-программ из командной строки приведены
в рецепте
обхода
5. 6.
Содержимое переменной argv выводится здесь путем итеративного
элементов
(см. рецепт
списка
с
одновременным
извлечением
индекса
элементов
6.8).
В документации по языку
Python 8 также
описывается еще один, более продвинутый
способ использования аргументов командной строки.
7.15. Запуск команд Linux
из Python-кoдa
Задача
Вам нужно запустить из Руthоn-программы команду или программу операционной
системы
Linux.
Решение
Воспользуйтесь функцией system.
Например, для удаления файла myfile.txt, расположенного в том же каталоге, где на
ходится запущенная вами Руthоn-программа, можно использовать следующий код:
import os
os.system("rm myfile. txt")
Пояснение
Иногда вместо того чтобы просто выполнить команду
Linux,
как это было сделано
в приведенном примере, требуется перехватить возвращаемый командой ответ. До
пустим, например, что вам нужно узнать IР-адрес (см. рецепт
8
См. https://oгeil.ly/flNSo.
2.2)
устройства
Продвинутые возможности языка
Raspberry Pi
Python
1
221
с помощью команды hostnarne. В таком случае можно воспользоваться
функцией check output из библиотеки suЬprocess:
iпport suЬprocess
ip =
suЬprocess.check_output(['hostname',
'-I'])
После выполнения этого кода переменная ip будет содержать IР-адрес устройства
Raspberry Pi. В отличие от функции system, функция check_output
Linux и ее параметры в виде отдельных элементов списка.
принимает команду
Дополнительные сведения
С документацией по модулю os можно ознакомиться по адресу
https://oreil.ly/
1LL8G.
Более подробная информация о модуле suЬprocess представлена по адресу
https://
oreil.ly/НVВq-.
В рецепте
15. 7 приведен
пример использования модуля suЬprocess для отображения
IР-адреса и имени хоста устройства
Raspberry Pi
с использованием дисплея на
основе технологии «электронной бумаги».
7.16. Отправка электронных
писем из Python-кoдa
Задача
Вам нужно отправить из Руthоn-проrраммы электронное письмо.
Решение
Для отправки электронных писем можно использовать имеющийся в языке
модуль для работы с протоколом
SMTP (Simple Mail Transfer Protocol,
Python
простой про
токол передачи почты).
• •
Пароли в коде
Старайтесь очень осмотрительно использовать в коде имена пользователей и па
,
роли, особенно если речь идет о проекте, код которого загружается в Интернет.
'-
В ходе работы можно легко забыть о наличии в коде пароля и загрузить его на
такой сайт, как
GitHub.
В этом рецепте мы рассмотрим пример работы с почтовым сервисом
нии
Goog\e.
Для более безопасного доступа к сервисам
Google,
Gmail
компа
вместо обычного
пароля можно использовать более длинный случайно сгенерированный пароль при
ложения. Для создания такого пароля войдите в браузере в аккаунт
Google с по
https://myaccount.google.com/, вы
Security (Безопасность) и в разделе
мощью обычного пароля, перейдите по адресу
берите в расположенном слева меню пункт
Signing in to Google (Вход в Google) открывшейся страницы выберите пункт Арр
Passwords (Пароли приложений) (рис. 7 .1 ). Чтобы этот вариант стал доступен, для
аккаунта Google должна быть активирована двух-этапная аутентификация.
Глава
222
7
f- Арр
passwords
passwords let you slgn ln to your Google Account from apps on devlces lhat don't support 2-Step
Verlflcatlon. You'II only need to enter lt once so you don't need to rememЬer lt. Leam more
.Арр
You don't have any арр pasaworda.
Saltct tha
ерр
end davlca for whlch you want to ~rata tha арр p1uword.
Raspberry PI Python
Х
i!iiifi
Рис.
7.1.
Настройка пароля приложения для сервиса
Google
email (Почта).
Other (Другое)
Raspberry Pi Python),
В выпадающем списке для выбора приложения выберите вариант
В выпадающем списке для выбора устройства выберите вариант
и укажите имя своего устройства
Raspberry Pi
(например,
чтобы вы могли потом вспомнить назначение пароля приложения . Нажмите затем
на кнопку
рован
Generate
(рис . 7.2).
(Создать), и пароль приложения будет автоматически сгенери
Скопируйте этот пароль в буфер обмена и вставьте в соответствующем месте про
граммы ch_07 _gmail .py, код которой приведен далее (при желании вы можете ска
чать-этот пример кода в порядке, описанном в рецепте 3. 22):
import
smtpliЬ
GМAIL_USER
= 'your email address'
GМAIL_PASS
=
SМТP_SERVER
SМТР
'your password'
= 'smtp.gmail .com'
PORT = 587
def send_email(recipient, suЬject, text ):
smtpserver = smtplib.SMTP(SМТP_SERVER,
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo
smtpserver.login(GМAIL_USER,
SМТР
PORT )
GМAIL_PASS)
header = 'Т о: ' + recipient + ' \n ' + 'From: ' + GМAIL USER
header = header + ' \n ' + 'SuЬject:' + suЬject + ' \ n'
msg = header + ' \ n' + text + ' \ n\ n'
smtpserver.sendmail(GМAIL_USER, recipient, msg)
smtpserver.close()
send_email ( 'destination email address',
'suЬject',
'message')
Продвинутые возможности языка
+-
Python
223
Арр passwords
Арр , , _ _ . let JOU
llgn ln to you, Google Account from apps on devices tha t don t support 2 Step
v.tflc:8tiof" You'I only need to ent lt once 10 ,ou don't need to rememЬer it Leam more
--
.........
Generated
арр
password
Your а рр pasaword for your devlce
~ zym
Howto use lt
-
•••••••••••
j
Go to the settings fOf your Google Account in
the applicatlon or devlce you are trying to set
up. Replace your password with the 16character password shown above.
Just like your normal password, this арр
password grents complete access to your
Google Account. You won't need 10 remember
11. so don't write lt down or share lt with
anyone.
DONE
Рис.
7.2.
Создание пароля приложения для сервиса
Google
Чтобы эту программу можно было использовать для отправки электронного письма
по нужному вам адресу, надо сначала присвоить переменным GМAIL_USER и GМAIL_PASS
соответственно имя пользователя и пароль для входа в почтовый аккаунт. Если вы
используете сервис
Gmail,
введите сюда только что созданный вами пароль прило
жения.
Если вы пользуетесь каким-либо другим почтовым сервисом, то, помимо учетных
данных, потребуется соответствующим образом изменить значение переменной
SМ'ГР- SERVER и, возможно, переменной SMTP_ PORT.
Также надо будет указать нужные вам данные в последней строке программы
-
вместо строк destination email address (адрес получателя), suЬject (тема) и message (со
общение).
Пояснение
Метод send_email сводит использование модуля smtplib к простому вызову одной
функции, которую вы можете многократно задействовать в любом из своих проек
тов.
224
1
Глава
7
Возможность отправки электронных писем из Python-кoдa делает возможным при
менение широкого спектра проектных решений. Например, вы можете отправлять
электронные письма при срабатывании инфракрасного датчика движения.
Дополнительные сведения
Обратите также внимание на рецепт
17.4,
в котором приведен еще один пример
отправки электронных писем, но уже с помощью веб-сервиса
НТТР-запросов из Python-кoдa рассматривается в рецепте
IFTTT.
Выполнение
7.13.
Более подробную информацию о модуле smtplib можно найти на сайте
Python.org9 .
Более подробную информацию о паролях приложений можно найти в Справочном
центре компании
Google 10 •
Много связанных с Интернетом рецептов вы также найдете в главе
7.17. Создание простого
веб-сервера на языке
17.
Python
Задача
Вы собираетесь создать простой веб-сервер на языке
Python,
но при этом не хотите
запускать полный стек веб-сервера.
Решение
Воспользуйтесь Руthоn-библиотекой bottle, которая позволяет запустить простей
ший веб-сервер, способный отвечать на НТТР-запросы.
Установить модуль bottle можно с помощью команды:
$ sudo
рiрЗ
install bottle
Представленная далее Python-пporpaммa (ch_07_bottle_test.py) отображает на веб
странице простейшее сообщение о текущих дате и времени на устройстве
Pi
цепте
3.22):
from Ьottle i.mport route, run, template
from datetime i.mport datetime
@route ( '/')
def index(name='time'):
dt = datetime. now ()
time = "(:%Y-%m-%d %H:%M:%S)".format(dt)
return template('<b>Pi thinks the date/time is: ((t)}</b>', t=time)
run(host='0.0.0.0', port=80)
9
См. (https://oгeil.ly/RJ9(Jj.
10
Raspberry
(при желании вы можете скачать этот пример кода в порядке, описанном в ре
См. https://oгeil.lyГГ38tz.
Продвинутые возможности языка
Python
225
1
Эта программа должна быть запущена с правами суперпользователя:
$ sudo
pythonЗ
На рис.
7.3
ch_07_bottle_test.py
показано, какую веб-страницу отобразит веб-браузер при подключении
к устройству
Raspberry Pi
Рис.
7.3.
из другого места сети.
Подключение к веб-серверу на основе Руthоn-библиотеки
bottle
Приведенный пример требует некоторых пояснений.
После строк с операторами import команда @route связывает URL-aдpec
/
со сле
дующей далее функцией-обработчиком.
Функция-обработчик форматирует значение даты и времени и возвращает ту стро
ку НТМL-кода, которая будет отображаться в браузере. Итоговая строка сообщения
составляется путем подстановки значений даты и времени в строковый шаблон.
Непосредственный запуск веб-сервера производится в последней строке с по
мощью функции run. Для веб-серверов по умолчанию задействуется порт
80,
при
использовании другого порта после адреса сервера нужно будет ставить символ
и указывать номер порта.
Пояснение
В представленной здесь программе можно определить любое количество маршру
тов и обработчиков.
Модуль bottle прекрасно подходит для тех проектов, где требуется небольшой и
предельно простой веб-сервер. Благодаря тому, что он написан на языке
Python,
вы
можете легко написать функцию-обработчик, заставляющую оборудование тем или
иным образом реагировать на действия, выполняемые пользователем на отобра
жаемой в браузере странице. Еще несколько примеров использования модуля bottle
можно найти в главе
17.
При желании на устройстве
Raspberry Pi
(особенно на модели
Raspberry Pi 4)
мож
но запустить и полный стек веб-сервера (веб-сервер в сочетании с веб-фрейм
ворком и базой данных), включая, в частности, такую популярную комбинацию,
как сервер
Apache
в сочетании с РНР и
MySQL.
Конечно, вы не сможете получить
тот же уровень производительности, как при использовании надлежащего сервер
ноrо оборудования, но все же с успехом сможете поэкспериментировать и изучить,
как все это работает.
226
1
Глава
7
Дополнительные сведения
Инструкции по установке на устройство
MySQL
Raspberry Pi
стека LАМР
(Linux, Apache,
и РНР) можно найти по адресу https://oreil.ly/МIE00.
Более подробная информация о модуле bottle содержится в документации на него 11 •
Подробно о форматировании значений даты и времени в Python-кoдe рассказывает
ся в рецепте
7.2.
Большое количество связанных с Интернетом рецептов также приведены в главе
7.18. «Ничегонеделание»
в языке
17.
Python
Задача
Вам нужно, чтобы в течение какого-то времени Руthоn-программа ничего не дела
ла. Это может потребоваться, например, чтобы сообщения в терминале выводились
с определенным временным интервалом.
Решение
Используйте функцию sleep из библиотеки time, как показано в представленном
далее примере кода (ch_07 _sleep_test.py):
import time
х = о
while True:
print (х)
time.sleep(l)
х += 1
При желании вы можете скачать эту программу в порядке, описанном в рецеп
те
3.22.
Используемый здесь цикл обеспечивает вывод последовательного ряда значений
с интервалом в одну секунду.
Пояснение
Функция time. sleep принимает в качестве параметра величину необходимой за
держки в секундах. Если величина задержки должна составлять меньше секунды,
можно указывать этот интервал в виде десятичной дроби. Например, чтобы полу
чить задержку в одну миллисекунду, эту функцию нужно вызвать следующим
образом:
time. sleep (О. 001).
11
См. https://oreil.ly/DCAdz.
Продвинутые возможности языка
Python
227
Рекомендуется вводить небольшую задержку в любой цикл, который выполняется
бесконечно или хотя бы пару секунд, потому что каждый вызов функции sleep
высвобождает ресурсы процессора для выполнения другой работы.
При использовании контактов
GPIO
в рецепте
11.1
и многих других рецептах за
держки организуются с целью задания интервала при выполнении таких операций,
как включение и выключение светодиодов.
Дополнительные сведения
Интересное обсуждение вопроса о том, как с помощью функции time. sleep можно
снизить потребление Руthоn-программой ресурсов процессора, представлено по
адресу
https://oreil.ly/FgpUQ.
7.19.
Одновременное выполнение нескольких задач
Задача
Вы хотите, чтобы одновременно с выполнением определенной задачи Руthоn
программа делала и что-то другое.
Решение
Воспользуйтесь Руthоn-библиотекой threading.
Представленный далее пример кода
(ch_07_thread_test.py)
показывает, как можно
запустить поток, прерывающий работу основного потока (при желании вы можете
скачать эту программу в порядке, описанном в рецепте
3.22):
• r t threading, time, random
def annoy (message):
while True:
time.sleep(random.randint(l, 3))
print (message)
t = threading. Thread (target=annoy, args= ( 'ВОО ! ! ',))
t.start()
х = о
while True:
print (х)
х += 1
time.sleep(l)
Когда вы запустите эту программу, в консоль будет выведено примерно сле
дующее:
228
$
1
Глава
pythonЗ
7
ch_07_thread_test.py
о
1
В00
!!
2
В00
!!
3
4
5
В00
!!
6
7
8
При запуске нового потока вьтолнения с помощью Руthоп-библиотеки threading
необходимо указать (с помощью параметра target), какая функция должна выпол
няться в этом потоке. Используемая в нашем случае функция annoy содержит беско
нечный цикл, выводящий сообщение со случайно выбираемым интервалом в диа
пазоне от
1 до 3
секунд. Обратите внимание на то, что выводимая строка передает
ся функции annoy с помощью параметра args.
Непосредственный запуск потока производится путем вызова метода start класса
Thread. Этот метод принимает два параметра: имя выполняемой функции (в нашем
случае annoy) и кортеж, содержащий все передаваемые функции параметры (в на
шем случае он содержит только строку воо ! ! ).
Как можно здесь заметить, основной поток, который просто выводит последова
тельный ряд чисел, через каждые несколько секунд прерывается потоком, в кото
ром выполняется функция annoy.
Пояснение
Такие потоки иногда также называют легковесны.ми процессами, потому что их ис
пользование
напоминает
одновременное
выполнение
нескольких
программ
или
процессов. Однако преимуществами потоков является то, что при запуске несколь
ких потоков в одной программе все они получают доступ к одним и тем же пере
менным, а также и то, что при прекращении выполнения основного потока про
граммы прекращается выполнение и всех других запущенных в ней потоков.
Дополнительные сведения
Хорошее изложение основ работь1 с потоками в языке
адресу
https://pymotw.com/3/threading.
Python
представлено по
Продвинутые возможности языка
7.20. Синтаксический анализ данных
в формате
Python
1 229
JSON
Задача
Вам нужно подвергнуть синтаксическому анализу данные, представленные в попу
лярном формате
JSON (JavaScript Object Notation,
объектная нотация
JavaScript).
Это могут быть данные, предоставленные вам веб-сервисом или сохраненные вами
ранее в JSОN-файле.
Решение
Используйте модуль json, как показано в следующем примере кода (ch_07_parse_
json.py):
import json
s = ' ( "books" : [
{"title"
{"title"
] )1
"Programming Arduino", "price" : 10.951,
"Pi CookЬook", "price" : 19.951
j = json.loads(s)
print (j [ 'books'] [1] [ 'title'])
При желании вы можете скачать эту программу в порядке, описанном в рецеп
те
3.22.
Я разбил здесь JSON-cтpoкy на несколько строк, чтобы вам бьmо легче понять
структуру анализируемых данных.
Функция loads
(load string,
загрузить строку) путем синтаксического анализа преоб
разует строку в структуру данных, которая сохраняется в переменной j. Теперь
к содержимому этой структуры можно обращаться точно так же, как в случае
обычной комбинации списков и словарей языка
Python.
В нашем случае мы выво
дим на экран поле title второго элемента списка books (т. е. строку Pi CookЬook).
Пояснение
Если вам нужно подвергнуть синтаксическому анализу JSОN-данные, содержащие
ся в файле, можно сначала считать данные из файла в строку, как описано в рецеп
те
7.8,
а затем выполнить анализ строки, как бьmо только что показано. Однако
более эффективный подход, особенно в случае больших файлов, сводится к тому,
чтобы подвергнуть анализу сам файл, используя функцию json.load (а не функцию
loads).
В качестве примера давайте создадим файл с именем ch_07_example_file.json, содер
жащий следующий JSON-кoд:
Глава
230
{"Ьooks"
7
: [
"Prograrnnming Arduino", "price"
"Pi CookЬook", "price" : 19.95)
{"title"
{"title"
10.95),
]}
Представленный далее код (вы можете найти его в файле ch_07 _parsejson_file.py)
считывает и анализирует содержимое этого файла, выдавая тот же результат, что и
в первом примере этого рецепта, с тем отличием, что JSОN-данные здесь извлека
ются непосредственно из файла:
import json
file_name = 'ch_07_exarrple_file.json'
json_file = open(file_name)
j = json.load(json_file)
json_file.close()
print(j['books'] [1] ['title'])
Следующий пример этого рецепта посвящен синтаксическому анализу данных,
возвращаемых веб-запросами. Большинство веб-сервисов использует АРI-интер
фейсы с обменом данными в формате
JSON.
Представленный далее код показыва
ет, как можно использовать погодный сервис
назывался
Apixu).
weatherstack.com
(который ранее
Чтобы взаимодействовать с этим сервисом, вам потребуется
зарегистрировать аккаунт (там есть и бесплатный вариант):
import json
import urllib.request
key = 'paste_your_key_here'
response = urllib.request.urlopen('http://api.weatherstack.com/current?
access_key=' + key + '&query=Paris')
j = json.load(response)
print(j['current'] ['weather_descriptions']
[О])
Перед запуском этой программы (ch_07_parsejson_url.py) не забудьте присвоить
переменной
Парижа
key используемый вами ключ доступа. Вы также можете указать вместо
(Paris) тот город, в котором живете.
Запустив эту программу, вы получите результат следующего вида:
$ pythonЗ ch_07_parse_json_url.py
Partly cloudy
На самом деле этот
API
возвращает достаточно большое количество данных. Вы
можете просмотреть все эти данные, добавив в конце программы команду print (j).
А затем можно выбрать для отображения на экране какой-то другой элемент этих
данных.
Продвинутые возможности языка
Python
1
231
Дополнительные сведения
Обратите также внимание на рецепты
7. 7
и
7. 8,
посвященные соответственно
записи и чтению данных из файла.
7.21.
Сохранение словарей в виде JSОN-файла
Задача
Вам нужно сохранить словарь в виде текстового файла в формате
JSON.
Решение
Для сохранения в файле словаря или другого объекта можно использовать функ
цию
dump
из модуля
j son.
Как это делается, показано в следующем примере кода (ch_07_json_dump.py):
iroport json
phone_numЬers =
{
'Simon': '01234 567899', 'Jane': '01234 666666'}
f = open('test.txt', 'w')
json.dump(phone_numЬers,
f)
f .close ()
При желании вы можете скачать эту программу в порядке, описанном в рецеп
те
3.22.
Пояснение
Функцию dump также можно использовать для сохранения списков и любой комби
нации списков, словарей и других объектов, которые иногда требуется сохранять
в файле.
Для восстановления из файла сохраненных таким образом объектов можно исполь
зовать функцию json. load, как описано в рецепте
7.20.
Преимущество этого метода заключается в том, что, в отличие от сериализации
с помощью модуля pickle (см. рецепт
7.9),
при сохранении объектов в виде JSОN
файла вы можете просматривать и редактировать полученные файлы в текстовом
редакторе.
Дополнительные сведения
Обратите также внимание на рецепт
модуля
pickle.
7.9,
посвященный сериализации с помощью
232
1
Глава
7
7.22. Создание пользовательских интерфейсов
Задача
Вам нужен какой-то простой способ создания графического пользовательского
интерфейса для Руthоn-приложения.
Решение
Воспользуйтесь библиотекой
(Martin O'Hanlon)
из
guizero. Лора Сак (Laura Sach) и Мартин О'Хэнлон
компании
Raspberry Pi Foundation
создали
эту
Руthоn
библиотеку, которая существенно облегчает вам задачу создания графического
пользовательского интерфейса для своего проекта.
Хотя библиотека
guizero изначально создавалась для устройств Raspberry Pi, она
будет прекрасно работать практически в любом окружении, способном выполнять
Python-кoд. Поэтому ее можно использовать не только на устройствах
но и на компьютерах с операционной системой
новить библиотеку
$
sudo
рiрЗ
Windows
или
macOS.
Raspberry Pi,
Чтобы уста
guizero, выполните в окне терминала команду:
install guizero
По завершении процесса установки попробуйте применить эту библиотеку на прак
тике, используя приведенный далее пример кода
(ch_07_guizero.py), который вы при
желании можете скачать в порядке, описанном в рецепте
3.22:
from guizero import *
def say_hello():
info("An Alert", "Please don't press this button again")
= App(title="Pi CookЬook Exarnple", height=200)
button = PushВutton(app, text="Don't Press Ме", coпrnand=say_hello)
арр
app.display ()
Когда вы запустите эту программу с помощью приведенной далее команды, на
экране появится окно с кнопкой, нажав на которую, можно будет отобразить пре
дупреждающее сообщение (рис.
$ pythonЗ
7.4):
ch_07_guizero.py
Этот пример показывает, насколько легко с помощью библиотеки
guizero привязать
Руthоn-функцию к кнопке с тем, чтобы при каждом щелчке на кнопке производился
вызов этой функции.
В начале программы определяется функция say_hello. Затем определяется новая
переменная арр, которая инициализируется экземпляром класса Арр с параметрами,
задающими отображаемый вверху заголовок окна и высоту окна в пикселах. Наря
ду с этими двумя необязательными параметрами, можно использовать и множество
Продвинутые возможности языка
Python
1
233
других опций, подробное описание которых содержится в документации по моду.
12
лю
guizero
Затем переменная арр передается в качестве первого параметра объеюу PushButton,
который создается в следующей строке. Параметр coпmand здесь указывает, какая
функция должна выполняться при щелчке на кнопке. Обратите внимание, что после
имени функции при этом не ставятся круглые скобки, потому что здесь нужно про
сто указать имя функции, а не вызвать ее.
Рис.
7.4.
Пример nроrраммы, использующей библиотеку
guizero
Пояснение
Мы рассмотрели в этом рецепте лишь ознакомительный пример работы с библио
текой guizero, возможности которой совсем не ограничиваются отображением на
экране такого простейшего элемента, как кнопка. Эrа библиотека призвана, прежде
всего,
предоставить вам
возможность создания
простых пользовательских интер
фейсов с использованием минимально возможного количества кода. Когда вы уже
созреете для создания чего-то более сложного, можно будет поэкспериментировать
со способом размещения таких элементов интерфейса, как кнопки, флажки и поло
сы прокрутки, или попробовать изменить цвет и размер шрифтов. Однако пока
лучше ограничиться чем-то простым.
Дополнительные сведения
Прекрасно составленную документацию по библиотеке guizero можно найти на сай
те
GitHub 13 .
Библиотека guizero также используется в рецептах
12
См. bttps://oreil.lyfflIQr.
13
См. https://oreil.ly/khljz.
11. 9, 11.1 О и 11.11.
234
7.23.
Глава
7
Применение регулярных выражений
для поиска совпадений в тексте по заданному шаблону
Задача
Вам нужно произвести сложный поиск в некотором тексте.
Решение
Воспользуйтесь имеющейся в языке
Python
реализацией регулярных выражений.
Регулярные выражения находят свое место в информатике еще с того времени,
когда эта сфера знаний была одним из разделов математики и отличалась строго
математическим подходом.
Регулярное выражение
это способ описания шаблона, используемого для поиска
-
совпадений в тексте, подобно тому, как это делалось в рецепте
5.16.
Как показыва
ет следующий пример, такое выражение позволяет очень гибко настраивать поис
ковый запрос за счет применения различных подстановочных знаков:
illport re
text = "looking forward to finding the word for"
= re.search("(лl\s)for($1\s)", text)
х
print (х.span11 1
При желании вы можете скачать эту программу
санном в рецепте
(ch_07_regex_find.py)
в порядке, опи
3.22.
Запустив программу на выполнение, вы получите следующий результат:
$ python3 ch_07_regex_find.py
(35, 39)
Первое число означает, что слово for находится в строке в позиции
в позиции
35
35
(а точнее,
находится пробел, за которым следует это слово). Второе число
указывает конечную позицию слова. При этом можно заметить, что в ходе поиска
было проигнорировано слово forward. Давайте посмотрим, как работает этот код.
Сначала мы импортируем здесь модуль
Затем объявляем переменную
re, реализующий регулярные выражения.
text и заносим в нее тестовую строку, в которой
будет производиться поиск.
После этого производим поиск в тестовой строке, используя для этого функцию
search. В качестве первого параметра эта функция принимает регулярное выраже
ние, а в качестве второго
-
строку, в которой должен выполняться поиск. В нашем
случае регулярное выражение выглядит следующим образом:
Продвинутые возможности языка
Python
235
Как мы видим, в середине этого регулярного выражения находится слово for. Это
вполне ожидаемо, поскольку именно его мы хотим найти. По обе стороны от слова
for стоят выражения, заключенные в круглые скобки. Вот первое выражение:
(л
1
\s)
Здесь используются три специальных символа: символ л, который означает начало
строки, символ
1,
означающий или, и символ
\s, соответствующий любому про
бельному символу (пробелу или символу табуляции). Таким образом, эта часть вы
ражения говорит о том, что сначала нужно найти совпадение с началом строки или
каким-либо пробельным символом, а уже потом искать совпадение со словом for.
То есть искомое слово for должно находиться либо в начале строки, либо после
пробела или другого пробельного символа. Это исключает вероятность того, что
регулярное выражение даст совпадение со словами, которые не начинаются, а за
канчиваются фрагментом for.
Аналогичное выражение стоит и после слова for:
($
1
\s)
Здесь используется новый для нас специальный символ $, который означает конец
строки. То есть мы получим здесь совпадение только в том случае, если фрагмент
for будет находиться в конце строки или если за ним будет следовать пробел или
другой пробельный символ.
В табл.
7.2
представлены
некоторые из тех специальных символов,
которые
используются в регулярных выражениях наиболее часто. Полный список этих сим
волов можно найти на сайте
Таблица
Специальный
символ
7.2.
W3Schools.com 14.
Специальные символы, часто используемые в регулярных выражениях
Значение
Ищет совпадение с любым одиночным символом
л
Ищет совпадение с началом строки
$
Ищет совпадение с концом строки
\d
Любая цифра
\s
Пробельный символ
\w
Буквенно-цифровой символ (цифры и буквы в верхнем или нижнем регистре)
*
Ноль или более вхождений того, что следует далее. Например, выражение
*\d ищет совпадение со строкой, содержащей ноль или большее количество
цифр
+
Одно или более вхождений того, что следует далее
[]
Ищет совпадение с любым из символов, заключенных в квадратные скобки.
Здесь также можно указывать не отдельные символы, а целые диапазоны.
Например, выражение [a-d] будет искать совпадение с любым символом,
находящимся в диапазоне от а до
14
См. https://oгeil.ly/bzhpm.
d
236
1
Глава
7
Лучший способ ознакомления с регулярными выражениями сводится к тому, чтобы
поэкспериментировать с веб-сервисом для тестирования регулярных выражений.
Пояснение
Настроить регулярное выражение так, чтобы оно работало нужным вам образом, не
всегда просто. Хорошим подспорьем в освоении искусства надлежащего составле
ния и проверки регулярных выражений станет использование какого-либо веб
инструмента для работы с регулярными выражениями 15 (рис.
7.5).
pythex
Yourr ular
п:
/
1GNORECASE
МUt.ТIUNE
OOТN.J.
VERВOSE
Your test strina:
lool<ing folWard 1О findng 1118 word for
Мatdl
Match result:
1looklng torward 1О findng lhe
res:
М8tch1
1.
1
2.
Рис.
7.5.
Онлайновый тестер реrулярных выражений
pythex
Такой онлайновый тестер позволяет ввести в одно поле регулярное выражение,
а в другое поле
-
проверочную строку (текст, в котором будет производиться по
иск с помощью регулярного выражения). После чего тестер выделяет все найден
ные совпадения. Так, на рис.
7.5
показано, как онлайновый тестер
имеющееся в нашем примере совпадение со словом
pythex
выделил
for.
Дополнительные сведения
Обратите также внимание на рецепт
7.24,
посвященный проверке корректности
введенных данных с помощью регулярных выражений.
Более подробную информацию об использовании регулярных выражений в языке
Python можно
найти на сайте
15
См. https://pythex.org/.
16
См. https://oreil.ly/Ьzhpm.
W3Schools.com 16 •
Продвинутые возможности языка
Python
1
237
7.24. Применение регулярных выражений
для проверки корректности введенных данных
Задача
Вам нужно проверить корректность некоторого текста
-
например, убедиться
в том, что этот текст выглядит как адрес электронной почты.
Решение
Используйте регулярное выражение (см. рецепт
7.23).
Основной областью применения регулярных выражений является проверка кор
ректности вводимой пользователем информации. Например, вам наверняка прихо
дилось заполнять форму регистрации, содержащую, помимо прочего, и поле для
адреса электронной почты. Когда введенный в такое поле текст не выглядит как
адрес электронной почты, вы получаете сообщение о некорректном формате адреса
электронной почты, которое обычно создается на основе проверки текста с по
мощью регулярного выражения.
Попробуйте запустить представленную далее программу (ch_07_regex_email.py), ко
торую вы при желании можете скачать в порядке, описанном в рецепте
i.пp)rt
3.22:
re
regex = •л[\w_\.+-]+@[\w_\.-]+\.(\w_-]+$'
while True:
text = input ("Enter an email address: ")
if re.search(regex, text):
print ("valid")
else:
print("invalid")
Эта программа будет раз за разом предлагать вам ввести адрес электронной почты,
а затем сообщать, является ли введенный адрес корректным. В Интернете можно
найти и другие варианты регулярных выражений для проверки адресов электрон
ной почты, а также регулярные выражения для проверки практически любых дру
гих данных.
Используемое здесь выражение ищет один или большее количество буквенно
цифровых символов (а также нижнее подчеркивание, точку и дефис), а затем
-
символ @. Далее снова повторяется первая последовательность, за которой должна
стоять точка, и еще одна такая же последовательность, но уже не содержащая сим
вола точки, чтобы адрес электронной почты не заканчивался этим символом.
Пояснение
Если вам нужно проверять некоторую конкретную разновидность данных (напри
мер, номера телефонов или ссьmки на веб-сайты), подумайте о том, что кто-то дру-
238
Глава
1
7
гой уже наверняка создал регулярное выражение для этой цели. Поэтому перед тем,
как приступать к составлению своего регулярного выражения, всегда пробуйте
найти нужное вам выражение в Интернете. Нет никакого смысла заново изобретать
колесо.
Дополнительные сведения
Обратите также внимание на рецепт
7.23,
посвященный основам работы с регуляр
ными выражениями.
7.25.
Применение регулярных выражений
для автоматического извлечения данных из веб-страниц
Задача
Вы хотите написать Python-nporpaммy для автоматического извлечения данных из
веб-страниц (что также называют веб-скрейпингом).
Решение
Используйте регулярные выражения для поиска текста в НТМL-коде веб-страниц.
Регулярные выражения очень удобно задействовать для так называемого веб-скрей
пинга
-
автоматического считывания информации, содержащейся в НТМL-коде
веб-страницы. Допустим, например, что мне нужна Руthоn-программа, способная
автоматически информировать меня о текущем рейтинге этой книги на сайте
Amazon. Для этого она должна извлекать из кода страницы
Amazon (число, обведенное кружком на рис. 7.6).
рейтинг продаж на сай
те
Product detaits
P•perb•ck: 400 pages
PuЬIJ•her: O'Rellly Medla; 3 edltlon (November 4, 2019)
l.8nau•a•: English
JSBN-10: 1492043222
JSBN-13: 978-1492043225
Product Dlmen•lon•: 7 х 9.2 lnches
Shlpplng Welght: 1.9 pounds~ll!ll''!lflliкilng rates and pollcles)
Aver•ae Cu•tomer Revl
: Ве the flrst revlew this item
Amezon Be8t Sellers Ra : #746,779 ln oks (See Тор 100 ln Books)
#81 ln Electronlc
nsors
Perlpher•I• (Book8)
#154 ln Computer На
#339 ln Slngle Board Computers (Book8)
Рис.
7.6.
Веб-скрейnинг страниц сайта
Amazon
Воспользовавшись в своем браузере командой для отображения исходного кода
страницы и выполнив поиск по фразе Sellers Rank (Рейтинг продаж), я могу найти
нужный мне фрагмент НТМL-кода, который выглядит следующим образом:
Продвинутые возможности языка
Python
1
239
<li id="SalesRank">
<Ь>Amazon Best Sellers Rank:</b>
#746, 779 in Books (<а href="https://www.amazon.com/best-sellers-books-Amazon
/zgbs/books/ref=pd_dp_ts_books_l">See Тор 100 in Books</a>)
Теперь я вставлю этот фрагмент в качестве проверочного текста в окне веб-тестера
регулярных выражений и составлю выражение так, чтобы оно извлекало рейтинг на
сайте
Amazon.
Нетрудно догадаться, что мне нужно извлечь всё, что находится
между символом# и текстом
in Books.
Эту задачу реализует представленная далее программа
(ch_07_regex_scraping.py),
3.22:
которую вы при желании можете скачать в порядке, описанном в рецепте
i.q)ort re
irrport urllib.request
regex = '#([\d,]+) in Books'
url = 'https://www.amazon.com/Raspberry-Pi-CookЬook-Software-Solutions/dp/1492043222/'
print ("The Amazon rank is ..... ")
text • urllib.request.urlopen(url) .read() .decode('utf-8')
print(re.search(regex, text) .group())
Эта программа выведет на экран примерно следующее:
$ pythonЗ test.py
The Amazon rank is .....
#746,779 in Books
Сначала ее код считывает содержимое веб-страницы, а затем преобразует его
в формат
UTF-8,
выражений re.
чтобы с ним можно было работать, используя модуль регулярных
Пояснение
Многие веб-сайты позволяют получать нужную информацию посредством АРI
интерфейсов (см. рецепт
7.20).
Если у интересующего вас сайта есть такой АРI
интерфейс, лучше используйте его, поскольку при использовании скрейпинга вы
сильно зависите от способа компоновки и стиля изложения содержимого страницы,
вследствие
чего
часто
приходится
составлять
новое
регулярное
выражение
при
каждом обновлении страницы.
Дополнительные сведения
О том, как производится чтение содержимого веб-страницы, рассказано в рецеп
те
7.13.
Обратите также внимание на рецепт
с регулярными выражениями.
7.23,
посвященный основам работы
ГЛАВА8
Компьютерное зрение
8.0.
Введение
Компьютерное зрение позволяет устройству
Raspberry Pi «видеты) различные
Raspberry Pi можно использовать
вещи. На практике это означает, что устройство
для анализа изображений, поиска нужных предметов и даже распознавания лиц и
текста.
Подключив к устройству
камеру, передающую ему изображения, вы
Raspberry Pi
откроете для себя широкий спектр возможностей. Рассмотрев эту тему здесь, мы
пойдем еще дальше и поговорим в главе
9о
машинном обучении.
8.1. Установка библиотеки OpenCV
Задача
Вы хотите оснастить свое устройство
Raspberry Pi
возможностями компьютерного
зрения, для чего вам необходимо установить на него библиотеку компьютерного
зрения
OpenCV 1•
Решение
Прежде чем устанавливать библиотеку
пакеты и обновите Руthоп-библиотеку
OpenCV,
NumPy:
установите необходимые для нее
$ sudo apt install libatlas-base-dev
$
рiрЗ
$
рiрЗ
$
рiрЗ
install --upgrade pip
install imutils
install ПЩ!lру --upgrade
После этого установите саму библиотеку
$
рiрЗ
OpenCV:
install opencv-python
Чтобы убедиться в работоспособности нового модуля, по завершении процесса
установки запустите
1 См.
https://opencv.org.
Python 3,
импортируйте модуль cv2 и проверьте его версию:
Компьютерное зрение
1
241
$ pythonЗ
Python 3.9.2 (default, Mar 12 2021, 04:06:34)
[GCC 10.2.1 20210110] on linux
Туре "help", "copyright", "credi ts" or "l1cense" for more information.
>» import cv2
>>> cv2. version
'4.6.0'
>»
»> exit()
Обратите внимание на то, что с обеих сторон от слова version нужно поставить по
два символа подчеркивания.
Пояснение
Компьютерное зрение активно потребляет и ресурсы процессора, и оперативную
память. Потому, несмотря на то, что библиотеку
более старых моделях
Pi 2,
Raspberry Pi,
OpenCV
можно использовать и на
на моделях, предшествующих модели
Raspberry
она будет работать очень медленно. А если вы собираетесь опробовать еще и
рецеmы из главы
9,
вам потребуется как минимум модель
Raspberry Pi 4 или 400.
Дополнительные сведения
Первые инструкции по использованию библиотеки
представлены в рецепте
8.2.
8.4,
OpenCV
в этой главе будут
посвященном основам работы с этой библиотекой.
Настройка USВ-камеры
для использования в системе компьютерного зрения
Задача
Настроить веб-камеру с интерфейсом
USB
для использования в проектах компью
терного зрения.
Решение
Используйте веб-камеру с интерфейсом
berry Pi.
USB2,
совместимую с устройствами
Rasp-
Постарайтесь выбрать камеру, обеспечивающую хорошее качество изо
бражений. Если в вашем проекте камера должна находиться на небольшом рас
стоянии от объекта, следует предпочесть камеру с режимом ручной фокусировки.
А если вам нужно подобраться к объекту совсем близко, возможно, будет лучше
использовать дешевый эндоскоп с интерфейсом
2
См. https://oreil.ly/wrlOti.
USB.
242
Глава В
Многие проекты компьютерного зрения также требуют, чтобы съемка изображений
производилась в хорошо освещенном пространстве. На рис.
ший пример такого пространства
-
8.1
показан простей
световой короб, изготовленный из контейнера
для хранения вещей из полупрозрачного пластика, подсвеченного с трех сторон для
обеспечения равномерной освещенности. Веб-камера при этом «смотрит» через
отверстие, проделанное в верхней стороне короба. Такой способ организации съе
мочного пространства, в частности, предполагается в рецепте
8.4.
Рис. 8.1. Самодельнь1й световой короб,
пригодный для обеспечения равномерной освещенности
Вы также можете воспользоваться и имеющимися в продаже световыми тентами
для фотосъемки.
Постарайтесь добиться в своей системе яркой и равномерной освещенности, даже
если это потребует некоторых усилий, потому что наличие теней может стать серь
езным источником проблем.
Пояснение
Убедиться в работоспособности USВ-камеры можно путем использования библио
теки
$
OpenCV
из консоли. Запустите
Python 3 и
введите следующие команды:
pythonЗ
Python 3.9.2 (default, Mar 12 2021, 04:06:34)
[GCC 10.2.1 20210110] on linux
Туре "help", "copyright", "credi ts" or "license" for more information.
»> import cv2
>>> from imutils.video import VideoStream
>>> vs = VideoStream(src=0) .start()
»> img = vs.read()
»> cv2. imshow ( 'image', img)
>>> cv2.waitKey(0)
Компьютерное зрение
1
243
После ввода последней строки кода должно открыться окно с полученным от каме
ры изображением. Чтобы закрыть это окно, возможно, потребуется закрыть окно
терминала.
При использовании библиотеки
OpenCV
даже отдельные изображения снимаются
как кадры видеопотока. Обратите внимание на то, что в третьей строке кода указан
нулевой номер источника:
src=0. Это означает, что библиотека OpenCV должна ис
пользовать первую же камеру, которую она сможет найти. В случае использования
нескольких камер вы можете указать здесь другой номер источника.
Считав изображение с помощью метода vs. read (1, вы можете отобразить его,
используя служебный метод библиотеки OpenCV imshow. Этот метод широко при
меняется для отладки проектов компьютерного зрения.
реализует требование, чтобы, отобразив изо
Последняя команда: cv2.waitKey(0) -
бражение, библиотека
OpenCV
приостановила выполнение программы до нажатия
любой клавиши.
Дополнительные сведения
Обратите также внимание на рецепт
OpenCV
8.3.
8.3,
посвященный использованию библиотеки
в сочетании с модулем камеры для
Raspberry Pi.
Использование модуля камеры для
Raspberry Pi
в системе компьютерного зрения
Задача
Использовать библиотеку
OpenCV
в сочетании с модулем камеры для
подключаемым непосредственно к устройству
Raspberry Pi,
Raspberry Pi.
Решение
Когда вы установите модуль камеры для
ми, изложенными в рецепте
1.16,
Raspberry Pi
в соответствии с инструкция
он должен автоматически распознаваться как
одна из доступных камер.
У становив этот модуль, вы можете убедиться в его работоспособности, выполнив
следующие команды:
$
pythonЗ
Python 3.9.2 (default, Mar 12 2021, 04:06:34)
[GCC 10.2.1 20210110] on linux
Туре "help", "copyright", "credits" or "license" for more information.
>» import cv2
>>> from imutils.video import VideoStream
>>> vs = VideoStream(src=0) .start()
»> img = vs.read(I
Глава В
244
»> cv2. imshow (' image', img)
>>> cv2.waitKey(0)
Пояснение
Следует заметить, что в ранних версиях
доступным для библиотеки
OpenCV
Raspberry Pi OS
модуль камеры становился
только после установки соответствующего
драйвера, поэтому, если библиотека
попробуйте
OpenCV не может обнаружить этот модуль,
Raspberry
Pi
OS
обновить
до последней версии (см. рецепт 3.40).
Дополнительные сведения
Инструкции по установке модуля камеры для
те
Raspberry Pi
изложены в рецеп
1.16.
Подробное описание Руthоn-библиотеки picamera можно найти по адресу
http://picamera.readthedocs.org.
Обратите также внимание на рецепт
OpenCV
8.4.
8.2,
посвященный использованию библиотеки
в сочетании с USВ-камерой.
Подсчет количества монет
Задача
Использовать компьютерное зрение для подсчета количества монет, находящихся
в поле зрения веб-камеры.
Решение
Воспользуйтесь имеющейся в библиотеке
с по.мощью метода Хафа
жиме
реального
времени
OpenCV функцией обнаружения кругов
(Hough Circ\es detector), что даст вам возможность в ре
подсчитывать
количество
монет,
находящихся
в
поле
зрения веб-камеры. Метод Хафа позволяет распознавать любые типы окружностей
и хорошо распознает практически любые монеты.
Это одна из тех областей применения компьютерного зрения, где требуется, чтобы
поле зрения было хорошо освещено, а камера закреплена в одном положении.
Я использовал здесь способ организации пространства, представленный на рис.
8.1.
Критически важным этапом для многих проектов компьютерного зрения является
точная настройка параметров, и рассматриваемый здесь случай не является в этом
плане исключением. Поэтому, прежде чем пытаться использовать окончательную
версию программы, которая просто подсчитьIВает количество монет, давайте сна
чала поработаем с ее тестовой версией (ch_OB_coin_count_test.py), которая рисует
контуры вокруг монет, чтобы мы понимали, как бьm получен тот или иной резуль
тат. При желании вы можете скачать эту версию программы в порядке, описанном
в рецепте
3.22.
Компьютерное зрение
Рис.
8.2.
245
Распознавание монет
Положите несколько монет в поле зрения камеры и запустите программу . При этом
должно открыться окно вида, показаного на рис.
8.2.
Если вам повезет, контуром будут обведены все монеты. Вывод программы в кон
соли при этом будет выглядеть следующим образом:
$ pythonЗ ch_0B_coin_count_test.py
[ [ [380.5 338.5 37. 9)
[553.5 249.5 34.9]
[538.5 357.5 31.4)
[546.5 442.5 30.7 ]
[418.5 244.5 33.1]) ]
После этого можно будет обновить изображение путем нажатия любой клавиши
или выйти из программы, нажав клавишу <Х>.
Если контуром будут обведены не все монеты, надо будет скорректировать ряд па
раметров:
paraml, param2, minRadius
count_test.py
и
maxRadius -
ознакомиться с их подробным описанием 3 ):
i.qx)rt cv2
from imutils.video import VideoStream
from imutils import resize
vs
=
VideoStream(src=0) . start()
while True :
img = vs . read ()
3
в тестовой программе
ch_08_coin_
(если вам интересно, что делает каждый из этих параметров, вы можете
См. https://oreil.ly/3AmKn.
Глава В
246
img = resize(img, width=BOO)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = cv2.Ыur(img, (3, 3))
detected_circles = cv2.HoughCircles(img,
cv2.HOOGH_GRADIENT, 1, 20, paraml = 50,
param2 = 30, minRadius = 15, maxRadius = 100)
print(detected_circles)
for pt in detected_circles[O]:
а, Ь, r = pt[O], pt[l], pt[2)
cv2.circle(img, (int(a), int(b)), int(r), (0,
О,
0), 2)
cv2. imshow 1' image' , img)
key = cv2.waitKey(O)
cv2.destroyAllWindows()
if key == ord( 'х'):
break
vs. stop 1)
В ходе такой корректировки обычно можно обойтись без изменения параметра
paraml.
При большом количестве ошибок с отрисовкой контура можно попытаться увели
чить параметр
param2. Однако в большинстве случаев исправить ситуацию позволя
minRadius и maxRadius, на которые сильно влияет разрешение
ет изменение параметров
используемой
камеры,
фокусное расстояние
объектива и удаленность камеры
от монет. То есть если программа не обвела контуром ни одну монету, возможно,
стоит увеличить именно параметр
maxRadius.
Продолжайте настройку этих параметров до тех пор, пока программа не начнет
правильно идентифицировать все монеты.
Пояснение
Давайте кратко разберемся с тем, как работает эта программа.
В окончательной версии программы (файл ch_OB_coin_count.py) все содержимое бло
ка while True: размещается внутри блока try. Это гарантирует, что при выходе из
программы с помощью комбинации клавиш
<Ctrl>+<C>
воспроизведение видеопо
тока всегда будет прекращаться.
После считывания изображение проходит через несколько этапов обработки. Сна
чала мы изменяем размер изображения так, чтобы его ширина составляла
800
пик
селов, затем преобразуем его в оттенки серого цвета и, наконец, применяем к нему
фильтр размытия, чтобы добиться более эффективного распознавания кругов.
Компьютерное зрение
1
24 7
Вызов метода cv. нoughCircles возвращает массив обнаруженных на изображении
кругов. Каждый круг определяется тремя значениями: координатами х и у центра
круга и его радиусом.
Чтобы отобразить эти круги поверх изображений монет, мы перебираем все обна
руженные круги в цикле for и с помощью метода cv2. circle рисуем вокруг каждой
монеты круглый контур черного цвета (О, О, О) толщиной в
2 пиксела.
Окончательная версия этой программы является упрощенным вариантом приве
денной ранее тестовой версии, поэтому просто запустите на выполнение файл
ch_08_coin_count.py, когда будете к этому готовы. Попробуйте изменить количество
монет, находящихся в поле зрения камеры, и посмотрите, как при этом изменится
результат. Попробуйте также разместить среди монет объекты другой формы и
убедитесь в том, что они не распознаются как монеты.
При желании мы могли бы пойти еще дальше и попробовать распознавать номинал
монет по их радиусу, и, используя эту информацию, определять суммарную стои
мость всех обнаруженных монет.
Дополнительные сведения
Процесс установки библиотеки
OpenCV
рассматривается в рецепте
8.1,
-
а процесс
настройки камеры для использования в системе компьютерного зрения
те
в рецеп
8. 2.
8.5.
Распознавание лиц
Задача
Вам нужно определять места расположения (координаты) лиц на фотографии или
получаемом от веб-камеры изображении.
Решение
Для нахождения лиц на изображениях реализуйте с помощью библиотеки
OpenCV
методику обнаружения объектов по их характерным признакам, применяемую
в оборудовании для высотной авиационной разведки
naissance,
(High Altitude Aerial Recon-
НААR).
Если вы еще это не сделали ранее, установите программу
в рецепте
OpenCV,
как описано
8.1.
Пример кода, рассматриваемый в этом рецепте, содержится в файле ch_08_faces.py.
Вы можете скачать его в порядке, описанном в рецепте
лом программы находится
3.22.
и файл faces.jpg, содержащий
В одной папке с фай
подходящее тестовое
изображение. Когда вы запустите программу, откроется окно с изображением,
показанным на рис.
8.3.
В консоли при этом будет выведено следующее:
248
Глава
8
Рис.
8.3.
Нахождение месr расположения лиц
python3 ch_08_faces.py
[[173 139 66 66]
[367 60 66 66]
[564 73 66 66]]
$
Обратите внимание на то, что для надлежащей работы программы файл faces.jpg
(или другой используемый вами файл изображения) должен находиться в том же
каталоге, что и она.
Пояснение
Вот исходный код программы
i.qюrt
ch_08_faces.py:
cv2, pkq_resouroes
haar_file = pkg_resources.resource_filename('cv2',
'data/haarcascade_frontalface_default.xrnl')
face_cascade = cv2.CascadeClassifier(haar_file)
irog = cv2. imread ( 'faces. jpg', cv2. IМREAD_ GRAYSCALE)
scale factor = 1.4
=5
min_neighЬors
faces = face_cascade.detectMultiScale(img, scale_factor,
print (faces)
min_neighЬors)
Компьютерное зрение
for (x,y,w,h) in faces:
img=cv2.rectangle(img,
249
(x+w,y+h), (255,255,255), 2)
(х,у),
cv2. imshow ( ' image' , img)
cv2.waitKey(O)
cv2.destroyAllWindows()
Библиотека
предлагает вам широкий набор классификаторов для распо
OpenCV
знавания лиц и других объектов. Все они находятся в каталоге, для доступа к кото
рому мы используем служебный модуль pkg_resources. В нашем случае мы собира
емся задействовать детектор лиц, определенный в дескрипторном ХМL-файле
haarcascade_frontalface_ default.xml.
Затем мы считываем тестовое изображение в оттенках серого цвета. Если вы реши
ли взять собственное тестовое изображение, то вам, возможно, придется скоррек
тировать параметры
♦
scale_ factor
и
min_neighЬors:
scale factor.
Этот параметр определяет величину шага, используемого детектором лиц в ходе
их обнаружения, путем автоматического изменения масштаба изображения.
В нашем случае значение
няться на
40%.
1,4 означает,
что на каждом шаге масштаб будет изме
Увеличение этого параметра ускорит процесс распознавания лиц,
но в то же время может привести к тому, что некоторые лица останутся нераспо
знанными;
♦
min_neighЬors.
При слишком низком значении этого параметра детектор лиц может иногда рас
познавать как лица другие объекты.
Распознав объекты как лица, мы выводим на экран соответствующие координаты,
используя функцию print, после чего в цикле for накладываем на каждое лицо пря
моугольник и, наконец, отображаем итоговое изображение.
Библиотека
OpenCV
позволяет находить таким образом самые разные объекты.
Полный список имеющихся классификаторов можно отобразить с помощью сле
дующей команды:
$ od /.local/liЬ/python3.9/site-packages/cv2/data/
$ 1s
haarcascade_eye.xml
haarcascade frontalcatface extended.xml
haarcascade frontalcatface.xml
haarcascade_frontalface_alt2.xml
haarcascade - frontalface- alt - tree.xml
haarcascade_frontalface_alt.xml
haarcascade_frontalface_default.xml
haarcascade_fullbody.xml
haarcascade_lefteye_2splits.xml
haarcascade lowerbody.xml
haarcascade_profileface.xml
haarcascade_righteye_2splits.xml
haarcascade_russian_plate_numЬer.xml
haarcascade smile.xml
haarcascade_upperbody.xml
init .ру
_pycache_
Как видите, помимо лиц, вы также можете распознавать различные части тела и
даже улыбки!
Глава
250
8
Дополнительные сведения
В главе
9
мы снова займемся распознаванием объектов, но уже используя методы
машинного обучения, позволяющие распознавать практически любые объекты.
Процесс установки библиотеки
OpenCV
рассматривается в рецепте
8.1,
-
настройки камеры для использования в системе компьютерного зрения
а процесс
в рецеп
те В. 2.
Более подробную информацию о распознавании лиц можно найти по адресу
https://oreil.ly/iNJu8.
8.6.
Регистрация движения
Задача
Вы хотите использовать подключенную к устройству
Raspberry Pi
камеру для реги
страции движения в ее поле зрения.
Решение
Используя библиотеки
OpenCV
и
NumPy,
отслеживайте степень различий между
каждой парой последовательно идущих кадров.
Представленная в этом рецепте программа (ch_OB_detect_motion.py) сравнивает каж
дое следующее изображение с предыдущим и определяет степень различий между
ними, используя библиотеку для математических вычислений
NumPy.
Если эта
степень различий превышает пороговое значение, программа сообщает о том, что
она заметила движение.
При желании вы можете скачать эту программу в порядке, описанном в рецеп
те
3.22.
Подключите веб-камеру с интерфейсом
к своему устройству
Raspberry Pi
USB
или модуль камеры для
Raspberry Pi
и запустите программу. Попробуйте поводить
рукой в поле зрения камеры. Программа должна выдать сообщение Movement detected
(Зафиксировано движение):
cv2
import numpy as np
from imutils.video import VideoStream
from imutils import resize
iпport
diff threshold = 1000000
vs
=
VideoStream(src=0) .start()
def getimage():
im = vs. read 1)
im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
Компьютерное зрение
251
im = cv2 . Ы ur (im, (2 О, 2О 11
return im
old_image = getimage()
while True:
new_image = getimage()
diff = cv2.absdiff(old image, new_image)
diff_score = np.sum(diff)
# print (diff_ score)
if diff- score > diff - threshold:
print ("Movement detected")
old_image = new_image
Если
ние
программа слишком
переменной
часто
поднимает ложную тревогу,
увеличьте значе
diff_threshold. Вы также можете раскомментировать команду
print (diff scorel, чтобы видеть, какую степень различий между кадрами фиксирует
программа.
Для получения более надежных результатов каждое изображение преобразуется
в оттенки серого цвета и обрабатывается фильтром размытия.
Пояснение
Два последовательно идущих кадра могут выглядеть так, как показано на рис.
и
8.5.
8.4
Если мы вычтем первое изображение из второго, полученный результат будет
выглядеть так, как показано на рис.
8.6.
Хотя рассмотренная в этом рецепте программа просто выдает сообщение, она с тем
же успехом могла бы включать свет или выполнять какое-то другое действие,
используя контакты
GPIO.
Рис.
8.4.
Регистрация движения: кадр
1
Глава
252
8
Рис.
Рис.
8.6.
8.5.
Регистрация движения : кадр
2
Регистрация движения : различия между первым и вторым кадрами
Дополнительные сведения
Процесс установки библиотеки ОрепСV рассматривается в рецепте
настройки камеры для использования в системе компьютерного
те
8.1,
зрения -
а процесс
в рецеп
8.2.
Еще один способ регистрации движения заключается в использовании инфракрас
ного датчика движения, как предлагается в рецепте
13. 9.
Компьютерное зрение
8.7.
1
253
Извлечение текста из изображения
Задача
Вам нужно извлекать текст из содержащих
ero изображений.
Решение
Для извлечения текста из изображений используйте движок оптического распозна
вания символов tesseract. Чтобы установить эту библиотеку, выполните следующие
команды
( при
желании вы можете скачать архив используемых в книге примеров
кода в порядке, описанном в рецепте
3.22,
и скопировать эти команды из файла
long_commands.txt через буфер обмена):
$ sudo apt install tesseract-ocr
$ sudo apt install libtesseract-dev
Чтобы опробовать tesseract на практике, вам потребуется файл с изображением,
содержащим некоторый текст. В качестве такого тестового изображения можно
использовать файл ocr_test.tiff, который вы можете скачать вместе с примерами кода
в порядке, описанном в рецепте
3.22.
Чтобы извлечь текст из этого изображения,
выполните следующую команду:
$ cd
~/raspberrypi_cookЬook_ed4
$ tesseract ocr test.tiff stdout
Page 1
This is an image of some text
Если вы посмотрите, какое изображение сохранено в файле ocr_test.tiff, то увидите,
что оно действительно содержит извлеченный нами текст.
Пояснение
Хотя в этом примере
используется изображение в формате
TIFF,
программа
tesseract может работать и с большинством других графических форматов, включая
форматы
PDF, PNG
и
JPEG.
Дополнительные сведения
Более подробную информацию о библиотеке tesseract можно найти по адресу
https://oreil.ly/Evdxw.
ГЛАВА
9
Машинное обучение
9.0.
Введение
Возможно, это вас удивит, но, несмотря на свои скромные возможности, мини
компьютер
Raspberry Pi
прекрасно подходит для экспериментов с машинным обу
чением. В этой главе вы узнаете, как с помощью
Raspberry Pi
можно распознавать
объекты в видеопотоке или звуковые сигналы в режиме реального времени и при
вязывать к этому процессу свои Руthоn-программы.
При написании компьютерной программы мы обычно предоставляем компьютеру
некоторый список последовательно выполняемых действий и создаем процедуры,
каждая из которых реализует ту или иную задачу. Этот подход находит свое выра
жение в таких языках программирования, как
Python,
и вполне пригоден для опера
ций типа сохранения данных или выполнения расчетов. Однако сложно себе пред
ставить, как при таком подходе можно заставить компьютер правильно реагировать
на речевые команды или распознавать объекты на фотографиях. Люди и животные
учатся этому путем долгой практики. Наш мозг постепенно обучается распознавать
различные звуки и объекты, накапливая опыт такого распознавания. При выполне
нии подобных действий мы не руководствуемся какой-либо программой действий,
а просто опираемся на свой опыт.
Машинное обучение (МО) подразумевает использование на обычном компьютере
специальных программ машинного обучения
( создаваемых
путем обычного про
граммирования), которые обрабатывают большие объемы данных и обучаются
на них примерно так же, как это делает человеческий мозг. Например, мы можем
научить компьютер распознавать речевые команды, предоставив ему большое ко
личество образцов этих команд вместе примерами постороннего фонового шума,
который компьютер должен научиться игнорировать.
В большинстве случаев машинное обучение решает задачу классификации
-
т. е.
отнесения принимаемых входных данных к той или иной категории. Например,
компьютер может определять вероятность присутствия
в принимаемом звуковом
образце тех или иных слов или фраз из заранее заданного набора слов или фраз.
Еще одним примером машинного обучения может служить классификация объек
тов, присутствующих на изображениях, с тем, чтобы определять, какое животное
там изображено или присутствует ли определенное животное в видеопотоке, со
держащем множество разных объектов.
Существуют различные способы проведения такого обучения, которые могут опи
раться либо на традиционные методы статистического анализа, либо на нейросете-
Машинное обучение
1
255
вые модели. Подход с опорой на нейронные сети предполагает имитационное мо
делирование нейронной сети человеческого мозга с помощью обычной программы.
Каждый нейрон сети содержит некий выходной сигнал, который выдается в том
случае, если сумма снабженных весовыми коэффициентами входных сигналов пре
вышает определенный порог. В ходе обучения производится корректировка весо
вых коэффициентов до тех пор, пока нейронная сеть не начнет работать с приемле
мым уровнем точности. В некоторых случаях процесс обучения выглядит еще
сложнее, требуя не просто корректировки весовых коэффициентов, а изменения
самой конфигурации нейронной сети. Однако этот процесс можно в значительной
мере автоматизировать за счет применения надлежащего программного обеспе
чения.
В этой главе мы сначала попробуем задействовать предварительно обученные мо
дели, созданные на основе огромных наборов данных специалистами по машинно
му обучению и предоставляемые для бесплатного использования в библиотеке
TensorFlow.
Мы узнаем, как эти модели можно применять для классификации объ
ектов в видеопотоке или звуковых сигналов в режиме реального времени и привя
зывать к этому процессу свой Python-кoд. При использовании таких стандартных
предварительно
обученных
моделей
нам
потребуется
подвергать
получаемый
устройством видеосигнал некоторой предварительной обработке.
После этого мы попробуем использовать платформу
Edge Impulse,
чтобы наглядно
ознакомиться с процессом создания и обучения собственной модели машинного
обучения. Платформа
Edge Impulse
существенно упрощает реализацию машинного
обучения, предоставляя вам облачный сервис, который берет на себя всю ресурсо
затратную работу по подготовке данных и обучению модели. Вы сможете сначала
выполнить всю тяжелую работу в облаке, а затем скачать обученную модель на та
кое маломощное устройство, как
Raspberry Pi.
Для работы с библиотекой
TensorFlow и платформой Edge Impulse вам потребуется
Raspberry Pi 4 или 400. Необходимо будет также подключить
Raspberry Pi веб-камеру (или модуль камеры для Raspberry Pi) и мик
как минимум модель
к устройству
рофон. Можно использовать либо встроенный микрофон веб-камеры с интерфей
сом
USB
(просто подключив соответствующий кабель), либо отдельный микрофон
с интерфейсом
USB,
как предлагается в рецепте
Поскольку машинное обучение
-
16. 6.
очень обширная тема, о которой написано нема
ло книг, здесь мы ограничимся лишь вводной информацией по этой теме, рассмот
рев несколько простых проектов машинного обучения.
9.1.
Распознавание объектов в видеопотоке
с помощью библиотеки
TensorFlow Lite
Задача
Вам нужно, чтобы устройство
объекты в видеопотоке.
Raspberry Pi
в динамическом режиме распознавало
256
Глава
9
Решение
У становите библиотеку
OpenCV,
как предлагается в рецепте Я.1, поскольку она
используется почти во всех рецептах этой главы.
Задействуйте предварительно обученную модель из библиотеки
тании с веб-камерой с интерфейсом
позволит
в
динамическом
режиме
обнаружении в нем объектов (рис.
Рис.
9.1.
USB
TensorFlow в соче
Raspberry Pi. Это
или модулем камеры для
производить
аннотирование
видеопотока
при
9 .1 ).
Распознавание объектов в видеопотоке
Чтобы запустить этот пример, перейдите в свой домашний каталог и скачайте при
меры из библиотеки
$ git clone
TensorFlow,
используя следующую команду:
https://githuЬ.com/tensorflow/exarnples
--depth 1
Теперь, как показано далее, перейдите в каталог этого проекта, запустите скрипт
setup.sh,
чтобы собрать проект, и, наконец, запустите соответствующую Руthоn
программу. Она будет аннотировать видео с частотой около
6
кадров в секунду,
распознавая самые разные виды объектов, попадающих в поле зрения вашей веб
камеры или модуля камеры для
Raspberry Pi.
Попробуйте удерживать те или иные
объекты в поле зрения камеры до тех пор, пока они не будут распознаны:
$ sudo apt install libportaudio2
$ cd ~/exarnples/lite/examples/object_detection/raspberry_pi
$ sh setup.sh
$ pythonЗ detect.py --model efficientdet liteO.tflite
Машинное обучение
1
257
Пояснение
В главе
8
мы уже пробовали распознавать и подсчитывать монеты. Однако при
этом мы использовали традиционные методы обработки изображений, поиска кон
туров, различий между изображениями и т. п. Этот подход требует хорошей осве
щенности и не предполагает использования какого-либо машинного обучения.
А теперь подумайте о том, что происходит в рассматриваемом здесь случае. Ведь
это просто удивительно: устройство
Raspberry Pi действительно
видит и распознает
различные объекты! И всё это благодаря тому, что используемая здесь модель была
обучена на тысячах изображений различных объектов и научилась их распознавать
или,
по крайней мере, выдавать достаточно точное предположение о наличии
в кадре того или иного объекта. И она может это делать при любом угле обзора,
уровне освещенности и заднем фоне.
Интересным моментом на рис.
9.1
является то, что чашечка кофе в моей руке была
ошибочно распознана как пульт дистанционного управления
(«remote» ),
что, види
мо, объясняется тем, что я держу ее так, как обычно держат пульт. Наше устройст
во допускает те же ошибки, которые мог бы сделать человек, потому что «видит»
объекты аналогичным образом.
Дополнительные сведения
В рецепте
9.2
мы модифицируем рассмотренную здесь программу таким образом,
чтобы при обнаружении определенного объекта запускался написанный нами код.
Вы можете использовать и другие предварительно обученные модели из библиоте
ки
TensorFlow Lite 1•
Более подробную информацию о библиотеке
TensorFlow
мож
но найти на ее сайте 2 .
9.2.
Реагирование на наличие объектов в видеопотоке
с помощью библиотеки Т ensorf low
Lite
Задача
Вы хотите с помощью Руthоn-программы выполнять некоторое действие при нахо
ждении в видеопотоке объекта определенного типа.
Решение
Модифицируйте программу для распознавания объектов с помощью библиотеки
TensorFlow
из рецепта
9.1
таким образом, чтобы при обнаружении нужного вам
объекта запускался написанный вами код.
1
См. https://oгeil.lyNpBVp.
2
См. https://www.tensoгf1ow.org.
258
Глава
9
Установите предварительно обученную модель из библиотеки
предлагается в рецепте
Скопируйте файл
TensorFlow,
как это
9.1.
ch_09_person_detector.py
в рабочий каталог примера кода для рас
познавания объектов (при желании вы можете скачать его в порядке, описанном
в рецепте
3.22).
Затем перейдите в этот каталог и запустите содержащуюся в нем
программу, выполнив следующие команды:
$ cd ~/examples/lite/examples/object_detection/raspberry_pi/
$
ер ~/raspberrypi_cookЬook_ed4/python/ch_09_person_detector.py
$
pythonЗ
ch_09_person_detector.py.
Когда вы ее запустите, при каждом появлении человека в поле зрения камеры
в терминале станет появляться сообщение
Одновременно с этим устройство
something Detected! (Что-то обнаружено!).
Raspberry Pi
будет сохранять полученное в такой
момент изображение в снабженном временной меткой РNG-файле:
$ 1s * .png
2022-04-21-05-57-27.png
2022-04-21-05-57-37.png
2022-04-21-06-19-17.png
Если вы перейдете к этим файлам в файловом менеджере, каждое из полученных
изображений можно будет открыть, выполнив двойной щелчок на соответствую
щем файле.
Пояснение
Программа этого рецепта представляет собой доработанную версию примера про
граммы для распознавания объектов из библиотеки
TensorFlow (detect.py).
Из-за его
большого размера я не могу здесь привести код этой программы целиком, и если
вы хотите посмотреть, как она выглядит, откройте в текстовом редакторе файл
ch_09_person_detector.py.
Далее же приведена ключевая часть этой программы, кото
рая содержится внутри функции run (полужирным начертанием здесь выделены
внесенные нами дополнения):
last detection time =
#
О
Непрерывно получаем изображения от камеры и запускаем процесс логического вывода
while cap.isOpened():
success, image = cap.read()
if not success:
sys.exit(
'ERROR: UnaЬle to read from webcam. Please verify your webcam settings.'
image = cv2.flip(image, 1)
# Конвертируем изображение из BGR в RGB, как того требует
rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
модель
TFLite
Машинное обучение
#
Создаем из RGВ-изображения объект
259
Tensorimage
input_tensor = vision.Tensorimage.create_from_array(rgb_image)
# Используя модель, выполняем необходимые для распознавания
detection_result = detector.detect(input_tensor)
#
объектов расчеты
Рисуем на входном изображении ключевые точки и края
image = utils.visualize(image, detection_result)
for detection in detection result.detections:
object_type = detection.categories[O] .category_name
time _now = time. time ()
if object_type == 'person' and time_now > last_detection_time + 10:
print(''***********************************'')
print ("Person Detected 1 ")
print("***********************************")
# Выполняем необходимые нам действия
last - detection - time = time - now
ts = "{:%Y-%m-%d-%H-%M-%S}".format(datetime.datetime.now())
cv2.imwrite(ts + ".png", image)
С помощью переменной
last_detection_time мы отслеживаем время последнего рас
познавания человека, чтобы следующий файл мог быть записан лишь спустя неко
торое время после такого события. В противном случае программа создавала бы
слишком много файлов.
Строка detection_ resul t = detector. detect Iinput _ tensor I создает список событий распо
знавания, каждое из которых выглядит следующим образом:
Detection(bounding_box=BoundingBox(origin_x=418, origin_y=285,
score=0.3515625,
display_name=' ', category_name='book'I] 1
width=lб,
height=40),
categories=[Category(index=BЗ,
Каждый элемент этого списка представляет собой кортеж, содержащий ограничи
тельную рамку распознанного объекта и список категорий, к которым он может
быть отнесен, начиная с наиболее вероятных. Соответственно, чтобы определить
тип распознанного объекта, нужно выбрать в списке категорий первый элемент
(с индексом О) и извлечь значение атрибута category_name.
Перебирая элементы списка detection_result, мы проверяем, когда был распознан
объект, и относится ли он к категории person (человек). Если это так, и если с мо
мента последнего распознавания объекта прошло достаточное количество времени
(как минимум
1О
секунд), мы сохраняем файл с помощью метода cv2. imwri te, ис
пользуя в качестве имени файла текущее значение даты и времени.
С помощью такой программы можно реализовать самые разные мероприятия.
Например, вы можете создать автоматическую кормушку для своих домашних пи
томцев, которая будет распознавать их с помощью камеры и, управляя двигателем,
выдавать им некоторое количество пищи.
260
1
Глава
9
Дополнительные сведения
Вы можете использовать и другие предварительно обученные модели из библиоте
ки
TensorFlow Lite3 •
но найти на ее
9.3.
Более подробную информацию о библиотеке
TensorFlow
мож
сайте4 •
Распознавание звуков
с помощью библиотеки
Tensorflow Lite
Задача
Вы хотите научить устройство
Raspberry Pi
распознавать различные типы звуков,
улавливаемых им с помощью микрофона.
Решение
Используйте одну из тех предварительно обученных моделей, которые предлага
ются в библиотеке
TensorFlow в
качестве примеров.
Если вы еще этого не сделали, перейдите в свой домашний каталог и скачайте при
меры из библиотеки
$ git clone
TensorFlow,
используя следующую команду:
https://githuЬ.com/tensorflow/exarnples
--depth 1
Теперь, как показано далее, перейдите в каталог этого проекта, запустите скриm
setup.sh,
чтобы собрать проект, и, наконец, запустите соответствующую Руthоn
программу:
$ cd ~/exarnples/lite/examples/sound_classification/raspberry_pi
$ sh setup.sh
$
pythonЗ
classify.py
Огкроется окно, которое будет выглядеть, как показано на рис.
9.2.
Попробуйте
издать свист или какие-либо другие звуки, и посмотрите, как этот классификатор
справляется с их распознаванием.
Пояснение
Варианты с результатом, не превышающим
бочными
-
0,2,
как правило, являются здесь оши
если, конечно, исключить вероятность того, что библиотека
TensorFlow
обладает более тонким слухом, чем автор этой книги. Однако вариант с наиболь
шим результатом обычно распознается достаточно точно
-
причем эта модель
позволяет распознавать достаточно большое количество разных звуков.
Для создания такой предварительно обученной модели, какую мы использовали
в этом примере, обычно требуется собрать и тщательно классифицировать тысячи
3
См. https://oreil.ly/YpBVp.
4
См. https://www.tensorOow.org.
Машинное обучение
1
261
образцов звука. Затем проводится тщательное обучение модели на этих образцах
с использованием постороннего фонового шума, что в итоге позволяет получить
модель, способную легко распознавать различные звуки.
Press ESC to exit.
Whistling
Веер. Ыеер
lnside. small room
Alann
Telephone
о. о
0.2
Рис.
9.2.
0.4
0.6
0.8
LO
Распознавание звуков
Дополнительные сведения
В рецепте
9. 4
объясняется, как можно добавить собственный код для выполнения
определенных действий при распознавании свиста, а в рецепте
9. 6 -
как можно
научить нейросеть распознавать речевые команды.
9.4.
Реагирование на свист
с помощью библиотеки
TensorFlow Lite
Задача
Вы хотите, чтобы устройство
Raspberry Pi
реагировало на свист, запуская на вы
полнение написанный вами Python-кoд.
Решение
Установите пример из библиотеки
TensorFlow,
рассмотренный нами в рецепте
9.3,
и немного измените работающую в нем Python-пporpaммy.
Скопируйте в рабочий каталог примера классификации звуков файл ch_09_
detect_whistle.py (при желании вы можете скачать его в порядке, описанном в рецеп-
262
те
Глава
9
Затем перейдите в этот каталог и запустите программу, используя сле
3.22).
дующие команды:
$ cd ~/exarnples/lite/exarnples/sound_classification/raspberry_pi/
$
ер ~/raspberrypi_cookЬook_ed4/python/ch_09_detect_whistle.py
$
pythonЗ
ch_09_detect_whistle.py
Когда вы ее запустите, на экране появятся приведенные далее сообщения. Каждый
раз, когда поблизости от микрофона будет раздаваться свист, на экране станет
появляться сообщение Whistling Detected (Обнаружен свист):
$ pythonЗ ch_09_detect_whistle.py
Listening for Whistles ...
Whistling Detected
Пояснение
Давайте взглянем на код этой программы:
import time
from tflite_support.task irnport audio
from tflite_support.task irnport core
from tflite_support.task irnport processor
model; 'yamnet.tflite'
num threads; 4
score threshold; 0.6
overlapping_factor; 0.5
#
Инициализация модели классификации звуков
base_options; core.BaseOptions(
file_name~odel, use_coral;False, num_threads;num_threads)
classification_options; processor.ClassificationOptions(
max_results;l, score_threshold;score_threshold)
options; audio.AudioClassifierOptions(
base_options;base_options, classification_options;classification_options)
classifier; audio.AudioClassifier.create_from_options(options)
# Инициализация регистратора звуков и тензора для входных
audio record classifier.create_audio_record()
tensor_audio; classifier.create_input_tensor_audio()
#
#
#
#
#
#
звуковых образцов.
ПЫтаемся запускать процесс логического вывода
с интервалом,
в переменной
заданным в секундах,
interval_between_inference.
Обычно этот интервал выбирается равным половине длительности
входных образцов модели,
чтобы обеспечить частичное наложение
входных звуковых сегментов друг на друга для повышения точности классификации
Машинное обучвнив
263
input_length_in_second = float(len(
tensor_audio.buffer)) / tensor_audio.format.sample_rate
interval_between_inference = input_length_in_second * (1 - overlapping_factor)
pause_time = interval_between_inference * 0.1
last - inference- time = time.time()
#
Запускаем запись звука в фоновом режиме
audio_record.start_recording()
print ( 'Listening for Whistles ... ')
while True:
tensor_audio.load_from_audio_record(audio_record)
results = classifier.classify(tensor_audio)
if len(results.classifications) > О:
classification = results.classifications[O]
if len(classification.categories) > О:
top_category = classification.categories[O]
if top_category.category_name == 'Whistling':
print 1'Whistling Detected')
time.sleep(pause_time)
Этот код представляет собой упрощенную версию примера
TensorF\ow,
где, как и
в этом примере, большая часть работы скрыта в классе классификатора звуков
AudioClassifier,
который мы можем использовать в своих программах.
Классификатор звуков
AudioClassifier настраивается с помощью ряда параметров.
Смысл большинства из них понятен из их названия, как, например, в случае пара
метров
max_results (максимум результатов - максимальное количество возвращае
мых результатов) и score_threshold (порог результатов минимальный порог для
возвращаемых результатов). Параметр num_threads (количество потоков) задает ко
личество потоков выполнения (см.рецепт
7.19),
выделяемых для выполнения этого
кода, а параметр enaЫe_edge_tpu (активировать тензорный пррцессор
действуется только в случае подключения к устройству
Edge TPU) за
Raspberry Pi аппаратного
ускорителя машинного обучения.
Приведенная в этом примере программа периодически принимает образцы звука и
на иснове логического вывода пытается выявить в них наличие свиста. При этом
используются накладывающиеся друг на друга интервалы времени, чтобы исклю
чить вероятность того, что какой-либо звук свиста останется незамеченным.
В основном цикле
while
мы проверяем, не подошло ли время выполнить очередную
проверку на наличие свиста. Если это так, то выполняем операцию классификации
звука, и если она выдает какой-либо результат, проверяем, не является ли этот
результат свистом.
Наконец, с помощью функции
Raspberry Pi
time.sleep мы позволяем процессору устройства
заняться другими операциями, пока не подойдет время следующей
операции классификации.
264
Глава
1
9
Дополнительные сведения
Как можно задействовать свой код в случае классификации видео, объясняется
в рецепте
9.2.
9.5. Установка
платформы
Edge lmpulse
Задача
Вы хотите обучить собственную модель машинного обучения с помощью плат
формы машинного обучения
Edge Impulse
и затем использовать ее на устройстве
Raspberry Pi.
Решение
Значительную часть своей работы платформа
компании
Edge Impulse
выполняет на серверах
Edge Impulse, доступ
к которым предоставляется на ее официальном веб
сайте 5 • При этом, как и следовало ожидать, для использования этих серверов вы
должны зарегистрировать там свою учетную запись. В случае некоммерческого
применения с вас не потребуют за это никакой платы.
Обеспечив себе доступ к веб-сайту платформы
установить на устройстве
Raspberry Pi
Edge Impulse,
мы также должны
ее локальный компонент. Но до того, как
приступить к его установке, убедитесь в том, что у вас установлена последняя вер
сия
Raspberry Pi OS
(см.рецепт
3.40).
Сначала выполните в окне терминала следующие команды:
$ curl -sL https://deb.nodesource.com/setup_12.x I sudo bash $ sudo apt install -у gcc g++ make build-essential nodej s sox gstreaшerl. 0-tools
gstreamerl.0-plugins-good gstreamerl.0-plugins-base
gstreamerl.0-plugins-base-apps
$ npm config set user root && sudo npm install edge-impulse-linux -g
--unsafe-perm
Поскольку ручной ввод столь длинных команд требует определенных усилий и
чреват ошибками, лучше скачайте архив используемых в книге примеров кода
в порядке,
описанном в рецепте
3.22,
и скопируйте эти
команды
из
файла
long_commands.txt через буфер обмена.
Нам также нужно обеспечить платформу
действия с Руthоn-кодом. Платформа
NumPy.
$
5
рiрЗ
Edge Impulse интерфейсом для взаимо
Edge Impulse использует Руthоn-библиотеку
Обновите эту библиотеку до последней версии:
install numpy --upgrade
См. http://edgeimpulse.com.
Машинное обучение
1
265
Пояснение
Платформа
Edge Impulse
создана на основе библиотеки машинного обучения
TensorFlow,
которую мы использовали в предыдущих рецеmах. Однако возможно
сти этой библиотеки дополнены в ней привлекательным и удобным веб-интер
фейсом в сочетании с облачными серверами, что существенно упрощает процесс
обучения собственных моделей машинного обучения.
Теперь, когда мы уже установили платформу
Edge Impulse
на устройстве
Raspber-
ry Pi,
мы можем рассмотреть пример ее использования. Этим мы займемся в ре
цепте
9.6.
Дополнительные сведения
Большое количество информации о платформе
Edge Impulse
можно найти на ее
TensorFlow7,
на основе которой
официальном сайте 6 •
Также посетите официальный сайт библиотеки
была создана платформа
9.6.
Edge Impulse.
Распознавание речевых команд
(с помощью облачного сервиса)
Задача
Вам нужно, чтобы устройство
Raspberry Pi
могло распознавать речевые команды
с помощью облачного сервиса.
Решение
Зарегистрировавшись на сайте платформы
локальный
программный компонент на устройстве
Edge Impulse и установив ее
Raspberry Pi, воспользуйтесь
мастером
обучения нейронной сети. После этого вы сможете проверить работоспособность
обученной модели в браузере и запустить ее локально на устройстве
Сначала перейдите по адресу
https://studio.edgeimpulse.com
Raspberry Pi.
и войдите в систему,
используя логин и пароль учетной записи, созданной вами в рецепте
9.5.
Теперь вам надо создать новый проект и дать ему какое-то имя. Сразу после проце
дуры регистрации сайт платформы
тером
New Project Wizard
Edge Impulse
предлагает воспользоваться мас
(Мастер нового проекта). Откажитесь от использования
этого мастера, если он бьm запущен, и вместо этого нажмите кнопку
project (+
дите имя нового проекта- давайте назовем наш первый проект hey
6 См.
7
+ Create new
9.3) вве
pi (Эй, pi!).
Создать новый проект). В открывшемся диалоговом окне (рис.
http://edgeimpulse.com.
См. Ьttps://www.tensorflow.org.
Глава
266
&
9
IDCII INPt• 11
Enter tM name for your new PfOJect
1
h,ypl
Choose your project lypl!:
Q
DIIVt!loper
20 mln Jeb 11rм. 4GB or 4 hours of datl, hmktd collaЬorallOO.
Enterprise
No JоЬ or d•t1 s111, l1rnJ!s, hlgner p<!rfo,m411ct, t11Slom ЫО<Ь. wrn.aюu
С
Рис.
9.3.
Соэдание нового проекта
В качестве типа проекта выберите вариант
rtiHr
пrw
11ro1N t
Edge lmpulse
Developer (Разработчик). Этот бесплат
Edge Impulse с некоторыми огра
ный вариант позволяет использовать платформу
ничениями, которые в нашем случае не вызовут проблем.
Теперь, когда вы щелкнете на кнопке
Create new project
(Создать новый проект),
откроется диалоговое окно для выбора типа обрабатываемых данных. Однако, раз
мы собираемся использовать мастер начальной настройки, закройте это диалоговое
окно, чтобы снова оказаться на странице проекта
hey pi.
Прокрутите содержимое
страницы так, чтобы отобразилась ее нижняя часть, и щелкните на кнопке
getting started wizard
Launch
(Запустить мастер начальной настройки). Появившееся пре
дупреждение о том, что настройки вашего проекта будут сброшены, проигнорируй
те, поскольку это для нас не проблема, и подтвердите свой выбор, щелкнув на
кнопке
Yes
(Да). В результате откроется окно мастера начальной настройки с пред
ложением создать модель за пять минут. Согласитесь с этим предложением, щелк
нув на соответствующей кнопке, в следующем окне укажите, что вы собираетесь
распознавать фразу
hey pi,
и щелкните на кнопке
Next
(Далее) (рис.
Теперь начинается самое интересное. Чтобы устройство
знавать фразу
hey pi
(Эй,
pi !),
9.4).
Raspberry Pi
могло распо
мы должны предоставить ему множество примеров
произнесения нами этой фразы. Чтобы получить эти данные, мастер попросит вас
произносить фразу
hey pi в течение 38 секунд (рис. 9.5). Он также запросит у вас
- дайте свое согласие, щелкнув на соответствующей кнопке.
доступ к микрофону
Машинное обучение
~10] Respondlngtoyourvolce
8
267
)(
You un use !1'\llchlne lurnlna to anatyze complex stre1ms of sensor dat.i ln П!lltlme, for ex.imple. to wake up
whe1I • dlNlc« hears 1n audlble l!llent Let's put thlt lnto practlce, Ьу maldng your df!lllc« llsten to your volce •
sjmllar to how your phone wakes up when lt hears 'ОК. Google' or •неу Slri'.
conanue, enter а word or I short sentence. Try to a~old one syllable words for the Ьest result (examples: ' Hello
Wortd', •неу Slmon' or 'Edae lmpulse').
То
heypl
Next. collect some data
Qultthewlurd
Рис.
(Э/1 О]
То bulld
Collectlng some date
9.4.
Ввод распознаваемой фразы
□ 00
х
your rnachlne leam1ng modl!I Wf! n~ to have some samples of how "hey pr sounds Uke.
Cllck ~ button Ьelow, then glve permlяlon to access your mlcrophone. and say "hey pl" а number of tlmes. Маkе
sure to add-1 second pause Ьetween saytng the sentenc.es.
Кеер
saying "hey pi"
Wilnt to look 1round? No рrоЬ~. Just dои dlls Oll«f1.ly, ilnd dkk 'Contlnue wlth те wturd' v.htn you'n! re;idy for the nбt я:ер.
Рис.
Если платформе
Edge Impulse
9.5.
Сбор звуковых данных
потребуется больше данных, она попросит вас про
извести запись образцов еще раз. Когда количество образцов уже станет достаточ
ным, мастер предложит вам перейти к следующему шагу и добавить дополнитель
ные данные.
268
Глава
9
В качестве дополнительных данных
личать фразу
-
hey pi
используются
у платформы
-
с тем, чтобы нейронная сеть научилась от
от любых других звуков, которые может улавливать микрофон,
образцы
случайных
слов
и
фонового
шума
из
имеющихся
Edge Impulse коллекций таких данных.
Далее мастер предложит вам создать свой импульс. Под импульсом платформа
понимает нейронную сеть (или МО-модель другого типа) вместе
Edge "Impulse
с соответствующим процессом предварительной обработки данных. В ходе созда
ния импульса мы также можем ознакомиться с внутренним устройством модели,
что поможет нам лучше понимать, как это всё работает.
Если вы хотите посмотреть, что скрывается за «фасадом» мастера, просто закройте
его окно, чтобы продолжить его выполнение чуть позже. В качестве примера на
рис.
9.6
показано, как выглядит окно «обозревателя признаков»
где образцы фразы
hey pi,
(Feature explorer),
фонового шума и других случайных фраз представлены
в трехмерном пространстве. В нашем случае все образцы фразы
hey pi
расположе
ны в плотно сгруппированной группе точек, что говорит о том, что импульс обес
печивает высокую степень их распознавания.
Feature explorer (345 samples)
XAxis
ZAxis
YAxis
' VlsuallZatlon layer 1
•
hey_pi
•
•
notse
unknown
"'j I vtsuallzaUon layer 2 "J
heY::Pi·
(Эй, pi!)
7
VlsuallZatlon layer 3
"'1
--t
9
8
I
r- ~~r
- r-
6
~~
- ---г-~ _Ll .~
6
s
Рис.
9.6.
Изучение признаков
Когда вы продолжите выполнение мастера, вам будет предложено перейти к сле
дующему шагу и провести обучение нейросети. Этот процесс займет несколько
минут, в течение которых будет выполняться тонкая настройка весовых коэффици-
Машинное обучение
ентов нейросети,
-
269
до тех пор, пока она не сможет точно распознавать фразу
hey
Теперь мы можем опробовать свой импульс в браузере и посмотреть, насколько
хорошо он работает (рис. 9. 7). Обратите внимание, что перед тем, как предоставить
pi.
нам возможность «поиграться» с импульсом, мастер соберет его в готовый к уста
новке пакет, который впоследствии можно будет установить на устройстве
berry Pi.
[9/10) TaklПJ th4t mod81 for а spin
)(
vou haw: tra ed your ~ now /et'S take kfo, 1 spjn.- Wllt ror 11\е modd to Ьulld. then ckk 'Gl\le acOl!Ss to tile
miaopt1ont", .id see how the modd per/om'ISI
--
4,с)
437
1
Classlfler
..
"rr..,,
HOt1f
ООО
~,.
0.00
0.03
11.n
0 .01
а.в
О.АО
0.00
0.01
u,
0.01
0.00
u,
0.87
0.09
0.1)4
0.01
о.•1
о.и
0 .07
Q.61
0.32
Рис.
9.7.
Проверка импульса
UNUIOWII
Rasp-
270
1
Глава
9
Как можно видеть на рис.
9.7,
каждый раз, когда мы что-то произносим или разда
ется какой-либо шум, импульс классифицирует этот звук как НЕУ _PI (Эй,
NOISE
(шум), или
pi!),
(неизвестный звук), указывая вероятность его при
UNKNOWN
надлежности к каждой из этих категорий. Так, например, в показанном в строке
случае распознанный звук с вероятностью в
низкой вероятностью
-
87%
является фразой
hey pi
488
и с очень
шумом или другим звуком.
Пояснение
Чтобы увидеть, насколько хорошо работает этот способ распознавания речи, по
просите кого-либо из друзей несколько раз сказать
hey pi
(Эй,
pi!)
или сами попро
буйте несколько раз произнести эту или похожую фразу.
Хотя нам удалось добиться действительно впечатляющих результатов, пока что всt!
это реализуется на серверах платформы
Edge Impu\se. Само устройство Raspberry Pi
- оно лишь передает получаемые от микрофона зву
ковые данные платформе Edge Impulse. В рецепте 9. 7 мы поговорим о том, каким
образом можно возложить весь этот процесс на само устройство Raspberry Pi.
практически ничего не делает
Дополнительные сведения
Много полезной документации можно найти на сайте платформы
9.7.
Edge Impulse8 •
Распознавание речевых команд (локальное)
Задача
Вам нужно, чтобы устройство
Raspberry Pi
могло само распознавать речевые ко
манды локально, даже без доступа к Интернету.
Решение
Если вы еще этого не сделали, выполните инструкции, изложенные в рецептах
и
9.5
9.6.
Чтобы созданный нами импульс для распознавания фраз работал на устройстве
Raspberry Pi
локально, следует скачать его на устройство и запустить, используя
средство запуска платформы
Edge Impulse
9.5.
для
Linux,
которое вы уже должны были
установить при выполнении рецепта
Выполните следующую команду
тись без параметра --clean):
$ edqe-impulse-linux-runner --clean
Edge Impulse Linux runner vl.3.5
8
См. https://oreil.ly/QmEWg.
( если
вы делаете это в первый раз, можно обой
Машинное обучение
? What is your user narne or e-mail address
anonymised@email.com
? What is your password? [hidden)
1
271
(edgeiщ:,ulse.com)?
[RUN) Downloading model ...
[BLD) Created build job with ID 2540059
[BLD) Writing teщ:,lates ...
.... lots of build messages
[BLD) Building Ьinary ОК
[RUN) Downloading model ОК
[RUN) Stored model version in /home/pi/.ei-linux-runner/models/93963/v2/model.eim
[RUN) Starting the audio classifier for Simon / hey pi (v2)
[RUN) Pararneters freq 16000Hz window length l000ms. classes
[ 'hey_pi' , 'noise' , 'unknown' )
? Select а microphone USB-Audio - HD Pro Webcarn С920
[RUN) Using microphone hw:2,0
classifyRes llms. { hey_pi: '0.0049', noise: '0.9479', unknown: '0.0472' )
classifyRes Sms. { hey_pi: '0.9590', noise: '0.0001', unknown: '0.0409'
classifyRes Sms. { hey_pi: '0.9899', noise: '0.0000', unknown: '0.0101' )
q
Это достаточно длительный процесс с большим количеством сообщений в терми
нале о завершении этапов сборки, значительную часть которых я здесь опустил для
краткости.
В процессе выполнения этой команды вам потребуется ввести свои учетные данные
для подключения к платформе
Edge Impulse
(адрес электронной почты и пароль).
После этого запустится процесс сборки и скачивания импульса в компактном виде,
подходящем для запуска на устройстве
Raspberry Pi.
Сборка занимает достаточно
много времени, но ее нужно выполнить только один раз.
По завершении процесса сборки надо будет указать, какой микрофон вы хотите ис
пользовать, после чего, устройство
Raspberry Pi
наконец-то начнет «слушать» вас и
сообщать, с какой вероятностью каждый уловленный им образец звука является
фразой
hey pi
(Эй,
pi!).
Пояснение
Действительно приятным моментом здесь является то, что выполненный процесс
сборки и сжатия приводит нашу продвинутую модель машинного обучения к виду,
подходящему для запуска на сравнительно маломощном устройстве
Raspberry Pi.
О том, что собой представляет установленная модель, можно подробно прочитать
в Информационной панели
(Dashboard)
платформы
Edge Impulse.
Потратьте немного времени на изучение представленной там информации. В част
ности, попробуйте выбрать в расположенном слева меню команду
(Дизайн импульса)
1
Transfer Learning (Перенос
обучения) (рис.
Impulse Design
9.8).
Глава
272
9
Model"VбSIOn: ф
Model
[ Qшnt!Пd (1..Щ •]
Last tr1lnln, performмc:e IViAcliUon иu
•
•
ACC\JRACV
95.4%
Confuslan matrlx tv3lldallonsel)
-
НЕУ
НЕТ
PI
NOIИ
PI
lOSS
0.34
NOISE
UNI.NOWN
см
UНkHOWH
1А1{
055
f1 SCORE
о.9.5
11.'8
feature u:plorer (full tralnins 5et) ф
•
•
•
•
tlly.J)l • cwrect
naise - tilm!l:t
unknown - Ш1'ТЮ
•
•
rlOIIR• incoщc;t
...,,._, - lnmrRrt
hlyJll • Ь!On'ect
10
<
.
{
g-:,
i.
~
"'
9
8
1
ь
s
OR-device perform11nu Ф
INHI\EЖING ТIМЕ
о
l"EAXIIANUSAGE
•
15ms.
Рис.
9.8.
.
45.ОК
FUWIUSAGE
122.7К
Описание установленного импульса
Как вы можете видеть, наряду с другой полезной информацией здесь указано, что
для установленного импульса требуется лишь
45
килобайт оперативной и
123
ки
лобайта долговременной памяти.
Хотя теперь мы уже можем запустить импульс непосредственно на устройстве
Raspberry Pi,
бьшо бы еще лучше научиться делать это из Python-кoдa, чтобы ис
пользовать платформу
в рецепте
Edge Impulse
в своих проектах. Как раз этим мы и займемся
9.8.
Дополнительные сведения
Документацию по средству запуска платформы
ти по адресу
https://oreil.ly/9gCre.
Edge Impulse
для
Linux
можно най
Машинное обучение
273
Реагирование на речевые команды
9.8.
в Python-кoдe
Задача
Как бы прекрасно ни работала система распознавания фраз на базе платформы
Impulse,
Edge
вы хотите пойти еще дальше и добиться того, чтобы речевые команды
запускали то или иное действие в написанном вами Python-кoдe.
Решение
Прежде всего установите платформу
Edge Impulse и создайте
9. 5 и 9. 6.
обученный импульс,
следуя инструкциям, изложенным в рецептах
Затем установите комплект средств разработки
Python SDK:
sudo apt install libatlas-base-dev libportaudioO libportaudio2 libportaudiocppO
portaudio19-dev
$ рiрЗ install edge_impulse_linux -i https://oreil.ly/ualnS
$
Необходимо также обновить версию Руthоn-библиотеки
дуль
и установить мо
PyAudio:
$ рiрЗ
$
NumPy
рiрЗ
install numpy --upgrade
install pyaudio
После этого можно скачать обученную модель с сервера платформы
Edge Impulse,
выполнив следующую команду:
$ edge-impulse-linux-runner --download modelfile.eim
Представленная далее программа 09_hey_pi.py выводит сообщение Hello you 1 (При
вет вам!) каждый раз, когда «слышит» фразу
hey pi
(Эй,
pi!).
Перед тем как ее за
пустить, укажите в строке audio_device_id = 2 вместо цифры 2 номер используемого
вами микрофона:
import sys
import signal
from edge_impulse_linux.audio import AudioimpulseRunner
modelfile = '/home/pi/modelfile.eim'
audio- device - id = 2
runner = None
def signal_handler(sig, frame):
print (' Interrupted')
if (runner):
runner. stop ( 1
sys.exit (О)
274
Глава
1
9
signal.signal(signal.SIGINT, signal_handler)
with AudioimpulseRunner(modelfile) as runner:
try:
model_info = runner.init()
labels = model_info['model_parameters'] ['labels']
print ( 'Loaded runner for "' + model _ info [ 'proj ect' ] [ 'owner' ] + ' / ' +
model _info [ 'proj ect' ] [ 'name' ) + "" )
for res, audio in runner.classifier(device_id=audio_device_id):
score = res [ 'resul t' ] [ 'classification' ] [ 'hey_pi' ]
if (score > 0.7):
print ( 'Hello you ! ')
finally:
if (runner):
runner. stop ()
Запустите эту программу и попробуйте произносить различные фразы с тем, чтобы
определить, насколько точно она распознает фразу
$ pythonЗ 07_hey_pi.py
Loaded runner for "Simon /
selected Audio device: 2
Hello you!
Hello you!
Hello you!
Неу
hey pi
(Эй,
pi!):
Pi"
Пояснение
Эта программа использует возможности класса AudioimpulseRunner из Руthоn-биб
лиотеки компании
Edge Impulse.
Указанный класс реализует средство запуска им
пульса, которое периодически прослушивает и пытается классифицировать звуко
вые образцы. В нашем случае мы пытаемся определить, была ли произнесена фраза
hey pi
(Эй,
pi!).
Поскольку средство запуска импульса удерживает микрофон в ка
честве своего ресурса, для корректного выхода из программы с высвобождением
задействованного аудиоустройства используется комбинация клавиш
<Ctrl>+<C>.
Это реализуется путем привязки функции-обработчика signal _handler к сигналу опе
рационной системы
клавиш
signal. SIGINT (который генерируется при нажатии комбинация
<Ctrl>+<C> ).
Внутри блока
wi th/ as мы сначала инициализируем средство запуска импульса
runner. ini t (1, а затем отображаем информацию об используемой
с помощью метода
модели.
Цикл for перебирает бесконечную последовательность результатов, предоставляе
мых методом
runner.classifier.
Мы заносим в переменную
что текущий образец звука является фразой
hey pi
(Эй,
pi!),
score
вероятность того,
и если эта вероятность
Машинное обучение
больше чем
0,7,
выводим сообщение нello you! (Привет вам!).
низкий порог, поэтому устройство
фразу
hey pi
до 0,95.
(Эй,
pi!),
Raspberry Pi
0,7 -
1
275
достаточно
будет часто отвечать не только на
но и на похожие фразы. Попробуйте увеличить это значение
Дополнительные сведения
Хотя в рассмотренном случае мы при распознавании фразы просто выводим сооб
щение, ничего не мешает нам использовать этот способ распознавания речи для
управления оборудованием с помощью контактов
GPIO
(см. рецепт
лизации некоторых рецептов домашней автоматизации из главы
18.
10.1)
или реа
ГЛАВА
10
Основы работы
с оборудованием
1О.О.
Введение
Эта глава содержит базовые рецепты настройки и использования разъема GPIO
(General-Purpose Input/Output, ввод/вывод общего назначения), которым снабжены
устройства Raspberry Pi. Такой разъем позволяет подключать к Raspberry Pi всевоз
можную внешнюю электронику.
10.1. Знакомство с
разъемом
GPIO
Задача
Вы хотите подключить внешнюю электронику с помощью разъема
GPIO,
но снача
ла вам нужно разобраться с назначением его контактов.
Решение
Существуют три версии разъема
GPIO: две 26-контактные версии, которые уста
Raspberry Pi, и одна 40-контактная версия, которая
остальных моделях Raspberry Pi, начиная с моделей со зна
навливались в первые модели
используется во всех
ком«+».
Модели
Raspberry Pi
с 26-контактным разъемом уже представляют собой скорее
раритетный экспонат, чем пригодный для практического использования компью
тер, поскольку работают достаточно медленно и несовместимы с современными
версиями многих программ. Поэтому для практического применения лучше приоб
рести модель
Raspberry Pi 4 или 400
или, по крайней мере,
Современная 40-контактная версия разъема
Raspberry Pi 3.
l 0.1 - та
Raspberry Pi, начиная
Raspberry Pi 4 и 400.
GPIO
представлена на рис.
ким разъемом комплектуются все 40-контактные модели
с моделей со знаком
Первые
«+»
26 контактов
Raspberry Pi модели В
и заканчивая моделями
расположены в нем так же, как и в ранних устройствах
второй ревизии
но с 40-контактными моделями
(rev2). Это позволяет использовать совмест
Raspberry Pi оборудование и программное обеспе
чение, предназначенное для ранних 26-контактных моделей. Группа дополнитель
ных контактов 40-контактного разъема содержит три контакта для подключения
«земли»
(GND)
и девять выводов
GPIO.
Контакты
1D_ SD
и
1D_ SC
обеспечивают
связь с микросхемами последовательной памяти, входящими в состав интерфейс-
Основы работы с оборудованием
ных плат стандарта НА Т
1
277
(Hardware Attached on Тор, оборудование, устанавливае
Raspberry Pi идентифицировать такую плату
мое сверху), позволяя устройству
(подробности см. в разд. «Пояснение»).
33V 0 0 SV
2SDA OO 5V
ЗSCL 0 0 GND
4OO14ТХО
GND 0015 RXD
170018
27 0 0 GND
В устройствах
Raspberry Pi
модели В
второй ревизии (геv2)
220023
з.зv 0 0 24
IOMOSI 0 0 GND
9MIS0 0025
11SCKL 0 0 8
GN0 007
•• • • • • •• • • • •• •• • • • • • • io_so □-□· io_sc·
Только в устройствах
Raspberry Pi
модели В+
и более поздних
моделей
Рис.
10.1.
SOO GND
60012
BOO GND
19 0016
26 0020
GND 0021
Расположение выводов разъема
GPIO
(40-контактная версия)
На первых местах разъема расположены выводы для подключения напряжения пи
тания
3,3
В и
5
сигнала в
3,3
В. Все контакты с номерами могут использоваться в качестве контак
тов
GPIO.
В. Все входные и выходные контакты
GPIO
рассчитаны на уровень
Контакты, у которых, помимо номера, есть и другое обозначение, также
дополнительно имеют свое особое назначение:
14 TXD
и
15 RXD -
выводы для
подключения соответственно передающей и принимающей линий последователь
ного интерфейса, 2 SDA и 3 SCL - выводы интерфейса 1 2 С; 1О MOSI, 9 MISO и
11 SCKL Г
_
выводы интерфейса
Только 3 В
Хотя разъем
3 В (а точнее, 3,3 В)
5 В, не стоит думать, что к Raspberry Pi можно подключать
- • 5-вольтовую электронику. Несмотря на то что устройство Raspberry Pi может подавать 5 В на внешнюю электронику, уровень сигнала на всех его контактах GPIO не
должен превышать 3 В - в противном случае оно может выйти из строя. Подача
5 В на контакт GPIO обычно выводит из строя этот контакт, а зачастую и весь про
цессор устройства Raspberry Pi.
GPIO
позволяет подключать и напряжение питания
и напряжение питания
'--
SPI.
Глава
278
10
Пояснение
При поиске нужных контактов на устройстве
Raspberry Pi
можно легко допустить
ошибку, если делать это просто путем отсчитывания контактов от края разъема.
Существенно упростить поиск нужных контактов позволяет использование шабло
на для разъема
например, шаблона
GPIO -
Рис.
10.2.
Шаблон
Raspberry Leaf (рис. 10.2).
Raspberry Leaf для
разъема
GPIO
Надев этот шаблон на выводы разъема
GPIO, вы можете увидеть, для чего предна
Raspberry Leaf, можно использовать и ряд
названием Pi GPIO.
значен каждый из них. Помимо шаблона
других вспомогательных шаблонов с
Модели
Raspberry Pi 4, 3, 2,
В+, А+ и
Zero
поддерживают новый стандарт интер
фейса НА Т. Не накладывая никаких ограничений на использование контактов
GPIO
напрямую, этот стандарт позволяет подключать соответствующие ему ин
терфейсные платы, которые иногда называют шапкаиu (от англ.
обычных плат расширения для
устанавливается миниатюрный
hat, шапка). От
Raspberry Pi «шапки» отличаются тем, что на них
чип EEPROM (электрически стираемого програм
мируемого
постоянного запоминающего устройства)
Raspberry Pi
могло идентифицировать подключенную к нему «шапку» и, в перспек
с тем,
чтобы
устройство
тиве, автоматически устанавливать необходимое программное обеспечение. Хотя
на момент подготовки этой книги платы расширения стандарта НА Т еще не ис
пользовались на столь продвинутом уровне, это очень разумная идея. Для связи
с
установленной
Raspberry Pi
на
«шапке»
выделены контакты
микросхемой
ID _ SD
и
памяти
EEPROM
на
устройстве
ID_ SC.
Дополнительные сведения
Разъем
GPIO
устройств
Raspberry Pi
обладает только цифровыми входами и выхо
дами, у него нет аналоговых входов, имеющихся у некоторых других аналогичных
Основы работы с оборудоввнивм
1
279
устройств . Обойти эту проблему можно путем использования резистивных датчи
ков ( см. рецепт 14. 1) или отдельной микросхемы аналого-цифрового преобразова
теля (см.рецепт
14. 7).
Ознакомиться с примером использования платы расширения стандарта НА Т мож
но, обратившись к рецепту 10.15, посвященному основам работы с платой Sense
НАТ.
10.2. Использование разъема GPIO
на устройстве Raspberry Pi 400
Задача
Имея дело с моделью Raspberтy
Pi 400,
работать с разъемом
GPIO
неудобно, пото
му что он расположен с задней стороны устройства и утоплен в корпус. Как можно
упростить использование этого разъема?
Решение
На устройствах Raspberтy Pi 400 установлен разъем GPIO с таким же расположени
ем выводов, как у других 40-контактных устройств Raspberтy Pi. Чтобы упростить
подключение к нему соединительных проводов, воспользуйтесь переходником дr1я
разъема
GPIO
устройств Raspberтy
переходником компании
Pi 400 -
например, показанным на рис.
MonkМakes 1 •
m
• •
Рис .
1
переходника для разъема GPIO устройств
совместно с шаблоном для разъема GPIO
10.3. Использование
См. https://oreil.ly/Nb5ez.
Raspberry Pi 400
10.3
Глава
280
10
На рынке имеются и другие виды переходников для разъема
SparkFun, Pi Hut
GPIO -
компаний
и других производителей.
Пояснение
Вы вряд ли будете использовать достаточно громоздкое и сравнительно дорогое
устройство
Raspberry Pi 400
для реализации проектов встраиваемой электроники.
Но если вы собираетесь подключать к нему внешнюю электронику просто с целью
ее изучения, то для этого лучше использовать переходник, чем пытаться напрямую
подключать соединительные провода с задней стороны устройства
Переходник для разъема
и в том случае, если вы хотите подклю
чить к
стандарта НА Т,
ную
GPIO потребуется
Raspberry Pi 400 плату расширения
на рис. 10.4 плату Sense НА Т.
Raspberry Pi 400.
Рис.
10.4.
Устройство
Raspberry Pi 400
-
например, показан
с подключенной к нему платой
Sense
- - ..
'1.1
о,
...
Jt H
Рис.
10.5.
Плата
Air Quality
для устройств RaspЬerry
Pi 400
НАТ
Основы работы с оборудованием
1
281
Существует очень немногочисленная по составу разновидность плат расширения,
специально предназначенных для подключения к
гии компании
(В терминоло
Raspberry Pi 400.
(bonnet)). При
мерами таких плат могут служить платы Air Quality (рис. 10.5), Breakout Garden для
Raspberry Pi 400 компании Pimoroni и Cyberdeck Bonnet компании Adafruit.
Adafruit
эта разновидность плат называется чепчиком
Дополнительные сведения
Более подробную информацию о плате
найти в рецепте
10.3. Как не
НА Т, показанной на рис.
Sense
10.4,
можно
10.15.
вывести из строя
при использовании
Raspberry Pi
разъема GPIO
Задача
Вы хотите исключить вероятность повреждения или выхода из строя устройства
Raspberry Pi
при подключении к нему внешней электроники.
Решение
Чтобы снизить вероятность повреждения устройства
нии разъема
♦
GPIO,
GPIO
при включенном устройстве
♦
напряжение питания устройства
не подавайте более
(GND)
3,3
GPIO
или к ма
Raspberry Pi;
Raspberry Pi
всегда подключайте заземляющий контакт
земляющему контакту
♦
Raspberry Pi;
не подключайте электронные компоненты к контактам разъема
кетной плате при включенном устройстве
♦
при использова
не прикасайтесь отверткой или другими металлическими предметами к контак
там разъема
♦
Raspberry Pi
соблюдайте следующие простые правила:
не должно превышать
(GND)
устройства
5 В;
Raspberry Pi
к за
подключаемого устройства;
В на контакты разъема
GPIO,
используемые в качестве
входов;
♦
потребляемый ток на каждом выходе не должен превышать
требляемый ток всех выходов не должен превышать
и
♦
50
мА для 26-контактных моделей
16
мА, общий по
мА для 40-контактных
Raspberry Pi;
используя светодиоды, учтите, что для достаточно яркого свечения красного
светодиода вполне достаточно тока в
3
мА при последовательном включении со
светодиодом резистора с сопротивлением
♦
100
для
Raspberry Pi
моделей
1, 2
и
3
общий потребляемый ток на 5-вольтовых
линиях питания не должен превышать
тания
5
4 70 Ом;
250
В подается напрямую от разъема
мА. На
USB,
Raspberry Pi 4
напряжение пи
и потому максимальный потреб
ляемый ток здесь зависит от того, какой источник питания вы будете использо-
282
1
Глава
10
вать. В частности, если источник питания выдает
должен превышать
3
А, потребляемый ток не
1 А.
Пояснение
Надо сказать, что мини-компьютер
Raspberry Pi
можно достаточно легко повредить
при подключении к нему внешней электроники. Более новые модели обладают чуть
большим запасом прочности в этом плане, но по-прежнему остаются достаточно
легкоуязвимыми. Поэтому, чтобы не повредить свое устройство
Raspberry Pi,
про
являйте осторожность и проверяйте правильность всех произведенных подключе
ний до его включения.
Дополнительные сведения
Информацию о нагрузочной способности разъема GPIO, используемого в устрой
ствах Raspberry Pi, можно найти по адресу https://oreil.ly/RGot4.
10.4. Настройка
интерфейса 1 2 С
Задача
Вы хотите настроить шину
схема) с тем, чтобы к
I2c (Inter-Integrated Circuit, взаимно интегрированная
Raspberry Pi можно было подключать платы расширения,
использующие этот интерфейс.
Решение
В последних версиях Raspberry Pi OS для активации интерфейса 1 2 С нужно просто
воспользоваться инструментом Raspberry Pi Configuration (Конфигурация
Raspberry Pi). Выполните в меню устройства Raspberry Pi команду Preferences (На
стройки) Raspberry Pi Configuration (Конфигурация Raspberry Pi), переведите на
вкладке Interfaces (Интерфейсы) (рис. 10.6) в активное положение переключатель
UC и нажмите кнопку ОК.
1
Если вы используете более старую версию
Raspberry Pi OS
или просто предпочи
таете делать все в командной строке, воспользуйтесь консольной утилитой
config
$
raspi-
и запустите ее с помощью команды:
sudo raspi-config
В открывшемся меню выберите опцию
сов), а затем
-UC,
Interfacing Options
10.7.
(Параметры интерфей
как показано на рис.
Затем подтвердите свое согласие с активацией интерфейса I2c и загрузкой модулей
с интерфейсом I2c на этапе начальной загрузки, дважды ответив Yes (Да).
На этом этапе также можно установить Руthоn-библиотеку для работы с интерфей
сом 1 2 С, выполнив команду:
$
sudo apt install
python-smЬus
Основы работы с оборудованием
283
VNC:
SPI:
12С:
Serial Port
Serial Console·
1-Wire;
RemoteGPIO
Cancel
Рис. 10.6. Активация интерфейса 1 2 С с помощью инструмента Raspberry Pi Configuration
Raspberry Pi Software Configurat ion Toot (raspi-config)
You may need to configure overscan
Set the visiЫe na111e for this Pi о
Change the amount of memory made а
Enabte/OisaЫe remote command tine
EnaЫe/OisaЫe the use of Device т
Enabte/DisaЫe automatic toadina о
йi3Ф•Mi1.iWl•l№IAIФwiie61:J
EnaЫe/DisaЫe she\t and kerne\ me
Force audio out through HDМI or з.
Update this toot to the tatest ver
Al Overscan
А2 Hostna111e
АЗ Me111ory Split
А4 SSH
А5 Oevice Tree
Аб SPI
7 12(
А8
А9
Ае
Seriat
Audio
Update
<Setect>
<Back>
Рис. 10.7. Активация интерфейса 1 2 С с помощью утилиты raspi - con fi g
После этого перезагрузите устройство
Raspberry Pi,
чтобы внесенные изменения
вступили в силу.
Пояснение
Использование модулей с интерфейсом 1 2 С - весьма неплохой способ обеспечения
взаимодействия Raspberry Pi с внешними устройствами. Этот подход позволяет
снизить количество соединительных проводов (всего до четырех) и предоставляет
вам выбор из большого количества хорошо спроектированных модулей .
В то же время при использовании таких модулей необходимо следить за тем, чтобы
их общий потребляемый ток не превышал пределы , указанные в рецепте
1О. 3.
В качестве примера на рис. l 0.8 представлен ряд I2С-модулей компании Adafruit.
Подобные устройства выпускают и другие производители
Sparkfun.
-
например, компания
284
Глава
10
Рис. 10.8. 1 2 С-модули (слева направо): два светодиодных матричных дисплея,
четырехзначный семисегментный светодиодный дисплей,
16-канальный ШИМ-контроллер для сервоприводов, модуль часов реального времени
В виде I2С-модулей также выпускаются радиопередатчики FМ-диапазона, ультра
звуковые дальномеры, ОLЕD-дисплеи и различные типы датчиков.
Дополнительные сведения
Примеры использования I2С-модулей рассмотрены в рецептах 12.3, 15.1 и 15.2.
10.5. Использование
пакета
i2c-tools
Задача
Вы подключили 1 2 С-устройство к Raspberry Pi и теперь хотите убедиться в том, что
оно подключено правильно, а также определить, какой I2С-адрес следует использо
вать для взаимодействия с ним.
Решение
У становите и используйте пакет
i2c-tools.
~ i В новых дистрибутивах пакет i2c-tools, как правило, входит в состав предустанов
-
ленного программного обеспечения.
Чтобы скачать и установить пакет i2c-tools на устройстве
Raspberry Pi,
сначала в окне терминала команду:
$
sudo apt install i2c-tools
Затем подключите I2С-устройство к Raspberry Pi и выполните команду:
$
sudo i2cdetect
-у
1
выполните
Основы работы с оборудованием
Обратите внимание, что в случае старого устройства
(rev l)
Raspberry Pi
285
первой ревизии
вместо 1 здесь следует поставить о.
Если на вашем устройстве активирован интерфейс I2c, то вывод этой команды
будет выглядеть примерно так, как показано на рис.
здесь мы видим, что
10.9, -
активны два I2С-адреса: ОхбВ и Ох70.
Рис.
10.9.
Использование пакета
i2c-tools
Шестнадцатеричные числа
-
Шестнадцатеричной называется система счисления, в которой в качестве основания
используется число
16,
а не
10,
как в обычно используемой нами десятичной системе.
Каждый разряд шестнадцатеричного числа может принимать одно из
16
значений, которые обозначаются цифрами от О до
где А соответ
ствует десятичному числу
1О,
а
F-
9
и буквами от А до
десятичному числу
F,
возможных
15.
Использование шестнадцатеричных чисел вместо десятичных имеет смысл лишь в том
редком
случае,
когда
используемые значения
нужно приводить
к двоичному
виду,
-
шестнадцатеричные числа гораздо легче поддаются такому преобразованию.
Во избежание путаницы между десятичным и шестнадцатеричным представлением чи
сел шестнадцатеричные числа принято записывать с префиксом Ох. Так, в рассмотрен
ном здесь примере речь идет о шестнадцатеричных числах Ох68 и Ох70, десятичное
значение которых составляет соответственно
6
х
16 + 8 = 104
и
7
х
16 = 112.
Пояснение
i2cdetect -
очень полезная диагностическая утилита, которую стоит запускать по
сле подключения каждого нового I2С-устройства.
Вы должны проследить за тем, чтобы и I2С-устройство, и работающее с ним про
граммное обеспечение использовали один и тот же I2С-адрес. Некоторые устройст
ва позволяют изменить свой I2С-адрес с помощью небольшого переключателя или
перемычки. Это особенно полезно при подключении к
устройств, пытающихся использовать один и тот же адрес.
Raspberry Pi
нескольких
286
1
Глава
10
Дополнительные сведения
Обратите также внимание на примеры использования I2С-модулей, рассмотренные
в рецептах
12.3, 15.1
В рецепте
3.17
мощью утили1ы
и
15.2.
рассказано о том, как можно произвести установку пакетов с по
apt.
10.6. Настройка
интерфейса
SPI
Задача
Вы хотите подключить к
Peripheral Interface,
Raspberry Pi
устройство, использующее шину
SPI (Serial
последовательный периферийный интерфейс).
Решение
По умолчанию в
Raspberry Pi OS
интерфейс
SPI
не активирован . Процедура его ак
тивации выглядит практически так же, как и описанная в рецепте 1О. 4 процедура
активации интерфейса 1 2 С. Выполните в меню устройства Raspberry Pi команду
Preferences (Настройки) 1 Raspberry Pi Configuration (Конфигурация Raspberry
Pi), переведите на вкладке Interfaces (Интерфейсы) (рис . l 0.1 О) в активное положе
ние переключатель SPI и нажмите кнопку ОК.
VNC:
SPI:
12С:
Serial Port
Serial Console:
1-Wire:
Remote GPIO:
Clnall
Рис.
10.10. Активация
интерфейса
SPI
О1(
с помощью инструмента настройки
Если вы используете одну из более старых версий
Raspberry Pi
Raspberry Pi OS
или просто
предпочитаете все делать в командной строке, воспользуйтесь консольной утили
той raspi-config:
$ sudo raspi-config
Основы работы с оборудованием
В открывшемся меню выберите опцию
сов), а затем
-
SPI.
Оrветьте
Yes
Interfacing Options
287
(Параметры интерфей
(Да) на следующий вопрос, и устройство
пойдет на перезагрузку. После перезагрузки интерфейс
Raspberry Pi
1
SPI
уже будет
активен.
Пояснение
Интерфейс
SPI позволяет
Raspberry Pi
устройством
обеспечить последовательный обмен данными между
и такими периферийными устройствами, как аналого
цифровые преобразователи, расширители портов (позволяющие увеличить количе
ство доступных контактов
GPIO)
Убедиться в том, что интерфейс
и т. п.
SPI
был успешно активирован, можно с помощью
команды:
ls /dev/*spi*
/dev/spidevO.O /dev/spidev0.1
$
Если эта команда не сообщает о наличии устройств
но здесь в ее выводе, значит, интерфейс
SPI
spidevO. о и spidevO .1, как показа
не был активирован.
Дополнительные сведения
Пример использования микросхемы аналого-цифрового преобразователя с интер
фейсом
SPI рассматривается
в рецепте
14. 7.
10.7. Установка библиотеки pyserial для
обеспечения
доступа к последовательному порту из Python-кoдa
Задача
Вы хотите использовать передающую и принимающую линии последовательного
порта устройства
Raspberry Pi
(выводы
RXD
и
TXD),
делая это из Python-кoдa.
Решение
Активируйте последовательный порт, как описано в рецепте
лиотеку
$ sudo
2. 6,
и установите биб
pyserial:
рiрЗ
install pyserial
Пояснение
Эта библиотека достаточно проста в использовании. Для создания нового соедине
ния используется следующий синтаксис:
ser
=
serial.Serial(DEVICE, BAUD)
Глава
288
где DEVICE а
BAUD -
10
устройство, на которое в
Linux
отображается последовательный порт,
числовое значение скорости передачи данных в бодах (битах в секун
ду). Контакты
RXD
и
TXD
разъема
GPIO
отображаются в
Linux
на устройство
/dev/serial0, а используемое большинством устройств стандартное значение скоро
сти передачи данных составляет
9600:
ser = serial.Serial('/dev/serial0', 9600)
После установки соединения вы можете отправлять данные через последователь
ный порт следующим образом:
ser.write('some text')
Для получения ответа обычно нужно производить чтение и вывод данных в цикле:
while True:
print(ser.read())
Дополнительные сведения
Вам потребуется использовать этот подход в ряде рецептов, предполагающих под
ключение оборудования к последовательному порту, включая, в частности, ре
цепт
13.10.
10.8. Установка утилиты Minicom
для тестирования последовательного порта
Задача
Вы хотите передавать и принимать данные через последовательный порт, делая это
в окне терминала.
Решение
У становите утилиту
Minicom:
$ sudo apt install minicom
После установки утилиты
Minicom
вы можете начать сеанс связи с последователь
ным устройством, подключенным к контактам
RXD
и
TXD
разъема
GPIO,
выпол
нив следующую команду:
$ minicom
-Ь
9600
-о
-D /dev/serial0
После параметра -ь здесь указывается скорость передачи данных в бодах, а после
параметра -о
-
обозначение последовательного порта. В этой команде нужно ука
зать ту же скорость передачи данных, на которой работает то устройство, с кото
рым вы пытаетесь связаться.
После выполнения этой команды запустится сеанс утилиты
особенностью программы
Minicom
Minicom.
Странной
(которой уже очень много лет) является то, что
Основы работы с оборудованием
1
289
по умолчанию она не отображает вводимые команды на экране . Поэтому после ее
запуска необходимо, прежде всего , включить режим отображения вводимых сим
волов (локальное э хо) , чтобы вы могли видеть вводимые вами команды. Для этого
<Ctrl>+<A>, а затем - клавишу <Z>. На экране по
10. 11 ). Нажмите теперь клавишу <Е> , чтобы включить
нажмите комбинацию клавиш
явится список команд (рис.
локальное эхо (l oca l Echo) .
Рис.
10.11.
Команды утилиты
Minicom
После этого вы будете видеть все те команды, которые станете отправлять на по
следовательное устройство, и все те сообщения, которые будут от него поступать .
Пояснение
С помощью утилиты
Minicom
можно легко проверить, какие сообщения поступают
от последовательного устройства, и таким образом убедиться в его работоспособ
ности.
Дополнительные сведения
Ознакомиться с документацией по утилите
Minicom
можно по адресу
https://oreil.ly/fVКAF.
Если
вам
нужно обеспечить управление
последовательными соединениями
Python-кoдa, воспользуйтесь Руthоn-библиотекой pyseria l (см. рецепт
10. 7).
из
290
1
Глава
10
10.9. Использование
макетной платы
и соединительных проводов
Задача
Вы хотите заняться прототипированием электроники с использованием
Pi
Raspberry
и беспаечной макетной платы.
Решение
Используйте соединительные провода типа « штырь-гнездо» и шаблон для разъема
GPIO, указывающий
(рис. 10.12).
назначение
его
контактов ,
например,
-
Raspberry Leaf
...
..
.-....
-.
-.
·~~:..::.:..:;.::.;:.;=--:-:--:-:
Рис.
10.12.
-
Подключение устройства
•
Raspberry Pi
к макетной плате
с помощью соединительных проводов типа «штырь-гнездо»
Пояснение
Найти нужные контакты на плате мини-компьютера
Raspberry Pi
в ее «чистом ви
де» не всегда просто . Вы можете существенно упростить для себя эту задачу, рас
печатав такой шаблон, как
Raspberry Leaf, и
надев его на контакты.
Весьма полезно также обзавестись некоторым количеством соединительных прово
дов типа «штырь-штырь» для соединения друг с другом различных точек макетной
платы .
Основы работы с оборудованием
1
291
Соединительные провода типа «гнездо-гнездо» могут пригодиться в том случае,
когда электронные модули надо подключать к штырькам устройства
Raspberry Pi
напрямую и в использовании макетной платы нет необходимости в силу отсутствия
других компонентов.
Чтобы одновременно приобрести макетную плату, шаблон
торое
количество
стартовых
соединительных
комплектов,
проводов,
содержащих
Project Бах 1 for Raspberry Pi
я
макетную
компании
Raspberry Leaf
рекомендую
плату,
-
вам
купить
например,
и неко
один
из
комплект
MonkMakes 2 .
БХВ-Электроника
Российские читатели книги могут приобрести многие нужные им компоненты электрон
ных схем в разделе «БХВ-Электроника» сайта издательства «БХВ» по адресу
https://
bhv.ru/elements/.
Дополнительные сведения
В рецепте
подробно рассматривается пример подключения светодиода с ис
11.1
пользованием макетной платы.
10.1 О.
Использование
«осьминожного» модуля
Raspberry Squid
Задача
Вы хотите подключить к
Raspberry Pi
RGВ-светодиод, не прибегая к использова
нию макетной платы.
Решение
Используйте «осьминожный» модуль с RGВ-светодиодом
Модуль
Raspberry Squid
Raspberry Squid (рис. 10.13).
состоит из RGВ-светодиода с последовательно включен
ными с ним резисторами и соединительными проводами с гнездовыми контактами,
что позволяет напрямую подключать его к штырькам разъема
Raspberry Pi.
GPIO
на устройстве
Назначение соединительных проводов обозначено с помощью цвето
вой маркировки. Черный провод должен быть подключен к одному из заземляю
щих контактов
(GND) разъема GPIO, а красный, зеленый и синий провода - к кон
GPIO, используемым для передачи сигнала красного, зеленого и
тактам разъема
синего цвета. По каналам красного, зеленого и синего цвета можно передавать как
обычные цифровые сигналы, так и сигналы, подвергаемые широтно-импульсной
модуляции (ШИМ) (см. рецепт
2
См. https://oreil.ly/ldYBL.
11.3),
что позволяет смешивать разные цвета.
292
Глава
10
Рис.
10.13.
Модуль
Raspberry Squid
Такой «осьминожный» модуль можно не только купить в готовом виде3, но и со
брать самостоятельно, следуя соответствующей инструкции4.
Наряду с прочим в число предустановленных программ в
Raspberry Pi OS
входит
Руthоn-библиотека gpiozero, которая предоставляет поддержку для таких RGВ-све
тодиодов, какие используются в модуле
Raspberry Squid.
Приведенная далее программа демонстрирует весь тот синтаксис, который вам по
требуется при использовании модуля
Raspberry Squid.
При желании вы можете ска
чать рассматриваемый здесь пример кода ( ch_1O_squid_test.py) в порядке, описанном
в рецепте
3.22.
fran gpiozero import RGBLED
from time import sleep
from colorzero import Color
led = RGBLED(l8, 23, 24)
led.color = Color ( 'red')
sleep(2)
3
См. http://monkmakes.com.
4
См. https://oreil.ly/ВApSy.
Основы работы с оборудованием
1
293
led. color = Color ( 'green')
sleep(2)
led. color
=
Color ( 'Ыuе')
=
Color ( 'white')
sleep(2)
led.color
sleep(2)
Импортировав все необходимые нам библиотеки, мы создаем новый объект RGBLED,
передавая ему номера тех трех контактов, которые следует использовать для кана
лов красного, зеленого и синего цвета (в нашем случае это контакты
18, 23
и
24).
После этого мы можем задавать цвет свечения с помощью команды led.color
в правой части которой указывается цветовое значение.
Такое цветовое значение задается с помощью класса Color из библиотеки colorzero.
Этот класс позволяет указывать либо название цвета, как сделано в приведенном
примере, либо числовые значения красной, зеленой и синей составляющих цвета.
Например, задать красный цвет свечения также можно следующим образом:
led.color = Color(255,
О,
О)
Задав цвет свечения, мы используем команду time.sleep(2), чтобы создать двух
секундную задержку перед переключением на другой цвет.
Пояснение
Вы можете использовать только один, а не все три цветовых канала «осьминожно
го» модуля. Это очень удобно в том случае, когда нужно просто убедиться в том,
что определенный контакт
GPIO
перед подключением к нему какой-либо другой
электроники должным образом включается и выключается.
Дополнительные сведения
Обратите также внимание на рецепт
ножного» модуля кнопки
В рецепте
11.11
10.11,
посвященный использованию «осьми
Squid Button.
рассматривается еще один пример использования RGВ-светодиода
(с подключением его в виде «осьминожного» модуля или в виде компонента на
макетной плате).
10.11. Использование «осьминожного»
кнопки Raspberry Squid Button
модуля
Задача
Вы хотите подключить к
Raspberry Pi
пользованию макетной платы.
кнопочный переключатель, не прибегая к ис
Глава
294
10
Решение
Используйте «осьминожный» модуль кнопки
Модуль
Squid Button
Squid Button (рис . 10.14).
представляет собой обычную нажимаемую кнопку, к выводам
которой подключены соединительные провода с гнездовыми контактами, что по
зволяет напрямую подключать его к разъему
на устройстве
GPIO
Raspberry Pi.
В состав этого модуля также входит низкоомный резистор, который служит для
ограничения величины тока в случае случайного подключения модуля к цифровому
выходу, а не к цифровому входу .
Рис .
10.14.
Модуль
Squid Button
Библиотека gpi ozer o позволяет использовать модуль
Squid Button
напрямую , как
показано в представленном далее примере кода (ch_10_button_test.py). При желании
вы можете скачать его в порядке, описанном в рецепте
3.22.
from gpiozero import Button
import time
but t on
=
Button(7)
while True:
if but ton.is_pres sed:
pri nt (time.time ())
При создании объекта кнопки мы передаем ему номер контакта
подключается кнопка (в нашем случае
к «земле»
7).
GPIO,
к которому
Второй провод кнопки подключается
(GND).
При каждом нажатии на кнопку мы выводим на экран текущее значение времени
в секундах.
Пояснение
Модуль
Squid Button
удобно применять для тестирования схем, в которых исполь
зуются цифровые входы, но поскольку он также подходит для панельного монтажа,
его можно задействовать и в качестве фиксированного компонента электронных
схем.
Основы работы с оборудованием
295
1
Дополнительные сведения
Использованию кнопок также посвящены рецепты
и на рецепт
10.10,
13.1-13.6.
Обратите внимание
посвященный испол ьзованию « осьминожного » модуля RGВ
светодиода.
10.12. Преобразование уровня
сигнала с
В
5 до 3,3
с помощью двух резисторов
Задача
Устройства
нужно
Raspberry Pi
рассчитаны на уровень входного сигнала в
подключить 5-вольтовый
устройстве
3,3
выход внешнего модуля к контакту
Raspberry Pi, исключив
В , но вам
GPIO
на
вероятность его выхода из строя .
Решение
Чтобы снизить уровень выходного сигнала внешнего модуля , используйте делитель
напряжения из двух резисторов. В качестве примера на рис .
можно подключить к
фейса модуля
Рис .
Raspberry Pi
Arduino Uno.
10.15
показано, как
5-вольтовую линию последовательного интер
10.15. Использование резисторов для преобразования уровня сигнала с 5 до 3,3 В
Как вы помните, 14-й и 15-й выводы разъема
же являются выводами
TXD
и
RXD.
GPIO
на устройстве
Raspberry Pi
так
Чтобы воспользоваться этим рецептом , вам
понадобятся:
♦
резистор с сопротивлением
приложения
1);
270
Ом (см . разд. «Резисторы и конденсаторы»
296
♦
1
Глава
10
резистор с сопротивлением
прwюжения
470
Ом (см. разд. «Резисторы и конденсаторы»
1).
Уровень выходного сигнала на выводе
3,3
TXD
устройства Raspbeпy
Pi
составляет
В, и потому этот вывод без каких-либо проблем может быть напрямую подклю
чен к 5-вольтовому входу модуля
Arduino.
Модуль
Arduino
2,5 В.
воспринимает как вы
сокий уровень сигнала любой уровень, превышающий
Проблема возникает в том случае, если вам нужно подключить 5-вольтовый выход
модуля
Arduino
к входному выводу
RXD
устройства Raspbeпy
случае нельзя делать напрямую, потому что сигнал с уровнем
Raspbeпy
но на рис.
Pi из строя.
10.15.
Pi.
5
Это ни в коем
В может вывести
Вместо этого нужно использовать два резистора, как показа
Пояснение
Используемые здесь резисторы потребляют около
6
мА, что слабо сказывается на
общем уровне потребления тока, поскольку само устройство Raspbeпy
ет целых
500
Pi
потребля
мА.
Если вы хотите добиться минимального потребления тока в делителе напряжения,
используйте резисторы большего сопротивления с сохранением той же пропорции
между ними, Например, резисторы с сопротивлением 27 и 47 кОм будут потреблять
лишь
60
мкА.
Дополнительные сведения
Если преобразование уровня с
5
до
3,3
В требуется для большого количества сиг
налов, вероятно, будет лучше воспользоваться многоканальным модулем преобра
зователя уровней, как предлагается в рецепте
10.13. Преобразование уровня
10.13.
сигналов с 5 до
с помощью модуля преобразователя уровней
3,3
В
Задача
Устройства Raspbeпy
Pi
рассчитаны на уровень входного сигнала в
3,3
В, но вам
нужно подключить несколько 5-вольтовых цифровых выходов внешних устройств
к контактам
GPIO
на устройстве Raspbeпy
Pi,
исключив вероятность его выхода из
строя.
Решение
Используйте двунаправленный модуль преобразователя уровней наподобие тех,
что показаны на рис.
10.16.
Такие преобразователи очень просты в эксплуатации. С одной стороны у них рас
положен контакт для подключения источника сигнала с первым уровнем напряже-
Основы работы с оборудованием
1
297
ния и ряд каналов, представляющих собой входы и выходы с этим уровнем сигна
ла. С другой стороны расположен контакт для подключения источника сигнала со
вторым уровнем напряжения, и все входы и выходы на этой стороне автоматически
приводятся к этому уровню сигнала.
1 . .:-· _, .. 01...
1 ..• -'..).'_,\'
• • -хсн
vссв,;·,
("t ·Ч • ·: 1 i;c; 81.• ~•
"1 - .
•
• в--. ·•
с· . ·12 •~
t • ,Аэ_ . ~ ._в:,. •,
i.=c1.[-t
•• ,..,::
;::В~ t·,
(?f,'•i~
•~.\~,, ~; хва н,;вt ·••
l.ev,•! В:' ("}
а• '17
),
_
.~
Bt
, ~ i.
Stнf1Pr
tff, A8 ~
t• • с'Г •·II 'С
GNO ••,
(tJd1н~c,ionaJ
Рис.
10.16.
Преобразователи уровней
Пояснение
В продаже имеются преобразователи уровней с разным количеством каналов. Так,
на рис .
l 0.16
представлены примеры преобразователей с четырьмя (слева) и восе
мью (справа) каналами.
Информацию о поставщиках таких преобразователей уровней можно найти в при
ложении
1.
Дополнительные сведения
Если преобразование уровня требуется только для одного-двух сигналов, вероятно,
проще воспользоваться рецептом
1О. 12.
Входы 5-вольтовой логики обычно без проблем принимают сигнал с уровнем в
3,3
В.
В тех редких случаях, когда это не так (как, например, при использовании светоди
одных полос, рассматриваемых в рецепте
15.5),
вы можете задействовать один из
описанных здесь модулей для повышения уровня сигнала.
10.14. Запитывание Raspberry Pi
от литий-полимерного аккумулятора
Задача
Вы хотите запитать устройство
с напряжением
3, 7 В .
Raspberry Pi
от литий-полимерного аккумулятора
298
Глава
10
Решение
Примените повышающий стабилизатор напряжения. В качестве примера на рис.
представлен повышающий стабилизатор компании
SparkFun,
10.17
но на еВау предлага
ется и ряд более дешевых вариантов от других производителей.
Рис.
10.17.
Запитывание устройства
Raspberry Pi от литий-полимерного
3,7 В
аккумулятора
с напряжением
Как и в случае использования других дешевых товаров с еВау, рекомендуется как
следует протестировать приобретенный модуль перед его применением в своих
схемах, потому что характеристики и качество таких товаров не всегда соответст
вуют тому, что указано в их описании.
Преимуществом такого модуля является то, что, выполняя роль стабилизатора на
пряжения, подающего
свой
зарядный
5
контур
В на устройство
от
гнезда
USB.
Raspberry Pi,
Подключив
он также может запитывать
блок
питания
устройства
Raspberry Pi к гнезду USB этого модуля, вы можете одновременно и запитать
устройство Raspberry Pi, и обеспечить зарядку аккумулятора. Когда же вы отклю
чите блок питания от гнезда USB, устройство Raspberry Pi продолжит работать от
аккумулятора, пока не израсходует его заряд.
Основы рвботь1 с оборудованием
Заряда литий-полимерного аккумулятора с емкостью в
два-три часа работы устройства
1300
1
299
мАч обычно хватает на
Raspberry Pi.
Пояснение
Если вы собираетесь заряжать аккумулятор каким-либо иным образом, можно ис
пользовать более дешевый повышающий преобразователь
без зарядного кон
-
тура.
Запитывание от аккумулятора имеет гораздо больше смысла в случае таких ранних
моделей, как
Raspberry Pi 2
и
3,
поскольку модель
Raspberry Pi 4
потребляет уже
гораздо больше тока (и должна запитываться от источника питания, выдающего как
минимум
3 А).
Еще один подход сводится к тому, чтобы запитать устройство
Raspberry Pi
от пор
тативного батарейного блока из нескольких литий-полимерных аккумуляторов
с общим напряжением
5 В,
снабженного разъемом
USB.
Отличие этого подхода от
описанного здесь ранее состоит лишь в том, что источником питания станет снаб
женный корпусом законченный продукт. При этом нужно убедиться в том, что
приобретаемый батарейный блок выдает достаточное количество тока для исполь
зуемой вами модели
Raspberry Pi (см.рецепт 1.4).
Дополнительные сведения
Более подробную информацию о повышающем стабилизаторе с зарядным конту
ром компании
SparkFun
10.15. Основы
можно найти по адресу
работы с платой
https://oreil.ly/UoXQm.
Sense НАТ
Задача
Вы хотите разобраться с тем, как можно использовать плату
Raspberry Pi Sense
НАТ.
Решение
Raspberry Pi Sense НА Т (рис. 10.18) - весьма полезная интерфейсная плата для
Raspberry Pi с говорящим названием. Она снабжена рядом датчиков (отсюда и
Sense - от англ. sensor, датчик), с помощью которых вы можете измерять темпера
туру, относительную влажность и атмосферное давление (см. рецепт 14.12). При
этом она также обладает акселерометром, гироскопом (см. рецепт 14.16) и магни
тометром (см. Ш), что позволяет использовать ее для ориентации устройства в про
странстве. Кроме того, на плате установлен полноцветный светодиодный матрич
ный дисплей размером 8х8 (см.рецепт
Наденьте плату
тание.
Sense
15.3).
НА Т на устройство
Raspberry Pi
и подключите к нему пи
300
Глава
1
10
Рис.
10.18.
Плата
Raspberry Pi Sense
НАТ
Программное обеспечение, необходимое для взаимодействия устройства
Pi
с этой платы, уже включено в состав
I2c,
на основе интерфейса
Raspberry Pi OS.
Плата
Sense
Raspberry
НА Т работает
поэтому вам надо будет выполнить стандартную проце
1 О. 4).
дуру настройки этого интерфейса (см.рецепт
Пояснение
Использованию платы
Sense
НА Т посвящены сразу несколько рецептов этой книги.
Но пока что давайте просто убедимся в том, что она работает. Откройте консоль
языка
Python
с помощью команды:
$ sudo pythonЗ
и введите в консоли следующие команды:
>>> from sense_hat import SenseHat
>>> hat = SenseHat()
»> hat. show_message ( 'Raspberry Pi
CookЬook')
На светодиодном матричном экране должно прокрутиться сообщение Raspberry Pi
cookЬook
(Raspberry Pi.
Сборник рецептов).
Дополнительные сведения
По адресу
платы
https://oreil.ly/upoEl
Sense НА Т.
Применение платы
Sense
можно найти справочник по программированию
НА Т для измерения температуры, влажности и атмосфер
ного давления рассматривается в рецепте
гироскопа этой платы
-
в рецепте
14.12,
а использование акселерометра и
14.16.
О том, как с помощью магнитометра платы
Sense
НА Т можно определить направ
ление на север и обнаружить присутствие магнита, рассказывается соответственно
в рецептах
14.15
и
14.18.
Основы работы с оборудованием
10.16. Основы
работы с платой
1
301
Explorer НА Т Pro
ком
Explorer НАТ Pro
Задача
Вы хотите разобраться с тем, как можно использовать плату
пании
Pimoroni.
Решение
Подключите эту плату к устройству
explorerhat. На рис.
Raspberry Pi
10.19
Raspberry Pi
и установите Руthоn-библиотеку
показан пример подключения этой платы к устройству
В+.
Рис.
10.19.
Плата
Explorer
НАТ
Pro
компании
Pimoroni
Плата Explorer НА Т Pro несет на себе ряд удобных в использовании входов и выхо
дов, а также область для размещения небольшой беспаечной макетной платы. Вот
ее основные особенности:
♦
четыре светодиода;
♦
четыре буферизованных входа;
♦ четыре буферизованных выхода (с током до
♦
500
мА);
четыре аналоговых входа;
♦ два драйвера для маломощных двигателей (с током до
200
♦ четыре емкостные сенсорные площадки;
♦ четыре емкостные площадки для аллиrаторных зажимов.
мА);
302
1
Глава
10
В качестве небольшого эксперимента давайте заставим замигать встроенный крас
ный светодиод этой платы. Откройте редактор и введите или вставьте следующий
код:
import explorerhat, tim8
while True:
explorerhat.light.red.on()
time.sleep(0.5)
explorerhat.light.red.off()
time.sleep(0.5)
При желании вы можете скачать этот пример кода
рядке, описанном в рецепте
(ch_ 10_explorer_hat_Ыink.py)
в по
3.22.
Пояснение
Плата
Explorer
НА Т
Pro
снабжена буферизованными входами и выходами
входы и выходы подключаются к
Raspberry Pi
-
т. е. ее
не напрямую, а через размещенные
на ней микросхемы. Это значит, что в случае неправильного подключения будет
повреждена плата
Explorer НА Т Pro,
а не устройство
Raspberry Pi.
Дополнительные сведения
Плату
Explorer
НА Т
ний (см. рецепт
Pro
14.21).
можно использовать для емкостного распознавания каса
10.17. Создание собственной
платы стандарта НА Т
Задача
Вы хотите создать для
Raspberry Pi
прототип интерфейсной платы, соответствую
щей стандарту НА Т.
Решение
Используйте плату
Perma-Proto Pi
После появления модели
возросло до
40,
НА Т (рис.
Raspberry Pi
10.20).
В+, у которой количество контактов
был разработан новый стандарт плат расширения для
получивший название НА Т
(Hardware Attached on
GPIO
Raspberry Pi,
Тор, оборудование, надеваемое
сверху). Вы, конечно, можете и не придерживаться стандарта НА Т, особенно если
плата создается как единичное изделие для собственного использования, но если
вы планируете продавать созданный вами продукт, лучше обеспечить соответствие
данному стандарту.
Стандарт НА Т оговаривает размер и форму печатной платы, а также требует, чтобы
на печатной плате была впаяна микросхема памяти
EEPROM.
Эта микросхема под-
Основы работы с оборудованием
ключается к выводам
ID_SD
и
ID_SC
разъема
GPIO
1
303
и в перспективе позволит
автоматически настраивать конфигурацию устройства
Raspberry Pi
и загружать
программное обеспечение на этапе начальной загрузки при включении устройства
Raspberry Pi с подключенной к нему платой стандарта НА Т .
Рис.
10.20.
Плата
Perma-Proto Pi
НАТ
Область прототипирования этой платы состоит из двух полос беспаечных контак
тов, каждый ряд которых содержит пять контактов и шины питания с обеих сторон
платы .
Если вы не собираетесь программировать микросхему памяти
EEPROM,
можете
пропустить оставшуюся часть рецепта. Однако если вы собираетесь занести собст
венную информацию в память
EEPROM
своей платы стандарта НА Т, вам следует
прочитать следующий далее разд. «Пояснение ».
Пояснение
Хотя в основе стандарта НА Т лежит очень разумная идея , на момент подготовки
этой книги операционная система
может использовать ин
формацию , занесенную в память
НА Т. В перспективе это
Raspberry Pi OS еще не
EEPROM плат стандарта
должно измениться, открыв для нас захватывающую возможность автоматического
выполнения платами стандарта НА Т таких процедур, как активация интерфейса
I2c
и установка необходимых им Руthоn-библиотек, в случае подключения этих плат
к устройству
Raspberry Pi .
Для записи данных в память EEPROM сначала нужно активировать скрытый I2С
ID_SD и ID_SC, предназначенными для чтения и
EEPROM. Для этого нужно добавить или раскомментиро
порт, используемый контактами
записи данных в память
вать в файле
/booUconfig .txt следующую строку :
dtparam-i2c_vczon
Глава
304
10
После этого перезагрузите устройство Raspberry Pi. Проверив состояние шины 1 2 С
с помощью пакета i2c-tools (см. рецепт 10.5), вы увидите, что к ней подключена
микросхема памяти
EEPROM:
$ i2cdetect -у О
О
1 2 3 4 5 6 7
00:
10:
20:
30:
40:
50: 50
60:
70:
8 9
а
Ь
с
d
е
f
Приведенные здесь результаты утилиты i2cdetect говорят о том, что микросхеме
памяти EEPROM присвоен I2С-адрес 50. Заметьте, что выполняемая команда вызы
вается с параметрами -у о, а не -у 1, как обычно, поскольку в нашем случае мы име
ем дело не с обычной шиной
на контактах 2 и 3, а с шиной 1 2 С, выделенной для
I2c
памяти
EEPROM
платы стандарта НА Т.
Для чтения и записи памяти
EEPROM
следует скачать соответствующие инстру
менты, выполнив следующие команды:
$ git clone https://githuЬ.com/raspberrypi/hats.git
$ cd hats/eepromutils
$ make
Запись данных в память
EEPROM
производится в три этапа. Сначала нужно отре
дактировать содержимое файла eeprom_settings.txt. Как минимум введите название
своей компании и название продукта в полях product_id (идентификатор продукта),
product_version (версия продукта), vendor (производитель) и product (продукт). В этом
файле можно задать и много других хорошо задокументированных параметров:
параметры резервного питания, номера используемых контактов
GPIO
и пр.
Отредактировав текстовый файл, выполните следующую команду, чтобы преобра
зовать его в файл rom_file.eep, подходящий для записи в память
EEPROM:
$ ./eepmake eeprom_settings.txt rom_file.eep
Opening file eeprom_settings.txt for read
UUID=7aa8b587-9cll-4177-bfl4-00e60lc5025e
Done reading
Writing out ...
Done.
Наконец, скопируйте файл rom_file.eep в память
sudo
This
This
This
EEPROM
с помощью команды:
./eepflash.sh -w -f=rom_file.eep -t=24c32
will disaЫe the camera so you will need to REBOOT after this .. .
will attempt to write to i2c address Ох50. Make sure there is .. .
script comes with ABSOLUTELY no warranty. Continue only if you .. .
Основы работы с оборудованием
305
Do you wish to continue? (yes/no): yes
Wri ting ...
0+1 records in
0+1 records out
127 bytes (127 В) copied, 2.52071 s, 0.1 kB/s
Done.
pi@raspberrypi ~/hats/eepromutils $
По завершении процесса записи можно убедиться в том, что он прошел успешно,
считав содержимое памяти
EEPROM
с помощью следующих команд:
$ sudo ./eepflash.sh -r -f=read_back.eep -t=24c32
$ ./eepdump read_back.eep read_back.txt
$ more read back.txt
Дополнительные сведения
Ознакомьтесь с руководством по разработке плат стандарта НА Т для устройств
Raspberry Pi 5 .
В продаже имеется много готовых плат стандарта НА Т, в том числе ряд плат ком
пании
Adafruit:
12.8), емкост
14.21) и управления 16 каналами ШИМ
Explorer НАТ Pro компании Pimoroni (см. ре
для управления шаговыми двигателями (см. рецепт
ного распознавания касаний (см. рецепт
(см. рецепт
цепт
12.3),
а также плата
10.16).
10.18. Использование
и Zero 2 W
моделей
Raspberry Pi Zero 2
Задача
Вы хотите побольше узнать о моделях
Raspberry Pi Zero 2
и
Zero 2 W
и о том, как
их можно встраивать в электронные схемы.
Решение
Raspberry Pi Zero 2 хорошо
Raspberry Pi Zero 2 W
(рис. 10.21) дополнительно предоставляет поддержку Wi-Fi и Bluetooth, и потому
вполне пригодна для реализации небольших проектов Интернета вещей (loT).
В силу небольшого размера и низкой стоимости модель
подходит для встраивания в электронные схемы. Модель
Raspberry Pi Zero 2
нужно будет сделать, -
Поскольку модели
вое, что вам
и
Zero 2 W
поставляются без штырьков, пер
это припаять к ним штырьки. Подходящие
штырьки входят в состав стартовых комплектов для устройств
например, комплекта компании
5
См. http~://oгeil.ly/6Z\'bx.
Pi Hut.
Raspberry Pi Zero -
306
1
Глава
1О
Рис.
10.21.
Модель
Raspberry Pi Zero 2 W
В продаже также имеется версия модели
Raspberry Pi Zero 2 W
с уже припаянными
штырьками, но она стоит дороже версии, рассчитанной на их самостоятельное при
паивание.
Вы также можете приобрести так называемые молоточные контакты, которые
более плотно прилегают к отверстиям и не требуют пайки.
Пояснение
Поскольку модель
и в виде разъема
Raspberry Pi Zero 2 снабжена только одним разъемом USB, хотя
micro-USB с поддержкой технологии OTG, вам потребуется USВ
концентратор с переходником, чтобы для ее настройки можно было подключить
к ней адаптер
Wi-Fi,
клавиатуру и мышь с интерфейсом
USB.
Еще один возможный подход состоит в том, чтобы воспользоваться консольным
кабелем, как предлагается в рецепте
2.6,
и настроить
файла /etc/network/interfaces, как описано в рецепте
установить с устройством
ванием протокола
SSH
Raspberry Pi Zero
2. 7).
Wi-Fi путем редактирования
2.5. После этого можно будет
беспроводное соединение с использо
(см . рецепт
Дополнительные сведения
Сравнение различных моделей
Raspberry Pi
проводится в рецепте
1.1.
ГЛАВА
11
Управление оборудованием
11.0. Введение
В этой главе мы уже вплотную займемся управлением электроникой с использова
нием разъема
GPIO
устройства
Raspberry Pi.
В большинстве рассматриваемых здесь рецептов вам потребуется беспаечная ма
кетная
плата и
(см. рецепт
Raspberry Pi
соединительные
10.9).
Для
провода типа
«штырь-гнездо»
и
«штырь-штырь»
совместимости со старыми 26-контактными
моделями
во всех приводимых здесь примерах использования макетной платы
задействуются только первые
26
и в новой версии разъема
(см.рецепт
GPIO
контактов, которые присутствуют и в старой,
10.1 ).
Чтобы одновременно обзавестись и макетной платой, и набором деталей, которые
потребуются во многих рецептах этой главы, я рекомендую вам приобрести старто
вый комплект
Project
Вох
1 for Raspberry Pi 1•
БХВ-Электроника
Напомним, что российские читатели книги могут приобрести многие нужные им компо
ненты электронных схем в разделе «БХВ-Электроника» сайта издательства «БХВ» по
адресу https://bhv.ru/elements/.
11.1. Подключение светодиода
Задача
Вы хотите разобраться с тем, как можно подключить светодиод к устройству
Raspberry Pi.
Решение
Подключите светодиод к одному из контактов
GPIO, используя для ограничения
4 70 Ом или 1 кОм. В этом ре
силы тока добавочный резистор с сопротивлением
цепте вам понадобятся:
♦
макетная плата и соединительные провода (см. разд. «Оборудование и комплек
ты для прототипированuя» приложения
1
См. https://oreil.ly/0Rl4J.
1);
Глава
308
♦
11
резистор с сопротивлением
приложения
♦
470
Ом (см. разд. «Резисторы и конденсаторы»
1);
светодиод (см.ра:,д. «Оптоэлектроника» приложения
На рис.
1).
показано, каким образом вы можете подключить светодиод, используя
11.1
беспаечную макетную плату и соединительные провода типа «штырь-гнездо».
У каждого светодиода есть как положительный вывод, так и отрицательный. Более
длинный вывод светодиода (положительный) на рис.
11.1
находится в одном ряду
с выводом резистора.
31)3
11
sv
SCL
-GND
--
RXD •
1117
1121
1122
1118
SDA
114
--
~ ~
TXD •
--
1123
112ч
MOSI -MISO 1125
SCLK cso
--
с
s1
Рис.
11.1.
Подключение светодиода к устройству
Raspberry Pi
В этом примере используется резистор с сопротивлением
4 70
Ом, что позволяет
получить достаточно большой ток, чтобы светодиод светился ярко, но не настолько
большой, чтобы можно было вывести из строя устройство
Raspberry Pi.
Подключив светодиод, мы также должны научиться включать и выключать его из
Python-кoдa.
Запустите консоль языка
$ sudo
»>
»>
»>
»>
»>
Python в
окне терминала и введите следующие команды:
pythonЗ
from gpiozero import LED
led = LED(l8)
led.on()
led.off()
Вы увидите, что команда led.on(J включает светодиод, а команда led.off(J -
его
выключает.
Пояснение
Использование светодиодов
-
очень удобный, дешевый и эффективный способ
организации освещения, который, однако, требует некоторой осмотрительности.
Если вы напрямую подключите светодиод к источнику напряжения (такому как
выходной контакт
GPIO),
напряжение на котором превышает
1,7
В, то через него
начнет проходить слишком большой ток, что может вывести из строя как сам све-
Управление оборудованием
309
тодиод, так и источник напряжения, что будет очень неприятно, если этим источ
ником является устройство
Raspberry Pi.
Для ограничения силы тока светодиод всегда следует подключать к контактам
GPIO
через резистор. Разместив добавочный резистор между светодиодом и ис
точником напряжения, вы
можете ограничить силу протекающего через светодиод
тока до уровня, который будет безопасным и для светодиода, и для управляющего
им контакта
Контакты
GPIO.
GPIO
на устройстве
Raspberry Pi
в зависимости от модели и количества
используемых контактов гарантированно выдают только
цепт
Светодиоды
10.3).
превышающем
В табл.
11.1
обычно начинают светиться
3
или
16
мА
(см.
ре
при любом уровне тока,
мА, но чем больше будет ток, тем ярче они будут светить.
1
указано, каким должно быть сопротивление добавочного резистора при
использовании светодиодов различного типа и какой ток при этом будет проходить
через контакт
GPIO.
Таблица
Выбор добавочного резистора для светодиодов различного типа
11.1.
и контакта
Тип светодиода
--------------
--------
--
--
470Oм
3,5
1 кОм
1,5
-
---
--
- - -
470Oм
--
-
--
Оранжевый, желтый, зеленый
- --- - -------
------
- - - - -
--
---
2
--
--
1 кОм
1
100 Ом
3
270Oм
1
---~
Синий, белый
-
В
-----
Оранжевый, желтый, зеленый
--------
3, 3
Сила тока (мА)
Красный
~------
с напряжением
Сопротивление резистора
Красный
~
GP/0
-
----
Синий, белый
Как видите, для любого типа светодиодов можно спокойно использовать резистор
с сопротивлением
470
Ом. При этом для синего или белого светодиода вы можете
применить добавочный резистор с гораздо меньшим сопротивлением, не рискуя
повредить устройство
Raspberry Pi.
Теперь давайте продолжим наши эксперименты с Руthоn-кодом и попробуем напи
сать программу, заставляющую светодиод мигать, циклически включаясь и выклю
чаясь. Откройте редактор, введите или вставьте в него приведенный далее код про
граммы и сохраните его в файле под именем ch_ 11_1ed_Ыink.py (при желании вы
можете скачать этот файл в порядке, описанном в рецепте
from gpiozero import LED
from time import sleep
led = LED(l8)
while True:
led.on()
sleep (О. 5)
3.22):
Глава
310
11
led.off ()
sleep(0.5)
Затем запустите программу с помощью команды:
$ python3 ch 11
led_Ьlink.py
Поскольку мы выдерживаем задержку в полсекунды как после включения, так и
после выключения светодиода, он мигает с частотой один раз в секунду.
Заставить светодиод мигать также можно с помощью соответствующего метода
класса
LED:
from gpiozero import LED
led = LED(18)
led.Ыink(0.5,
0.5, background=False)
В качестве первых двух параметров метод Ыink принимает соответственно продол
жительность нахождения во включенном и выключенном состоянии. Что интерес
но, вы также можете использовать опциональный параметр ьackground (фон), при
установке которого в тrue программа будет продолжать выполнение других команд
с одновременным миганием светодиода в фоновом режиме.
Когда же вы решите отключить фоновое мигание светодиода, вызовите метод
led. off (). Применение этого подхода позволяет существенно упростить код про
граммы.
Как его можно
использовать на практике,
демонстрирует программа
ch_ 11 _led_Ыink_2.py:
from gpiozero import LED
led = LED(18)
led.Ыink(0.5, 0.5, background=True)
print("Notice that control has moved away - hit Enter to continue")
input ()
print ("Control is now back")
led.off ()
input ()
В начале этой программы запускается фоновый процесс мигания светодиода, что
позволяет программе свободно перейти к следующей команде и вывести сообще
ние о том, что в этой точке управление передается пользователю и для продолже
ния нужно нажать клавишу
<Enter>.
Команда
input () заставляет программу приос
тановить выполнение кода до тех пор, пока вы не введете какие-либо данные (или
просто не нажмете клавишу
<Enter> ).
Обратите внимание, что светодиод продол
жает мигать до нажатия вами клавиши
<Enter>,
несмотря на переход программы
в режим ожидания ввода.
После нажатия клавиши
мигания светодиода.
<Enter>
команда led.off() останавливает фоновый процесс
Управление оборудованием
1
311
Дополнительные сведения
При необходимости вы можете воспользоваться онлайн-калькулятором сопротив
ления добавочного резистора2 .
Более подробно об использовании
Raspberry Pi
в сочетании с макетной платой
и соединительными проводами рассказано в рецепте
10.9.
Обратите также внимание на документацию по использованию библиотеки gpiozero
для управления светодиодами 3 •
11.2. Перевод контактов GPIO в безопасное состояние
перед выходом из программы
Задача
Вам нужно, чтобы при завершении своей работы ваша программа переводила все
GPIO в состояние входа, чтобы исключить вероятность возникновения
в разъеме GPIO короткого замыкания, способного вывести из строя устройство
Raspberry Pi.
контакты
Решение
Любая программа, использующая библиотеку gpiozero, при завершении своей рабо
ты автоматически переводит все контакты
GPIO
в безопасное входное состояние.
Пояснение
Ранее при доступе к контактам
GPIO,
например с использованием библиотеки
RPi.GPIO, эти контакты не переводились автоматически в безопасное входное со
стояние, и перед выходом из программы нужно было вызывать функцию cleanup.
Если вы забывали вызвать функцию cleanup или перезагрузить устройство
Pi,
Raspberry
то контакты, переведенные программой в состояние выхода, оставались в этом
состоянии и после завершения ее работы. И если затем вы начинали собирать но
вую электрическую схему, не зная, что контакты
GPIO
напряжением, это часто приводило к замыканию выхода
ка питания или другой контакт
GPIO,
устройства находятся под
GPIO
на контакт источни
находящийся в противоположном состоянии.
Например, так часто происходило при подключении кнопки, соединяющей с «зем
лей» контакт
GPIO,
ранее настроенный как выход с высоким уровнем сигнала.
К счастью для нас теперь библиотека gpiozero исключает вероятность возникнове
ния такой проблемы.
2 Cv/
3
https://oreil.ly/a86Dd.
См. https://oreil.ly/831yu.
312
1
Глава
11
Дополнительные сведения
О том, как в языке
в рецепте
Python
производится обработка исключений, рассказывается
7.1 О.
11.3. Управление яркостью светодиода
Задача
Вы хотите управлять яркостью свечения светодиода из Руthоn-программы.
Решение
Помимо прочего, в библиотеке gpiozero имеется класс, позволяющий управлять
мощностью подаваемого сигнала и соответственно яркостью свечения светодиода
с помощью широтно-импульсной модуляции (ШИМ). Чтобы опробовать этот класс
на практике, подключите светодиод, как предлагается в рецепте
тестовую программу
ch_11_Ied_brightness.py
11.1,
и запустите
(при желании вы можете скачать этот
пример кода в порядке, описанном в рецепте
3.22):
from gpiozero i.mport PWMLED
led =
PWМLED
(18)
while True:
brightness_s = input("Enter Brightness
brightness = float(brightness_s)
led.value = brightness
(О.О
to 1.0) :")
Запустив эту Руthоn-программу, вы сможете управлять яркостью светодиода путем
ввода числа в диапазоне от о.о (отсуrствие свечения) до 1.0 (полная яркость):
$ python ch_ll_led_brightness.py
Enter Brightness (О.О to 1.0) :0.5
Enter Brightness (О.О to 1.0) :1
Enter Brightness (О.О to 1.0) :О
Для выхода из программы надо будет нажать комбинацию клавиш
<Ctrl>+<C>.
В окне терминала эта комбинация клавиш служит для прекращения выполняемых
действий и во многих случаях ведет к полной остановке выполняемой программы.
Обратите внимание: чтобы управлять яркостью светодиода подобным образом, вы
должны определить светодиод как объект PWМLED, а не как объект LED, что делалось
обычно.
Пояснение
Широтно-импульсная модуляция
(Pulse-Width Modulation, PWM) -
это способ
управления сигналом, при котором изменяется длительность импульсов, а частота
Управление оборудованием
313
их следования остается постоянной. Принцип действия этого метода иллюстрирует
рис.
11.2.
Светодиод будет гореть очень тускло, если импульсы с высоким уровнем сигнала
окажутся очень короткими, и значительно ярче, если они станут занимать более
значительную долю времени.
11,оо секунды
..._____.I
ов
11.2.
100
18/20
(90%)
Широтно-импульсная модуляция
По умолчанию в нашем примере используется ШИМ с частотой
тодиод мигает с частотой
(50%)
1
u u
3]
Рис.
1
10120
100 Гц -
т. е. све
раз в секунду. При желании вы можете выбрать и
другую частоту, указав ее при определении объекта PWМLED с помощью опциональ
ного параметра frequency (частота):
led =
PWМLED(18,
frequency=lOOO)
Значение частоты при этом указывается в герцах
1000 Гц (1 кГц).
В табл. 11.2 проводится
-
т. е. здесь задается частота
в
метра
frequency,
с
сравнение значения частоты, заданного с помощью пара
реальным
значением
частоты
на
контакте,
измеренным
с
по
мощью осциллографа.
Как видите, разница между заданным и реальным значениями частоты увеличива
ется по мере возрастания частоты. Оrсюда следует, что такой способ ШИМ-
314
Глава
1
11
управления не подходит для звуковых частот
дится
для управления
яркостью
светодиода
(от 20
или
Гц до
20
скоростью
кГц), но вполне го
вращения
двигателя.
Если вы хотите поэкспериментировать с этим способом управления самостоятель
но, воспользуйтесь примером кода ch_ 11_pwm_f_test.py.
Таблица
11.2.
Сравнение заданного и реального значений частоты
Реальное значение частоты
Заданное значение частоты
Гц
50
50
Гц
100
Гц
98,7
Гц
200
Гц
195
Гц
500
Гц
470
Гц
880
Гц
4,2
кГц
1 кГц
10
кГц
Дополнительные сведения
Более подробную информацию о ШИМ можно найти в Википедии4.
В рецепте
ШИМ используется для управления цветом RGВ-светодиода, а
в рецепте
для управления скоростью вращения двигателя постоянного тока.
11.11
12. 4 -
Более подробно об использовании
Raspberry Pi
в сочетании с макетной платой и
соединительными проводами рассказывается в рецепте
1О. 9.
Управлять яркостью свечения светодиода также можно с помощью ползункового
регулятора (см. рецепт
11.1 О).
11.4. Коммутация
мощных устройств постоянного тока
с помощью транзистора
Задача
Вам нужно управлять уровнем тока, протекающего через мощное низковольтное
устройство постоянного тока,
-
например, через
12-вольтовый светодиодный
модуль.
Решение
Такие светодиодные модули потребляют слишком много тока, чтобы их можно
было запитывать непосредственно от контактов
напряжение
12
В, а не
3,3
пользовать транзистор.
4
См. https://oreil.ly/e6KOZ.
GPIO.
Кроме того, им требуется
В. Для управления столь мощной нагрузкой следует ис
Управление оборудованием
315
В нашем случае мы применим мощный МОП-транзистор, который, несмотря на
свою низкую стоимость (меньше одного доллара), способен управлять нагрузкой
с током до
30
ампер, что во много раз больше того уровня тока, который требуется
для мощных светодиодов. Лучше всего нам подойдет МОП-транзистор FQPЗONOбL
(см. разд. «Транзисторы и диоды» приложения
На рис.
11.3
1).
показано, каким образом можно подключить МОП-транзистор на
макетной плате. Внимательно проследите за тем, чтобы к светодиодному модулю
были правильно подключены положительный и отрицательный выводы блока
питания.
Светодиодный модуль ,
рассчитанный на 12 В
постоянного тока
Источник питания
постоянного тока
с напряжением
Рис.
12
В
11.3.
Управление большими токами с помощью МОП-транзистора
В этом рецепте вам понадобятся:
♦
макетная плата и соединительные провода (см. разд. «Оборудование и комплек
ты для прототипирования» приложения
♦
резистор с сопротивлением
ложения
♦
I
1);
кОм (см. разд. «Резисторы и конденсаторы» при
1);
N-канальный МОП-транзистор FQPЗONOбL или транзистор Дарлингтона ПР120
(см. разд. «Транзисторы и диоды» приложения
♦
блок питания с напряжением
♦
светодиодный модуль, рассчитанный на
12
1);
В;
12
В постоянного тока.
Для включения и выключения светодиодной панели можно использовать точно
такой же Python-кoд, как в случае управления одним маломощным светодиодом без
использования МОП-транзистора (см. рецепт
11.1).
Вы также можете обеспечить управление яркостью светодиодного модуля, исполь
зуя ШИМ в сочетании с МОП-транзистором (см. рецепт
11.3).
Глава
316
11
Пояснение
В тех случаях, когда требуется запитать от разъема
GPIO
какую-либо значительную
нагрузку, используйте аккумуляторы или внешний блок питания. Непосредственно
от разъема
(см. рецепт
GPIO
можно запитать только нагрузку со сравнительно низким током
10.3).
В нашем же случае для подачи питания на светодиодную панель
используется блок питания постоянного тока с напряжением
12
В. Выберите блок
питания, способный выдавать достаточную мощность. Так, если светодиодный мо
дуль потребляет
минимум
5
5
Вт, следует выбрать 12-вольтовый блок питания, выдающий как
Вт (а лучше
6
Вт). Если в описании блока питания указан только мак
симальный ток и не указана мощность, вы можете вычислить мощность, умножив
напряжение в вольтах на максимальный ток в амперах. Например, блок питания с
током
500
мА и напряжением
12
В способен выдавать
6
Вт мощности
( 12
х
0,5 = 6).
Резистор здесь требуется для того, чтобы пиковые токи, возникающие в моменты
включения и выключения МОП-транзистора, не приводили к перегрузке контакта
Отрицательный вывод светодиодной панели подключается к стоку МОП
GPIO.
транзистора, а ее положительный вывод
-
непосредственно к положительному
выводу источника питания. Исток МОП-транзистора подключается
(GND),
к «земле»
а его затвор управляет величиной тока, протекающего от стока к истоку.
При подаче на затвор напряжения, превышающего
2 В,
МОП-транзистор включает
ся и начинает пропускать ток через себя и светодиодный модуль.
г--- 1
Не ПОДХОДИТ ДЛЯ сети переменного тока!
Не пытайтесь использовать этот способ для коммутации цепей переменного тока
,
с напряжением
~--
110 или 220 В. Это не только
• сто этого воспользуйтесь рецептом 11. 7.
В этом примере используется МОП-транзистор
названия буква
«L»
бесполезно, но и небезопасно. Вме
FQP30N06L.
Стоящая в конце его
означает, что это МОП-транзистор логического уровня, у кото
рого пороговое напряжение затвора выбрано таким образом, чтобы к затвору мож
но было подключать цифровые выходы с напряжением
3,3
В. Хотя в нашей схеме,
возможно, будет работать и простая версия этого МОП-транзистора, не имеющая
в названии букву
«L»,
гарантировать это нельзя, потому что, согласно специфика
ции, пороговое напряжение затвора у нее находится в диапазоне от
2
вам не повезет, и реальное значение этого напряжения составит почти
до
4
4
В. Если
В, транзи
стор будет плохо переключаться.
Вместо МОП-транзистора также можно использовать силовой транзистор Дарлинг
тона ТIР120. Поскольку этот транзистор обладает такой же схемой расположения
выводов, как и у транзистора
FQP30N06L,
схема подключений на макетной плате
при этом останется неизменной.
Приведенную здесь схему можно использовать и для управления подачей питания
на другие низковольтные устройства постоянного тока. Единственным исключени
ем здесь являются двигатели и реле, для управления которыми придется совершить
ряд дополнительных телодвижений (см. рецепт
11.5).
Управление оборудованием
1
317
Дополнительные сведения
Ознакомиться с описанием МОП-транзистора FQPЗ0N06L можно по адресу
http://
blt.ly/18J3bxT.
Если вы хотите создать графический пользовательский интерфейс для управления
светодиодным модулем, обратитесь к рецепту
11.9,
где рассматривается пример
простейшего интерфейса для включения и выключения различных устройств, и ре
цепту
11.10,
где приводится пример плавного управления яркостью с помощью
ползункового регулятора.
11.5. Коммутация
мощных устройств с помощью реле
Задача
Вам нужно обеспечить включение и выключение устройств, для управления кото
рыми нельзя применить МОП-транзистор.
Решение
Используйте реле в сочетании с небольшим транзистором.
Рассмотренный в рецепте
11.4
метод включения и выключения устройств с по
мощью транзистора вполне пригоден для не очень мощной нагрузки с током в не
сколько сотен миллиампер, однако если нагрузка потребляет больше тока или если
нужно обеспечить гальваническую изоляцию управляющей электроники от того
устройства, которым она управляет, удобнее использовать реле.
На рис.
11.4
показано, каким образом вы можете подключить транзистор и реле на
макетной плате. Проследите за тем, чтобы и транзистор, и диод были правильно
ориентированы. У диода один из выводов помечен полоской, а у транзистора по
верхность корпуса плоская с одной стороны и закругленная с другой.
В этом рецепте вам понадобятся:
♦
макетная плата и соединительные провода (см.разд. «Оборудование и комплек
ты для прототипирования» прwюжения
♦ резистор с сопротивлением
ложения
(см. разд. «Резисторы и конденсаторы» при-
1);
♦ транзистор
♦ диод
1 кОм
1);
2N3904 (см.разд. « Транзисторы
1N4001
и диоды» прwюжения
(см. разд. «Транзисторы и диоды» прwюжения
♦ реле с напряжением управления
5В
1);
1);
(см.разд. «Прочее» прwюжения
1);
♦ мультиметр.
В этом рецепте можно использовать ту же программу, с помощью которой мы за
ставляли светодиод мигать в рецепте
11.1.
Если все будет сделано правильно, вы
будете слышать щелчки реле и звуковой сигнал мультиметра при каждом замыка
нии контактов. Однако имейте в виду, что реле представляет собой достаточно
Глава
318
11
медленно работающее механическое устройство, и потому не стоит пытаться ис
пользовать его в сочетании с широтно-импульсной модуляцией (ШИМ),
-
это мо
жет привести к выходу его из строя.
Мультиметр в режиме
непрерывной «прозвонки »
Рис.
11.4.
Использование реле и небольшого транзистора совместно с устройством
Raspberry Pi
Пояснение
Реле получили широкое распространение еще на заре развития электроники. Их
большим преимуществом является то, что они просты в использовании и могут
применяться везде, где можно использовать простой переключатель,
-
например,
для коммутации цепи переменного тока или в случае, когда неизвестна электриче
ская схема коммутируемого устройства.
Использование реле в схемах с электрическими параметрами, превышающими те,
что прописаны в их спецификациях, ведет к сокращению их срока службы
-
кон
такты начинают искрить и в конечном итоге сплавляются друг с другом.
Кроме того, иногда это также может вызвать разогревание реле до опасно высокой
температуры. Поэтому в случае сомнений относительно того, на какие электриче
ские параметры должно быть рассчитано ваше реле, лучше выберите его с некото
рым запасом прочности.
Управление оборудованием
319
Условное изображение, схема расположения выводов и внешний вид типичного
реле представлены на рис.
11.5.
Каждое реле, по сути, представляет собой переключатель, контакты которого при
тягиваются друг к другу с помощью электромагнита. Электромагнит и переключа
тель при этом электрически изолированы друг от друга, что защищает цепь, управ
ляющую обмоткой реле, от воздействия высокого напряжения, прилагаемого к кон
тактам переключателя.
1~·1
Обмотка
l.... , ················· • .......... !
Условное изображение реле
Рис.
11.5.
Схема расположения
Внешний вид
выводов реле
реле
Устройство и внешний вид реле
Недостатки реле заключаются в том, что они медленно срабатывают и в конечном
итоге изнашиваются после многих сотен тысяч срабатываний. Это значит, что они
позволяют управлять только медленным включением/выключением, но не такими
быстрыми переключениями, какие могут потребоваться при использовании ШИМ.
Для замыкания коммутируемой цепи через обмотку реле необходимо пропустить
ток порядка
50 мА. Поскольку контакт GPIO устройства Raspberry Pi может выдать
3 мА, в качестве переключателя мы используем небольшой транзи
только около
стор. Заметьте, что здесь не нужен мощный МОП-транзистор, какой мы задейство
вали в рецепте
11.4,
и вместо него можно обойтись небольшим транзистором. Три
его вывода подключаются следующим образом: база (средний вывод)
GPIO
тер -
через резистор с сопротивлением
к «земле»
(GND),
а коллектор
I
-
к контакту
кОм для ограничения силы тока, эмит
к одной из сторон реле. Другая сторона ре
-
ле подключается к 5-вольтовому выводу разъема
GPIO.
Диод в этой схеме служит
для подавления всплесков высокого напряжения, возникающих при быстрой пода
че питания на обмотку реле.
Хотя реле можно применять для коммутации цепей переменного тока с напряже
нием 110 или 220 В, на макетной плате использовать столь высокое напряжение
весьма опасно. Если вам нужно коммутировать цепи с высоким уровнем напряже
ния, обратитесь к рецепту 11. 7.
Дополнительные сведения
Обратите также внимание на рецепт
11.4, где рассматривается коммутация цепей
постоянного тока с помощью мощного МОП-транзистора.
320
Глава
11
11.6. Коммутация
устройств
с помощью твердотельного реле
Задача
Вы хотите задействовать в схемах с устройством
Raspberry Pi
твердотельное реле,
не имеющее подвижных контактов .
Решение
Не подходит для высоковольтных цепей!
.
Представленное здесь решение пригодно только для коммутации низковольтных
цепей постоянного или переменного т~ка (с напряжением не более 16 В) . Его нель
коммутации
зя применять для
с напряжением
Подключите контакт
казано на рис .
11 .6
11 О
или
GPIO
220
цепеи,
запитываемых от сети
переменного
непосредственно ко входу твердотельного реле, как по
(в качестве примера здесь используется твердотельное реле
компании MonkМakes) .
Рис.
11 .6.
тока
В.
Использование твердотельного реле для управления насосом
Управление оборудованием
321
Для управления входом твердотельного реле можно использовать непосредственно
контакт
GPIO
устройства
Raspberry Pi,
действующий как цифровой выход. Когда
уровень сигнала на этом контакте возрастает до ЗJ В, выходная цепь замыкается,
как и в случае электромеханического реле.
Пояснение
Если в случае электромеханического реле, о котором речь шла в рецепте
11.5,
гальваническая развязка входа и выхода обеспечивается за счет того, что контакты
переключателя притягиваются друг к другу с помощью электромагнита, то в случае
твердотельного реле она реализуется путем использования оптоэлектроники. В ка
честве примера на рис.
11. 7
представлена принципиальная электрическая схема
твердотельного реле компании
IC 1,
MonkMakes.
Элемент, обозначенный на схеме как
представляет собой светодиод с фотоприемником в светонепроницаемом кор
пусе интегральной схемы. При срабатывании светодиода этот элемент генерирует
напряжение, которое используется для управления двумя
обозначенными на схеме как
Q 1 и Q2.
МОП-транзисторами,
Два транзистора требуются для того, чтобы
можно было коммутировать цепи как постоянного, так и переменного тока (в кото
рых напряжение меняет свое направление).
F1
2д
GREEN-2P•3.5
J5
16V
2
N-CH
21АЗОV
N·CH
.1АЗОV
R2
1k
JP1
J_
VOM1271
GND
Рис.
11.7.
Электрическая схема твердотельного реле
Дополнительные сведения
Обратите также внимание на рецепт
механического реле.
11.5,
посвященный использованию электро
322
1
Глава
11
11.7. Управление
высоковольтными устройствами
переменного тока
Задача
Вы хотите использовать устройство
Raspberry Pi для
11 О или 220 В.
включения и выключения
(рис.
или силовое реле с четырь
цепей переменного тока с напряжением
Решение
Используйте устройство
PowerSwitch Tail 11
11.8)
мя выходами 5 . Такие удобные устройства позволяют легко обеспечить безопасное
включение и выключение цепей переменного тока с помощью
Raspberry Pi.
Подоб
но обычным удлинителям, эти устройства снабжены вилкой для подключения
к сети переменного тока с одной стороны, и одной или несколькими розетками
-
с другой. Отличие их от простого удлинителя состоит лишь в том, что посередине
располагается блок управления с тремя зажимными контактами. Если вы подклю
чите контакт
Рис.
5
11.8.
2
к «земле»
(GND),
а контакт
Использование устройства
См. https://oreil.ly/2bqvB.
1-
PowerSwitch Tail
к контакту
GPIO,
устройство будет
совместно с устройством
Raspberry Pi
Управление оборудованием
323
1
выполнять роль переключателя, включающего и выключающего соединенное с ним
устройство цепи переменного тока
Подключив устройство
PowerSwitch Tail,
как показано на рис.
пользовать тот же Python-кoд, который мы привели в рецепте
11.8,
11.1.
вы можете ис
Пояснение
Хотя в составе устройства
PowerSwitch Tail
тоже используется реле, это реле пере
ключается с помощью оптопары, состоящей из светодиода и фотосимистора
(высоковольтного светочувствительного переключателя),
-
когда светодиод заго
рается, фотосимистор начинает пропускать ток, идущий через обмотку реле.
Ток, протекающий через светодиод оптопары, ограничен с помощью резистора так,
чтобы при подаче напряжения
На сайтах еВау и
Amazon
3.3
В от контакта
GPIO
он не превышал
3 мА.
также предлагается много более дешевых аналогичных
устройств.
Дополнительные сведения
Обратите также внимание на рецепт
11.4,
описывающий коммутацию цепей посто
янного тока с помощью мощного МОП-транзистора, и на рецепт
11.5,
посвящен
ный коммутации с использованием реле на макетной плате.
11.8. Управление оборудованием с помощью смартфона
на ОС Android и технологии Bluetooth
Задача
Вы хотите использовать мобильный телефон (смартфон) на операционной системе
Android
и технологию Вluetooth для взаимодействия с устройством
Raspberry Pi.
Решение
Используйте бесплатное приложение
Blue Dot
для
Android
и Руthоn-библиотеку
Ыuedot:
$ sudo
рiрЗ
install
Ыuedot
У становив библиотеку, необходимо сделать устройство
Raspberry Pi доступным
Bluetooth в верхнем правом углу
меню пункт Make DiscoveraЫe (Сде
для обнаружения. Щелкните на значке интерфейса
экрана устройства
Raspberry Pi
и выберите в
лать доступным для обнаружения) (рис.
11.9).
Теперь нужно произвести сопряжение устройства
Активируйте интерфейс
New Device
устройства
Bluetooth
Raspberry Pi
со смартфоном.
на своем смартфоне и выберите команду
Add
(Добавить новое устройство) в меню настройки Вluеtооth-подключений
Raspberry Pi
(рис.
11.1 О).
324
Глава
1
11
see,dwngforetuetood'I deYices...
Make D SCO\e-a:::
е
vivomoveНR
Add Device...
C8nollf
Remove Device...
Рис.
11.9. Делаем
устройство
Raspberry Pi
Рис.
11.10.
Raspberry Pi
со смартфоном
доступным для обнаружения
посредством
Сопряжение устройства
PaiJ
Bluetooth
Выберите в списке свой смартфон и щелкните на кнопке
Pair
(Произвести сопря
жение). После этого на экране смартфона вам будет предложено подтвердить код
для завершения процесса сопряжения.
Когда процесс сопряжения завершится, откройте на своем смартфоне приложение
Play Store,
найдите и установите приложение
Blue Dot.
Чтобы это приложение
могло обеспечить взаимодействие смартфона с устройством
Raspberry Pi,
на этом
устройстве нужно запустить Руthоп-программу (ch_11_Ыuedot.py), использующую
библиотеку Ыuedot для прослушивания эфира в ожидании команд:
illport BlueDot
bd = ВlueDot()
while Тrue:
bd.wait_for_press()
print("You pressed the Ыuе dot!")
fraв Ыuedot
При желании вы можете скачать этот пример кода в порядке, описанном в рецеп
те
3.22.
Теперь откройте на своем телефоне приложение
тупных Вluеtооth-устройств (рис.
Когда вы подключитесь к
Blue Dot.
Вы увидите список дос
11.11 ).
Raspberry Pi, на экране появится та самая
Blue Dot и было названо (рис. 11.12).
синяя точка,
в честь которой приложение
При
каждом
нажатии
в
приложении
Blue Dot
на эту
синюю точку
Python-
пporpaммa будет выводить сообщение You pressed the Ыuе dot ! (Вы нажали на си
нюю точку):
$
pythonЗ ch_ll_Ыuedot.py
Server started B8:27:EB:D5:6C:E9
Waiting for connection
Client connected C0:EE:FB:F0:94:8F
You pressed the Ыuе dot 1
You pressed the Ыuе dott
You pressed the Ыuе dot!
Управпение оборудованием
0
·*•
@ @ !;:
~
55'- ■ 12:32.
•
Blue Dot
325
•
Connect
Q
.,.
-·t
VWPHONE
OO
i!
1!!
•
..
~
: ~l~e Dot : • ,
ОО:26:7Е:9В:ВЕ:45
si's keyЬoard •1
EB:06:88:58:82:BS
.
~.,
55\. ■ 12 33
~
.
Connected to raspberrypl
SI
АО:99:9В: 15:9д_С4
Lind;i's МасВооk Alr
F0:79:60:1 Э:D5:55
vivomoY1! HR
DЗ:ЭF:АА:68:96:82
Comisot.120
FC:58:FA:2.C:80:81
Рис.
11.11 . Подключение
к устройству
с помощью приложения
Raspberry Pi
Blue Dot
Рис.11 . 12. Синяя точка
Пояснение
Синюю точку можно использовать не только как кнопку , но и как джойстик, позво
ляющий выполнять смахивание, перетаскивание и вращение, поскольку библиотека
Blue Dot позволяет привязывать функции-обработчики к таким событиям, как сма
хивание и вращение. Более подробную информацию об этом можно найти в доку
ментации 6 •
Дополнительные сведения
Более подробную информацию о библиотеке
Blue Dot
можно найти на ее веб
сайте 7 .
В состав этой библиотеки также входит Руthоn-программа, позволяющая с по
мощью приложения
Blue Dot с одного устройства Raspbcrry Pi управлять другим 8 •
Более подробную информацию об использовании интерфейса
стве
6
См. https://oreil.ly/Xza~I ..
7 См .
8
Raspberry Pi можно найти в рецепте 1.17.
https://oreil.ly/hA 102.
См. https://oreil.lyM'klltP .
Bluetooth на устрой
Глава
326
11
11.9. Создание пользовательского
интерфейса
для включения и выключения устройств
Задача
Вы хотите запускать на
Raspberry Pi
приложение с кнопкой для включения и
выключения определенных устройств.
Решение
Используйте
библиотеку
guizero с
тем,
чтобы
обеспечить
пользовательским
интерфейсом функции этой библиотеки , реализующие включение и выключение
контактов
GPIO
Рис.
(рис.
11.13.
11.13).
Реализация кнопок для включения и выключения контактов
с помощью библиотеки
GPIO
guiz er o
Если вы еще этого не сделали, установите библиотеку guizero с помощью команды:
$ sudo
рiрЗ
ins t all guizero
Подключите светодиод или какое-либо другое выходное устройство к 18-му кон
такту
GPIO.
Поскольку начать лучше с самого простого варианта, подключите све
тодиод (см. рецепт
11.1).
Рассматриваемый далее пример кода программы (ch_11_gui_switch.py), создающей
кнопки для включения и выключения контактов
можно скачать в порядке, описанном в рецепте
from gpiozero import Digital Out putDevi ce
from guizero ilrport Арр, PushBut ton
pin
~
Di gi ta l Output Device(l8)
def start( ) :
sta r t
bu t t on . d i saЫ e ()
s top_but ton . e naЫe ( )
pin.on ()
def stop () :
start
bu t ton . enaЫ e ( )
s top_bu tt on . d is aЫ e ( )
pin. off ()
GPIO,
3.22:
показанные на рис .
11 .13,
Управление оборудованием
1
327
арр = App(width=l00, height=l50)
start_button = PushButton(app, corrmand=start, text="On")
start- button.text- size = 30
stop_button = PushButton(app, corrmand=stop, text="Off", enaЬled=False)
stop_button.text_size = 30
app.display()
Пояснение
В этом примере мы создаем две кнопки
-
нажатие одной из них ведет к ее деакти
вации с одновременной активацией второй кнопки. Состояние выходного контакта
мы изменяем с помощью библиотеки
gpiozero -
для чего используются методы
on ()
и off (). Хотя этот пример работал бы точно так же, если бы мы заменили строку
pin = DigitalOutputDevice (18) строкой pin = LED (18), вариант с объектом DigitalOutputDevice
является более универсальным, позволяя вам подключать к 18-му контакту не
только светодиод
(LED),
но и любое другое устройство.
Дополнительные сведения
Рассмотренную здесь программу можно также применить для управления мощ
ными устройствами постоянного тока (см. рецепт
11.4),
реле (см. рецепт
высоковольтными устройствами переменного тока (см. рецепт
Более подробно библиотека
11.1 О.
11.5)
и
11. 7).
guizero обсуждается в рецепте 7.22.
Создание пользовательского интерфейса
для ШИМ-управления мощностью
светодиодов и двигателей
Задача
Вы хотите запускать на
Raspberry Pi
приложение с ползунковым регулятором,
позволяющим управлять мощностью какого-либо устройства с использованием
широтно-импульсной модуляции (ШИМ).
Решение
Используя библиотеку gpiozero и фреймворк пользовательского интерфейса guizero,
напишите Python-пporpaммy, позволяющую с помощью ползункового регулятора
регулировать скважность ШИМ-сиrнала в диапазоне от О до
Подключите к 18-му контакту
GPIO
100% (рис. 11.14).
светодиод или какое-либо другое выходное
устройство, позволяющее управлять его мощностью с помощью ШИМ. Начать
лучше с самого простого варианта, подключив светодиод (см.рецепт
11.1).
Откройте редактор, введите или вставьте в него приведенный далее код программы
и сохраните его в файле под именем ch_ 11_gui_slider.py (при желании вы можете ска
чать этот файл в порядке, описанном в рецепте
3.22):
328
Глава
11
: :·
Рис.
11.14.
-
□
х
Пользовательский интерфейс для ШИМ-управления мощностью
from gpiozero import PWМOutputDevice
from guizero iqюrt Арр, Slider
pin = PWMOutputDevice(18)
def slider_changed(percent):
pin.value = int(percent) / 100
арр = App(title='PWМ', width=500, height=150)
slider = Slider(app, command=slider_changed, width='fill', height=S0)
slider.text size = 30
app.display()
Затем запустите эту программу с помощью команды:
$
pythonЗ
gui_slider.py
Пояснение
В этом примере используется класс
Slider. В качестве параметра coпrnand этот класс
принимает название той функции, которая должна запускаться при каждом измене
нии значения ползункового регулятора,
- в нашем случае это функция slicter_
changed, обновляющая значение мощности выходного контакта. Функция slider_
changed принимает в качестве параметра процентное значение в диапазоне от О
до
100,
представленное в виде строки,
-
поэтому мы преобразуем эту строку
в число с помощью функции int и делим результат на
ние мощности ШИМ-сигнала в диапазоне от О до
100,
чтобы получить значе
1.
Дополнительные сведения
Эту программу можно использовать для управления светодиодом (см.рецепт
двигателем постоянного тока (см.рецепт
ного тока (см. рецепт
11.4).
12. 4)
11.1),
или мощным устройством постоян
Управление оборудованием
11.11. Создание пользовательского
\
329
интерфейса
для изменения цвета RGВ-светодиода
Задача
Вы хотите управлять цветом RGВ-светодиода
.
Решение
Используйте ШИМ для управления мощностью сигнала в каналах красного, зеле
ного и синего цвета RGВ-светодиода.
В этом рецепте вам понадобятся :
♦
макетная плата и соединительные провода ( см. разд. «Оборудование и комплек
ты для прототипирования» прwюжения
♦ три резистора с сопротивлением
ры» прwюжения
♦
470
1);
Ом (см. разд. «Резисторы и конденсато-
1);
RGВ-светодиод с общим катодом (см.разд. «Оптоэлектроника» приложения
На рис.
11.15
1).
показано, каким образом вы можете подключить RGВ-светодиод на
макетной плате. Проследите за тем, чтобы светодиод был правильно ориентиро
ван,
-
самый длинный его вывод должен быть вторым по счету, если считать от
верхнего края макетной платы. Этот вывод RGВ-светодиода называется общим ка
тодом, потому что внутри корпуса светодиода отрицательные выводы (катоды)
красного, зеленого
и синего светодиодов соединены
вместе с
целью уменьшения
количества необходимых выводов.
Если вы не хотите возиться с подключением резисторов на макетной плате, вместо
этого можно использовать «осьминожный» модуль RаsрЬепу
Рис.
11.15.
Управление RGВ-светодиодом с помощью
Squid (см.рецепт 10.1О).
Raspberry Pi
330
Глава
11
Рис.
11.16.
Пользовательский интерфейс для управления RGВ-светодиодом
Представленная далее
программа использует три
ползунковых регулятора для
управления красным, зеленым и синим каналами светодиода (рис.
11.16).
Откройте редактор, введите или вставьте в него приведенный далее код программы
и сохраните его в файле под именем ch_ 11_gui_slider_RGB.py (при желании вы може
те скачать этот файл в порядке, описанном в рецепте
from gpiozero ~ r t RGBLED
from quizero import Арр, Slider
from colorzero inчюrt Color
rgb_led = RGBLED(18, 23, 24)
red = О
green = О
Ыuе = О
daf red_changed(value):
qloЬal red
red = int(value)
rgb_led.color = Color(red, green,
Ыuе)
daf green_changed(value):
qloЬal green
green = int(value)
rgb_led.color = Color(red, green,
Ыuе)
daf
Ыue_changed(value):
qlobal Ыuе
Ыuе = int(value)
rgb_led.color = Color(red, green,
арр
Ыuе)
= App(title='RGB LED', width=500, height=400)
3.22):
Управление оборудованием
1
331
Slider(app, command=red_changed, end=255, width='fill', height=50) .text_size = 30
Slider(app, command=green_changed, end=255, width='fill', height=S0) .text_size = 30
Slider(app, command=Ьlue_changed, end=255, width='fill', height=50) .text_size = 30
арр.
display ()
Пояснение
В этой программе используется тот же подход, что и в программе с одним каналом
ШИМ-управления, рассмотренной нами в рецепте
11. 1О.
Однако здесь мы должны
задействовать три канала ШИМ-управления и три ползунковых регулятора
-
по
одному для каждого цвета.
Хотя для нашего примера взят RGВ-светодиод с общим катодом, вы можете ис
пользовать в нем и RGВ-светодиод с общим анодом, подключив общий анод к пи
тающему выводу разъема
GPIO
с напряжением
вовать противоположным образом
а О
-
т. е.
-
255
3,3
В. Ползунки тогда станут дейст
будет соответствовать отключению,
полному включению.
Для использования в этом проекте лучше выбрать светодиод с рассеянным свече
нием, поскольку у таких светодиодов лучше смешиваются друг с другом основные
цвета.
Дополнительные сведения
Если вам нужно обеспечить ШИМ-управление только одним каналом, обратитесь
к рецепту
11.10.
11.12. Использование аналогового
измерителя
в качестве устройства отображения
Задача
Вы хотите подключить к
Raspberry Pi
аналоговый щитовой вольтметр.
Решение
Если у вас есть
ШИМ-выход
5-вольтовый аналоговый вольтметр,
Raspberry Pi
ключив отрицательный вывод вольтметра к «земле»
вывод
-
к контакту
GPIO
вы
можете использовать
для непосредственного управления вольтметром, под
(рис.
11.17).
(GND),
а его положительный
Стандартный вольтметр на
5
В позволит
при этом отображать только напряжения в диапазоне от О до
3,3
Чтобы сделать доступным почти весь диапазон
В, надо применить для
-
от О до
5
В.
переключения ШИМ-сигнала транзистор, ограничив ток базы транзистора с по
мощью резистора с сопротивлением
1 кОм.
332
Глава
11
Рис.
11.17.
Подключение вольтметра непосредственно к контакту
GPIO
В этом рецепте вам понадобятся:
♦
♦
щитовой вольтметр на
5В
(см. ртд. «Прочее» прило:нсения
макетная плата и соединительные провода (см. ртд. «Оборудование и комплек
ты для прототипирования» 11рwю.же11ия
♦
1);
два резистора с сопротивлением
прwюжения
♦ транзистор
I
1);
кОм (см. разд. «Резисторы и кондеж:аторы»
1);
2N3904
(см. ртд. «Траюисторы и диоды» прwюжения
1).
Соответствующая схема подключений на макетной плате показана на рис.
11. 18.
Пояснение
Чтобы опробовать эту схему в действии, можно задействовать ту же программу,
с помощью которой мы управляли яркостью светодиода в рецепте
11.1 О.
Можно заметить, что стрелка прибора ведет себя достаточно стабильно в начале и
в конце шкалы, и
немного колеблется
в ее середине. Это является побочным
эффектом реализуемого здесь способа генерирования ШИМ-сигнала. Для получе-
Управление оборудованием
Рис.
11.18.
Подключение щитового вольтметра на
с напряжением
5В к
3,3 В
питающему выводу разъема
1
333
GPIO
ния более стабильного результата можно применить для генерирования ШИМ
сигнала внешнее оборудование- например, 16-канальный модуль, используемый
в рецепте
12.3.
Дополнительные сведения
Подробнее о принципе действия традиционного аналогового вольтметра можно
прочитать в Википедии 9 •
Использование
Raspberry Pi
совместно с макетной платой и соединительными про
водами более подробно рассматривается в рецепте
9
См . https://oreil.ly/RnUa.
10.9.
ГЛАВА
12
Двигатели
12.0. Введение
Эта глава посвящена использованию совместно с
Raspberry Pi
различных типов
электродвигателей, включая двигатели постоянного тока, сервоприводы и шаговые
двигатели.
Электродвигатели существуют самых разных форм и размеров (рис.
12.1).
Наибо
лее распространенными среди них являются простые щеточные двигатели постоян
ного тока, какими обычно оснащаются игрушечные автомобили. В этой главе мы
также обсудим сервоприводы, позволяющие задавать положение вала с помощью
импульсов, генерируемых устройством
Raspberry Pi,
и шаговые двигатели, кото
рые, в соответствии с их названием, вращаются не плавно, а посредством мелких
шажков, обеспечиваемых последовательной подачей питания на их обмотки.
Рис.
12.1.
Некоторые виды электродвигателей
12.1. Управление сервоприводами
Задача
Вы собираетесь использовать
привода.
Raspberry Pi
для управления положением вала серво
Двигатели
335
1
Решение
Угол поворота вала сервопривода можно изменять, управляя шириной подаваемых
на сервопривод импульсов с помощью широтно-импульсной модуляции (ШИМ).
Этот подход работает, но в силу некоторой нестабильности генерируемого ШИМ
сиrнала при вращении вала сервопривода будет иметь место характерное дрожа
ние.
В качестве альтернативы
можно использовать решения,
более стабильную длительность импульсов (см. рецепты
12.2
и
обеспечивающие
12.3).
Raspberry Pi 1 сервопривод следует запитывать от отдельного
в противном случае всплески тока на
источника питания с напряжением 5 В грузки могут привести к сбою или перегрузке устройства. Используя Raspberry Pi
При использовании
В+ или более новую версию устройства с более совершенной схемой стабилизации
напряжения, небольшие сервоприводы иногда можно запитывать непосредственно
от 5-вольтовоrо вывода разъема
На рис.
12.2
GPIO.
показан пример непосредственного подключения к
небольшого сервопривода массой
Рис.
12.2.
Raspberry Pi
«Прочее» приложения
9 r (см. разд.
Подключение небольшого сервопривода непосредственно к
В+
1).
Raspberry Pi
В+
Выводы сервоприводов обычно маркируются цветом следующим образом: красный
вывод
-
5 В,
коричневый
-
«земля», оранжевый
-
вывод управления. 5-вольто
вый и заземляющий выводы подключаются к штыревым выводам
ема
GPIO,
а управляющий вывод
соединением
разъема
гнездовых
GPIO.
-
контактов
к выводу
выводов
18.
5V
и
GND
разъ
Эти подключения производятся
привода
со
штыревыми
контактами
Глава
336
12
При использовании отдельного источника питания полезно разместить все соеди
нения в одном месте на макетной плате.
В этом рецепте вам понадобятся:
♦
сервопривод с напряжением питания
♦
макетная плата и соединительные провода ( см. ртд. «Оборудование и комплек
5
В (см.разд. «Прочее» приложения
ты для прототипирования» 11рuю.ж-е11ия
♦
резистор с сопротивлением
I
1);
1);
кОм (см. ртд. «Резисторы и конденсаторы» при
ложения]);
♦
источник питания с напряжением
ния
1)
5
В и током
или батарейный блок с напряжением
1А
4,8
(см.разд. «Прочее» прwюже
В.
Соответствующая схема подключений на макетной плате показана на рис.
Рис.
12.3.
12.3.
Управление сервоприводом
В принципе, можно обойтись и без резистора с сопротивлением
жит лишь для защиты контакта разъема
GPIO
1
кОм
-
он слу
при поступлении управляющего сиг
нала со слишком большим током, что может случиться при сбое в сервоприводе.
При желании вместо одного источника питания можно использовать батарейный
блок. Большинство сервоприводов будут прекрасно работать от блока из четырех
аккумуляторов типа АА, дающих в сумме около
4,8
В. Многие сервоприводы также
можно запитывать от четырех щелочных элементов типа АА, дающих в сумме
6
В,
однако лучше убедитесь, что такое напряжение допустимо в вашем случае, ознако
мившись с характеристиками сервопривода.
Пользовательский интерфейс для управления углом поворота сервопривода в этом
рецепте
создавался
на
основе
программы
для
управления
яркостью
светодиода
Двигатели
ch_ 11_gui_slider.py (см. рецепт
11.1 О).
337
Однако при желании вы можете изменить этот
интерфейс таким образом, чтобы задавать с помощью ползункового регулятора
угол в диапазоне от
Рис.
-90
12.4.
до
90
градусов (рис.
12.4 ).
Пользовательский интерфейс для управления сервоприводом
Откройте редактор, введите или вставьте в него приведенный далее код программы
и сохраните его в файле под именем ch_12_servo.py (при желании вы можете скачать
этот файл в порядке, описанном в рецепте
3.22):
from gpiozero import AngularServo
from guizero import Арр, Slider
servo = AngularServo( l8, min_pulse_width=0.5/1000, max_pul s e_width=2 .5/1000)
def slider_changed( angle):
servo.angle = i nt (angle)
арр = App(title='Servo Angl e ', width=50 0, height=l50)
slider = Slider(app, start=-90 , end=90, command=slider_changed, width='fill', height=50)
slider.text size = 30
app.display()
Поскольку эта программа реализует графический пользовательский интерфейс, ее
SSH или терминал, - запускать ее следует
Raspberry Pi или путем удаленного доступа на
нельзя выполнять, используя протокол
из оконной среды на устройстве
основе протокола
VNC
(см. рецепт
2.8).
Всю работу по генерированию импульсов здесь выполняет класс Angularservo из
библиотеки gpiozero. Нам остается лишь указать, на какой угол нужно повернуть
вал сервопривода. В большинстве других программ для управления сервопривода
ми угол задается в диапазоне от О до
ворота в одну сторону,
90 -
180
градусов, где О
середина и
180 -
-
максимальный угол по
максимальный угол поворота
в другую сторону. Библиотека gpiozero поступает иным, более логичным образом:
здесь середине соответствует О, углам поворота в одну сторону
значения, и углам поворота в другую сторону
-
-
отрицательные
положительные.
При определении сервопривода первый параметр указывает управляющий вывод
сервопривода (в нашем
max_pulse_width
случае
18).
Опциональные параметры min _pulse _width и
задают минимальную и максимальную длительность импульса в се
кундах. У типичного сервопривода эти значения составляют
0,5
и
2,5
миллисекун-
Глава
338
12
ды. По непонятной причине в библиотеке gpiozero они по умолчанию принимаются
равными
1
и
миллисекундам, вследствие чего сервопривод будет иметь очень
2
ограниченный диапазон движения, если вы не зададите эти значения, как сделано
здесь.
Пояснение
Сервоприводы используются в транспортных средствах с дистанционным управле
нием и в робототехнике. В отличие от сервоприводов непрерывного вращения,
у которых нет ограничений по углу поворота, большинство сервоприводов могут
вращаться лишь в пределах углового диапазона, составляющего около
180
граду
сов.
Положение вала сервопривода определяется длительностью импульсов, поступаю
щих с частотой не менее одного раза в
ной
0,5
20
миллисекунд. При длине импульса, рав
миллисекунды, сервопривод поворачивается на
импульса в
1,5
градусов, при длине
-90
миллисекунды он переводится в среднее положение (О градусов),
а при длине импульса в
2,5
миллисекунды поворачивается на
90
градусов (рис.
12.5).
-
-
0,5
1,5
мс
20
Рис.
2,5
мс
мс
мс
12.5. Длительность
управляющих импульсов сервопривода
Если вам нужно подключить несколько сервоприводов, это будет проще сделать,
используя плату
Servo Six Board
компании
MonkMakes
(рис.
12.6).
Дополнительные сведения
Если требуется управлять несколькими сервоприводами или добиться повышенной
стабильности и точности их вращения, можно использовать специальный модуль
сервоконтроллера, описанный в рецепте
12. 3.
Двигатели
Рис .
12.6.
Подключение сервоприводов с помощью платы
Servo Six
1
339
Воагd
Более подробную информацию можно найти в пол ной доку ментации по плате
Servo Six Board 1•
Еще один метод управления сервоприводом предлагает компания
В рецепте
12.2
Adafruit2.
приводится альтернативное решение , которое позволяет получить
намного более стабильную длительность управляющих импул ьсов за счет исполь
зования драйвера
ServoBlaster.
12.2. Прецизионное управление сервоприводами
Задача
Поскольку функция для генерирования импульсов из библиотеки gp i oze r o обеспе
чивает недостаточную точность или в недостаточной мере устраняет дрожание для
вашего способа применения сервопривода, вы хотите устранить эту проблему.
1
См . https://oreil.ly/ual nS.
2
См. https://oreil.ly/tprnc.
340
Глава
12
Решение
Установите драйвер vстройства
ServoBlaster
Драйвер
Pi,
--
ServoBlaster.
и звук
ServoBlaster
задействует в работе ту часть электронной схемы
Raspberry
которая также служит для генерирования звука. Поэтому при использовании
этого драйвера вы не сможете воспроизводить звук через аудиоразъем или разъем
HDMI
своего устройства
Созданный Ричардом Херстом
Raspberry Pi.
(Richard Hirst)
драйвер
ServoBlaster за счет исполь
Raspberry Pi обеспечи
зования возможностей центрального процессора устройства
вает намного более точное управление длительностью генерируемых импульсов по
сравнению с тем, чего можно добиться с помощью библиотеки gpiozero. У становите
драйвер ServoЫaster, выполнив следующие команды, после чего перезагрузите свое
устройство
Raspberry Pi:
$ git clone https://githuЬ.com/srcshelton/servoЫaster.git
$ cd servoЫaster
$ sudo make
$ sudo make install
Вы можете модифицировать программу из рецепта
использовала драйвер
ServoBlaster.
12.1
таким образом, чтобы она
Модифицированная версия этой программы
содержится в файле ch_ 12_servo_Ыaster.py (при желании вы можете скачать его в по
рядке, описанном в рецепте
3.22).
В программе предполагается, что управляющий
вывод сервопривода подключен к выводу
import os
from guizero import
servo min = 500 #
servo max = 2500 #
servo = 2
#
Арр,
18
разъема
GPIO:
Slider
мкс
мкс
ВЬ1Вод
18
разъема
GPIO
def map(value, from_low, from_high, to_low, to_high):
from_range = from_high - from_low
to_range = to_high - to_low
scale_factor = float(from_range) / float(to_range)
return to low + (value / scale_factor)
def set_angle(angle):
pulse = int(map(angle+90,
comnand = "echo ( }={ )us >
os.system(coпrnand)
def slider_changed(angle):
set_angle(int(angle))
О,
180, servo_min, servo_max))
fonnat (servo, pulse)
/dev/servoЫaster".
341
Двигатели
= App(title='Servo Angle', width=500, height=l50)
slider = Slider(app, start=-90, end=90, command=slider_changed, width='fill', height=50)
slider.text size = 30
app.display()
арр
Код пользовательского интерфейса здесь почти такой же, что и в рецепте
12.1,
и отличается только функцией set_angle. Эта функция сначала вызывает сервисную
функцию map, которая преобразует угол в длительность импульса, используя кон
станты servo_min и servo_max. После этого она формирует строку управляющей
команды с тем, чтобы затем ее выполнить так же, как при запуске из командной
строки. Начинает эту строку команда
echo, за которой следует номер управляемого
сервопривода, знак равенства и длительность импульса в микросекундах. Эта стро
ковая часть команды передается устройству /dev/servoЫaster, после чего сервопри
вод соответствующим образом изменяет угол поворота вала.
Отключение драйвера
ServoBlaster
Пока работает драйвер ServoЫaster, или, точнее, служба
servo.d,
вы не сможете
использовать контакты сервопривода для каких-то иных целей, а Raspberry Pi не
будет воспроизводить звук. Поэтому, если вам нужно задействовать эти контакты
для каких-либо других задач, отключите драйвер ServoBlaster с помощью следую
щих команд и перезагрузите свое устройство
$ sudo update-rc.d
$ sudo reboot
Raspberry Pi:
servoЫaster disaЫe
Когда ваш мини-компьютер перезагрузится, драйвер ServoBlaster уже не будет
управлять его контактами, и вы снова сможете использовать их для работы со зву
ком. При этом драйвер ServoBlaster всегда можно будет включить снова, используя
следующие команды:
$ sudo update-rc.d
$ sudo reboot
servoЫaster еnаЫе
Пояснение
Драйвер
ServoBlaster
обладает мощными возможностями и может быть настроен
для управления сервоприводами практически всех выводов разъема
GPIO.
По
умолчанию для управления сервоприводами используются восемь выводов разъема
GPIO,
каждому из которых присваивается определенный номер канала (табл.
Таблица
12.1.
Схема распределения выводов между каналами сервоприводов,
используемая драйвером
SeNoB/aster по умолчанию
Канал
Вывод разъема
Канал
Вывод разъема
сервопривода
GPIO
сервопривода
GPIO
о
4
4
22
17
5
23
18
6
24
27
7
25
1
-
-------
-
12.1 ).
2
-
3
-
-
-
-
----
----
-
i
- - -
--
342
1
Глава
12
Подключение столь большого количества сервоприводов может привести к чрез
мерно сложной схеме разводки проводов. Используя плату
нии
MonkMakes
(см. рис.
12.6)
Servo Six Board
компа
или другую аналогичную плату, можно существенно
упростить монтажную схему подключения сервоприводов к
Raspberry Pi.
Дополнительные сведения
Более подробную информацию по драйверу
ServoB\aster
можно найти в его полной
документации 3 .
Если вы не нуждаетесь в прецизионном управлении длительностью импульсов,
обеспечиваемом
драйвером
то
ServoB\aster,
для
генерирования
управляющих
импульсов для сервопривода можно использовать библиотеку gpiozero, как предла
гается в рецепте
12.1.
12.3. Прецизионное управление
несколькими сервоприводами
Задача
Вам нужно обеспечить прецизионное управление несколькими сервоприводами, не
лишаясь при этом звуковых возможностей, как это происходит при использовании
драйвера
ServoB\aster.
Решение
Хотя драйвер
ServoB\aster
(см. рецепт
12.2)
позволяет прецизионно управлять
работой до восьми сервоприводов, при этом он берет под свой контроль опреде
ленную часть электронной схемы устройства
Raspberry Pi
и делает невозможным
генерирование звука.
Альтернативой использованию драйвера
ServoB\aster
является применение для
управления сервоприводами платы стандарта НА Т (наподобие той, что показана на
рис.
12.7).
Такая плата содержит собственную электронную схему для управления
сервоприводами,
что избавляет от этой
задачи электронику устройства
Rasp-
berry Pi.
Упомянутая здесь плата расширения стандарта НА Т компании
Adafruit
позволяет
управлять работой до 16 сервоприводов или каналов ШИМ через интерфейс
устройства
Raspberry Pi.
I2c
При этом сервоприводы подключаются непосредственно
к плате расширения.
Логические схемы платы расширения запитываются от вывода питания
устройства
Raspberry Pi,
ного внешнего источника с напряжением
3
См. https://oreil.ly/RwwDz.
3,3
В
в то время как сервоприводы получают питание от отдель
5 В.
Двигатели
Рис.
12.7.
Плата стандарта НАТ компании
Adafruit для
343
управления сервоприводами
При желании вместо одного источника питания можно использовать батарейный
блок. Большинство сервоприводов будут прекрасно работать от блока из четырех
аккумуляторов типа АА, дающих в сумме около
4,8
В. Многие сервоприводы также
можно запитывать от четырех щелочных элементов типа АА, дающих в сумме
6
В,
однако лучше убедитесь, что такое напряжение допустимо в вашем случае, ознако
мившись с характеристиками сервопривода.
Штыревые контакты для подключения сервоприводов на плате специально распо
ложены так, чтобы на них можно было надевать разъемы выводов сервопривода
с гнездовыми контактами. Однако следите за тем, чтобы подключаемые разъемы
были повернуты к вам правильной стороной .
Чтобы воспользоваться программным обеспечением для этой платы, предлагаемым
компанией Adafruit, потребуется произвести настройку интерфейса 1 2 С устройства
Raspberry Pi
(см. рецепт 10.4) и доустановить кое-какое вспомогательное про
граммное обеспечение от
Adafruit,
требуемое для работы с целым рядом их плат
расширения.
Так, чтобы установить необходимый для этой платы код библиотеки adafruit-Ыinka,
выполните следующие команды:
$
рiрЗ
$ sudo
install adafruit-Ыinka
install adafruit - circuitpython-s ervokit
рiрЗ
Откройте редактор, введите или вставьте в него приведенный далее код программы
и сохраните его в файле под именем ch_ 12_servo_adafruit.py (при желании вы можете
скачать этот файл в порядке, описанном в рецепте
3.22):
Глава
344
12
from adafruit_servokit import ServoKit
from guizero import Арр, Slider
servo_kit =
ServoKit(channels=lб)
def slider_changed(angle):
servo_kit.servo[0] .angle = int(angle) + 90
арр = App(title='Servo Angle', width=500, height=150)
slider = Slider(app, start=-90, end=90, coпmand=slider_changed, width='fill', height=50)
slider.text size = 30
app.display ()
При запуске этой программы на экран выводится такое же окно с ползунковым ре
гулятором, как приведенное на рис.
12.4. Перемещая
ползунок, вы можете изменять
положение вала сервопривода. Поскольку программное обеспечение от
несовместимо с
Python 2,
граммное обеспечение от
Adafruit
вы должны использовать программы, запускающие про
Adafruit с
помощью команды pythonЗ.
Надо также учесть, что эта программа реализует графический пользовательский
интерфейс, и поэтому ее нельзя выполнять, используя протокол
нал,
-
запускать ее следует из оконной среды на устройстве
тем удаленного доступа на основе протокола
$
pythonЗ
VNC
(см. рецепт
SSH или терми
Raspberry Pi или пу
2.8):
ch_12_servo_adafruit.py
В отличие от библиотеки gpiozero, работающей в диапазоне от -90 до
программное обеспечение от
Adafruit
90
градусов,
обеспечивает диапазон углов от О до
180
гра
дусов. Поэтому, чтобы не вносить изменения в пользовательский интерфейс, к ве
личине угла, предоставляемой ползунковым регулятором, добавляется число
Для выбора конкретного канала сервопривода из
зать номер канала (в диапазоне от О до
15)
16
90.
доступных каналов надо ука
внутри квадратных скобок в команде
servo_kit.servo[0] .angle.
Пояснение
При выборе источника питания для этой платы следует иметь в виду, что потреб
ляемый ток у стандартного сервопривода с дистанционным управлением состав
ляет до
400
мА при движении без нагрузки и еще больше при движении под на
грузкой. Поэтому, чтобы обеспечить одновременное движение сразу нескольких
сервоприводов, потребуется достаточно мощный источник питания.
Дополнительные сведения
Ознакомиться с более подробной информацией по этому продукту компании
Adafruit можно
4
на ее сайте 4 .
См. https://oreil.ly/Oizzu.
Двигатели
1
345
Использование платы стандарта НА Т для управления сервоприводами будет от
личным решением в том случае, когда сервоприводы расположены рядом с устрой
ством
Raspberry Pi,
но если они находятся достаточно далеко от него, можно
применить другой модуль для управления сервоприводами от
продукта
815),
Adafruit
(с кодом
в котором используется та же аппаратура для управления сервопри
водами, но подключение к
контактов интерфейса 1 2 С.
Raspberry Pi
12.4. Управление скоростью
производится с помощью только четырех
вращения двигателя
постоянного тока
Задача
Обеспечить управление скоростью вращения двигателя постоянного тока с помо
щью устройства
Raspberry Pi.
Решение
Здесь можно использовать такую же схему подключения, что и в рецепте
11.4.
Однако параллельно двигателю следует подключить диод (можно применить диод
1N4001 ), чтобы всплески напряжения не вывели из строя транзистор или устройст
Raspberry Pi. Проследите только за тем, чтобы диод был направлен в нужную
сторону, ориентируясь по полоске, которой помечен один из его концов (рис. 12.8).
во
Источник питания
ПОСТОЯННОГО тока
Рис.
12.8.
Управление двигателем большой мощности
Глава
346
12
В этом рецепте вам понадобятся:
♦
двигатель постоянного тока с напряжением питания от
♦
макетная плата и соединительные провода (см. разд. «Оборудование и комплек
ты для прототипировт1ию) приложения
♦
резистор с сопротивлением
1 кОм
3 до 12
В;
1);
(см. разд. «Резисторы и конденсаторь/)) при
ложения});
♦
полевой МОП-транзистор FQPЗ0N06L (см. разд. «Транзисторы и дuодьР) приложения
1);
♦
диод
♦
источник питания с напряжением, подходящим для используемого двигателя.
1N4001
(см.разд.
(( Транзисторы
и дuодьт приложения
1);
При желании вы можете скачать программу для этого рецепта
в порядке, описанном в рецепте
(ch_ 12_gui_slider.py)
3.22)
Обратите внимание, что эта программа реализует графический пользовательский
интерфейс, и поэтому ее нельзя выполнять, используя протокол
нал,
-
запускать
путем удаленного
SSH или терми
ее следует из оконной среды на устройстве Raspberry Pi или
доступа на основе протокола VNC (см.рецепт 2.8).
Пояснение
При использовании маломощного двигателя постоянного тока (у которого потреб
ляемый ток составляет менее
вый) транзистор
жения
рис.
1).
-
200 мА) можно взять менее мощный
2N3904 (см. разд. ((Транзисторы и
например,
(и более деше
диоды» прило
Соответствующая схема подключений на макетной плате показана на
12.9.
Рис.
12.9.
Управление двигателем малой мощности
Двигатели
1
34 7
Небольшие двигатели иногда можно запитывать от 5-вольтовой линии питания
разъема
GPIO,
однако если
Raspberry Pi
отказывается работать при таком способе
подключения, примените внешний источник питания, как показано на рис.
12.8.
Дополнительные сведения
Более подробно об использовании
Raspberry Pi
совместно с макетной платой и со
единительными проводами рассказывается в рецепте
10.9.
Представленная здесь схема подключения двигателя позволяет управлять только
скоростью его вращения. Чтобы также обеспечить управление направлением вра
щения двигателя, воспользуйтесь рецептом
12.5. Управление направлением
12. 5.
вращения двигателя
постоянного тока
Задача
С помощью устройства
Raspberry Pi
обеспечить одновременное управление и ско
ростью, и направлением вращения небольшого двигателя постоянного тока.
Решение
Используйте одну из микросхем или модулей, реализующих схему Н-моста. Самой
распространенной из них является дешевая и простая в использовании микросхе
ма
L293D.
Если другие микросхемы и модули этого типа обычно задействуют одну
и ту же пару управляющих выводов для управления всеми двигателями, то микро
схема
L293D
реально позволяет управлять двумя двигателями, не используя какое
либо дополнительное оборудование.
В разд. «Пояснение» также будут представлены и некоторые другие способы управ
ления двигателями постоянного тока. Чтобы испытать на практике управление дви
гателем с помощью микросхемы
♦
♦
L293D,
вам понадобятся:
двигатель постоянного тока с напряжением питания от
3 до 12
В;
макетная плата и соединительные провода типа «штырь-гнездо» (см.разд. «Оборудование и ко.wплекты для прототипирования» приложения
1);
♦
микросхема
♦
источник питания с напряжением, подходящим для используемого двигателя.
L293D
(см. разд. «ИнтегрШlьные схемы» приложения
1);
Соответствующая схема подключений на макетной плате показана на рис.
12.1 О.
Проследите за тем, чтобы микросхема была правильно ориентирована, для чего
расположите ее так, чтобы помеченной выемкой край был направлен в сторону
верхнего края макетной платы.
Тестоваяя программа для этого рецепта (ch_ 12_motor_control.py) позволяет ввести
букву
t
или r, а за ней
-
цифру от О до
9.
После этого двигатель будет вращаться
Глава
348
12
Рис.
12.10.
вперед или назад (если
О означает остановку, а
Управление двигателем с помощью микросхемы
r)
L293D
с соответствующей указанной цифре скоростью, где
9 - максимальную
скорость:
$ pythonЗ ch_12_motor_control.py
Command, f/r о .. 9, E.g. f5 :f5
Command, f/r о .. 9, E.g. f5 : f1
Command, f/r о .. 9, E.g. f5 :f2
Command, f/r о .. 9, E.g. f5 :r2
Оrкройте редактор, введите или вставьте в него представленный далее код про
граммы и сохраните его в файле под именем ch_12_motor_control.py (при желании вы
можете скачать этот файл в порядке, описанном в рецепте
3.22).
Эта программа использует командную строку, поэтому ее можно запустить, ис
пользуя протокол
SSH
или терминал:
from gpiozero i.mport Motor
motor = Motor(forward=23, backward=24)
while
Тrue:
cmd = input("Command, f/r
О .. 9, E.g. f5 :")
direction = cmd[0]
speed = float(cmd[l)) / 10.0
if direction == "f":
motor.forward(speed=speed)
Двигатели
349
else:
motor.backward(speed=speed)
Библиотека gpiozero очень кстати содержит класс Motor, который мы можем исполь
зовать для управления скоростью и направлением вращения отдельного двигателя
постоянного тока. При создании экземпляра этого класса необходимо указать но
мера управляющих выводов для прямого и обратного вращения
( соответственно
forward И backward).
Методы forward и backward класса Motor принимают опциональный параметр скоро
сти, значение которого может находиться в диапазоне от О до
1,
где
1-
макси
мальная скорость.
Пояснение
Класс Motor библиотеки gpiozero реализует мелкие подробности внутреннего устрой
ства аппаратного обеспечения И-моста.
Принцип действия И-моста показан на рис.
12.11,
где для простоты управляющие
транзисторы или микросхемы представлены в виде переключателей. Н-мост изме
няет направление вращения двигателя, изменяя направление протекающего через
него тока.
+v------------------sз
Sl
А
в
S2
S4
-V _______.....,___________.
Рис.
На рис.
12.11
12.11.
Н-мост
представлен тот случай, когда переключатели
а переключатели
S2
и SЗ
-
S1
и
S4
замкнуты,
разомкнуты. Такое состояние переключателей обеспе
чивает протекание тока через двигатель с приложением к точке А положительного,
а к точке В
тели
S2
-
отрицательного потенциала. Если мы, наоборот, замкнем переключа
и SЗ и разомкнем переклю<rатели
S 1 и S4,
то двигатель начнет вращаться
в противоположном направлении, с приложением к точке А отрицательного, а
к точке В
-
положительного потенциала.
Как вы можете заметить, использование такой схемы несет и определенный риск.
Если по какой-либо случайности будут одновременно замкнуты переключатели
и
S2,
S1
то положительный полюс источника питания будет напрямую соединен с его
350
Глава
12
отрицательным полюсом, и, таким образом, вы получите короткое замыкание. То
же самое произойдет и при одновременном замыкании переключателей SЗ и
S4.
Хотя Н-мост можно реализовать и с помощью отдельных транзисторов, проще для
этой цели использовать специальную микросхему вроде
L293D.
Эта микросхема
в действительности включает в себя два Н-моста и соответственно может исполь
зоваться для управления двумя двигателями. Она также содержит логику, исклю
чающую
вероятность
возникновения
замыканию переключателей
Микросхема
S 1 и S2
(backward).
одновременному
использует для обеих каналов управления двигателем два
L293D
управляющих вывода: вывод прямого вращения
щения
эквивалентной
ситуации,
на нашей схеме.
(jorward)
и вывод обратного вра
При высоком напряжении на выводе прямого вращения
и низком напряжении на выводе обратного вращения
в одном направлении, а противоположном случае
-
(23)
двигатель вращается
(24)
в другом.
В качестве альтернативы использованию микросхемы
L293D
с установкой ее на
макетной плате на еВау предлагаются очень недорогие модули, представляющие
собой печатную плату с установленной микросхемой
L293D,
винтовыми зажимами
для подключения двигателей и штыревыми выводами для подключения непосред
ственно к разъему
GPIO
устройства
Raspberry Pi.
При желании можно найти и
мощные модули контроллера двигателя, которые при том же принципе действия
допускают более высокие значения тока (до 20А и более). В частности, впечат
ляющий
ассортимент
таких
контроллера
плат
двигателя
предлагает
компания
Pololu.
Дополнительные сведения
Для управления скоростью и направлением вращения двигателя постоянного тока
также можно использовать плату стандарта НА Т для управления шаговыми двига
телями компании
Adafruit
(см.рецепт
12.8).
Ознакомиться с описанием микросхемы
пании
SparkFuп 6
и модуля драйвера двигателя ком
L293O 5
можно в указанных источниках.
Более подробно об использовании
Raspberry Pi
совместно с макетной платой и со
единительными проводами рассказывается в рецепте
12.6. Использование униполярноrо
1 О. 9.
шагового двигателя
Задача
С помощью устройства
Raspberry Pi
двигателем с пятью выводами.
5
См. https://oreil.ly/OXffw.
6
См. https://oreil.ly/ZedYj.
обеспечить управление униполярным шаговым
Двигатели
1
351
Решение
Установите для этого на макетную плату микросхему
ULN2803,
представляющую
собой драйвер на парах Дарлингтона.
В мире двигателей шаговые двигатели занимают промежуточное положение между
двигателями постоянного тока и сервоприводами. Они могут вращаться непрерыв
но, подобно обычным двигателям постоянного тока, но в то же время позволяют
очень точно задавать положение вала за счет его пошагового перемещения в обоих
направлениях.
Чтобы воспользоваться этим рецептом, вам понадобятся:
♦
униполярный шаговый двигатель с пятью выводами и напряжением питания
(см. разд. «Прочее» приложения
♦
микросхема
♦
1);
драйвер на парах Дарлингтона (см. разд. «Интеграль
ULN2803 -
ные схемы» приложения
5В
1);
макетная плата и соединительные провода (см. разд. «Оборудование и комплекты для прототипирования» приложения
1).
Схема подключений, использующая микросхему
ULN2803,
показана на рис.
12.12.
Обратите внимание, что эту микросхему можно задействовать для управления дву
мя
шаговыми двигателями.
Чтобы обеспечить управление
вторым двигателем,
нужно соединить следующие четыре управляющих вывода разъема
дами
5-8
микросхемы
теля к выводам
Рис.
12.12.
11-14
ULN2803,
GPIO
с выво
а затем подключить четыре вывода второго двига
микросхемы
ULN2803.
Управление униполярным шаговым двигателем с помощью микросхемы
ULN2803
Небольшой шаговый двигатель может вполне нормально работать при подаче
напряжения питания
будет замечено, что при этом
устройство
5 В от разъема GPIO. Если же
Raspberry Pi может давать сбои, или вам
надо обеспечить работу более
мощного шагового двигателя, запитайте его от отдельного источника питания
(используя вывод
10
микросхемы
ULN2803).
352
Глава
12
Откройте редактор, введите или вставьте в него приведенный далее код программы
и сохраните его в файле под именем ch_12_stepper.py (при желании вы можете ска
чать этот файл в порядке, описанном в рецепте
3.22).
Эта программа использует командную строку и соответственно может быть запу
щена посредством протокола
SSH:
from gpiozero i.mport Motor
i.mport time
coill = Motor(forward=l8, backward=23, pwm=False)
coil2 = Motor(forward=24, backward=l7, pwm=False)
forward_seq = ['FF', 'BF', 'ВВ', 'FВ']
reverse_seq = list(forward_seq) # копирование
reverse_seq.reverse()
сrмска
def forward(delay, steps):
for i in range(steps):
for step in forward_seq:
set_step(step)
time.sleep(delay)
def backwards(delay, steps):
for i in range(steps):
for step in reverse_seq:
set_step(step)
time.sleep(delay)
def set_step(step):
if step = 'S':
coill. stop ()
coil2. stop ()
else:
if step[0] == 'F':
coil 1. forward ()
else:
coil 1. backward ()
if step[l] == 'F':
coil2. forward ()
else:
coil2.backward()
whi.le Тrue:
set_step ( 'S')
delay = input ("Delay between steps (milliseconds) ?")
steps = input("How many steps forward? 11 )
forward(int(delay) / 1000.0, int(steps))
set_step('S')
Двигатели
353
steps = input ("How many steps backwards? ")
backwards(int(delay) / 1000.0, int(steps))
Запустив эту программу, вам надо будет указать величину задержки между шагами.
Этот интервал должен составлять как минимум
2
миллисекунды. Затем следует
указать, сколько шагов необходимо выполнить в прямом и обратном направлениях:
pythonЗ ch_l2_stepper.py
Delay between steps (milliseconds)?2
How many steps forward? 100
How many steps backwards? 100
Delay between steps (milliseconds)?lO
How many steps forward? 50
How many steps backwards? 50
Delay between steps (milliseconds)?
$
Теперь давайте подробно разберемся в том, что делает этот код, чтобы лучше
понимать, как шаговые двигатели отрабатывают такие программы.
Пояснение
В шаговых двигателях используются электромагниты и ротор зубчатой формы
с
чередующимися
положительными
и
отрицательными
обеспечить его пошаговое вращение (рис.
12.13 ).
полюсами,
что
позволяет
Обратите внимание, что цветовая
маркировка выводов не всегда производится так, как здесь указано.
Розовый
Оранжевый
Красный
Желтый
Рис.
12.13.
Синий
Шаговый двигатель
Вращение двигателя обеспечивается за счет активации обмоток в определенном
порядке.
360
При
этом
количество
шагов,
совершаемых
при
полном
обороте
градусов, в действительности равно количеству имеющихся у ротора зубцов.
на
354
Глава
12
Для управления обмотками здесь используются два экземпляра класса Motor биб
лиотеки
gpiozero
с именами
coill
и
coil2.
Приведенная в этом рецепте программа использует список строк для представления
каждого из четырех этапов активации, составляющих отдельный шаг:
forward_seq = ['FF', 'BF',
'ВВ',
'FB']
Каждая пара букв в этом списке указывает, каким должно быть текущее направле
ние обмоток coill и coil2: прямым (forwarct) или обратным (ьackwarct). Поэтому если
мы предположим, что на рис.
12.13
общий красный вывод подключен к «земле», то
для розово-оранжевой обмотки буква F означает подачу высокого потенциала на ро
зовый вывод и низкого
-
на оранжевый, а буква в
-
противоположное состояние.
Чтобы заставить двигатель вращаться в обратном направлении, надо просто инвер
тировать указанную здесь последовательность этапов для прямого направления.
Вы можете использовать функции forward и backward в своих программах для того,
чтобы поворачивать двигатель на один шаг вперед или назад. В качестве первого
параметра обе функции принимают величину задержки в миллисекундах между
этапами в последовательности выполнения шагов. Минимальное значение этого
параметра зависит от того, какой двигатель вы используете. При слишком низком
значении двигатель отказывается вращаться. Большинство двигателей хорошо ра
ботают с интервалом в две или более миллисекунд. В качестве второго параметра
передается количество выполняемых шагов:
def forward(delay, steps):
for i in range(steps):
for step in forward seq:
set_ step (step)
time.sleep(delay)
Функция forward содержит два вложенных цикла for. Внешний цикл выполняется
для каждого из производимых шагов, а внутренний
-
перебирает последователь
ность этапов активации двигателя, вызывая для каждого этапа функцию set _ step:
def set_step (step):
if step == 'S' :
coill.stop()
coil2. stop ()
else:
if step[O] == 'F':
coi 11. forward ()
else:
coil 1. backward ()
if step[l] == 'F':
coil2. forward ()
else:
coil2 .backward ()
Функция set _ step задает полярность каждой обмотки в зависимости от того, какое
сообщение передается в качестве параметра step. При получении команды
s
она
Двигатели
1
355
обесточивает обе обмотки, чтобы не использовать питание, когда двигатель не
вращается. Если первой буквой является буква F, то для объекта coill вызывается
метод forward, в противном случае для него вызывается метод backward. Объект coil2
настраивается точно так же,
с тем лишь отличием, что здесь проверяется уже не
первая, а вторая буква строки step.
В промежутке между прямым и обратным вращением основной цикл присваивает
строке step значение
чтобы деактивировать обе обмотки на то время, пока дви
s-
гатель не вращается. В противном случае одна из обмоток может остаться активи
рованной, что приведет к потреблению двигателем тока без необходимости.
Дополнительные сведения
Если вы решили использовать биполярный шаговый двигатель с четырьмя вывода
ми, обратитесь к рецепту
12. 7.
Более подробная информация приводится в посвященной шаговым двигателям ста
тье Википедии 7
-
там вы найдете описание принципа действия различных типов
шаговых двигателей, а также отличное анимированное объяснение последователь
ности активации обмоток для приведения двигателя в движение.
Обратите также внимание на рецепт
водов, и рецепты
12.4
и
12.5,
12.1,
посвященный использованию сервопри
описывающие управление двигателями постоянного
тока.
Более подробно об использовании
Raspberry Pi
совместно с макетной платой и со
единительными проводами рассказывается в рецепте
12.7. Использование биполярного
10.9.
шагового двигателя
Задача
С помощью устройства
Raspberry Pi
обеспечить управление биполярным шаговым
двигателем с четырьмя выводами.
Решение
Установите для этого на макетную плату микросхему
L293D,
представляющую со
бой драйвер, реализующий схему Н-моста. Использование Н-моста в схеме управ
ления биполярным шаговым двигателем связано с тем, что, как можно понять по
слову «биполярный», здесь надо инвертировать направление тока в обмотках,
-
как в том случае, когда мы обеспечивали вращение двигателя постоянного тока
в обоих направлениях (см.рецепт
12. 5).
Чтобы воспользоваться этим рецептом, вам понадобятся:
♦
биполярный шаговый двигатель с четырьмя выводами и напряжением питания
12 В (см.
7
разд. «Прочее» прwюже11ия
См. https://oreil.ly/qj_Vd.
1);
Глава
356
♦
микросхема
ложения
♦
12
L293D,
реализующая Н-мост (см. разд. «Интегральные схемы» при
1);
макетная плата и соединительные провода (см. разд. «Оборудование и комплекты для прототuпuрования» прuложения
1).
В этом примере используется двигатель с напряжением питания
этого двигатель запитывается здесь не от устройства
Raspberry Pi,
В, который
12
несколько мощнее, чем униполярный шаговый двигатель из рецепта
12. 6.
В силу
а от отдельного
внешнего источника питания. Соответствующая схема подключений представлена
на рис.
12.14.
Источник питания
Рис.
12.14.
Управление биполярным шаговым двигателем с помощью микросхемы
L293D
Пояснение
От униполярного шагового двигателя, схема которого представлена на рис.
12. 13,
биполярный отличается лишь тем, что у него нет красного вывода, позволяющего
подключаться к центру обоих обмоток. Хотя вращение обоих видов шагового дви-
Двигатели
1
357
гателя обеспечивается одинаковой последовательностью активации обмоток, в слу
чае биполярного двигателя необходимо инвертировать направление тока во всей
обмотке, и потому мы должны задействовать два Н-моста.
Для управления таким шаговым двигателем можно применить ту же программу
(см. рецепт 12. 6). Поскольку
L293D, вы должны использовать
с которой мы имели дело ранее
( ch_12_stepper.py),
в схеме задействуются оба Н-моста микросхемы
по одной такой микросхеме для каждого двигателя.
Дополнительные сведения
Если вы решили использовать униполярный шаговый двигатель с пятью выводами,
обратитесь к рецепту
12.6.
Более подробная информация о различных типах шаговых двигателей и принципах
из действия приводится в Википедии 8 . Там вы также найдете отличное анимиро
ванное объяснение последовательности активации обмоток для приведения двига
теля в движение.
Обратите также внимание на рецепт
водов, и рецепты
12.4
и
12.5,
12.1,
посвященный использованию сервопри
описывающие управление двигателями постоянного
тока.
Более подробно об использовании Raspbeпy
Pi
совместно с макетной платой и со
единительными проводами рассказывается в рецепте
1 О. 9.
биполярным шаговым двигателем
12.8. Управление
с помощью платы стандарта НАТ
Задача
Обеспечить управление несколькими биполярными шаговыми двигателями с по
мощью одной интерфейсной платы.
Решение
Воспользуйтесь для этого платой стандарта НА Т для управления шаговыми двига
телями компании
Adafruit.
Такая плата позволяет обеспечить управление двумя биполярными шаговыми дви
гателями. На рис.
12.15
показан вариант применения этой платы для управления
одним биполярным шаговым двигателем с подключением одной обмотки к паре
контактов М
отдельного
1,
а другой
источника
жимов.
8
См. https://oгeil.ly/qj_Vd.
-
к паре контактов М2. Двигатели запитываются от
питания
посредством
расположенных
справа
винтовых
за
Глава
358
Рис.
12
12.15.
Управление биполярным шаговым двигателем с помощью платы стандарта НАТ
для управления шаговыми двигателями компании
Adafruit
Шины 1 2 С
Если вы воспользовались рецептом 10.17, создав собственную плату стандарта
НАТ, и активировали 1 2 С-шину О, как предлагалось в этом рецепте, вам нужно бу
дет откатить соответствующее изменение в файле /boot/config.txt, потому что плата
от Adafruit автоматически обнаруживает нужную 1 2 С-шину, и при активированной
шине О это будет сделано неправильно.
Удалите
или закомментируйте (поставив
в начале знак
#)
следующую строку
в файле /boot/config.txt:
dtparam=i2c_vc=on
После этого перезагрузите свое устройство
Raspberry Pi.
Поскольку примененная нами плата стандарта НА Т использует интерфейс
1О. 4).
I2c, убе
дитесь, что он активирован на вашем устройстве (см.рецепт
Компания
Adafruit
составила прекрасное руководство по
платы 9 .
9
См. https://oreil.ly/7kObZ.
использованию этой
Двигатели
1
359
Пояснение
Когда вы запустите программу, представленную в руководстве по использованию
компании
Adafruit,
двигатель начнет вращаться с циклическим чередованием четы
рех режимов пошагового вращения.
Дополнительные сведения
Подробнее о стандарте НА Т и о том, как можно создать собственную плату стан
дарта НАТ, рассказывается в рецепте
10.17.
Более подробную информацию об использовании этой платы стандарта НА Т и со
путствующей библиотеки можно найти по адресу
Обратите также внимание на рецепт
двигателем с помощью микросхемы
12. 7,
L293D.
https:// oreil.ly/3a4Jm.
посвященный управлению шаговым
ГЛАВА
13
Цифровые входы
13.0. Введение
В этой главе мы рассмотрим рецепты по использованию таких цифровых компо
нентов, как переключатели и клавиатуры. Мы также познакомимся здесь с модуля
ми, цифровые выходы которых можно подключать к контактам
Raspberry Pi,
GPIO
устройства
используемым в качестве входов.
В большинстве предлагаемых в этой главе рецептов вам потребуется беспаечная
макетная плата и соединительные провода (см.рецепт
10.9).
13.1. Подключение кнопки
Задача
Подключить к
Raspberry Pi
кнопку таким образом, чтобы при нажатии на нее
запускался определенный Python-кoд.
Решение
Подключите кнопку к контакту
GPIO
и используйте в Руthоn-программе библиоте
ку gpiozero для распознавания ее нажатий.
В этом рецепте вам понадобятся:
♦
макетная плата и соединительные провода (см. разд. «Оборудование и комплекты для прототипирования» прwюжения
♦
кнопка (см.разд. «Прочее» приложения
На рис.
13.1
1);
1).
показано, как следует подключить кнопку, используя макетную плату
и соединительные провода.
Вместо макетной платы и сенсорного переключателя также можно применить
«осьминожный» модуль
Squid Button
(рис.
13.2).
Он представляет собой кнопку,
к выводам которой подключены соединительные провода с гнездовыми контакта
ми, что позволяет подсоединять его непосредственно к разъему
цепт
GPIO
(см. ре
10.11).
Откройте редактор, введите или вставьте в него приведенный далее код программы
и сохраните его в файле под именем ch_13_switch.py (при желании вы можете ска
чать этот файл в порядке, описанном в рецепте
3.22):
Цифровые входы
Рис.
13.1.
Подключение кнопки к устройству
Рис.
13.2.
Модуль
361
Raspberry Pi
Squid Button
from gpiozero import Button
button = Button(18)
while True:
if button.is_pressed:
print("Button Pressed")
Запустив эту программу и нажав кнопку, вы увидите на экране следующее:
pi@raspberrypi - $
Button Pressed
Button Pressed
Button Pressed
Button Pressed
pythonЗ ch_lЗ_switch.py
Программа мгновенно выводит на экран сразу несколько сообщений вutton Pressed
(Нажата кнопка)
-
объясняется это тем, что проверка на предмет нажатия кнопки
производится слишком часто. Еще одна проблема здесь заключается в том, что, на
ходясь в постоянном ожидании нажатия кнопки, программа не может перейти
к выполнению других задач.
Давайте усовершенствуем этот код, чтобы при нажатии кнопки выводилось только
одно сообщение и чтобы до наступления этого момента могли выполняться другие
задачи. Вот как выглядит измененная версия программы (ch_1З_switch_2.py):
362
Глава
13
from gpiozero in'p)rt Button
from time in'p)rt sleep
def do_stuff(I:
print ("Button Pressed")
button = Button(l8)
button.when_pressed
=
do_stuff
while True:
print ("Busy doing other stuff" 1
sleep (2)
Запустив этот код, вы увидите на экране следующее:
$ pythonЗ ch_l3_switch_2.py
Busy doing other stuff
Busy doing other stuff
Button Pressed
Busy doing other stuff
Busy doing other stuff
При нажатии кнопки вызывается функция do_stuff -
вне зависимости от того, что
программа делает в текущий момент. Такой подход называют использованием пре
рываний
-
он часто применяется в тех программах, где нужно запускать опреде
ленные действия при нажатии кнопки, но, помимо этого, также надо выполнять
и другие задачи.
Обратите внимание на то, что в строке:
button.when_pressed = do_stuff
имя функции
cto_stuff указывается без круглых скобок. Это объясняется тем, что
здесь мы лишь указываем имя функции, откладывая ее реальный вызов до момента
прерывания. То есть мы сообщаем обработчику прерываний, какую функцию сле
дует вызывать в момент прерывания, не требуя при этом, чтобы он вызвал ее не
медленно.
Пояснение
Обратите внимание на то, что кнопка в нашей схеме подключена таким образом,
чтобы при ее нажатии контакт
18 соединялся
с «землей»
(GND).
При этом можно было бы ожидать, что кнопка будет иметь только два вывода
-
с замкнутым и разомкнутым состояниями. Однако, хотя некоторые из подобных
кнопок действительно имеют только два вывода, большинство из них снабжены
четырьмя выводами для большей механической прочности. Схема расположения
этих выводов показана на рис.
13.3.
На самом деле такая кнопка имеет не четыре, а два электрических контакта, по
скольку внутри ее корпуса контакт В соединен с контактом С, а контакт А
тактом
D.
-
с кон
Цифровые входы
А
в
Рис .
13.3.
А
D
в
с
1
363
Четырехконтактная кнопка (слева) и схема ее контактов (справа)
Дополнительные сведения
Использование
Raspberry Pi
совместно с макетной платой и соединительными про
водами более подробно рассматривается в рецепте
10.9.
Обратите также внимание на рецепт 13.5, посвященный устранению дребезга кон
13. 6, описывающий использование внешнего подтягивающего
тактов, и на рецепт
резистора.
13.2. Использование
кнопки
для переключения между двумя состояниями
Задача
Вам нужно сделать так, чтобы каждое нажатие кнопки переводило определенное
устройство из активного состояния в неактивное и наоборот .
Решение
Для этого вы должны считывать последнее состояние кнопки (т. е. выяснять,
включена или выключена кнопка) и инвертировать это значение при каждом ее
нажатии.
В рассматриваемом далее примере кнопка обеспечивает поочередное включение и
выключение светодиода.
В этом рецепте вам понадобятся:
♦
макетная плата и соединительные провода (см. разд. «Оборудование и комплекты для прототипирования» приложения
1);
♦
кнопка (см. разд. «Прочее» приложения
♦
светодиод (см . разд. «Оптоэлектроника» приложения
♦ резистор с сопротивлением
приложения
На рис.
13.4
470
1);
1);
Ом (см. разд. «Резисторы и конденсаторы»
1).
показано, как следует подключить кнопку и светодиод, используя
макетную плату и соединительные провода.
Помимо соединительных проводов типа «штырь-гнездо», используемых для под
ключения устройства
Raspberry Pi
к макетной плате, здесь вам также понадобится
один соединительный провод типа «штырь-штырь» или кусок проволоки .
364
Глава
13
Рис.
13.4.
Подключение кнопки и светодиода к устройству
Raspberry Pi
Вместо макетной платы с отдельными электронными компонентами вы можете
взять «осьминожные» модули
(см.рецепт
Raspberry Squid
(см. рецепт
10.10)
и
Squid Button
13.1).
Откройте редактор, введите или вставьте в него приведенный далее код программы
и сохраните его в файле под именем ch_ 1З_switch_on_off.py (при желании вы можете
скачать этот файл в порядке, описанном в рецепте
3.22):
from gpiozero import Button, LED
from time import sleep
led = LED(23)
def toggle_led():
print ("toggling")
led. toggle ()
button = Button(18)
button.when_pressed = toggle led
while True:
print ("Busy doing other stuff")
sleep (2)
Эта
программа
представляет
собой
немного
измененную
версию
программы
ch_13_switch_2.py и точно так же использует прерывания с тем, чтобы до момента
нажатия кнопки могли выполняться другие задачи.
При нажатии кнопки вызывается функция toggle _ lect, которая производит переклю
чение светодиода в противоположное состояние
-
т. е. включает его, если он был
выключен, и выключает, если он был включен.
Пояснение
В зависимости от того, насколько качественную кнопку вы используете, светодиод
может не переключаться должным образом с отображением в окне терминала двух
Цифровые входы
1
365
или большего количества сообщений toggling (переключение). Это объясняется так
называемым дребезгом контактов, о котором мы поговорим подробнее в рецеп
те
13.5.
Дополнительные сведения
Ознакомиться с документацией по классу Button библиотеки gpiozero можно по
адресу
https://oreil.ly/SXIZ9.
13.3. Использование
двухпозиционного или ползункового переключателя
Задача
Вы хотите подключить двухпозиционный или ползунковый переключатель к
berry Pi
Rasp-
таким образом, чтобы можно было определять положение переключателя
из Python-кoдa.
Решение
Подключите такой переключатель так же, как подключали кнопку в рецепте
используя только его центральный и один крайний вывод (рис.
Рис.
13.5.
Подключение ползункового переключателя к устройству
13.1,
13.5).
Raspberry Pi
В этом рецепте вам понадобятся:
♦
макетная плата и соединительные провода (см. разд. «Оборудование и комплек
ты для прототипирования» приложения
♦
1);
миниатюрный двухпозиционный или ползунковый переключатель (см. разд. «Про
чее» приложения
1).
С этой схемой работает тот же код, который вы использовали в рецепте
13.1.
366
1
Глава
13
Пояснение
Преимущество таких переключателей заключается в том, что вы можете видеть,
в какое положение они установлены, не используя для этого какое-либо устройство
индикации вроде светодиода. Однако они отличаются меньшим уровнем надежно
сти и стоят чуть дороже, чем простые кнопки, которые становятся все более рас
пространенными в потребительской электронике в силу того, что их можно встраи
вать в более привлекательные пластиковые замыкающие устройства.
Дополнительные сведения
Обратите также внимание на рецепт
13. 4,
посвященный использованию трехпози
ционного переключателя с выключением в среднем положении.
13.4. Использование трехпозиционного
переключателя
с выключением в среднем положении
Задача
Вы хотите подключить трехпозиционный переключатель к
Raspberry Pi
таким
образом, чтобы можно было определять положение переключателя из Python-кoдa.
Решение
Подключите
рис.
13 .6,
такой
переключатель
к двум
контактам
GPIO,
как
показано
на
и используйте в Руthоn-программе библиотеку gpiozero для определения
положения переключателя.
В этом рецепте вам понадобятся:
♦
макетная плата и соединительные провода (см. разд. «Оборудование и комплек
ты для прототипирования» приложения
Рис.
13.6.
1);
Подключение трехпоэиционного переключателя к устройству Raspberгy
Pi
Цифровые входы
♦
1
367
небольшой трехпозиционный переключатель с выключением в среднем положении (см.разд. «Прочее» прwюжения
1).
Общий (средний) вывод переключателя следует подключить к «земле»
а оба крайних вывода- к контактам
(GND),
GPIO.
Откройте редактор, введите или вставьте в него приведенный далее код программы
и сохраните его в файле под именем ch_ 1З_switch_З_pos.py (при желании вы можете
скачать этот файл в порядке, описанном в рецепте
3.22):
from gpiozero illlport Button
switch_top = Button(18)
switch_bottom = Button(23)
switch_position = "unknown"
whil• True:
new_switch_position = "unknown"
if switch_top.is_pressed:
new_switch_position = "top"
elif switch_bottom.is_pressed:
new_switch_position = "bottom"
•1••=
new_switch_position = "center"
if new_switch_position != switch_position:
switch_position = new_switch_position
print(switch_position)
Запустите эту программу и попробуете поочередно переводить переключатель
в верхнее, среднее и нижнее положение. Программа будет сообщать о каждом из
менении положения:
$
pythonЗ ch_lЗ_switch_З_pos.py
center
top
center
bottom
Пояснение
В этом примере мы используем два входа как две отдельные кнопки. Внутри цикла
мы считываем состояние обеих кнопок и с помощью трех условий конструкции
if-elif-else
определяем
значение переменной
положение
переключателя,
new_switch_position
присваивая
соответствующее
(новое положение переключателя). Если
новое положение переключателя отличается от предыдущего, мы выводим его на
экран.
Существует много разновидностей таких переключателей:
SPST
DPDT, SPDT, SPST,
мгновенного действия и т. д. Вот как расшифровываются эти буквы:
368
Глава
♦
D-
DouЫe (два);
♦
S-
Single (Один);
♦
Р-
Pole
♦
Т-
Throw (Позиция).
13
(Полюс);
Так, например,
DPDT
означает «два полюса, две позиции». Под количеством полю
сов понимается количество независимых групп контактов, управляемых с помощью
одного механического рычага. Так, двухполюсный переключатель может одновре
менно включать и выключать какие-то две цепи. Однопозиционный переключатель
может только замыкать и размыкать один контакт (или два контакта, если это
двухполюсный переключатель). В отличие от них, двухпозиционный переключа
тель может подключать общий контакт к одному из двух других контактов.
На рис.
13. 7
показано, как устроены наиболее распространенные типы переключа
телей.
SPST
SPDT
51
51
DPDT
Sla
S1b
Рис.
13.7. Типы
рычажных переключателей
Дополнительные сведения
Подробнее об использовании оператора if рассказывается в рецепте
5.20.
Более подробную информацию о рычажных переключателях можно найти по адре
су
https://oreil.ly/uDigs.
Самый простой способ использования кнопки рассматривается в рецепте
13.1.
Цифровые входы
13.5. Устранение дребезга
1
369
контактов,
возникающего при нажатии кнопки
Задача
Иногда при нажатии кнопки соответствующее действие выполняется не один, а не
сколько раз вследствие дребезга контактов (рис.
13 .8).
В этом случае следует
написать программу, которая будет устранять такой дребезг.
Рис.
13.8.
Осциллограмма, демонстрирующая дребезг контактов,
возникающий при использовании некачественной кнопки
Решение
Хотя класс Button (Кнопка) из библиотеки gpiozero содержит код, позволяющий
справиться с дребезгом контактов, он не активируется по умолчанию. Вы можете
активировать эту функциональность, используя опциональный параметр bounce_ time
(время дребезга) при создании экземпляра кнопки.
В разд. «Пояснение>> мы подробнее коснемся того, что происходит при дребезге
контактов. Однако, не вдаваясь сейчас в детали, можно сказать, что в момент пере
ключения контакты кнопки (да и любого переключателя) могут какое-то время ко
лебаться, что ведет к считыванию ложных показаний об их положении. Параметр
bounce_time (время дребезга) позволяет указать, в течение какого времени следует
игнорировать ложные изменения состояния контактов.
Работая с примером из рецепта
всегда
ведет
к
надлежащему
13.2,
вы могли заметить, что нажатие кнопки не
переключению
светодиода
в
противоположное
со
стояние. Это может происходить в том случае, когда контакты кнопки совершают
четное количество колебаний. При этом одно колебание включает светодиод, а
второе
-
сразу же (за доли секунды) его отключает, и вам кажется, что ничего не
произошло.
370
Глввв
1
13
Давайте модифицируем программу ch_ 1З_switch_on_off.py так, чтобы она устраняла
дребезг контактов. Для этого добавьте опциональный параметр bounce_ time в том
месте, где вы определяете кнопку:
from gpiozero import Button, LED
from time import sleep
led
= LED(23)
d8f toggle_led():
print ("toggling")
led.toggle()
Ьutton
•
Вutton ( 1В , Ьounoe_ timPO
button.when_pressed
.1)
= toggle_led
while True:
print ("Busy doing other stuff")
sleep 12)
При желании вы можете скачать этот пример кода в порядке, описанном в рецеп
те
3.22.
В нашем случае мы указали, что время дребезга составляет О, 1 секунды
-
этого
времени более чем достаточно для того, чтобы положение контактов могло стаби
лизироваться.
Пояснение
Дребезг контактов возникает почти во всех переключателях и, как показывает при
мер осциллограммы, приведенный на рис.
13.8,
в некоторых случаях может прояв
ляться достаточно сильно.
В показанном на осциллограмме случае контакты колеблются и при их замыкании,
и при их размыкании. Впрочем, у большинства переключателей эта проблема не
проявляется настолько сильно.
Дополнительные сведения
Простейший пример использования кнопки рассматривается в рецепте
13.1.
13.6. Использование
внешнего подтягивающего резистора
Задача
Вы пытаетесь подключить кнопку или какой-либо переключатель к
Raspberry Pi,
используя длинный провод, но при этом получаете ложные срабатывания на вход
ном контакте устройства.
Цифровые входы
\ 371
Решение
Контакты
GPIO
устройства
Raspberry Pi снабжены встроенными подтягивающими
GPIO используется в качестве цифрового входа, под
резисторами. Когда контакт
тягивающий резистор «подтягивает его к питанию», поддерживая высокий уровень
напряжения
(3,3
В) до тех пор, пока переключатель не «подтянет его к "земле"».
При этом каждый такой резистор можно подключать и отключать из Python-кoдa.
Поскольку встроенные подтягивающие резисторы обладают достаточно высоким
сопротивлением (около
40
кОм), при высоком уровне электрических шумов или
при подключении кнопки с использованием длинных проводов вы можете получать
на используемом цифровом входе ложные срабатывания. Избавиться от этой про
блемы можно, отключив встроенный подтягивающий резистор и подключив вместо
него внешний подтягивающий резистор.
Как подключить внешний подтягивающий резистор, показано на рис.
13.9.
Чтобы опробовать эту схему в действии, можно использовать программу ch_ 1з_
switch.py из рецепта 13.1 .
Рис.
13.9.
Использование внешнего подтягивающего резистора
Глава
372
13
Пояснение
Чем меньше сопроп1вление резистора, тем более минный провод можно использо
вать для подключения кнопки. Дело в том, что при нажатии кнопки ток течет от
контакта с напряжением
противлением
100 Ом
3,3
В через резистор к «земле». В случае резистора с со
величина протекающего тока составляет
Это как раз чуть меньше максимально допустимого тока в
Raspberry Pi 1 от
источника с напряжением
3,3
3,3
50
В/ 100 Ом
= 33
В, поэтому не используйте резистор
с меньшим сопротивлением, если вы работаете с одной из старых моделей
berry Pi.
Для более новых 40-контактных моделей
стора можно снизить до
47
мА.
мА при запитывании
Raspberry Pi
Rasp-
сопротивление рези
Ом.
Но как бы там ни было, имея дело с почти любой моделью
Raspberry Pi,
вы без
проблем сможете использовать длинные провода, подключив подтягивающий рези
стор с сопротивлением в
1 кОм.
Дополнительные сведения
Простейший пример использования кнопки рассматривается в рецепте
13.7. Использование
13.1.
импульсного датчика угла поворота
Задача
Вам нужно отслеживать вращение какого-либо вала с помощью датчика угла пово
рота (как при использовании круглой ручки регулировки громкости).
Решение
Используйте импульсный датчик угла поворота, подключив его к двум контактам
GPIO
(рис.
13.10).
Рис.
13.10.
Подключение датчика угла поворота
Цифровые входы
373
В этом рецепте вам понадобятся:
♦
макетная плата и соединительные провода (см. разд. «Оборудование и комплекты для прототипирова11ия» прwюжеиия
♦
1);
импульсный датчик угла поворота (см.разд. «Прочее» прwюжения
1).
В рассматриваемом здесь примере используется импульс11ый датчик угла поворо
та, принцип действия которого заключается в слаженной работе пары переключа
телей. Проследив за тем, в какой последовательности замыкаются и размыкаются
эти переключатели, можно определить, в каком направлении вращается вал датчика
угла поворота.
У датчика угла поворота, показанного на рис.
вывод, а по краям
-
13 .1 О,
посередине находится общий
выводы А и В. Такая схема расположения выводов применя
ется не всегда, поэтому перед тем, как использовать свой датчик угла поворота,
сверьтесь с его техническим описанием. Проблему еще больше усугубляет тот
факт, что многие датчики угла поворота также снабжены встроенным кнопочным
переключателем и соответственно имеют дополнительную пару контактов.
Откройте редактор, введите или вставьте в него приведенный далее код программы
и сохраните его в файле под именем ch_13_rotary_encoder.py (при желании вы можете
скачать этот файл в порядке, описанном в рецепте
3.22):
from gpiozero import Button
import time
input_A = Button(lB)
input_B = Button(23)
old
old
а=
Ь
True
= True
def get_encoder_turn():
#
#
возвращэет
-1
(против часовой с,zрелки),
(по часовой с,zрелке)
old_a, old_b
result = О
new_a = input_A.is_pressed
new_b = input_B.is_pressed
if new а 1 = old а or new Ь != old Ь
if old а== О and new а== 1
result = (old Ь * 2 - 1)
elif old Ь == О and new Ь
1
result = -(old а* 2 - 1)
old_a, old Ь = new_a, new Ь
time.sleep(0.001)
return result
gloЬal
О
(нет движеJ-МЯ)
или
+1
Глава
374
х
=
13
о
while True:
change = get_encoder_turn()
if change != О :
х = х + change
print (х)
Эта тестовая программа просто увеличивает значение счетчика при вращении дат
чика по часовой стрелке и уменьшает это значение при вращении датчика против
часовой стрелки:
$ pythonЗ
1
2
3
4
5
6
7
8
9
10
9
ch_lЗ_rotary_encoder.py
8
7
6
5
4
Пояснение
Датчики угла поворота заменили во многих областях применения переменные ре
зисторы, поскольку, как правило, стоят дешевле и не страдают от таких проблем,
как коррозия или износ резистивной дорожки.
На рис.
13 .11
показано, какие последовательности импульсов вы получите на выво
дах А и В. Как можно заметить, форма сигнала повторяется через каждые четыре
такта (именно поэтому такие датчики часто называют квадратурными).
1 --....
в
_J
1
1
Такт
Рис.
........~~................~
i
А
.....-.....
............
1
1
1
1
............
1
1
1
1
1
1
1
~
Ll
1
1
1
1
,· 2· 3·4· ,· 2· 3·4· ,· 2· 3·4·
13.11.
Принцип действия квадратурного датчика угла поворота
Цифровые входы
1
375
При вращении по часовой стрелке (что соответствует движению слева направо на
рис.
13 .11)
мы получаем следующие последовательности импульсов:
Такт
1
А
1
в
1
1
2
з
4
о
1
1
о
1
1
1
1
1
1
1
1
1
1
о
1
1
о
При вращении против часовой стрелки последовательности импульсов инвертиру
ются:
Такт
4
з
1
1
1
1
:
о
2
1
1
в
А
!
1
1
1
о
1
i
о
1
1
о
Представленная в этом рецепте Руthоn-программа реализует алгоритм определения
направления вращения внутри функции get_ encoder_ turn. Эта функция возвращает о
при отсутствии движения, 1 при вращении по часовой стрелке и -1 при вращении
против часовой стрелки.
Она использует две глобальные переменные:
old_a и
old_b- для сохранения предыдущего состояния переключателей А и В. Сравнивая
значения
этих
переменных
вновь
с
считанными
значениями,
она
определяет,
в каком направлении вращается вал датчика (используя для этого немного логики).
Задержка в одну миллисекунду требуется для того, чтобы проверка состояния не
производилась слишком часто,
-
в противном случае мы могли бы получить лож
ные срабатывания в местах перехода из одного состояния в другое.
Приведенная здесь тестовая программа должна надежно работать вне зависимости
от того, насколько быстро вы будете поворачивать ручку датчика. В то же время не
стоит выполнять в цикле что-то очень ресурсоемкое
-
иначе вы рискуете пропус
тить один из тактов.
Дополнительные сведения
Отслеживать вращение ручки регулировки также можно с помощью переменного
резистора
цепт
(см.
рецепт
14.1)
или аналого-цифрового
преобразователя
14. 7).
13.8.
Использование цифровой клавиатуры
Задача
Подключить к
Raspberry Pi
цифровую клавиатуру.
(см.
ре
376
Глава
13
Решение
Цифровая клавиатура представляет собой ряды кнопок, расположенных в виде
матрицы из нескольких строк и столбцов. Чтобы определить, какая кнопка была
нажата, сначала нужно подключить все контакты строк и столбцов к контактам
GPIO
устройства Raspbeп-y
Pi.
Так, например, в случае клавиатуры размером 4хЗ
необходимо подключить четыре контакта строк и три контакта столбцов (всего
семь контактов). Поочередно сканируя столбцы (путем подачи на них высокого
уровня сигнала) и считывая значение на контактах каждой строки, можно опреде
лить, какая из кнопок была нажата. При этом также можно распознать и нажатие
сразу нескольких кнопок, потому что если в определенном столбце будет нажата не
одна, а две или три кнопки, то вы считаете высокий уровень сигнала на контактах
всех соответствующих строк.
Обратите внимание на то, что у разных цифровых клавиатур контакты могут быть
расположены совершенно по-разному.
В этом рецепте вам понадобятся:
♦
макетная плата и соединительные провода (см. разд. «Оборудование и комплекты для прототипuрования» прuложеиия
1);
♦
цифровая клавиатура размером 4хЗ (см. разд. «Прочее» приложения
♦
семь контактов типа «штырь-штырь» (см. разд. «Прочее» прuло.женuя
На рис.
13 .12
1);
1).
показано, как выглядит схема подключений этого примера в случае
использования цифровой клавиатуры компании
чее» приложения
1).
SparkFun,
упомянутой в разд. «Про
Поскольку эта клавиатура поставляется без контактов, вам по
требуется припаять к ней несколько контактов типа «штырь-штырь».
Рис.
13.12.
Схема подключения цифровой клавиатуры
Цифровые входы
377
Откройте редактор, введите или вставьте в него приведенный далее код программы
и сохраните его в файле под именем
ch_13_keypad.py
чать этот файл в порядке, описанном в рецепте
'
.
(при желании вы можете ска
3.22).
Прежде чем запустить эту программу, убедитесь в том, что контакты строк и
столбцов в ней определены в соответствии с тем, как расположены контакты ва
шей клавиатуры. При необходимости измените номера контактов, используемые
при определении переменных
rows
и
cols.
Если вы этого не сделаете, то нажатие
определенной кнопки может привести к замыканию друг на друга контактов
GPIO
с высоким и низким уровнем сигнала, что, в свою очередь, может вызвать повреж
дение устройства
Raspberry Pi.
from gpiozero i.mport Button, DigitalOutputDevice
i.mport time
rows
cols
keys
[Button(l7), Button(25), Button(24), Button(23)]
[DigitalOutputDevice(27), DigitalOutputDevice(l8), DigitalOutputDevice(22)]
1''
12 1'
131]'
[ 141'
151'
161]'
[ 17 1'
181'
191]'
[ 1
[ 1
*
1 I
I
о
I I
1
# 1]]
def get_key():
key = О
for col_nwn, col_pin in enwnerate(cols):
col_pin.off()
for row_nwn, row_pin in enwnerate(rows):
if row_pin.is_pressed:
key = keys[row_nwn] [col_nwn]
col_pin.on()
return key
while True:
key = get key ()
if key :
print (key)
tirne.sleep(0.3)
Когда вы запустите эту программу, она начнет выводить на экран номера нажи
маемых вами кнопок:
$ sudo
2
3
4
5
6
pythonЗ ch_lЗ_keypad.py
378
Глава
13
7
8
9
*
о
#
Поскольку каждая кнопка цифровой клавиатуры находится на пересечении строки
и столбца, нажатие той или иной кнопки ведет к подключению определенной стро
ки и столбца.
В нашем случае строки и столбцы клавиатуры определены в соответствии тем, как
расположены контакты у клавиатуры
ложения
1.
SparkFun,
упомянутой в разд. «Прочее» при
Первая строка подключена к 17-му контакту
GPIO,
вторая
-
к 25-му,
и т. д. Схема расположения выводов строк и столбцов этой цифровой клавиатуры
представлена на рис.
13 .13.
Столбцы:
Строки:2,
3
3, 1, 5
7, 6,4
5
2------------7 -tt--.l:-tt-lt-"'11-ilt--tt--tlмН-
Рис.
13.13.
Схема расположения выводов цифровой клавиатуры
Пояснение
В переменной keys содержится карта отображения названий кнопок на соответст
вующие строки и столбцы. Вы можете скорректировать эти данные в соответствии
с тем, как расположены кнопки в вашем случае.
Вся реальная работа выполняется в этой программе внутри функции get key. Здесь
мы поочередно активируем каждый столбец, устанавливая на нем низкий уровень
сигнала. Во вложенном цикле поочередно проверяется каждая строка. При обнару
жении строки с низким уровнем сигнала мы извлекаем из массива
keys
название
кнопки, соответствующей текущей строке и столбцу. Если не удается обнаружить
нажатие кнопки, функция get_ key возвращает дефолтное значение переменной
key (0).
В основном цикле while мы просто вызываем функцию get_key и выводим получен
ное от нее значение на экран. Команда sleep немного замедляет вывод этих данных.
Цифровые входы
1
379
Дополнительные сведения
Вместо того чтобы подключать цифровую клавиатуру описанным здесь способом,
можно просто использовать USВ-клавиатуру, перехватывая нажатия клавиш, как
показано в рецепте
13.11.
13.9. Обнаружение движения
Задача
Вы хотите обеспечить запуск определенного действия в Python-кoдe при обнаруже
нии движения.
Решение
Используйте модуль пассивного инфракрасного датчика движения .
В этом рецепте вам вам понадобятся :
♦
соединительные провода типа «гнездо-гнездо» (см. разд. «Оборудование и ком
плекты для прототипирования» прwюжения
♦
1);
модуль пассивного инфракрасного датчика движения (см . разд. «Модули» приложения
1).
13.14. Модуль рас
3,3 В, что дела
Raspberry Pi.
Схема подключения такого сенсорного модуля показана на рис.
считан на напряжение питания
5
В и выдает сигнал с напряжением
ет его идеально подходящим для использования совместно с
•
Убедитесь в том, что используемый вами модуль пассивного инфракрасного дат
3,3 В . Если он выдает на выходе 5 В, вам потре-
чика движения выдает на выходе
,
буется снизить его выходное напряжение до 3,3 В, используя делитель напряже
ния из пары резисторов (см. рецепт 14.8).
Рис.
13.14.
Схема подключения пассивного инфракрасного датчика движения
Глава
380
13
Откройте редактор, введите или вставьте в него приведенный далее код программы
и сохраните его в файле под именем
ch_ 1З_рiг.ру
3.22):
(при желании вы можете скачать
этот файл в порядке, описанном в рецепте
frorn gpiozero i.mport MotionSensor
pir = MotionSensor(18)
while True:
pir. wai t for motion ()
print ("Motion detected ! ")
Эта программа просто выводит на экран информацию о состоянии 18-го входного
контакта
GPIO:
$ pythonЗ ch_lЗ_pir.py
Motion Detected
Motion Detected
Пояснение
Поскольку в библиотеке gpiozero имеется класс пассивного инфракрасного датчика
движения Motionsensor, мы вполне можем использовать этот класс. Однако надо
отметить,
что
его
возможности
ограничиваются
лишь
отслеживанием
состояния
соответствующего контакта как цифрового входа.
При срабатывании инфракрасного датчика движения на его выходе на какое-то
время устанавливается высокий уровень сигнала. Вы можете подрегулировать этот
уровень, используя один из присутствующих на плате подстроечных резисторов.
Второй подстроечный резистор (если таковой имеется) служит для настройки поро
гового уровня освещенности, при достижении которого датчик будет отключаться.
Это полезно при использовании такого датчика для управления освещением
-
когда нужно включать свет при обнаружении движения, но только в темное время
суток.
Дополнительные сведения
Более подробную информацию можно найти в полной документации по классу
MotionSensor 1 •
Вы можете объединить этот рецепт с рецептом
электронного
письма
в
7.16,
случае несанкционированного
чтобы обеспечить отправку
проникновения,
или
интег
рировать его с сервисом IFTTТ2, чтобы задействовать множество других способов
оповещения (см.рецепт
17.4).
Обратите также внимание на рецепт
8. 6,
посвященный обнаружению движения
с помощью компьютерного зрения и веб-камеры.
1 См.
2
https://oreil.ly/nJpBG.
См. https://www.ifttt.com.
Цифровые входы
13.1 О.
Подключение к
Raspberry Pi
381
GРS-модуля
Задача
Вы хотите подключить к мобильному устройству Raspbeп-y
Pi
последовательный
GРS-модуль и использовать GРS-данные из Python-кoдa.
Решение
Последовательный GРS-модуль с напряжением
подключить к контакту
RXD
3,3
устройства Raspbeп-y
В на выходе можно напрямую
Pi.
Это значит, что для подклю
чения такого модуля вы можете воспользоваться рецептом
2.6.
Обратите внимание
на то, что при этом надо активировать в настройках последовательный порт, но не
надо активировать последовательную консоль.
Схема подключения GРS-модуля представлена на рис.
ва Raspbeп-y
Pi
13.15.
Вывод
RXD
устройст
подключается к выводу ТХ GРS-модуля. Необходимо также под
ключить «землю» и питание, поэтому нам здесь понадобятся три соединительных
провода типа «гнездо-гнездо».
Рис.
13.15.
Подключение GРS-модуля к устройству
Raspberry Pi
Проверьте, какое напряжение питания требуется в вашем случае
Некоторые GРS-модули необходимо запитывать от напряжения 3,3 В, а не от 5
'
.
В,
как в нашем случае. Поэтому перед тем, как производить подключение, проверьте,
•
какое напряжение питания требуется вашему модулю.
Просмотреть необработанные GРS-данные можно с помощью утилиты
(см. рецепт
10.8).
Minicom
Введите команду minicom, как показано далее, и вы увидите, что
на устройство /dev/serialO раз в секунду поступают сообщения следующего вида:
382
Глава
13
$ minicom -Ь 9600 -о -D /clev/serial0
Welcome to minicom 2.8
OPTIONS: Il8n
Port /dev/serialO, 12:55:56
Press CTRL-A Z for help on special keys
$GPGGA,120346.694,5342.6175,N,00239.7791,W,1,04,5.6,84.4,M,51.3,M,,0000*7A
$GPGSA,A,3,01,03,31,04,,,,,,,,,6.9,5.6,4.0*3E
$GPGSV,3,l,12,04,63,150,23,03,56,078,41,l9,46,263,23,17,39,226,18*79
$GPGSV,3,2,12,09,37,197,20,06,36,302,20,01,26,134,13,31,20,048,31*74
$GPGSV, 3, 3, 12, 12, 08, 327, 14, 21, 06, 136,, 11, 04, 304,, 25, 04, 001, *72
$GPRЖ:,120346.694,A,5432.6175,N,00139.7791,W,002.8,084.6,060922,,,A*7F
Если вы не видите никаких сообщений, проверьте, правильно ли подключен GРS
модуль и активирован ли в настройках последовательный порт. Хотя протестиро
вать GРS-модуль можно и в помещении, где иногда плохо ловится GРS-сиrнал, для
получения реальной GРS-позиции рекомендуется вынести устройство
Raspberry Pi
и GРS-модуль на улицу или, по крайней мере, расположить их поближе к окну.
Как вы могли понять из приведенного примера, сообщения системы
GPS
нужно не
только получить, но и декодировать. Хорошая новость заключается в том, что,
внимательно присмотревшись к сообщениям GРS-модуля, можно достаточно легко
распознать в них информацию о широте и долготе. Так, в приведенном примере
сообщение, начинающееся с заголовка $GPRМC, включает ряд разделенных запятыми
полей. Третье его поле содержит число (5432. 6175), за которым следует буква (N или
s).
Это значение широты, выраженное в сотых долях градуса. В следующих двух по
лях таким же образом представлено значение долготы.
Пример использования GРS-данных из Python-кoдa приведен в программе ch_13_
gps_serial.py (при желании вы можете скачать эту программу в порядке, описанном
в рецепте
3.22):
import serial
ser = serial.Serial('/dev/serialO')
while True:
line = ser.readline() .decode("utf-8")
message = line.split(', ')
if message[O] == '$GPRМC':
if message[2] == 'А':
lat = message[3] + message[4]
lon = message[S] + message[6]
print(F"lat={lat) \tlon={lon}")
else:
print ("No fix")
Как только вы запустите эту программу, она начнет отслеживать GРS-позицию, как
показано далее. Однако имейте в виду, что первые данные о положении могут
появиться лишь спустя некоторое время:
Цифровые входы
1
383
$ pythonЗ -i ch_lЗ_gps_serial.py
No fix
No fix
lat=5432.6028N
lon=00139.0515W
lat=5432.6028N
lon=00139.0514W
Пояснение
Эта программа производит чтение поступающих сообщений, пытаясь найти среди
них сообщение с заголовком $GPRМC. При обнаружении такого сообщения она разби
вает его на отдельные составляющие. Если позиция пользователя известна, вторым
элементом полученного в результате списка является буква А, и соответственно мы
можем извлечь значения широты и долготы.
Дополнительные сведения
Более подробную информацию о назначении различных полей сообщения системы
GPS
можно найти по адресу
https://oreil.Iy/60VLR.
Интересное руководство по отслеживанию GРS-позиции из Python-кoдa представ
лено по адресу
https://oreil.Iy/tSVi6.
13.11. Перехват нажатий
клавиш
Задача
Вам надо перехватывать отдельные нажатия клавиш на стандартной USВ-кла
виатуре.
Решение
Существуют как минимум два способа решения этой задачи. Более простой подход
сводится к тому, чтобы воспользоваться функцией sys.stdin.read. Преимуществом
этого подхода по сравнению со вторым
(см.
далее) является то, что для его приме
нения не требуется какой-либо пользовательский интерфейс, и потому использую
щую его программу можно запускать из SSH-ceaнca.
Откройте редактор, введите или вставьте в него приведенный далее код програм
мы, сохраните его в файле под именем ch_ 13_keys_sys.py (при желании вы можете
скачать этот файл в порядке, описанном в рецепте
грамму и попробуйте понажимать клавиши:
import sys, tty, termios
def read_ch():
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
3.22),
после чего запустите про
Глава
384
13
try:
tty.setraw(sys.stdin.fileпo())
ch = sys.stdin.read(l)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
while True:
ch = read_ch ()
if ch == 'х':
break
print("key is: " + ch)
Для выхода из этой программы надо нажать клавишу <х>.
Если при использовании этого подхода (на основе функции stdin.read) вы нажмете
клавишу со стрелкой или клавишу
<Shift>,
программа выбросит ошибку, потому
что у этих клавиш нет ASCII-кoдa.
Альтернативный подход сводится к использованию Руthоn-библиотеки для созда
ния игр pygame, которую тоже можно задействовать для обнаружения нажатия кла
виш и последующего запуска определенных действий.
Представленный далее пример кода (ch_13_keys_pygame.py) показывает, как с помо
щью библиотеки pygame можно обеспечить вывод сообщения при каждом нажатии
клавиши. Следует отметить, что этот код будет работать только при наличии дос
тупа к оконной системе, поэтому такую программу можно запускать лишь непо
средственно на устройстве
(см.рецепт
Raspberry Pi
или с использованием VNС-подключения
2.8):
import pygame
irrq:юrt sys
from pygame.locals import *
pygame. ini t ()
screen = pygame.display.set_mode( (640, 480))
pygame.mouse.set_visiЫe(0)
while True:
for event in pygame.event.get():
if event.type == QUIT:
sys.exit ()
if event.type == KEYDOWN:
print("Code: " + str(event.key) + "Char: " + chr(event.key))
Эта программа открывает пустое окно библиотеки
Pygame
и обеспечивает перехват
нажатий клавиш при выделении этого окна. Сообщения выводятся в том же окне
терминала, из которого вы запускаете программу:
$ pythonЗ ch_l3_keys_J)Y9'ame.py
Code: 97 Char: а
Цифровые входы
Code:
Code:
Code:
Code:
385
98 Char: Ь
99 Char: с
120 Char: х
13 Char:
В этом подходе вы не сможете прекратить выполнение программы, нажав комби
нацию клавиш
<Ctrl>+<C>, -
вам нужно будет закрыть окно библиотеки
Pygame,
щелкнув на кнопке с крестиком.
Пояснение
При использовании второго подхода (на основе библиотеки pygame) дополнитель
ным клавишам присваиваются соответствующие константные значения, что позво
ляет перехватывать клавиши управления курсором и прочие клавиши, не имеющие
АSСII-кодов (вроде клавиши
<Home> ).
Это невозможно при использовании перво
го подхода.
Дополнительные сведения
Альтернативой перехвату событий стандартной клавиатуры является применение
матричной цифровой клавиатуры (см. рецепт
13.12. Перехват движений
13. 8).
мыши
Задача
Обеспечить обнаружение движений мыши из Python-кoдa.
Решение
В этом случае решение выглядит почти так же, как в случае перехвата событий
клавиатуры с помощью библиотеки pygame (см. рецепт
13.11).
Откройте редактор, введите или вставьте в него приведенный далее код программы
и сохраните его в файле под именем ch_13_mouse_pygame.py (при желании вы мо
жете скачать этот файл в порядке, описанном в рецепте
import pygame
import sys
from pygame.locals import *
pygame. ini t 1)
screen = pygame.display.set_mode( (640, 480))
pygame.mouse.set_vis1Ыe(O)
while True:
for event in pygame.event.get():
if event.type == QUIT:
sys.exit(I
3.22):
386
Глава
13
i f event.type
M0USEM0TI0N:
==
print ("Mouse:
(%d, %d)" % event.pos)
После запуска этой программы при каждом перемещении мыши в пределах окна
pygarne начинает срабатывать событие мousEMOТI0N. Мы извлекаем координаты каж
дого такого события из атрибута pos объекта event. Это абсолютные координаты,
отсчитываемые от верхнего левого угла окна:
Mouse:
(262, 285)
Mouse:
(262, 283)
Mouse:
(262, 281)
Mouse:
(262, 280)
Mouse:
(262, 278)
Mouse:
(262, 274)
Mouse:
(262, 270)
Mouse:
(260, 261)
Mouse:
(258, 252)
Mouse:
(256, 241)
Mouse:
(254, 232)
Пояснение
Вы также можете перехватывать события нажатия и отпускания левой кнопки
мыши, отлавливая события мousEBUTT0ND0WN и мousEBUTT0NUP соответственно.
Дополнительные сведения
См. также документацию по модулю mouse библиотеки
Pygame 3 .
13.13. Снабжение устройства Raspberry Pi
кнопкой питания
Задача
Вы хотите снабдить
Raspberry Pi 4
или одну из более ранних моделей устройства
кнопкой питания, с помощью которой можно было бы включать это устройство как
обычный настольный компьютер.
Решение
Имея дело с моделью
Raspberry Pi 400,
вам этой проблемой можно не озабочивать
ся, потому что эта модель уже и так снабжена кнопкой питания.
3
См. https://oreil.ly/7Qojm.
Цифровые входы
Устройство
Raspberry Pi
387
обязательно нужно выключать после его использования
в противном случае может повредиться образ операционной системы
OS
1
Raspberry Pi
на SD-карте, и вам придется ее переустанавливать. Выключить и снова вклю
чить устройство
Raspberry Pi
можно, отключив и снова подключив USВ-кабель
питания. Однако более элегантное решение сводится к тому, чтобы снабдить уст
ройство
Raspberry Pi
соответствующей кнопкой.
В этом рецепте вам понадобятся:
♦
♦
двухсторонние контакты с шагом О,
кнопка питания
от неиспользуемого
«осьминожный» модуль
прtтожения
♦
1 дюйма (см. разд.
Squid Button
«Прочее» приложения
компьютерного системного
компании
MonkMakes
1);
блока или
(см. разд. «Модули»
1);
оборудование для пайки (см. разд. «Оборудование и ко:wплекты для прототипирования» приложения
У большинства моделей
1).
Raspberry Pi
есть разъем, специально предназначенный для
подключения кнопки питания. Место его расположения на плате может варьиро
ваться, но он всегда снабжен меткой
RUN (ПУСК). На
Raspberry Pi 4
где этот разъем расположен у моделей
рис.
13 .16 и 13 .17 показано,
Raspberry Pi 3 соответст
и
венно.
Рис.
13.16.
Место расположения разъема
Отверстия разъема
RUN
RUN
на плате устройства
Raspberry Pi 4
расположены с шагом в одну десятую дюйма и рассчитаны
на использование стандартных штыревых контактов.
Вставьте в эти отверстия
короткие концы штыревых контактов с верхней стороны платы и припаяйте их
с нижней ее стороны. Когда вы это сделаете, разъем
показано на рис.
13.18.
RUN
будет выглядеть так, как
388
1
Глава
Рис.
13
13.17.
Место расположения разъема
Рис.
13.18.
Разъем
RUN
RUN
на плате устройства
Raspberry Pi 3
с припаянными контактами
Теперь остается лишь надеть на припаянные штырьки гнездовые контакты кнопки,
как показано на рис.
13 .19.
Пояснение
Чтобы убедиться в работоспособности нашей кнопки, подключите питание к уст
ройству
Raspberry Pi
и выберите в меню команду
для выключения устройства (рис.
Спустя
какое-то
Raspberry Pi
время
экран
Shutdown
(Завершение работы)
13.20).
операционной
системы
погаснет,
и
устройство
перейдет в режим остановки, который обеспечивает минимальное
энергопотребление и фактически представляет собой режим ожидания.
После этого для включения устройства
ку питания.
Raspberry Pi
достаточно будет нажать кноп
Цифровые входы
Рис.
13.19.
Устройство
Raspberry Pi 3 с
389
кнопкой питания
(u)1ntemet
~
Games
. . , Accessones
m
Sound & V1deo
{t System Tools
~ не!р
@j Preferences
Рис.
13.20.
Выключение устройства
Raspberry Pi
Дополнительные сведения
Тема включения и выключения устройства Raspbcпy
цепте
1.15.
Pi
также рассматривается в ре
ГЛАВА
14
Датчики
14.0.
Введение
В этой главе мы рассмотрим рецепты по использованию разнообразных датчиков,
наделяющих устройство
Raspberry Pi
способностями измерять температуру, уро
вень освещенности и т. п.
В отличие от таких устройств, как
ство
Raspberry Pi
Arduino
и
Raspberry Pi Pico,
стандартное устрой
не имеет аналоговых входов. Это означает, что в ряде случаев
подключения датчиков, помимо самого датчика, также нужно будет подключить
аналого-цифровой преобразователь (АЦП). К счастью, в этом нет ничего сложного.
При использовании резистивных датчиков также часто потребуется подключить
конденсатор и пару резисторов.
В большинстве рассматриваемых здесь рецептов вам потребуются беспаечная ма
кетная плата и соединительные провода типа «штырь-гнездо» (см.рецепт
14.1. Использование
1 О. 9).
резистивных датчиков
Задача
Подключить к
Raspberry Pi
переменный резистор и обеспечить измерение его
сопротивления из Python-кoдa с тем, чтобы определять на основе значения этого
сопротивления положение ручки регулировки резистора.
Решение
Обеспечить измерение сопротивления на устройстве
Raspberry Pi
можно, используя
лишь конденсатор, пару резисторов и задействовав два контакта
GPIO.
При этом
определять положение ручки регулировки небольшого подстроечного резистора вы
сможете, измеряя сопротивление между его скользящим контактом и одним из двух
других контактов.
В этом рецепте вам понадобятся:
♦ макетная плата и соединительные провода (см. разд. «Оборудование и комплек
ты для прототипирования» прwюжения
♦
1);
подстроечный резистор с сопротивлением
денсаторы» приложения
1);
10
кОм (см. разд. «Резисторы и кон
Датчики
♦ два резистора с сопротивлением
прtтожения
♦
кОм (см. разд. «Резисторы и конденсаторы»
1);
конденсатор с емкостью
ложения
I
391
330
нФ (см. разд. «Резисторы и конденсаторы» при
1).
Схема подключения компонентов на макетной плате показана на рис.
330
Рис.
14.1.
Измерение сопротивления на устройстве
14 .1 .
нФ
Raspberry Pi
В этом рецепте задействована Руthоn-библиотека, разработанная автором книги
с целью облегчить подобное использование аналоговых датчиков. Выполните уста
новку этой библиотеки с помощью следующих команд:
$ git clone https://githuЬ.com/simonmonk/p1_analog.git
$ cd pi_analog
$ sudo pythonЗ setup.py install
Затем откройте редактор, введите или вставьте в него приведенный далее код про
граммы и сохраните его в файле под именем ch_ 14_resistance_meter.py (при желании
вы можете скачать этот файл в порядке, описанном в рецепте
3.22):
from PiAnalog import *
import time
р
= PiAnalog 1)
while True:
print(p.read_resistance())
time. sleep (1)
Как только вы запустите эту программу, она начнет выводить на экран значения
следующего вида:
pythonЗ ch_l4_resistance_meter.py
5588.419502667787
5670.842306126099
$
392
Глава
14
8581.313103654076
10167.614271851775
8724.539614581638
4179.124682880563
267.41950235897957
Выводимые значения будут изменяться соответственно тому, как вы будете пово
рачивать ручку
регулировки
подстроечноrо
резистора.
Теоретически диапазон
измеряемых сопротивлений при этом должен простираться от О до
1О ООО
Ом, но на
практике его границы могут немного отклоняться от этих значений.
Пояснение
Чтобы разобраться в работе класса PiAnalog, сначала нужно понять, как работает
метод реакции на скачок, задействуемый здесь для измерения сопротивления
переменного резистора.
Этот метод измерения называется так, потому что он сводится к отслеживанию
реакции цепи на скачкообразное изменение, происходящее в момент переключения
выхода от низкого уровня напряжения к высокому.
Электрическая схема, используемая в этом рецепте, показана на рис.
14.2.
Rt
J
1Рис.
14.2.
Измерение сопротивления с использованием метода реакции на скачок
Конденсатор можно условно считать чем-то вроде бака для электричества, при за
полнении которого зарядом возрастает и уровень напряжения на нем,
-
подобно
тому, как при заполнении водой водяного бака вода начинает все сильнее давить на
его дно. Мы не можем измерить напряжение на конденсаторе напрямую, потому
что устройство
Raspberry Pi
не оснащено аналого-цифровым преобразователем
(АЦП). Однако мы можем проследить, за какое время конденсатор успевает заря
диться до напряжения в
1,65
В и выше, что соответствует высокому уровню сигна
ла для цифрового входа. Скорость заполнения конденсатора зарядом зависит от
Датчики
сопротивления переменного резистора
(Rt) -
1
393
чем оно ниже, тем быстрее заряжает
ся конденсатор и возрастает напряжение.
В схеме, представленной на рис.
14.2,
вывод В -
через резисторы
Rc и Rt, а
для его разрядки через резистор Rd. Цель
Rd - не допустить протекания слишком большого тока через дос
уязвимые контакты GPIO устройства Raspberry Pi. Для получения точных
резисторов
таточно
вывод А служит для зарядки конденсатора
Rc
и
результатов измерений мы должны разряжать конденсатор перед каждым измере
нием.
Таким образом, чтобы провести измерение, мы сначала разряжаем конденсатор че
рез резистор
Rd,
а затем позволяем ему зарядиться через резисторы
разрядить конденсатор, мы переводим вывод А (18-й вывод разъема
входа, тем самым фактически отключая от цепи резисторы
(23-й вывод разъема
GPIO) -
Rc
и
Rc и Rt. Чтобы
GPIO) в режим
Rt, а вывод В
в режим выхода с низким уровнем сигнала. Такое
состояние выдерживается в течение
100
миллисекунд, чего достаточно, чтобы пол
ностью разрядить конденсатор.
Когда конденсатор разрядится, необходимо снова позволить ему заряжаться, пере
ведя вывод В в режим входа (тем самым фактически отключив его), а вывод А
в режим выхода с высоким уровнем сигнала в
нет заряжаться через резисторы
На рис.
14.3
Rc
и
3,3
В. При этом конденсатор С нач
Rt.
показано, как в такой схеме заряжаются и разряжаются резистор и
конденсатор при переключении между высоким и низким уровнем напряжения.
Как вы можете видеть, хотя сначала напряжение на конденсаторе растет очень
быстро, по мере заполнения конденсатора этот рост становится всё более медлен-
...,.,...
-зv
I
~
-
/
/
/
1
нv
...
\
'
\
\
\
\
nv
Рис.
14.3.
'-
Зарядка и разрядка конденсатора
\ou put
'-.
11,ne
Глава
394
14
ным. К счастью, нас интересует лишь та часть кривой, на которой напряжение воз
растает до
В. Здесь форма кривой очень близка к прямолинейной, а значит,
1,65
количество времени, затрачиваемое конденсатором на то, чтобы дойти до этого
уровня напряжения, находится в прямой зависимости от сопротивления резистора
Rt
и соответственно положения ручки регулировки.
Этот подход не очень точен, но зато не требует больших затрат и прост в использо
вании. Неточность главным образом объясняется тем, что конденсаторы подходя
щей емкости вносят как минимум
1О-процентную
погрешность.
Дополнительные сведения
Метод реакции на скачок можно с успехом применять в сочетании с любыми вида
ми резистивных датчиков
цепт
14. 2),
-
в том числе для изменения освещенности (см. ре
температуры (см.рецепт
14. 3)
и даже загазованности (см.рецепт
14. 4).
Для более точного определения положения регулятора подстроечного резистора
его лучше использовать совместно с АЦП, как предлагается в рецепте
14.2.
14. 7.
Измерение освещенности
Задача
Обеспечить измерение освещенности с помощью устройства
Raspberry Pi
и фоторе
зистора.
Решение
Здесь можно использовать практически те же инструкции и код, что и в рецеп
те
14.1, лишь
заменив подстроечный резистор на фоторезистор.
В этом рецепте вам понадобятся:
♦
макетная плата и соединительные провода (см. разд. «Оборудование и ко:wплек
ты для прототипирования» приложения
♦
фоторезистор или фототранзистор (см. разд. «Резисторы и конденсаторы» при
ложения
1);
♦ два резистора с сопротивлением
приложения
♦
1);
конденсатор с емкостью
ложения
1 кОм
330
нФ (см. разд. «Резисторы и конденсаторы» при-
1).
Все эти детали входят в состав комплекта
нии
(см. разд. «Резисторы и конденсаторы»
1);
MonkMakes
приложения 1).
Project
Вох
1 for Raspberry Pi
от компа
(см. разд. «Оборудование и комплекты для прототипирования»
Схема подключения компонентов на макетной плате показана на рис.
14.4.
Если
вместо фоторезистора вы используете фототранзистор, направьте его более длин
ный отрицательный вывод в 4-й ряд отверстий макетной платы.
Датчики
Рис.
14.4.
Измерение уровня освещенности на устройстве
Запустив ту же программу, что и в рецепте
395
Raspberry Pi
14.1 (ch_14_resistance_meter.py),
вы мо
жете заметить, что выводимые значения изменятся , если вы попробуете прикрыть
фоторезистор/фототранзистор от света рукой .
Обратите внимание на то, что для использования этой программы необходимо
установить библиотеку Pi Anal og (см . рецепт
14. 1).
Это решение позволяет достаточно точно измерять уровень освещенности. Пред
ставляя собой адаптированную версию универсального решения для использования
резистивных датчиков
(см.
рецепт
14.1),
оно также позволяет измерять нулевое
сопротивление , не рискуя повредить контакты
GPIO устройства Raspberry Pi.
Пояснение
Фоторезистор
-
это резистор, сопротивление которого изменяется в зависимости
от количества света, поступающего через имеющееся на нем прозрачное окно . Чем
ярче поступающий свет, тем меньше сопротивление. Обычно сопротивление изме
няется в диапазоне от примерно
100
1
кОм при яркой освещенности до примерно
кОм при полном отсутствии света.
Фототранзистор работает сходным образом , пропуская тем больше тока, чем боль
ше света на него падает . Однако, в отличие от фоторезистора, фототранзистор об
ладает положительным и отрицательным выводами и не будет работать, если вы
перепутаете их друг с другом .
Дополнительные сведения
Фоторезистор или фототранзистор также можно использовать в сочетании с АЦП
(см.рецепт
14. i).
396
Глава
14
14.3. Измерение температуры
с помощью термистора
Задача
Обеспечить измерение температуры с помощью термистора.
Решение
Термистор
это резистор, сопротивление которого изменяется в зависимости от
-
температуры. В нашем случае можно измерять сопротивление термистора, исполь
зуя метод реакции на скачок (см.рецепт
14.1),
а затем вычислять значение темпе
ратуры.
В этом рецепте вам понадобятся:
♦
макетная плата и соединительные провода (см. разд. «Оборудование и комплек
ты для прототuпuрованuя» прuлож·енuя
♦
термистор с сопротивлением
приложения
♦
♦
кОм (см. разд. «Резисторы и конденсаторы»
1);
два резистора с сопротивлением
npWloжeнuя
1 кОм
(см. разд. «Резисторы и конденсаторы»
1);
конденсатор с емкостью
ложения
1);
330
нФ (см. ршд. «Ретсторы и конденсаторы» при-
1).
Все эти детали входят в состав комплекта
Project Вох 1 for Raspberry Pi от компа
MonkMakes (см. разд. «Оборудование и комплекты для прототuпuрованuя»
npWloжeнuя 1). При выборе термистора проследите за тем, чтобы в его описании
были указаны бета-коэффициент и сопротивление RO ( сопротивление при 25°С)
нии
и чтобы это был термистор с отрицательным температурным
коэффициентом
(NTC, Negative Temperature Coefficient).
Схема подключения компонентов на макетной плате показана на рис.
Рис.
14.5.
14.5.
Схема подключений на макетной плате при использовании термистора
Датчики
1
397
Используемая здесь программа (ch_14_thermistor.py), опять же, требует установки
модуля
PiAnalog (см.рецепт 14. 1). Вот как она выглядит:
from Pi.Analog import *
import time
р
= PiAnalog ()
while True:
print(p.read_temp_c())
time. sleep (1)
При желании вы можете скачать ее в порядке, описанном в рецепте
3.22.
Как только вы запустите эту программу, она начнет выводить на экран значения
температуры в градусах Цельсия:
python3 ch_l4_thermistor.py
18.735789861164392
19.32060395712483
20.2694035007122
21.03181169007422
21.26640936199749
$
Если вместо этого вам нужно получать значения температуры в градусах Фарен
гейта, вызывайте в коде не функцию р. read_ temp _с (), а функцию р. read_temp _ f () .
Пояснение
Расчет температуры по сопротивлению термистора требует довольно сложных ма
тематических вычислений с
Стейнхарта
-
использованием логарифмов на основе уравнения
Харта.
Для выполнения такого расчета необходимо знать два параметра термистора: его
сопротивление при 25°С (или сопротивление
RO)
и его бета-коэффициент. Если вы
решите использовать другой термистор, вам нужно будет указать эти параметры
в коде при вызове функции read_ temp_ с:
read_temp_c(self,
В=3800.О,
RO=lOOO.O)
Надо сказать, что, подобно тому, как конденсаторы вносят как минимум
центную
погрешность,
термисторы также
определения сопротивления
RO.
вносят погрешность за счет
1О-про
неточного
В силу этого не стоит ожидать очень уж точных
результатов.
Дополнительные сведения
Обратите также внимание на рецепт
14.1 О, посвященный измерению температуры
14.13, описывающий измерение температуры
цифрового датчика температуры DS 18В20.
с помощью датчика ТМРЗ 6, и рецепт
с использованием
Глава
398
14
Кроме того, в рецепте
платы
14.12
рассказано об измерении температуры с помощью
НА Т.
Sense
14.4. Обнаружение загазованности
метаном
Задача
Обеспечить измерение концентрации газа в помещении с помощью датчика метана.
Решение
В продаже имеется много недорогих резистивных датчиков газа, используя кото
рые в паре с
Raspberry Pi
вы можете легко обеспечить обнаружение в помещении
загазованности такими газами, как, например, метан. При этом можно использовать
тот же метод реакции на скачок, который мы впервые применили в рецепте
14.1.
В этом рецепте вам понадобятся:
♦
макетная плата и соединительные провода (см. разд. «Оборудование и комплек
ты для прототипирования» приложения
1);
♦ датчик метана (см. разд. «Модули» приложения
♦
два резистора с сопротивлением
прwюжения
♦
кОм (см. разд. «Резисторы и конденсаторы»
1);
конденсатор с емкостью
ложения
I
1);
330
нФ (см. разд. «Резисторы и конденсаторьl)) при-
1).
Датчик метана содержит нагревательный элемент, который рассчитан на напряже
ние
5
В и потребляет до
150
мА тока. Устройство
Raspberry Pi
может обеспечить
это при условии, что его источник питания может выдать дополнительные
150
мА.
Модуль датчика метана снабжен достаточно толстыми ножками, которые нельзя
вставить в отверстия макетной платы. Один из способов решения этой проблемы
сводится к тому, чтобы припаять к каждому выводу датчика небольшой кусок про
волоки (рис.
14.6).
Вы также можете приобрести коммутационную плату для датчи-
Рис. 14.б. Датчик газа с припаянными проволочными выводами
Датчики
ка газа от компании
SparkFun 1
399
и подключить выводы датчика непосредственно
к этой плате .
Выполните подключение на макетной плате, как показано на рис.
решили использовать коммуникационную плату от
рис.
14.8, собираетесь
Хотя на рис.
14.8
SparkFun
14.7,
если вы
или, как показано на
просто припаять куски проволоки к выводам датчика .
датчик условно представлен в виде коммутационной платы, вни
мательно присмотревшись, можно увидеть, что к макетной плате здесь подключа
ются шесть выводов датчика, а не четыре вывода коммутационной платы.
Рис.
14.7.
Подключение датчика метана к
Raspberry Pi (с исnольэованием макетной nлаты)
330 нФ
Рис.
1 См .
14.8.
Подключение датчика метана к
https://oreil.ly/cKxym.
Raspberry Pi
(с исnольэованием проволочных выводов)
400
Глава
14
14.1,
Используя ту же программу, что и в рецепте
протестируйте датчик метана,
немного подышав на него. При этом показания датчика должны уменьшиться.
Пояснение
Хотя иногда датчики метана ради забавы используют для отслеживания ситуаций,
когда в помещении кто-то испортил воздух, более серьезной областью их примене
ния является обнаружение утечек природного газа. Например, вы можете создать
на базе
устройство, которое будет с помощью ряда датчиков отслежи
Raspberry Pi
вать параметры окружающей среды внутри вашего дома. И когда вы уедете куда
нибудь на отдых, это устройство пришлет вам электронное письмо с сообщением
о том, что ваш дом вот-вот взорвется. Однако давайте надеяться, что этого не про
изойдет.
Принцип действия таких датчиков (рис.
14.9)
сводится к следующему. Нагрева
тельный элемент нагревает резистивную поверхность, насыщенную катализатором,
чувствительным к определенному газу. При появлении в воздухе газа сопротивле
ние насыщенного катализатором слоя изменяется.
в
А
А
н
н
в
н
v\@Jvн
А
Рис.
в
14.9. Датчик
метана
С точки зрения электротехники и нагревательный элемент, и чувствительная по
верхность представляют собой резисторы, и потому при их подключении не нужно
соблюдать какую-то определенную ориентацию.
Хотя используемый в этом рецепте датчик наиболее чувствителен к метану, он
также в какой-то мере чувствителен и к другим газам. Именно поэтому его показа
ния меняются при попадании на него выдыхаемого вами воздуха, несмотря
на то,
что человек не может выдыхать метан. Кроме того, здесь также может сказываться
и производимый потоком воздуха охлаждающий эффект.
Дополнительные сведения
Если вас интересует, насколько используемый в этом рецепте датчик чувствителен
к различным газам, ознакомьтесь с его спецификацией 2 .
Компания
SparkFun
предлагает целую линейку таких недорогих датчиков для обна
ружения тех или иных газов 1 .
2
См. https://oreil.ly/lslf4.
Датчики
14.5. Измерение
1
401
качества воздуха (концентрации СО2)
Задача
Одним из важных показателей качества воздуха является концентрация углекисло
го газа (СО 2 ) . Вы решили обеспечить измерение этого показателя с помощью спе
циального датчика, подключенного к устройству
Raspberry Pi.
Решение
Используйте
MH-Z\4A,
недорогой
(ну,
подключив его к
Рис.
относительно
Raspberry Pi,
14.10. Датчик
СО2
недорогой)
модуль
как показано на рис.
MH-Z14A,
подключенный к
датчика
СО 2
14.10.
Raspberry Pi
В этом рецепте вам понадобятся:
♦
♦
модуль датчика СО 2
MH-Z 14А
(см . разд. «Модули» прwюженuя
соединительные провода типа «гнездо-гнездо» (см. разд. «Оборудование и ком
плек.ты д. 11я прототuпированuя» приложения
,
1);
См. https://oгeil.ly/Ql hM6.
1).
402
1
Глава
14
Для подключения датчика
MH-Zl4A
к устройству
Raspberry Pi:
♦ вывод
16 датчика МН-Z14А соедините с
♦
вывод
17 датчика MH-Z 14А -
с выводом
5V
на устройстве
♦
вывод
18 датчика MH-Z 14А Raspberry Pi;
с выводом
14
разъема
GPIO (TXD)
на устройстве
♦
вывод 19 датчика MH-Zl4A- с
Raspberry Pi.
15
разъема
GPIO (RXD)
на устройстве
Датчик
MH-Zl4A
выводом
выводом
на устройстве
GND
Raspberry Pi;
Raspberry Pi;
использует последовательный порт. Это означает, что для его
подключения нужно обратиться к рецепту
2. 6.
Обратите внимание на то, что при
этом надо активировать в настройках устройства
Raspberry Pi
последовательный
порт, но не надо активировать последовательную консоль.
Представленная далее тестовая программа (ch_14_co2.py) один раз в секунду полу
чает от датчика значение концентрации СО 2 и выводит его на экран:
i.mport 1erial, time
request_reading = bytes([0xFF, 0x0l,
ОхВб,
ОхОО,
ОхОО,
ОхОО,
ОхОО,
ОхОО,
Ох79])
def read_со2 () :
sensor.write(request_reading)
time.sleep(0.l)
raw_data = sensor.read(9)
high = raw_data[2]
low = raw_data[З]
return high * 256 + low;
sensor = serial.Serial('/dev/serial0')
print(sensor.name)
if sensor.is_open:
print ("Open")
while True:
print("CO2 (ppm):" + str(read_co2()))
time.sleep(l)
При желании вы можете скачать эту программу в порядке, описанном в рецеп
те
3.22.
Запустив программу, вы должны увидеть, что концентрация СО 2 в вашем помеще
нии составляет где-то
400
единиц
ppm (parts per million,
частей на миллион). Если
вы подышите на датчик несколько секунд, его показания постепенно вырастут и
снова вернутся к нормальному уровню в течение следующих нескольких минут:
$
pythonЗ
/dev/ttyS0
Open
ch_l4_co2.py
Датчики
СО2
(ppm): 489
СО2
(ppm): 483
СО2
(ppm) :483
СО2
(ppm) :481
СО2
(ppm) :491
СО2
(ppm) :517
СО2
(ppm) : 619
СО2
(ppm) : 734
СО2
(ppm) : 896
СО2
(ppm) : 1367
1
403
Датчик использует протокол обмена данными, основанный на принципе «запрос
ответ». Поэтому, чтобы получить от датчика очередное значение, сначала нужно
отправить ему 9-байтовое сообщение, содержащееся в переменной request_reading.
Датчик немедленно отправляет в ответ свое 9-байтовое сообщение. Нас интересуют
здесь только байты
2
и
3,
которые представляют собой старший и младший байты
значения концентрации со2, выраженного в ppm.
Пояснение
Нормальной считается концентрация СО 2 в диапазоне от
400
до
1ООО ppm.
При
более высокой концентрации в помещении уже становится душно, и вы можете ис
пытывать некоторую сонливость. Исследования показали, что порождаемая недос
таточным
проветриванием
высокая
концентрация
углекислого
газа
может
плохо
сказываться на умственной активности человека. Попробовав как-то с помощью
этой программы замерить концентрацию углекислого газа у себя дома в течение
всей ночи, я теперь всегда немного приоткрываю на ночь дверь или окно в своей
спальне.
Дополнительные сведения
Подробнее о протоколе обмена данными, который использует датчик
можно прочитать по адресу
MH-Zl4A,
https://oreil.ly/Zc6is.
Более подробную информацию о безопасной концентрации СО 2 можно найти по
адресу
https://oreil.ly/hOQGj.
14.6. Измерение
влажности почвы
Задача
Вы хотите измерять влажность почвы в горшках с вашими комнатными растениями.
Решение
Используйте датчик платы
Plant Monitor
от компании
MonkMakes. В отличие от
Plant Monitor использу-
большинства других плат для измерения влажности почвы,
404
1
Глава
14
ет последовательный интерфейс, поэтому сначала активируйте его, следуя советам
из рецепта
2. 6,
а затем подключите плату, как показано на рис.
Для подключения платы
Plant Monitor к устройству Raspberry Pi:
♦
вывод GND
Monitor;
на устройстве
♦
вывод 3.ЗV на устройстве
♦
вывод 14 TXD
Monitor;
на устройстве
♦
вывод 15 RXD
Monitor.
на устройстве
Рис.
14.11.
14.11.
Raspberry Pi
соедините с выводом
Raspberry Pi -
с выводом ЗУ на плате
с выводом
Raspberry Pi -
на плате
Plant
Plant Monitor;
на плате
Plant
с выводом ТХ_OUT на плате
Plant
Raspberry Pi -
Подключение к
GND
Raspberry Pi
платы
RX_1N
Plant Monitor
Теперь скачайте Python-пporpaммy для этой платы:
$
git clone
https://githuЬ.com/monkmakes/pmon.git
Здесь мы опять имеем дело с программой, использующей библиотеку guizero,
поэтому, если вы ее еще установили, сделайте это, выполнив команду:
$
рiрЗ
install guizero
Затем с помощью следующих команд перейдите в каталог с примерами кода и
запустите один из них:
$
$
cd pmon/raspberry_pi
Ol_meter.py
pythonЗ
На экране появится окно, показанное на рис.
14.12.
Пояснение
Большинство предлагаемых на рынке датчиков влажности почвы используют ана
логовые входы, что затрудняет их подключение к
Raspberry Pi.
В отличие от них,
Датчики
Wetness (%)
Temp
12.0
(С)
Humidity (%)
Рис.
14.12.
405
21.68
41.99
Отслеживание с помощью
Raspberry Pi
абсолютной влажности почвы,
ее температуры и относительной влажности
датчик пл аты Plant Monitor от компании MonkMakes использует последовательный
интерфейс , что позволяет легко подключить его к Raspberry Pi . Датчик измеряет
температуру, абсол ютную и относительную влажность почвы , а также сигнализи
рует о степени влажности почвы с помощью RGВ-светодиода .
Используемая в этом рецепте программа выглядит следующим образом:
1.l!i)Ort threading
import time
from guizero import Арр , Text
from plant_monitor import Pl ant Monitor
pm = PlantMonitor()
арр
= App(t i t l e= "Plant Monitor ", wi dt h=SSO ,
def update_readings(): #
#
height=ЗOO ,
l ayout= "grid ")
обновляем поля новыми значениями
температуры и влажнос ти
while True:
wetness f1e l d . value = str(pm.get_wet ness())
temp_c_ fie l d .va l ue = str( pm. get_t emp ())
str(pm . get _hwnid it y())
hwnidity_field . value
time.s l eep(2)
t.l = t hreading . Thread (target=update readings)
# определяем пользовательский интерфейс
Text(app, text ="Wet ness (%) " , grid=[0 , 0] , s i ze=20)
wetness_field = Text (арр , text= "-", grid=[l , 0] , size=lOO)
Text(app , text ="Temp (С) ", gr i d=[0 ,11 , size=20)
temp_c_f i eld = Text(app , text= "- " , gri d= [l,l], si ze=SO)
Text(app , text= "Humidity (%) ", gr i d= [0, 2], size=20)
hwnidity_field = Text (app , text ="-", gr id=[l , 2] , s i ze=S O)
tl.start() # запускаем поток, обно в.ля/ОllJl'!Й показания
арр . display ()
406
1
Глава
14
Значительную часть этой программы составляет код, создающий пользовательский
интерфейс с помощью библиотеки guizero (см. рецепт
7.22).
Использование же дат
чика влажности почвы здесь сводится к тому, чтобы сначала создать экземпляр
класса
PlantMoni tor
с помощью инструкции
pm = PlantMoni tor (),
а затем извлекать зна
чения абсолютной влажности, температуры и относительной влажности с помощью
методов
pm. get_wetness (), pm. get_temp ()
и
pm. get_humidity ().
Дополнительные сведения
Более подробную информацию о плате
можно найти по адресу
Plant Monitor
https://oreil.ly/zOQWq.
Обратите также внимание на рецепт
и влажности с помощью платы
14.12,
Sense НА Т.
Пример использования платы
Pico рассматривается
Plant Monitor
в рецепте 19.11.
от компании MonkМakes
посвященный измерению температуры
совместно с устройством
Raspberry Pi
14.7. Измерение напряжения
Задача
Обеспечить измерение аналогового напряжения.
Решение
Разъем
GPIO
устройства
Raspberry Pi
имеет только цифровые входы. Поэтому для
измерения аналогового напряжения необходимо дополнительно задействовать ана
лого-цифровой преобразователь (АЦП).
Используйте в качестве него микросхему МСР3008, представляющую собой вось
миканальный АЦП. Она имеет восемь аналоговых входов, что позволяет подклю
чить к ним до восьми датчиков и обеспечить ее взаимодействие с
средством интерфейса
Raspberry Pi
по
SPI.
В этом рецепте вам понадобятся:
♦
макетная плата и соединительные провода (см. разд. «Оборудование и комплек
ты для прототипирования» прwюжения
♦
микросхема МСР3008
мы» приложения
♦
-
1);
восьмиканальный АЦП (см. разд. «Интегральные схе
1);
подстроечный (переменный) резистор с сопротивлением
зисторы и конденсаторы» приложения
1О
кОм (см. разд. «Ре-
1).
Установите микросхему МСР3008 на макетную плату, как показано на рис.
14.13.
Проследите за тем, чтобы она была правильно ориентирована: помеченный выем
кой край должен быть направлен в сторону верхнего края макетной платы.
Датчики
Рис.
14.13.
Подключение микросхемы АЦП МСРЗООВ к
1
Raspberry Pi
Один вывод подстроечноrо резистора нужно подключить к шине питания
а другой
-
к «земле »
(GND).
3,3 В .
Прежде чем запустить программу этого рецепта , активируйте интерфейс
интерфейсе
1О. 6.
(3.3V),
При этом на среднем выводе можно будет установить
любой уровень напряжения в д иапазоне от О до
описано в ре цепте
407
SPI,
как
В нем также содержится более подробная информация об
SPI.
Откройте редактор, введ ите ил и вставьте в него приведенный далее код программы
и сохраните его в файле под именем ch_ 14_adc_test.py (при желании вы можете ска
чать этот файл в порядке , описанном в рецепте
from gpiozero import
import time
3.22):
МСР3008
analog_input = MCP3008(channel=O )
while True :
r eading = analog input.value
voltage = reading * 3.3
print 1"Reading= { : . 2f 1\tVoltage= ( : . 2f}" . format (reading, vol tage ))
time.sleep (l)
408
Глава
14
Когда вы запустите эту программу, по мере того, как вы будете изменять напряже
ние,
вращая
ручку
регулировки
переменного
резистора,
она
начнет
выводить
на
экран значения следующего вида:
pythonЗ ch
Reading=0.60
Reading=0.54
Reading=0.00
Reading=0.00
Reading=0.46
Reading=0.99
$
14 adc_test.py
Voltage=2.00
Voltage=l.80
Voltage=0.00
Voltage=0.00
Voltage=l.53
Voltage=З.28
Микросхема МСР3008 выдает показания в диапазоне от О до
1.
Мы преобразуем
эти значения в значения напряжения, умножая их на величину напряжения питания
(3,3
В).
Пояснение
Микросхема МСР3008 представляет собой
показаний она выдает число в диапазоне
1О-разрядный АЦП, поэтому при снятии
от О до 1023. Класс МСРЗООВ преобразует это
число в значение напряжения путем умножения на верхний предел измерения на
пряжения
(3,3
В) и деления на
1024.
Если вам не нужны все возможности полнофункционального устройства
Pi,
вы можете использовать устройство
Raspberry Pi Pico,
Raspberry
у которого есть аналого
вые входы, что позволяет обойтись без АЦП. Подробнее об этом рассказывается
в рецепте
19. 7.
Применив микросхему МСР3008 в нескольких приведенных здесь рецептах по ис
пользованию
датчиков,
вы
с
можете
одновременно
снимать
показания
с
восьми
датчиков.
Кроме того, подключив к микросхеме МСР3008 резистивные датчики, вы сможете
использовать их в сочетании с постоянными резисторами, получая таким образом
делитель напряжения (см.рецепты
14.8 и 14.9).
Дополнительные сведения
Если вам нужно определять только текущее положение ручки регулировки под
строечноrо резистора, вместо него можно применить датчик угла поворота (см. ре
цепт
13. 7).
Определять положение ручки регулировки подстроечного резистора также можно
и без АЦП, используя метод реакции на скачок (см.рецепт
14.1).
Ознакомьтесь со спецификацией микросхемы МСР30084.
Аналого-цифровым преобразователем также снабжена плата
компании
4
Pimoroni (см.рецепт 10.16).
См. https://oгeil.ly/SZif8.
Explorer
НА Т
Pro
от
Датчики
14.8. Снижение напряжения
1
409
перед его измерением
Задача
Вам нужно измерить напряжение, которое превышает
3,3
В и таким образом выхо
дит за рамки допустимого диапазона измерений ДllЯ микросхемы МСР3008 (см . ре
цепт
14. 7).
Решение
Чтобы снизить напряжение до подходящего ДllЯ измерения уровня , используйте
делитель напряжения из двух резисторов .
В этом рецепте вам понадобятся:
♦
макетная плата и соединительные провода
ты для прототuпuрования» прwюжения
♦
микросхема МСР3008
мы» приложения
♦
♦
1);
10
кОм (см . разд. «Резисторы и конденсаторы»
3,3
кОм (см . разд. «Резисторы и конденсаторы»
1);
резистор с сопротивлением
приложения
разд. «Оборудование и комплек
восьмиканальный АЦП (см. разд. «ИнтегрШiьные схе
резистор с сопротивлением
приложения
♦
-
(см.
1);
1).
9-вольтовая батарейка с соответствующим разъемом и проводами.
Схема подключения компонентов на макетной плате для измерения выдаваемого
батарейкой напряжения показана на рис .
Рис.
14.14.
14.14.
Снижение напряжения аналоговых входов
Глава
410
14
• Не используйте этот способ для измерения напряжения переменного тока, особен-
• ••••••
но если речь идет о высоковольтных уровнях. К нему можно прибегать только
.
в случае низковольтных сигналов постоянного тока
.
Откройте редактор, введите или вставьте в него приведенный далее код программы
и сохраните его в файле под именем ch_ 14_adc_scaled.py (при желании вы можете
скачать этот файл в порядке, описанном в рецепте
from gpiozero import
import time
3.22):
МСРЗООВ
Rl = 10000.0
R2 = 3300.0
analog_input = MCP3008(channel=0)
while True:
reading = analog input.value
voltage_adc = reading * 3.3
voltage_actual = voltage_adc / (R2 / (Rl + R2) 1
print 1"Battery Voltage=" + str (voltage actual 11
time.sleep(l)
Эта программа во многом напоминает программу из рецепта
состоит в том,
что
мы учитываем здесь понижение
14. 7.
напряжения,
Главное отличие
используя в рас
четах сопротивления двух резис·1оров, содержащиеся в переменных ю и
R2.
Когда вы запустите эту программу, на экране появится измеренное напряжение
батарейки:
$ python3 ch_14_adc_scaled.py
Battery Voltage=B.62421875
[
,
••
Чтобы не повредить микросхему МСРЗОО8, перед тем как пытаться таким образом
измерить напряжение, превышающее 9 В, внимательно ознакомьтесь с информа
цией из разд. «Пояснение».
Пояснение
Примененная здесь схема подключения двух резисторов называется делителем на
пряжения (рис.
14.15).
Зная входное напряжение и сопротивление двух резисторов,
выходное напряжение такой схемы можно вычислить по следующей формуле:
Uвых
= Uвх * R2 / (Rl + R2).
Это, в частности, означает, что если резисторы
сопротивлением (например, по
1 кОм),
При выборе сопротивления резисторов
Rl
и
R2
будут обладать одинаковым
то Uвых будет в два раза меньше, чем
R 1 и R2
также нужно учитывать, какой ток
будет через них протекать. Его величина составит
мом здесь примере используются резистор
RI
U8 , .
U.J(Rl + R2). В рассматривае
1О кОм и резистор
с сопротивлением
Датчики
R2
вит
1
411
3,3 кОм, а значит, сила протекающего через них тока соста
0,68 мА. Это очень низкое значение, но даже столь небольшой
с сопротивлением
9
В/13,3 кОм=
ток может в конце концов разрядить батарею, поэтому не стоит оставлять эту схему
включенной надолго.
R1
R2
Рис.
14.15. Делитель
Uвых
напряжения
Дополнительные сведения
Чтобы не рассчитывать сопротивление резисторов делителя напряжения вручную,
это можно сделать с помощью онлайн-калькулятора 5 •
Схему делителя напряжения также можно применить для преобразования сопро
тивления
напряжение,
в
(см.рецепт
задействовав
резистивный
датчик
совместно
с
АЦП
14.9).
14.9. Использование
резистивных датчиков
совместно с АЦП
Задача
Вы хотите использовать имеющийся у вас резистивный датчик совместно с микро
схемой аналого-цифрового преобразователя МСР3008.
Решение
Создайте делитель напряжения из постоянного резистора и резистивного датчика,
что даст возможность преобразовать сопротивление датчика в напряжение, под
дающееся измерению с помощью АЦП. Например, вы можете переделать схему
с датчиком освещенности из рецепта
выполнялось
не
на основе
МСР3008.
5
См. https://oreil.ly/t9C0r.
14.2
таким образом, чтобы измерение в ней
метода реакции
на скачок,
а с
помощью
микросхемы
412
Глава
14
В этом рецепте вам понадобятся:
♦
макетная плата и соединительные провода (см. разд. «Оборудование и комплек
ты для прототипирования» прwюжения
♦
микросхема МСР3008
мы» прwюжения
♦
восьмиканальный АЦП (см. разд. «Интегральные схе
1);
резистор с сопротивлением
прwюжения
♦
-
1);
1О
кОм (см. разд. «Резисторы и конденсаторы»
1);
фоторезистор (см. разд. «Резисторы и конденсаторы» приложения
Схема подключения компонентов на макетной плате показана на рис.
Рис.
1).
14.16.
14.1 б. Использование фоторезистора совместно с АЦП
Здесь можно задействовать ту же программу, что и в рецепте 14. 7 ( ch_ 14_
adc_test.py). Попеременно прикрывая датчик освещенности рукой, вы будете видеть,
что его показания изменяются. Прежде чем запустить программу, вам нужно акти
вировать на устройстве
Raspberry Pi
интерфейс
SPI. Если
1О. 6:
вали, сделайте это в порядке, описанном в рецепте
ch 14 adc_test.py
Reading=0.60 Voltage=2.00
Reading=0.54 Voltage=l.80
$ pythonЗ
вы еще его не активиро
Датчики
1
41 З
Какие именно показания вы получите, зависит от того, какой фоторезистор вы
решили использовать,
главное, чтобы они изменялись при изменении уровня
-
освещенности.
Пояснение
Каким будет сопротивление постоянного резистора, не играет большой роли. При
менение резистора со слишком большим или слишком малым сопротивлением про
сто приведет к тому, что диапазон показаний окажется весьма узким. Выберите
резистор, сопротивление которого находится
в диапазоне между минимальным и
максимальным сопротивлением датчика. Возможно, вам надо будет попробовать
в работе несколько резисторов и посмотреть, какой из них позволяет снимать пока
зания в интересующем вас диапазоне. В случае сомнений начните с сопротивления
lО
кОм и при необходимости заменяйте его на резисторы с большим или меньшим
сопротивлением.
Вместо фоторезистора также можно использовать практически любой другой рези
стивный датчик
например, датчик газа из рецепта
-
14. 4.
Дополнительные сведения
В рецепте
14.2 рассматривается
более простой способ измерения освещенности, не
требующий использования АЦП.
В рецепте
14.14
приведен пример одновременного использования сразу несколь
ких каналов АЦП.
14.10. Измерение температуры с
помощью АЦП
Задача
Вы хотите выполнять измерение температуры с помощью датчика ТМР36 и анало
го-цифрового преобразователя МСР3008.
Решение
В этом рецепте вам понадобятся:
♦
макетная плата и соединительные провода (см. разд. «Оборудование и комплек
ты для прототипирования» приложения
♦
микросхема МСР3008
мы» приложения
♦
-
1);
восьмиканальный АЦП (см. разд. «Интегральные схе-
1);
датчик температуры ТМР36 (см.разд. «Интегральные схемы» приложения
Схема подключения компонентов на макетной плате показана на рис.
следите за тем, чтобы датчик ТМР36 был правильно ориентирован
его корпуса плоская с одной стороны и закругленная с другой.
-
14.17.
1).
Про
поверхность
Глава
414
14
Рис.
14.17.
Использование датчика ТМРЗб совместно с АЦП
Для этого рецепта также нужно активировать на устройстве
SPI.
те
Raspberry Pi
интерфейс
Если вы еще его не активировали, сделайте это в порядке, описанном в ре цеп
10.6.
Откройте редактор, введите или вставьте в него приведенный далее код программы
и сохраните его в файле под именем ch_ 14_adc_tmp36.py (при желании вы можете
скачать этот файл в порядке, описанном в рецепте
from gpiozero import
import time
analog_input =
3.22):
МСР3 008
MCPЗOOS(channe l = O )
while True:
reading = analog input . value
voltage = r eading * 3.3
temp_c = vol tage * 100 - 50
t emp_f = temp_c * 9. 0 / 5. 0 + 32
print("Temp C={:.2f)\tTemp F={:.2f}". format(temp_c , t emp_f))
time.sl eep1 1)
Эта программа лишь немного отличается от программы из рецепта 14. 7. Мы про
сто используем здесь чуть больше математики для расчета значений температуры
в градусах Цельсия и Фаренгейта:
Датчики
$
415
1
ch_l4_adc_trrp36.py
Terrp F=бS.55
С=20.25
Terrp F=68.45
С=23.47
Terrp F=74.25
Terrp F=77 .15
С=25.08
pythonЗ
Terrp
Terrp
Terrp
Terrp
С=18.64
Пояснение
Датчик ТМР36 выдает на выходе сигнал с напряжением, пропорциональным изме
ряемой им температуре. Согласно его спецификации, чтобы получить значение
температуры в градусах Цельсия, нужно умножить напряжение (в вольтах) на
вычесть
100 и
50.
Датчик ТМР36 прекрасно подходит для приблизительного измерения температуры,
но, как указано в его спецификации, обеспечивает измерение с минимальной
погрешностью в 2°С. Если вы примените для его подключения длинные провода,
погрешность измерений будет еще выше. В какой-то мере исправить эту ситуацию
можно путем калибровки отдельного устройства, но, в принципе, для получения
более точных результатов лучше задействовать датчик
DS 18В20
(см.рецепт
заявленная погрешность которого в температурном диапазоне от
сов Цельсия составляет
0,5%.
-1 О
до
85
14.13),
граду
Поскольку это датчик цифровой, на его точности
также никак не сказывается использование длинных проводов.
Дополнительные сведения
Ознакомьтесь со спецификацией датчика ТМР36 6 •
Обратите также внимание на рецепт
посвященный измерению температуры
с помощью термистора, на рецепт
где рассматривается измерение темпе
ратуры с помощью платы
Sense
14.3,
14.12,
НА Т, и на рецепт
14.13,
в котором речь идет об
измерении температуры с помощью цифрового датчика температуры
14.11. Измерение температуры
устройства Raspberry Pi
DS 18В20.
процессора
Задача
Вы
хотите
знать,
насколько
сильно
нагревается
процессор
вашего устройства
Raspberry Pi.
Решение
Используйте библиотеку
gpiozero для доступа к датчику температуры, встроенному
в процессор
Эта библиотека уже должна быть установлена на вашем
устройстве
но если это не так, установите ее с помощью команды:
$
6
sudo
рiрЗ
Broadcom.
Raspberry Pi,
install gpiozero
См. https://oreil.ly/9Dfrq.
Глава
416
14
Используемая в этом рецепте программа ch_14_cpu_temp.py циклически выводит на
экран значение температуры процессора:
i.mport time
from gpiozero import CPUTemperature
while True:
cpu_temp = CPUTemperature()
print(cpu_temp.temperature)
time.sleep(l)
При желании вы можете скачать эту программу в порядке, описанном в рецеп
те
3.22.
Когда вы ее запустите, она начнет выводить на экран значения температуры в гра
дусах Цельсия, делая это с интервалом в одну секунду:
$
pythonЗ
ch_l4_cpu_temp.py
37.485
38.459
36.511
36.998
Пояснение
Поскольку процессор устройства
Raspberry Pi
постоянно производит вычисления,
его температура больше зависит не от температуры окружающей среды, а от степе
ни его загруженности и от того, насколько хорошо работает вентиляция.
Дополнительные сведения
Обратите также внимание на рецепт
14.3, посвященный измерению температуры
14.1 О, где рассматривается измерение темпера
туры с помощью датчика ТМР36, на рецепт 14.12, в котором описывается измере
ние температуры с помощью платы Sense НА Т, и на рецепт 14. 13, где речь идет об
измерении температуры с помощью цифрового датчика температуры DS 18В20.
с помощью термистора, на рецепт
14.12. Измерение температуры,
с помощью платы Sense НАТ
влажности и давления
Задача
Вы хотите измерять температуру, влажность и давление, но так, чтобы не подклю
чать для этого три отдельных датчика.
Решение
Используйте плату
Raspberry Pi Sense
НА Т (рис.
14.18).
Это позволит вам задейст
вовать сразу все необходимые датчики и получить заодно такое полезное дополне
ние, как дисплей.
Датчики
Рис.
14.18.
Программное обеспечение для платы
ных программ операционной системы
Плата
Sense
417
НАТ
Sense НА Т входит
Raspberry Pi OS.
в число предустановлен
Откройте редактор, введите или вставьте в него приведенный далее код программы
и сохраните его в файле под именем ch_14_sense_hat_thp.py (при желании вы можете
скачать этот файл в порядке, описанном в рецепте
3.22):
from sense_hat import SenseHat
import time
hat = SenseHat ()
while Тrue:
t = hat.get temperature()
h = hat.get_humidity()
р = hat.get_pressure()
print('Temp C:{:.2f} Hwn:{:.Of} Pres:(:.Of}'.format(t, h,
time.sleep(l)
р))
Запустив программу, вы увидите в терминале примерно следующее:
$
pythonЗ
Temp
Temp
ch_14_sense_hat_thp.py
С:27.71
С:27.60
Hum:56 Pres:1005
Hwn:55 Pres:1005
Программа выводит значение температуры в градусах Цельсия, значение относи
тельной влажности в процентах и значение атмосферного давления в миллибарах.
Пояснение
Можно заметить, что плата
температуры.
Sense
НА Т выдает несколько завышенные значения
Это объясняется тем,
что датчик температуры на ней совмещен
418
1
Глава
14
с датчиком влажности и находится непосредственно на плате. Хотя сама плата
Sense
(если вы не используете дисплей), рас
Raspberry Pi может нагреваться и немного повы
НА Т практически не выделяет тепла
положенное под ней устройство
шать температуру платы
Sense
НАТ. Самый простой способ решения этой пробле
Sense НА Т от устройства
мы состоит в том, чтобы немного отодвинуть плату
Raspberry Pi,
воспользовавшись 40-жильным шлейфом. Вы также можете попы
таться скорректировать показания платы
температуры, встроенного в устройство
Sense НАТ7, используя показания датчика
Raspberry Pi. Лично мне кажется, что раз
мер необходимой корректировки при этом сильно зависит от того, как именно сни
маются показания, что не позволяет обеспечить надежные результаты.
Помимо датчика температуры, совмещенного с датчиком влажности, вы также мо
жете задействовать и датчик температуры, встроенный в датчик давления. Считать
значение этого датчика можно следующим образом:
t = hat.get_temperature_from_pressure()
Из документации невозможно понять, выдает ли второй датчик более точные зна
чения, чем первый, но в моем случае его показания были на
1 градус
ниже показа
ний первого датчика.
Дополнительные сведения
Основы работы с платой
Sense НАТ
По адресу
платы
Плата
https://oreil.Iy/JtbT3
Sense НА Т.
приводятся в рецепте
10.15.
можно найти справочник по программированию
Sense НА Т также содержит акселерометр, магнитометр ( см. рецепт 14.15) и
(см. рецепт 14.16), что позволяет использовать ее для ориентации в про
гироскоп
странстве. Она также оснащена полноцветным светодиодным матричным дисплеем
с размером
8 х 8 (см.рецепт 15. 3).
14.13. Измерение температуры
с помощью цифрового датчика
Задача
Обеспечить измерение температуры с помощью высокоточного цифрового датчика.
Решение
Воспользуйтесь цифровым датчиком температуры
DS 18В20.
Он отличается более
высоким уровнем точности по сравнению с датчиком ТМР36, рассмотренным в ре
цепте
14.1 О,
и, кроме того, позволяет обойтись без АЦП благодаря наличию у него
цифрового интерфейса.
7
См. https://oreil.ly/yok86.
Датчики
Хотя интерфейс этого датчика называется однопроводным
(one-wire ),
419
1
это относится
только к линии передачи данных. В действительности для подключения к однопро
водному устройству требуется как минимум еще один провод .
В этом рецепте вам понадобятся:
♦
макетная плата и соединительные провода (см. разд. «Оборудование и комплек
ты для прототипирования» прwюжения
♦ датчик температуры
♦
DS18B20
резистор с сопротивлением
приложения
1);
(см . разд. «Интегральные схемы» приложения
4,7
1);
кОм (см. разд. «Резисторы и конденсаторы»
1).
Схема подключения компонентов на макетной плате показана на рис.
следите за тем, чтобы датчик DS 18В20 был правильно ориентирован .
Рис .
14.19.
Подключение да~ика 0S18В20 к устройству
14.19.
Про
Raspberry Pi
Raspberry Pi OS поддерживает используемый датчиком DS 18В20
однопроводной интерфейс (1-Wire), однако вы должны активировать его с по
мощью утилиты настройки Raspberry Pi (рис . 14.20).
Последняя версия
SSH:
VNC:
SPI:
12С:
Serial Рогt
Serial Console:
1-Wire:
Remote GPIO:
Cll'ICII
Рис.
14.20. Активация
ОК
однопроводноrо интерфейса
420
1
Глава
14
Оrкройте редактор, введиrе или вставьте в него приведенный далее код программы
и сохраниrе его в файле под именем
ch_14_temp_DS18B20.py (при
те скачать этот файл в порядке, описанном в рецепте
iпport gloЬ,
желании вы може
3.22):
tiJDe
base_dir = '/sys/bus/wl/devices/'
device_folder = glob.glob(base_dir + '28*')
device- file = device- folder + '/wl slave'
[О]
def read_temp_raw():
f = open(device_file, 'r')
lines = f.readlines{)
f .close {)
return lines
def read_temp():
lines = read_temp_raw()
while lines [О] .strip () [-3:] != 'YES':
time.sleep(0.2)
lines = read_temp_raw()
equals_pos = lines [1] . find ( 't=')
if equals_pos != -1:
temp_string = lines[l] [equals_pos+2:J
temp_c = float(temp_string) / 1000.0
temp_f = temp_c * 9.0 / 5.0 + 32.О
return temp_c, temp_f
while True:
temp_c, temp_f = read_temp()
print('Temp C=(:.2f)\ttemp F={:.2f}'.foпnat(temp_c, temp_f))
time.sleep(l)
Когда вы запустите эту программу, она начнет с инrервалом в одну секунду выво
диrь на экран значения температуры в градусах Цельсия и Фаренгейта:
$ pythonЗ ch_l4_t:&ip_DS18В20.py
temp
temp
temp
temp
С=25.18
С=25.06
С=26.31
С=28.87
temp
temp
temp
temp
F=77.33
F=77.11
F=79.36
F=83.97
Пояснение
На первый взгляд, программа этого рецеmа выглядиr немного странно. Датчик
DS 18В20
использует для обмена данными файлоподобный инrерфейс. Файловый
инrерфейс такого устройства всегда размещается в папке /sys/Ьus/w1/devices/, а его
составное имя начинается с числа
28,
в то время как остальная часть составного
имени у разных датчиков может бытъ разной.
Датчики
1
421
В этой программе мы предполагаем, что у нас имеется только один датчик, и пото
му ищем первую папку, имя которой начинается с числа 28. При использовании не
скольких датчиков следует использовать разные значения индекса внутри квадрат
ных скобок.
мы откры
В найденной нами папке должен находиться файл с именем w1_slave -
ваем этот файл и считываем его содержимое, чтобы получить значение темпера
туры.
Поскольку датчик возвращает текстовые строки следующего вида:
81 01
81 01
4Ь
4Ь
46 7f ff Of 10 71 : crc=71 YES
46 7f ff Of 10 71 t=24062
в остальной части программы мы извлекаем из этих строк значение, которое при
водится
после
символов
t= и
представляет
собой
температуру,
выраженную
в тысячных долях градуса Цельсия.
Функция read _ temp вычисляет значения температуры в градусах Цельсия и Фарен
гейта и возвращает оба этих значения.
Датчик
DS 18В20
предлагается на рынке не только в виде обычной микросхемы, но
и в виде версии в противоударном и водонепроницаемом корпусе.
Дополнительные сведения
В рецепте
14.24
описывается охранение снятых показаний в журнале. Он пред
ставляет собой доработанную версию инструкций от компании
Спецификация микросхемы
DS 18В20
Adafruit8.
приведена по адресу https://oreil.ly/Лgx8.
14. 3, посвященный измерению температуры
с помощью термистора, на рецепт 14.1 О, где рассматривается измерение темпера
туры с помощью датчика ТМР36, и на рецепт 14.12, в котором описывается изме
рение температуры с помощью платы Sense НА Т.
Обратите также внимание на рецепт
14.14. Измерение ускорения
с помощью модуля MMA8452Q
Задача
Вы хотите подключить к
Raspberry Pi
трехосевой акселерометр.
Решение
Измерение аналоговых сигналов ускорения вдоль осей Х, У и
росхема акселерометра с интерфейсом 1 2 С.
8
См. https://oгeil.ly/o4oQu.
Z
обеспечивает мик
14
Глава
422
В этом рецепте вам понадобятся:
♦
макетная плата (см. разд. «Оборудование и комплекты для прототипирования»
прwюжения
♦
1);
четыре соединительных провода типа «гнездо-гнездо» (см. разд. «Оборудование
и комплекты для прототипирования» прuложения
♦
трехосевой акселерометр
MMA8452Q
1);
(см.разд. «Модули» прuложения
Схема подключения акселерометра на макетной плате показана на рис.
1).
14.21. Мы
Z.
используем здесь три канала АЦП для измерения ускорения вдоль осей Х, У и
Рис. 14.21. Подключение трехосевого акселерометра с интерфейсом 1 2 С
Для этого рецепта также нужно активировать на устройстве
I2c SPI.
цепте
Raspberry Pi
интерфейс
Если вы еще его не активировали, сделайте это в порядке, описанном в ре
10.4.
Откройте редактор, введите или вставьте в него приведенный далее код программы
и сохраните его в файле под именем ch_14_i2c_acc.py (при желании вы можете ска
чать этот файл в порядке, описанном в рецепте
import
3.22):
smЬus
import time
bus = smЬus.SMBus(l)
i2c address
control_reg
=
OxlD
= Ох2А
bus.write_byte_data (i2c_address, control_reg, OxOl) # Запуск
bus.write_byte_data(i2c_address, О хОЕ, О хОО ) # Диапазон измерения time.sleep(0.5)
до
2g
Датчики
def read_acc():
data = bus.read_i2c_Ыock_data(i2c_address,
х = (data[l] * 256 + data[2]) / 16
if х > 2047 :
х -= 4096
у= (data[З] * 256 + data[4]) / 16
if у> 2047 :
у-= 4096
z = (data[5] * 256 + data[6]) / 16
if z > 2047 :
z -= 4096
return (х, у, z)
ОхОО,
while True:
print("x={:.6f}\ty=(:.6f)\tz=(:.6f)".format(x,
time.sleep(0.5)
у,
1
423
7)
z))
Эта программа считывает и выводит на экран значения трех сил ускорения:
$
pythonЗ
ch_l4_i2c_acc.py
z=-1023.000000
z=-350.000000
х=-937.000000 у=257.000000 z=-347.000000
х=-933.000000 у=262.ОООООО z=-350.000000
х=-931.000000 у=259.ОООООО z=-355.000000
х=-1027.000000 у=-809.000000 z=94.000000
х=-122.000000 у=56.ОООООО
х=-933.000000 у=251.ОООООО
Попробуйте наклонить акселерометр в ту или иную сторону и посмотрите, как это
сказывается на его показаниях. Нулевые показания при этом означают отсутствие
какой-либо результирующей силы. Положительные значения (до
нии
2g)
тельные
204 7
при ускоре
говорят о наличии силы, направленной в прямом направлении, а отрица
-
о наличии силы, направленной в обратном направлении. Так, в нашем
случае при снятии первых показаний (когда датчик был направлен горизонтально)
сила оси
Z равна -1023
(что соответствует ускорению
1g).
Пояснение
Возможно, вам потребуется указать в программе другой I2С-адрес акселерометра.
Чтобы узнать, какой адрес нужно задать в вашем случае, выполните после подклю
чения акселерометра следующую команду:
$ sudo i2ocletect -у 1
1 2 3 4 5 6 7 8 9 а Ь с d е
О
00:
-- -- -- -- -- -- -- -- -- ld -10:
20:
30:
40: -- -- -- -- -- -- -50: -- -- -- -60:
70:
f
424
Глава
14
Как видите, в моем случае акселерометру бьm присвоен I2С-адрес ld, и потому пе
ременной
i2c_address
в программе присваивается это значение.
В представленной в этом рецеmе Руthоn-программе мы сначала записываем в ре
гистр управления команду 1 для запуска акселерометра. Затем записываем в ре
гистр ОхОЕ команду настройки о, тем самым задавая в качестве верхнего предела из
мерений значение
2g.
Эrи параметры указаны в спецификации модуля ММА8452Q.
Для снятия новых показаний мы считываем данные шины
и, вьщеляя в них от
l2C
дельные байты, преобразуем их в три значения ускорения вдоль осей Х, У и
Z.
Акселерометры чаще всего используются для выявления наклона, что становится
возможным благодаря тому, что в случае оси
Z
преобладающую роль играет сила
гравитации. При наличии наклона в ту или иную сторону определенная часть вер
тикально направленной силы гравитации начинает действовать вдоль осей Х или У
(рис.
14.22).
Горизонтальное положение
Наклон в одну из сторон
Z = чуть
Z=g
Рис.
14.22.
меньше, чем
g
Х=О
Х=О
У=О
У= чуть больше, чем О
Выявление наклона с помощью акселерометра
Зная эту закономерность, мы можем выявлять те случаи, когда степень наклона
будет превышать определенный порог. Эrот подход иллюстрирует следующая про
грамма (ch_14_i2c_acc_tilt.py) санном в рецепте
при желании вы можете скачать ее в порядке, опи
3.22.
iшport sшЬus
import time
bus =
smЬus.SМВus(l)
i2c address = OxlD
control_reg = Ох2А
bus.write_byte_data(i2c_address, control_reg, Ох01) # Запуск
bus.write_byte_data(i2c_address, ОхОЕ, ОхОО) # диапазон измерения time.sleep(0.5)
def read_асс() :
data = bus.read_i2c_Ьlock_data(i2c_address,
х = (data[l] * 256 + data[2]) / 16
ОхОО,
7)
до
2g
Датчики
if
х
х
> 2047 :
-= 4096
(data[З]
у=
1 425
* 256 + data[4]) / 16
2047 :
4096
z = (data[5] * 256 + data[6]) / 16
if z > 2047 :
z -= 4096
return (х, у, z)
if
у>
у-=
while True:
х, у, z = read_acc()
if х > 400:
print("Left")
elif х < -400:
print ("Right")
elif у> 400:
print ("Back")
elif у< -400:
print("Forward")
time. sleep (О .2)
Когда вы эту программу запустите, она начнет сообщать, в каком направлении сле
дует повернуrь устройство: влево
(Left),
вправо
(Right),
вперед
(Forward)
или назад
(Back).
$ pythonЗ ch_l4_i2c_acc_tilt.py
Left
Left
Right
Forward
Forward
Back
Back
Этот метод можно использовать дru1 управления мобильным роботом или приводом
наклона/поворота с закрепленной на нем веб-камерой.
Дополнительные сведения
<:hнакомьтесь со спецификацией микросхемы ММА8452Q9.
Обратиrе также внимание на рецепт
рометра, встроенного в плату
9
См. bttps://oniLly/sFfaV.
14.16,
Sense ПАТ.
посвященный использованию акселе
426
Глввв
14
14.15. Определение направления
с помощью платы Sense НАТ
на магнитнь1й север
Задача
Вы хотите использовать плату
Sense
НА Т для определения направления на магнит
ный север.
Решение
Воспользоваться встроенным магнитометром платы
Sense
НА Т можно с помощью
Руthоn-библиотеки, предназначенной для работы с этой платой.
Сначала установите библиотеку для работы с платой
ном в рецепте
Sense
НА Т в порядке, описан
10.15.
Затем откройте редактор, введите или вставьте в него приведенный далее код про
граммы и сохраните его в файле под именем ch_14_sense_hat_compass.py (при жела
нии вы можете скачать этот файл в порядке, описанном в рецепте
from sense_hat
i.Jчюrt time
i.Jчюrt
3.22):
SenseHat
sense; SenseHat()
while True:
bearing; sense.get_compass()
print('Bearing: (:.Of) to North'.format(bearing))
time.sleep(0.5)
Когда вы запустите эту программу, она начнет выводить на экран значения угла
отклонения от направления на север:
$ pythonЗ ch_14_sense_hat_compass.py
Bearing: 138 to North
Bearing: 138 to North
Пояснение
Поскольку магнитометр может реагировать и на другие близко расположенные ис
точники магнитного поля, возможно, с его помощью не всегда удается точно опре
делить направление на север. Однако его можно достаточно успешно использовать
для обнаружения магнитов.
Дополнительные сведения
Ознакомьтесь с документацией по библиотеке для работы с платой
Обратите также внимание на рецепт
с помощью платы
10
14.18,
Sense НА Т.
См. https://oreil.ly/dhevo и https://oreil.ly/xdFCf.
Sense НА Г 0 .
посвященный обнаружению магнитов
Датчики
1
427
14.16. Использование
инерциального измерительного блока платы
Sense НАТ
Задача
Вам нужно определять ориентацию устройства
пользовании акселерометра из рецепта
Raspberry Pi
точнее, чем при ис
14.14.
Решение
Воспользуйтесь инерциальным измерительным блоком платы
Sense
НА Т. Помимо
такого же трехосевого акселерометра, с каким мы познакомились в рецепте
14.14,
этот блок также содержит гироскоп и магнитометр. Совместное использование
показаний этих трех датчиков позволяет получить более точные данные об ориен
тации платы
Sense
НАТ в виде углов тангажа, крена и рыскания (рис .
Рыскание
Рис .
14.23).
(Yaw)
14.23. Тангаж ,
крен и рыскание
Понятия тангажа, крена и рыскания используются в авиации для описания ориен
тации летящего самолета. Тангаж
тальной оси. Крен
-
-
это вращение вокруг поперечной горизон
вращение вокруг продольной оси самолета (когда одно крыло
самолета поднимается вверх, а другое опускается вниз), а рыскание
-
это враще
ние вокруг вертикальной оси (изменение азимута).
Откройте редактор, введите или вставьте в него приведенный далее код программы
и сохраните его в файле под именем
ch_ 14_sense_hat_orientation.py (при желании вы
можете скачать этот файл в порядке, описанном в рецепте
from sense_hat import SenseHat
sense = SenseHat ()
sense.set_imu_config (True, True, True )
3.22):
Глава
428
14
whi.le True:
о~ sense.get_orientation()
print("p: {:.Of}, r: {:.Of},
о[
у:
{:.Of}".foпnat(o['pitch'],
o['roll'],
'yaw']))
Функция set_imu_config позволяет указать, какие из трех устройств (включая соот
ветственно магнитометр, гироскоп и акселерометр) должны использоваться для
определения ориентации. В нашем случае мы задействуем все три устройства,
и потому задаем для каждого из них значение тrue.
Когда вы запустите эту программу, она начнет выводить на экран углы тангажа (р),
крена
$
р:
р:
(r)
pythonЗ
и рыскания (у):
ch_l4_sense_hat_orientation.py
1, r: 317,
1, r: 318,
у:
у:
168
169
Попробуйте наклонить устройство
правлении USВ-портов.
Raspberry Pi
вместе с платой
Sense
НА Т в на
При этом вы должны увидеть, что угол тангажа стал
больше.
Пояснение
Акселерометр измеряет силы, действующие на неподви:жную массу, что позволяет
определить степень наклона, рассчитав, в какой мере сила гравитации (действую
щая вдоль оси
Z)
влияет на силы, действующие вдоль осей Х и У.
В отличие от акселерометра, гироскоп измеряет силы, действующие на дви:жущие
ся массы (или колеблющиеся), при их вращении относительно траектории движе
ния с учетом так называемого эффекта Кориолиса.
Дополнительные сведения
Более подробную информацию об инерциальном измерительном блоке платы
Sense
НАТ можно найти по адресу
bttps://oreil.lyffr8YV.
Использование платы
НА Т для измерения температуры, влажности и атмо
Sense
сферного давления рассматривается в рецепте
Инерциальный измерительный блок платы
14.12.
Sense
НА Т таюке можно использовать
для определения азимуrа и обнаружения магнитов (см.рецепт
14.18).
Более подробную информацию о гироскопах и эффекте Кориолиса можно найти по
адресу bttps://oreil.lyffXНiz.
14.17. Обнаружение магнита с
помощью геркона
Задача
Вы хотите обнаружить присутствие магнита.
Датчики
1 429
Решение
Используйте для этого геркон (рис.
Он действует так же, как и обычная
14.24).
кнопка, с тем отличием, что его контакты замыкаются при попадании в магнитное
поле.
Рис.
14.24.
Геркон
Принцип действия геркона показан на рис.
14.25.
Внутри стеклянной трубки нахо
дятся два язычковых маrнитоуправляемых контакта. При поднесении к геркону
магнита эти контакты притягиваются друг к другу и замыкают цепь.
Рис.
14.25.
Принцип действия герконового переключателя
Герконы можно использовать во всех рецептах из главы
пользование кнопки, начиная с рецепта
13,
предполагающих ис
13.1.
Пояснение
Использование герконов представляет собой простейший способ обнаружения маг
нита. Такие устройства вошли в обиход с 1930-х годов и отличаются очень высокой
надежностью. Они широко применяются охранных системах, где в дверной короб
ке и в самой двери размещаются соответственно заключенные в пластмассовую
оболочку геркон и постоянный магнит. При открытии двери контакты геркона раз
мыкаются, запуская тревожную сигнализацию.
Дополнительные сведения
Обратите также внимание на рецепт
с помощью магнитометра платы
Sense
14.18,
посвященный обнаружению магнита
НАТ.
14.18. Обнаружение магнита с помощью платы Sense НАТ
Задача
Вы хотите обнаружить присутствие магнита с помощью встроенного магнитометра
платы
Sense
НА Т и Руthоn-проrраммы.
430
1
Глава
14
Решение
Обеспечить взаимодействие с магнитометром платы
Sense
НА Т можно с помощью
Руthоn-библиотеки, предназначенной для работы с этой платой.
Откройте редактор, введите или вставьте в него приведенный далее код программы
и сохраните его в файле под именем ch_14_sense_hat_magnet.py (при желании вы
можете скачать этот файл в порядке, описанном в рецепте
from 1en1e_hat
iqюrt time
iqюrt
3.22):
SenseHat
hat = SenseHat()
fill = (255, О, О)
whil• True:
reading = int(hat.get_coirpass_raw() ['z'])
if reading > 200:
hat. clear (fill)
time.sleep(0.2)
•1••:
hat. clear ()
Когда рядом с платой
Sense
НА Т окажется магнит, все ее светодиоды будут на две
десятые секунды загораться красным цветом.
Пояснение
В рассматриваемом случае можно использовать любое из трех значений магнито
метра, поскольку все они сильно изменятся при появлении вблизи платы постоян
ного магнита.
Дополнительные сведения
Обратите также внимание на рецепт
с помощью геркона, и на рецепт
пользования дисплея платы
14.19. Измерение
Sense
14.17, посвященный обнаружению магнита
15.3, где рассматриваются другие способы ис
НА Т.
расстояния с помощью ультразвука
Задача
Вы хотите обеспечить измерение расстояний с помощью ультразвукового дально
мера.
Решение
Для этой цели вполне подойдет недорогой ультразвуковой дальномер
К нему надо будет подключить два контакта
GPIO:
HC-SR04.
с помощью одного из них мы
Датчики
станем
запускать
излучение ультразвукового
импульса,
а
с
помощью
1
431
другого
-
отслеживать, спустя какое время возвращается эхо.
В этом рецепте вам понадобятся:
♦
макетная плата и соединительные провода (см. разд. «Оборудование и комплек
ты для прототипирования» приложения
(можно найти на сайте еВау);
♦
дальномер
♦
резистор с сопротивлением
HC-SR04
приложения
♦
470
Ом (см. разд. «Резисторы и конденсаторы»
270
Ом (см. разд. «Резисторы и конденсаторы»
1);
резистор с сопротивлением
приложения
1);
1).
Схема подключения компонентов на макетной плате показана на рис. 14.26. Рези
сторы здесь нужны для того, чтобы снизить с 5 до 3,3 В напряжение выдаваемого
дальномером сигнала эха (см. рецепт
10.12).
HC-SRO'I
Рис.
14.26.
Подключение дальномера
HC-SR04 к устройству Raspberry Pi
Откройте редактор, введите или вставьте в него приведенный далее код программы
и сохраните его в файле под именем ch_14_ranger.py (при желании вы можете ска
чать этот файл в порядке, описанном в рецепте
from gpiozero import DistanceSensor
from time import sleep
sensor = DistanceSensor (echo=l8, trigger=17 )
while True:
cm = sensor.distance * 100
3.22):
432
Глава
14
inch =ст/ 2.5
print ( "crn= { : . Of) \tinches= {: . О f)". forrnat (crn, inch) )
sleep(0.5)
Как работает эта программа, будет рассказано в разд. «Пояснение». Когда вы ее
запустите,
она
начнет с
интервалом
в
одну
секунду
выводить
на
экран
значения
расстояния в сантиметрах и дюймах. Попробуйте изменить показания датчика,
поместив перед ним свою руку или какое-либо другое препятствие:
$ pythonЗ ch_14_ranger.py
inches=бl.8
crn=l54.7
crn=l2.9
inches=5.l
crn=l4.0
inches=5.6
crn=20.2
inches=8.0
Пояснение
Хотя в продаже имеются и другие модели дальномеров, задействованный в этом
рецепте датчик отличается простотой использования и низкой стоимостью. Он из
меряет расстояние, отправляя к препятствию ультразвуковой импульс и фиксируя
время, проходящее до возвращения эха. На лицевой поверхности датчика располо
жены два ультразвуковых преобразователя, один из которых является передатчи
ком, а другой
-
приемником.
Мы управляем процессом измерения с устройства
Raspberry Pi.
Различие же между
этим дальномером и более дорогими моделями состоит в том, что у последних име
ется собственный микроконтроллер, который выполняет всю работу по измерению
времени и возвращает окончательный результат через шину 1 2 С или последова
тельный интерфейс.
При использовании такого датчика совместно с
Raspberry Pi его вход Trig (триггер)
следует соединить с выходом GPIO на устройстве Raspberry Pi, а выход Echo с входом GPIO, перед этим понизив напряжение сигнала с 5 В до безопасных 3,3 В.
На рис.
чика.
14.27
показаны осциллограммы, полученные при использовании этого дат
Выше расположена осциллограмма сигнала на контакте
осциллограмма сигнала на контакте
Echo.
Trig,
генерируется короткий импульс. После небольшой задержки на контакте
появляется
импульс,
длительность
а ниже
Как видите, сначала на контакте
которого
прямо
Trig
Echo тоже
пропорциональна расстоянию
от датчика до препятствия.
В нашем случае программа использует класс DistanceSensor из библиотеки gpiozero,
который берет на себя все заботы по генерированию импульса и измерению рас
стояния.
Рассмотренный здесь метод измерения расстояния не отличается большой точно
стью,
потому
что
такие
параметры,
как
температура,
давление
и
относительная
влажность окружающей среды, могут сказываться на скорости распространения
звука (которая составляет примерно
датчика.
30
см/мс) и таким образом изменять показания
Датчики
Рис.
14.27.
1
433
Осциллограммы сигналов триггера (вверху) и эха (внизу)
Дополнительные сведения
Ознакомиться со спецификацией используемого здесь ультразвукового дальномера
можно по адресу https://oгeil.lyЛгeGc, а с документацией класса DistanceSensor адресу https://oгeil.ly/
по
XYk3m .
14.20. Измерение
расстояния
с помощью датчика времени пролета
(Time-of-Flight)
Задача
Вы собираетесь измерять расстояние, не прибегая к использованию ультразвука
(например, боитесь испугать ультразвуком своих домашних питомцев или просто
хотите измерять расстояние более точно).
Решение
Используйте датчик времени пролета VLSЗL I Х с интерфейсом 1 2 С. Такие датчики
стоят дороже ультрювуковых датчиков, но зато отличаются большей точностью,
поскольку используют для и з мерений свет, а не з вук .
Самым распространенным устройством такого типа является недорогой датчик
VL53 L I Х,
который можно найти и на сайте еВау, и у д ругих поставщиков. Досто
инством исrюльзуемой ·щесь версии этого датчика от компании Pinюroni является
то , что она совместима с 11латой
Breakout Garden от этой же компании , что позволя-
434
1
Глава
14
ет произвести ее подключение, не прибегая к пайке. Установка датчика VLSЗLIX
на плату
Breakout Garden
показана на рис.
14.28.
В этом рецепте вам понадобятся:
♦
плата
Breakout Garden
от компании
Pimoroni
плекты для прототипированию> прwюжения
♦ датчик расстояния VLSЗL 1Х от компании
жения
(см. разд. «Оборудование и ком
1);
Pimoroni
(см. разд. «Модули» прwю
1)
или:
♦
универсальный модуль датчика расстояния VLSЗL 1Х (см. разд. «Модули» при
ложе11ия
♦
1);
четыре соединительных провода типа «штырь-гнездо» (см. разд. «Оборудование
и ко;wплекты для прототuпuрованuя» прwюжения
Рис.
1).
14.28. Датч-1к времени полета VL53L 1Х" плата Breakout Garden от компани-1 Pimoroni
Подключение датчика VLSЗL 1Х к Raspberry Pi производится так же, как в случае
любого другого устройства с интерфейсом I2C. Поскольку этот датчик будет рабо
тать от напряжения 3 В, мы должны подключить его к контактам ЗV и GND уст
ройства Raspberry Pi. Подключите также контакты SDA и SCL датчика к контактам
SDA и SCL устройства Raspberry Pi (это соответственно 2-й и 3-й контакты разъема
GPIO).
Если вы решили применить плату
Breakout Garden,
достаточно лишь проследить за
тем, чтобы датчик был правильно ориентирован (см. рис.
почли воспользоваться соединительными проводами:
14.28).
Если же вы пред
Датчики
♦
контакт VCC
Raspberry Pi;
♦ контакт
датчика
VL53L1X
SDA датчика VL53LlX устройстве Raspberry Pi;
♦
контакт
к контакту
контакт
ройстве
435
подключите к контакту ЗV на устройстве
GND датчика VL53L1X- к контакту GND
♦
1
SCL датчика VL53LlX- к
Raspberry Pi.
контакту
на устройстве
SDA
SCL
Raspberry Pi;
(2-му контакту
(3-му контакту
GPIO)
GPIO)
на
на уст-
Поскольку датчик VL53LlX использует интерфейс 1 2 С, активируйте этот интер
фейс, как описано в рецепте
10.4.
Затем установите необходимое для работы
с этим датчиком программное обеспечение, выполнив команды:
$ sudo
$ sudo
рiрЗ
рiрЗ
install smЬus2
install vl5311x
Тестовая программа для этого рецепта
(ch_ 14_tof.py)
с интервалом в одну секунду
выводит на экран измеренное расстояние в миллиметрах:
iq)ort
VLSЭLlX,
tim8
tof = VL53LlX.VL53LlX(i2c_bus=l, i2c_address~Ox29)
tof. open ()
tof.start_ranging(l) # Запуск измерения расстояний;
# 1• короткие 2•средние З•длинньrе
while True:
mm = tof.get_distance() #
print ("mm=" + str (mm) )
time.sleep(l)
Получение значения расстояния в мм
При желании вы можете скачать эту программу в порядке, описанном в рецеп
те
3.22.
Если ваше устройство использует другой 1 2 С-адрес, укажите его в программе вме
сто адреса Ох29.
Пояснение
Датчик времени
пролета
VL53L1X
представляет собой аккуратное
маленькое
устройство, включающее в себя маломощный инфракрасный лазер и приемник
лазерного излучения, а также электронику, обеспечивающую обмен данными по
средством интерфейса 1 2 С.
Этот датчик основан на том же принципе действия, что и ультразвуковой датчик из
рецепта
14.19, с тем отличием,
что вместо звука здесь излучается лазерный свет.
436
1
Глава
14
Дополнительные сведения
Обратите также внимание на рецепт
14.19,
посвященный измерению расстояния
с помощью ультразвука.
Со спецификацией датчика
VL53L1X
можно ознакомиться по адресу
https://oreil.ly/R_uBy.
14.21. Наделение устройства Raspberry Pi
тактильным интерфейсом
Задача
Вы хотите снабдить устройство
Raspberry Pi тактильным
интерфейсом.
Решение
Используйте плату
Рис.
14.29.
Adafruit Capacitive Touch
НА Т (рис.
Плата
НАТ с подключенным к ней яблоком
Adafruit Capacitive Touch
14.29).
Работать с тактильными датчиками очень интересно и полезно с образовательной
точки зрения. К ним можно подключать любые объекты, обладающие хотя бы ми
нимальной проводимостью,
-
например, фрукты. Так, один очень популярный
проект сводится к созданию фруктовой клавиатуры путем подключения к контак
там тактильных датчиков различных овощей и фруктов с помощью аллигаторных
зажимов. Эта схема издает различные звуки, когда вы прикасаетесь к этим фруктам
и овощам.
Датчики
Для использования платы
Adafruit Capacitive Touch
НА Т на устройстве
437
Raspberry Pi
необходимо активировать интерфейс 1 2 С. Вам также потребуется интерфейс SPI,
поэтому, если вы еще этого не сделали, активируйте оба эти интерфейса, как опи
сано в рецептах
1О. 4
и
1О. 6.
Чтобы установить Руthоп-библиотеку для работы с этой платой, выполните команды:
$
$
install adafruit-Ыinka
install adafruit-circuitpython-mprl21
рiрЗ
рiрЗ
Опробовать наше решение в действии можно, запустив следующую программу
(ch_ 14_touch.py):
import time
import board
import busio
import adafruit_mprl21
i2c = busio.I2C(board.SCL, board.SDA)
mprl21 = adafruit_mprl21.MPR12l(i2c)
while True:
if mprl21[0] .value:
print("Pin О touched 1")
При желании вы можете скачать этот пример кода в порядке, описанном в рецеп
те
3.22.
Если вы прикоснетесь пальцем к контактной площадке, помеченной цифрой О, на
экране появится соответствующее сообщение:
$
ch_l4_touch.py
touched 1
touched 1
pythonЗ
Pin
Pin
О
О
Вы можете либо прикасаться к контактной площадке рукой, либо подключить к ней
какой-либо фрукт с rюмощью а:1лигаторного зажима, как показано на рис.
14.29.
Пояснение
Плата
Adafi-uit Capacitive Т ouch
НА Т имеет
12
контактных площадок. Если вам не
требуется столь большое количество контактов, вы можете задействовать плаrу
Pimoroni Exp\orer
НА Т
Pro,
которая снабжена четырьмя контактными площадками,
совместимыми с аллигаторными зажимами (рис.
14.30).
Чтобы использовать тактильные контапы платы
Explorer
НА Т
Pro,
потребуется
установить библиотеку для работы с этой платой, как описано в рецепте
10. 16.
Помимо расположенных у края платы четырех контактных площадок для аллига
торных зажимов, на этой плате также имеются четыре тактильных переключателя,
которые помечены цифрами от
I до 4.
438
1
Глава
14
Рис.
14.30.
Плата
Explorer
НАТ Рго с nодключенным к ней яблоком
Дополнительные сведения
Более подробные сведения можно найти в документации по плате
tive Touch
14.22.
НАГ I и плате
Explorer
НА Т
Adafruit Capaci-
Pro 12 .
Чтение смарт-карт с помощью устройства
для чтения/записи RFID-кapт
Задача
Вы хотите обеспечить чтение и запись смарт-карт с радиочастотной идентификаци
ей
(radio-frequency identification, RFID).
Решение
Используйте недорогое устройство для чтения/записи RFID-кapт
RC-522
и Руthоn
библиотеку SimpleMFRCS22.
В этом рецепте вам понадобятся:
♦
считыватель карт
RC-522 -
он часто продается в комплекте с несколькими
RFIО-метками (см.разд. <<Моду.7ю> приложения
11
С\1. https://oreil.ly/Ox_ YZ.
tc
С\1. https://oreil.ly/ifpdt.
1);
Датчики
♦
1
439
семь соединительных проводов типа «гнездо-гнездо» см. разд. «Оборудование и
комплекты для прототипирования» прwюжения
1).
На рис. 14.31 показано, как следует подключить считыватель RC-522 к устройству
Raspberry Pi. Этот считыватель использует интерфейс SPI, поэтому для его исполь
зования необходимо активировать его на устройстве Raspberry Pi, как описано
в рецепте 10.6.
Рис.
В табл.
14.1
14.31.
Подключение считывателя
RC-522 к устройству Raspberry Pi
указано, какие подключения вам нужно произвести с помощью соеди
нительных проводов. Чтобы вам было проще разобраться с тем, что с чем следует
соединять, здесь также отмечен цвет проводов.
Таблица
Цвет провода
14.1. Подключение устройства для чтения/записи RF/0-кapm
к устройству Raspberry Pi
Контакт на считывателе
Оранжевый
SDA
Желтый
SCK
Контакт на устройстве
Raspberry Pi
GPIO 8
SCLК/GPIO
11
Белый
MOSI
MOSI/GPIO 10
Зеленый
MISO
MISO/GPIO 9
Синий
GND
GND
Серый
RST
GPIO 25
Красный
З.ЗV
з . зv
Хотя наличие у считывателя
RC-522
может использовать интерфейс
с
RC-522
Raspberry Pi
интерфейс
SPI.
I2c,
контактов
SDA
и
SCL
говорит о том, что он
в этом рецепте мы задействуем для связи
440
Глава
14
Для работы со считывателем RC-522 сначала нужно установить программный
пакет
Clever Card Kit,
выполнив приведенные далее команды,
при этом будет
-
установлено все необходимое программное обеспечение:
$ wget
$ chmod
http://monkmakes.com/downloads/пmcck.sh
+х
mmcck.sh
$ ./mmcck.sh
По завершении установки нужно выполнить перезагрузку устройства.
Чтобы протестировать считыватель, запустите программу 01_read.py в каталоге
clever_card_kit:
$ cd ~/clever_card_ki.t
Ol_read.py
Hold а tag near the reader
894922433952
$
pythonЗ
894922433952
894922433952
Вот как выглядит эта программа:
RPi.GPIO аз GPIO
import SimpleMFRC522
i.qюrt
reader = SimpleMFRC522.Sllf{JleMFRC522()
print("Hold
а
tag near the reader")
try:
while True:
id, text = reader.read()
print(id)
print (text)
finally:
print ("cleaning up")
GPIO. cleanup ()
Библиотека RPi. GPIO импортируется исключительно дJ1Я того, чтобы перед выходом
из программы можно бьmо сбросить состояние контактов
GPIO
с помощью функ
ции cleanup. Вызов функции reader. read () ждет того момента, когда карта с
RFID-
меткой будет поднесена к счиrывателю, после чего выводит на экран уникальный
номер карты
(id) и
сохраненное на ней текстовое сообщение (text).
При поднесении карты к считывателю RC-522 программа 01_read.py будет выводить
на экран уникальный номер встроенной в кар,у RFID-метки. Когда вы вдоволь наи
граетесь со счиrыванием карт, нажмите комбинацию клавиши
выхода из программы.
<Ctrl>+<C>
для
Датчики
441
Хотя тот уникальный номер, который присваивается каждой метке на этапе произ
водства, изменить нельзя, вы все же можете записать на карту некоторое неболь
шое количество данных. Чтобы это сделать, запустите программу 02_write.py:
02_write.py
New Text: Raspberry Pi
Now scan а tag to write
written
894922433952
Raspberry Pi
New Text:
$
pythonЗ
Записав на карту некоторый новый текст, вы можете убедиться в том, что он
успешно записался, снова запустив программу
01_read.py.
Программа 02_write.py выглядит следующим образом:
import RPi.GPIO аз GPIO
import SimpleMFRC522
reader = SimpleMFRC522.SimpleMFRC522()
try:
while True:
text = input ( 'New Text: ' )
print("Now scan а tag to write")
id, text = reader.write(text)
print("written")
print(id)
print (text)
finally:
print ("cleaning up")
GPIO. cleanup ()
Использование различных функций устройства для чтения/записи RFID-кapт
-
достаточно сложный процесс. Класс Simpleмrncs22 существенно упрощает эту рабо
ту, сводя ее к простейшим операциям чтения и записи текста на карту. Создав
экземпляр класса
SimpleMFRC522,
вы можете затем просто вызвать метод
read
для чте
ния данных с карты, который возвращает и идентификатор карты, и записанный на
ней текст. Метод
write возвращает те же значения, но, помимо этого, также позво
ляет указать, какой текст следует записать на карту.
Пояснение
Хотя RFID-метки могут сильно различаться по форме и размеру, для них определен
ряд стандартов, предписывающих использование разных частот и разных коммуни
кационных протоколов. Поэтому при чтении и записи карт с помощью устройства
442
Глава
RC-522
следите за тем, чтобы это были карты, рассчитанные на частоту
14
13,56 МГц.
Класс SirrpleMFRC522 тоже может работать не со всеми видами карт, поэтому, если вы
решили его использовать, берите только карты стандарта
Mifare 1К.
В силу имеющихся различий в том, что и как можно записать в памяти карты,
в большинстве случаев лучше не полагаться на сохранение данных в метке, а ори
ентироваться только на уникальный идентификатор карты, сохраняя где-то в дру
гом месте данные для этого уникального ключа. Программы 05_1auncher_setup.py и
05_1auncher.py
из каталога
clever_card_kit
демонстрируют применение этого подхода
с сохранением табличных данных в файле с расширением pickle (см.рецепт
7. 9).
Дополнительные сведения
Более подробную информацию можно найти в полной документации по классу
SirrpleMFRC52 2 13 .
14.23. Отображение показаний датчика
Задача
Вы подключили к
Raspberry Pi
определенный датчик и хотите отобразить его пока
зания на экране большого цифрового дисплея.
Решение
Используйте библиотеку guizero чтобы открыть окно и отобразить в нем показания
датчика с использованием крупного шрифта (рис.
-
--
14.32).
------
gu,zero
-
□
х
226
Рис .
14.32.
Отображение показаний датчика с помощью библиотеки
Мы будем выводить здесь данные датчика пролета из рецепта
guizero
14.20,
поэтому сна
чала выполните то, что предлагалось в том рецепте. В качестве альтернативы для
использования здесь также можно адаптировать и почти любой другой рецепт
с датчиками из этой главы .
13 См.
https://oreil.ly/QibgQ.
Датчики
1
443
Откройте редактор, введите или вставьте в него приведенный далее код программы
и сохраните его в файле под именем ch_14_gui_sensor_reading.py (при желании вы
можете скачать этот файл в порядке, описанном в рецепте
3.22):
import VLSЗLlX, timв
from guizero import Арр, Text
tof = VL53LlX.VL53LlX(i2c_bus=l, i2c address=0x29)
tof .open 1)
tof.start_ranging(l)
def update_reading():
mm = tof.get_distance()
reading_text.value = str(mm)
арр = App(width=З00, height=l50)
reading_text = Text(app, size=l00)
reading_text.repeat(l000, update_read1ng)
арр. display 1)
Функция
update_reading получает новое значение от датчика пролета (или любого
другого датчика, который вы решили использовать) и присваивает его (в виде стро
ки) свойству value объекта reading text.
Чтобы обеспечить автоматическое обновление показаний,
мы
метод
вызываем
repeat объекта reading_ text, передавая ему в качестве первого параметра интервал
между обновлениями в миллисекундах (в нашем случае 1000), а в качестве второ
го
-
имя вызываемой функции (update_reading).
Пояснение
Хотя мы используем в этом рецепте датчик расстояния, здесь с тем же успехом
можно задействовать и любой другой датчик из рецептов этой главы. Для этого
нужно лишь изменить способ получения показаний от датчика.
Дополнительные сведения
О том, как можно отформатировать числа таким образом, чтобы они отображались
с определенным количеством знаков после запятой, рассказывается в рецепте
7.1.
Если вы хотите отобразить показания датчика не в окне приложения, а в окне брау
зера, обратитесь к рецепту
14.24. Сохранение
17. 2.
результатов измерений
на флеш-накопителе с интерфейсом
USB
Задача
Вы хотите сохранять показания датчика на флеш-накопителе с интерфейсом
USB.
Глава
444
14
Решение
Создайте Python-пporpaммy, записывающую показания датчика в виде файла на
USВ-накопителе. Если вы будете сохранять эти данные в формате СSV-файла, то
его можно будет напрямую импортировать в любой редактор электронных таблиц,
включая редактор из пакета
(см.рецепт
LibreOffice,
используемый на устройствах
Raspberry Pi
4.3).
Приведенный далее пример кода (ch_ 14_temp_log.py) показывает, как можно сохра
нять значения температуры процессора устройства
Raspberry Pi (см. рецепт 14.11):
glob, time, datetime
from gpiozero 1mport CPUTemperature
iпq:юrt
log_period = 600 #
секунды
logging_ folder = glob. glob 1' /media/pi/*' 1 [О]
dt = datetime.datetime.now(J
file_name = "temp_log_(: У_ m_':d).csv".format(dt)
logging_file = logging_folder + '/' + file name
def read_temp():
cpu_temp = CPUTemperature() .temperature
return cpu _ temp
def log_ temp (1 :
temp_c = read templ)
dt = datetime.datetime.now()
f = open(logging_file, 'а')
line = '\n"{:IH:IM:'!,S)","{}"'.format(dt, temp_c)
f. wr i te (l ine)
print (line}
f.close()
print ("Logging to: " + logging_file}
while True:
log_temp 11
time.sleep(log_period)
При желании вы можете скачать этот пример кода в порядке, описанном в рецеп
те
3.22.
Программа сохраняет значения температуры с интервалом в
1О
минут
(600 секунд).
При желании вы можете изменить этот интервал, присвоив другое значение пере
менной
log_period.
Чтобы обеспечить программе доступ к флеш-накопителю, ее нужно запускать
с использованием команды
sudo:
$ sudo pythonЗ ch_l4_temp_log.py
Logging to: /media/pi/temp_log_2022 06 22.csv
Датчики
1
445
"13:09:02", "38.459"
"13:09:12","38.946"
"13:09:22","37.972"
"13:09:32","37.485"
Перед тем как начать запись результатов измерений, программа выводит на экран
путь к соответствующему файлу на флеш-накопителе. Обратите внимание, что
в нашем случае мы немного ускорили сбор данных, уменьшив интервал до
1О
се
кунд.
Пояснение
Когда вы вставляете USВ-накопитель в устройство
Raspberry Pi, он
подключения к Raspberry Pi
автоматически
монтируется в папку /media/pi. В случае
сразу несколь
ких съемных носителей программа этого рецепта будет использовать первую же
папку, которую она найдет внутри папки /media. Результаты измерений сохраняют
ся в файле, имя которого составляется из текущей даты.
Вы можете напрямую отредактировать сохраненные данные, открыв этот файл
в редакторе электронных таблиц. Некоторые редакторы электронных таблиц при
этом просят указать, какой разделитель используется в файле (в нашем случае это
запятая).
F
Е
D
н
G
ЗQ5
З9
3&5
311
37.5
37
3&5
о
1
2
з
4
5
6
7
8
9
24
i.
◄
►
►1
+
temp..log.20~
Clwrtмleclld
Рис.
14.33. Отображение
rрафика изменения показаний в редакторе электронных таблиц
446
1
На рис.
Глава
14.33
14
представлен пример того, как можно открыть файл с результатами
измерений в редакторе электронных таблиц из пакета
запущенном на устройстве
LibreOffice
(см. рецепт
4.3),
Raspberry Pi.
Дополнительные сведения
Программу приведенного здесь рецепта можно легко адаптировать под использо
вание любых других датчиков, рассмотренных в этой главе.
Обратите также внимание на рецепт
17. 7,
где описывается пример сохранения
результатов измерений с помощью веб-сервиса.
ГЛАВА
15
Дисплеи
15.0. Введение
Хотя к устройству
Raspberry Pi
можно подключить компьютерный монитор или
телевизор, во многих случаях его лучше использовать в сочетании с миниатюрным
и более специализированным отображающим устройством. В этой главе мы рас
смотрим многие из тех индикаторов и дисплеев, способных работать совместно
с
Raspberry Pi.
Вместо описываемых здесь специализированных дисплеев, к
Raspberry Pi
также
можно подключить компьютерный монитор (который тоже может быть неболь
шим) или даже смартфон или планшет с использованием VNС-соединения.
15.1. Использование
четырехразрядного светодиодного индикатора
Задача
Вы хотите отображать четырехзначные числа с помощью старого доброго семисег
ментного светодиодного дисплея.
Решение
Подключите к Raspberry Pi светодиодный модуль с интерфейсом 1 2 С представлен
ного на рис.
15 .1
типа, используя для этого соединительные
провода «rнездо
гнездо».
В этом рецепте вам понадобятся:
♦
четыре соединительных провода типа «гнездо-гнездо» (см. разд. «Оборудование
и комплекты для прототипирования» прюожения
♦
]);
4-разрядный 7-сегментный светодиодный индикатор (дисплей) с интерфейсом
I2C от компании Adafruit (см. разд. «Моду,7И>) приложения]).
Для подключения дисплея к устройству
♦
вывод VCC (+)
Raspberry Pi;
Raspberry Pi:
дисплея соедините с выводом
SV
разъема
GPIO
на устройстве
Глава
448
Рис.
15
15.1.
Подключение к
♦
вывод GND (-)
berry Pi;
♦
вывод SDA (D)
Raspberry Pi;
♦
вывод
SCL
дисплея
дисплея
(С) дисплея
-
Raspberry Pi
семисегментного светодиодного дисплея
с выводом
-
GND
в выводом
-
с выводом
3
2
разъема
разъема
разъема
GPIO
на устройстве
GPIO (SDA)
GPIO (SCL)
Rasp-
на устройстве
на устройстве
Rasp-
berry Pi.
Следует отметить, что компания
Adafruit
также предлагает и крупноразмерную
версию своего светодиодного индикатора. Этот, более крупный индикатор под
ключается так же, как здесь предложено, с тем лишь отличием, что он использует
две линии питания: для логики
(V _10)
и для индикатора
(5V).
Дело тут в том, что
более крупный индикатор просто потребляет больше тока. К счастью, устройство
Raspberry Pi
выдает достаточно тока для того, чтобы можно было запитать и такой
индикатор. Вам потребуется лишь соединить его дополнительный вывод питания
со вторым контактом
SV
разъема
GPIO,
задействовав еще один провод типа «гнез
до-гнездо».
Для этого рецепта также нужно активировать на устройстве Raspberry Pi интерфейс
1 2 С . Если вы еще его не активировали, сделайте это в порядке, описанном в рецеп
те
10.4.
Чтобы установить программное обеспечение от компании
Adafruit,
обеспечиваю
щее поддержку этого типа индикаторов, выполните следующие команды:
$
cd ~
$ рiрЗ install ada f ru i t -Ы inka
$
$
i nstall adafruit - circuitpython - htl6k33
sudo apt install pythoпЗ-pil
рiрЗ
Дисплеи
1
449
В качестве простейшего примера представленная далее программа ch_ 15_7_seg.py
ведет отсчет от О до
9999
с интервалом в одну секунду, возвращаясь к нулю при
достижении конца диапазона:
import Ьoard
from adafruit_htlбk33.segments import Seg7x4
from time import sleep
i2c = board. I2C ()
display = Seg7x4(i2c)
display.brightness = 0.5
х
=
о
while True:
display.print("
display.print(x)
х += 1
if х > 9999:
х
")
о
=
sleep(l)
При желании вы можете скачать этот пример кода в порядке, описанном в рецеп
те
3.22.
Пояснение
Программное обеспечение от
Blinka,
Adafruit
для этого индикатора использует модуль
который позволяет задействовать СirсuitРуthоn-библиотеки от
Adafruit
из
обычного Python-кoдa.
Для настройки индикатора мы сначала создаем экземпляр класса
r2c, а затем
-
экземпляр класса seg7x4, передавая ему объект r2c в качестве параметра.
Представленный в этом рецепте дисплей может отображать числа или самый про
стейший текст. Цифры и символы при этом выводятся последовательно, без очист
ки предыдущей информации. Так, если вы захотите отобразить число
число
2,
индикатор в реальности отобразит число
12,
1,
а затем
сдвинув первое число влево
перед отображением второго. Поэтому перед отображением следующего числа
необходимо очищать разряды индикатора
белов с помощью команды
-
например, путем вывода четырех про
display. print (" ").
Дополнительные сведения
Более подробную информацию об используемой здесь CircuitPython-библиoтeкe от
компании
Adafruit
можно найти по адресу
https://oreil.ly/x3Dg9.
450
1
Глава
15
15.2. Отображение
графики на светодиодной матрице
с интерфейсом 1 2 С
Задача
Вы хотите обеспечить управление пикселами многоцветного светодиодного мат
ричного дисплея.
Решение
Воспользуйтесь светодиодным модулем с интерфейсом I"C представленного на
15.2 типа, подключив его к Raspberгy Pi с помощью соединительных проводов
рис.
«гнездо-гнездо».
Рис.
15.2.
Подключение светодиодного матричного дисплея к устройству
через переходник для разъема
Raspberry Pi 400
GPIO
В этом рецепте вам понадобятся:
♦
четыре соединительных провода типа «гнездо-гнездо» (см. разд. <<Оборудование
и ко:wп.1екты д.1я протопптирования» пр11.10.же1111я ]);
♦
двухцветная светодиодная матрица с квадратными пикселами и интерфейсом
1 2 С от компании Adafruit (см. разд. ((Моду.1ю) при:южения ]);
Дисплеи
если вы решили использовать модель
♦
1
451
Raspberry Pi 400, как показано на рис. 15.2,
GPIO, упрошающий подключе
вам также понадобится переходник для разъема
ние к его контактам.
Для подключения дисплея к устройству
вывод
Raspberry Pi:
дисплея соедините с выводом
5V
разъема
на устройстве
GPIO
♦
VCC (+)
Raspberry Pi;
♦
вывод
♦
вывод
SDA (D)
Raspberry Pi;
дисплея
-
с выводом
2
разъема
GPIO (SDA)
на устройстве
♦
SCL (С)
Raspberry Pi.
дисплея
-
с выводом
3
разъема
GPIO (SCL)
на устройстве
GND (-)
Raspberry Pi
вывод
дисплея
-
с выводом
GND
разъема
GPIO
на устройстве
Для этого рецепта также нужно активировать на устройстве Raspberry Pi интерфейс
1 2 С. Если вы еще его не активировали, сделайте это в порядке, описанном в рецеп
те
10.4.
Чтобы обеспечить поддержку этого дисплея, нужно установить то же программное
обеспечение от
Adafruit,
которое мы устанавливали в рецепте
15. 1.
Если вы еще
этого не сделали, установите его с помощью следующих команд:
$ cd ~
install adafruit-Ыinka
install adafruit-circuitpython-htlбk33
$ sudo apt install python3-pil
$
рiрЗ
$
рiрЗ
Представленная далее программа
ch_ 1S_matrix.py
случайным образом меняет цвет
случайно выбранного пиксела на красный, зеленый или оранжевый, делая это с ин
тервалом в одну десятую секунды:
iqюrt Ьoard
from adafruit_htlбk33.matrix
from time iпport sleep
from random iпport randint
iпport
Matrix8x8x2
i2c = board.I2C()
display = Matrix8x8x2(i2c)
display.brightness = 0.5
while True:
х = randint(O, В)
у= randint(O, В)
color = randint(O, 4)
display[x, у) = color
sleep(0.1)
При желании вы можете скачать этот пример кода в порядке, описанном в рецеп
те
3.22.
452
1
Глава
15
Пояснение
В этой программе мы импортируем класс мatrixBxBx2 и создаем его экземrmяр, пере
давая в качестве параметра объект 1 2 С-порта. Координаты х и у выбираются слу
чайным образом в диапазоне от О до
в диапазоне от О до
а
3-
3,
где О
оранжевый цвет
-
7.
Цвет также выбирается случайным образом
выключенное состояние,
(сочетание
1-
красный,
2-
зеленый,
красного и зеленого). Что интересно, даже при
столь скудном выборе цветов этот дисrmей обеспечивает достаточно привлекатель
ное изображение!
Дополнительные сведения
Более подробную информацию об используемом здесь светодиодном дисrmее с ин
терфейсом
I2c можно найти по адресу https://oreil.ly/yA49j.
15.3. Использование светодиодного
платы Sense НАТ
матричного дисплея
Задача
Вы хотите обеспечить отображение сообщений и графики с помощью дисrmея rmа
ты
Sense НАТ.
Решение
У становите библиотеку для работы с rmатой
в рецепте
10.15, и используйте
Sense
НА Т в порядке, описанном
команды этой библиотеки для отображения текста.
Этот подход реализован в представленной далее программе ch_15_sense_hat_clock.py,
которая выводит значения даты и времени в виде бесконечной бегущей строки:
from sense_hat i.Dport SenseHat
from datetillle iшport datetime
.iшport tiJDe
hat = SenseHat()
time color = (О, 255,
date color = (255, О,
О)
О)
#
#
зеленый
красный
while True:
now = datetime.now()
date_message = '{:%d %В %Y}'.format(now}
time_message = '{:%H:%M:%S}'.format(now)
hat.show_message(date_message, text_colour--date_color)
hat.show_message(time_message, text_colour=time_color)
Дисплеи
453
При желании вы можете скачать этот пример кода в порядке, описанном в ре
цепте
3.22.
Пояснение
Мы определяем здесь два цвета с тем, чтобы значения даты и времени отобража
лись разными цветами. Эти значения цвета затем передаются методу show_message
в качестве опционального параметра text _ colour ( «цвет текста»). У этого метода
есть еще два опциональных параметра:
♦
scrol l _ speed ( «скорость прокручивания»).
На самом деле это не скорость, а величина задержки между отдельными шагами
в процессе прокручивания бегущей строки. Чем выше это значение, тем медлен
нее прокручивается текст;
♦
back_ colour ( «цвет фона»).
Этот параметр позволяет задать цвет фона. Обратите внимание на то, что здесь
используется британский вариант написания слова «цвет» (colour, а не color).
Помимо отображения текста в виде бегущей строки, этот дисплей способен и на
многое другое. Так, в частности, вы можете настраивать отдельные пикселы с по
мощью метода set_pixel, задавать ориентацию изображения с помощью метода
set_rotation и отображать (пусть и очень маленькое) изображение с помощью мето
да load_image. Применение этих методов демонстрирует представленная далее про
грамма ch_ 15_sense_hat_taster.py. При желании вы можете скачать этот пример кода
в порядке, описанном в рецепте
3.22
Размер выводимого на дисплей изображения должен составлять 8х8 пикселов,
однако вы можете использовать любые файлы таких популярных графических
форматов, как
JPG
и
PNG, -
автоматически:
from sense_hat import SenseHat
import time
hat = SenseHat ()
red = (255,
О,
О)
hat. load_ image ( 'small image. png')
time. sleep (1)
hat.set rotation(90)
time.sleep(l)
hat.set rotation(l80)
time. sleep (11
hat.set rotation(270)
time. sleep (1)
размер изображения при этом будет уменьшаться
454
1
Глава
15
hat. clear 1)
hat.set rotation(O)
for ху in range(O, 8):
hat.set_pixel(xy, ху, red)
hat.set_pixel(xy, 7-ху, red)
Пример вывода на дисплей платы
лен на рис.
Sense
НА Т простейшего изображения представ
15.3.
Рис. 15.З. Вывод изображения на дисплей платы
Sense
НАТ
Дополнительные сведения
Более подробную информацию о плате
Sense
НА Т можно найти в ее полной доку
ментации'.
О том, как производится форматирование значений даты и времени, рассказывается
в рецепте
7.2.
Использованию платы
Sense
НА Т также посвящены рецепты
10.15, 14.12, 14.15,
14.16 и 14.18.
15.4. Использование
графического ОLЕD-дисплея
Задача
Вы хотите подключить к устройству Raspberтy
1 См.
https://oreil.ly/f'SiQG.
Pi
графический ОLЕD-дисплей.
Дисплеи
1
455
Решение
I2c
Воспользуйтесь ОLЕD-дисплеем с интерфейсом
(рис.
на базе контроллера SSD 1306
15.4).
8
9
s\ Гn
.. 1 г.
, г:.-.-.~
Рис. 15.4. Подключение ОLЕD-дисnлея с интерфейсом 1 2 С к устройству Raspberry Pi 400
В этом рецепте вам понадобятся :
♦
четыре соединительных провода типа «гнездо-гнездо» (см . разд. «Оборудование
и комплекты для прототипирования» приложения
1);
♦ ОLЕD-дисплей размером 128х64 пиксела с интерфейсом
приложения
Для подключения дисплея к устройству
♦
вывод
♦
вывод
♦
вывод
♦
вывод
VCC
berry Pi;
SCL
«Модули»
Raspberry Pi:
дисплея соедините с выводом
GND
berry Pi;
SDA
berry Pi;
I2c (см.разд.
1).
дисплея
дисплея
дисплея
-
-
с выводом
с выводом
с выводом
3
2
5V
GND
разъема
разъема
разъема
разъема
GPIO
GPIO
GPIO (SDA)
GPIO (SCL)
на устройстве
Rasp-
на устройстве
Rasp-
на устройстве
Rasp-
на устройстве
Raspber-
ry Pi.
Для этого рецепта также нужно активировать на устройстве
I2c.
те
Raspberry Pi
интерфейс
Если вы еще его не активировали, сделайте это в порядке, описанном в рецеп
10.4.
Затем установите созданную компанией
дисплеями:
Adafruit
библиотеку для работы с такими
456
Глава
15
$ cd ~
$ pip3 install adafruit-Ьlinka
$ pip3 install adafruit-circuitpython-ssd1306
Эта библиотека использует библиотеки
PIL (Python Image Library)
и
NumPy,
кото
рые можно установить, выполнив следующие команды:
$
$
sudo apt install python3-pil
sudo apt install python3-nurnpy
Представленная далее
программа
ch_15_oled_clock.py
демонстрирует,
как можно
выводить на OLED-диcrmeй значения даты и времени:
inport Ьoard
from PIL import Image, ImageDraw, ImageFont
import adafruit_ssd1306
from time import sleep
from datetime import datetime
#
Нас'Iраиваем дисплей
i2c = board. I2C ()
disp = adafruit_ssdl306.SSD1306_I2C(128, 64, i2c, addr=0x3C)
small font = ImageFont.truetype('FreeSans.ttf', 12)
large_font = ImageFont.truetype('FreeSans.ttf', 33)
disp. fill (О)
disp. show ()
#
Создаем изображение для вывода с использованием 1-битного цвета
width = disp.width
height = disp.height
image = Image.new ( '1', (width, height))
draw = ImageDraw.Draw(image)
# Отображаем сообщение, используя для первой С'IрОКИ текста крупный
def display_message(top_line, line_2):
draw.rectangle((0,0,width,height), outline=0, fill=0)
draw.text((0, 0), top_line, font=large_font, fill=255)
draw.text((0, 50), line_2, font=small_font, fill=255)
disp.image(image)
disp. show ()
шрифт
while True:
now = datetime.now()
date_message = ' { : %d %В %У) ' . format (now)
time_message = '{:%H:%M:%S)'.foпnat(now)
display_message(time_message, date_message)
sleep(0.1)
При желании вы можете скачать этот пример кода в порядке, описанном в рецеп
те
3.22.
Дисплеи
1
457
Пояснение
В следующей строке мы указываем тот адрес, которым обладает каждое ведомое
I2С-устройство:
disp = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c,
addr=OxЗC)
Хотя дешевые I2С-модули часто используют адрес зс, лучше сверьтесь с докумен
тацией вашего дисплея или определите его адрес, отобразив список подключенных
I2С-устройств с помощью пакета i2c-tools (см.рецепт 1О. 5).
В представленной ранее программе используется метод двойной буферизации. При
этом вся отображаемая информация готовится заранее и сразу же включается в вы
водимое на экран изображение, что позволяет избежать мерцания экрана.
Все это происходит внутри функции display_message. Сначала мы отрисовываем
на изображении image пустой прямоугольник с размером, равным размеру всего
экрана. Затем отрисовываем на изображении image текст и с помощью команды
disp. image (image) задаем изображение image в качестве содержимого экрана дисплея.
Содержимое экрана здесь обновляется лишь после вызова функции disp. show () .
Преимуществом небольших ОLЕD-дисплеев является то, что они дешево стоят, по
требляют мало тока и обладают высоким разрешением, несмотря на свои скромные
размеры. Благодаря этому они всё чаще используются вместо LСD-дисплеев в со
ставе многих массово выпускаемых продуктов.
Дополнительные сведения
Представленные здесь инструкции предполагают использование четырехконтакт
ного интерфейса
I2c.
Если вместо этого вы хотите задействовать интерфейс SPI,
воспользуйтесь соответствующим руководством от компании
Adafruit2.
15.5. Использование адресуемой светодиодной ленты
из RGВ-светодиодов
Задача
Вы хотите подключить к
серии
Raspberry Pi
светодиодную ленту из RGВ-светодиодов
NeoPixel.
Решение
Воспользуйтесь лентой из RGВ-светодиодов с кшпроллером
WS2812.
Светодиодную ленту часто можно подключить к устройству
мую, запитав светодиоды от контакта
2
См. https://oreil.ly/EzEeu.
5V разъема GPIO (рис.
Raspberry Pi
15.5).
напря
Глава
458
15
Рис.
15.5.
Подключение к
Raspberry Pi
ленты из
1О
светодиодов
Хотя во многих случаях будет работать и такой простейший подход, во избежание
каких-либо проблем все же будет лучше запитать светодиоды от внешнего источ
ника питания, как предлагается в разд. «Пояснение».
• ••••••• •• •
Не запитывайте такие светодиоды
от линии питания с напряжением
3,3
В
Если вам кажется заманчивой идея эапитать эти светодиоды от вывода питания
разъема
стоит,
GPIO
потому
(см. рецепт
с напряжением
что
10.3).
этот
1О
15 .5
В, то должен вам сообщить, что так делать не
может
выдавать
только
достаточно
малые
токи
Запитывание светодиодов от этого вывода может привести
к повреждению устройства
В показанном на рис.
3,3
вывод
Raspberry Pi.
случае от рулона был отрезан кусок ленты, содержащий
светодиодов. Поскольку каждый светодиод может потреблять до
питывании светодиодов непосредственно от устройства
Raspberry Pi
60
мА, при за
вряд ли стоит
использовать более длинную ленту.
Для подключения к
Raspberry Pi
концы соединительных проводов нужно обрезать
с одной стороны и припаять к трем контактам на светодиодной ленте:
ля»),
Din (data in,
вход данных) и
5V
(см. рецепт
10.3).
провода надо подсоединить соответственно к контактам
устройстве
GND ( «зем
После этого припаянные
GND, GPIO 18
и
5V
на
Raspberry Pi.
Обратите внимание на то, что на светодиодной ленте напечатаны направленные
вправо стрелки (рис.
15 .6),
и припаивать провода нужно с того края ленты, который
находится слева от этих стрелок.
Для управления адресуемой светодиодной лентой мы воспользуемся программным
обеспечением
команд:
от
компании
Adafruit.
У становите
его
с
помощью
следующих
Дисплеи
Рис .
$ рiрЗ
$ sudo
15.6.
459
Светодиодная лента крупным планом
instal l adafruit - Ьlinka
install rpi_ws28lx adafruit - circuitpython- ne opixe l
рiрЗ
В качестве примера представленная далее программа ch_ 15_neopixel.py заставляет
светодиоды ленты поочередно загораться красным цветом:
import time
impor t board
from neop i xel import NeoPixe l
led count = 5
red = (100 , О,
no_color = (О ,
О)
О,
О)
strip = NeoPixel (board.D18, led_count , auto write=False )
def clear( I :
for i in range (0 , led_count ) :
no col or
s trip[i]
strip . show ()
i =о
whil e Tr ue:
clear (1
str i p[1] = red
strip . show (1
time . sleep (11
i += 1
if i >= led count :
1 = 0
При желании вы можете скачать этот пример кода в поряд ке , описанном в рецеп
те
3.22.
Запустите эту программу , испол ьзуя команду sudo и 3-ю вер с ию языка
$ sudo
pythonЗ
Python :
ch_l5_neopixel.py
Если ваша лента содержит другое количе ство светодиодов , соответствующим обра
зом измените переменную
l ed _count.
Все остальные переменные следу ет оставить
без изменений .
Для работы со светодиодами серии
1О , 12, 18
и
21
разъема
GPIO
NeoPixel
можно испол ьзовать только контакты
(как можно видеть , в приведенной программе задейст-
460
Глава
15
во ван контакт
board. D18 ). Если вы хотите вместо него использовать какой-либо
18 -
другой контакт разъема
GPIO
значение вместо значения
из состава разрешенных, укажите соответствующее
board. D18.
Цвет каждого светодиода можно задавать независимым образом, используя для
этого кортеж из значений интенсивности красной, зеленой и синей составляющей
цвета. Чтобы изменить цвет светодиода, расположенного в той или иной позиции,
необходимо присвоить нужный вам цвет соответствующему элементу массива
strip. Например: strip [ i] = red.
Внесенные таким образом изменения в действительности применяются только
после вызова метода
show.
Пояснение
При использовании максимального уровня яркости
вых каналов светодиоды ленты могут потреблять до
(255) в
60 мА
каждом из трех цвето
тока. Если вы собирае
тесь использовать ленту с большим количеством светодиодов, вам потребуется
достаточно мощный отдельный источник питания с напряжением
ключения такого внешнего источника питания показана на рис.
5 В. Схема под
15. 7. Чтобы упро
стить подключение внешнего источника питания к макетной плате, мы применили
здесь переходник с гнезда на винтовые зажимы
плекты для прототипирования» приложения
Рис.
15.7.
( см.
разд. «Оборудование и ком
1).
Запитывание светодиодной ленты от внешнего источника питания
Дополнительные сведения
В продаже также имеются кольца из светодиодов серии
По адресу
https://oreil.ly/-oA90 можно ознакомиться с руководством
NeoPixel, составленным компанией Adafruit.
светодиодами серии
3
NeoPixeP.
См. https://oгeil.ly/alpКВ.
по работе со
Дисплеи
1 461
15.6. Использование платы Pimoroni Unicorn НАТ
Задача
Вы хотите подключить к Raspberтy
Pi
светодиодный матричный дисплей из RGВ
светодиодов.
Решение
Воспользуйтесь платой
ную матрицу размером
Рис.
15.8.
Устройство
Pimoroni Unicom
8х8 (рис. 15.8).
Raspberry Pi
НА Т, представляющей собой светодиод
З с установленной на нем платой
Сначала установите предлагаемое компанией
для платы
$
Unicom
Pimoroni
Pimoroni Unicorn
НАТ
программное обеспечение
НА Т:
curl https://get.pimoroni.com/unicornhat I bash
Вам потребуется несколько раз подтвердить установку различных программных
компонентов
Raspberтy
и
в
завершение
процесса
произвести
перезагрузку
устройства
Pi.
У становив требуемое программное обеспечение, опробуйте подключенную матри
цу в деле с помощью представленной далее программы ch_15_unicorn .py, которая
с заданной частотой меняет цвет случайно выбранного пиксела на случайно вы
бранный другой цвет. Запускать эту программу следует с использованием команды
sudo:
iпport
time
import unicornhat as unicorn
from random import randint
462
1
Глава
15
unicorn.set_layout(unicorn.AUTO)
unicorn.rotation(0)
unicorn.brightness(l)
width, height = unicorn.get_shape()
while True:
х = randint(0, width)
у= randint(0, height)
r, g, Ь = (randint(0, 255), randint(0, 255), randint(0, 255))
unicorn.set_pixel(x, у, r, g, Ь)
unicorn. show ()
time. sleep (О. 01)
time. sleep (1)
При желании вы можете скачать этот пример кода в порядке, описанном в рецеп
те
3.22
Пояснение
Использование платы
Unicom
НА Т представляет собой очень удобный способ под
ключения матрицы из адресуемых светодиодов. В продаже также имеются модули
с другой конфигурацией адресуемых светодиодов, включая матрицы с еще боль
шим количеством пикселов. С точки зрения электротехники такие матрицы обычно
представляют собой в действительности просто длинную цепочку из светодиодов.
Дополнительные сведения
Более подробно о работе с адресуемыми светодиодами (серии
вается в рецепте
NeoPixel)
рассказы
15.5.
15.7. Использование дисплея
на основе «электронной бумаги»
Задача
Вы хотите обеспечить управление дисплеем на основе «электронной бумаги» с по
мощью устройства
Raspberry Pi.
Решение
Подключите к
Raspberry Pi
модуль
Затем установите предлагаемое
lnky рНАТ (рис. 15.9) или Inky wHAT.
компанией Pimoroni программное обеспечение
этого модуля:
$ curl https://get.pimoroni.com/inkyphat I bash
для
Дисплеи
Рис.
16.9.
Устройство
Raspberry Pi
З с установленным на нем модулем
Pimoroni lnky
463
рНАТ
Если в ходе установки вы ответите согласием на предложение скачать примеры
и документацию, этот процесс может немного затянуться.
В качестве примера представленная далее программа ch_ 15_phat.py демонстрирует,
как на дисплее
lnky рНА Т можно отобразить IР-адрес устройства Raspberry Pi:
trom inky import InkyPНAT
trom PIL iq)ort Image, Image Font , Jma geDr aw
trom tont_trecloka_one import Fredo kaOne
import 1uЬproce11
inky _disp l ay ; InkyPHAT 1" re d " 1
inky_di spl ay.set _bor der (i nky _dis pJa y . WH JTEJ
img ; Image , new ( "P",
(i nky_tlispla y.W !DTH, inky_displa y.H EI GHT J 1
draw; Image Dr aw. Draw (img l
font ; ImageFont . t rue t ype ( Fгecl o k a011 e , 221
message;
str ( subpro c ess. ch e c k _ outpu t ([ ' host n a rпe ',
print (message )
w, h ; font.getsize (messa ge )
х;
(inky_display.WIDTH / 21 - (w / !I
у;
(inky_display . HEIGHT / 21 - (h / 21
draw.text (( x,
у) ,
message , in ky_dis p la y. RElJ, t o11LJ
inky_display.set_image (i mg J
inky_d i sp lay.show ()
' -I ' ] ll .sp l i t l) [ 0][ 2: ]
464
Глава
1
15
При желании вы можете скачать этот пример кода в порядке, описанном в рецеп
те
3.22.
Для определения IР-адреса, присвоенного устройству RаsрЬеггу
ме используется библиотека suЬprocess (см.рецепт
Pi,
в этой програм
7.15).
Пояснение
Такой дисплей нельзя использовать для видеоигр, потому что обновление изобра
жения на «электронной бумаге» может занимать несколько секунд, но, с другой
стороны, выведенное изображение будет отображаться даже при отключении пита
ния. Наряду с небольшими дисплеями вроде используемой здесь модели
рНА Т,
компания
Pimoroni
бумажных» дисплеев, сравнимые по размеру с устройством RаsрЬеггу
модель
Inky
производит и более крупные модели «электронно
Pi
(например,
Inky wНАТ).
Дополнительные сведения
Более подробную информацию можно найти в полной документации по модулю
Inky
4
рНАТ4.
См. https://oгeil.ly/-гP4D.
ГЛАВА
16
Звук
16.0. Введение
В этой ,·лаве мы поговорим об реализации звуковых возможностей устройства
Raspberry Pi.
Они включают как различные способы воспроизведения звука
с использованием акустической системы или зуммера, так и запись звука с помо
щью микрофона.
16.1. Подключение акустической
системы
Задача
Вы хотите обеспечить воспроизведение звука на устройстве
Raspberry Pi.
Решение
Подключите активную акустическую систему к разъему для аудио/видео, как пока
зано на рис.
16.1 .
Затем измените настройки устройства
звукового
выхода
(см. рецепт
Рис.
16.1.
использовался
Raspberry Pi
разъем для
таким образом, чтобы в качестве
аудио/видео,
а
не
разъем
HDMI
16.2).
Подключение к
Raspberry Pi
активной акустической системы со встроенным аккумулятором
466
Глава
16
Вместо универсальной акустической системы, показанной на рис.
16.1, можно
Raspber-
использовать и акустическую систему, специально предназначенную для
ry Pi, -
например, комплект акустической системы для
MonkМakes, показанный на рис.
Рис.
18.2.
Raspberry Pi
от компании
16.2.
Подключение активной акустической системы для
Эта акустическая система подсоединяется к
Raspberry Pi
Raspberry Pi
от компании
MonkMakes
с помощью входящего
в комплект ее поставки звукового кабеля и запитывается от 5-вольтовой линии
питания устройства
Raspberry Pi
двумя проводами типа «гнездо-гнездо».
В состав операционной системы
Raspberry Pi OS
входит и удобная утилита для
проверки работоспособности акустической системы. Введите в окне терминала
следующую команду:
$
1pelker-t81t -t wav
speaker-test
-о
2
1.1.З
Playback device is default
Stream parameters are 48000Hz, Slб_LE, 2 channels
WAV file(s)
Rate set to 48000Hz (requested 48000Hz)
Buffer size range from 256 to 32768
Period size range from 256 to 32768
Using max buffer size 32768
Periods = 4
was set period_size ~ 8192
was set buffer size = 32768
О - Front Left
1 - Front Right
Time per period = 2.411811
О - Front Left
1 - Front Right
ГЛАВА
16
Звук
16.0. Введение
В этой ~·лаве мы поговорим об реализации звуковых возможностей устройства
Raspberry Pi.
Они включают как различные способы воспроизведения звука
-
с использованием акустической системы или зуммера, так и запись звука с помо
щью микрофона .
16.1. Подключение акустической
системы
Задача
Вы хотите обеспечить воспроизведение звука на устройстве
Raspberry Pi.
Решение
Подключите активную акустическую систему к разъему для аудио/ видео, как пока
зано на рис.
16.1 .
Затем измените настройки устройства
звукового
выхода
(см. рецепт
Рис.
16.1.
использовался
Raspberry Pi
разъем для
таким образом, чтобы в качестве
аудио/видео,
а
не
разъем
HDMI
16.2) .
Подключение к
Raspberry Pi
активной акустической системы со встроенным аккумулятором
468
1
Глава
16
Вариант Comiso М20
Bluetooth, которая уже
цепт
здесь соответствует акустической системе с интерфейсом
была ранее подключена к устройству
Raspberry Pi
(см. ре
1.17).
Пояснение
Если устройство
выходного
Raspberry Pi
аудиоустройства
используется в бездисплейном режиме, то для выбора
следует
задействовать
консольную
утилиту
raspi-
conf ig.
Оrкройте окно терминала и выполните команду:
$ sudo raspi-config
В открывшемся меню выберите пункт
тем
-
пункт
Audio.
System Options
(Параметры системы), а за
После этого вам останется только выбрать нужный вариант
вывода звука, как показано на рис.
16.4.
Choose the audio output
0 Auto
1 Force 3.5mm ('headphone') jack
2 Force HDМI
<Cancel>
Рис.
16.4.
Выбор выходного аудиоустройства с помощью утилиты
raspi-config
Дополнительные сведения
Процесс подключения акустической системы к
цепте
Raspberry Pi
рассматривается в ре
16.1.
16.3. Воспроизведение звука
на устройстве
Raspberry Pi,
не имеющем аудиоразъема
Задача
Вы хотите обеспечить высококачественное воспроизведение звука на устройстве
Raspberry Pi, не имеющем
или Raspberry Pi 400.
аудиоразъема,
-
например, на модели
Raspberry Pi Zero
Звук
1
469
Решение
GPIO плату звукового цифроаналогового
Pimoroni Audio DAC SHIM , как показано на рис . 16.5, после чего
Подсоедините к разъему
преобразователя
подключите ли
нейный выход этой платы к звуковому усилителю. При использовании модели
вам также потребуется переходник для разъема
Raspberry Pi 400
GPIO,
упрощаю
щий доступ к контактам этого разъема .
Рис.
16.5.
Подключение платы
Введенный компанией
ему
GPIO
Pimoroni
Audio DAC SHIM
формат плат
к устройству
SHIM
Raspberry Pi 400
позволяет подключать к разъ
небольшие платы расширения без использования пайки или контактных
гнезд. Такая плата просто плотно насаживается на штырьки разъема
GPIO
и немно
го подпружинивается для обеспечения хорошего контакта с ними .
Чтобы устройство
Raspberry Pi
установить соответствующее
могло распознать плату
программное
обеспечение
Audio DAC,
необходимо
от компании
Pimoroni,
выполнив следующие команды:
$ cd $ git c l one https: //g ithub .com/pimoroni/pirate- audio
$ cd pirate-audio/mopidy
$ sudo ./install.sh
По завершении процесса установки перезапустите устройство
Raspberry Pi
и щелк
ните правой кнопкой мыши на значке аудиоустройств в верхнем правом углу эк
рана.
Вы увидите, что меню для
по-другому (рис.
Рис.
выбора звуковых устройств стало выглядеть
16.6).
16.6.
Выбор платы
Audio DAC SHIM
в качестве выходного устройства
470
1
Глава
16
Пояснение
Хотя выходной разъем платы
Audio DAC SHIM
выглядит как обычный разъем для
подключения наушников, к нему не следует подключать наушники напрямую. Этот
разъем позволяет подключать только снабженную усилителем аппаратуру класса
Hi-Fi
и обладает недостаточной мощностью для прямого подключения наушников.
Более традиционный способ наделения устройства
Raspberry Pi
дополнительным
звуковым интерфейсом сводится к подключению звуковой карты с разъемом
Если в описании такой карты указано, что она совместима с
нормально работать и совместно с устройством
Linux,
USB.
то она должна
Raspberry Pi.
Дополнительные сведения
Помимо настройки устройства
Raspberry Pi
для использования платы
Audio DAC,
Mopidy1,
установочный скрипт в этом рецепте также устанавливает проигрыватель
созданный на базе проигрывателя
MPD (Music Player Daemon).
16.4. Воспроизведение звука
из командной строки
Задача
Вы
хотите обеспечить
на устройстве
Raspberry Pi
воспроизведение звука из
командной строки.
Решение
Используйте из командной строки предустановленный проигрыватель
YLC.
Чтобы
опробовать эту программу в деле, найдите в каталоге с примерами кода для этой
книги каталог python и внутри него
-
файл school_bell.mpЗ. Запустите воспроизведе
ние этого файла с помощью следующей команды
здесь используется именно команда
$ cvlc
cvlc,
а не
(обратите
внимание на то, что
vlc):
~/raspberrypi_cookЬook_ed4/python/school_bell.mp3
Эта команда запускает воспроизведение звукового файла с использованием теку
щего выходного аудиоустройства.
Пояснение
Проигрыватель
YLC
позволяет воспроизводить большинство распространенных
типов звуковых файлов, включая файлы форматов МРЗ,
WА У, AIFF, ААС и OGG.
WА У-файлы, для этого
Однако если вам нужно воспроизводить только несжатые
можно использовать более легковесный проигрыватель aplay:
$
aplay
1 См.
~/raspberrypi_cookЬook_ed4/python/school_bell.mp3
https://oreil.ly/j 1РО8.
Звук
1
471
Дополнительные сведения
Проигрыватель
VLC
также используется в рецепте
Описание проигрывателя
4. 9.
aplay можно найти по адресу https://oreil.ly/Fbs94.
из Python-кoдa
16.5. Воспроизведение звука
Задача
Вы хотите обеспечить воспроизведение звукового файла из Руthоn-программы.
Решение
Для воспроизведения звука из Руthоn-программы можно использовать Руthоn
библиотеку
suЬprocess,
как
показано
в
следующем
кода
примере
(ch_ 16_play_
sound.py):
import
suЬprocess
sound_file
=
'school_bell.mpЗ'
suЬprocess.run(['cvlc',
sound_file])
При желании вы можете скачать этот пример кода в порядке, описанном в рецеп
те
3.22.
Пояснение
Для воспроизведения звука также можно использовать библиотеку
pygame, как пока
зано в следующем примере кода (ch_16_play_sound_pygame.py):
import pygame
sound_file =
'/home/pi/raspberrypi_cookЬook_ed4/python/school_bell.wav'
pygame .mixer. ini t ()
pygame.mixer.music.load(sound_file)
pygame .mixer .music .play ()
while pygame.mixer.music.get_busy()
continue
==
True:
Таким образом можно воспроизводить либо ОGG-файлы, либо несжатые
WА V-
файлы. Как выяснилось, выводить звук при этом удается только в канал НDMI.
Дополнительные сведения
Воспроизведению звука из командной строки посвящен рецепт
Библиотеку pygame также можно использовать для
(см.рецепт
13.11)
и движений мыши (см.рецепт
16.4.
перехвата нажатий клавиш
13.12).
472
Глава
1
16
16.6. Использование
USВ-микрофона
Задача
Вы хотите подключить к
Raspberry Pi
микрофон, чтобы улавливать звук с его по
мощью.
Решение
Используйте либо такой USВ-микрофон, какой показан на рис.
16.7,
либо микро
фон веб-камеры, либо что-то более солидное, обеспечивающее более высокий уро
вень качества.
Рис.
16.7.
Подключение USВ-микрофона к устройству
Raspberry Pi
Микрофоны с интерфейсом
USB отличаются большим разнообразием форм и раз
меров. Помимо компактного микрофона, вставляемого непосредственно в разъем
USB, вы можете использовать здесь и микрофон, снабженный USВ-кабелем или
входящий в состав USВ-гарнитуры.
Подключив USВ-микрофон, убедитесь в том, что операционная система
Pi OS
Raspberry
сумела его распознать . Для этого выполните следующую команду, которая
выводит список доступных входных аудиоустройств:
$ arecord -1
**** List of CAPT!JRE Hardware Devices ****
card 1: Н340 [Logitech USB Headset Н340], device
SuЬdevices: 1/1
SuЬdevice #0: suЬdevice #0
О:
USB Audio [USB Audio]
Как можно видеть, сейчас я использую микрофон, входящий в состав USВ-rар
нитуры от компании
Logitech.
Как показывает представленный здесь вывод коман
ды, этому устройству был присвоен номер карты
1 (card 1)
и номер подустройства О
(suЬdevice о). Мы воспользуемся этой информацией, когда приступим к записи зву
ков.
Звук
473
1
Чтобы активировать подключенный микрофон, щелкните правой кнопкой мыши на
значке в виде динамика в верхнем правом углу экрана и выберите название своего
USВ-микрофона в списке
Audio lnputs
(Аудиовходы), как показано на рис.
16.8.
В приведенном примере показан выбор микрофона, встроенного в веб-камеру с ин
терфейсом
USB.
./
Рис.
16.8.
НО
Pro WeЬcam С920
Выбор микрофона в качестве входного аудиоустройства
Теперь попробуйте записать звук из командной строки и затем его воспроизвести.
Это можно сделать с помощью команды:
$ arecord -d
З
test.wav
Параметр -d здесь задает длительность записываемого файла в секундах. Чтобы
воспроизвести только что записанный звуковой файл, выполните команду:
$ aplay test.wav
Playing WAVE 'test.wav' : Unsigned 8 bit, Rate 8000 Hz, Mono
Прервать воспроизведение звука при этом можно с помощью комбинации клавиш
<Ctrl>+<C>.
Пояснение
Вставляя в разъем устройства
показанного на рис.
16.7),
Raspberry Pi
разные компактные микрофоны (типа
я получил противоречивые результаты. Некоторые мик
рофоны такого типа успешно работали, а некоторые
-
нет. Поэтому, если ваш
микрофон отказывается работать, несмотря на то, что вы точно следовали приве
денным здесь инструкциям, просто попробуйте использовать другой микрофон.
Меняя опциональные параметры команды arecord, вы можете указать, с какой час
тотой дискретизации и в каком формате следует записывать звук. Так, например,
чтобы записывать звук с частотой дискретизации
16000
Гц, а не
8000
Гц, как это
делается по умолчанию, введите следующую команду:
$ arecord -r 16000 -d
З
test.wav
Проигрыватель aplay автоматически определяет, с какой частотой дискретизации
был записан файл, поэтому при его воспроизведении достаточно указать только
имя файла:
$ aplay test.wav
Playing WAVE 'test. wav'
Ur1signed 8 bit, Rate 16000 Hz, Mono
474
1
Глава
16
Дополнительные сведения
О том, как можно подключить к
ся в рецепте
Другие
тах
Raspberry Pi
акустическую систему, рассказывает
16.1.
способы
воспроизведения
звукового
файла
рассматриваются
в рецеп
16.4 и 16.5.
16.7. Генерирование зуммерного сигнала
Задача
Вы хотите с помощью устройства
Raspberry Pi
сгенерировать зуммерный сигнал.
Решение
Используйте
пьезоэлектрический
зуммер,
подключенный
к
контактам
разъема
GPIO.
Подключая совсем небольшой пьезоэлектрического зуммер, можно использовать
схему, показанную на рис.
Рис.
16.9.
16.9.
Подключение пьезоэлектрического зуммера к устройству RаsрЬеггу
Pi
В ней я задействовал зуммер от компании
Adafruit (см. разд. «Прочее» приложе
1). Контакты зуммера при этом напрямую подключаются к контактам устрой
ства Raspberry Pi с помощью соединительных проводов типа «гнездо-гнездо»
(см.разд. «Оборудование и комплекты для прототипирования» приложения 1).
ния
Такие зуммеры потребляют очень мало тока. Но если вы решили использовать
более крупный зуммер или просто хотите перестраховаться, поместите между кон
тактом зуммера и контактом разъема
GPIO
резистор с сопротивлением
4 70 Ом.
Звук
Откройте редактор и вставьте следующий код
1
475
(ch_16_buzzer.py):
from gpiozero import Buzzer
buzzer = Buzzer(18)
def buzz(pitch, duration):
period = 1.0 / pitch
delay = period / 2
cycles = int(duration * pitch)
buzzer.beep(on_time=period, off_time=period, n=int(cycles/2))
while True:
pitch_s = input("Enter Pitch (200 to 2000): "1
pitch = float(pitch_s)
duration_s = input("Enter Duration (seconds): ")
duration = float(duration s)
buzz(pitch, duration)
При желании вы можете скачать этот пример кода в порядке, описанном в рецеп
те
3.22.
Когда вы запустите эту программу, она сначала попросит вас указать высоту тона
в герцах и длительность сигнала в секундах:
$
pythonЗ ch_lб_buzzer.py
Enter Pitch (200 to 10000): 2000
Enter Duration (seconds): 20
Пояснение
Хотя пьезоэлектрические зуммеры не могут похвастаться ни широким диапазоном
частот, ни хорошим качеством звука, они все же допускают некоторое варьирова
ние высоты тона. Поскольку код генерирует частоту не очень точно, высота тона
может немного колебаться.
Используя класс вuzzer из библиотеки gpiozero, приведенная здесь программа перио
дически включает и выключает 18-й контакт разъема
GPIO,
делая в промежутке
небольшую задержку. Величина задержки (ctelay) рассчитывается на основе указан
ной высоты тона
(pitch). Чем выше высота тона (частота), тем короче должна быть
задержка.
Дополнительные сведения
Ознакомиться со спецификацией используемого здесь пьезоэлектрического зум
мера можно по адресу
https://oreil.ly/pxeAm.
Применение более совершенных разновидностей выходных аудиоустройств рас
сматривается в рецепте
16.1.
ГЛАВА
17
Интернет вещей
17.0.
Введение
«Интернет вещей»
(Internet of Things, loT) -
это быстро растущая сеть из уст
ройств («вещей»), подключенных к Интернету. Причем под Интернетом вещей
имеется в виду не все увеличивающееся множество компьютеров с браузерами, а
несущая какую-либо функцию техника и носимые и портативные технологии. Ин
тернет вещей включает в себя различные виды домашней автоматизации, начиная
с умных устройств и систем управления освещением и заканчивая охранными сис
темами и даже кормушками для животных с управлением по Интернету, вкупе со
множеством не очень практически полезных, но весьма увлекательных проектов.
В этой главе мы поговорим о том, как устройство
Raspberry Pi
можно использовать
для участия в управлении Интернетом вещей.
17.1. Управление
выходами
GPIO
с помощью веб-интерфейса
Задача
Вы хотите управлять выходами
Raspberry Pi
разъема
GPIO,
взаимодействуя с устройством
посредством веб-интерфейса.
Решение
Используя Руthоn-библиотеку для создания веб-сервера bottle (см. рецепт
создайте на базе НТМL-кода веб-интерфейс для управления портом
7.17),
GPIO.
В этом рецепте вам понадобятся:
♦
макетная плата и соединительные провода (см. разд. «Оборудование и комплек
ты для прототипирования» приложения
♦ три резистора с сопротивлением
приложения
1 кОм
1);
(см. разд. «Резисторы и конденсаторы»
1);
♦
три светодиода (см. разд. «Оптоэлектроника» приложения
♦
кнопка (см.разд. «Прочее» приложения
1);
1).
Схема подключения компонентов на макетной плате показана на рис.
17.1 .
Интернет вещей
Рис.
1 4 77
17.1. Схема подключений на макетной плате для управления выходами GPIO
с помощью веб-страницы
JUJary, можно воспользоваться «ось
Squid Button (см. рецепты 10.1 О
и 10.11). Эти модули вы можете подсоединить непосредственно к разъему GPIO
устройства Raspberry Pi, как показано на рис. 17 .2.
Вместо того, чтобы задействовать макетную
миножнымю> модулями
Raspberry Squid
или
У становите библиотеку bottle в порядке, описанном в рецепте
7.17.
Затем откройте редактор и вставьте следующий код (ch_17_web_control.py):
from Ьottle iиport route, run
from gpiozero iJllport LED, Button
leds = [LED(l8), LED(23), LED(24)]
switch = Button(25)
def switch_status():
if switch.is_pressed:
return 'Down'
else:
return 'Up'
def
html_for_led(led_numЬer):
i = str(led_numЬer)
result = "<input type='button'
onClick='changed(" + i + ")' value='LED" + i
+ "' />"
return result
478
Глава
17
@route ( ' / ' )
@route ( '/ <led_numЬer>' )
clef index(led numЬer="n"):
if led numЬer != "n":
. toggle ()
= "<script>"
+= "function changed(led) "
+= "("
+=" window.location.href='/' + led"
+= "}"
+= "</script>"
leds[int(led_numЬer )]
response
response
response
response
response
response
response += '<hl>GPIO Control</hl> '
response += '<h2>Button=' + switch_status () + '</h2>'
response += '<h2>LEDs< / h2>'
response += html_for_led(0)
response += html for _ led (1)
response += html _ for _ led 12)
return response
run (host='0 .0.0.0 ', port=80)
Рис.
17.2.
Модули
Raspberry Squid
и
Squid Button
Интернет вещей
1
479
При желании вы можете скачать этот пример кода в порядке, описанном в рецеп
те
3.22.
Запустите программу с правами суперпользователя:
$
sudo
pythonЗ ch_17_weЬ_control.py
В случае успешного запуска вы увидите сообщение следующего вида:
Bottle server starting up (using WSGIRefServer() 1 ...
Listening on http://0.0.0.0:80/
Hit Ctrl-C to quit.
Если появятся сообщения об ошибках, проверьте, используете ли вы при запуске
команду
sudo.
Откройте браузер на любом из компьютеров, подключенных к вашей сети (можно
это сделать даже на самом устройстве
Raspberry Pi),
ройства
На экране должен появиться веб-интерфейс,
Raspberry Pi (см. рецепт 2.2).
показанный на рис. 17 .3.
• n
+
~
n
D 192.168.1,8/О
➔ С d
х \\.
и перейдите по IР-адресу уст
••
* 1=
-"t.
I D 192.168.1.8/0
GPIO Control
Button-Up
LEDs
[ LШО ) ( LED
1] [ LШ2 ]
Рис. 17.З. Веб-интерфейс для разъема
GPIO
Попробуйте пощелкать мышью на какой-либо из расположенных внизу трех кно
пок для управления светодиодами. Вы должны увидеть, что при этом загорается и
гаснет соответствующий светодиод.
Кроме того, если вы попробуете перезагрузить страницу, удерживая одну из кнопок
в нажатом состоянии, то рядом со словом
(Нажата), а не слово
Up
Button
(Кнопка) появится слово
Down
(Не нажата).
Пояснение
Чтобы понять, как работает эта программа, сначала необходимо вспомнить, как
работает веб-интерфейс. Работа любого веб-интерфейса основана на том, что рас
положенный в сети сервер (роль которого в нашем случае выполняет программа на
устройстве
Raspberry Pi) отвечает
на поступающие от веб-браузера запросы.
При поступлении запроса сервер производит поиск запрашиваемой информации и
генерирует ответ в виде НТМL-кода.
480
Глава
17
Если мы запросим корневую страницу (в нашем случае это страница с адресом
http:// 192. \ 68. l .8/),
параметру led_numЬer будет по умолчанию присвоено значение n.
Но если мы захотим перейти по адресу
http://192.168. l .8/2,
параметру led numЬer
будет присвоено значение 2, стоящее в конце URL-aдpeca.
После этого на основе значения параметра led_numЬer можно определить, что мы
должны переключить в другое состояние светодиод
2.
Чтобы пользователь мог переходить по URL-aдpecy, вызывающему переключение
светодиода
2,
мы должны организовать всё так, чтобы по щелчку на соответствую
щей кнопке производилась перезагрузка страницы с добавлением дополнительного
параметра в конце URL-aдpeca. Это реализовано здесь путем включения в возвра
щаемый браузеру НТМL-код JаvаSсriрt-функции. Когда браузер запускает эту
функцию, она производит перезагрузку страницы с использованием соответствую
щего дополнительного параметра.
Таким образом, мы используем здесь достаточно хитроумный подход, при котором
Python-пporpaммa генерирует JavaScript-кoд, который впоследствии выполняется
браузером. Этот код генерируется в следующих строках:
response
response
response
response
response
response
= "<script>"
+= "function changed(led)"
+= "{"
+= " window.location.href='/' + led"
+= "}''
+= "</script>"
Нам также нужно генерировать НТМL-код, который будет вызывать этот скрипт
при выполнении щелчка на кнопке. Вместо того, чтобы повторять один и тот же
НТМL-код для каждой кнопки, мы генерируем его с помощью функции html
for led:
def html for led(led):
i = str(led)
result = " <input type='button' onClick='changed(" + i + ")'
value ='LED" + i + "'/>"
return resultи
Этот код мы используем три раза (по одному разу для каждой кнопки), чтобы свя
зать щелчок на кнопке с функцией changed. При этом мы также передаем этой функ
ции в качестве параметра номер светодиода.
В итоге процесс, отслеживающий состояние кнопок, проверяет, не нажата ли кноп
ка, и генерирует соответствующий НТМL-код.
Дополнительные сведения
Более подробные инструкции по использованию библиотеки bottle можно найти
в соответствующей документации 1 •
1
См. https://oгeil.ly/гWbjU.
Интернет вещей
17.2. Отображение
1
481
показаний датчиков на веб-странице
Задача
Вы хотите, чтобы полученные на устройстве
Raspberry Pi
показания датчиков ото
бражались на автоматически обновляемой веб-странице.
Решение
веб-сервер
Используйте
bottle
в
сочетании
с
JavaScript-кoдoм ,
автоматически
обновляющим отображаемый контент .
На рис.
представлен пример реализации такого подхода для отображения тем
17.4
пературы
процессора,
измеряемой
с
помощью
встроенного датчика устройства
Raspberry Pi .
CPU Temp
'С
10
Рис .
17.4.
60
Отображение температуры процессора устройства
Raspberry Pi
У становите библиотеку bot tle в порядке. описанном в рецепте
7.17.
В этом примере используются четыре файла , которые вы можете найти в каталоге
ch _ 17_ web_ sensor:
♦
web_sensor.py
Python-кoд, обеспечивающий взаимодействие с сервером bott l e.
♦
main.html
Отображаемая в браузере веб-страница.
♦
justgage.1 .0.1 .min.js
Сторонняя JаvаSсriрt-библиотека, которая отображает индикатор температуры.
♦
raphael.2.1 .0.min.js
Библиотека, используемая библиотекой justgage.
482
Глава
17
Перейдите в каталог
ch_17_web_sensor
и запустите Python-пporpaммy с помощью
следующей команды:
$ sudo
pythonЗ w.Ь_sensor.py
При желании вы можете скачать файлы этого рецепта в порядке, описанном в ре
цепте
3.22.
Теперь откройте браузер на любом из компьютеров, подключенных к вашей сети
(можно это сделать на самом устройстве Raspberтy
IР-адрес устройства Raspberтy
ная на рис.
Pi.
Pi),
и введите в адресной строке
На экране должна появиться страница, показан
17.4.
Пояснение
Основная программа этого примера
(web_sensor.py)
содержит не так уж много кода:
inport os, time
from bottle import route, run, template
def cpu_temp():
cpu_temp = CPUTemperature()
return str(cpu_temp.temperature)
@route (' /temp')
def temp ():
return cpu_ temp ()
@route ( '/' )
def index () :
return template ( 'main. html')
@route ( '/raphael')
def index():
return template ( 'raphael. 2 .1. О .min. j s')
@route ( '/ justgage' )
def index () :
return template ( 'justgage .1. О. l .min. j s')
run(host='0.0.0.0', port=80)
Внутри функции cpu_temp мы считываем значение температуры процессора устрой
ства Raspberтy
Pi,
как уже делалось в рецепте
14.11.
Далее определяются четыре маршрута для веб-сервера bottle. Первый маршрут
(/temp) возвращает строку со значением температуры процессора в градусах Цель
сия.
Корневой
маршрут
(/)
возвращает
основной
НТМL-шаблон
страницы
(main.html). Остальные два шаблона предоставляют доступ к копиям JаvаSсriрt
библиотек raphael и justgage.
Интернет вещей
Файл
main.html
483
главным образом содержит JavaScript-кoд, отображающий содержи
мое страницы:
<ht:ml>
<head>
<acript src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"
type="text/javascript" charset="utf-8"></acript>
<acript src="raphael"></acript>
<acript src="justgage"></script>
<acript>
callback(tempStr, status) {
if (status == "success") {
temp = parseFloat(tempStr) .toFixed(2);
g. refresh (temp);
setTimeout(getReading, 1000);
fшiction
else {
alert ("There was
fшiction
а proЫem")
;
getReading() {
$. get ( '/temp', callback);
</script>
</head>
<Ьоdу>
<div id="gauge" class="200x160px"></div>
<script>
var g = new JustGage({
id: "gauge",
value: О,
min: 10,
max: 60,
title: "CPU Temp 'С"
}) ;
getReading();
</script>
</Ьоdу>
</ht:ml>
Мы импортируем здесь библиотеки jquery, raphael и justgage (библиотеку jquery- из
сети, а другие две библиотеки
-
из локальной копии).
Глава
484
17
Полученное на устройстве
значение температуры передается в окно
Raspbeny Pi
браузера в два этапа. Сначала мы вызываем функцию getReading, которая использует
маршрут
/temp
для
отправки
функцию callback в
сетевого
запроса
качестве функции,
программе
вызываемой при
web_ sensor. ру
и
задает
выполнении сетевого
запроса. После этого в функции callback мы обновляем созданное с помощью биб
лиотеки justgage изображение индикатора и с помощью функции setTimeout обеспе
чиваем повторный вызов функции getReading с задержкой в одну секунду.
Дополнительные сведения
Если вы хотите отобразить покюания датчика не на веб-странице, а в окне прило
жения, обратитесь к рецепту
14.23.
Библиотека justgage 2 также предлагает множество других способов отображения
покюаний датчиков.
17.3. Основы
работы с редактором
Node-RED
Задача
Вы хотите при работе с Интернетом вещей иметь возможность создавать простые
потоки операций наподобие отправки твита по нажатию определенной кнопки на
устройстве
Raspbeny Pi.
Решение
Используйте визуальный редактор
в разделе
Programming
Node-RED,
ссылку на который можно найти
(Программирование) инструмента
Recommended Software
4.2. Сна
(Рекомендуемое программное обеспечение), представленного в рецепте
чала нужно запустить сервер редактора
Node-RED:
$ node-red-pi --max-old-space-size=256
Затем следует подключиться к серверу с помощью веб-браузера. Это можно сде
лать и на самом устройстве
Raspbeny Pi,
и на любом другом компьютере, подклю
ченном к вашей сети. В первом случае перейдите по адресу
втором
вместо цифр
-
устройства
Raspbeny Pi.
127.0.0.1
Когда вы подключитесь к серверу редактора
браузер отобрюит веб-интерфейс, представленный на рис.
Визуальный редактор
http://127.0.0. l: 1880/;
Node-RED
во
в адресе следует укюать локальный IP-aдrec
Node-RED,
17.5.
позволяет вам обойтись без написания кода, соз
давая программы (которые нюываются здесь потоками), просто «рисуя» эти пото
ки. Такое «рисование» осуществляется с помощью перетягивания в область редак
тирования рюличных узлов и соединения их друг с другом. В качестве примера на
рис.
2
17 .5
представлен простейший поток из двух соединенных друг с другом кон-
См. https://oгeil.ly/tBcYu.
Интернет вещей
тактов устройства
разъема
GPIO)
Raspberry Pi.
485
Один из этих контактов (например, 25-й контакт
служит в качестве входа и может быть подключен к переключателю,
в то время как другой (например, 18-й контакт разъема
GPIO)
может быть подклю
чен к светодиоду. Реализовать такую схему можно с помощью кнопки и «осьми
ножноrо» модуля светодиода
Raspberry Squid,
как предложено в рецепте
17.1.
lnformlltlon
•ьЫ9с3аS, Sас5е"
Aow1
EnaЬl8d
Slatus
.; Flow Deecrlpllon
PtN: t 22
PIN: 12
8 1
,:;
1
Моvе
Рис.
Расположенный слева узел
17.5.
Веб-интерфейс редактора
PIN 22
the
.
lected nodes using lho
Node-RED
представляет здесь вход (подключенный к пере
ключателю 25-й контакт разъема
GPIO), а узел PIN 12 - выход (подключенный
к светодиоду 18-й контакт разъема GPIO). Для обозначения контактов разъема
GPIO в редакторе Node-RED используются их позиции, а не названия (верхний
левый контакт обозначается как PIN 1, верхний правый - как PIN 2 и т. д.).
Чтобы создать этот поток в своем редакторе, прокрутите вниз расположенный сле
ва список узлов, пока не появится раздел
редактирования узел
rpi gpio,
Raspberry Pi.
Перетяните в область
значок которого в виде ягоды малины находится сле
ва. Этот узел будет входом. Выполнив двойной щелчок на этом узле, откройте
окно, показанное на рис.
кнопке
17.6.
Выберите здесь вариант
22 - GPI025
и щелкните на
Done (Готово).
Затем перетяните в область редактирования узел
rpi gpio
второго типа (у которого
значок в виде ягоды малины находится справа). Снова откройте окно, показанное
на рис.
17.6, выполнив двойной щелчок на этом
12 - GPI018, щелкните на кнопке Done (Готово).
узле. Выбрав на этот раз вариант
Соедините эти два узла друг с другом, протянув линию от соединительного эле
мента на правом крае входного узла к такому же элементу на левом крае выходного
узла. После этого ваш поток будет выглядеть так. как пока3ано на рис.
17.5.
486
Глава
17
ldll rpl-gplo ln nod8
Delete
V
Cancel
-
nodepropertlee
SCl.1 • ОР1ОО3 • 6
CJPIOCМ-7
22-<FICIII
....
lfll018-
Рис.
17.6. Выбор
25-го контакта разъема
Если кнопка и светодиод уже подключены к
же запустить , щелкнув на кнопке
Deploy
GPIO
в редакторе
Raspberry Pi,
Node-RED
этот поток можно сразу
(Развертывание). При этом должен заго
реться светодиод. Если вы нажмете подключенную к
Raspberry Pi
кнопку, светоди
од должен погаснуть. О том, почему здесь используется такая инвертированная
логика, мы поговорим в следующей главе, когда вы уже получше познакомитесь
с редактором
Node-RED.
Хотя мы уже получили отлично работающую схему, у нее пока нет ничего общего
с Интернетом вещей. Исправить это можно, применив в редакторе Node--RED дру
гие типы узлов. Этот редактор позволяет создавать узлы самых разных типов,
включая, помимо прочего, узел
Tweet
(Твит). Подключите этот узел к узлу
в качестве второго выхода, чтобы поток выглядел, как показано на рис.
надо должным образом настроить узел
Tweet.
чок на этом узле и введите в открывшемся
в социальной сети
Twitter.
PIN 22
17.7. Теперь
Для этого выполните двойной щел
окне логин и пароль своего аккаунта
После этого при каждом нажатии кнопки будет произво
диться отправка твита.
Пояснение
Node-RED -
чрезвычайно мощный инструмент, и потому на ознакомление со все
ми его возможностями и особенностями вам потребуется некоторое время. Помимо
Интврнвт ввщвй
Рис.
17.7.
Реализация отправки твитов в редакторе
1
487
Node-RED
потоков с однонаправленным движением, какой мы создали в этом рецепте, в ре
дакторе
Node-RED также
if) и функции
операторы
можно использовать коммутирующий код (например,
для преобразования сообщений, пересылаемых между
узлами.
Мы рассмотрели здесь лишь основы работы с редактором
Node-RED.
Для более
подробного ознакомления с ним я рекомендую вам ознакомиться с материалами,
указанными в разд. «Дополнительные сведения», и рецептами из главы
Если вам очень понравилось работать с редактором
Node-RED,
18.
вы можете сделать
так, чтобы он запускался автоматически при каждой перезагрузке устройства
Raspberry Pi.
Для этого выполните следующие команды:
sudo systemctl еnаЫе nodered . service
$ sudo systemctl start nodered.service
$
Дополнительные сведения
Более подробную информацию по использованию редактора
стве
3
Raspberry Pi
можно найти в его полной документации 3 .
См . https://oreil.ly/NpEhD.
Node-RED
на устрой
488
1
Глава
17
Хорошие вводные видео, иллюстрирующие работу с редактором
ставлены по адресам
17.4. Отправка
https://oreil.ly/uxGHZ
и
Node-RED,
https://oreil.ly/ZSDNi.
пред
электронных писем и других уведомлений
с помощью сервиса
IFTTT
Задача
Вы хотите реализовать на устройстве
универсальный способ отправки
Raspberry Pi
уведомлений, позволяющий рассылать сообщения по электронной почте, в соци
альных сетях
Facebook и Twitter или
в мессенджере
S\ack.
Решение
Рассылку настраиваемых уведомлений с устройства
Raspberry Pi можно реализо
IFTTT (lf This Then
вать путем отправки запросов в канал Maker (Создатель) сервиса
That,
Если это, тогда то).
В качестве примера в этом рецепте используется программа, отправляющая сооб
щение по электронной почте в том случае, когда температура процессора устройст
ва
Raspberry Pi
достигает максимально допустимого предела.
Чтобы начать работу с сервисом
те
www.ifttt.com
IFTTT,
пройдите бесплатную регистрацию на сай
и войдите в свой аккаунт.
Затем создайте на этом сайте IFТТТ-апплет, реализующий следующее правило:
«Когда поступит сетевой запрос от устройства
Raspberry Pi,
следует отправить
электронное письмо». Для этого щелкните на странице сервиса на кнопке
(СОЗДАТЬ)
-
CREATE
IF THIS
вам будет предложено ввести обе части апплета: условие
(ЕСЛИ ЭТО) и действие
THEN ТНАТ
(ТОГДА ТО).
В нашем случае запускающим событие.м (триггером) ЕСЛИ ЭТО является поступ
Raspberry Pi. Щелкните на слове THIS (ЭТО)
и, используя поле поиска, найдите канал Webhooks (Веб-перехватчики). Выберите
этот канал, а затем - вариант Receive а web request (Поступление сетевого запро
са). Теперь, когда вы щелкнете на кнопке Create (Создать), на экране появится
форма, показанная на рис. 17.8. Введите здесь название cpu too hot. в поле Event
Name (Название события) и щелкните на кнопке Create trigger (Создать запус
ление сетевого запроса от устройства
кающее событие).
После этого система переведет вас ко второй части процедуры:
THEN
ТНА Т
(ТОГДА ТО), в которой определяется действие. Соответственно, на этом этапе вам
нужно выбрать определенный канал действия. Здесь предусмотрено много вариан
тов,
но,
поскольку
в
этом
примере
мы
хотим
использовать
электронную
найдите и выберите канал Eшail (Электронная почта) и вариант действия
an email
почту,
Send me
(Отправить мне электронное письмо). В полях появившейся на экране
формы измените текст :шписей, как показано на рис.
17.9.
Интернет вещей
489
Create trigger
Рис.
17.8.
Форма для запускающего события
а
Receive
а
web request
(Поступление сетевого запроса)
Complete action flelds
Step 5 of 6
Рис.
17.9.
Заполнение формы
сервиса IFТТТ,
определяющей действие
490
Глввв
17
Обратите внимание на то, что специальные значения
и
Valuel
(Значение
1)
OccurredAt
(Время события)
при этом заключаются в двойные фигурные скобки:
Это так называемые «ингредиенты»
-
{{ ... }}.
изменяемые значения, которые будут извле
каться из сетевого запроса и подставляться в строке темы электронного письма и
в его теле.
Щелкните на кнопке
Create action
(Создать действие), а затем
-
на кнопке
Finish
(Завершить), чтобы завершить создание действия.
После этого вам останется лишь указать свой АРI-ключ для канала
Webhooks,
что
бы другие пользователи не могли бомбардировать вас электронными письмами
с информацией о температуре процессора на их устройстве Raspberry Pi.
Чтобы получить информацию о своем АРI-ключе на сайте сервиса
IFTTT,
щелкни
те на кнопке со стрелкой, расположенной возле значка пользователя, выберите
в открывшемся меню вариант Му
Webhooks.
На странице канала
кументация)
-
Services (Мои
Webhooks щелкните
сервисы), а затем
на кнопке
- вариант
Documentation (До
появится страница, на которой, помимо прочего, будет и информа
ция о вашем АРI-ключе (рис.
17.10).
11
Your key is:
◄ Вdck
То
to service
trigger an Event with an arbltrary JSON payload
Ma.ke а POST or Gl:Т web request to:
https : //uker .ifttt .cClll/trigger
1[{8vent}Jtj-/with/key/ЬOН5uOЬdU8ZfSH1 TQЬTc9f
• Note the extra IJ8011 path e/ement ln thls trfgger.
With any JSON ьооу. For example:
{ •thls" : [ { •1s•: { •s-•: [ •test•, "data• ) } } ) }
You
сал
also try lt wlth cur t from а command llne.
cur\
•Х POST • Н •content•Type: application/json• •d '{"this":[{"is":{•s-•:[•test•,•c1ata•)}))}'
https: //8&ker. ifttt. c08/trigger/ {event}/j son/w1th/key/ЬOН5u6ЬdU8ZfSН1ТQЬTc9~
Please read our FAQ оп uslng Webhooks lor more lnfo.
Рис.
17.10.
Получение информации о своем АРl-ключе
Вставьте этот ключ в строку:
КЕУ;
'your_key_here'
в приведенной далее программе.
Руthоn-программа для отправки сетевого запроса сервису
temp.py) выглядит следующим образом:
IFTTT (ch_ 17_ifttt_cpu_
Интернет вещей
491
time
from gpiozero import CPUTemperature
import requests
iпport
= 33.0
BETWEEN WARNINGS = 60
МАХ ТЕМР
MIN
Т
##Минуты
EVENT = 'cpu_too_hot'
BASE_URL = 'https://maker.ifttt.com/trigger/'
КЕУ = 'your_key_here'
def send_notification(temp):
data = {'valuel' : temp)
url = BASE URL + EVENT + '/with/key/' + КЕУ
response = requests.post(url, json=data)
print(response.status_code)
def cpu__temp () :
cpu_temp = CPUTemperature() .temperature
return cpu_temp
while True:
temp = cpu_temp 1)
print( CPU Temp (С):
+ str(temp))
if temp > МАХ_ТЕМР:
print ( CPU ТОО НОТ!
send_notification(temp)
print( No more notifications for:
+ str(MIN_T_BETWEEN_WARNINGS) +
time.sleep(MIN_T_BETWEEN_WARNINGS * 60)
time.sleep(ll
11
11
11
11 )
11
11
11
mins
11 )
При желании вы можете скачать этот пример кода в порядке, описанном в рецеп
те
3.22.
В целях проверки я специально оставил переменную МАХ_ТЕМР равной низкому зна
чению. Если там, где вы живете, бывает очень жарко, увеличьте это значение до
или
70
60
градусов.
Вставьте свой АРI-ключ в строку, которая начинается с фрагмента КЕУ=, и запустите
программу с помощью команды:
$
pythonЗ
ch_l7_ifttt_cpu_temp.py
Чтобы повысить температуру процессора, запустите воспроизведение видео или
вре:иенно оберните устройство
Raspberry Pi
пература достигнет заданного
порога,
показанное на рис.
17.11.
упаковочной пленкой. Как только тем
вы должны получить электронное
письмо,
Обратите внимание на то, как в текст электронного пись
ма были подставлены реальные значения времени и температуры.
Глава
492
•
17
WeЬhook8
vla IFТП <ectlon@lfttt.com►
*
11:56(18mlnutesllg0)
tome •
+..
Raspberry Pi CPU temperature waming at June 28, 2019 at 11 :SSAМ.
Temperature measured as 48.З degrees С
~
lf Maker Event "cpu_too_hot", then Send me
an email at - • · - • , ,
·
~
UruuЬocn1>e
>
from ~ notilications or sign in to manag• your EmaU Appleta.
IF'TTT
Рис.
17.11.
Электронное письмо с уведомлением
Пояснение
Большая
часть
работы
в
этой
программе
выполняется
внутри
функции
send
notification (отправка уведомления). Здесь мы сначала конструируем URL-aдpec,
включающий в себя ключ и параметр запроса valuel (значение температуры), после
чего используем Руthоn-библиотеку requests для отправки сетевого запроса сервису
IFTTT.
В основном цикле программы мы постоянно проверяем, не превышает ли темпера
тура процессора значение переменной МАХ _тн1Р, и. если это так, отправляем сетевой
запрос и начинаем отсчет дли11ной задержки между предупреждениями, заданной
с помощью переменной MIN _т_ BETWEEN _ WARNINGS. Эта задержка не позволяет программе
отправлять бесконечно большое количество уведомлений при достижении порого
вой температуры.
В общем-то, в нашем случае можно обойтись без использования сервиса
IFTTT,
7. 16.
просто отправляя себе электронное письмо напрямую, как показано в рецепте
Однако при отправке сообщений с помощью сервиса
в выборе средств только электронной почтой
--
IFTTT
вы не ограничены
вы можете выбрать любой другой
канал действий из предлагаемых на сайте этого сервиса без необходимости писать
какой-либо код.
Дополнительные сведения
Обратите также внимание на рецепт
7. 16,
посвященный отправке электронных
писем непосредственно из Python-кoдa.
Программа для
те
14.11.
измерения
темr1сратуры
процессора
рассматривается
в рецеп
Интернет вещей
Отправка твитов с помощью сервиса
17 .5.
493
ThingSpeak
Задача
Вы хотите обеспечить автоматическую отправку твитов с устройства
Raspber-
для того, например, чтобы раздражать других людей информацией о темпе
ry Pi -
ратуре вашего процессора.
Решение
В общем-то, вы можете использовать в этих целях рецепт
17. 4,
в качестве канала действий не канал электронной почты, а канал
просто выбрав
Twitter.
Однако
здесь также возможен и другой подход, который сводится к использованию сервиса
ThingSpeak.
Сервис
ThingSpeak
во многом аналогичен сервису
IFTTT,
но, в отличие от него,
ориентирован исключительно на проекты на основе технологии Интернета вещей
(IoT). Этот сервис
с
помощью
позволяет создавать каналы для сохранения и извлечения данных
сетевых
запросов.
Среди
предлагаемых действий
есть
и
вариант
ThingTweet, который представляет собой оберточный веб-сервис для социальной
сети Twitter. Этот канал более прост в использовании, чем АРI-интерфейс социаль
ной сети Twitter, для использования которого требуется зарегистрировать свое при
ложение на сайте сети Twitter.
Сначала вам следует зарегистрироваться на сайте
регистрации вас также попросят создать аккаунт
https://thingspeak.com. В
для платформы МА TLAB,
ходе
хотя
в этом нет особой надобности.
Далее выберите действие
ThingTweet
из меню
Apps (Приложения). Система пред
Twitter, после чего это действие
ложит вам ввести учетные данные социальной сети
будет активировано (рис.
~s
17. 12).
Help
TlщicTweet
lмthe ThincTweetoppto Wr ,ka Twitmкaiunt toyoo,Thin~kaccounL Yaur-.S
un t/len send 1lerts Yia Тwin er Ьу u>inc the Tw<OtConto4 API. Foruample, you сап m•ko 1
Ltnk T\11\tter Account
devicttwнtyouwhon tht~urtinyouru"'""""'5edropsorwhontм-ina
device are runnina tow.
APll<ey
slmonmonk
68LZC4LIIIIXl06
2
YDY
Adlon
Twitter кcount toyourТhlni$i>oak кcounL When
• ~ to authorlze Тhin&fwtet to useyour account:
CUckUnkТWltler- to lini< •
• Enteryou,Twinerusomameand possword.
• Chock th, RememЬef me lюх to cкheyourTwittercrodentlills on yoo,computer.
• CUd<Alltl\Cd8 арр.
Exampte API Endpoint
Update TwinerStatus
htt1>s: / fll>i• thJ.ntspe•k. t08/oppstth1ngь,,,et/l/statusмtupdato
apJ,_ke}"'681.ZC•t8"'1.06Y0Y
,t,tu<,•J just postod thts fr08 r,y thin91
РОSТ
Рис.
17.12. Действие ThingTweet
Глава
494
17
Python-nporpaммa для отправки твита с помощью сетевого запроса (ch_17_send_
tweet.py) выглядит следующим образом:
import time
from gpiozero import CPUTemperature
import requests
= 35.0
BETWEEN WARNINGS = 60 #
МАХ ТЕМР
MIN
Т
Минуты
BASE_URL = 'https://api.thingspeak.com/apps/thingtweet/1/statuses/update/'
КЕУ = 'your_key_here'
def send_notification(temp):
status = 'Thingtweet: Raspberry Pi getting hot. CPU temp=' + str(temp)
data = { 'api_key' : КЕУ, 'status' : status)
response = requests.post(BASE_URL, json=data)
print(response.status_code)
def cpu_temp():
cpu_teщ:, = CPUTemperature() .temperature
return cpu_temp
while True:
temp = cpu_ tещ:, ()
print( 11 CPU Temp (С): 11 + str(temp))
if temp > МАХ_ТЕМР:
print (11 CPU ТОО НОТ! 11 )
send_notification(temp)
print( 11 No more notifications for: 11 + str(MIN_T_BETWEEN_WARNINGS) +
time.sleep(MIN_T_BETWEEN_WARNINGS * 60)
time. sleep (1)
11
mins 11 )
При желании вы можете скачать этот пример кода в порядке, описанном в рецеп
те
3.22.
Здесь так же, как мы это делали в рецепте
17. 4,
перед запуском программы необ
ходимо вставить в соответствующей строке свой АРI-ключ, который указан на
странице действия
ThingTweet
(см. рис.
грамму, как предлагалось в рецепте
17.12).
17.4.
Запустите и протестируйте эту про
Пояснение
Используемая здесь программа имеет много общего с программой из рецепта
17.4.
Основные отличия здесь сводятся к тому, что функция send_notification конструиру
ет твит и отправляет его внутри сетевого запроса в виде параметра
status.
Интернет вещей
1
495
Дополнительные сведения
Более подробную информацию можно найти в полной документации по сервису
ThingSpeak 4 •
В рецепте
на основе
сервиса
использо
вать
17. 6 описан популярный сервис CheerLights, реализованный
ThingSpeak, а в рецепте 17. 7 рассказывается о том, как можно
сервис ThingSpeak для сбора показаний датчиков.
17 .6.
Изменение цвета светодиодов
с помощью сервиса
CheerLights
Задача
Вы хотите
подключить RGВ-светодиод к устройству
участие в популярном проекте
CheerLights -
Raspberry Pi
и принять
CheerLights.
это веб-сервис, который позволяет любому пользователю отправить
твит с названием цвета по адресу
@cheerlights,
после чего этот цвет будет принят
в качестве текущего цвета проекта. Участники проекта
CheerLights
по всему миру
запрашивают информацию о текущем цвете с помощью этого веб-сервиса и соот
ветствующим образом меняют цвет своего освещения. При этом отправка твита
приводит к изменению цвета освещения у всех участников.
Решение
Raspberry Pi «осьминожный» модуль RGВ-светодиода Raspberry
17 .13) и запустите тестовую программу, текст который представлен
Подключите к
Squid
(рис.
далее:
from gpiozero import RGBLED
from colorzero import Color
import time, requests
led = RGBLED(lB, 23, 24)
cheerlights_url = "http://api.thingspeak.com/channels/1417/field/2/last.txt"
while True:
try:
cheerlights = requests.get(cheerlights_url)
с= cheerlights.content
print (с)
led.color = Color(c)
except Exception аа е:
print(e)
time.sleep(2)
4
См. https://oreil.ly/pVyhG.
Глава
496
Рис.
17.13.
17
Подключение к
Raspberry Pi
«осьминожного» модуля RGВ-светодиода
для отображения цветов проекта
Raspberry Squid
Cheerlights
При желании вы можете скачать этот пример кода в порядке, описанном в рецеп
те
3.22.
Когда вы запустите эту программу, ваш светодиод должен загореться определен
ным цветом и сменить этот цвет спустя
некоторое время, когда кто-то из участни
ков проекта отправит свой твит. Если смены цвета не происходит, попробуйте сами
отправить твит вида
@cheerlights red
(где
red
(красный)
-
название цвета). При
этом и у вас, и у всех других участников проекта по всему миру светодиод должен
засветиться этим цветом. В проекте
CheerLights можно использовать следующие
red (красный), green (зеленый), Ыuе (синий), cyan (бирюзовый),
white (белый), oldlace (старое кружево), purple (фиолетовый), magenta (пурпурный),
yellow (желтый), orange (оранжевый), pink (розовый).
названия цветов:
Пояснение
Приведенная здесь программа просто отправляет сетевой запрос сервису
который
возвращает строку с
шестизначным
ThingSpeak,
шестнадцатеричным кодом
цвета.
Этот цвет задается в качестве цвета свечения светодиода.
Конструкция try/except ис11ользуется здесь для того, чтобы не допустить аварийного
завершения работы программы в случае временного отключения сети.
Интернет вещей
1
497
Дополнительные сведения
Cl1eerLigl1ts сохраняет свой текущий цвет в
17. 7 также будет показано, как можно
ThingSpeak для сохранения показаний датчика.
канале сервиса
Сервис
В ре11е11111е
Если у вас нет модуля
Squid,
ThingSpeak.
использовать канал сервиса
то вместо него можно использовать RGВ-светодиод,
( см . рецепт 11.11),
15.5.
подключив его с помощью макетной платы
или целую ленту
светодиодов, немного и1менив схему из реце11та
17.7. Отправка
показаний датчика
в канал сервиса
ThingSpeak
Задача
Вы хотите обеспечить сохранение показаний датчика в канале сервиса
ThingSpeak
с тем, чтобы можно было просматривать график их изменения с течением времени.
Решение
ThingSpeak, раскрыв меню
Channels (Мои каналы) и заполните
как показано на рис . 17.14.
Войдите
в свою учетную запись на сайте сервиса
Channels
(Каналы), выберите в нем пункт Му
верхнюю часть формы для создания канала,
New Channel
Му RaspЬerry Pi
Name
CPU Temperature
This channels keeps track of the CPU Temperature of
Desaiption
my RaspЬerry Pi.
F'ield 1
[
tempc
------~
Field2
G
Field3
О
Рис.
17.14.
Соэдание канала сервиса
ThingSpeak
Остальную часть формы можно оставить пустой . Завершив ввод данных, щелкните
на кнопке
Save Channel (Сохранить канал) в нижней части страницы. Затем перей
API Keys (АР\-ключи), где вы найдете информацию о том, какие
дите на вкладку
сетевые ·\апросы
каналу (рис.
в1,1
можете использ овать и
какой АРl-ключ
присвоен вашему
17. 15).
Укюанный цесь ЛРl-ключ (значение параметра api_ key в поле
Feed - POST
(Обновление ленты канала
-
метод
POST)
Update Channel
необходимо подставить
в представленную далее программу в качестве значения переменной КЕУ.
498
Глава
17
Update Channel Feed • GET
GET https://ap1,thingspeak,cOll/update7api_keyxOYHHDDККLU80V58T&f
1e1d1•8
Update Channel Feed • POST
РОSТ https://api.thingspeak.co■/update.json
api_keyxOYHНOOККLU80V58T
field1=73
Get а Channel Feed
GET
https://api.thingspeak.cOll/channels/77483/feeds.json?гesults
-2
Get а Channel Field Feed
GET
https://api.thingspeak.cOll/channels/77483/fields/1.json?гesu
1ts•2
Get Status Updates
GET https://api.thingspeak,COll/channets/77483/status.json
Рис.
17.15.
Получение информации о канале сервиса
ThingSpeak
Чтобы послать данные в канал, вы должны отправить сетевой запрос. Руthоn
программа для отправки
соответствующего сетевого запроса
data.py) выглядит следующим образом:
illport time
from gpiozero import CPUTemperature
import requests
PERIOD = 60 # секунды
BASE_URL = 'https://api.thingspeak.com/update.json'
КЕУ = 'your key goes here'
def send_data(temp ) :
data = { 'api_key' : КЕУ, 'fieldl' : temp)
response = requests.post (BASE_URL, json=data)
def cpu_temp():
cpu_temp = CPUTemperature () .temperature
return cpu_temp
while True:
temp = cpu_temp ()
print ("CPU Temp (С )
send_data(temp )
time.sleep(PERIOD)
:
" + str (temp ) )
(ch_ 17_thingspeak_
Интернет вещей
1
499
При желании вы можете скачать этот пример кода в порядке, описанном в рецеп
те
3.22.
Запустив программу и открыв вкладку
Private View
(Закрытый просмотр) на стра
нице своего канала, вы должны увидеть график изменения показаний датчика
(рис.
17.16).
График будет ежеминутно обновляться при поступлении каждого но
вого значения.
Му
Raspberry PI CPU Temperature
◄О
-------------------
зо
16 :15
00_ _ _ _
6:_
- - - -1....
16:30
Date
ThingS.,,.llk.com
Рис.
17.16.
Отображение графика изменения показаний датчика
с помощью сервиса
ThingSpeak
Пояснение
С помощью переменной PERI OD мы здесь указываем , с каким интервалом должны
отправляться получаемые датчиком значения температуры.
Внутри функции send _data мы конструируем сетевой запрос , указывая значение
температуры в качестве параметра
fi e ldl.
Если ваши данные могут быть интересны широкой публике, как, например, в слу
чае измерения температуры окружающей среды, вы можете сделать свой канал об
щедоступным, чтобы любой пользователь мог воспользоваться этой информацией.
Однако это вряд ли стоит делать, если вы измеряете температуру процессора своего
устройства
Raspberry Pi.
Дополнительные сведения
Работа кода для считывания показаний датчика, измеряющего температуру про
цессора, объясняется в рецепте
14.11.
В рецепте
14.24
рассказывается, как можно
экспортировать показания датчика в электронную таблицу.
500
1
17 .8.
Глава
17
Реагирование на твиты
с использован~ем сервисов
Dweet и IFTTT
Задача
Вы хотите заставить устройство
Raspberry Pi
реагировать на использование опреде
ленного хештега или упоминание определенной информации в твите.
Хотя мы уже делали это в рецепте
применявшийся там подход был не слиш
17. 6,
ком эффективен, потому что нам приходилось постоянно опрашивать веб-сервис на
предмет того, не изменился ли цвет, используя для этого сетевые запросы.
Решение
Более эффективный способ отслеживания твитов, который не полагается на опра
шивание, сводится к тому, чтобы с помощью сервиса
ходить
Dweet,
представляющие
интерес
твиты
и
IFTTT
отправлять
(см. рецетп
сетевые
17.4)
запросы
на
сервису
который, в свою очередь, будет передавать уведомления Руthоn-программе,
запущенной на устройстве
Raspberry Pi (рис. 17. 17).
Например, вы можете сделать так, чтобы при каждом упоминании вашего имени
пользователя в социальной сети
Twitter
на
10
секунд загорался светодиод (это мо-
Twitter: уnом11нание обо мне
Канал
Maker сервиса IF1TT:
отправка НТТР-заnроса
tweet__ about_me
Поступление запроса
tweet_about_me : подача
высокого уровня сигнала на
вывод
18
в течение
1О
секунд
Python
Рис.
17.17.
Совместная работа сервиса IFТТТ, сервиса
Dweet
и Руthоп-кода
Интернет вещей
жет быть светодиодный модуль
Raspberry Squid
1
501
или светодиод, подключенный
к макетной плате).
В части аппаратной составляющей этого рецепта вам потребуется электроника,
которая просто делает что-то заметное при подаче высокого уровня сигнала на вы
вод
18
цепт
разъема
10.1О),
требуется
GPIO.
Это может быть один канал модуля
Raspberry Squid
(см. ре
11.1) или реле, если вам
11.5). Воспользовавшись
один светодиод на макетной плате (см . рецепт
максимальная универсальность (см. рецепт
реле, вы, в частности, сможете реализовать такой проект, как BubЬ\ino, и управлять
машиной для пускания мыльных пузырей.
Сначала войдите в свою учетную з апись ,ia сайте сервиса
IFTTT
(см.рецепт
17.4)
создайте новый апплет . Выберите в качестве запускающего события канал
Mention of You
и
New
(Новое упоминание о вас) и щелкните на кнопке Сгеаtе tгiggeг
(Создать запускающее событие). При выборе выполняемого действия выберите
действие Make а web гequest (Отправить сетевой за
канал Webhooks, а затем прос), после чего -заполните rюля формы , как показано на рис.
■
17.18.
Complete action fields
Step5 of6
Рис.
17.18.
Определение
действия Make а web request
(Отправить сетевой запрос)
на сайте сервиса IFТТТ
Глава
502
17
Используемый здесь URL-aдpec включает в себя параметр запроса text, содержа
щий тело твита. Хотя в нашем случае содержимое твита будет просто выводиться
в консоль, в более сложном проекте оно может выводиться на экран дисплея,
поэтому вам будет полезно знать, каким образом эти данные можно передать
в Python-nporpaммy.
Наконец, щелкните на кнопке
вать действие сервиса
Веб-сервис
dweet.io
Create action
(Создать действие), чтобы активиро
IFTTT.
представляет собой что-то вроде сети
Twitter,
ориентированной
на Интернет вещей. Его веб-интерфейс позволяет публиковать или отслеживать
появление так называемых двитов
(dweet).
Для использования двитов не требуется
создавать учетную запись или вводить какие-либо учетные данные
лишь того, чтобы какой-то источник (в нашем случае сервис
IFTTT)
-
достаточно
отправлял со
общение сервису
на устройстве
Dweet и какой-то потребитель (в нашем случае Python-nporpaммa
Raspberry Pi) ожидал от этого сервиса уведомление об интересую
щем его событии. В качестве маркера, позволяющего связать источник с потреби
телем, в нашем случае выступает запрос
tweet _about _me. Этот запрос не так уж уни
кален, и если несколько читателей этой книги одновременно попробуют реализо
вать приведенный здесь пример, это приведет к тому, что они будут получать
сообщения друг друга. Чтобы избежать этого, следует сделать маркер более уни
кальным (например, путем добавления в сообщение случайной последовательности
букв и цифр).
Чтобы обеспечить доступ к сервису
Dweet
из Руthоn-программы, необходимо уста
новить библиотеку dweepy:
$ sudo
рiрЗ
install dweepy
В этом рецепте используется представленная далее программа ch_ 17_twitter_trigger.py:
~ r t time
import dweepy
from gpiozero import LED
= 'tweet about me'
led = LED(l8)
КЕУ
while True:
try:
for dweet in dweepy.listen_for_dweets_from(KEY):
print ( 'Tweet: ' + dweet [ 'content'] [ 'text' ] )
led.on()
time.sleep(lO)
led.offl)
except Exception:
pass
При желании вы можете скачать этот пример кода в порядке, описанном в рецеп
те
3.22.
Интернет вещей
1
503
Запустив программу, попробуйте опубликовать твит, содержащий ваше имя поль
зователя,
после этого светодиод должен загореться на
-
1О
секунд.
Пояснение
В этой программе мы с помощью метода listen _ for _dweets _ from оставляем открытым
соединение с сервером
dweet.io,
чтобы отслеживать появление рush-сообщений,
отправляемых сервером при поступлении от сервиса
IFTTT
двитов, генерируемых
при появлении соответствующих твитов. Конструкция try/except используется здесь
для того, чтобы в случае временного сбоя связи программа просто начинала про
цесс заново.
Дополнительные сведения
В рецепте
17.6 рассматривается
другой способ решения этой задачи.
ГЛАВА
18
Домашняя автоматизация
18.0. Введение
Такое недорогое устройство с низким потреблением энергии, как
Raspberry Pi,
можно с успехом использовать в качестве работающего круглосуточно концентра
тора системы домашней автоматизации, не рискуя при этом получить огромные
счета за электричество. В рецептах этой главы вам не потребуется высокая произ
водительность моделей
модели
Raspberry Pi 4 или 400. Здесь окажутся более уместными
Raspberry Pi 2 или 3, которые при достаточной производительности будут
не так нагреваться и потреблять меньше энергии.
Мы начнем с рассмотрения протокола
MQTT (Message Queuing Telemetry Transport,
передача телеметрии очереди сообщений), который является основным механиз
мом коммуникации в большинстве систем домашней автоматизации, а затем пого
ворим об использовании редактора
Node-RED (о
нем мы уже упоминали в главе
17)
в качестве основного инструмента домашней автоматизации.
Как известно, домашняя автоматизация призвана сделать ваш дом более «умным» и
способным выполнять определенные операции самостоятельно
-
например, вклю
чать на какое-то время свет при обнаружении движения или отключать все устрой
ства на ночь. Однако многие любители домашней автоматизации также стремятся
получить возможность дистанционного управления теми функциями своего дома,
которые они подвергают автоматизации. Наряду с прочим в этой главе мы обсудим
и дистанционное управление домом с помощью смартфона.
18.1. Превращение Raspberry Pi
с помощью Mosquitto
в брокер сообщений
Задача
Вы хотите превратить устройство
Raspberry Pi в
Mosquitto.
концентратор системы домашней
автоматизации на базе МQТТ-брокера
Решение
У становите программу
Mosquitto,
чтобы устройство
использовать в качестве МQТТ-брокера.
Raspberry Pi
можно было
Домашняя автоматизация
Чтобы установить программу
Mosquitto
505
и использовать ее в качестве сервиса, за
пускаемого автоматически при каждой загрузке устройства
Raspberry Pi,
выполните
следующие команды:
sudo apt update
$ sudo apt install -у mosquitto mosquitto-clients
$ sudo systemctl еnаЫе mosquitto.service
$
Убедиться в том, что всё прошло успешно, можно с помощью следующей команды:
$ mosquitto -v
1656413574: mosquitto version 2.0.11 starting
1656413574: Using default config.
1656413574: Starting in local only mode. Connections will only Ье possiЫe from clients
running on this machine.
1656413574: Create а configuration file which defines а listener to allow remote access.
1656413574: For more details see https://mosquitto.org/documentation/
authentication-methods/
1883.
port
1656413574: Opening ipv4 listen socket on
1656413574: Error: Address already in use
1656413574: Opening ipv6 listen socket on port 1883.
1656413574: Error: Address already in use
$
Сообщение об ошибке здесь на самом деле не говорит о том, что произошла какая
то ошибка, - оно лишь означает, что программа Mosquitto работает, поскольку мы
уже запустили ее как сервис.
Пояснение
Протокол
MQTT
определяет способ передачи сообщений между двумя программа
ми. Он предполагает наличие следующих двух узлов:
♦
сервер.
Центральный узел, который управляет процессом передачи сообщений и на
правляет каждое сообщение надлежащему получателю;
♦
клиент.
Программа, которая отправляет и принимает сообщения, идущие на сервер и об
ратно. Обычно в системе имеется несколько клиентов.
Для передачи сообщений используется
модель публикации и подписки. При появ
лении у клиента представляющей интерес информации (такой как показания датчи
ка) он передает эти данные серверу путем публикации. Спустя несколько секунд
этот клиент может таким же образом опубликовать новые показания датчика.
У каждого сообщения есть тема и полезная нагрузка. Так, например, в случае
автоматизации освещения может использоваться сообщение с темой bedroom_light
(свет в спальне) и полезной нагрузкой в виде команды
(выключить).
on
(включить) или
off
506
Глава
18
Чтобы посмотреть, как работает такой механизм, откройте два окна терминала:
один терминал при этом будет выступать в роли публикатора, а другой
подписчика. Как это может выглядеть в действии, показано на рис.
p1@raspЬenyp1.·
~
-
о
-
в роли
18.1.
х
-
Рис.
18.1.
о
)(
Общение двух клиентов с использованием протокола МQТТ
Давайте разберемся с тем, что здесь происходит. В левом окне терминала, которое
выступает здесь в роли подписчика, мы выполняем следующую команду:
$ rnosquitto_suЬ -d -t pi_rnqtt
Client nюsqsiш/2007-raspberryp sendшg CONNECT
Client mosqsuЬ/2007-caspberryp received CONNACK
Client mosqsuЬ/2007-raspberryp sending SUBSCRIBE (Mid: 1, Topic: pi_mqtt, QoS:
Client mosqsuЬ/2007-raspberryp received SUBACK
SuЬscribed (mid: 1): О
О)
Подписка активируется с помощью команды mosquitto_suЬ. Параметр -d предписыва
ет реализацию режима отладки, в котором на экран выводится гораздо больше
информации о том, что делают клиент и сервер. Это может быть полезно, когда
нужно убедиться в том, что всё работает правильно. Параметр -t pi_mqtt указывает
на то, что клиента интересует тема
p1_mqtt.
Отладочная информация показывает, что клиент без проблем подключается к сер
веру и запрашивает подписку, после чего сервер подписку подтверждает.
Не закрывая это окно терминала, переключитесь на второе окно, которое будет вы
ступать в роли клиента, публикующего сообщения с темой pi _mqtt. Введите здесь
следующую команду:
Домашняя автоматизация
1
507
-d -t pi_mqtt -m "puЬlishing hello"
sending CONNECT
mosqpuЬ/2199-raspberryp received CONNACK
mosqpuЬ/2199-raspberryp sending PUBLISH (d0, q0, r0, ml, 'pi_mqtt',
(16 bytes))
Client mosqpuЬ/2199-raspberryp sending DISCONNECT
$
mosquittoyuЬ
Client
Client
Client
mosqpuЬ/2199-raspberryp
Мы снова видим здесь параметр -d, предписывающий реализацию режима отладки,
и параметр
-t, определяющий тему. Однако имеется и дополнительный параметр -m,
определяющий публикуемое сообщение. Когда в роли публикатора выступает дат
чик, это сообщение может содержать его показания.
После ввода этой команды в первом окне терминала (выступающего в роли под
писчика) должно появиться следующее сообщение:
Client
mosqsuЬ/5170-raspberryp
received PUBLISH (d0, q0, r0, m0, 'pi_mqtt',
. . . (16 bytes))
puЬlishing hello
Дополнительные сведения
Более подробную информацию о программе
можно найти по адресу
Mosquitto
https://mosquitto.org.
Использование протокола
MQTT также
18.2. Использование
рассматривается в рецептах
редактора
18.2 и 18. 5.
Node-RED
совместно с МQТТ-сервером
Задача
Вы хотите объединить редактор
Node-RED
с МQТТ-сервером с тем, чтобы, к при
меру, управлять сигналом на определенном контакте разъема
GPIO
в зависимости
от публикуемых МQТТ-сообщений.
Решение
Создайте в редакторе
рис.
Node-RED
поток с узлами
mqtt
и
rpi gpio,
как показано на
18.2.
Если вы еще не установили редактор
ном в рецепте
Node-RED,
установите его в порядке, описан
17. 3.
После развертывания созданного потока вы сможете включать и выключать кон
такт
18 GPIO
с помощью команды mosquitto_puЬ. Чтобы убедиться в этом, подклю
чите к контакту
цепт
18
светодиод или светодиодный модуль
Raspberry Squid
(см. ре
11.1).
Как вы могли заметить, в названии узлов здесь упоминается освещение кухни
(Kitchen Lights),
поскольку предполагается, что к контакту
18 GPIO
будет подклю-
Глава
508
18
)(
+
V
lnlorma11on
~ Ught ~
·-
К1lt:hlln
LiQ/1/a ~
RupЬony Р! OUlput
nod8.
GPIO 18
--·
rpi-gpюout
с.. Ье
11111d 1n
DlgltalorPWМmodos
v\np<rts
....-1_
P41-7 l oad
а
node onto в wire
sрГ,се
Рис.
18.2.
Поток редактора
Node-RED
о
,_
it mlD 1he
+
для управления контактом разъема
GPIO
с помощью МQТТ-сервера
чено такое устройство, как
PowerSwitch Tail
(см. JH!lfCllm / /.
7),
позволяющее вклю
чать и выключать комнатное освещение.
Давайте пошагово рассмотрим процесс создания это,,о потока.
Сначала добавьте в рабочую область редактора
Node-RED
узел
mqtt
из категории
input
(вход). Выполните двойной щелчок на этом уте, чтобы его отредактировать
(рис.
18.3).
Обратите внимание на то, что в поле
new mqtt-broker
Name
(Сервер) отображается вариант
Add
(Добавить новый mqtt-бpoкep). Мы вернемся к ·ному полю чуть
позже, а пока укажите в поле
а в поле
Server
(Имя)
-
Topic
(Тема) тему
kitchen_lights (освещение кухни),
QoS (Quality of Service,
содержательное имя узла. В поле
качество обслуживания) можно задать, каким должен быть уровень качества об
служивания,
-
т. е. насколько упорно МQТТ-сервер должен добиваться доставки
сообщений указанному адресату. Уровень
2
здесь означает гарантированную дос
тавку.
Далее мы должны определить МQТТ-сервер для редактора
Node-RED.
Щелкните
на кнопке редактирования (со значком в виде карандаша), расположенной справа от
поля Sегvег (Сервер),
-
на экране откроется окно, показанное на рис.
Введите имя сервера в поле
Name
18.4.
(Имя) и укажите локальный сервер
localhost
в поле Sегvег (Сервер). Мы используем здесь локальный сервсr, потому что ре
дактор
Node-RED
и МQТТ-сервер в нашем случае rаботают на одном и том же
устройстве Raspberтy
Pi.
Домашняя автоматизация
509
v_.....
-
Nlrne
"6t78337e,4c5811c"
i--- ----
-
Юlcl-,ui,,t8
--
-
"""а,
1w,e_ _ _...L
-
-
-
vOutputa
,-------------~
p&fload
_
,_
•IO'rlll--••blnlry
ЕnеЫе Otdisвhle 11.-фs
from the
option 1n 1/\е seffings
Рис.
18.3.
Редактирование узла
mqtt
Nodl
• cfdc111d7 .64cfd8"
1р
mф-
•---~--
-
v -Nllp
-
~ 1or • ....-.1о" мап
□ --(SSUТ\.S)-
Thia ~ ........ 8ir,gl8
[ ...... _1or _ _ _
(!)Кеор--(11 ~
-to1h8-wlllchcan11181t.
-Ьу JIQ'r'l' . J'11181d 11ф"11 Ol>t.
■ u.-
nodaL
■ Uoo llgосуМQТТЗ.1-1
'IЬIJC81'1 removelheмec:tlld
Onall-
Рис.
18.4.
Определение МQТТ-сервера для редактора
Node-RED
nodes
510
Глава
18
Теперь мы можем добавить выходной узел
rpi-gpio
из раздела
Raspberry Pi.
Добавьте этот узел в рабочую область и откройте окно для его редактирования
(рис.
18.5) .
•
у~
•м140!8,
,,,~u.-
l<llcllln LIQl'll ~ GPIO ,в
--·
,pl,gploaut
vNodeНetp
Raapl,8,ryPlaulpul-C8r\Ь.I.Мdln
Dlgltal or РWМ modla.
.., lnputa
Pll.fload
-
•-
1-
v[)etllll8
DIQlt8J modo • 811Р8С18 а •9•Pllflcнкl
wttnlltwa0or1 («trueorlaltl8).lndwll
81th-l)tlylk:8lpinl'ilghortм
dllpendlr10 cn h'i811181888d 111.
1DlgЬI cutput
Т)'р8
Тllel№llvallleolhpln81dlpo)'-can
-Ь.811!00оt
,.
PWМmod8 • МfllCl88'111\pJ\,,.,.ola
l'lllll\l)8t о•
100.11 can ье flo8lll'CI ро111.
РWМ mod8 can Ь. I.Мd lO drlw а -
Ulllng~--101nd20 cnly,
Ь11 ... 11СО1р1 ~ polnt- 1'118
Рис.
18.5.
Редактирование узла выходного контакта разъема
Выберите здесь вариант
ните на кнопке
Done
12 - GPI018,
введите имя узла в поле
GPIO,
Щелкните на кнопке
Name
(Имя) и щелк
(Готово). Соедините два узла друг с другом, протянув линию
от соединительного элемента входного узла
узла контакта
GPIO
mqtt
к такому же элементу выходного
чтобы ваш поток выглядел так, как показано на рис.
Deploy
(Развертывание) и откройте на устройстве
18.2.
Raspberry Pi
окно терминала с тем, чтобы протестировать только что созданный поток.
Введите в окне терминала следующую команду, чтобы опубликовать запрос на
включение освещения:
$
mosquitto _рuЬ -d -t ki tcher1 lights -m 1
При этом должен загореться светодиод, подключенный к контакту
отключите светодиод, используя следующую команду:
$
mosqшtto_p1J.b
-d -t kitchen_lights -m
О
18 GPIO.
Теперь
Домашняя автоматизация
511
Пояснение
Этот рецепт предполагает, что то устройство, которым вам нужно управлять, нахо
дится рядом с устройством
На практике же вы гораздо чаще будете
Raspberry Pi.
управлять устройствами дистанционно с помощью беспроводного выключателя.
И тем не менее вам полезно узнать, как можно обеспечить управление контактами
с помощью МQТТ-сервера и редактора
GPIO
Редактор
Node-RED.
позволяет импортировать и экспортировать потоки в виде
Node-RED
JSON-кoдa. Все те потоки, которые используются в примерах этой главы, вы може
те скопировать из GitНuЬ-репозитория этой книги 1 •
Чтобы импортировать один из этих потоков в редактор
Node-RED,
перейдите по
указанной ссылке и щелкните на JSОN-файле, в названии которого указан номер
нужного вам рецепта. Например, в случае, показанном на рис.
18.6,
я щелкнул на
файле recipe_18_10.json.
С, NotlfЬtlom
1;1 simonmonk/ raspberrypi_cookbook_ed4 ,,,_
0
<> Codo
8) ~
n
ls<u,s
J
(i) slmonmonk
~
81ame
11
Pull roquests
0
Actюns
!В ProjeC\s
ф Secuпty
У
fo,k
7
* ,..,
41
•
1,::: lns,ght,
raspЬerrypi_cookЬoo~od4 /node_red/ rкipe_18_10.jюn [9
Q Gotofi~
more stuff
1 lWs (1 loc) , 1.32
К8
Рис.
18.6.
Копирование JSON-кoдa потока с сайта
GitHub
В области для кода выделите целиком всю строку кода и скопируйте ее в буфер
обмена. (Возможно, выделить этот код будет проще, если вы откроете его в отдель
ном окне, щелкнув на кнопке
Raw
(В необработанном виде), расположенной над
областью для кода.) После этого перейдите в окно редактора
в меню пункт
Import
показанонарис. 18.7.
(Импорт), а затем
-
пункт
Node-RED и выберите
Clipboard (Буфер обмена), как
Вставьте тот код, который вы скопировали с сайта
(рис.
18.8), указав,
GitHub, в открывшееся
(new flow).
окно
что импорт производится в новый поток
Как только вы щелкнете на кнопке
Import
(Импорт), скопированный поток появит
ся на новой вкладке в области редактирования (рис.
18.9).
Дополнительные сведения
В рецепте
18.5 объясняется, как можно обеспечить управление выключателями на
Wi-Fi с помощью МQТТ-сервера, а в рецепте 18. 6 - как то же самое можно
сделать с помощью редактора Node-RED.
основе
1
См. https://oreil.ly/nmDtR.
512
Глава
18
Рис.
18.7.
Выбор пункта меню, обеспечивающего импорт из буфера обмена
broker". •z•:• •, •name•:•МyНomeAutomatian•. "Ьroker":•locaJhost'. •
port•:' 1883", 'cllentid": ..,"usetls":false, 'compatmode":true,"keepel
lve":'60", •cteansession':true."blrthToplc": .., ·blrthQos•:•o·. "bllthP
ayloed': .. , 'closeToplc':...•cl088Qoa•:•o•."closePayload':' •, •wiflТo
plc":.. ,'wlUOos •:•о•. "wlllPayload':..}J
lmport to
Рис.
18.8.
cunwnt flow
1
new flow
Вставка кода потока в диалоговом окне
lmport nodes
(Импорт узлов)
Домашняя автоматизация
1
513
1
'
1
Рис.
18.9.
Импортированный поток
Более подробную информацию об уровнях обслуживания протокола МQП можно
найти по адресу
https://oreil.ly/cBK4F.
Подробную информацию по редактору
Node-RED
вы найдете в его полной доку
ментации 2 .
18.3. Прошивка умного выключателя Sonoff
на основе Wi-Fi под использование протокола
МQП
Задача
Вы х<Лите с помощью протокола МQП организовать использование умного вы
ключателя на основе
Wi-Fi
с тем, чтобы управлять домашними приборами непо
средственно с устройства RaspЬerry
Pi.
Решение
Установите на недорогой Sопоff-выключатель на основе
Wi-Fi
прошивку
Tasmota
и произведите его настройку с помощью веб-интерфейса. После этого им можно
будет управлять с помощью протокола МQП.
Использование подключаемых к Интернету выключателей
Sonoff
(рис.
18.1 О) -
очень малозатратный способ реализации беспроводного включения и выключения
освещения и других домашних приборов.
Проблема этих выключателей заключается в том, 'ПО на них предустанавливается
проприетарная прошивка, обеспечивающая связь с Интернетом с помощью серве
ров, расположенных в Китае. Однако в нашем рецепте показывается, как можно
2
См. lattps://■odend.o~doc:s.
514
Глава
18
установить на выключатель
Sonoff
свободно распространяемую прошивку, обес
печивающую локальное управление устройством и к тому же работающую более
эффективно, чем исходная.
Рис.
18.1 О.
Sоnоff-выключатель на основе
Все это можно сделать с помощью устройства
Wi-Fi
Raspberry Pi,
но, помимо него, вам
понадобятся:
♦
выключатель
прwюжения
Sonoff Basic
1);
с подключением к Интернету (см. разд. «Модули»
♦ четыре штыревых контакта (см. разд. «Прочее» прw~ожения
♦
четыре соединительных провода типа «гнездо-гнездо» (см. разд. «Оборудование
и комплекты для прототипирования» прw~ожения
♦
1);
1);
припой и оборудование для пайки (см. разд. «Оборудование и комплекты для
прототипирования» прw~ожения
Вам также потребуется устройство
1).
Raspberry Pi 2
или одна из более новых моделей
этого устройства, поскольку более ранние модели выдают на контакте
таточно большой ток, чтобы можно было запитать выключатель
3,3
В недос
Sonoff.
1• • • • • • Остерегайтесь высокого напряжения!
/
Используя выключатели
Sonoff для
коммутации цепей, подключенных к сети пере
менного тока, к винтовым клеммам выключателя
Sonoff
нужно будет подсоединить
находящиеся под высоким напряжением провода. Эта операция должна производиться только квалифицированным электриком.
Прошить и настроить приобретенный вами выключатель
Sonoff
следует до его
подключения к домашней электрической сети, запитывая его только от устройства
Raspberry Pi.
Прежде чем производить подключение выключателя
Sonoff
к сети переменного
тока, разберите его корпус и припаяйте к печатной плате четыре штыревых контак
та, вставив их в предусмотренные для них отверстия.
В каком месте платы расположены эти отверстия и для чего предназначен каждый
из четырех контактов, показано на рис.
следовательного порта.
18.11.
Как можно видеть, это контакты по
Домашняя автоматизация
515
Светодиод
Последовательный
порт
Кнопочный
переключатель
Рис.
18.11.
Внутреннее устройство Wi-Fi-выключателя
Sonoff
Надо сказать, что, в зависимости от используемой версии выключателя
Sonoff,
место расположения на плате отверстий под контакты последовательного порта
может немного варьироваться. Если в вашем случае последовательный порт распо
ложен иначе, поищите на плате четыре отверстия, помеченные с верхней или ниж
ней стороны платы как ЗVЗ,
RX,
ТХ и
GND.
Когда вы припаяете штыревые контакты, ваш выключатель
деть так, как показано на рис.
Sonoff должен
18.12.
Рис.
18.12.
Выключатель
Sonoff
с припаянными штыревыми контактами последовательного порта
выгля
Глава
516
18
Теперь подключите штыревые контакты выключателя
GPIO
♦
на устройстве
Raspberry Pi
контакт 3.ЗV выключателя
Sonoff к контактам
18.13):
разъема
(можете сверяться с рис.
Sonoff
соедините с выводом 3.ЗV на устройстве
Raspberry Pi;
♦
контакт
выключателя
Sonoff -
с выводом
TXD на устройстве Raspberry Pi;
♦
контакт ТХ выключателя
Sonoff -
с выводом
RXD
♦
контакт
RX
GND
выключателя
Sonoff -
с выводом
на устройстве RaspЬerry
GND
на устройстве
Pi;
Raspber-
ry Pi.
На рис. 18.13 представлен пример подключения выключателя Sonoff к
Raspberry Pi 400 с использованием переходника для разъема GPIO.
Рмс.
18.13.
Подключенме выключателя
Для замены прошивки на выключателе
Sonoff к ус;rройству
RаsрЬепу
устройству
Pi 400
Sonoff вам потребуется Руthоn-программа
Pi можно следующим образом:
esptool. Установить ее на устройство RaspЬerry
$ git clone https://githuЬ.coш/espressif/esp t ool.git
$ cd esptool
Помимо программы esptool, вам также потребуется прошивка
установим вместо исходной прошивки выключателя
Sonoff.
сети, выполните следующую команду, на.ходясь в каталоге
$ wget
Tasmota,
которую мы
Чтобы скачать ее из
esptool:
https://githuЬ.com/arendst/Sonoff-TasJIIOta/re l eases/downl oad/vб. 6 .0/sonoff-Ьasic.Ьin
Эrа команда скачает в каталог esptools файл sonoff-Ьasic.Ьin.
Далее выполните следуюl.Ц)'Ю последовательность действий:
1.
Переведите выключатель
Sonoff в режи.н щюшив1..-11.
В текущий момент светодиод вашего выключателя должен непрерывно мигать.
Чтобы перевести выключатель в режим прошивки, отсоедините провод, под
ключенный к заземляющему контзк1у
(GND),
нажмите кнопку
кнопочного
Домашняя автоматизация
переключателя ( см. рис.
517
18.11) и, не отпуская ее, снова подсоедините заземляю
щий копrакт (GND), чтобы возобновить подачу питания на выключатель Sonoff
от устройства RaspЬerry Pi. Выждав несколько секунд после возобномения
подачи питания, отпустите кнопку переключателя.
Теперь светодиод выключателя Sonoff уже не должен мигать. Мы перевели вы
ключатель в режим прошивки, и он готов к установке на него новой программы.
2. Очистите память выключателя Sonoff.
Убедитесь в том, что вы п~прежнему находитесь в каталоге esptools, и запустите
приведенную далее команду очистки. Вы должны увидеть в окне терминала
примерно такие же сообщения, какие показаны здесь:
$ cd ~/esptools
$ руtЬоnЗ esptool.py --port /dev/seriaJ.O erase_flash
esptool.py v4.3-dev
Serial port /dev/serialO
Coпnecting ...
Failed to get PID of а device on /dev/ttySO, using standard reset sequence.
Detecting chip type ... Unsupported detection protocol, switching and trying again ...
...
Failed to get PID of а device оп /dev/ttySO, using standard reset sequence.
Coпnecting
Detecting chip type ... ESP8266
Chip is ESP8285N08
Features: WiFi, EmЬedded Flash
Crystal is 26МНz
МАС:
c4:4f:33:eЬ:Of:73
Uploading
stuЬ ..
.
.
StuЬ rшming .. .
Erasing flash (this may take а while) ...
Chip erase COЩJleted successfully in 1.4s
Hard resetting via RTS pin ...
Rшming stuЬ ..
3. У становите на выключатель Sonoff прошивку Тasmota.
Запустите приведенную далее команду, чтобы записать на выключатель Sonoff
скачанный ранее файл sonoff-Ьasic.bln:
$ pytЬon3
esptool.py
---1)Шt
/dev/seriaJ.O write_flash -fs DE -fa dout
OzO soooff--ьasic.Ьin
esptool. ру v4. 3-dev
Serial port /dev/serialO
Connecting ...
Failed to get PIO of а device
оп
/dev/ttySO, using standard reset sequence.
Detecting chip type ... Unsupported detection protocol, switching and trying again ...
Cormecting ...
Failed to get PID of а device оп /dev/ttySO, using standard reset seqнence.
518
Глава
18
Detecting chip type ... ESP8266
Chip is ESP8285N08
Features: WiFi, EmЬedded Flash
Crystal is 26MHz
МАС: c4:4f:33:eb:0f:73
Uploading stuЬ .. .
Running stuЬ .. .
StuЬ running .. .
Configuring flash size ...
Flash will Ье erased from ОхОООООООО to 0x00069fff ...
Compressed 432432 bytes to 300963 ...
Wrote 432432 bytes (300963 compressed) at ОхОООООООО in 27.0 seconds (effective
128.0 kЬit/s) ...
Hash of data verified.
Leaving ...
Hard resetting via RTS pin ...
Пояснение
По завершении процесса прошивки отключите присоединенные к выключателю
Sonoff
провода и попросите квалифицированного электрика подключить ваш вы
ключатель
Sonoff
к сети переменного тока, чтобы с его помощью можно было
включать и выключать нужные вам приборы.
Однако прежде чем подключать выключатель к электросети или помещать его
в недоступное место, будет не лишним провести небольшую проверку установлен
ной вами прошивки. Если вы решили провести такую проверку, не отсоединяйте
провода от контактов 3.ЗV и
запитывался от устройства
GND, чтобы выключатель Sonoff пока по-прежнему
Raspberry Pi. Попробуйте включить выключатель - при
этом должен загореться его светодиод.
Помимо той модели выключателя
Sonoff,
которую я использовал в этом рецепте,
в продаже имеется и множество других моделей, включая модели, которые вы
глядят как обычный выключатель освещения, но при этом обладают встроенным
модулем
Wi-Fi.
Дополнительные сведения
Подробнее о прошивке
Tasmota можно
После прошивки выключателя
рядке, описанном в рецепте
прочитать по адресу
Sonoff необходимо
18.4.
https://oreil.ly/aevZD.
произвести его настройку в по
Домашняя автоматизация
18.4. Настройка умного
на основе Wi-Fi
выключателя
1
519
Sonoff
Задача
Вы хотите подключить выключатель
Sonoff на основе Wi-Fi
к домашней сети
Wi-Fi.
Решение
Сначала установите на выключатель
цепте
18.3.
Tasmota, как описано в ре
Tasmota и запитаете
Raspberry Pi (модели 2 или более новой), либо
Sonoff
прошивку
Когда вы установите на выключатель прошивку
его либо от контакта 3 . ЗV устройства
от электросети непосредственно на месте установки, можно будет подключиться
к запущенной на нем беспроводной точке доступа и произвести его настройку. На
момент подготовки книги это нельзя было сделать с помощью устройства
Pi,
Raspberry
потому что на нем не отображается та стартовая страница беспроводной точки
доступа, которая открывается при подключении с компьютера на операционной
системе
macOS. Поэтому подключитесь к беспроводной точке досту
Sonoff-2500, используя компьютер с операционной системой
macOS или даже смартфон (рис. 18.14 ).
Windows
или
па с названием вида
Windows
или
Scan for wifi networl<s
Wifi
АР1
ra - - - - - - - .1
1А1
ssrd ()
Save
Рис.
18.14.
Подключение выключателя
Sonoff
к сети
Wi-Fi
Вам будет предложено ввести учетные данные двух беспроводных точек доступа.
Однако, учитывая то, что в нашем случае имеется только одна точка доступа, либо
Scan for wifi networks (Поиск
сетей Wi-Fi), либо просто введите имя вашей точки доступа в поле APl SSID
(Идентификатор SSID точки доступа 1) и пароль в поле APl Password (Пароль
точки доступа 1), после чего щелкните по кнопке Save (Сохранить).
воспользуйтесь расположенной
вверху ссылкой
520
Глава
Выключатель
18
Sonoff
перезагрузится, и если учетные данные точки доступа были
введены правильно, после перезагрузки он подключится к вашей сети.
Теперь нужно определить IР-адрес выключателя Sotюff. Это можно сделать с по
мощью такого инструмента, как приложение
Discovery для iOS.
Fing
для
Android
или приложение
Как показывает скриншот, представленный на рис.
случае выключателю
Sonoff был
присвоен IР-адрес
'98
~
MONКМAKES_GUEST
о
-
6~
tost updote now
....
..,
□
~.
r+.,.
~
в моем
11:10
G
V
18.15,
192.168.1.84.
,с-
One~ OnePlusЗТ
OnePlus
OnePlusЗТ
192.168.1..6&
Smort Device
е
192.168.1.69
; 6:66.M:4D:OD
Googlie-Нome-Мini
Goog
92..1Ы1 70
Goog
Н-Мini
.&
>
>
)
5C:CF:7F:З8:69:C.C
:х:
:х:
Cisco
router086252
70:
192.168.1.100
вт
WfADevice
ВТ Вшinея Sn,ort НuЬ
192.168,1254
G
-:::-
)
:!а.-о8:б2:5З
...
~
О...iсм
Рмс.
18.15.
Определенке IР•адреса выключателя
Sonoff
Пояснение
После подключения к сети выключатель
Sonoff
переключится в другой режим
-
вместо полнофункциональной точки доступа на нем начнет работать подключен
ный к вашей сети веб-сервер, с по"dощью которот можно будет этим выключате
лем управлять. Чтобы подключиться к вt.'6-серверу, введите в адресной строке
Домашняя автоматизация
браузера IР-адрес выключателя
Sonoff на
любом компьютере, подключенном к ва
шей сети. Вы увидите веб-<;тра1tицу, показанную на рис.
Попробуйте воспользоваться кнопкой
1 521
18.16.
Toggle (Переключить) - щелчок на ней
Sonoff в противоположное состояние.
должен переводить светодиод выключателя
Если же выключатель
Sonoff уже
был встроен в вашу домашнюю систему и заnи
тывается от электросети, а не от устройства RaspЬerry
Pi, то
при этом должна вклю
чаться и выключаться та цепь, которая бьша к нему подключена.
OFF
.
.
_
. Toggie
-
\-
. .
.
.
Conso1e
Рмс.
18.16. Веб-стра1оща
выключатет~
Sonoff
Дополнительные сведения
В следующем далее реце,1те
18.5
объ.ясниется, как можно настроmъ такой выклю
чатель под использование протокола
MQTT II
реда.кrора
Node-RED.
18.5. Управление подключаемым к Интернету
выключателем Sonoff с помощью протокола МQП
Задача
Вы хоппе получить воз~южность управ..,1ения с помощью протокола МQТТ под
ключаемым к Интернеrу выключателем
настроили.
S\.1noft: который вы только что прошили и
522
Глава
18
Решение
Перед выполнением этого рецепта вы должны установить на выключателе
рекомендуемую здесь прошивку и настроить подключение к вашей сети
показано в рецептах
18. 3
и
Sonoff
Wi-Fi, как
18. 4.
Чтобы обеспечить возможность управления выключателем Sonoff на основе прото
кола MQTT, необходимо произвести настройку выключателя с помощью его веб
интерфейса. Введите IР-адрес выключателя
(см. рецепт
18.4)
и щелкните на кнопке
явится меню, показанное на рис.
-+
О
О
адресной строке браузера
(Настройка). На экране по
18.17.
1С
~
Sonoff в
Configuration
Ф Not58cln
+
't82.1e8.U4Jcn?
8onoff 8881с Module
SOnotr
Con f1gure W·F1
Conl1gurc
МQП
Configure Logg,ng
Configure Other
Cont,gure Template
Rese t Conf gurat on
Baci<up Conf1guratюn
Hestorc
Conf,guratюn
Ma1n Menu
Рис.
18.17.
Меню настройки прошивки
Щелкните на кнопке
Tasmota,
Configure MQTT
MQTT,
настройки параметров протокола
установленной на выключателе
(Настроить
показанное
В этом окне мы можем настроить выключатель
сервера (см. рецепт
18.1)
MQTT), чтобы
на рис. 18.18.
Sonoff
Sonoff
открыть окно
в качестве клиента МQТТ
и определить параметры подписки таким образом, чтобы
он понимал публикуемые нами команды на включение и выключение.
Домашняя автоматизация
8 8 8
~
➔
0
С
Sonoff • Conflgure МQТТ
О
1
523
+
х
Ф Not Secure 1192.168.1.84/mq?
о.
*
;.J
8
Sonoff Baslc Module
Sonoff
Save
Configuration
Sonolf-.Tиmo!A
Рис.
6,6,0
'Т1,..,
kend8
Окно настройки параметров протокола МQТТ в меню настройки прошивки
18.18.
Tasmota
Для этого здесь нужно изменить содержимое нескольких полей:
1.
В поле
Host
(Хост) введите IР-адрес устройства
Raspberry Pi,
на котором запу
щен МQТТ-сервер.
2.
В поле
Client
(Клиент) введите идентификатор sonoff_l. Окончание _1 мы добав
ляем здесь для того, чтобы в случае использования нескольких выключателей
Sonoff их
можно было отличить друг от друга. При желании вы можете исполь
зовать здесь более информативное имя,
bedroom_l_sonoff (выключатель
3.
Поля
User
(Пользователь) и
Sonoff в
-
например, с учетом места установки:
спальне
Password
1).
(Пароль) в нашем случае не используют
ся, потому что мы настроили МQТТ-сервер так, чтобы он не требовал лоrин и
пароль. Такой подход вполне оправдан, потому что злоумышленник все равно
не сможет получить доступ к выключателю, не получив сначала доступ к вашей
сети. Соответственно, не имеет значения, что вы введете в эти поля.
4.
В поле
Topic
(Тема) снова введите sonoff_l на тот случай, если в итоге у вас ока
жется несколько выключателей
Sonoff.
524
5.
1
Глава
18
Содержимое поля
FuU Topic
(Полное определение темы) оставьте без изме
нений.
Теперь щелкните на кнопке
Save (Сохранить)- выключатель
Sопоff перезагрузит
ся, чтобы внесенные изменения всrупили в силу.
Пояснение
Опробовать настроенный нами МQТТ-интерфейс можно из окна терминала. Введи
те следующую команду, чтобы включить светодиод выключателя
rnosquitto_puЬ
$
Теперь
-
-t onnd/sonoff_l/power -m 1
чтобы снова выключить светодиод
rnosquitto_puЬ
$
Sonoff:
-t onnd/sonoff_l/power -m
-
введите команду:
О
Если эти команды не работают, выполните их с параметром -d и проверьте, доходят
ли команды клиента до МQТТ ~рвера
Mosquitto.
Дополнительные сведения
В рецепте
18.6 будет показано,
Node-RED.
как можно дорабоrспъ этот пример под использова
ние редактора
18.6. Управление выключателем Sonoff
с помощью редактора
Node-RED
Задача
Вы хотите обеспечить управление прошитым вами выключателем
мощью ред!аКТОра
Sonoff
с по
Node-RED.
Решение
Настройте выключатель
в рецепте
18.5,
Sonoff под
использование протокола МQТТ, как описано
после чего создайте в редакторе
показано на рис.
Node-RED
поток с узлом D1qtt, как
18.19.
При желании вы можете имnoprnpoвan. используемый здесь поток, вместо тоrо,
чтобы создавать его с нуля 3 . До этого нужно воспользоватъся инструкциями, изло
женными в разд. «Пояснение» рецеппш
18.1.
Этот поток предполагает, что к контакту
Pi
будет включатъся на
3
25
разъема
GPIO
на устройспе RaspЬeny
будет подключена кнопка, по нажаrnю на которую беспроводной вЬ1ЮПОчатель
Cu. •ttps:Jl~·/vdZSb.
1О секунд и снова
выключаn,ся.
Домашняя автоматизация
Рис.
редактора
18.19. Поток
Node-RED для
13. /, и произвести
врецепте 17.3.
ном
Node-RED,
25
разъема
GPIO,
как описано
настройку для его использования в порядке, описан
Нам потребуются здесь два узла
редактора
525
включения на определенный интервал
При этом мы должны подключить кнопку к контакту
в рецепте
1
trigger
(триггер) из раздела
Function
(Функция)
так что перетащите в рабочую область два таких узла.
Один их этих узлов нужно настроить таким образом, чтобы в случае срабатывания
он отправлял значение
1,
выжидал четверть секунды (для устранения дребезга кон
тактов) и больше ничего не делал. Присвойте ему имя
ния) и настройте так, как показано на рис.
On trigger
18.20.
&atrlgger ....
у
noc»ptop1111111
then
~]f Mllllaec:011da
250
'---
0
extвnd dв1ау
lf IWW mess&gll 8mY8S
thenмnd
АМ8t
the 1rfgglw lf: • msg.reset ls set
• meg.paylo8d
Нanclk1g
l а11 messages
~N8rne
I Ontrwe,
Рис .
18.20.
Настройка узла
On trigger
(Триrтер включения)
(Триггер включе
526
1
Глава
18
В отличие от него, узел
Off trigger (Триггер выЮiючения) нужно настроить таким
1О секунд и после этого отправлял выЮiючателю
18.21 ).
образом, чтобы он выжидал
Sonoff значение
О (рис.
Теперь перетащите в рабочую область узел
кройте окно настройки этого узла (рис.
mqtt
18.22).
из раздела
Output
E'dlt trtgger node
Delete
Cancll
-
.., node prop8t1l88
Send
• notnlng
thln
о]
( walt for
□ ( s.co,a
о
thlnl81d
о]
8Xlllnd d8l8y lf ,_, ~ 8'1'М8
...
Rleet the 1l1gg8r lf: •
о
1Т11gJ88t ll 8lt
I-------
• m8g.p8yto8d eqUIII optlonal
Handllng
~Name
Рис.
18.21.
Настройка узла
Off trlgger
(Триггер выключения)
ldtt mqtt out node
C8nc8I
-
" node p,opentl8
QSlмr
rМyНomeдutomatlon_
■ Toplc
[ cmncl/lOl'IOff_1/ромr
QoS
о]
(2
~N8rne
_ _:]0
---
~Ret81n [
1Sonotf_1
[;::=.
toplc, qoa or retaln
Рис.
18.22.
]
о]
1
Ьlank lf you want to l8t them У1а ~
Настройка выходного узла
mqtt
(Выход) и от
Домашняя автоматизация
Щелкните здесь в поле
Server
(Сервер)
-
1
527
вам будет предложено добавить новый
МQТТ-сервер и задать такие его параметры, как имя (я решил использовать имя
MyHomeAutomation (МояДомашняяАвтоматизация)), IР-адрес (localhost) и порт
(1880). Исправьте также содержимое полей Topic (Тема) и Name («Имя»), как
показано на рис. 18.22.
Теперь можно подключить
рис.
18.19,
всё
в соответствии
При нажатии кнопки выключатель
спустя
1О
со схемой,
представленной на
и произвести развертывание потока.
Sonoff должен
включаться и снова выключаться
секунд.
Пояснение
Этот рецепт показывает, насколько далеко позволяет вам зайти редактор
RED,
Node-
не прибегая к написанию какого-либо кода. Воспринимая автоматизируемый
процесс в виде потока сообщений, этот редактор предоставляет вам действительно
удобный способ программирования.
Если вы хотите, чтобы ваше освещение включалось на определенное время при
срабатывании датчика движения, замените в используемой здесь схеме кнопку на
пассивный инфракрасный датчик движения (см.рецепт
13.9).
Дополнительные сведения
Более подробную информацию можно найти в полной документации по редактору
Node-RED4.
выключение различных приборов
с помощью расширения Dashboard
для редактора Node-RED
18.7. Включение и
Задача
Вы хотите обеспечить возможность включения и выключения освещения и других
домашних приборов с помощью смартфона.
Решение
Установите расширение
Dashboard
(Панель управления) для редактора
Node-RED
и добавьте в поток элементы пользовательского интерфейса, после чего перейдите
к созданной вами панели управления в браузере на своем телефоне.
Установить расширение
следующих команд:
4
См. https://nodered.org/docs.
Dashboard
для редактора
Node-RED
можно с помощью
528
Глава
18
sudo systemctl stop nodered.service
apt update
cd ~/.node-red
sudo apt install npm
$ npm install node-red-dashЬoard
$ sudo systemctl start nodered.service
$
$
$
$
После установки этого расширения в меню редактора
нительный раздел
dashboard
...,
Node-RED
с узлами элементов интерфейса (рис.
появится допол
18.23) .
dnhЬoard
Рис.
18.23.
Узлы расширения
dashboard в меню редактора
Node-RED
•
u1 coлtiol
4<
>
•
templa1e
"
~
Теперь мы можем использовать узел кнопки
заменить в схеме из рецепта
18.6
(buttoo)
из раздела
dashboard,
чтобы
физическую кнопку кнопкой, расположенной на
веб-странице. В результате мы получим поток, представленный на рис.
18.24.
При
Домашняя автоматизация
1
529
желании вы можете импортировать этот поток, вместо того чтобы создавать его
с нуля 5 . До этого нужно воспользоваться инструкциями, изложенными в разд. «По
яснение» рецепта
18.2.
• oonnec:ted
Рис.
18.24.
Поток для включения устройств на определенный интервал с помощью кнопки.
расположенной на веб-странице
Sonoff_l здесь настроены так же, как узлы Off triggeг (Триг
Sonoff_l в рецепте 18.6. Однако вместо входного узла грi gpio
Узел триггера и узел
гер выключения) и
здесь используется узел кнопки из раздела dasbboaгd (Панель управления) .
Поскольку для удаленного управления системой домашней автоматизации требует
ся много разных элементов интерфейса, отдельные узлы в разделе dasbboaгd объ
единены в группы, которые, в свою очередь, разнесены по нескольким вкладкам.
Вы можете определить собственные группы и вкладки при добавлении узла из раз
дела dasbboaгd в рабочую область. Это можно сделать на этапе редактирования
узла (рис .
18.25).
Как можно здесь видеть, я указал в поле Gгoup (Группа), что узел относится
к группе
Ligbts
(Освещение) вкладки
Home
(Дом) . Чтобы определить узел таким
образом, я перед этим создал новую группу и вкладку, сначала щелкнув на ссылке
Add new UI gгoup (Добавить новую группу элементов интерфейса), а затем - на
ссылке Add а new tab (Добавить новую вкладку). После создания новой вкладки и
группы они используются по умолчанию и вам не требуется создавать их снова при
добавлении каждого нового узла.
Чтобы узел кнопки включал освещение, при его настройке укажите в поле
(Полезная нагрузка) значение
ным узлом
1 ( см.
рис.
18.25)
Payload
и напрямую соедините его с выход
mqtt.
Теперь можно произвести развертывание потока.
Чтобы опробовать новый поток в деле, откройте браузер на своем смартфоне (или
на любом компьютере, подключенном к вашей сети) и введите IР-адрес устройства
Raspberry Pi, добавив к нему окончание : 1880/ui. Например, в моем случае этот
адрес выглядел следующим образом:
bttp://192.168.1.77:1880/ui.
18.26.
ся веб-страница с кнопкой, показанная на рис .
5
См. h«ps://oreil.ly/OYSDh .
На экране появит
530
Глава
18
Edlt Ьutlon node
c.nc.
...
..,, nodlpropenle8
G,oup
[
(Ноmе) Ughts
Е1
!iliSlz8
~ю,
k:on
I LIЬII
[~
о 'ТЬо/tlр
1optlonal tooltlp
6Coku
[ optlDn8I t.utllcon color
6Вlckc,'ound
[ optlon8I ~ color
&3 Whtll cllckld. lll'ICI:
Toplc
♦ 11 •9 1111- on lnput, ll'IIU
• • Ьutlon cllck: О
[ ~ 0n Вutton
Рис.
18.26.
Настройка узла
Llghta On Button
(Кнопка для включения освещения)
• ~
ф 192.168.1.77:1880/ul/#I/0?socketld
92\l 11 :58
(D
1
Horne
Llghts
LIGHTS ON
Рис. 18.26. Веб-страница с кнопкой, созданная
с помощью расширения Dashboard редактора Node-RED
Как только вы щелкнете на этой кнопке, выключатель
на
1О
Sonoff должен
включиться
секунд.
Пояснение
Помимо кнопки, позволяющей включать освещение на заданный временной про
межуток, вам может потребоваться и переключатель, позволяющий вручную вклю-
Домашняя автоматизация
чать и выключать освещение. На рис.
18.27
531
показано, как будет выглядеть поток
после добавления такого переключателя. Эту версию потока тоже можно скачать
с сайта
GitHub 6 •
Рис.
18.27. Добавление
V
в поток переключателя для включения/выключения освещения
-
node~
IIIIOraup
1
...
~_
•I0
!Ug
_ hll
_____
Е]
[ L.Wrt8 cwo,r
0
Too/llp
1optJoneJ tooltlp
lli1 loon
♦
Pua thou"1 .., lf peylolid matchll new lt8!8: а
!Sa Wh8n clckecl, lll'ld:
0n Paylold • е true
OlfPayloed • е
fllИ
Toplc
~Narnl
Рис.
6
18.28.
[ L.Wrt8 cwo,r
Настройка узла переключателя
См. https://oreil.ly/G6m8e.
Llghts On/Off (Включение/выключение
освещения)
532
1
Глава
18
Мы добавили здесь узел типа
switcb (flереключатель) и, как и узел кнопки, соеди
mqtt с именем Sonoff_l, чтобы, помимо времен
нили его с выходным узлом типа
ного включения све-:-'i кнопкой, его также можно было включать и выключать с по
мощью переключателя.
LigЬts
Как следует настроить параметры узла переключателя
On/Off (Включение/выключение освещения),
показано на рис.
18.28.
Произведите развертывание этого потока и перейдите на своем смартфоне на веб
страницу для управления освещением (с адресом вида Ьttp://192.168.1.77:1880/ui).
Вы
(рис.
увидите,
что
на
этой
странице
появился
дополнительный
переключатель
18.29).
~ ~ ~ 89%112:02
0
ф 192.168.1.77:1880/ul/#!/O?socketid
Home
,
..
lights
Llghts On/Off
,
• ',
.
Рис.
18.29.
'
;
·~
•
;
~
• LIGIOS ON TIMED
1 •
~
,
~
. '
1'
.
~
➔
~~
Веб-страница для управления освещением
Дополнительные сведения
Более подробную информацию по редактору
можно найти в его полной
Node-RED
документации 7 •
18.8. Выполнение запланированных действий
с помощью редактора Node-RED
Задача
Вы хотите обеспечить с помощью редактора
действий в заранее заданное время
-
Node-RED
выполнение определенных
например, ежедневное выключение всего
освещения в час ночи.
Решение
Воспользуйтесь в редакторе
Node-RED узлом
Нужный нам поток, представленный на рис.
из рецепта
7
18.6.
типа
18.30,
inject.
можно создать на основе потока
При желании вы можете импортировать этот поток, вместо того,
См. https://nodeгed.org/docs.
Домашняя автоматизация
Pllc. 18.30. Иаюльэованме узла тмпа inject для
1 533
выполненмя заnnанмрованных дeicnlмiii
чrобы создавап. его с ну~. До этого нужно воспользоваться инсч>укциями, при
веденными вра-зд. «Пояснение;; рецепта
18.2.
ntna switch, который обеспечивает включение и выключение выклю
Sonoff (и подключенного к нему освещения), здесь также используется узел
ntna inject (впрыскивание) с именем Апtо ОП, который насrроен таким образом,
чrобы он «впрыскивал>► в узел ntna mqtt с именем SопоП_ 1 сообщение со значени
ем О. Как следует настроИ1Ъ этот узел ntПa inject, показано на рис. 18.3 1.
Помимо узла
чателя
EdR 1111118Ctaod8
.., .... р ......
Тсрiс
Wldl.-.y
Slluldlly
._,.,__.а-,
.
811d"'81a8IJIIIЙC
-Clltn
. . . . . . . . . . . . . . . . 511J6hcura.
s. lnJo ьах fardlllilll.
Р11с..
18.31. Насqюi1а уэпа 111па inject для выпоnненмя ,1,eicnlмii
в заранее ~анное время
1
См. IIUps://eml.ly/EVCiX.
534
1
Глава
18
Пояснение
Если вы используете несколько выключателей
Sonoff,
подключенных к различным
приборам по всему дому, то можете обеспечить их одновременное выключение
путем веерообразной рассылки сообщения из одного узла типа
на рис.
inject,
как показано
18.32.
Рис.
18.32.
Выключение сразу нескольких устройств
Дополнительные сведения
Более подробную информацию по редактору
Node-RED
можно найти в его полной
документации 9 •
18.9. Публикация
МQТТ-сообщений
с помощью платы
Wemos D1
Задача
Вы хотите обеспечить с помощью недорогой программируемой платы с беспровод
ным подключением возможность публикации МQТТ-сообщений в ответ на такое
событие, как нажатие кнопки.
Решение
Используйте недорогую плату на базе контроллера
Wemos D1,
например, плату
совместно с адаптированным под этот контроллер программным обес
печением. На рис.
9
ESP8266 -
18.33
См. https://nodered.org/docs.
показано, как можно задействовать плату
Wemos D 1
и
Домашняя автоматизация
Рис.
18.33.
Плата
Wemos D1
«осьминожный» модуль кнопки
контактов
GPIO
с подключенным модулем
Squid Button,
1
535
Squid Button
подключив этот модуль к одному из
и используя внешний аккумулятор с интерфейсом
USB.
Нажатие кнопки ведет к публикации сообщения на МQТТ-сервере.
В этом рецепте вам понадобятся:
Wemos Dl mini (см. разд. «Модул и» прwюжения 1);
♦ модуль Raspberry Squid Button (см. разд. «Модулю) прwюжения 1);
♦ Внешний аккумулятор с интерфейсом USB или другой источник питания для
платы Wemos D 1
Чтобы плату Wemos D1 можно было программировать с устройства Raspberry Pi,
сначала установите на нем среду разработки Arduino IDE 10 и добавьте в нее под
держку контроллера ESP8266 11 .
Затем подключите к плате Wemos D1 модуль кнопки Squid Button или другой пере
ключатель , соединив его с контактом D6 и заземляющим контактом GND .
♦
плата
Для запуска используемого в нашем случае скетча (так называют программы для
Arduino)
в среду разработки
с протоколом
MQTT.
Arduino IDE
надо добавить библиотеку для работы
Скачайте эту библиотеку в виде ZIР-файла , используя сле
дующие команды :
$
cd
~
$ wget
h ttp s : //gi th uЬ . com/kn ol le a r y/puЬ s uЬcli e nt/archive/mast er . zi p
Arduino IDE. В меню Sketch (Скетч) выберите
Include Library (Подключить библиотеку) , а затем - пункт Add ZIP
Library (Добавить ZIР-библиотеку) . Выберите в открывшемся окне только что ска
Теперь откройте среду разработки
пункт
чанный вами файл master.zip, и эта библиотека будет установлена .
10
См . https://oreil.ly/ERqLM.
11
См. https: //oreil.ly/zGOpК.
Глава
536
18
При желании вы можете скачать используемый здесь скетч для
описанном в рецепте
и внутри него
-
3.22. Найдите в каталоге
каталог ch_17_web_switch.
Arduino
в порядке,
arduino
с примерами кода каталог
Примечание от русской редакции
К сожалению, нам не удалось найти в составе примеров кода, сопровождающих эту кни
гу на сайте GitНub, каталог arouioo с каталогом ch_tl_web_switch. Очевидно, автор книги
пока
ero туда
не выложил
...
Щелкните на файле скетча ch_17_weЬ_switch.ino, 'Побы открыть его в среде разра
ООll(И
Arduino IDE.
Укажите в настройках rnп платы
Wemos D1
и последователь
ный порт /dev/ttyUSВO.
Перед тем как заrрузить скетч на пла1),., вы должны внеспt в него несколько изме
нений. Найдите в начале скетча след)'ющие строки:
ccшst char* ssid = "your wi fi access point r,аше";
const char• pa.ssvord = "your wi fi pass,юrd";
const char• mqtt_server = "your МQТТ IP address";
и подставьте вместо текста в кавычках надлежащие значения констант
И
ssid, password
mqtt_server.
После этого щелкните в окне среды разрабоп.:и
Arduino IDE
на кнопке
Upload
(Заrрузка).
По окончании процесса проrраммирования плату
читъ от устройсп,а RаsрЬепу
Pi
Wemos
уже можно будет 011U1ю
и за.питать о·г какого-либо иного источника
пример, от внешнего аккумулятора с интерфейсом
USB.
-
на
Однако, поскольку скетч
выводит полезН)-10 отладочную информацию, лучше не оnшючайтесь от RaspЬeny
Pi,
пока не убедитесь в том, что все работает должным образом. Для просмотра
этой информации откройте в среде разработки
дователыюго порта (рис.
Arduino IDE
окно монитора после
18.34).
,.
П comectюn ...JIQП
Nе'М11!е
Pllc. 18.34. f1росмотр ~МI,
9li00Ьaud
ВЫIВОАIUЮМ матом
Wemos,
с 1Ю1ЮЩЫО мон~пора nосле.дователыюrо порта
Чlобы протесmроватъ запро11>аммированН)ю вами плату, запусппе на уС1рОйспе
RaspЬeny
Pi окно терминала
нажатия ююпки:
и введите след)'ющую кома.иду, чтобы подписатьси на
Домашняя автоматизация
$
IIIOSqUitto_suЬ
Client
Client
Client
Client
Ьutton_l
-d -t
IYЮsqsuЬ/5007-raspberryp
mosqsuЬ/5007-raspberryp
mosqsuЬ/5007-raspberryp
IYЮsqsuЬ/5007-raspЬerryp
(mid: 1):
SuЬscriЬed
1 537
sending CONNEC'Г
rece1ved CONNACK
sending SUBSCRIBE (Mid: 1, Topic: button_l, QoS:
received SUВACK
О)
О
Client
mosqsuЬ/5007-raspberryp
ВUtton
1 pressed
received
PUВLISH
(dO, qO, rO, mO, 'button_l',
(16 bytes))
Теперь при каждом нажатии кнопки в окне терминала должно появляться сообще
ние
Button 1 pressed
(Нажата кнопка
I ).
Пояснение
Поскольку эта книга посвящена платформе RaspЬerry
Pi,
а не платформе
Arduino,
мы не станем подробно рассматривать используемый здесь код скетча на языке
Arduino С.
Этот скетч представляет собой доработанную версию скетча mqtt_Ьasic, поставляе
мого в качестве примера вместе с библиотекой PuЬSuЬClient. Помимо уже упомяну
тых
:rpex
'-"ТJЮК с параметрами доступа к сети
Wi-Fi,
важную роль в этом файле
играют и следующие две строки:
const char* topic = "buttor._l";
const char* message = "Bt1tton 1 pressed";
Эти
строкн определяют тему
и
текстовое содержимое
сообщений. При желании вы можете подключить к плате
публикуемых
Wemos D 1
МQТТ -
несколько
кнопок и привязать к каждой из них сообщения с разной темой и содержимым.
Дополнительные сведения
В рецепте
18. / О
объясняется, как настроенную вами плату
пользовать совместно с редактором
В заве
19
Wemos D 1
можно ис
Node-RED.
мы еще вернемся к теме использования таких устройств, как плата
Wemos Dl.
18.1 О. Управление платой Wemos D1
с помощью редактора Node-RED
Задача
Вы хотите добавить плату
редактора
Node-RED.
Wemos 01
с подключенной к ней кнопкой в поток
Глава
538
18
Решение
В этом рецепте вам пригодится опыт, полученный при выполнении предыдущих
рецептов этой главы.
В качестве основы примера мы здесь применим плату
та
18. 9
в потоке редактора
Wemos
с кнопкой из рецеп
обеспечивающем включение и выключение
Node-RED,
Sonoff (см.рецепт 18. 4).
беспроводного выключателя
Как в этом случае будет выглядеть поток редактора
рис.
18.35.
Node-RED,
показано на
При желании вы можете импортировать этот поток, вместо того чтобы
создавать его с нуля, воспользовавшись инструкциями, изложенными в разд. «По
яснение>> рецепта
18.2.
Trigger
Рис.
Узел
18.35.
Поток редактора
Button 1
для беспроводного включения и выключения освещения
(Кнопка
общения от платы
рис.
Node-RED
!) представляет собой узел типа mqtt, подписанный на
Wemos Dl. Как следует настроить этот узел, показано
со
на
18.36.
Обратите внимание на то, что в поле
(кнопка!). Узел
Toggle
Trigger
Topic
(Тема) нужно указать тему
(Триггер) работает здесь так же, как в рецепте
button_l
18.6. Узел
(Переключение) выглядит более интересно: этот узел запоминает значение,
которое может быть нулем или единицей, и переключается от нуля к единице и
Edlt mqtt ln nod8
Delete 1
V
1
С8Лсеl
11111
nod8 propertle8
gServer
[ MyНomeAutometlon
IITopk:
1button_1
eaos
[2
"Name
1Вutton 1
Рис.
18.36.
:]0
1
:]
Настройки узла
Button 1
(Кнопка
1)
Домашняя автоматизация
1
539
наоборот при каждом прохождении через него сообщения . Реализовать такое пове
дение можно с помощью универсального узла типа function (функция), добавив
в него немного JavaScript-кoдa, запоминающего состояние и производящего пере
ключение между нулем и единицей. Настройки этого узла, включая используемый
код, показаны на рис.
18.37.
Эта функция может вам пригодиться и в друг11х проектах.
l!dlt fwlctlon nod8
.. .
Сапсе1
Delete
node prop8l'tl88
V
~ Name
]
[ Togg~
2:)
~ Fu,ctlon
1
2
3
4
5
6
х:
l!:]
var i=context.get('i'J JI е;
var payload=msg.payload;
context.set("i",Math.abs(i-payload));
var payload=msg.payload;
msg.payload=i;
return msg;
1:1
Outputs
See the lnfo tab for help wrltJng functlons.
Рис .
18.37.
Функция
Toggle
(Переключение)
Пояснение
Редактор
Node-RED -
очень мощный инструмент, позволяющий быстро создавать
системы домашней автоматизации . Если раньше вы использовали обычный язык
программирования,
визуальный
подход этого
редактора
может
показаться
вам
непривычным. Однако когда как следует с ним освоитесь, вам не захочется воз
вращаться к обычному подходу с написанием большого количества кода.
В меню редактора
Node-RED
имеется и много других интересных узлов, поэтому
потратьте некоторое время на изучение того, что вам предлагает редактор . Вы мо
жете просматривать информацию о назначении каждого узла, поочередно наводя
на них курсор мыши. Для более подробного ознакомления любой узел можно пере
тащить в рабочую область и попробовать использовать в потоке.
Дополнительные сведения
Более подробную информацию по редактору
документации 12 .
12
См. https://nodered.org/docs.
Node-RED
можно найти в его полной
ГЛАВА
Raspberry Pi Pico
и
19
Pico W
19.0. Введение
Хотя стандартная ве~х:ия мини-компькrrера RаsрЬепу
Pi
идеально подходит для тех
проектов, где требуется подключение к сети и графический пользовательский
интерфейс, в силу более высокого энергопотребления и отсутствия аналоговых
входов
она
часто
становится
менее
предпочтительным
с более простыми микроконтро1mерными платами вроде
вариантом
Arduino
по
сравнению
или RаsрЬепу
Pi
Pico.
Модель RаsрЬепу
Pi Pico
имеет ряд серьезных отличий от любой другой модели
мини-компьютера RаsрЬепу
Pi:
♦ отсутствукrr интерфейсы для подключения клавиаrуры, мыши или дисплея;
♦
сравнительно небольшой объем флеш-памяти для хранения программ
2
♦
Мбайт (нет слота для карт формата
частота процессора составляет лишь
microSD)
133
и
264 Кбайт оперативной
-
всего
памяти;
МГц, в то время как модель RаsрЬепу
Pi 4 работает на частоте 1,2 ГГц;
♦ отсутствует операционная система. Вследствие этого роль операционной систе
мы здесь выполняет язык
MicroPython,
и вы можете получить лишь тот резуль
тат, который отображается в консоли языка
Python.
Вы можете спросить: зачем вообще использовать устройство, возможности которо
го выглядят бледно даже по сравнению с RаsрЬепу
Дело в том, что модель
Pico
(рис.
19.1)
Pi Zero?
стоит еще дешевле, чем модель
Zero,
и об
ладает рядом преимуществ в nлане взаимодействия с внешней элекrроникой по
сравнению с моделью RаsрЬепу
♦
Pi 4.
В частности, можно m-метить следующее:
наличие трех аналоговых входов делает подключение аналоговых датчиков на
много более простым, чем в случае использования стандартной ве~х:ии RaspЬer
ry Pi;
♦ длительность импульсов на шести имеющихся ШИМ-выходах рассчиrывается
аппаратно,
что обеспечивает намного более точное ШИМ-управление, чем
в случае использования стандартной ве~х:ии RаsрЬепу
Pi,
и позволяет гораздо
лучше справляться с управлением сервоприводами;
♦
использование встроенного источника питания обеспечивает широкий диапазон
допустимого напряжеНИJ1 питания: от
1,8
до
5,5
В. Благодаря низкому уровню
Raspberry Pi Pico
Рис.
19.1.
энергопотребления устройство
Устройство RaspЬerтy
Pico
и
Pico W
1
541
Pi Pico
может часами работать от пары батареек
типа АА.
Модель RaspЬeny
как у модели
Pi Pico W (рис. 19.2), при той же схеме расположения выводов,
Pico, дополнительно снабжена модулем Wi-Fi и Bluetooth (металличе
ский прямоугольник в правой части rшаты), что позволяет использовать эту модель
в проектах, требующих подключения к сети. Оставаясь сравнительно дешевой,
модель
Pico W всё же стоит значительно дороже,
Рис.
19.2. Устройспю
Далее в этой главе устройства RaspЬeny
как «устройства
Pico» (за
«устройства RаsрЬеП)'
Pi».
RaspЬerтy
Pico.
Pi Pico W
Pi Pico и Pico W будут упоминаться просто
rex случаев, где важно учитывать различЮI
устройства RaspЬerry Pi 4 и 400 просто как
исключением
между этими моделями), а обычные
чем модель
Глава
542
19
19.1. Подключение устройства Pico
или
Pico W
к компьютеру
Задача
Вы хотите подключить устройство
с операционной системой
Windows
Pico (Pico W) к Raspberry Pi или к компьютеру
macOS с тем, чтобы его можно было запро
или
граммировать.
Решение
В число предустановленных программ в
Thonny,
Raspberry Pi OS входит
Pico и Pico W.
в который встроена поддержка устройств
Руthоn-редактор
Если вы еще не
использовали этот редактор, запустите его, открыв в меню устройства
раздел
Programming
Raspberry Pi
(Программирование) и выбрав соответствующий ярлык.
Чтобы настроить редактор
Thonny
для использования устройства
его окно в стандартный режим (см. рецепт
После этого выберите в меню
Tools
5.3),
Pico,
переведите
чтобы получить доступ к меню.
(Инструменты) пункт
перейдите в открывшемся окне на вкладку
Options (Параметры) и
Interpreter (Интерпретатор) (рис. 19 .3 ).
х
Thon'1y opt ons
General lnterpreter Editor
Тheme & Font
Run & DeЬug Tennlnal
8h11 Alllltillt
Which interpreter or device should Тhonny use for running your code?
МlcroPython (RaspЬeny Р1 Plco)
The same interpreter which runs lhonny (default)
Altemative Python Э interpreter or virtual environment
Remote Python З (SSH)
MicroPython (local)
MicroPython (SSH)
,_i_
cr_
o:Ь
=i-=
t) ,__ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 1
MicroPython (BBC_m
Р, Рюо - - - - - - - - - - - - - - - - - - -•
M1cro
on Ras
MicroPython (ЕSРЗ2)
MicroPython (ЕSР82бб)
MicroPython (generic)
CircuitPython (generic)
А special virtual environment (depR'!Cated)
lnstall or update firmware
ок
11 Cancel 1
Рис. 19.З. Выбор версии интерпретатора, рассчитанной на устройства
Выберите из раскрывающегося списка вариант
в
качестве версии
интерпретатора,
Pico
MicroPython (Raspberry Pi Pico)
которую должен
использовать редактор,
и
на
жмите кнопку ОК. После этого откроется окно с предложением установить на ваше
устройство
Pico
интерпретатор языка
MicroPython
(рис.
19.4).
Чтобы сделать это,
Raspberry Pi Pico
и
Pico W
1
543
необходимо с помощью соответствующего кабеля подключить разъем
micro-USB
Raspberry Pi. При подключе
нии удерживайте в нажатом состоянии кнопку BOOTSEL, расположенную с верх
ней стороны платы устройства Pico. Тем самым вы переведете устройство Pico
в режим загрузки, позволяющий редактору Thonny установить на него интерпрета
тор языка MicroPython.
устройства
Pico
к одному из USВ-портов устройства
Here you сап install or update MicroPython firmware оп Raspberтy Pi Pico.
1. Plug in your Pico while holding the B0OТSEL button.
2. Wait until device information appears.
3. Click 'lnstall'.
When the process finishes, your Pico will Ье running the latest version of
MicroPython. Close the dialog and start programming!
Version to Ье installed: vl .18 (2022-01-17)
Target device location: /media/pi/RPI-RP2
Target device model:
Raspberтy
Pi RP2
1 lnstall
Рис.
19.4.
Установка интерпретатора языка
По нажатию на кнопку
Install
на устройство
(Установить) на устройство
прошивка с интерпретатором языка
полнить для устройства
MicroPython
11 Cancel
Pico только
MicroPython.
Pico
Pico
будет установлена
Эту операцию нужно будет вы
один раз.
Переустановка прошивки
Иногда после манипуляций с прошивкой устройство
Pico
перестает подавать признаки
жизни, и создается впечатление, что оно вышло из строя. В таком случае следует пере
установить на нем исходную прошивку, тем самым как бы сбросив его к заводским
настройкам.
•
Для этого нужно скачать версию прошивки, специально предназначенную для модели
Pico
или
Pico W.
Перед выполнением этой операции отключите устройство
(или компьютера).
Pico (Pico W)
от устройства
Raspberry Pi
Работая с
моделью Pico W, перейдите по адресу https:1/rpf.io/pico-w-firmware. При
этом автоматически начнется загрузка файла прошивки с расширением uf2, предназна
ченного для модели
Pico W.
Имя дело с базовой моделью
Pico,
следует скачать файл, размещенный по адресу
https:l/oreil.ly/q0n4e.
После этого снова подключите устройство
Raspberry Pi
(рис. 19.5).
Pico
к одному из USВ-портов устройства
с помощью USВ-кабеля, удерживая в нажатом состоянии кнопку
BOOTSEL
544
1
Глава
19
Кнопка BOOТSEL
Рмс.19.5. Кнопка
Когда вы оmустите кнопку
стве RaspЬeny
Pi
BOOTSEL,
BOOTSEL
устройство
как USВ-накопитель (рис.
19.6,
Pico (Pico W)
IIPtRP:i
Do r.,a:t!;
fJe Edil
\'iм
смонтируется на устрой
слева).
SOrt Go Tooll
......,.,.,,.
.Uus,c
1'1а18а
Р\Ь1iс
Рис.
19.6. ГlеретаСО1ванме
новой прошмво~ на усrроiспю
Pico (Pico W)
Перетащите или скопируйте через буфер обмена в файловую сист-ему устройства
(Pico W) тот файл
с расширением
uf2,
который вы скачали ранее (рис.
19.6,
Pico
справа).
По завершении процесса копирования устройство
rотово к выполнению nроrрамм на языке
Pico (Pico W) размонтируется и будет
MicroPython с помощью редактора Thonny.
Если у вас не получается установить прошивку с устройства RаsрЬепу
показано, попробуйте установить редактор
системой
тера.
Windows
или
macOS
Thonny
Pi,
как здесь
на компьютере с операционной
и затем прошить устройство
Pico
с этого компью
Raspberтy
Pi Pico и Pico W
545
1
Пояснение
Когда вы запустите процесс установки интерпретатора
Pico (Pico W),
занной версии языка
те
19.2,
MicroPython
на устройство
во флеш-память этого устройства будет записан интерпретатор уре
Python 3
с названием
MicroPython. Как
Pico консоль
это позволит вам запускать на устройстве
показано в рецеп
языка
Python
и ко
пировать на него Руthоn-программы для последующего их выполнения во флеш
памяти устройства.
Несмотря на то что
MicroPython
является урезанной версией языка
Python 3,
в ней
будет работать большая часть тех рецептов, которые МЬ1 рассмотрели в главах
5-7.
Кроме того, вы также можете использовать библиотеки, специально предназначен
ные для 1U1атформы
Pico, чтобы,
например, управлять контактами разъема
GPIO.
Дополнительные сведения
Работа с редактором
Thonny
рассматривается более подробно в рецепте
5. 3.
19.2. Использование консоли языка Python
на устройстве Pico
Задача
Настроив редактор
Thonny для
использования устройства
на нем интерпретатор языка
устройстве консоль языка
MicroPython,
Python.
Pico (Pico W)
и установив
вы теперь хотите запустить на этом
Решение
Как только редактор
MicroPython,
Thonny
загрузит на устройство
интерпретатор языка
Pico
в нижней части окна редактора появится область консоли (рис.
В этой области вы увидите приглашение командной строки
о том, что это командная строка языка
Python,
>>>,
19.7).
говорящее нам
с помощью которой вы можете вво
дить и выполнять любые инструкции этого языка. Важным моментом здесь являет
ся то, что такие инструкции будут выполняться на устройстве
стве
Pico,
а не на устрой
Raspberry Pi.
Устройство
такту
25
Pico
обладает встроенным светодиодом, который подключается к кон
разъема
команд языка
GPIO. Этот светодиод можно включать и выключать с помощью
Python, представленных на рис. 19.7. При этом сначала нужно импор
тировать класс Pin из модуля machine и создать новый экзем1U1яр этого класса, закре
пив его за контактом
этого уже
можно
25 GPIO
приступить
(включить) и off (выключить).
и указав, что это выходной контакт (Pin.ouт). После
к управлению
светодиодом,
используя
команды
on
546
Глава
19
File Edit View Run Tools
Неlр
Е1 EIEIEIФ СЭ
1
1
MicroPython vl.18 on 2022-01-17; Raspberry Pi Pico
with RP2040
Туре "help(J" fог more information.
>>> frOII machine illport Pin
>>> led = Pin(25, Pin.Olff)
>» led.on()
»> led.off()
>>>
MicroPython (Raspbeпy Pi Pico)
Рис.
19.7.
Использование консоли языка
Python
на устройстве
Pico
Пояснение
Модуль machine представляет собой модуль языка
модействие с аппаратным обеспечением
MicroPython, реализующий взаи
устройства Pico. Команды этого модуля
работают не совсем так, как команды модуля gpiozero, с помощью которого выпол
няется управление контактами обычного устройства
Raspberry Pi. В качестве при
19 .1 проводится сравнение только что показанной программы для
Pico (см. рис. 19. 7) с аналогичной программой из рецепта 11.1, исполь
мера в табл.
устройства
зующей модуль gpiozero.
Таблица
19.1. Использование языка MicroPythoп на устройстве Pico
Raspberry Pi
в сравнении с использованием модуля gpiozero на устройстве
MicroPython
gpiozero
from machine import Pin
from gpiozero irnport LED
led ; Pin (25, Pin.OUT)
led; LED(l8)
led.on ()
led.on()
led.off ()
led.offl)
Как видите, эти две программы очень мало отличаются друг от друга. Различие со
стоит главным образом в том, что в случае модуля gpiozero контакт разъема
GPIO
представлен с помощью класса LED (светодиод), а режим его использования (в каче
стве выхода) определяется путем логического вывода, что избавляет вас от необхо
димости явно указывать этот режим при создании экземпляра класса, как это дела
ется в программе для устройств
Pico,
использующей модуль языка
MicroPython.
Raspberry Pi Pico
и
Pico W
1
547
Поскольку в примерах кода для этой главы книги используется исключительно
язык
MicroPython,
а не обычная версия языка
Python, как во всех остальных ее
3.22) эти примеры выделены в от
программы на языке MicroPython можно
главах, в архиве с примерами кода (см. рецепт
дельный каталог
Содержащиеся в нем
pico.
открывать и запускать в редакторе
Thonny.
Дополнительные сведения
Более подробную информацию можно найти в полной документации по языку
Micr0Python 1.
19.3. Использование устройства Pico
совместно с макетной платой
Задача
Вы хотите использовать устройство
Pico совместно
с беспаечной макетной платой.
Решение
Купите комплект макетной платы
kes 2
или
от компании
Discovery Ki
Electronics Kit 1 for Pico от компании MonkMaKitronik 3 . Оба эти комплекта содержат беспаеч
ную макетную плату, соединительные провода и другие компоненты, позволяющие
быстрее освоиться с использованием устройства
плекта от компании
(рис.
19.8),
MonkMakes
Pico.
На макетной плате из ком
указаны обозначения контактов устройства
Pico
что облегчает подключение к ним других компонентов.
Пояснение
Приобретение комплекта макетной платы позволит вам сэкономить время и деньги
за счет того, что вам не придется покупать необходимые компоненты по отдельно
сти. Особенно полезным приобретением станет комплект, включающий в себя
макетную плату с обозначениями контактов устройства
На устройствах
Raspberry Pi Pico
и
Pico W
используется одинаковая схема распо
ложения контактов, которая представлена на рис.
Каждый из контактов
GPIO
Pico.
19 .9.
здесь обозначен буквами
GP,
за которыми следует но
мер контакта. Многие из этих контактов также несут некоторую дополнительную
функцию
-
интерфейсов
наприме~, служат для использования различных последовательных
(UART, 1 С, SPI).
Некоторые контакты также могут быть задействова
ны в качестве аналоговых входов
1
См. https://oreil.ly/ebODv.
2
См. https://oreil.ly/5gav8.
3
См. https://oreil.ly/vP23M.
(см.
рецепт
19. 7).
Поэтому при подключении
Рис. 19.8. Специализированная макетная плата
с обозначениями контактов устройства Pico
Интерфейсная шина
Аналоговый вход
Raspberry Pi Pico
и
Pico W
Схема расположения контактов
1
G-
19.9.
•J
8
устройств
Рис.
Управление
Питание
1О
-
~
Q)
;,
~
Raspberry Pi Pico
таких простых
как светодиоды
компонентов,
и
Pico W
и переключатели, я стараюсь в пер
вую очередь занять не имеющие дополнительного назначения контакты
7,8,9, 10, 11, 12, 13, 14, 15,20,21
1 549
GP 2, 3, 6,
и22.
Дополнительные сведения
Использование макетной платы совместно с обычным устройством
рассматривается в рецепте
Устройства
г,1ав
9-14,
Pico
Raspberry Pi
10. 9.
также можно использовать в значительной части рецептов из
поэтому сейчас будет не лишним снова просмотреть содержимое этих
глав.
19.4. Использование цифровых
выходов устройства
Pico
Задача
Вы хотите задействовать цифровой выход устройства RaspЬerry
Pi Pico
или
Pico W -
например, для управления светодиодом.
Решение
Используйте юtасс Pin из модуля machine языка
MicroPython,
проследив за тем, что
бы общий потребляемый ток для всех контактов не превышал
50
мА.
Давайте еще раз взглянем на схему расположения контактов, представленную на
19.9. В качестве цифровых выходов здесь
GPIO, при этом контакты 12, 13, 14, 15 и 16
рис.
м01уr использоваться все контакты
обладают тем преимуществом, что
находятся ближе других контактов к свободным рядам отверстий макетной платы
при расположении устройства
Pico
вплотную к ее верхнему краю.
Давайте подключим светодиод к контакту
ляющий контакт устройства
Pico (G
или
16 устройства Pico (рис. 19. 1О). Зазем
GND) при этом следует подсоединить
к отрицательной шине питания макетной платы, к которой также нужно подсоеди
нить короткий отрицательный вывод светодиода. Положительный вывод светодио
да подключите к контакту
ем
470
16
через токоограничивающий резистор с сопротивлени
Ом.
В рецепте
19.2
мы уже видели, как можно настроить контакт в качестве цифрового
выхода и прои:шодить его включение и выключение. используя методы класса
Поэтому представленный далее код программы
жен выглядеть для вас очень знакомо:
from machine import Pin
from utime import sleep
led = Pin(lб, Pin.OUT)
while Тrue:
led.on()
sleep(0.5) # пауза
ch_ 19_Ыink.py
из каталога
pico
Pin.
дол
Глава
550
19
led.off()
sleep(0.5)
При желании вы можете скачать этот пример кода в порядке, описанном в рецеп
те
3.22.
В отличие от обычной версии языка
Python,
в языке
MicroPython
функция sleep
находится не в модуле time, а в модуле utime. При этом она работает точно так же,
выдерживая в нашем случае паузу в полсекунды.
1~
G
2
3
4
5
G
б
7
8
l1i
111
12
J13
G
14
15
30
А
Рис.
19.1 О.
В
С
D
Е
Подключение к устройству
F G
Pico
Н
I
J
светодиода с добавочным резистором
Пояснение
Общий потребляемый ток всех контактов
шать
50
GPIO
устройства
Pico
не должен превы
мА. То есть токи всех цепей, подключенных к контактам
давать в сумме не больше
50
мА. При подключении к контакту
GPIO, должны
GPIO светодиода
всегда следует использовать добавочный токоограничивающий резистор. В про
тивном случае через светодиод может протекать слишком большой ток, что может
Raspberтy
вывести из строя устройство
Pico
Pi Pico
и
Pico W
1
или как минимум используемый контакт
551
GPIO.
Индикаторные светодиоды обычно обеспечивают максимальный уровень яркости,
когда сила тока находится в районе
15
мА. Следовательно, мы можем подключить
мА (да
к устройству
светодиода, каждый из которых будет потреблять
вая в сумме
при этом у нас еще останется небольшой запас потребляемо
Pico три
45 мА), и
15
го тока. Однако современные светодиоды повышенной яркости могут хорошо све
тится уже при токе в
5 мА
и сносно
-
1 мА.
при токе в
При подключении светодиода через добавочный резистор, как показано на рис.
19.10,
сила протекающего через него тока определяется по следующей формуле:
1 = (3,3 где Ипр
Ипр)/R,
прямое падение напряжения на светодиоде, которое зависит главным
-
образом от цвета светодиода и в случае красного светодиода обычно составляет
около
2 В.
Буквой
R здесь обозначено сопротивление резистора в омах.
Например, для красного светодиода, у которого Ипр составляет
с сопротивлением
470 Ом
2
В, и резистора
сила тока будет равна:
(3,3 -2) / 470 = 0,00276
А=
2,76
мА.
Сопротивление резисторов выбирается из стандартного ряда значений, где наибо
100, 270, 470 и 1000 Ом (1 кОм). Еще больше
лее распространенными являются
усложняет сиrуацию тот факт, что напряжение Ипр равно указанной величине при
токе в
20
мА и немного уменьшается при более низком токе. Чтобы вы могли обой
тись без математических расчетов, в табл.
19.2
показано, каким должно быть со
противление добавочного резистора при использовании различных светодиодов.
Таблица
19.2.
Рекомендации по выбору добавочного резистора для светодиода
Цвет светодиода
Сопротивление добавоч-
Приблизительная
ного резистора
сила тока
Красный
(Unp
= 1,8)
100
Красный
( Иnр
= 1,8)
270 Ом
6
мА
470
Ом
3
мА
100
Ом
13
270
Ом
5
мА
470
Ом
3
мА
100
Ом
11
270
Ом
4
мА
100
Ом
4
мА*
Красный, оранжевый
(Unp
= 2,0)
Ом
15
мА
мА
1
1
Желтый, зеленый
(Unp
Синий, белый (Uпр
= 2,2)
1
i
= 3,5)*
мА
1
* В случае синего или белого светодиода прямое напряжение больше, чем напряжение питания, что
теоретически позволяет обойтись без резистора, однако даже в этом случае будет лучше подключить
резистор с сопротивлением 100 Ом, чтобы не допустить потребление слишком большого тока.
1
552
Глава
19
Дополнительные сведения
Подключению светодиодов к контактам
GPIO также
посвящен рецепт
11.1.
Определить, каким должно быть сопротивление добавочного резистора, можно
с помощью одного из множества имеющихся в сети онлайн-калькуляторов. В част
ности, неплохой калькулятор можно найти по адресу
https://oreil.ly/3zv6j.
Как определяется сопротивление резистора по нанесенным на него цветным полос
кам, можно узнать по адресу
https://oreil.ly/NDwXk.
19.5. Использование цифровых входов устройства Pico
Задача
Вы хотите подключить к устройству RаsрЬепу
Pi Pico
или
Pico W
переключатель
или другой источник цифрового сигнала.
Решение
Подключите переключатель (или другой источник цифрового сигнала) к своему
устройству
Pico
и используйте класс Pin для настройки контакта в качестве цифро
вого входа и чтения подаваемого на него сигнала.
Сначала давайте подключим переключатель между одним из заземляющих контак
тов устройства
Pico (GND) и
19 .1 1.
контактом
16.
Как это можно сделать на макетной
плате, показано на рис.
Обратите внимание на то, что в примере, показанном на рис.
19 .11,
используется
кнопка с двумя выводами. При использовании переключателя с четырьмя вывода
ми его можно разместить в том же ряду макетной платы таким образом, чтобы два
его вывода находились в одной ее половине, и два
-
в другой.
Приведенная далее программа ch_19_digital_input.py циклически считывает входной
цифровой сигнал с контакта
16
и выводит на экран О или
1-
в зависимости от
того, нажата кнопка или нет. Откройте эту программу в редакторе
Thonny
и попро
буйте запустить ее на выполнение:
from
Pin
sleep
шachi.ne iвport
from utiJDe
switch =
iвport
Pin(lб,
Pin.IN, Pin.PULL_UP)
while Тrue:
print(switch.value())
sleep(0.1)
При желании вы можете скачать этот пример кода в порядке, описанном в рецеп
те
3.22.
Raspberтy
Рис.
19.11.
Подключение переключателя к устройству
Pi Pico
и
Pico W
553
Pico
Пояснение
В этой программе мы присваиваем переменной switch экземпляр класса Pin, переда
вая этому экземпляру следующие три параметра:
♦
номер контакта;
♦
режим использования контакта;
♦
значение Pin. PULL UP
Третий параметр при этом производит интересное изменение в электрической цепи,
подключенной к контакту
GPIO
внутри устройства
Pico.
Он включает транзистор,
который активирует внутренний подтягивающий резистор (рис.
лением
20
кОм, подтягивающий напряжение на контакте
В отсутствие этого резистора контакт
GPIO
GPIO
19 .12)
с сопротив
к уровню в
3,3
В.
будет вести себя как «плавающий»
контакт, улавливающий, подобно антенне, все электрические шумы, что может вы
зывать случайные переключения между нулем и единицей, а это крайне нежела
тельно при использовании нашей кнопки. Наличие внутреннего подтягивающего
GP16- такими
GPIO устройства Pico.
резистора не является уникальной особенностью контакта
рами снабжены и все другие контакты
резисто
554
1
Глава
19
При нажатии кнопки контакт
GP\6
соединяется с «землей» (О В), что производит
намного более сильный эффект, чем действие подтягивающего резистора, и пере
ключает контакт
GP\6
с высокого уровня сигнала на низкий. Именно поэтому про
грамма ch_19_digital_input.py ведет себя немного нелогично, отображая О
жатии кнопки и
1-
-
при на
при ее отпускании.
3,3
В
Подтягивающий
резистор
GP16
Pico ___G_N_D__
Рис.
19.12.
IКнопка
Внутренний подтягивающий резистор
Дополнительные сведения
Пример подключения кнопки к контакту
рассматривается в рецепте
GPIO
обычного устройства
Raspberry Pi
13.1.
19.6. Использование аналоговых выходов (ШИМ)
устройства Pico
Задача
Вы хотите управлять яркостью свечения светодиода из Руthоn-программы, запу
щенной на устройстве
Pico
или
Pico W.
Решение
Для управления средним уровнем мощности, подводимой к светодиоду, восполь
зуйтесь на устройстве
Pico
функцией генерирования ШИМ-сигнала.
Чтобы опробовать на практике этот подход, подключите к устройству
ний светодиод, как описано в рецепте
19. 4,
Pico
внеш
или, если вам так больше нравится, ис
пользуйте встроенный светодиод устройства
Pico.
Если вы решили задействовать
встроенный светодиод, не забудьте заменить в представленной далее программе
(ch_19_pwm.py) контакт
16
from machine import Pin, PWM
from utime import sleep
led =
PWM(Pin(lб))
на
25:
Raspberтy
Pi Pico
и
Pico W
1
555
while True:
brightness _ str = input ("brightness (0-65534) : ")
brightness = int(brightness_str)
led.duty_ulб(brightness)
При желании вы можете скачать этот пример кода в порядке, описанном в рецеп
те
3.22.
Запустите эту программу в редакторе
Thonny.
В консоли языка
Python
появится со
общение, запрашивающее у вас значение яркости в диапазоне от О (выключенное
состояние) до
65 534
(максимальная яркость).
Пояснение
Широтно-импульсная модуляция (ШИМ) позволяет управлять яркостью свечения
светодиода за счет генерирования импульсов переменной длительности. Более под
робно суть этого метода объясняется в рецепте
11.3.
Чтобы обеспечить использование выходного контакта устройства в ШИМ-режиме,
мы просто обертываем экземпляр контакта в класс
PWM:
PWM(Pin(lб)). После этого
мы можем изменить скважность ШИМ-сигнала, используя для этого метод с не
совсем точным названием duty_ulб (здесь имеется в виду не
duty - долг, а duty
cycle - скважность). Вторая часть названия - ulб - расшифровывается как
unsigned 16 (беззнаковое 16-разрядное число). Хотя, строго говоря, максимальное
значение беззнакового 16-разрядного числа составляет 65 535, а не 65 534, мы ис
пользуем здесь значение 65 534, поскольку оно указано в качестве максимального
значения скважности в официальной документации устройства Pico.
Если
вы
пробовали
Raspberry Pi,
использовать
ШИМ-управление
на
обычном
устройстве
то могли заметить, что при этом яркость светодиода может немного
увеличиваться и уменьшаться. Такая нестабильность объясняется тем, что на обыч
ном устройстве Raspberry Pi ШИМ-управление реализуется программным образом,
и операционная система Raspberry Pi OS периодически переключается с генериро
вания ШИМ-импульсов на выполнение других задач. Большим преимуществом
устройства
Pico
является то, что ШИМ-управление реализуется на нем с помощью
специально выделенного для этой цели аппаратного обеспечения, что обеспечивает
абсолютно стабильное генерирование импульсов.
Дополнительные сведения
О том, как можно использовать ШИМ-управление на обычном устройстве
berry Pi, рассказывается
в рецепте
Rasp-
11.3.
19.7. Использование аналоговых
входов устройства
Pico
Задача
Вы хотие обеспечить измерение аналогового напряжения на устройстве
из программы на языке
MicroPython.
Pico (Pico W)
556
1
Глава
19
Решение
3,3 В к од
GPIO, также используемых в качестве аналоговых входов
(к контакту 26, 27 или 28), и задействуйте для измерения напряжения аналого
цифровой преобразователь (АЦП) устройства Pico.
Подключите источник напряжения с напряжением в диапазоне от О до
ному из контактов
Чтобы опробовать этот рецепт на практике, давайте подключим к контакту
26
под
строечный резистор (переменный резистор или потенциометр), что позволит нам
подавать
на
него,
в
зависимости
от
положения
ручки
регулировки,
напряжение
3,3 В. Соответствующая схема подключений на макетной плате
показана на рис. 19.3. Для этой схемы можно применить любой подстроечный ре
зистор с сопротивлением от 1 до 100 кОм. В частности, здесь очень удобно исполь
зовать небольшой подстроечный резистор из комплекта Electronics Kit 1 for Pico от
в диапазоне от О до
компании MonkМakes, выводы которого легко вставляются в отверстия макетной
платы.
Откройте в редакторе
Thonny
программу ch_19_voltmeter.py и запу"-тите ее на выпол
нение. Программа начнет выводить на экран измеренные значения напряжения.
Попробуйте повернуть ручку регулировки переменного резистора и посмотрите,
как это скажется на выводимых значениях:
Рис.
19.13.
Измерение напряжения с помощью устройства
Pico
Raspberry Pi Pico
и
Pico W
1 557
from шachine iвport АОС, Pin
from utime iвport sleep
analog =
АОС
(26)
clef volts_from_~eading(reading\:
min_reading = 336
max_reading = 65534
reading_span = max_reading - min reading
volts_per_reading ~ 3.3 / reading_spaп
volts = (reading - min readiпgl * volts per reading
return volts
whi.le
Тrue:
reading = analog.read_ul6()
print(volts_from_reading(reading))
sleep(0.5)
При желании вы можете скачать этот пример кода в порядке, описанном в рецеп
те
3.22.
Пояснение
Чтобы использовать контакт не в качестве цифрового входа, как это делалось в ре
цепте
19.5,
а в качестве аналогового, экземпляр контакта нужно обернуrь в класс
АОС. После этого можно с помощью метода read_ ul6 считать с этого ко1Пакта анало
говое значение в диапазоне от О до
65 534.
Хотя метод read_ ul 6 возвращает беззнаковое
в устройстве
16-разрядное число, используемый
12-разрядный АЦП обеспечивает только
Pico
4096
ра.wичных значе
ний. Функция volts_from_reacliпg (волt,ты из показаний) преобразует исходное анало
говое значение в итоговое значение напряжения. АЦП не охватывает весь диапазон
значений от О до
3,3
В, оставляя непокрытыми «мертвые зоны». Поэтому даже при
соединении аналогового входа с «землей» (О В) АЦП будет выдавать значение,
приблизительно равное
336
336.
Соответственно, в функции volts _from_reading значение
принимается в качестве минимального показания (min_reading), в то время как
в качестве максимального показания (max readiнg) принимается значение
(о
65 534
котором мы уже говорили ранее). Затем мы определяем общее количество
различных
показаний,
отнимая
минимальное
показание
от
максимального
(max_reading - min_reading), и вычисляем количество вольт, приходящееся на одно
показание ( volts per reading). После этого мы уже можем определить, какое напря
жение в вольтах было подано на входной контакт.
В качестве аналогового входа можно использовать не все контакты
ко1Пакты
26, 27
и
28.
В то же время у процессора
RP2040
GPIO,
а только
анаJюговый канал
4
соединен со встроенным аналоговым датчиком темпераrуры, что позволяет опре
делять
темпераrуру
математическим
процессора,
подвергая
преобразованиям.
представленная далее программа
показания
Как это можно
ch_ 19_thermometer.py:
этого
датчика
несложным
реализовать, демонстрирует
Глава
558
19
from machine iпport Pin, ADC
from utime iqюrt sleep
temp_sensor = ADC(41
points_per_volt = 3.3 / 65535
def read_temp_c():
reading = temp_sensor.read_u16() * points_per_volt
temp_c = 27 - (reading - 0.706)/0.001721
return temp_c
while True:
temp_c = read_temp_c()
print(temp_c)
sleep(0.51
Обратите внимание на то, что здесь используется не контакт
канал
4,
что позволяет вам задействовать контакт
4 для
4,
а аналоговый
какой-либо другой цели.
Функция read_temp_ с считывает аналоговое показание датчика температуры с по
мощью метода read_u16 и путем несложных математических расчетов преобразует
это значение в температуру в градусах Цельсия. В этих расчетах участвуют число
вые константы, указанные в спецификации процессора
Хотя
RP2040.
встроенный датчик измеряет температуру процессора,
а не температуру
окружающей среды, если вы приложите палец к микросхеме процессора, он должен
немного нагреться, а показания датчика соответственно возрасти.
Наличие аналоговых входов позволяет подключать к устройству
Pico
различные
виды аналоговых датчиков, включая датчики освещенности, температуры, механи
ческой нагрузки и даже загазованности. Многие из рецептов, приведенных в по
священной датчикам главе
устройства
14,
можно легко
адаптировать
под использование
Pico.
Дополнительные сведения
О том, как можно снабдить аналоговым входом устройство
вается в рецепте
по адресу
14. 7. Ознакомиться
https://oreil.ly/gSLxk.
со спецификацией
Raspberry Pi, рассказы
процессора RP2040 можно
19.8. Управление сервоприводом
с помощью устройства Pico
Задача
Вы хотите обеспечить управление сервоприводом с помощью устройства
Pico W.
Pico
или
Raspberry Pi Pico
и
Pico W
1
559
Решение
Запитайте сервопривод от 5-вольтовой линии питания устройства
те один из контактов
GPIO
воспользуйтесь классом
PWM
Pico
и подключи
к управляющему выводу сервопривода. После этого
для генерирования ШИМ-импульсов, задающих угол
поворота сервопривода.
Сначала
подключите сервопривод
с
«штырь-штырь», как показано на рис.
помощью
соединительных
проводов типа
19 .14.
Желтый (управляющий вывод)
Рис.
19.14.
Подключение сервопривода к устройству
Pico
В разных сервоприводах могут применяться разные способы цветовой маркировки
выводов. В варианте, показанном на рис.
ля», красным
-
19.14,
черным цветом обозначена «зем
вывод для подключения 5-вольтовой линии питания, и желтым
-
управляющий вывод. Помимо этой схемы маркировки, также часто используется
схема, в которой «земля» обозначается коричневым цветом, 5-вольтовый вывод
питания
-
красным, а управляющий вывод
-
оранжевым. Какая схема маркиров
ки используется в вашем случае, можно узнать, ознакомившись со спецификацией
сервопривода.
Откройте в редакторе
Thonny программу ch_19_servo.py и запустите ее на выполне
ние. В консоли языка Python появится сообщение, запрашивающее у вас угол
в диапазоне от О до 180 градусов (рис. 19.15). Как только вы укажете требуемый
угол и нажмете клавишу <Enter>, сервопривод переведет свой рычаг в новое поло
жение.
Пояснение
Программа ch_19_servo.py выглядит следующим образом:
from machine import Pin, PWM
from utime import sleep
Глава
560
19
servo = PWМ(Pin(lб))
servo. freq (50) # Генерирование
импульсов с интервалом в
20
мс
def set_angle(angle, min_pulse_us=500, max_pulse_us=2500):
us_per_degree = (max_pulse_us - min_pulse_us) / 180
pulse_us = us_per_degree * angle + min_pulse_us
0,305 мкс
1 При частоте 50 Гц на ка,мую единицу скважности приходится 20000/65535
µs/duty_point
duty = int(pulse_us / 0.305)
# print ("angle="
str (angle)
pulse_ us~"
str (pulse_ us)
duty=" + str (duty))
# print (angle)
+
+
"
+
+
"
servo.duty_ulб(duty)
angle = 90
set_angle(90)
min_angle
10
max_angle = 160
whi.le Тrue:
angle_str = input("Enter angle О to 180:")
angle = int(angle_str)
if (angle >= О and angle <=180):
set_angle(angle)
При желании вы можете скачать этот пример кода в порядке, описанном в рецеп
те
3.22.
У правление
сервоприводом
осуществляется
путем
изменения
длительности
импульсов, подаваемых на его управляющий вывод. Если вы уже подзабыли, как
работает сервопривод, еще раз прочитайте разд. «Пояснение» рецепта
ch.. l 8_se1VO.py х 1
.1.
11\8 lld\.11.L.IIC .&lllf'UIL r..1..11,
2
f/"08
r..-.
utille illport sleep
з
4
5
Pin(14, Pin.IN, Pin.PUЦ_UP)
button_down = Pin(l5, Pin.IN, Pin .PUЦ_UP)
Ьutton_up"
F,
~
~
Туре "help() • for
пюге
~
information.
>>>
MicroPython vl.17 оп 2821-09-02; Raspberry Pi Pico with RP2840
Туре "help()" for more infonnation.
»> \Run -с $ЕОПОR_СОNТЕNТ
Eлter angle е to 188:4~
MicroPython (RаsрЬепу Pi Ркх>)
Рис.
19.15.
Программа для управления углом поворота сервопривода
12.1.
Raspberтy
Pi Pico и Pico W
1
561
Поскольку используемая по умолчанию частота генерирования ШИМ-импульсов
слишком высока для сервоприводов, которые рассчитаны на получение импульсов
с интервалом в
20
миллисекунд (с частотой
экземпляра класса РWМ для контакта
16
50
раз в секунду), после создания
мы с помощью команды servo.freg(SO) указы
ваем, что ШИМ-импульсы должны следовать с частотой
50
Гц.
Весь код для вычисления скважности ШИМ-сигнала содержится внутри функции
set angle (задать угол). Как и можно было ожидать, эта функция принимает в каче
стве параметра требуемый угол поворота, но, помимо этого, она также принимает и
два опциональных параметра:
rnin_pulse _ us
и
max_pulse_ us,
которые задают минималь
ную и максимальную длительность импульса в микросекундах. Эти опциональные
параметры позволяют скорректировать длительность импульсов в соответствии со
спецификациями сервопривода с тем, чтобы обеспечить максимальный диапазон
углового перемещения или исключить возникновение вибраций в начале и в конце
этого диапазона. К возникновению таких вибраций может приводить использова
ние слишком коротких или слишком длинных импульсов.
Сначала функция set_angle определяет, сколько микросекунд приходится на один
градус углового перемещения. После этого она рассчитывает, какую длину импуль
са в микросекундах следует использовать для заданного угла (pulse_us), и, наконец,
преобразует это значение в значение скважности ll.IИМ-сигнала (duty).
Устройство
Pico
справляется с управлением сервоприводом намного лучше, чем
обычное устройство RaspЬerry
Pi.
Благодаря более точному регулированию дли
тельности ШИМ-импульсов вал сервопривода должен вращаться плавно и без
каких-либо резких движений.
Дополнительные сведения
Если вас интересует, как вообще работают сервоприводы и как можно обеспечить
управление сервоприводом с помощью обычного устройства
тесь к рецепту
Raspberry Pi,
обрати
12. 1.
19.9. Использование файловой системы
устройств Pico и Pico W
Задача
Вы хотите обеспечить сохранение и извлечение данных из файловой системы
устройства
Pico.
Решение
Используйте файловые команды языка
и создания
файлов, сохраняемых на устройстве
на устрой
ство RaspЬerry
Pi.
MicroPy1hon для чтения, записи
Pico с возможностью копирования
562
Глава
19
В качестве примера программа
ch_19_temp_logger.py демонстрирует, как можно счи
RP2040 в градусах Цельсия и сохранять
интервалом в I О секунд.
тывать значения температуры процессора
их в журнальном файле с
Когда вы запустите эту программу, она начнет выводить в консоли сохраняемые
значения температуры. Чтобы завершить работу программы, щелкните на кнопке
Stop (Остановить) в панели инструментов или
<Ctrl>+<C>. Программа завершит процесс записи в
нажмите
комбинацию
клавиш
журнал, закроет файл и прекра
тит свою работу.
Чтобы посмотреть, что программа записала в журнальный файл
откройте в редакторе
лы) (рис.
19.16).
Thonny
меню
View
В левой части окна редактора
Thonny
появится вкладка, позво
ляющая просматривать файлы, сохраненные на устройстве
ной щелчок на файле
temp_readings.txt,
(temp_reading.txt),
Files (Фай
(Просмотр) и выберите пункт
Pico.
Выполните двой
чтобы открыть его в окне редактора
Thonny.
Здесь вы при желании можете внести в него изменения и снова сохранить на
устройстве
Pico.
Этот файл также можно перенести на устройство
Raspberry Pi.
Для
этого нужно щелкнуть на имени файла правой кнопкой мыши и выбрать в контек
стном меню команду
Download to /home/pi
(Скачать на
/home/pi).
File Edit View Run Tools Help
••••
+
~
This computer
/ home/pi
~
Bookshelf
RaspЬeny
I
с/1_ l B_servo.py х ch_18_temp_logger.py х
Pi Pico
]..
111 temp_readings.txt
1
..
и
13
def
log_dвtв(reading):
print(temp_c)
14
file .write(str(reading)+ ' \n')
15
16
17 file = open(log_file, llwll)
18
tгv :
~
.10.LI
"
о.:,
~
16 . 74523
17.21338
17.21338
17.68152
17 . 68152
17 . 21338
Logging Ended
>>>
MicroPython (Raspbeny Pi Pico)
Рис.
19.16.
Просмотр содержимого файловой системы на устройстве
Pico
Пояснение
Программа для записи значений температуры в журнал
глядит следующим образом
(она
(ch_ 19_temp_logger.py)
вы
представляет собой доработанную версию про
граммы, которая была рассмотрена в разд. «Пояснение» рецепта
19. 7, -
мы просто
добавили здесь код, записывающий показания датчика температуры в файл):
Raspberry Pi Pico
и
Pico W
1
563
from machine import Pin, ADC
from utime import sleep
log_file = 'temp_readings.txt'
temp_sensor = ADC(4)
points_per_volt = 3.3 / 65535
def read_temp_c():
reading = temp_sensor.read_u16() * points_per_volt
temp_c = 27 - (reading - 0.706)/0.001721
return temp_c
def log_data(reading):
print(temp_c)
file.write(str(reading)+'\n')
file = open(log_file, "w")
t.Iy:
while True:
temp_c = read_temp_c()
log_data(temp_c)
sleep (10)
except:
print ( 'Logging Ended')
file. close ()
При желании вы можете скачать этот пример кода в порядке, описанном в рецеп
те
3.22.
Для использования файловой системы устройства
какие-либо модули, эта возможность
Pico
не нужно импортировать
неотьемлемая часть языка
-
MicroPython,
фактически представляющая собой урезанную версию файловой системы языка
Python 3,
о которой мы говорили в главе
7.
Для открытия файла используется функ
ция open, которая принимает два параметра: имя файла и режим доступа ( w в случае
записи). При открытии файла для записи новый файл замещает любой уже сущест
вующий файл с таким же именем.
Функция
log_data выводит на экран переданное ей значение температуры, после
чего преобразовывает его в строку и добавляет эту строку в файл вместе с симво
лом новой строки
(\n).
Основной цикл while здесь вставлен в конструкцию try/except, чтобы при нажатии
в консоли комбинации клавиш
<Ctrl>+<C>
программа могла перехватить это собы
тие и закрыть открытый файл.
Чтобы выполнить чтение файла, его нужно открыть в режиме чтения
(r),
после чего
его содержимое можно будет считывать в виде строк с помощью функции read. Как
это делается, показано в программе
жимое файла в консоли:
ch_19_file_read.py, -
она просто выводит содер
564
1
Глава
19
f = open("temp_readings.txt", "r")
print (f. read ())
f. close ()
Максимальный объем файловой системы на устройстве
1,6 Мбайт,
Pico
составляет лишь
что не позволяет сохранять видео и даже большие звуковые файлы.
Также важно помнить о том, что если вам придется переустановить прошивку
устройства
Pico,
как это описано в рецепте
19.1,
вы потеряете всё содержимое фай
ловой системы.
Дополнительные сведения
О том, как производится запись и чтение файлов на обычном устройстве RaspЬerry
Pi, рассказывается
соответственно в рецептах
7. 7 и 7.8.
19.10. Использование второго ядра
процессора
Задача
Вы хотите использовать на устройстве
Pico (Pico W)
второе ядро процессора, чтобы
обеспечить одновременное выполнение нескольких задач.
Решение
Используйте механизм потоков языка
MicroPython,
чтобы запускать код парал
лельно основному потоку выполнения. Как это можно реализовать, демонстрирует
программа
ch_19_multicore.py:
fraв utiJDe illlport sleep
illlport _ thread
fraв randan illlport randint
def coreO():
while Тrue:
print("core О says hello")
sleep(randint(l, 3))
def corel():
while Тrue:
print("core 1 says hello")
sleep(randint(l, 3))
_thread.start_new_thread(corel, ( ) )
coreO()
При желании вы можете скачать этот пример кода в порядке, описанном в рецеп
те
3.22.
Raspberry Pi Pico
и
Pico W
1
565
Когда вы запустите эrу программу, она начнет выводить в консоли сообщения core
О says hello (привет от ядра О) и core 1 says hello (привет от ядра
1),
произвольным
образом их чередуя:
core
core
core
core
core
core
core
1 says hello
1 says hello
О says hello
1 says hello
О says hello
1 says hello
О says hello
Оба потока циклически выводят свое сообщение, делая после этого паузу, длитель
ность которой может составлять одну, две или три секунды. При этом время от
времени оба сообщения могут выводиться в одной и той же строке. Так происходит
в том случае, когда потокам приходится конкурировать друг с другом за право дос
rупа к
USB-nopry.
Пояснение
При использовании двух потоков обычно лучше выделить код каждого потока
в отдельную функцию. В представленном здесь примере эти функции называются
coreO и corel. Обе они выполняют цикл while True - при этом мы сначала выделяем
одно ядро физического процессора функции corel с помощью метода start new t
hread, а затем запускаем функцию coreO на втором ядре процессора, делая это просто
путем вызова этой функции.
Если при использовании обычной версии языка
Python 3
на устройстве
Raspberry Pi
Pico
вы можете создавать любое нужное вам количество потоков, то на устройстве
можно создавать не больше двух потоков выполнения.
Дополнительные сведения
Об использовании нескольких потоков в обычной версии языка
вается в рецепте
Python 3
рассказы
7. 19.
19.11. Запуск веб-сервера с
на устройстве Pico W
интерфейсом
Wi-Fi
Задача
Вы хотите запустить веб-сервер на устройстве
Pico W,
чтобы опробовать на прак
тике имеющиеся у этого устройства возможности беспроводного досrу11а.
Решение
Используйте на устройстве
са
Wi-Fi mm wlan.
Pico W модуль
веб-сервера microdot и модуль интерфей
Глава
566
19
Для вашего удобства я добавил эти модули в архив с примерами кода для книги
вы найдете их в каталоге
Скопируйте файлы pmon.py, microdot.py и mm_wlan.py на устройство
в редакторе
Thonny
-
ch_ 19_webserver, вложенном в каталог pico.
команду меню
Save As
Pico,
используя
(Сохранить как). При этом нужно оста
вить без изменений исходные имена этих файлов. После этого содержимое файло
вой системы на устройстве
Тh1а
Pico должно
выглядеть так, как показано на рис.
19.17.
о
hello.py
1
computer
~
Applications
~
Ыn
RlllpЬetry
2
3
4
PI Plco
main.py
from microdot 1mport Microdot
import mm_wlan
5
ss1d = 'my network name'
password • ' my passord'
6
7
арр
• Microdot{)
8 mm_wlan.connect_to_network(ssid, password)
9
18 ~app.route('/')
• microdot.py
• mm_wlan.py
•pmon.py
11
12
def 1ndex(request) :
return ' Hello, from Pico '
13
14 app.run(port=88)
Connecting to НONKМAKES_GUEST . ...
Connected IP Address • 192 . 168.1.132
1
Рис.
19.17.
Использование редактора
Thonny
для доступа к файлам на устройстве
Pico
Откройте файл hello.py и укажите в качестве значений переменных ssid и password
название и пароль своей сети
ре
Thonny
(рис.
Wi-Fi,
после чего запустите эту программу в редакто
19.18).
В случае, представленном на рис.
19.18, содержимое консоли говорит о том, что
Pico W успешно подключилось к сети Wi-Fi и получило IР-адрес
192.168.1.132. Если вы теперь введете этот адрес в адресной строке браузера на
устройстве Raspberry Pi или любом другом компьютере, подключенном к вашей
сети, то увидите веб-страницу, представленную на рис. 19 .19.
устройство
Пояснение
Как можно видеть на рис.
19.18,
программа hello.py содержит совсем немного кода.
Декоратор @арр. route ( '/' ) определяет следующую далее функцию в качестве обра
ботчика корневой страницы устройства
бражаемое на веб-странице
Команда арр. run (port=80)
порту
80.
Pico W. Эта функция лишь возвращает
сообщение Hello, from Pico (Привет от Pico).
ото
запускает веб-сервер на стандартном для веб-серверов
Raspbeny Pi Pico
и
Pico W
1
567
1 fron microdot inlport Microdot
2 inlport m_w\an
3
4
ssid •
'HONКМAКES_GUESi'
5 password • 'password'
6
7
арр
• Microdot()
8 11111_w\11n.connect_to_netwrk(ssid, password)
9
18 @-Jpp. route( ' / ' )
11 def index(request):
return 'Hetto, from Pico'
12
13
14 app.run(port•8B)
ShellX
Туре
11
hetp( }" for more information .
MicroPython vl . 19.l оп 2622-06-11; Raspberry
Туре "he1p() " for more information .
>>> \Run
Р1
Pico
wwith
RP2640
• С $EDITDR_CONТENТ
Connaoting to HONКМAKES_CUEST .• ••
Connected IP Add re:as = 192 .150, 1. . 132
MiaoPython (Rasptжтy Pi Pico)
Рис.
Helto,
Рис.
19.18. Запуск
fгom
19.19.
программы hello.py в редакторе
Thonny
Pico
Веб-страница, выдаваемая устройством
Pico W
Мы можем пойти в этом примере еще дальше и обеспечить дистанционный съем
показаний с датчика, подключенного к устройству
мера воспользуемся датчиком
его к устройству
Pico W,
Plant Monitor
Pico W.
из рецепта
Давайте в качестве при
14. 6,
на этот раз подключив
а не к обычному устройству Raspbeгry
Для подключения датчика
Pi.
Plant Monitor к устройству Pico:
GND устройства Pico W соедините
с выводом
GND датчика Plant Monitor;
♦
вывод
♦
вывод ЗУ устройства
Pico W -
с выводом ЗУ датчика
♦
вывод
устройства
Pico W -
с выводом ТХ датчика
Plant Monitor;
♦
вывод ТХ устройства
Pico W -
с выводом
датчика
Plant Monitor.
RX
RX
Plant Monitor;
Глава
568
19
Эти подключения можно произвести напрямую, с помощью соединительных про
водов типа «гнездо-гнездо», или, как показано на рис.
19.20,
с помощью макетной
платы и соединительных проводов типа «штырь-гнездо».
'\
... .
•..• ..
.....
..
.
..
Рис.
19.20.
Подключение датчика
Plant Monitor
к устройству
Pico W с
помощью макетной платы
и соединительных проводов типа «штырь-гнездо»
Теперь запустите программу
pico_w_server.py
и обновите отображаемую браузером
страницу. На веб-странице должны появиться показания датчика (рис.
j0
~
МyPlant
➔
С
..,
19.21 ).
1
А Not secure 1 192.1681.132
Pico W Plant Monitor
Watrr: 100
'Itmp (С): 26.05
Humidity: 49.04
_ _ _ _ _ _ _!
Рис.
19.21.
Показания датчика на веб-странице, выдаваемой устройством
Pico W
Дополнительные сведения
Более подробную информацию можно найти в документации по модулю microdot
(https://oreil.ly/5CdED)
и модулю пrn wlan
(https://oreil.ly/NvxMA).
Синтаксис модуля microdot может показаться вам знакомым, поскольку у этого
модуля много общего с библиотекой bot:Uc, которую мы использовали в рецепте
7.17.
Raspberry Pi Pico
Подробную информацию о датчике
Plant Monitor
и
Pico W
можно найти по адресу
1
569
https://
oreil.ly/20BНW.
19.12. Использование аналогов устройства Pico
Задача
Вы хотите использовать один из многочисленных аналогов устройства
Pico.
Решение
Хотя устройство RaspЬerry
Pi Pico является прекрасным примером того, на что спо
RP2040, в продаже имеется и много других плат на
собна плата на базе процессора
базе этого процессора, к<rrорые можно точно так же программировать в редакторе
Thonny,
используя язык
MicroPython.
19.3 пприведены нек<rrорые из наиболее интересных плат на базе процессо
RP2040, которые имелись в продаже на момент подг<rrовки книги. При желании
В табл.
ра
вы можете найти в Интернете и много других плат на базе этого процессора.
Таблица
Наименование
Производитель
QTPy RP2040
Adafruitl'
J
19.3. Платы на базе процессора RP2040
Примечания
Крошечная плата с минимальным количеством контактов
ввода/вывода и разъемом USВ-C
--------
Feather RP2040
··-------·--------
,
-----
-
PicoliPo
1-----------------
Badger
От устройства
i
ется разъем USВ-C и дополнительно присутствует
1 зарядное устройство для литий-полимерных аккумулят<r
1
~
-------~
Feather, введенного компанией Adafruit.
Pico отличается тем, что в ней использу-
Плата формата
Adafruit
i
- L - - -------
ров. Может бьггь окрашена в необычный розовый цвет
-г------------- -
----
-----
·-
---
-
---------------------------
Плата с практически такими же параметрами, как у платы
Pi~o~o~~
'
--·
-
Feather RP2040
' --- ----- - --------- -- ---------·- -------------- - ------·-1---
Pimoroni
1 При минимальном количестве контактов, эта плата имеет
5 кнопочных
1
1
переключателей и большой дисплей на
1 электронных чернилах
;
1
Пояснение
Одной из наиболее интересных плат на базе процессора
Pimoroni Badger.
RP2040
является плата
Она снабжена дисплеем на электронных чернилах, что позволяет
использовать ее в качестве идентификационного бейджа, способного <Уrображать
графику и текст и демонстрирующего последнее изображение даже при <УrКЛюче
нии питания. Вместе с тем эта плата предоставляет те же возможности программи
рования на языке
MicroPython,
что и устройство
Pico.
Badger пос-тавляется с уже п1юш1пъ1м на нее образом интерпретатора языка
MicroPython и рабочим примером 11рограммы. Подключите эту плаrу к устройству
Плата
570
Глава
Raspberry Pi,
19
используя кабель с разъемом
в случае устройства
с устройством
Pico ),
USB-C
(а не с разъемом
micro-USB,
как
и вы сможете взаимодействовать с ним точно так же, как
Pico.
Чтобы упростить для вас доступ к дисплею на электронных чернилах, компания
Pimoroni
включила
в
комплект
предоставляемого
программного
обеспечения
Руthоn-модуль для вывода на такие дисплеи графики и текста.
Пример кода из программы ch_ 19_badger.py демонстрирует, как можно превратить
это устройство в простейший термометр, используя встроенный датчик температу
ры процессора
RP2040
(рис.
19.22).
Рис.
19.22.
Плата
Pimoroni Badger 2040
Вторая версия этой программы: ch_19_badger_f.py -
отображает температуру в гра
дусах Фаренгейта (выводимые значения температуры всегда будут на несколько
градусов выше реальной температуры в комнате, поскольку используемый здесь
датчик измеряет температуру процессора, а не температуру окружающей среды:
badger2040
from machine iщ:,ort ADC
from utime iщ:,ort sleep
iщ:,ort
badger = badger2040.Badger2040()
teщ:,_sensor = ADC(4)
points_per_volt = 3.3 / 65535
def
read_teщ:,_c():
reading = teщ:,_sensor.read_ul6() * points_per_volt
tещ:,_с = 27 - (reading - 0.706)/0.001721
return tещ:,_с
badger.font("Ьitmap8")
old t =
О
while True:
t = round(read_teщ:,_c())
Raspberтy
if t
Pi Pico
и
Pico W
1
571
1 = old t:
old t = t
badger. pen (255)
badger. clear ()
badger.pen(0)
badger.text(str(t), 20, 10, scale=lб)
badger.text("o", 220, 5, scale=8)
badger.text("C", 255, 20, scale=8)
badger.update11
sleep(5)
При желании вы можете скачать этот пример кода в порядке, описанном в рецеп
те
3.22.
Программа ch_ 19_badger_f.py представляет собой доработанную версию программы
ch_ 19_temp_logger.py -
я просто заменил здесь код, записывающий значения темпе
ратуры в файл, на код, выводящий эти данные на дисплей. Модуль badger2040 обес
печивает взаимодействие с дисплеем на электронных чернилах. При создании
экземпляра класса Badger2040 в качестве используемого шрифта по умолчанию
выбирается достаточно тяжеловесный шрифт ы tmap8, который хорошо подходит
для отображения температуры.
В основном цикле while мы считываем новое значение температуры, и если оно от
личается от старого, обновляем содержимое экрана. В отличие от других дисплеев,
дисплеи на электронных чернилах обновляют содержимое экрана медленно, и этот
процесс часто сопровождается мерцанием. Именно поэтому мы не обновляем со
держимое экрана на каждой итерации цикла while.
Вывод данных на дисплей осуществляется здесь так же, как и в случае использова
ния ОLЕD-дисплея (см. рецепт
15.4), -
путем записи выводимых данных в буфер
и обновления экрана с помощью метода update. В нашем случае мы предварительно
очищаем содержимое экрана, выбирая белый цвет чернил
(255)
с помощью метода
pen и вызывая метод clear. Затем мы выбираем черный цвет чернил (О), преобразуем
значение температуры в строку и выводим ее в точке с координатами х
= 20, у= 1О.
После этого более мелким шрифтом выводится обозначение градусов Фаренгейта.
Наконец, мы обновляем содержимое экрана с помощью метода update и выдержива
ем паузу в пять секунд с помощью метода sleep, чтобы не допустить слишком час
того изменения показаний.
Дополнительные сведения
Более подробную информацию об использовании платы
Pimoroni Badger
можно
найти по адресу https://oreil.ly/EyxoP. Подробное описание модуля badger2040 мож
но найти по адресу https://oreil.ly/tZK0O.
572
1
Глава
19
19.13. Использование устройства Pico
с питанием от батареек
Задача
Вы хотите запитать устройство
Pico
или
Pico W от батареек.
Решение
Достаточно большое время работы от батарей при низком уровне энергозатрат
можно
обеспечить
путем
использования
батарейного
блока
из двух
батареек
типаАА.
Такой блок вы сможете легко подключить к устройству
платы, как показано на рис.
Рис.
19.23.
Pico
с помощью макетной
19.23.
Устройство
Pico
с питанием от двух батареек типа М
Пояснение
Устройство
Pico
можно достаточно легко запитать от батареек, потому что оно
снабжено встроенным стабилизатором напряжения, который преобразует входное
напряжение в диапазоне от
1,8 до 5,5 В, подаваемое на контакт Vsys (или Vs, как он
Pico от компании MonkMakes), к уровню в 3,3 В,
процессора RP2040.
обозначен на макетной плате для
необходимому для
В отличие от устройства RaspЬerтy
Pi 4,
которое может потреблять ток в несколько
ампер, что не позволяет запитывать его от такого маломощного источника питания,
как батарейки, устройство
Pico
потребляет не более
АА обычно составляет как минимум
обеспечить не менее
80 часов
и
PicoLiPo
от
мА. Емкость батарейки типа
мАч, а значит, пара таких батареек может
непрерывной работы уt."ГрОЙства
Некоторые аналоги устройства
Adafruit
2000
25
Pico.
Pico, например, платы Feather RP2040
компании Pimoroni, позволяют использовать
от компании
литий-поли-
Raspbeny Pi Pico
мерные аккумуляторы с напряжением
3,7
и
Pico W
1
573
В. Такие устройства заряжаются при под
ключении внешнего источника питания с помощью разъема
USB
и работают от
аккумуляторов при его отключении.
Дополнительные сведения
Более подробные сведения о платах
Feather RP2040 и PicoLiPo можно
https://oreil.ly/SzA2J.
ветственно по адресам https://oreil.ly/qGOМR и
найти соот
ПРИЛОЖЕНИЕ
1
Поставщики и комплектующие
Представленные далее таблицы призваны помочь вам в поиске комплектующих,
используемых в проектах этой книги. Там, где это было возможно, я включал
в описание товара применяемый производителем товарный код.
Поставщики
В настоящее время существует большое количество производителей и поставщиков
электронных компонентов для профессиональных разработчиков и любителей
электроники. Ряд наиболее популярных из них упомянут в табл. П 1.1.
Таблица П1 .1. Поставщики комплектующих
Поставщик
Веб-сайт
Примечания
Adafruit
http://www.adafrult.com
Качественные модули
Cool Components
https://coolcomponents.co.uk
Широкий сnектр комnлектующих
для
Raspberry Pi
СРС
http://cpc.farnell.com
Широкий сnектр комnлектующих
Digi-Key
http://www.dlglkey.com
Широкий сnектр комnлектующих
Farnell
http://www.farnell.com
Широкий сnектр комnлектующих
MonkMakes
http://www.monkmakes.com
Наборы электронных компонентов для
и другие комплектующие
Raspberry Pi
Mouser
http://www.mouser.com
Pimoroni
https://shop.plmoronl.com
Широкий спектр комплектующих
Ретейлер и производитель интересных
плат стандарта НАТ
Pololu
https://www.pololu.com
Качественные контроллеры двигателей
и комплектующие для робототехники
Seeed Studio
http://www.seeedstudlo.com
Интересные недорогие модули
SparkFun
http://www.sparkfun.com
Качественные модули
Еще одним отличным источником комплектующих является портал еВау.
Поиск нужных компонентов может отнимать много сил и времени. Существенную
помощь
нентов
в
этом
процессе
вам
может оказать система поиска электронных компо
Octopart (http://W\\-W.octopart.com).
В ассортименте компаний MonkМakes,
Поставщики и комплектующие
Adafruit
и
SparkFun
575
1
имеются стартовые наборы компонентов, включающие в себя
всё, что требуется для начала работы.
БХВ-Электроника
Российские читатели книги могут приобрести многие нужные им компоненты электрон
ных схем в разделе «БХВ-Электроника» сайта издательства «БХВ» по адресу https://
bhv.ru/elements/.
Оборудование и комплекты для прототипирования
Во многих проектах этой книги упоминаются различные виды соединительных
проводов. Особенно часто используются провода типа «штырь-гнездо» (для соеди
нения контактов разъема
устройства
GPIO
Raspberry Pi
с макетной платой) и про
вода типа «штырь-штырь» (для соединения контактов макетной платы друг с дру
гом). В некоторых проектах применяются и провода типа «гнездо-гнездо»
подключения модулей непосредственно к контактам разъема
проектов длина проводов может не превышать
7-8
GPIO.
для
-
В большинстве
см. В табл. Пl.2 приведены
основные типы используемых в проектах этой книги соединительных проводов и
макетных плат с указанием их основных поставщиков.
Чтобы быстрее освоиться с использованием макетной платы, соединительных про
водов и базовых электронных компонентов, вы можете купить стартовый набор
электронных компонентов для
компании
MonkMakes,
Raspberry Pi -
например, комплект
Project
Вох
1 от
в значительной мере рассчитанный на проекты этой книги.
Таблица П1 .2. Оборудование и комплекты для прототипирования
Описание
1
Соединительные провода типа «штырь-штырь»
1
Макетная плата половинного размера
Комплект
Pi
1
1
СоЬЫег
SparkFun: PRT-08431; Adafruit: 759
SparkFun: PRT-09140; Adafruit: 825
Соединительные провода типа «штырь-гнездо»
Соединительные провода типа «гнездо-гнездо»
Поставщики
1
SparkFun: PRT-08430; Adafruit: 794
SparkFun: PRT-09567; Adafruit: 64
Adafruit: 1105
--·--
Шаблон
Raspberry Leaf (на 26
выводов)
Шаблон
Raspberry Leaf (на 40
выводов)
1
1
Стартовый набор электронных компонентов для
RаsрЬеггу Pi
Макетная плата Adafruit Регmа-Ргоtо для
(половинный размер)
Raspberry Pi
для
Raspberry Pi
Макетная плата Adafruit
(ПОЛНЫЙ размер)
Макетная плата
Perma-Proto
Adafruit Perma-Proto
НАТ
Переходник с гнезда на винтовые зажимы для источника
Adafruit: 1772
Cool Components: 3408
. Amazon; MonkMakes
1
1
!
1
1
питания постоянного тока
1
Adafruit: 1148
Adafruit 1135
Adafruit: 2314
Adafruit: 368
576
Приложение
1
1
Таблица П1.2 (окончание)
Описание
Плата
Поставщики
НА Т
Pimoroni Breakout Garden
-------
--
Pimoroni
------ - - - - - - - - -
----
Базовый паяльный комплект
Adafruit: 136
Резисторы и конденсаторы
В табл. П 1.3 приведены используемые в этой книге резисторы и конденсаторы
с указанием их основных поставщиков.
Таблица П1.3. Резисторы и конденсаторы
Компонент
Резистор,
Поставщики
270
Ом,
0,25
Вт
Mouser: 293-270-RC
470
Ом,
0,25
Вт
Mouser: 293-470-RC
1------------
Резистор,
- - -
~
Резистор,
1 кОм, 0,25
·-------
~
Резистор,
Вт
Mouser: 293-1 K-RC
------------
кОм,
3,3
0,25
Вт
Резистор,
кОм,
4,7
1-------- - - -
Mouser: 293-3.3K-RC
-
--
1-----------
-
0,25
-
Вт
Mouser: 2934.7K-RC
- -
Подстроечный резистор,
------------
1О
----- -
кОм
-
Adafruit: 356; SparkFun: СОМ-09806;
Mouser: 652-3362F-1-103LF
-
-
--
--- - -
Фоторезистор
Adafruit: 161; SparkFun: SEN-09088
---
~
Конденсатор,
330
- - - -
нФ
Mouser: 80-C330C334K5R
-
------------
Термистор,
1 кОм,
бета-коэффициент
3730, NTC
Mouser: 871-B57164K102J
Транзисторы и диоды
В табл. П 1.4 приведены используемые в этой книге транзисторы и диоды с указа
нием их основных поставщиков.
Таблица П1.4. Транзисторы и диоды
Компонент
Поставщики
FQP30N06L,
N-канальный
Mouser: 512-FQP30N06L; Sparkfun:
СОМ-10213
МОП-транзистор логического уровня
--------
~
биполярный NРN-транзистор
2N3904,
--
-
-
------
ДИОД
1N4001,
1------------
-
i
.
-
- - - ------- -
2N7000,
-
.
СОМ-00521;
Adafruit: 756
Mouser: 512-1N4001; SparkFun:
Adafruit: 755
--
--
-
--------
МОП-транзистор
--
СОМ-08589;
-~
ТIР120, транзистор Дарлингтона
-··
SparkFun:
-- - ---
Adafruit: 976;
СРС:
SC10999
--~
-----
Mouser: 512-2N7000;
СРС:
SC06951
Поставщики и комплектующие
1
577
Интегральные схемы
В табл. П 1.5 приведены используемые в этой книге интегральные схемы с указани
ем их основных поставщиков.
Таблица П1 .5. Интегральные схемы
Поставщики
Компонент
L293D,
SparkFun: СОМ-00315; Adafruit: 807;
Mouser: 511-L293D; СРС: SC10241
драйвер двигателя
ULN2803,
драйвер на парах Дарлингтона
SparkFun: СОМ-00312; Adafruit: 970;
Mouser: 511-ULN2803A; СРС: SC08607
OS18B20,
даТ'!ик температуры
SparkFun: SEN-00245; Adafruit: 374;
Mouser: 700-OS18B20; СРС: SC10426
579-МСР3008-1/Р;
МСР3008, восьмиканальный АЦП
Adafruit: 856; Mouser:
СРС: SC12789
ТМР36, даТ'!ик температуры
SparkFun: SEN-10988; Adafruit: 165;
Mouser: 584-TMP36GT9Z; СРС: SC10437
Оптоэлектроника
В табл. Пl.6 приведены используемые в этой книге оптоэлектронные компоненты
с указанием их основных поставщиков.
Таблица П1 .6. Оптоэлектроника
Поставщики
Компонент
Светодиод красный,
5
мм
RGВ-светодиод с общим катодом
TSOP38238,
инфракрасный даТ'lик
SparkFun:
СОМ-09590;
SparkFun:
СОМ-11120; еВау
Adafruit: 299
-
SparkFun: SEN-10266; Adafruit: 157
Модули
В табл. П 1. 7 приведены используемые в этой книге модули с указанием их основ
ных поставщиков.
Таблица
Поставщики
Компонент
Модуль камеры для
Adafruit: 3099; Cool Components: 1932
Raspberry Pi
- - -
Преобразователь уровней, четырехканальный
Преобразователь уровней, восьмиканальный
--
-
--
-
-
- - -
SparkFun:
-
~ - - - - -
,------ -
n1. 7. Модули
ВОВ-12009;
----
Adafruit: 395
--
Повышающий преобразователь
/
зарядное
устройство для литий-полимерных аккумуляторов
SparkFun: PRT-14411
Adafruit: 757
578
Приложение
1
Таблица П1. 7 (окончание)
Компонент
Поставщики
Кабель с переключателем
PowerSwitch Tail
Amazon
16-канальный контроллер сервопривода
Adafruit: 815
Двухканальный драйвер двигателя,
SparkFun: ROB-14451
1А
Пассивный инфракрасный датчик движения
(PIR)
Adafruit: 189
GРS-модуль
Adafruit: 746
'
Датчик метана
SparkFun: SEN-09404
Коммутационная плата для датчиков газа
SparkFun:
Трехосевой акселерометр
Adafruit: 163
ADXL335
ВОВ-08891
4-разрядный ?-сегментный светодиодный
индикатор с интерфейсом 1 2 С
Adafruit: 878
Двухцветная светодиодная матрица
Adafruit: 902
Модуль часов реального времени
Adafruit: 3296
Жидкокристаллический индикатор на базе
контроллера HD44780, 16 символов х 2 строки
SparkFun: LCD-00255; Adafruit: 181
Плата
Sense
Adafruit: 2738
Плата
Adafruit Capacitive Touch
с квадратными пикселами и интерфейсом 1 2 С
НА Т
НАТ
Adafruit: 2340
Плата для управления шаговыми двигателями
НА Т
Adafruit: 2348
Плата стандарта НА Т
для управления 16 каналами ШИМ
Adafruit: 2327
Плата
Pimoroni; Adafruit: 2427
Stepper Motor
Pimoroni Explorer НАТ Рго
Модуль кнопки
Squid Button
Модуль RGВ-светодиода
MonkMakes; Amazon
Raspberry Squid
MonkMakes; Amazon
ОLЕD-дисплей размером 128х64 пикселов
с интерфейсом 1 2 С
еВау
Трехосевой акселерометр
SparkFun: SEN-12756
Модуль датчика СO2
MH-Z14A
Считыватель RFID-кapт
Датчик расстояния
MMA8452Q
RC-522
Wi-Fi Sonoff Basic
введите запрос: I2C OLED Arduino
еВау
-
введите запрос: мн-Z14А
еВау
-
введите запрос: RC-522
Pimoroni или еВау -
Pimoroni VL53L 1Х
1
Выключатель
-
введите запрос:
VL53LlX
ITEAD
Кабель-переходник для подключения камеры
к Raspberry Pi Zero
Adafruit: 3157
Плата
Wemos D1 Mini
еВау
Плата
Pimoroni Audio DAC Shim
Плата
Pimoroni Badger 2040
(линейный выход)
-
Pimoroni
Pimoroni
введите запрос: Wemos Dl Mini
Поставщики и комппектующие
1
579
Прочее
В табл. Пl .8 приведены прочие виды используемого в этой книге оборудования
с указанием их основных поставщиков.
Таблица П1 .В. Прочее
Поставщики
Компонент
Литий-полимерный аккумулятор,
Реле,
1200 мдч
SparkFun:
5В
Щитовой вольтметр,
Мини-сервопривод,
SparkFun: ROB-09065; Adafruit: 1449
Adafruit: 169
9г
Adafruit: 276
5 В, 2 А
Adafruit: 711
Двигатель постоянного тока
с низким энергопотреблением,
СОМ-00100
SparkFun: TOL-10285
5В
Стандартный сервопривод
Источник питания,
Adafruit: 258
6В
SparkFun: PRT-00116; Adafruit: 392
Штыревые контакты, О, 1 дюйма
Униполярный шаговый двигатель,
Биполярный шаговый двигатель,
5 В, 5 выводов
12
В,
4 вывода
Adafruit: 858
Adafruit: 324
Кнопка
SparkFun:
СОМ-00097;
Adafruit: 504
Миниатюрный ползунковый переключатель
SparkFun:
СОМ-09609;
Adafruit: 805
Датчик угла поворота
Adafruit: 377
Цифровая клавиатура, 4к3
SparkFun:
СОМ-14662
Пьезоэлектрический зуммер
SparkFun:
СОМ-07950;
Герконовый переключатель
Adafruit: 375
Консольный кабель
Adafruit: 954
Adafruit: 160
ПРИЛОЖЕНИЕ
2
Схема расположения выводов
устройства
Raspberry Pi 400/4/3/2,
модели В, В+, А+,
Raspberry Pi
Zero
На рис. П2.1 представлена схема расположения выводов 40-контактной версии ин
терфейса
GPIO,
используемой в настоящее время на устройствах RaspЬerry
33V OO SV
2SDA 0 0 SV
ЗSCL OO GND
40014ТХD
GND 0 0 IS RXD
170018
27OO GN0
220023
33V 0024
10 МOSI O O GND
9MISO 0 0 25
llSCKL 0 0 8
GND 007
ID_SD
нvoo sv
2SDA O0 SV
ЗSCL 0 0 GND
40014ТХD
GNO 001S RXD
17 □□ 18
O O ID_SC
27
SOO GND
60012
13 0 0 GND
190016
26 0020
GND 0 0 21
GPIO на 40-контактных
Raspberry Pi
Raspberry Pi,
00 GND
22оов
ЗJV 0024
O O GND
00 25
ПSCKL 008
10 MOSI
9MIS0
GND 007
Рмс. П2.1. Схема расположения выводов
интерфейса
Pi.
моделях
Рмс. П2.2. Схема расположения выводов
интерфейса
GPIO
на устройстве RaspЬerry
Pi
модели В второй ревизии и модели А
модель В второй ревизии, модель А
Если вы приобрели одну из более ранних 26-контактных моделей
Raspberry Pi,
то
это, скорее всего, модель В второй ревизии, выводы которой расположены, как по
казано на рис. П2.2. (Если у вас есть одна из первых версий устройства
Pi,
не спешите его выбрасывать, возможно, оно вам еще пригодится.)
Raspberry
Схема расположения выводов устройства
Raspberry Pi,
Raspberry Pi
581
модель В первой ревизии
У модели В первой ревизии выводы расположены немного не так, как у выпускав
шейся позже модели В второй ревизии. Эта модель является единственной версией
устройства RaspЬerry
Pi,
несовместимой с более поздней схемой расположения вы
водов. Несовместимые выводы, назначение которых изменилось в последующих
версиях устройства, выделены на рис. П2.3 жирным начертанием.
Питание
вvoo sv
OSDA OO SV
Управление
8
&
• J
Аналоговый вход
1 Интерфейсная шина
1SCL OO GND
40014ТХD
GND 001S RXD
17 0018
2100 GND
по □ в
ЗJV0024
10 MOSI
O O GND
9MISO 0025
ПSCKL 008
GND 007
Рис. П2.3. Схема расположения
выводов иктерфейса
GPIO
Pi
на устройстве RaspЬeny
модели В первой ревизии
Рис. П2.4. Схема расположения выводов иктерфейса
на устройстве RaspЬeny
GPIO
Pi Pico
Raspberry Pi Pico
Несмmря на то 'ПО у устройства RaspЬerry
такое же количество выводов,
как и у обычного устройства RaspЬerry
выводы обладакл совершенно
другим назначением (рис. П2.4).
Pi Pico
Pi (40), эти
Предметный указатель
А
G
Adafruit Capacitive Touch НА Т, плата 436
Adafruit, компания: обучающий материал
44
apt, менеджер пакетов 105
Asteroids, игра 13 8
в
GIMP, графический
Git, утилита 109
◊
GPIO,
разъем
108
276
◊
версии
◊
перевод контактов в безопасное состоя
◊
предотвращение повреждения
276
311
Raspberry Pi
при подключении внешней
электроники
281
Guizero,
библиотека
232, 442
н
CheerLights, сервис 495
Clever Card Kit, пакет 440
СSV-файл 444
HC-SR04,
D
протокол
58
DНСР-резервирование
62
сервис: реагирование на твиты
Е
платформа
установка
255
264
57
Explorer НА Т Pro, плата 301, 437
Ethernet-кaбeль
F-строки
430
I2C, интерфейс: настройка 282
i2c-tools, пакет 284
if, оператор 176
IFTTT, сервис 488
◊ реагирование на твиты 500
Inkscape, редактор 144
◊
использование нескольких адресов
◊
определение
◊
◊
59
срок аренды 61
статический 61
J
F
Facebook,
500
дальномер
IР-адрес
Edge Impulse,
◊
скачивание исходного кода
с ее помощью
с
Dweet,
142
ние перед выходом из программы
Blue Dot, приложение 56, 324
Bluetooth, интерфейс 54
Bookshelf, приложение 145
bott\e, библиотека 224,476
DHCP,
редактор
соцсеть
203
488
JSON,
формат: синтаксический анализ
данных
229
59
Предметный указатель
р
к
К40 Whisperer, программа 151
killall, команда 122
Kodi, программа 133
pickle, модуль 212
Pico W, модель 541
L
◊
запуск веб-сервера на ней
◊
подключение к компьютеру
Pico,
L293D, микросхема 350
LibreELEC, дистрибутив 132
LibreOffice, пакет 136, 444
Linux, ОС 82
модель
◊
использование аналоговых входов
◊
использование аналоговых выходов
545
104
МСР3008, микросхема
406
ММА8452Q, акселерометр
421
◊
использование второго ядра процессора
◊
использование консоли языка
клиент
◊
модель публикации и подписки
505
◊
прошивка умного выключателя
Wi-Fi
505
Sonoff513
505
◊
программа
534
155
редактирование Python-пporpaмм
158
N
nano, текстовый редактор 43
Node-RED, редактор 484
◊
в сочетании с МQТТ-сервером
◊
включение и выключение приборов
◊
выполнение запланированных действий
◊
управление выключателем
с помощью расширения
с его помощью
ПОМОЩЬЮ
547
507
Dashboard 527
532
Sonoff с
524
◊ управление платой Wemos D1 537
Notepad++, текстовый редактор 43
NumPy, библиотека 456
о
OpenCV, библиотека 240
OSMC, дистрибутив 134
Python
545
◊
использование с питанием от батареек
◊
использование файловой системы
◊
использование цифровых входов
◊
561
552
использование цифровых выходов 549
подключение к компьютеру 542
◊
управление сервоприводом
◊
◊
Mu,
554
использование в сочетании с макетной
572
Mosquitto, программа 504
MQTT, протокол 504
сервер
555
◊
на ней
MicroPython, язык 546
Minicom, утилита 288
МQТТ-сообщения
569
564
модуль
Маn-страница
540
использование аналогов
платой
Machine,
565
542
◊
(ШИМ)
м
◊
583
его
с ее помощью 558
PIL, библиотека 456
Pimoroni Audio DAC Shim, плата 469
Pimoroni Badger, плата 569
Pimoroni Unicorn НА Т, плата 461
pip3, утилита 107
PowerSwitch Tail II, устройство 322
PuTTY, программа 70
Pygame, библиотека 4 71
pySerial, библиотека 287
Python, язык 48
◊ библиотеки 107, 215
◊ выбор версии 154
◊ выбор редактора кода 155
◊ использование консоли 162
◊ использование модулей 215
◊ ничегонеделание в нем 226
◊ определение функции 182
◊ основы программирования 154
◊ продвинутые ВОЗМОЖНОСТИ 202
◊ словари 186
◊ создание простого веб-сервера 224
◊ списки 186
◊
указание аргументов командной строки
219
584
Предметный указатель
◊
R
Raspberry Pi
3 В 22
◊ 4 В 20
◊ 400 21
◊ А+ 22
◊ Compute Module 4 24
◊ Pico 540
◊ Pico W 541
◊ Zero 2 305
◊ Zero2 W 305
◊ Zero W 22
◊
◊
подключение компонентов системы
◊
подключение микрофона
◊
подключение
подключение с помощью консольного
◊
подключение светодиода
◊
подключение светодиодной ленты
кабеля
подключение цифровой клавиатуры
превращение в брокер сообщений
работа в бездисплейном режиме
◊
снабжение кнопкой питания
◊
◊
132
тактильный интерфейс 436
удаленное управление 72
◊
управление биполярным шаговым
◊
управление лазерным гравером
◊
управление оборудованием
в качестве випrажной иrровой приставки
о
138
493
140
◊
в качестве сетевого хранилища
◊
в сочетании с Интернетом вещей
◊
взаимодействие посредством
76
476
воспроизведение звука при отсутствии
468
выбор выходного аудиоустройства
◊
выбор модели
выбор ОС
19
32
◊
выключение
дисплей
◊
запитывание от .литий-полимерного
49
447
297
◊
изменение цвета светодиодов
◊
интернет-радио
495
146
о
использование интерфейса
◊
использовании звука
◊
источник питания
◊
корпус
◊
149
307
◊ управление скоростью вращения
◊
установка модуля камеры
◊
установка ОС
345
51
33
Pi Configuration, инструмент 63
RaspЬerry Pi lmager, программа 33
RaspЬerry Pi Sense НА Т, плата 416
◊ инерциальный измерительный блок 427
◊ обнаружение магнита 429
◊ светодиодный матричный дисплей 452
Raspberry Squid, модуль 291,477
RC-522, считыватель карт 438
Recommended Software, инструмент 134
RFЮ-метка 438
RPi.GPIO, библиотека 440
RaspЬerry
◊
аккумулятора
355
двигателя постоянного тока
467
386
создание медиацентра
двигателем
476
375
504
37
◊
◊
◊
457,
◊
в качестве FМ-nередатчика
◊
307
◊
◊
аудиоразъема
67
458
автоматическая отправка твитов
веб-интерфейса
25
472
монитора 41
◊
◊
◊
подключение кнопочного переключателя
360
Bluetooth 54
465
29
26
настройка беспроводного подключения
s
65
◊
настройка даты и времени
◊
настройка сетевого имени устройства
◊
обеспечение максимальной
производительности
128
63
46
◊
обновление ОС
◊
определение IР-адреса
◊
отправка электронных писем
◊
первая загрузка
◊
подключение GРS-модуля
◊
подключение акустической системы
◊
подключение к Интернету
130
59
488
35
и уведомлений с
381
57
465
Secure Shel\ (SSH), протокол 72
Sense НА Т, плата 299
ServoBlaster, драйвер 340
◊ отключение 341
◊ установка 340
Slack, мессенджер 488
Sonoff, WiFi-выключатель
◊ настройка 519
◊ прошивка 513
◊ управление 521
с помощью редактора Node-RED 524
0
Предметный указатель
SPI, интерфейс: настройка 286
Squid Button, модуль 294
SSDl306, контроллер 455
Subprocess, библиотека 471
sudo, команда 98
А
Автоматический запуск программы
т
◊
◊
в качестве службы
◊
на этапе начальной загрузки
◊
с регулярным временным интервалом
библиотека
распознавание звуков
260
распознавание объектов в видеопотоке
◊
консоли администратора
◊
маршрутизатора
реагирование на наличие объектов
◊
реагирование на свист
в видеопотоке
Аналоговый измеритель в качестве
(АЦП)
257
◊
390
в сочетании с резистивными датчиками
411
◊
отправка показаний датчика в канал
программа
331
Аналогово-цифровой преобразователь
261
TensorFlow, библиотека 255
ThingSpeak, сервис 493
◊
61
61
устройства отображения
◊
Thonny,
113
116
255
◊
114
Адрес
TensorFlow Lite,
◊
585
497
измерение температуры
413
167
Арифметические операторы
155
редактирование Python-пporpaмм
в
156
Thonny, редактор 545
Twitter, соцсеть 488
Веб-скрейпинг
238
Возвращение нескольких значений
u
205
Выполнение сетевых запросов
из Python-кoдa
ULN2803,
микросхема
218
351
г
V
Генерирование случайных чисел
Yirtual Network Computing (VNC),
протокол 74
Yisual Studio Code, программа 147
VL53L I Х, датчик 433
VLC, медиапроиrрыватель 146
VLC, проигрыватель 470
VS Code, редактор 148
w
Геркон
д
◊
390
DS18820 419
ТМР36 413
◊
акселерометр
Датчик
◊
◊
◊
Wi-Fi-соединение
◊
◊
настройка с использованием
графического окружения
◊
◊
66
настройка с помощью командной строки
66
WS2812,
428
416
почвы 403
времени полета 433
гироскоп 428
давления 416
влажности
0
Wemos D1, плата 534,537
whi1e, оператор 181
◊
217
429
◊
◊
контроллер
457
◊
◊
х
Xarchiver,
◊
◊
программа
112
измерение температуры с помощью
цифрового датчика
◊
418
430, 433
измерения ускорения 421
качества воздуха 401
магнитометр 426
напряжения 406
обнаружения метана 398
освещенности 394
измерения расстояния
Предметный указатель
586
Датчик (прод.)
◊
отображение показаний
0
на веб-странице
и
442
Импульсный датчик угла поворота
481
◊
отправка показаний в канал сервиса
Интернет вещей
ThingSpeak 497
резистивный 390
Исключение, обработка
◊
◊
сохранение показаний
□
в сочетании с АЦП
411
на флеш-накопителе
Каталог
тактильный
◊
копирование
◊
переименование
◊
создание
Двойной буферизации, метод
457
переключатель: подключение к
Класс, определение
Raspberry
Pi365
Динамический метод разгона процессора
◊
◊
◊
46
447
графический
OLED- 454
457, 458
светодиодный матричный 452
из RGВ-светодиодов 461
семисеrментный светодиодный
электронно-бумажный
Дросселирование
44 7
462
46
с жесткого диска
◊
с флеш-накопителя
Linux
39
из Python-кoдa
Запуск программ в фоновом режиме
220
126
Звук
◊
USВ-микрофон
◊
воспроизведение из Python-кoдa
◊
116
с ПОМОЩЬЮ реле
□
◊
317
320
твердотельного
с помощью транзистора
314
240
◊
извлечение текста из изображения
◊
использование модуля камеры
Raspberry Pi
в системе
243
настройка USВ-камеры
471
воспроизведение из командной строки
подсчет количества монет
◊
распознавание лиц
◊
регистрация движения
Конденсатор
241
244
24 7
Конвейер, использование
250
125
392
Консольный кабель
◊
4 72
470
67
энергопотребление
68
Копирование файла или папки
91
Кортеж
205
Крен 427
воспроизведение при отсутствии
аудиоразъема
◊
363
Raspberry Pi 360
Коммутация
◊
403
◊
между двумя состояниями
для использования в системе
39
Запрос-ответный протокол обмена данными
◊
подключение к
для
Загрузка
◊
◊
◊
◊
◊
использование для переключения
Компьютерное зрение
3
Запуск команд
◊
118
светодиодный модуль с интерфейсом 12С
◊
206
Кнопочный переключатель
Комментарий
450
◊
92
Командная строка, использование истории
светодиодная лента
0
◊
91
96
◊ удаление 97
Клавиатура 25
Двухпозиционный или ползунковый
Дисплей
213
к
443
436
◊ температуры 396,416
Двигатели 334
Двит 502
◊
372
476
468
л
выбор выходного аудиоустройства
467
генерирование зуммерноrо сигнала 474
подключение акустической системы 465
Логические операторы
179
Локальная вычислительная сеть
61
253
Предметный указатель
м
п
Макетная плата
Переименование файла или папки
290
Машинное обучение
присвоение значения
О
строковая
Метод
О
цикла
О
Перехват
задачи классификации
254
132
Медиацентр, создание
конструктор
165
169
192
207
О определение 208
Монитор 25
О
движений мыши
О
нажатий клавиш
О
Плата стандарта НА Т: создание
настройка размера выводимого
собственной
изображения
О
44
подключение 41
с композитным видеовходом
О
с разъемом
42
DVI 41
О с разъемом VGA 41
МОП-транзистор 315
Подтягивающие резисторы
57
371
Получение сведений об используемой
версии ОС
129
О
для включения и выключения устройств
О
для изменения цвета RGВ-светодиода
О
для ШИМ-управления мощностью
326
н
светодиодов и двигателей
Напряжение
О
делитель
О
измерение
Поток
41 О
406
О снижение 409
Наследование 209
множественное
О
О
с помощью инструмента
228
изменение
99
IО 1
98
Приглашение командной строки
Raspberry Pi
63
174
126
о
295
87
Проверка доступного пространства
на SD-карте
с помощью командной строки
Нулевое устройство
327
Преобразование уровня сигналов
Configuration 63
Нотация среза
выполнения
Права суперпользователя
21 О
329
484
Права доступа к файлам
Настройка сетевого имени
О
302
Пользовательский интерфейс
Мышь25
О
385
383
Подключение к проводной сети
О
О
92
Переменная
254
О
О
587
128
Процесс
О
идентификатор
О
легковесный
О
фоновый
126
228
126
Процессор
О
измерение температуры
О
отслеживание степени загруженности
Обнаружение движения
О
разгон
Одновременное выполнение
Псевдоним команды
Обеспечение максимальной
производительности
нескольких задач
46
379
227
120
последовательность
арифметические
О
логические
О
сравнения
Оптопара
47
р
Распознавание речевых команд
323
Отображение списка подключенных
123
Отправка электронных писем
из Python-кoдa
217
167
179
177
USВ-устройств
127
Псевдослучайная числовая
Операторы
О
415
221
О
в облаке
О
локальное
265
270
Реагирование на речевые команды
в Python-кoдe
273
Предметный указатель
588
Реакция на скачок
392
◊
Регулярное выражение
◊
234
использование для автоматического
извлечения данных из веб-страниц
◊
◊
238
234
Редактирование
◊
векторных изображений
◊
растровых изображений
Рыскание
143
142
0
Светодиоды
457
308
◊
подключение к
◊
управление яркостью
путем синтаксического анализа
строки
Raspberry Pi 307
312
сортировка
◊
удаление элементов из
документации
◊
замена одной подстроки на другую
◊
извлечение части
◊
207
конкатенация
◊
определение длины
◊
определение позиции подстроки в ней
◊
преобразование в верхний или нижний
170
172
173
338
175
◊
преобразование в число
подключение с помощью платы
◊
преобразование числа в строку
Servo Six Board 338
◊
создание
прецизионное управление
0
несколькими
171
171
169
339
342
т
управление положением
334
настройка 79
Сетевой принтер,
Танrаж
90
создание 114
427
43
Символ групповой подстановки
Терминал
Скрипт инициализации,
◊
запуск Python-nporpaмм из него
◊
открытие окна
Словарь
◊
доступ к нему
◊
итеративный обход
◊
ключи
199
◊
200
◊
◊
сохранение в виде JSОN-файла
◊
удаление элементов
231
скачивание файлов в окне
◊
скрытие вывода команд в окне
Термистор
200
◊
создание
438
103
107
125
396
с отрицательным температурным
коэффициентом
идентификацией
Снимок экрана
87
◊
Смарт-карта с радиочастотной
164
85
перемещение по файловой системе
с помощью его
200
создание 197
◊
175
173
◊
регистр
непрерывного вращения
189
177
◊
Сервопривод
◊
190
194
◊
Строка
427
Светодиодная лента
193
186
Сравнение значений
с
◊
создание
использование для поиска совпадений
в тексте по заданному шаблону
◊
проверка наличия определенного
элемента в нем
396
Трехпозиционный переключатель:
подключение к
Raspberry Pi 366
103
Создание пользовательских интерфейсов
у
232
Список
Узел
484
◊
вырезание части
◊
добавление элементов в него
Управление
◊
использование генератора
◊
высоковольтными устройствами
◊
итеративный обход
◊
итеративный обход элементов
◊
оборудованием с помощью телефона
194
Ультразвук
188
195
переменного тока
191
с ОС
с одновременным извлечением их
индекса
433
Android
177
322
и технологии
Bluetooth 323
Условие
192
◊
определение длины
◊
осуществление доступа к элементам
◊
188
187
выполнение цикла до изменения
результата
181
Предметный указатель
Условное выполнение команд
176
134
Форматирование
Установка рекомендуемого ПО
◊
значений даты и времени
Устранение дребезга контактов
◊
чисел
при нажатии кнопки
589
369
204
202
Фоторезистор
395
Функция
ф
◊
определение
◊
параметр
182
183
Файлы
х
◊
абсолютный путь к ним
◊
запись данных
◊
изменение информации о владельце
◊
88
21 О
использование модуля
конкатенация
◊
копирование
D
Хафа, метод
◊
pick.le для
выгрузки и загрузки данных из них
◊
102
212
124
91
на USВ-накопитель
244
198
ц
84
◊
относительный путь к файлу
◊
переименование
◊
nеренаправление вывода нз командной
◊
поиск
строки в файл
обнаружение кругов с помощью него
Хеш-таблица
Цикл
87
◊
92
123
117
◊
права доступа к файлу
◊
просмотр содержимого
◊
работа с файлом
◊
работа с архивами
◊
редактирование
◊
создание без использования редакrора
◊
удаление
◊
чтение данных нз файла
выполнение до изменения результата
условия
99
95
181
181
◊
выход
◊
переменная
192
ч
82
122
92
Чтение пользовательского ввода
97
95
ш
Шестнадцатеричные числа
211
167
285
Широтн(}-нмпульсная модуляция (ШИМ)
312
06
Доктор Саймон Монк
(Simon Monk)
авторе
(Престон, Великобритания) является обладате
лем ученых степеней в области кибернетики, вычислительной техники и про
граммной инженерии. Проработав несколько лет преподавателем в своем универ
ситете, он решил уйти в компьютерный бизнес и стал соучредителем компании
Momote Ltd.,
выпускающей программное обеспечение для мобильных устройств.
В настоящее время он совмещает написание книг с проектированием продуктов для
компании MonkМakes, которой руководит его жена Линда. Чтобы получить больше
информации о его книгах, посетите сайт
в социальной сети
Twitter по
адресу
http://www.simonmonk.org
@simonmonk2.
или перейдите
06
изображении на обложке
На обложке этой книги изображен евразийский ястреб-перепелятник, или просто
перепелятник
(Accipiter nisus).
Эта небольшая хищная птица распространена по
всему Восточному полушарию. У взрослых самцов оперение с верхней стороны
тела имеет темно-серый с голубоватым отливом окрас, а с нижней стороны тела
-
оранжевый с четко выраженными поперечными полосками. У самок и птенцов все
тело
покрыто
коричневым
оперением
с
коричневыми
с нижней стороны. У самок тело примерно на
25%
поперечными
полосками
крупнее, чем у самцов.
Хотя основной добычей перепелятника являются лесные птицы, его можно встре
тить и в населенных пунктах, где он охотится на птиц, обитающих в садах и парках.
Самцы обычно охотятся на более мелких птиц, таких как зяблики и воробьи, в то
время как самки предпочитают ловить дроздов и скворцов,
-
вес их суточной до
бычи может составлять полкилограмма и даже больше.
Евразийские перепелятники выводят потомство в сооружаемых из веток гнездах,
поперечный размер которых может доходить до
50--60
см. После сооружения гнез
да самка откладывает в него четыре-пять бледно-голубых с коричневыми пятнами
яиц. Для успешного выведения птенцов самка не должна терять в весе в течение
периода гнездования, и единственным добытчиком пищи в семье на этом этапе
становится самец. Спустя
оперением за следующие
33 дня из яиц
24-28 дней.
появляются птенцы, которые покрываются
В среднем до конца своего первого года жизни доживает около
пелятника. После этого шансы на выживание удваиваются
-
взрослая особь доживет до следующего года, достигает уже
34%
птенцов пере
вероятность того, что
69%.
Средняя продол
жительность жизни у этих птиц составляет четыре года, при этом молодые самцы
погибают чаще, чем молодые самки. Исследования показали, что обработка семян
хлорорганическими инсектицидами перед их посевом может приводить к отравле
нию и гибели перепелятников, кроме того, отравившиеся птицы откладывают яйца
с очень хрупкой скорлупой, которая разрушается на этапе высиживания. Несмотря
на резкое снижение численности перепелятников после Второй мировой войны,
ввод запрета на применение таких химикатов привел к тому, что евразийский яст
реб-перепелятник стал в Европе самым распространенным видом хищных птиц.
В настоящее время этот вид птиц имеет охранный статус «Вызывающие наимень
шие опасения». Как и все представители животного мира, изображенные на облож
ках книг издательства
O'Reilly,
они жизненно важны для нашей планеты.
Представленную
обложке
книги
на
(Karen Montgomery)
иллюстрацию
создала Карен
Монтгомери
на основе черно-белой гравюры, взятой из книги «Естествен
ная история Касселя»
(«Cassell's Natural History»).
Саймон Монк
Raspberry Pi.
Сборник рецептов
4-е издание
Перевод с английского М Райтмана
ТОО"АЛИСr'
Ресnублика Казахстан,
г. Астана, пр. Сарыарка, д. 17, ВП
010000,
Подписано в печать
30
05.12.24.
Формат 70х100 1 / 16 . Печать офсетная. Усп. печ. п. 47,73.
Тираж
1300 экз.
Заказ №
11644.
Отпечатано с готового оригинал-макета
ООО "Принт-М'',
142300,
РФ, М.О., г. Чехов, ул. Полиграфистов, д.
1