Текст
                    
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