MicroPython для микроконтроллеров [Гюнтер Спаннер] (pdf) читать онлайн

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

books

MicroPython для
микроконтроллеров
Проекты с Thonny-IDE, uPyCraft-IDE и ESP32

Гюнтер Спаннер

MicroPython для микроконтроллеров
Проекты с Thonny-IDE, uPyCraft-IDE и ESP32


Гюнтер Спаннер

Content
Глава 1 • Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.1 Python, C, или Arduino? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.2 1.2 Требования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Глава 2 • Разнообразие плат ESP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14
2.1 Ввод в эксплуатацию и функциональная проверка . . . . . . . . . . . . . . . . . . . . . 16
2.2 ESP32 при питании от батареи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Глава 3 • Среды программирования и разработки . . . . . . . . . . . . . . . . . . . . . . 19
3.1 Установка uPyCraft IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.2 MicroPython для ESP32 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.3 "Hello World" для контроллера . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.4 Для профессионалов: Работа с esptool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.5 Thonny — Python-IDE для начинающих . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.6 Работа с Тонни . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.7 Работа с файлами. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.8 Советы по устранению неполадок для Thonny IDE . . . . . . . . . . . . . . . . . . . . . . 36
Глава 4 • Первые шаги в программировании . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.1 Никогда без комментариев . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.2 Оператор Print() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.3 Отступы и блоки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.4 Управляемое оборудование: цифровые входы и выходы . . . . . . . . . . . . . . . . . 45
4.5 Управление временем и сон . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.6 Важные значения: переменные и константы . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.7 Количество и типы переменных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.8 Преобразование числовых типов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.9 Маленькие большие данные: массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.10 Операторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.11 С форматом, пожалуйста: привлекательный текст и вывод данных. . . . . . . . . .55
4.12 Символы в цепочках: строки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Глава 5 • Контроллер в практическом использовании . . . . . . . . . . . . . . . . . . . . 60
5.1 LED мигалка как имитатор системы охранной сигнализации . . . . . . . . . . . . . . . 60

●5

5.2 Полезно в экстренной ситуации: автоматический сигнал SOS . . . . . . . . . . . . . . 61
Глава 6 • Структуры программ
6.1 Условия и циклы

63

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

63

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

6.2 Ходовые огни и освещение аэропорта

64

6.3 Электронная радуга: используется RGB-светодиод

66

6.4 SOS в компактном стиле

67

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

6.5 Метод проб и ошибок: попробуйте и за исключением

68

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Глава 7 • Генерация аналоговых сигналов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
7.1. Широтно-импульсная модуляция

70

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7.2 Для романтических вечеров: симулятор сердцебиения

73

7.3 Световой будильник для расслабленного пробуждения

74

7.4 Mood-Light с многоцветным светодиодом

75

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7.5 Чистота и плавность: аналоговые значения от ЦАП

76

7.6 Вывод зависимых от времени напряжений

77

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7.7 Для интересных кривых: Генератор произвольных функций

. . . . . . . . . . . . . . . . . . . .

Глава 8 • Прерывания и таймеры

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

78

81

8.1 Требуется прерывание: прерывания

81

8.2 Автоматический ночной свет

82

8.3 Мастера времени: Таймеры

84

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

8.4 Многофункциональный проблесковый маячок

86

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Глава 9 • Использование датчиков

90

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

9.1 Сбор данных измерений и датчиков

. . . . . . . . . . . . . . . . . . . . . . . . .

90

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

92

9.3 Коррекция линейности

95

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

9.4 Линеаризация путем ограничения диапазона значений

. . . . . . . . . . . . . . . . . . . . . . . . . . .

96

9.5 Линеаризация входа АЦП с помощью компенсационного полинома . . . . . . . . . . 97
9.6 Измерение напряжения

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

98

9.7 Перекрестные помехи: побочные эффекты в сенсорной технике

101

9.8 Прикосновение разрешено: емкостные датчики касания

102

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

9.9 Охлажденный или перегретый: датчики температуры обеспечивают четкость 105
. . . . . . . . . . . . .

9.10 Цифровая запись температуры для безошибочной передачи данных

108

9.11 9.11 Однопроводной датчик DS18×20

108

. . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

●6

Content
9.12 Мощность данных: мультисенсорная матрица с термодатчиком DS18x20

110

9.13 В анфас: оптические датчики

112

. . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

9.14 Для кино- и фотопрофессионалов: электронный люксметр

113

. . . . . . . . . . . . . . . . . . .

9.15 Электронные летучие мыши: измерение расстояния с помощью ультразвука 115
. . . . . . . . . . . . . . . . . .

9.16 Больше никаких вмятин и царапин: датчик расстояния для гаражей

119

9.17 Оптимальный микроклимат в помещении для флоры и фауны

121

9.18 "Верь мне...": сравнение датчиков

125

. . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

9.19 Измерение атмосферного давления и высоты

126

9.20 Обнаружение магнитных полей датчиком Холла

129

9.21 Датчики тревоги контролируют дверь и ворота

130

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Глава 10 • Технология отображения и экраны малого размера

132

. . . . . . . . . . . . . . . . . .

10.1 Графическое представление

135

10.2 OLED-дисплей в качестве графопостроителя

138

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10.3 Пожалуйста, укажите точное время: цифровые часы с OLED-дисплеем

140

10.4 Не только для спортсменов: секундомер

144

10.5 Просто коснитесь: секундомер с сенсорными клавишами

145

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

10.6 Отличный климат с датчиком BME280! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Глава 11 • Светодиодные матрицы и большие дисплеи

. . . . . . . . . . . . . . . . . . . . . . . . . . .

150

11.1 Светодиодная матрица в действии

152

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

11.2 Запуск скриптов и анимационной графики

153

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Глава 12 • Физические вычисления: сервоприводы вносят движение в игру

. . . . . . . . .



12.1 Сервотестер

155
155

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12.2 Сервотермометр с мегадисплеем

158

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Глава 13 • RFID и беспроводная передача данных

161

. . . . . . . . . . . . . . . . . . . . . . .

13.1 Чтение карт и чипов

162

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13.2 Бесконтактный и безопасный: замок RFID

164

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Глава 14 • MicroPython и Интернет вещей (IoT)


167

. . . . . . . . . . . . . . . .

14.1 Для современных детективов: сетевой сканер

168

14.2 Подключено, но нет кабелей: WLAN

169

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14.3 Переключение и управление с помощью веб-сервера

172

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14.4 Веб-сервер WLAN в действии . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
14.5 Считывание данных датчика через WLAN

177

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

●7

4.6 Запись параметров окружающей среды: Термометр/гигрометр WLAN . . . . . . . 179
Глава 15 • Просто и хорошо: протокол MQTT . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
15.1 MQTT через ThingSpeak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
Глава 16 • Отправка данных в Интернет через ThingSpeak . . . . . . . . . . . . . . 190


16.1 Дождь или гроза? Виртуальная метеостанция доступна по всему миру . . . . . 190
16.2 Графическое представление данных в ThingSpeak . . . . . . . . . . . . . . . . . . . . 194
16.3 Данные для смартфона с приложением ThingView. . . . . . . . . . . . . . . . . . . . . 195
16.4 От нежелательных посетителей: Оптическое наблюдение за помещением . . .196
Глава 17 • Методы микромощности и спящие режимы . . . . . . . . . . . . . . . . . . . 199
17.1 Энергосбережение защищает окружающую среду . . . . . . . . . . . . . . . . . . . . 199
17.2 Отключение ненужных потребителей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
17.3 Метеостанция с батарейным или солнечным питанием . . . . . . . . . . . . . . . . . 201
Глава 18 • Шинные системы для эффективной связи . . . . . . . . . . . . . . . . . . . . 202
18.1 Основы и применение шины I²C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
18.2 Шина SPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
18.3 Члены семейства SPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
18.4 Управление картами SD и µSD через SPI . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Глава 19 • Создание схем с помощью компонентов и макетов . . . . . . . . . . . . 212
19.1 Макетные пла
. т. ы
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
19.2 Перемычки и соединительные кабели . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
19.3 Резисторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
19.4 Светодиоды (LED) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
19.5 Конденсаторы и электролитические конденсаторы . . . . . . . . . . . . . . . . . . . . 217

●8

Chapter 1 • Introduction

Глава 1 Введение
Внедрение чипа ESP32 от Espressif Systems знаменует собой новое поколение
микроконтроллеров (МК), которые предлагают отличную производительность,
функциональность Wi-Fi и Bluetooth по непревзойденной цене. Эти функции
покорили производителей. Самые разнообразные приложения и проекты в области
Интернета вещей (IoT) и домашней автоматики могут быть легко и экономично
реализованы. ESP32 так же легко программируется, как и классические платы
Arduino. Однако для сравнения ESP32 также предлагает, среди прочего:










Большая флэш-память и память SRAM
Значительно более высокая скорость процессора
Встроенный Wi-Fi/WLAN
Функциональность Bluetooth
Больше пинов GPIO
Широкая функциональность интерфейса
Аналого-цифровой преобразователь с более высоким разрешением
Цифро-аналоговый преобразователь
Функции безопасности и шифрования

По этим причинам его можно считать наиболее многообещающим преемником
Arduino. В этом контексте часто используется термин «убийца Arduino».
Эта книга знакомит с программированием современных однокристальных систем
(Systems on Chip — SoC). Помимо технической подготовки, основное внимание
уделяется языку программирования Python, особенно его варианту «MicroPython».
Основные взаимосвязи между электроникой и электротехникой будут
рассматриваться только в той мере, в какой это необходимо для проектирования
схем и экспериментов.
В любом случае, «аппаратное обеспечение» для начала может быть очень простым.
Во-первых, требуется только плата контроллера и несколько светодиодов, а также
резисторы. ПК или ноутбук, необходимый для программирования чипа, должен
быть в каждом доме. Соответствующую среду программирования можно бесплатно
загрузить из Интернета. Однако при работе со средой программирования
MicroPython быстро возникают первые проблемы.
В последние годы Python пережил огромный подъем. Различные одноплатные
системы, такие как Raspberry Pi, особенно способствовали его популярности. Но
Python также нашел широкое применение в других областях, таких как
искусственный интеллект или машинное обучение. Следовательно, использование
Python или варианта MicroPython для приложений в SoC также является логичным
выбором.
Однако мы не ограничимся простым введением в язык программирования. Во
многих случаях полученные навыки программирования применяются на практике
вместе с электронной схемой. Все полностью описанные проекты подходят для
использования в лабораториях или в повседневной жизни. Таким образом, в
дополнение к образовательному эффекту удовольствие от сборки полных и
полезных устройств также находится на переднем плане. С помощью лабораторных
съемных плат можно без особых усилий реализовать схемы всех типов. Таким
образом, тестирование и испытание приложений становится образовательным
удовольствием.
● 11

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

1.1 Python, C или Arduino?
Для начинающих среда программирования Arduino — одно из самых простых мест
для программирования ESP32. За этим интерфейсом стоит версия C для Arduino, а
также C++. Эти два языка программирования годами были популярны для
разработки встраиваемых систем. Версия C для Arduino еще больше упростила
начало работы. Кроме того, для этой цели создано одно из крупнейших
технологических сообществ в мире. С появлением новых библиотек, программных
исправлений и поддержки плат проблемы обычно решались быстро. Однако
ограничение, заключающееся в том, что Arduino-C работает только в
предназначенной для него среде, немаловажно. Специально для разработки более
масштабных проектов отсутствуют полезные и важные функции. Таким образом,
Arduino-C оставался в основном ограниченным хобби и проектами для начинающих.
MicroPython относительно новый. Сообщество пользователей растет, и
поддерживается все больше и больше платформ. MicroPython — это упрощенная
версия Python, одного из самых популярных языков программирования в мире.
Поэтому конкретные проблемы можно решать не только в сообществах MicroPython.
На самом деле общие форумы по Python все больше способствуют решению проблем
MicroPython.
В дополнение к поддержке сообщества, MicroPython также обладает некоторыми
особенностями, которые ставят его намного выше класса Arduino. Одной из таких
функций является так называемая функция REPL. REPL расшифровывается как
«цикл чтения-оценки-печати». Это позволяет быстро выполнять программы и
разделы кода. Компилировать или загружать не нужно. Таким образом, части кода
могут быть протестированы быстро и эффективно во время разработки.
MicroPython содержит очень компактную реализацию интерпретатора Python. Для
этого требуется всего 256 КБ флэш-памяти и 16 КБ ОЗУ. Тем не менее
интерпретатор разработан для максимальной совместимости со стандартным Python.
Синтаксис и языковой диапазон в значительной степени соответствуют Python
версии 3.4, поэтому опытные программисты на Python должны быть в состоянии
сразу найти обходной путь. Кроме того, определено несколько языковых
элементов, выходящих за рамки стандарта, что снижает требования к памяти и
увеличивает скорость выполнения.

1.2 Требования
Для успешной работы с этой книгой необходимо выполнить следующие
требования:
• Базовые знания любого языка программирования, такого
как C, Java и т.п.;
• Предполагаются базовые знания в области электроники, особенно
в области «ток — напряжение — сопротивление».
● 12

Chapter 1 • Introduction

Для получения специальных знаний в области электроники, пожалуйста, обратитесь
к обширной технической литературе, особенно от Elektor, через их
книги, журналы и комплекты. Аппаратная структура была намеренно сделана
простой, поскольку основное внимание должно быть уделено программированию с
помощью MicroPy-thon. Тем не менее, требуются различные компоненты и детали.
Пояснения можно найти в отдельных главах, в которых компоненты используются в
первую очередь. Кроме того, в последних разделах книги объясняются некоторые
основные компоненты, такие как резисторы или светоизлучающие диоды. Вы можете
обратиться к ним, если есть какие-либо неясности относительно отдельных
компонентов.
Дополнительные требования
• ПК или ноутбук с USB,
• ОС Windows 10,
• доступ в Интернет.
Также полезно использовать активный USB-концентратор между компьютером и
контроллером, т.к. гарантирует определенную защиту ПК. Хаб должен иметь
собственное питание 5В через отдельный блок питания. Тогда ПК или ноутбук
лучше всего защищен от короткого замыкания за хабом, так как очень
маловероятно, что короткое замыкание «пронесет» активный хаб в USB-порт
компьютера.

● 13

Глава 2 • Разнообразие плат ESP
ESP32 — это современный и чрезвычайно мощный микроконтроллер. Помимо
высокой тактовой частоты и обширных внутренних функциональных блоков, чип
имеет встроенные Wi-Fi и Bluetooth. Контроллер был разработан китайской
компанией Espressif Systems, базирующейся в Шанхае, и пользуется все большей
популярностью. Характеристики производительности ESP намного превосходят
известные платы Arduino с точки зрения цены и производительности.
Поскольку ESP32 доступен только в виде SMD-чипа, для использования
контроллера в непрофессиональной среде требуется так называемая плата прорыва
(BoB) или плата разработки. На рынке доступно множество различных версий.
Самые известные версии:

Board

Pins

Buttons

LiPo Charger

ESP32-PICO-KIT

34

EN and BOOT

no

JOY-iT NodeMCU

30

EN and BOOT

no

ESP32 DEV KIT DOIT

30/36

EN and BOOT

no

Adafruit HUZZAH32

28

RESET

yes

ESP32 Thing

40

EN and BOOT

yes

LOLIN32

40

EN and BOOT

no

Node-ESP-Board

38

EN and BOOT

no

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

Рис.2.1: Платы ESP32 (PICO-KIT, Node-ESP и NodeMCU).
Часто помимо контроллера на платы монтируются другие компоненты, такие как
кнопки, зарядное устройство для литий-ионных аккумуляторов или различные
светодиоды.

● 14

Chapter 2 • A Variety of ESP Boards

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

двухъядерный микропроцессор Tensilica LX6 160/240 МГц
520 КБ SRAM / 16 МБ флэш-памяти
от 2,2 В до 3,6 В
Стандарт: прибл. 50 - 70 мА
Режим Wi-Fi: прибл. 80 - 170 мА
Режим глубокого сна: прибл. 2,5 мкА
Темпер. окр. среды
–40 °C to +125 °C
Входы/выходы (GPIO): 32 порта общего назначения с ШИМ
Логика функций и таймера
Wi-Fi: 802.11 b/g/n/e/i
Пропуск. способ. сети: 135 Мбит/с (по протоколу UDP)
Чувствит. приемника: –98 dBm
V4.2 BR/EDR и BLE
Bluetooth:
Функционал Bluetooth: Classic и Bluetooth Low Energy (со встроенной антенной)
Датчики:
Датчик Холла
10-кратный емкостный сенсорный датчик
Интерфейсы:
Интерфейсы: 3x UART с потоком 3x интерфейса SPI
Контроллер CAN-шины 2.0
2 интерфейса I2S и 2xI2C
18 аналоговых входов с 12-битными АЦП
2 аналоговых выхода с 10-битными ЦАП
Инфракрасный (ИК) (TX/RX)
ШИМ мотора
LED-PWM до 16 каналов
Интерфейс для внешней флэш-памяти SPI до 16 МБ
Аппаратное обеспечение SD-карты
Безопасность:
Wi-Fi: WFA, WPA/WPA2 и безопасная загрузка WAPI
Флэш-шифрование
Криптографическое аппаратное ускорение Криптография
на эллиптических кривых


















Генератор случайных чисел (RNG)
ESP32-PICO-KIT обычно используется для примеров приложений в этой книге. В
качестве альтернативы можно использовать ESP32 DEV KIT или другую плату.
Используемый вариант указывается явно в каждом случае. В принципе, однако,
различные платы в значительной степени совместимы. Отличаются они в основном
размерами и порядком расположения пинов. Рисунок 2.2. показан PICO-KIT с его
функциональными узлами и соединениями.

● 15

Рис. 2.2: Плата ESP32 PICO-KIT.
Платы лучше всего подходят для экспериментов и разработки. Электронные
компоненты, такие как светодиоды, датчики температуры или даже исполнительные
механизмы,
такие
как
сервоприводы
модели
R/C,
могут
быть
подключены через разъемы портов. Плата Pico Kit имеет, среди прочего, следующие
функции:













Контроллер ESP с двумя 32-битными ядрами
Быстрый интерфейс Wi-Fi и WLAN (до 150 Мбит/с)
Функции АЦП и ЦАП
Сенсорный блок
Хост-контроллер для SD/SDIO/MMC
Контроллер SDIO/SPI
Блок EMAC и PWM для управления светодиодами и двигателями
Интерфейсы UART, SPI, I²C и I²S
Инфракрасный пульт дистанционного управления
Интерфейс GPIO
Bluetooth/Bluetooth LE (4.2)
USB-to-Serial-Chip для доступа через интерфейс USB

2.1 Ввод в эксплуатацию и функциональная проверка
Как только плата будет доступна, ее следует подвергнуть первоначальному
функциональному тестированию. Для этого USB-кабель подключается к ПК или
ноутбуку и разъему micro-USB на плате.
На большинстве плат светодиод загорается при подключении к USB-порту с
питанием. Если, вопреки ожиданиям, этот так называемый светодиод включения
питания не загорается, следует немедленно отключить соединение USB. Таким
образом, вы можете предотвратить серьезное повреждение из-за возможного
короткого замыкания. Полезные советы по дальнейшему устранению неполадок
даны в соответствующей главе в конце книги.
Платы ESP всегда должны эксплуатироваться на беспаечной плате (см. рис. 2.3).

● 16

Chapter 2 • A Variety of ESP Boards

Рис.2.3: Плата ESP, подключенная к макетной плате.

2.2 ESP32 с питанием от батареи
В большинстве случаев плата ESP питается через разъем Micro-USB. Поскольку при
создании программы контроллер все равно подключается к ПК или ноутбуку,
дополнительное питание не требуется.
Если прямой обмен данными с ПК больше не нужен, плата также может питаться от
источника питания USB, которая должна обеспечивать выходной ток не менее 1000
мА (1 А; 1 ампер), чтобы избежать нежелательных падений напряжения. Кроме
того, имеется определенный запас мощности для работы некоторых светодиодов,
дисплеев или датчиков.
Даже без подключения USB плата может отправлять и получать данные через Wi-Fi
и Bluetooth. Для достижения полной независимости модуль должен питаться только
от (перезаряжаемых) батарей.
Некоторые платы имеют для этой цели разъем для литий-ионной (Li-Ion) батареи
(см. рис. 2.4). Подходящие элементы можно подключать напрямую через
стандартный штекер. Затем внутренняя регулировка напряжения обеспечивает
оптимальное питание контроллеров. Кроме того, подключенная батарея
заряжается, как только плата подключается к действующему USB-разъему.
Для этого приложения подходят аккумуляторы емкостью около 1500 мАч и более.
Аккумуляторы меньшего размера менее 300 мАч не следует использовать, так как
встроенный контроллер заряда может привести к их перезарядке.
При типичном энергопотреблении ок. 50 мА, вариант на 1500 мАч может обеспечить
время работы около 30 часов, то есть чуть более суток. При использовании
функций сна контроллера может быть достигнуто даже значительно более
длительное время работы.
● 17

Одноэлементные LiPo (литий-полимерные) или литий-ионные батареи обеспечивают
достаточную мощность для ESP32. Однако их напряжение от 3,7 до 4,2 В, в
зависимости от уровня заряда, слишком велико для ESP32. Поэтому оно
регулируется с помощью внутреннего модуля.
Поскольку работа с литий-ионными аккумуляторами всегда сопряжена с
определенной степенью опасности, нельзя упускать следующую информацию:
• Литий-ионные аккумуляторы чутко реагируют на неправильные зарядные
токи или напряжения. При определенных обстоятельствах существует
даже риск возгорания или взрыва.
• Каждый пользователь несет ответственность за собственные проекты.
• Ни Издатель, ни Автор не несут никакой ответственности.

Рис.2.4: Плата NodeESP в режиме
работы
от батареи
.

● 18

Chapter 3 • Programming and Development Environments


Глава 3 • Среды
программирования и разработки
В отличие от ситуации, скажем, с системой Arduino, для работы с MicroPython
доступно несколько интегрированных сред разработки (IDE). В принципе, со всеми
IDE можно писать программы и загружать их на контроллер. Двумя наиболее
распространенными средами программирования в настоящее время являются:
• µPyCraft
• Thonny
Оба имеют свои специфические преимущества и недостатки. Различия заключаются
главным образом в различных процедурах разработки и управления программным
кодом для проектов приложений.
Первый вариант под названием µPyCraft предлагает сравнительно простой
интерфейс для разработки MicroPython на контроллере ESP32. Он работает с
простыми графическими элементами и напоминает текстовые операционные
системы. Работа с отдельными функциями проста для понимания, а работе с
различными меню легко научиться.
Thonny, с другой стороны, имеет полностью графический интерфейс в стиле
Windows. IDE очень популярна среди производителей, особенно потому, что она
доступна в операционной системе Raspbian на Raspberry Pi. Поэтому многие
пользователи Raspberry Pi уже хорошо знакомы с Тонни.
IDE обозначают наиболее важные операционные системы, такие как
• Windows PC
• Mac OS X
• Linux Ubuntu
Если при установке или использовании одной из систем возникают проблемы,
можно использовать другую версию в качестве альтернативной системы
программирования. Выбор версии зависит, конечно, от личных склонностей и
привычек пользователя.

3.1 Установка IDE uPyCraft
Перед установкой uPyCraft IDE на используемом вами компьютере должна быть
установлена последняя версия Python 3.7.X. Если его нет, то установку можно
произвести по следующей инструкции:
1. Загрузите установочный файл со страницы загрузки Python по адресу:
www.python.org/downloads

● 19

2.

После операции загрузки файл с именем python-3.7.X.exe
должен находиться на вашем компьютере. Двойной щелчок по файлу
запускает установку.

3.

Выберите «Add Python 3.7 to PATH» и нажмите кнопку «Install Now».

4.

Процесс установки завершается через несколько секунд, и отображается
сообщение «Setup was successful». После этого окно можно закрыть.

Теперь uPyCraft IDE для Windows можно скачать с
https://github.com/DFRobot/uPyCraft
в виде файла с именем uPyCraft_V1.x.exe. После нажатия на этот файл .exe
откроется uPyCraft-IDE:

Рис.3.1: uPyCraft-IDE
После установки IDE на компьютер можно загрузить микропрограмму ESP32 на чип.
Текущую версию микропрограммы MicroPython для ESP32 можно найти по адресу
http://micropython.org/download#esp32
Там вы прокручиваете до раздела «Модули ESP32». После перехода по ссылке
«Generic ESP32module» вы попадете на страницу загрузки файла ESP32-BIN. Это
будет выглядеть следующим образом:
esp32-idf3-20191220-v1.12.bin
Теперь вы можете запустить uPyCraft-IDE. Под
Tools -> Serial
● 20

Chapter 3 • Programming and Development Environments

выберите порт ESP32-COM, здесь COM5:

Рис.3.2: Выбор порта.
Если плата ESP32 подключена к компьютеру, но порт ESP32 не отображается в
uPyCraft IDE, возможно, отсутствует соответствующий драйвер USB. В этом случае
драйвер необходимо переустановить. Соответствующий драйвер можно найти в
разделе
https://www.silabs.com/products/development-tools/software/usb-to-uartbridge-vcp-drivers
После этого вы можете следовать
Tools -> Board
Далее необходимо выбрать опцию «esp32»:

Рис.3.3: Выбор типа платы
Теперь интерпретатор MicroPython можно записать в ESP32 с помощью
Extras -> Burn Firmware

● 21

Подходящие варианты:





плата: esp32
burn_addr: 0x1000
erase_flash: да
com: COMX (here COM5, see above)

В разделе «USERS» выберите загруженный файл ESP32-BIN, как показано на рис. 3.4.

Рис.3.4: Параметры прошивки
Если все настройки выбраны правильно, то на некоторых вариантах платы
необходимо нажать кнопку "BOOT/FLASH" на плате ESP32. Как только начнется
процесс «EraseFlash», ключ можно отпустить. Через несколько секунд прошивка
должна быть загружена на плату ESP32. Однако во многих случаях загрузка
начнется без нажатия кнопок.
Если экран «EraseFlash» не запускается или отображается сообщение об ошибке,
повторите шаги, описанные выше. Также снова нажмите клавишу «BOOT/FLASH»,
чтобы ESP32 перешел в режим прошивки.

3.2 MicroPython для ESP32
За некоторыми исключениями, все возможности и функции Python также доступны
в MicroPython. Самое большое отличие состоит в том, что микро-версия была
разработана для использования в однокристальных системах, поэтому
классические подпрограммы, необходимые только для ПК, отсутствуют.
По этой причине MicroPython не содержит полной стандартной библиотеки, а только
части, относящиеся к микроконтроллерам. Таким образом, доступны все модули,
необходимые для доступа к используемому устройству. Таким образом, с
соответствующими библиотеками вы можете легко получить доступ к пинам GPIO.
Специально для ESP32 также доступны модули для поддержки сетевых
подключений (Wi-Fi) и Bluetooth. В частности, поддерживаются следующие платы:





● 22

ESP32
ESP8266
PyBoard
Teensy 3.X
WiPy - Pycom

Chapter 3 • Programming and Development Environments
Хотя еще не все функции контроллера ESP полностью доступны в MicroPython,
библиотеки содержат наиболее важные команды и подпрограммы. Поэтому многие
проекты и приложения могут быть реализованы без проблем. Кроме того,
реализация недостающих функций идет быстрыми темпами, так что даже этот
небольшой косметический недостаток будет быстро устранен.
После установки микропрограммы MicroPython на ESP32 вы также можете легко
вернуться, например, в Arduino IDE. Для этого просто загрузите новый код C с IDE
на контроллер. Специальная процедура удаления не требуется. Тем не менее, если
вы хотите снова использовать MicroPython после этого, микропрограмму MicroPython
необходимо снова перепрограммировать.

3.3 "Hello World" для контроллера
В отличие от контроллеров AVR, таких как те, что используются в системе Arduino,
ESP32 может поддерживать полную файловую систему. Первые поколения
контроллеров программировались либо на ассемблере, либо на C. Поэтому
программный код создавался и компилировался в среде разработки. Затем в
контроллер передавался только готовый «машинный код». Таким образом, память
целевой системы всегда содержала ровно одну программу.
Напротив, при программировании на MicroPython несколько программ могут
храниться на чипе ESP32. Затем они могут быть обработаны непосредственно
интерпретатором, который также доступен в системе. Файловой системой можно
управлять напрямую с помощью uPyCraft-IDE. Поэтому рекомендуется более
подробно ознакомиться с IDE, прежде чем загружать первую прикладную программу
в ESP. Среда разработки содержит, как и многие другие инструменты
программирования, следующие компоненты (см. также рис. 3.1):
1.
2.
3.
4.

Folders and files - Папки и файлы
Editor - редактор
MicroPython Shell / Terminal - Оболочка/терминал MicroPython
Tools - Инструменты

В левом подокне («Folders and files») файлы, хранящиеся в данный момент на плате
ESP, видны в папке устройства («device»). Как только плата будет подключена к
uPyCraft-IDE через последовательное соединение, все сохраненные файлы будут
загружены при открытии папки устройства. Сразу после установки интерпретатора
Python здесь виден только файл «boot.py». Для выполнения кода приложения
также необходимо создать файл main.py. Вы можете создать файл main.py,
используя:
file → new
Он создает новый файл ("untitled - без названия"). С помощью значка дискеты в
окне «Tools» этот файл можно сохранить локально под именем «main.py»
в микросхеме ESP.

● 23

Рис.3.5: Создание нового файла «main.py».
Следующие два файла теперь находятся в папке устройства:
• boot.py: выполняется каждый раз при перезагрузке платы
• main.py: основной скрипт для кода приложения.
Папка SD следует за папкой устройства. Эта папка предназначена для доступа к
файлам, хранящимся на SD-карте. Некоторые платы ESP-32 имеют слот для
SD-карты. Если здесь вставлена карта µSD, файлы на карте появятся в папке «sd».
Папка uPy_lib следует ниже. Здесь показаны файлы встроенной библиотеки IDE.
Здесь вы можете найти различные файлы сразу после установки интерпретатора
MicroPython. Они предоставляются как стандартные библиотеки.

Рис.3.6: Стандартные библиотеки в папке uPy_lib.
Последняя папка содержит так называемый «workSpace». Это каталог для
сохранения файлов приложений. Отображаемые здесь файлы хранятся на
компьютере, подключенном через интерфейс. Там должны храниться все активные
файлы.
Поэтому при первом использовании uPycraft рекомендуется создать подходящий
рабочий каталог с именем «workSpace», а затем последовательно использовать его
для работы с контроллером.
В области редактора (2) создается код для прикладных программ .py. Редактор
открывает новую вкладку для каждого файла.

● 24

Chapter 3 • Programming and Development Environments

Раздел под областью редактора — это «MicroPython Shell/Terminal». (3) Все
введенные здесь команды немедленно выполняются платой ESP. Кроме того,
терминал также отображает информацию о состоянии запущенной программы.
Здесь отображаются любые синтаксические ошибки в текущей программе или
сообщения об ошибках при загрузке и т. д.
С помощью символов в области «Tools» в правой части главного окна (4) задачи
можно выполнять быстро и напрямую. Кнопки имеют следующие функции:











New File: создает новый файл в редакторе.
Open File: открывает файл на компьютере.
Save File: открывает файл на компьютере.
Download and run: загрузите код на плату ESP и запустите его.
Stop: Завершает выполнение кода. Это соответствует вводу CTRL + C .
Подключить или отключить последовательный интерфейс.
Последовательный порт можно выбрать в меню Tools -> Serial.
Undo: отменяет последнее изменение в редакторе кода.
Redo: повторить последнее изменение в редакторе кода.
Syntax check: проверяет синтаксис текущего кода.
Clear: удаляет сообщения оболочки / окна терминала.

Чтобы ознакомиться с написанием программы и выполнением кода на ESP32, ниже
будет разработана и выполнена короткая программа на Python, которая заставит
мигать светодиод. Первым шагом является установление связи с платой ESP:
1.
2.
3.
4.

Выберите текущую плату через Tools -> Board
В Tools -> Port выберите COM-порт, к которому подключена ESP-Board.
Затем кнопка Connect устанавливает последовательную связь
с модулем ESP32.
После успешного подключения к плате в окне оболочки
отображается ">>>".

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

ответ

>>> print ('test')
Test
>>>

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

● 25

Теперь можно создать скрипт мигания светодиода. Для этого необходимы
следующие шаги:
1. В окно редактора созданного выше файла main.py вводится
следующая программа:
from machine import Pin
from time import sleep
led = Pin(2, Pin.OUT)
while True:
led.value(not led.value())
sleep(1)

2. Нажав на кнопку «Stop», скрипт, который может быть еще запущен,
может быть остановлен.
3. По нажатию на кнопку "Download And Run - Скачать и запустить"
скрипт записывается в контроллер
4. В окне оболочки теперь должно отображаться сообщение «download ok».

Рис.3.7: Успешная загрузка первой программы.
Теперь встроенный светодиод платы ESP32 должен мигать каждую секунду. Это
означает, что первая программа Python была успешно передана в контроллер и
немедленно выполнена.

● 26

Chapter 3 • Programming and Development Environments

Рис. 3.8: Внутренний индикатор порта 02 в действии.
Некоторые платы не имеют встроенного светодиода. В этом случае к контроллеру
должен быть подключен светодиод и добавочный резистор (см., например, рис. 4.6
и рис. 4.7). Дополнительные сведения и информацию о программе прошивки и
подключении внешних светодиодов можно найти в Разделе 4.4.

3.4 Для профессионалов: Работа с esptool
Если возникают проблемы с µPyCraft-IDE или другие причины не позволяют вам
использовать его, вы также можете загрузить прошивку MicroPython на контроллер
с помощью утилиты под названием esp-tool.
Затем можно даже передавать программы на контроллер через терминал, такой как
PUTTY или TeraTerm. Однако этот метод уже требует некоторых глубоких знаний
интерфейса командной строки или диспетчера устройств. Поэтому эта процедура не
рекомендуется для начинающих. Тем не менее, этот метод будет описан здесь, так
как он также обеспечивает дальнейшее понимание обработки программирования
контроллера. Кроме того, представленные здесь методы также могут быть легко
перенесены в системы Linux или UNIX.
Для работы с esptool в системе должен быть установлен Python 3.7.X или более
новая версия Python. Затем текущую версию esptool можно загрузить на компьютер
через окно терминала с помощью pip install esptool.
pip install esptool
В некоторых установках Python эта инструкция может привести к появлению
сообщения об ошибке. В этом случае следующие инструкции могут привести к
месту назначения:
pip3 install esptool
python -m pip install esptool
pip2 install esptool

● 27

Теперь файл esptool должен быть установлен в стандартную директорию для
исполняемых файлов. Для доступа к контроллеру необходимо знать его серийный
номер порта. Это можно найти в диспетчере устройств:

Рис.3.9: COM-порт ESP32 в диспетчере устройств.
Например, на рисунке номер порта COM3. Это позволяет выполнить следующую
команду в окне терминала:
esptool --port COM3 flash_id
Она предоставляет информацию о системе ESP32, подключенной к этому порту:

Рис. 3.10: Информация о ESP32.
Строки
...
Detecting chip type... ESP32
Chip is ESP32-PICO-D4 (revision 1)
Features: WiFi, BT, Dual Core, Embedded Flash

● 28

Chapter 3 • Programming and Development Environments

Кварц 40MHz
MAC: d8:a0:1d:40:54:14
...
Device: 4016
Detected flash size: 4MB

Таким образом, вы получите важную информацию о типе микросхемы, плате,
доступных интерфейсах, частоте кварца и доступной флэш-памяти.
Теперь вы можете воспользоваться инструкцией
esptool --port COM3 erase_flash
стереть флэш-память чипа.

Рис.3.11: Успешное стирание флэш-памяти.
Это освобождает путь для загрузки прошивки MicroPython. Загрузка прошивки из
Интернета уже была описана в предыдущих главах. Команда для загрузки
esptool --port COM3 --baud 460800 write_flash -fm dio 0x1000
C:\Users\Documents\workSpace\esp32-xxxxxxxx-vx.x.x.bin
Разумеется, здесь снова должен быть указан правильный путь, где находится файл
esp32-20xxxxxx-vx.x.x.bin. Через несколько секунд загрузка должна быть
завершена:

● 29

Рис.3.12: Загрузка прошивки завершена.
Теперь вы можете связаться с ESP через PUTTY или TeraTerm. Скорость передачи
должна быть установлена на 115200:

Рис.3.13: MicroPython отправляет отчеты Tera Terminal.

Первая программа Python уже может быть загружена через терминал, например:
from machine import Pin
import time
p23 = Pin(23, Pin.OUT)
while True:
p23.value(1)
time.sleep(1)
p23.value(0)
time.sleep(.1)

● 30

Chapter 3 • Programming and Development Environments

Рис.3.14: Программирование через TeraTerminal.
После передачи программы светодиод, подключенный к порту 23, должен мигать с
частотой 1 секунду.
Консоль предлагает обычную справочную систему, которая при необходимости
может предоставить полезную информацию:

Рис.3.15: Функция справки в терминале.

● 31

3.5 Thonny — Python-IDE для начинающих
Тонни — хорошая альтернатива uPyCraft. Хотя даже эта среда программирования
еще не полностью свободна от ошибок, в целом с ней можно хорошо работать.
Кроме того, система постоянно обновляется и совершенствуется, так что этот
недостаток также будет устранен в обозримом будущем. Thonny также доступен для
всех распространенных операционных систем. Под Raspbian для Raspberry Pi он
даже установлен по умолчанию. Установка относительно проста, поэтому в
процессе установки вряд ли возникнут проблемы. Обязательным условием для
работы с Thonny является то, что прошивка MicroPython уже загружена на ESP32.
Начинающим рекомендуется использовать µPyCraft-IDE. Эксперты также могут
использовать esptool (см. последнюю главу), чтобы полностью обойти µPyCraft-IDE.
Примеры в этой книге были созданы с помощью Thonny 3.2. В принципе, будущие
версии должны быть совместимы с ним. Однако в случае непредвиденных
проблем следует вернуться к версии, упомянутой выше. Соответствующий пакет
можно загрузить с
https://thonny.org
Когда загрузка будет завершена, вы можете запустить установочный файл. Теперь
вам нужно только следовать за помощником, пока процесс установки не будет
завершен. После этого можно открыть Thonny-IDE.

Рис.3.16: Thonny-IDE после запуска.
Теперь плату ESP32 можно подключить к компьютеру. Чтобы протестировать
установку, Thonny должен быть настроен для интерпретатора MicroPython. Кроме
того, должна быть выбрана используемая плата. Для этого необходимы следующие
шаги:
1.
2.
● 32

Run → Interpreter открывает следующее окно:

Chapter 3 • Programming and Development Environments

Рис.3.17: Окно параметров в Thonny.
2.
3.

В первом окне выбора выберите «MicroPython» (generic).
COM-интерфейс ESP32 должен быть указан в разделе Port.

Теперь Thonny-IDE должна быть подключена к плате, и в окне оболочки должно
появиться приглашение ">>>". В качестве альтернативы можно выбрать опцию
«Try automatic recognition - Попробовать автоматическое распознавание». Однако
она работает не со всеми платами. Наконец, в оболочку вводится команда help().
Она вернет приветственное сообщение и некоторую информацию:
Welcome to MicroPython on the ESP32!
For generic online docs please visit http://docs.micropython.org/
For access to the hardware use the ‚machine' module:
import machine
pin12 = machine.Pin(12, machine.Pin.OUT)
pin12.value(1)
pin13 = machine.Pin(13, machine.Pin.IN, machine.Pin.PULL_UP)
print(pin13.value())
i2c = machine.I2C(scl=machine.Pin(21), sda=machine.Pin(22))
i2c.scan()
i2c.writeto(addr, b'1234')
i2c.readfrom(addr, 4)
Basic WiFi configuration:
import network

● 33

sta_if = network.WLAN(network.STA_IF); sta_if.active(True)
sta_if.scan()

# Поиск доступных точек доступа

sta_if.connect("", "") # Подключиться к AP
sta_if.isconnected()

# Проверяем успешное подключение

Команды управления:
CTRL-A

-- в пустой строке введите необработанный режим REPL

CTRL-B

-- в пустой строке войти в обычный режим REPL

CTRL-C

-- прервать запущенную программу

CTRL-D

-- на пустой строке сделать программный сброс платы

CTRL-E

-- на пустой строке войти в режим вставки

Для получения дополнительной справки по конкретному объекту введите help(obj).
Чтобы получить список доступных модулей, введите help('modules')

Таким образом, установка и ввод в эксплуатацию Thonny успешно завершены.
Аппаратные функции теперь можно активировать с помощью инструкций оболочки.
Преждевсего, можно импортировать машинный модуль:
>>> из машины импортировать пин
Затем светодиод, подключенный к порту 23, можно включить через
>>> led = Pin(23, Pin.OUT).value(1)
В качестве альтернативы можно использовать стандартный светодиод, доступный на
большинстве плат.
>>> led = Pin(23, Pin.OUT). value(0)
соответствующий светодиод снова гаснет.

3.6 Работа с Тонни
В Thonny-IDE есть несколько разных разделов, среди которых редактор и оболочка
или терминал MicroPython:
• В области редактора создается и редактируется код. Можно открыть
несколько файлов, для каждого файла будет доступна новая вкладка.
• В оболочке MicroPython вводятся команды, которые должны немедленно
выполняться платой ESP. Терминал также предоставляет информацию
о статусе выполняемой программы, указывает на ошибки, связанные
с загрузкой, синтаксические ошибки, печать сообщений и т. д.
Также доступны другие полезные вкладки. Их можно настроить в меню View.
Вкладка «Variables - Переменные», в частности, часто может быть использована с
большим преимуществом. Она показывает все переменные программы и их текущие
значения.
● 34

Chapter 3 • Programming and Development Environments
Для ознакомления с написанием программ и выполнением кода на ESP32 снова
используется уже известный скрипт, который заставляет мигать встроенный
светодиод платы ESP32 или внешний светодиод.
Сначала на плате создается файл main.py:
1.

Когда Тонни запускается в первый раз, редактор показывает файлбез
заголовка. Этот файл сохраняется как main.py. Для этого файл
сохраняется через
file → save as
переименован в main.py и сохранен на плате ("Micro Python Device").

2.

Теперь доступна вкладка с именем «main.py».

3.

Здесь вводится следующий код:
from machine import Pin
import time
p23 = Pin(23, Pin.OUT)
while True:
p23.value(1)
time.sleep(1)
p23.value(0)
time.sleep(.1)

Код доступен из папки с кодами, и его можно использовать первоначально путем
копирования и вставки. Позже будет объяснено, как файлы могут быть
скопированы непосредственно с ПК на контроллер.
С помощью зеленой стрелки или
run → run current script
или нажатием функциональной клавиши F5 код передается на контроллер. В
оболочку выводится следующая информация:
MicroPython v1.9.4 on 2018-05-11; ESP32 module with ESP32
Type "help()" for more information.
>>> %Run -c $EDITOR_CONTENT

При перезапуске ESP сначала выполняется boot.py, а затем main.py. Если boot.py
отсутствует, он запускается сразу с main. Таким образом, программа должна стать
активной сразу после загрузки, а светодиод на выбранном порту (№ 23 в примере
выше) должен мигать.

● 35

Для некоторых вариантов платы также может потребоваться нажатие клавиши ESP
EN/RESET.

3.7 Работа с файлами
Чтобы загрузить файл с уникальным именем в ESP с помощью Thonny IDE,
необходимо выполнить следующие шаги:
• Создание нового файла
• Сохраните файл на компьютере под именем, например «blink.py».
Файл можно открыть как новую вкладку в подокне «Этот компьютер». Затем
его можно открыть через меню
file → save as
на котором можно сохранить ESP под своим именем ("blink.py"). В запросе
необходимо выбрать второй вариант "MicroPythondevice" (см. рисунок).

Рис.3.18: Запрос при сохранении
Теперь файл загружен на плату и появится в подокне «Files». Теперь его можно
запустить с помощью зеленой клавиши со стрелкой или F5.
Соответственно, также возможно закачать файлы с чипа на компьютер, выбрав
«Этот компьютер». Другие команды для удаления или переименования файлов и
т.д. также находятся в меню "file".

3.8 Советы по устранению неполадок с Thonny IDE
В текущем разделе будут обсуждаться некоторые сообщения об ошибках
Thonny-IDE. Соответствующие проблемы обычно относительно легко решаются:
• Во многих случаях перезапуск ESP с помощью встроенного ключа
EN/RST уже успешен.
• В Thonny-IDE проблемы со связью между ПК и чипом часто можно
решить, нажав кнопку «Stop / Restart Backend" button - Стоп/Перезапустить
серверную часть» (или CTRL-F2).
В противном случае могут помочь следующие советы:

● 36

Chapter 3 • Programming and Development Environments
Ошибка 1: Нет связи с платой.
В этом случае отображаются сообщения об ошибках:
========================= ПЕРЕЗАПУСК =========================
Unable to connect to COM4 - Невозможно подключиться к COM4
Error: could not open port 'COM4': FileNotFoundError(2, 'The system cannot
find the file specified.', None, 2) - Система не может найти указанный файл

или:
========================= ПЕРЕЗАПУСК =========================
Could not connect to REPL - Не удалось подключиться к REPL
Убедитесь, что ваше устройство имеет подходящую прошивку и не находится в
режиме загрузчика!
Disconnecting - Отключение.

или:
========================= ПЕРЕЗАПУСК =========================
Потеряно соединение с устройством (EOF).

В этом случае часто бывает полезно прервать USB-подключение к модулю, а затем
восстановить его. Вы также должны проверить, установлен ли правильный
последовательный порт в разделе
Run -> Select Interpreter
Эта ошибка также может указывать на то, что последовательный порт уже
используется другой программой, например, последовательным терминалом или
Arduino IDE. В этом случае убедитесь, что все программы, которые могут
последовательно обмениваться данными с картой ESP, закрыты. Затем необходимо
перезапустить Thonny IDE.
Error 2: Thonny IDE не отвечает или выдает внутреннюю ошибку.
После закрытия и повторного открытия активного окна вы сможете продолжить
нормальную работу. При повторяющихся сбоях необходимо перезапустить всю
Thonny-IDE.
Error 3: Thonny IDE больше не реагирует на клавишу «Stop / Restart Backend».
После нажатия кнопки «Stop / Restart Backend» следует подождать несколько
секунд. ESP нужно время, чтобы перезапустить и восстановить последовательную
связь с Тонни. Если кнопка «Стоп» нажата несколько раз или очень быстро одно за
другим, у модуля ESP не будет достаточно времени для правильного перезапуска.
Это может привести к сбою Thonny IDE.
Error 4: Проблема при перезапуске карты ESP, запуске нового скрипта или открытии
последовательного порта.
● 37

Если появляется следующее сообщение об ошибке:
Brownout detector was triggered

или если есть продолжающиеся перезагрузки, или если информация:
ets Jun 8 2016 00:22:57
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:4732
load:0x40078000,len:7496
load:0x40080400,len:5512

это может указывать на аппаратную проблему. Часто это вызвано одной из
следующих проблем:






USB-кабель плохого качества
USB-кабели слишком длинные
Плата ESP имеет дефект, например, плохая пайка
Неисправное USB-подключение к компьютеру
USB-порт компьютера не обеспечивает достаточного питания.

В этих случаях поможет использование качественного и максимально короткого
USB-кабеля. Также может помочь переход на другой USB-разъем на ПК. Для
ноутбуков следует использовать активный USB-концентратор с собственным
внешним блоком питания. Таким образом, вы больше не зависите от
производительности USB-блока питания ноутбука.
Если проблемы сохраняются или появляются другие странные сообщения об
ошибках, рекомендуется обновить плату ESP последней версией микропрограммы
MicroPython. Это, по крайней мере, предотвратит уже исправленные ошибки,
которые могут усложнить работу.
Error 5: нет связи между ПК и ESP32.
Может случиться так, что контроллер слишком загружен для установления
USB-соединения. В этом случае нажатие кнопки «Stop/ Restart Backend» несколько
раз может привести к желаемому успеху. Однако это повторное нажатие должно
происходить через определенные промежутки времени (см. выше).
При запуске скрипта, использующего Wi-Fi, переключающегося в спящий режим
или выполняющего несколько задач параллельно, рекомендуется попытаться
установить связь три или четыре раза. Если это по-прежнему невозможно, следует
повторно прошить ESP с помощью текущей прошивки MicroPython.

● 38

Chapter 4 • First Steps in Programming

Глава 4 • Первые шаги в программировании
Python уже несколько лет является одним из наиболее часто используемых языков
программирования. Одна из причин этого заключается в том, что он был очень
просто спроектирован и поэтому легок в освоении. Разработка MicroPython делает
программирование систем микроконтроллеров сравнительно простым и понятным.
Это делает язык программирования также очень подходящим для новичков в мире
встраиваемых систем.
Разработчики MicroPython поставили перед собой цель максимально упростить
программирование цифровой электроники, таким образом, отхватив максимально
возможный круг пользователей. Программы Python можно найти в сфере хобби, а
также в образовательных или научных целях. Но и профессиональные
разработчики все чаще работают с Python. В ИТ-индустрии многие лидеры рынка,
такие как Google или Amazon, уже давно используют Python для разработки своего
программного обеспечения.
Кроме того, бесплатные модули и библиотеки, такие как MatPlotLib, NumPy, SciKit или
SciPy, предоставляют широкие возможности. Они варьируются от научного анализа
данных до машинного обучения и искусственного интеллекта.
MicroPython был разработан как облегченная версия Python3. Поскольку язык
долженбыть интерпретирован, он обычно медленнее, чем скомпилированные
системы. MicroPython был разработан для максимально эффективной работы на
небольшихвстроенных системах. Следовательно, его также можно запускать на
микроконтроллерах, которые работают намного медленнее и имеют гораздо меньше
памяти, чем обычные персональные компьютеры.
Недостатком классического программирования на Python является сложность
реализации низкоуровневых элементов управления. По этой причине классические
варианты Python используются скорее в качестве второстепенных в аппаратном
программировании. Этот недостаток в значительной степени устранен в
MicroPython. Основываясь на стандарте, версия Micro также сильно основана на
Python 3 по своему синтаксису. Кроме того, существуют виртуальные машины и
связанные с ними библиотеки.
Если сравнить два самых популярных языка программирования в среде
микроконтроллеров, то окажется, что Python чаще предпочитают C/C++. В
рейтингах самых популярных языков программирования Python все чаще занимает
первое место. С другой стороны, конкурент C/C++ все чаще отводится на более
низкие позиции. Причина такого развития в основном основана на следующих
преимуществах. Python:
• Python очень удобен для начинающих благодаря простой языковой структуре.
• Различные интернет-форумы поддерживают программиста учебными
пособиями и примерами кода.
• Имеются обширные библиотеки.
Новички обычно быстро находят решения своих проблем на форумах. В других
языках эта форма взаимной поддержки выражена не так ярко.

● 39

В C программирование осуществляется с помощью управляющих регистров,
указателей и других структур и инструкций, которые часто трудно понять.
Прошивка для целевого контроллера должна быть запрограммирована,
скомпилирована и, наконец, передана в контроллер с помощью программатора.
MicroPython объединяет все эти шаги. Простым щелчком мыши пользователи могут
управлять низкоуровневым оборудованием, таким как светодиоды, дисплеи или
двигатели. Получение аналоговых значений напряжения или работа с SD-картами
становится детской игрой с соответствующими библиотеками. Интегрированная
очистка памяти и процесс динамического выделения обеспечивают эффективное
управление памятью в Python. Это означает, что вам вряд ли придется прибегать к
указателям или подобным конструкциям, которые новичкам обычно трудно понять.
Часто загадочные C-символы, такие как x++, и т. д., а также сложное
объявление переменных представляют собой препятствие для новичка. Python
известен своей простотой и отличной читабельностью кода.
Поскольку MicroPython разрабатывался как «облегченная версия» для МК,
поддерживаются не все библиотеки и функции стандартного Python. Тем не менее,
вы можете легко переключиться на микроверсию, если вы уже знакомы с Python.
Лишь несколько синтаксических структур или инструкций недоступны или не
применимы в MicroPython.
Питон интерпретируется. Это означает, что исходный программный код
обрабатывается непосредственно целевым процессором. Поэтому компиляция не
требуется. Таким образом, Python предлагает возможность выполнять программу,
когда-то написанную, в самых разных системах. Для этого необходимо установить
только соответствующий интерпретатор. Одним из самых больших преимуществ
кода Python является его полная совместимость. Программы Python могут
выполняться на классических компьютерах под управлением Windows, MacOS или
Linux, а также на небольших одноплатных системах, таких как Raspberry Pi или
аналогичных микросистемах. В частности, использование на «RPi» (нем. «Raspi»)
также способствовало росту популярности Python.
С появлением новых мощных контроллеров, таких как ESP32, стало возможным
эффективно и удобно использовать Python и в этой области. Прочно
интегрированные проекты гарантируют, что программы могут быть легко
разработаны как в малых, так и в больших масштабах. Таким образом, Python
превосходно масштабируется. Возможная инкапсуляция данных и программного
кода в четкие, удобные для использования модули, т. е. объекты, делает Python
объектно-ориентированным языком программирования. C++ обычно используется в
настоящее время, особенно в аппаратно-ориентированном программировании.
Классические варианты Python до сих пор плохо подходили для этой цели. С
MicroPython этот пробел закрыт.
C++ включает клиентские приложения, а также мощные серверные приложения,
драйверы устройств и встроенные компоненты драйверов. Область применения
варьируется от системного программного обеспечения до прикладного
программирования. Поскольку Python — относительно новый язык
программирования по сравнению с C, он еще не нашел универсального применения
во всех областях информационных технологий. Однако видно, что Python набирает
силу практически во всех областях.
Главным недостатком Python, безусловно, является его сравнительно низкая
скорость обработки. Здесь компилируемые языки, такие как C, могут ясно показать
свои преимущества. Быстрые циклы управления или системы реального времени,
управление транспортными средствами и запросы безопасности могут быть
реализованы намного проще и безопаснее на C.
● 40

Chapter 4 • First Steps in Programming
Однако, поскольку эти области применения вряд ли играют роль для
непрофессиональных пользователей, недостаток скорости едва ли значителен.
Python также приобрел особое значение в очень актуальной области
искусственного интеллекта (ИИ). Благодаря обширным библиотекам, таким как
NumPi, SciPi и т. д., и таким дистрибутивам, как Anaconda, Python на сегодняшний
день стал самым популярным языком программирования. Поэтому все двери
открыты для опытного пользователя Python. От программирования контроллера,
связанного с аппаратным обеспечением, до приложений ИИ — с Python нет
ограничений для интуиции и творчества.
В этой главе будут собраны основы MicroPython. У вас должна быть
функциональная среда программирования, потому что команды и инструкции
всегда иллюстрируются практическими примерами. Затем их можно сразу же
протестировать непосредственно на целевом оборудовании, то есть на ESP32. Это
не остается чисто теоретическим курсом программирования, а полученные знания
можно сразу применять на практике.

4.1 Никогда без: Комментарии
Пояснительные комментарии важны в любом языке программирования. Это
единственный способ узнать месяцы или годы спустя, что делает определенный
раздел программы, без необходимости снова и снова вникать в старые детали.
Нет необходимости комментировать каждую строку программы по отдельности.
Опытные программисты должны понимать отдельные инструкции без комментариев.
Только в случае специальных конструкций или необычных или инновационных строк
кода рекомендуется однострочный комментарий. С другой стороны, для подпрограмм
или
целых
логических
частей
программы
не
должно
отсутствовать
краткое объяснение того, как они работают.
Простые комментарии будут начинаться со знака #. Они начинаются с # и
заканчиваются концом строки:
>>> print("hello ESP32") # this is a comment
hello ESP32

Многострочные комментарии также могут быть помечены тройным двойным
кавычком (""). Затем та же строка символов завершает комментарий:
"""
fiпервая строка комментария
вторая строка комментария
"""
На практике это может выглядеть так:
'''
This is a multi-line comment.
Prints "hello world".
'''

● 41

print("hello world")

Кроме того, функция комментирования может быть использована в Тонни. Это
позволяет пометить несколько строк как комментарии одновременно знаком #
(решётка).

Рис.4.1: Функция комментариев в Thonny.
Функция комментариев также очень удобна для комментирования определенных
частей программы. Если, например, при тестировании более объемного кода
некоторые разделы не будут выполняться в пробном режиме, их можно пометить
знаком комментария. Линии тогда больше не наблюдаются интерпретатором. Это
делает ненужным длительное удаление и последующую повторную вставку
разделов программы.
Комментарии помогают новичкам лучше понять структуру программы. С
технической точки зрения интерпретатор игнорирует все комментарии, т.е. они не
влияют на ход программы.

4.2 Оператор Print()
Информация может быть выведена на терминал с помощью инструкции print().
Команду можно выполнить прямо в терминале:

Рис.4.2: Команда печати в консоли.
С другой стороны, он используется в программах для вывода текстовой информации:

● 42

Chapter 4 • First Steps in Programming

Рис.4.3: Команда печати как программная инструкция.
print() может содержать несколько строк, разделенных ",":
>>> print("hello", "world!")
hello world!

Оператор print() выполняет разрыв строки по умолчанию. С
end = ""
это можно подавить:
print("hello", end=" ")
print("world")

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

Следующие две иллюстрации снова иллюстрируют версии инструкций печати в
Thonny-IDE:

Рис.4.4: Команда печати как программная инструкция в Thonny.

● 43

Рис.4.5: Команда печати в консоли Thonny.

4.3 Отступы и блоки
MicroPython различает разные блоки по отступу. Нет необходимости использовать
фигурные скобки ("{}") или подобные. Это одно из основных отличий от
большинства других языков, таких как C, Pascal, Basic и т. д. Преимущество этого
метода в том, что он практически вынужден придерживаться определенной степени
структуры программы.
if True:
# block 01
print ("True")
else:
# block 02
print ("False")

Количество пробелов для отступов может быть разным, но в одном и том же блоке
всегда должно поддерживаться одинаковое количество пробелов для отступов.
В противном случае отображается сообщение об ошибке:
if True:
print ("Answer")
print ("True")
else:
print ("Answer")
print ("False")

# Другой отступ приведет к ошибке во время выполнения.

Это приводит к следующему сообщению:
>>> %Run -c $EDITOR_CONTENT
Traceback (most recent call last): - (последний вызов
File "", line 6
IndentationError: unexpected indent - неожиданный отступ

● 44

Chapter 4 • First Steps in Programming
В условиях и циклах блоки формируются одинаково.

4.4 Управляемое оборудование: цифровые входы и выходы
В отличие от программирования на ПК или ноутбуке, MicroPython обычно
фокусируется на прямом доступе к аппаратным функциям. Особое значение имеет
управление отдельными пинами ввода/вывода (пины ввода/вывода или GPIO для
ввода/вывода общего назначения).
Чтобы проверить инструкции на практике, все, что вам нужно сделать, это
подключить светодиод с последовательным резистором к ESP32. На следующем
рисунке показана соответствующая схема подключения:

Рис.4.6: Схема подключения светодиода к порту 25.
Схема на макетной плате выглядит так:

Рис.4.7: Светодиод подключен к порту 25.
Что касается программного обеспечения, цифровой вывод должен быть сначала
инициализирован. Для этого создается переменная, соответствующая пину. Это не
просто номер пина, а полноценный объект, который знает все аспекты пина. Чтобы
использовать пины, класс "Pin" должен быть импортирован из модуля "machine".
From machine import Pin

● 45

После этого уже можно выполнить инициализацию ножки светодиода:
led = Pin(25, Pin.OUT)

Цифра 25 — это номер GPIO,которая обычно находится на плате напротив
соответствующего контакта. Инструкция определяет этот контакт как выход.

Рис.4.8: Номера контактов здесь (здесь 25 и 26) на плате ESP.
Теперь ножку LED можно использовать:
led.value(1)

Он устанавливает порт ввода-вывода в «1», т. е. теперь он несет напряжение 3,3 В.
Если все подключено правильно, светодиод на порту 25 загорится после выполнения
команды
через
консоль.
Сброс
пина
в
«0»
(0
вольт)
выполнит
следующую инструкцию:
led.value(0)

Вместе с инструкцией сна (см. также следующую главу) из модуля time теперь вы
можете запрограммировать светодиодную мигалку (blink_simple.py):
# blink_simple.py
from machine import Pin
from time import sleep
led = Pin(25, Pin.OUT)
while True:
led.value(1)
sleep(1)
led.value(0)
sleep(1)

Из-за инструкции ожидания
sleep(1)

теперь светодиод мигает с интервалом в одну секунду, т. е. с периодом в две
секунды или с частотой 0,5 герц.

● 46

Chapter 4 • First Steps in Programming
Каждый контакт ввода-вывода также может использоваться как цифровой вход.
Соответствующее инициирование осуществляется через:
pin_in = Pin(25, Pin.IN)

Это позволяет определить уровень, подаваемый на контакт, т. е. 0 для 0 В и 1 для
3,3 В. Открытый вход, т. е. контакт без какого-либо соединения, не дает надежного
результата. Сигналы помех, такие как помехи 50 Гц, сигналы WLAN или
радиочастоты, могут случайным образом изменять уровень. Для предотвращения
этого необходимы так называемые подтягивающие или ограничивающие резисторы.
С ESP32 они могут быть включены даже внутри. С использованием
pin_in = Pin(2, Pin.IN, Pin.PULL_UP)

гарантирует, что на неподключенный вход поступает сигнал высокого уровня.
Соответственно,
button_pin = Pin(2, Pin.IN, Pin.PULL_DOWN)

несет низкий сигнал на открытом входе. С помощью следующей программы можно
протестировать функции:
# read_pin_25.py
from machine import Pin
from time import sleep
pin_in = Pin(25, Pin.IN, Pin.PULL_DOWN)
while(True):
print(pin_in())
sleep(1)

На рисунке схема выглядит так:

Рис.4.9: Регистрация уровней напряжения.

● 47

При настройке оборудования можно использовать отрезок провода для проверки
схемы, которая подключена к GND или 3,3 В:

Рис. 4.10: Аппаратная структура для считывания уровней напряжения
В зависимости от того, подключена ли перемычка к GND (0 В) или 3V3, на клемме
появляется значение 0 или 1. Если вход разомкнут, на терминале отображается 0
(для ограничения) или 1 (для подтягивания).
ВНИМАНИЕ: Ни в коем случае нельзя подключать вход к 5 В. Это может привести
к выходу из строя микросхемы. Выводы ESP32 могут управляться только
сигналами с максимальным напряжением 3,3 В!
Резистор 1 кОм используется для защиты входа. Это снижает вероятность
непреднамеренного применения чрезмерного напряжения, вызывающего
повреждение. Тем не менее, вы всегда должны избегать подачи напряжения выше
3,3 В на вывод ESP32.

4.5 Управление временем и сон
В примере с мигающим светодиодом инструкция задержки уже использовалась. Она
содержится в модуле «time» и управляется
import time

С оператором
time.sleep(seconds)

можно установить фиксированное время задержки в секундах. Кроме того, можно
импортировать только саму команду сна:
from time import sleep

● 48

Chapter 4 • First Steps in Programming

Тогда инструкцию можно сократить до
sleep(seconds)

Хотя команду можно использовать и для долей секунды, для очень коротких
задержек рекомендуется использовать
time.sleep_ms(milliseconds)

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

Они показывают текущее время работы системы в милли- или микросекундах.
Классическим приложением является измерение времени выполнения программы. С
помощью следующего кода можно показать, например, что математические операции
требуют определенного времени:
# runtime.py
import time
import math

while(True):
start = time.ticks_us()
# x = math.exp(math.sin(22.5))
stop = time.ticks_us()
print(stop-start)

Если перед расчетом убрать знак комментария, отображаемая скорость обработки
увеличится где-то от 100 050 мкс до 100 170 мкс. Таким образом, время
вычисления формулы составляет около 120 мкс.

● 49

4.6 Важные значения: переменные и константы
В Python особенно легко создавать переменные. Нет необходимости указывать тип
данных переменной во время присваивания. Это главное отличие от других языков.
Там переменные всегда должны быть явно инициализированы с определенным
типом (например, int a =...)
Переменные также можно использовать в консоли:
>>> a = 17
>>> print(a)
17

К присвоению имен переменных применяются следующие правила:
• Имя переменной должно содержать только цифры, буквы и
символы подчеркивания.
• Первым символом имени переменной должна быть буква или
знак подчеркивания.
• Имя переменной чувствительно к регистру.
Переменным могут быть присвоены значения разных типов. Типы в MicroPython
включают числа, строки, списки, словари, кортежи и т. д. С помощью type() можно
проверить тип данных переменных и констант, например.
>>> a = 17
>>> print(type(a))
2

**

Показатель степени

11 // 3 ==> 3

2 ** 3 ==> 8

Логические операторы "not", "and" и "or" также доступны в MicroPython:

a

not a

True

False

False

True

● 53

a

b

a and b

a or b

True

True

True

True

True

False

False

True

False

True

False

True

False

False

False

False

Битовые операторы представлены в Python следующими инструкциями:
Побитовое
Побитовое
Побитовое
Побитовое

&
|
^
~

AND
OR
XOR
NOT

Также можно использовать операторы сдвига:
> Move bits

Переместить биты влево
Переместить биты вправо

Следующие примеры иллюстрируют применение:
>>> a = 0b1010
>>> b = 0b1100
>>> bin(a&b)
‚0b1000'
>>> a = 0b1010
>>> bin(a>> H
>>> ytho

Существующую строку можно «обновить», присвоив переменную другой строке,
возможно, снова. Новое значение может быть связано с его предыдущим
значением или с совершенно другой строкой. Например
var = 'Hello World!'
print ("Updated String : ", var[:6] + 'Python')

дает результат
>>> Updated String : Hello Python

Важным моментом при работе со строками являются «escape characters экранирующие символы». Следующая таблица содержит список этих
управляющих или непечатаемых символов, которые могут отображаться с
обратной косой чертой.

● 58

Character

Function

Effect

\b

Backspace

Шаг назад

\n

Новая линия

Разрыв строки

\r

Возврат каретки

Возврат каретки

\s

Space

Space

\t

Tab

Tabulator

Chapter 4 • First Steps in Programming

Например, оператор
>>> print("Hello \n World")

дает результат
>>> Hello
World

● 59

Глава 5 • Контроллер в практическом использовании
Теперь, когда вы знакомы с некоторыми важными основами программирования,
пришло время для первых практических приложений. Помимо вывода на консоль,
светодиоды, в частности, будут использоваться в качестве индикаторов состояния
портов. Это уже позволяет реализовать некоторые интересные приложения.
В этих примерах можно использовать либо встроенные светодиоды отдельных плат,
либо внешние светодиоды. Встроенные светодиоды обычно подключаются к порту
02. Особенно это касается платы NodeMCU. Плата Node-ESP даже имеет
многоцветный светодиод трех цветов, подключенный к портам 00, 02 и 04.
Комплект Pico не имеет встроенного светодиода. В этом случае вам придется
переключиться на внешние светодиоды (см. рис. 4.6 или 4.7). Не забудьте
добавочный резистор.

5.1 Мигающий LED как имитатор системы охранной сигнализации
Мигающий светодиод уже реализован в разделе 4.4. В отличие от постоянно
горящих дисплеев мигающие огни привлекают внимание. Поэтому мигание часто
привлекает внимание к исключению или опасной ситуации. Например, постоянно
горящий светодиод на морозильной камере обычно указывает на то, что устройство
работает нормально. Если светодиод начинает мигать, это обычно указывает на то,
что температура внутри больше не соответствует заданному значению. То же самое
относится и к электроприборам на батарейках. Горящий светодиод указывает на
полный заряд батареи. Если светодиод начинает мигать, остается лишь небольшое
количество энергии.
Для систем сигнализации мигающий или мигающий светодиод указывает на то, что
устройство активировано. Таким образом, светодиод в режиме мигания может
использоваться в качестве симулятора системы охранной сигнализации. Вариации
таких устройств действительно используются на практике. Их можно, например,
установить в автомобиле. Их невозможно отличить от настоящей, вооруженной
сигнализации, и они удержат от взлома хоть каких-нибудь воров-авантюристов.
Соответствующую программу опять же можно найти в прилагаемой папке с кодами.
# Alarmsimulator.py
from machine import Pin
from time import sleep
led = Pin(2, Pin.OUT)
while True:
led.value(1)
sleep(.1)
led.value(0)
sleep(5)

Единственное отличие от программы перепрошивки состоит в том, что значения в
инструкциях sleep() были изменены на 0,1 или 5. Это превращает обычное мигание
в короткое. Как только новая программа будет загружена, светодиод будет
кратковременно мигать каждые пять секунд, и симулятор системы охранной
сигнализации готов к использованию.
● 60

Chapter 5 • The Controller in Practical Use

5.2 Полезно в экстренной ситуации: автоматический сигнал SOS
Еще одно интересное приложение — автоматический сигнал SOS. Это может даже
спасти жизнь в нештатных ситуациях. Чтобы подать сигнал SOS, светодиод должен
сначала мигнуть тремя короткими вспышками, затем тремя длинными и, наконец,
снова тремя короткими. Эта последовательность сигналов должна постоянно
повторяться.
Код имитатора охранной сигнализации можно легко изменить так, чтобы светодиод
подавал нужный сигнал:
# SOS.py
from machine import Pin
from time import sleep
led = Pin(2, Pin.OUT)
while True:
# "S"
led.value(1)
sleep(.1)
led.value(0)
sleep(.5)
led.value(1)
sleep(.1)
led.value(0)
sleep(.5)
led.value(1)
sleep(.1)
led.value(0)
sleep(1)
# "O"
led.value(1)
sleep(.4)
led.value(0)
sleep(.5)
led.value(1)
sleep(.4)
led.value(0)
sleep(.5)
led.value(1)
sleep(.4)
led.value(0)
sleep(1)

● 61

# "S"
led.value(1)
sleep(.1)
led.value(0)
sleep(.5)
led.value(1)
sleep(.1)
led.value(0)
sleep(.5)
led.value(1)
sleep(.1)
led.value(0)
sleep(1)
sleep(2)

Это, конечно, не самый элегантный метод генерации сигнала SOS. Однако эта
программа демонстрирует, что даже без обширных знаний языка программирования
Python вы можете реализовать свои собственные полезные проекты. В разделе 6.4
показано, как такую программу можно реализовать гораздо эффективнее.
Тем не менее, программа выполняет свою задачу. Если используется особенно яркий
светодиод, схема может оказаться весьма полезной в таких ситуациях, как бедствие на
море или в горах.

● 62

Chapter 6 • Program Structures

Глава 6 • Структуры программ
Ни один язык программирования не может обойтись без управляющих структур.
Для этой цели MicroPython предоставляет инструкции ветвления и цикла. Пример
генерации сигнала SOS уже показал, что при программировании часто приходится
повторять множество одинаковых или похожих последовательностей. Циклы
предлагают гораздо более элегантный метод для этой цели, чем простое
повторение инструкций в коде.
Если необходимо принять решение, необходимы инструкции по ветвлению. Это
позволяет программе правильно реагировать на различные ситуации.
В отличие от других языков программирования, MicroPython обладает очень
широкими функциональными возможностями, когда речь идет о циклах. Это будет
объяснено в следующих разделах.

6.1 Условия и циклы
В ответвлении условие определяется в программе ключевыми словами «if - если» и
«else - иначе». В зависимости от того, истинно это условие или нет, программа будет
продолжаться в разных точках. Итак, программа возвращает
Temperature = 2
if temperature < 3:
print("Risk of frost" )
else:
print("No danger of frost")

это приведет к выводу
>>> Risk of frost

Если вместо этого установлено, что Temperature = 17, выход будет
>>> No danger of frost

Результат после ключевого слова «if» возвращает логическое выражение. Это
может быть либо правдой, либо ложью. Если выражение истинно, операторы
выполняются сразу после строки if. Эти операторы должны иметь отступ, чтобы
было ясно, какие операторы принадлежат блоку if. Обратите внимание, что
логические выражения в строке if должны заканчиваться двоеточием.
Операторы «else» выполняются только в том случае, если запрос if неверен.
Циклы используются для повторения инструкций. С помощью циклов блоки кода могут
выполняться несколько раз. Выполнение продолжается до тех пор, пока не будет
выполнено заданное условие. В MicroPython доступны два типа циклов:

● 63

• циклы while
• для циклов
Если вы хотите вывести на консоль числа от 1 до 10, можно использовать
следующий цикл while:
number=1
while number amplitude:
dac1.write(255)
else:
dac1.write(0)

функция прямоугольника также может быть сгенерирована одновременно. Полная
программа MicroPython для этого выглядит так:
# sinus_square_generator.py
from math import sin, pi
from machine import DAC
from machine import Pin
dac0 = DAC(Pin(25))

● 78

Chapter 7 • Analogue-Signal Generation
dac1 = DAC(Pin(26))
offset = 128
amplitude = 127
bufferlength = 100
# create a buffer containing a sine-wave
buf = bytearray(100)
for n in range(len(buf)):
buf[n] = offset + int(amplitude * sin(2*pi*n/len(buf)))
while 1:
for i in range(len(buf)):
dac0.write(buf[i])
if buf[i] > amplitude:
dac1.write(255)
else:
dac1.write(0)

Кривые напряжения на пинах 25 и 26 снова можно посмотреть с помощью
осциллографа:

Рис.7.5: ESP32 как генератор синуса/прямоугольника.
ЦАП можно использовать для широкого спектра приложений, таких как
аудиовыход, генерация звука или цифровые синтезаторы. Специальная
конфигурация также могут быть сгенерирована таким образом:
# sinus_square_generator.py
from math import sin, pi
from machine import DAC
from machine import Pin
dac0 = DAC(Pin(25))

● 79

offset = 128
amplitude = 127
buffferlength = 100
# create a buffer containing a sine-wave
buf = bytearray(buffferlength)
for n in range(len(buf)):
buf[n] = offset + int(amplitude * sin(2*pi*n/len(buf)))
# insert special values
buf[25] = offset
buf[75] = offset
while 1:
for i in range(len(buf)):
dac0.write(buf[i])

Программа выдает «возмущенный» синусоидальный сигнал, который
кратковременно падает до 0 В при достижении пикового напряжения. Такой сигнал
нужен, если вы хотите протестировать специальные усилители или фильтры. С
помощью такого сигнала можно проверить, правильно ли схемы реагируют на эти
формы сигналов.

Рис.7.6: Искаженный синусоидальный сигнал.

● 80

Chapter 8 • Interrupts and Timers

Глава 8 • Прерывания и таймеры
В среде МК временные прерывания работающей программы называются
прерываниями. Они используются для выполнения часто критического процесса.
Типичными приложениями являются аварийные сообщения или защитное
отключение компонентов и частей машины. Если, например, генератор
контролируется электронным способом, на сигнал превышения температуры от
датчика необходимо реагировать немедленно. Временные задержки из-за
мгновенной высокой загрузки процессора могут иметь в этом случае
катастрофические последствия и поэтому недопустимы.
Прерывания также необходимы для использования таймеров. Здесь аппаратные
блоки в контроллере устанавливают определенные временные интервалы. Если они
истекли, запускается прерывание. Это позволяет достичь очень точной
синхронизации независимо от нагрузки на ядро основного процессора. Типичными
приложениями являются часы и все виды контроля времени. Точность таймеров в
конечном счете зависит только от точности кварца процессора. Поскольку точность
в диапазоне 1/1000 может быть достигнута без проблем, таймеры используются во
многих практических приложениях.

8.1 Требуется нарушение: прерывания
IПрерывания используются, когда необходимо быстро реагировать на
непредвиденные или нестандартные события. Если изменение состояния
обнаружено на прерываемом выводе, отдельный аппаратный блок в контроллере
запускает событие прерывания. Таким образом, нет необходимости постоянно
контролировать соответствующий вывод с помощью процедуры запроса. После
запуска прерывания может быть вызвана предопределенная функция, которая
соответствующим образом реагирует на событие.
Когда происходит прерывание, процессор прекращает выполнение основной
программы, чтобы выполнить процедуру обработки прерывания. Только когда это
будет выполнено, он вернется в основную программу. Следующий рисунок
иллюстрирует этот процесс:

Рис.8.1: Прерывания.
Таким образом, процедуры прерывания выполняются квазипараллельно с основной
программой. Но это не настоящая параллельная обработка. Процессор скорее
обрабатывает основную программу и программу прерывания одну за другой.
● 81

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

8.2 Автоматический ночной свет
В этом разделе объясняется, как настроить прерывания в MicroPython. Например,
считывается кнопка. Эта кнопка предназначена для включения светодиода на
определенный период времени. После этого светодиод должен автоматически
погаснуть. Применением этой схемы может быть, например, автоматическое
освещение ванной комнаты или лестничной клетки. Но такие схемы также
используются для внутреннего освещения в транспортных средствах. Благодаря
яркому белому светодиоду плата ESP также может использоваться в качестве
автоматической прикроватной лампы. На рис.8.2 показана принципиальная схема.
Для получения дополнительной информации об аппаратных таймерах ESP32
обратитесь к следующей главе.

Рис.8.2: Схема автоматического ночного освещения.
Для использования прерываний машинный модуль сначала снова импортируется, а
затем используется для доступа к аппаратным функциям:
from machine import Pin

Кроме того, методы сна необходимы, потому что позже в программе требуется
период ожидания:
from time import sleep

Переменная используется для запроса того, была ли нажата клавиша. Эта переменная
определена
глобально,
потому
что
она
модифицируется
в
функции
обработки прерывания. Достаточно, если она может принимать логические значения
True или False. Инициализация выполняется с False:
key_pressed = False

● 82

Chapter 8 • Interrupts and Timers
В случае прерывания должна быть запущена следующая процедура:
def interrupt_handler(pin):
global key_pressed
key_pressed = True

Эта функция вызывается каждый раз при нажатии клавиши. Функция
interrupt_handle имеет входной параметр (pin), в который передается объект класса
Pin, если происходит прерывание. Параметр указывает, на каком выводе сработало
прерывание. Если используется только один вывод прерывания, эта информация не
нужна. Однако, если несколько прерываний могут запускать одну и ту же функцию
обработки прерываний, может представлять интерес, какой GPIO инициировал
прерывание.
В примере theinterrupt_handler изменяет переменную key_pressed на True.
Поскольку время обработки функции прерывания должно быть как можно короче,
следует по возможности избегать таких функций, как sleep() или print().
Следовательно, инструкции, которые должны выполняться при возникновении
прерывания, должны находиться в основной программе.
Чтобы переменную можно было использовать как внутри функции, так и во всем
коде, ее необходимо объявить «глобальной». В противном случае переключение
светодиода не сработало бы, поскольку изменение переменной имело бы эффект
только внутри функции, но не в основной программе.
Написав
led = Pin(25, Pin.OUT)
button = Pin(4, Pin.IN)
пины для светодиода и кнопки определены. Инструкция
button.irq(trigger=Pin.IRQ_RISING, handler=handle_interrupt)

вызывает срабатывание прерывания всякий раз, когда нажимается клавиша.
Параметр «триггер» может принимать следующие значения:
• IRQ_RISNING: Trigger on rising edge
• IRQ_FALLING: Trigger on falling edge
Если прерывание срабатывает, контроллер переходит к процедуре обработки
прерывания, а для переменной key_pressed устанавливается значение True.
После возврата в основную программу отображается сообщение "Interrupt
detected! - Обнаружено прерывание!" . Кроме того, сообщается, на каком выводе
сработало прерывание. Затем светодиод включается на указанный период времени,
а затем снова выключается. Наконец, key_pressed снова устанавливается в False, и
контроллер доступен для следующего прерывания. Полная программа выглядит
так:

● 83

# LED_interrupt.py
from machine import Pin
from time import sleep
timeOn=3
key_pressed=False
def handle_interrupt(pin):
global key_pressed
key_pressed=True
led = Pin(25, Pin.OUT)
button1 = Pin(4, Pin.IN)
button1.irq(trigger=Pin.IRQ_RISING, handler=handle_interrupt)
while True:
if key_pressed:
print('Interrupt detected')
led.value(1)
sleep(timeOn)
led.value(0)
key_pressed = False

В этом примере используется уже известная команда sleep(), чтобы светодиод
оставался включенным в течение трех секунд. На данный момент, однако,
приложение таймера было бы лучшим решением. Как и почему используются
таймеры, показано в следующем разделе.

8.3 Мастера времени: таймеры
Таймеры можно использовать для различных задач. Среди наиболее
распространенных приложений
• периодический вызов функции
• подсчет событий
• генерация сигналов ШИМ
Каждый таймер состоит из двух 16-битных каналов, которые можно связать в
32-битный таймер. Режим работы должен быть настроен для каждого таймера, но
период или частота могут быть выбраны независимо для каждого канала. С
помощью метода обратного вызова событие таймера может вызвать функцию
python. Таким образом, следующая программа заставляет светодиод мигать:

# LED_timer.py
import machine
led = machine.Pin(25, machine.Pin.OUT)
timer = machine.Timer(0)

● 84

Chapter 8 • Interrupts and Timers

def handleInterrupt(timer):
led.value(not led.value())
timer.init(period=1000, mode=machine.Timer.PERIODIC,
callback=handleInterrupt)

Отличие от классической программы с функцией sleep() в том, что контроллер не
блокируется использованием функции таймера. Во время выполнения функции
sleep() ядро процессора занято только подсчетом тактов. Ядро не может выполнять
никаких других задач, помимо этого. Таким образом, функция sleep() является "
обструктивной". С другой стороны, длятаймеров доступны отдельные аппаратные
блоки, не нагружающие ядро основного процессора.
О том, что ядро процессора остается свободным для других задач при
использовании прерывания, свидетельствует и появление командной строки >>> в
оболочке. Следовательно, вы можете продолжать работать здесь одновременно:

Рис.8.3: Таймер работы и активная оболочка.
Другие функции также могут выполняться в программе, пока таймер активен.
Следующий код приводит к тому, что led1 на контакте 25 мигает с периодом 125 мс,
в то время как led2 на порте 26 мигает каждую секунду:
# LED_timer_and_mainprogram.py
from machine import Pin, Timer
from time import sleep
led1 = Pin(25, Pin.OUT)
led2 = Pin(26,Pin.OUT)
timer = Timer(0)

● 85

def handleInterrupt(timer):
led1.value(not led1.value())
timer.init(period=125, mode=Timer.PERIODIC, callback=handleInterrupt)
while True:
led2.value(1)
sleep(.1)
led2.value(0)
sleep(1))
Второй светодиод должен быть подключен к порту 26 с последовательным резистором.

Наконец, следующая программа показывает, что два светодиода с совершенно
разными частотами можно переключать с помощью двух таймеров:
# LED_double_timer.py
import machine
led1 = machine.Pin(25, machine.Pin.OUT)
led2 = machine.Pin(26, machine.Pin.OUT)
timer1 = machine.Timer(0)
timer2 = machine.Timer(1)
def handleInterrupt1(timer1):
led1.value(not led1.value())
def handleInterrupt2(timer2):
led2.value(not led2.value())
timer1.init(period=125, mode=machine.Timer.PERIODIC,
callback=handleInterrupt1)
timer2.init(period=517, mode=machine.Timer.PERIODIC,
callback=handleInterrupt2)

Без прерываний и таймеров эта относительно простая задача была бы
невыполнима.

8.4 Многофункциональный проблесковый маячок
RКрасные велосипедные фонари сегодня оснащены несколькими мощными
светодиодами. Кроме того, в дополнение к непрерывному световому режиму часто
можно установить различные схемы сигналов. Таким образом можно привлечь
повышенное внимание. Мигающие задние фонари, постоянно установленные на
велосипеде, незаконны, но ношение дополнительных фонарей на шлеме или рюкзаке
разрешено
при
определенных
обстоятельствах.
Однако,
прежде
чем
использовать «мигалку» на дороге, всегда следует ознакомиться с текущей правовой
ситуацией.

● 86

Chapter 8 • Interrupts and Timers

Рис.8.4: Светодиодный велосипедный задний фонарь.
С контроллером ESP можно легко воспроизвести многофункциональную мигающую
лампочку. Запроектированный задний фонарь должен иметь следующие
эксплуатационные характеристики:






5 LED
Постоянный свет
Мерцание
Мигание
Эффект погони

Переключение между отдельными рабочими состояниями является классическим
применением прерывания. Без использования технологии прерывания эффективное
управление переключением было бы невозможно.
Следующая программа выполняет эту работу:
# bike light.py
from machine import Pin
from time import sleep
LED = [25,26,32,27,14]
del_time = 0.1
mode=1
def handle_interrupt(button1):
global mode
mode+=1
if(mode>4):
mode=1
print(mode)
button1 = Pin(4, Pin.IN)
button1.irq(trigger=Pin.IRQ_RISING, handler=handle_interrupt)

● 87

for n in range(len(LED)):
LED[n] = Pin(LED[n],Pin.OUT)
while True:
if (mode==1):

# все светодиоды горят

for n in range(len(LED)):
LED[n].value(1)
if (mode==2):

# светодиоды мерцают

for n in range(len(LED)):
LED[n].value(1)
sleep(del_time)
for n in range(len(LED)):
LED[n].value(0)
sleep(del_time)
if (mode==3):

# светодиоды мигают

for n in range(len(LED)):
LED[n].value(1)
sleep(del_time)
for n in range(len(LED)):
LED[n].value(0)
sleep(del_time*5)
if (mode==4):

# LED вращаются (эффект погони)

for n in range(len(LED)):
LED[n].value(1)
sleep(del_time)
LED[n].value(0)
sleep(del_time)

Поскольку, в отличие от простого чейзера из раздела 6.2, теперь одновременно
активны несколько светодиодов, аппаратную схему необходимо несколько
изменить:

Рис.8.5: Принципиальная схема светодиодного заднего фонаря.

● 88

Chapter 9 • Using Sensors

Рис.8.6: Макет светодиодного заднего фонаря.
Для переключения между режимами работы добавлена кнопка на ножке 4,
включающая подтягивающий резистор и конденсатор для устранения дребезга.
Кроме того, каждый светодиод теперь имеет свой добавочный резистор. При
использовании общего резистора отдельные светодиоды будут светиться все слабее
и слабее при включении каждого дополнительного светодиода.

● 89

Глава 9 • Использование датчиков
Оценка датчиков и электронных измерительных преобразователей является
центральной задачей технологии микроконтроллеров. Поэтому в этой главе более
подробно рассматривается использование MicroPython в измерительных и
сенсорных технологиях. ESP32 имеет восемнадцать аналоговых входов и поэтому
идеально подходит для измерительных приложений.
В дополнение к оценке сигналов датчиков сенсорная технология также включает в
себя вывод и обработку измеренных значений и обработку сигналов всех видов. В
частности, выдающуюся роль играет то, что называется «обработкой сигнала».
Такие методы, как





преобразование сигнала
линеаризация
усиление сигнала
фильтрация

являются классическими задачами сбора данных на основе микроконтроллеров. Без
этих методов многие задачи и процедуры в технике, прикладной физике или
медицине были бы нереализуемы.
С MicroPython измеренные значения могут отображаться непосредственно на консоли.
У
Тонни
даже
есть
специальный
плоттер,
позволяющий
графически
отображать значения. В качестве альтернативы также можно отображать значения
на дисплее, так что ESP32 также может работать в автономном режиме. Второй метод
более подробно описан в следующей главе.

9.1 Сбор данных измерений и датчиков
Даже с цифровыми контактами ввода-вывода уже можно считывать измеренные
значения. Таким образом, двоичные уровни напряжения могут быть считаны как 0
В или 3,3 В «измеренные значения» с каждого входа GPIO контроллера ESP. Часто
этого достаточно для простых задач измерения или мониторинга.
С другой стороны, реальные аналоговые, т. е. непрерывные, значения невозможно
измерить с помощью цифровых портов. Как уже упоминалось в разделе о
цифро-аналоговом преобразовании, природа преимущественно аналоговая.
Поэтому были разработаны специальные методы и процедуры для регистрации
сигналов в аналоговой области. В ESP32 для этой цели доступны так называемые
аналого-цифровые преобразователи (АЦП). Они являются, так сказать, аналогом
ЦАП и позволяют одновременно захватывать несколько аналоговых каналов.
АЦП стали неотъемлемой частью современного сбора сигналов. Во всех областях
техники они следят за правильным функционированием компонентов и систем. В
аудио- и коммуникационных устройствах, таких как смартфоны или планшеты, они
преобразуют сигналы микрофона в высококачественные потоки цифровых данных.
Температура, интенсивность света или давление — это лишь несколько примеров
многих параметров, которые регистрируются и оцениваются АЦП в транспортных
средствах или зданиях.
Преобразователи можно охарактеризовать двумя основными параметрами:
• разрешение в битах
• скорость преобразования
● 90

Chapter 9 • Using Sensors
Точность, с которой аналоговый сигнал может быть оцифрован, определяется
первым значением. Время преобразования имеет решающее значение для рабочей
скорости. Оно определяет максимальную частоту, с которой сигнал может быть
квантован. Это время преобразования зависит главным образом от используемого
метода преобразования.
На рис.9.1 показана оцифровка аналоговой кривой напряжения с помощью АЦП.
Преобразователь сканирует аналоговую кривую напряжения в определенные
моменты времени и преобразует полученное значение в цифровую величину. АЦП в
чипе ESP32 имеет разрешение 12 бит. Например, при нормализации до 3,3 В
напряжение 2,45 В дает:
Q = 2,45 В / 3,3 В * 4095 = 3040 бит

Рис.9.1: Оцифровка аналоговых значений.
Широкая область применения цифровой измерительной техники привела к развитию
различных
процессов
АЦП.
Некоторые
области
применения
требуют
максимально возможной точности измерения. Другие процессы полагаются на
максимально быстрое преобразование. Поскольку обе функции не могут быть
преобразованы
одновременно,
было
разработано
несколько
принципов
преобразования АЦП, которые явно различаются по точности и скорости. Следующая
таблица суммирует их:
Процедура измерения
Параллельный
преобразователь
Последовательное
приближение
(SAR)
Односкатный или
двухскатный
Дельта-Сигма

Приложение

Характеристики

быстродействующие цифровые
осциллографы, техника управления

очень быстрый, с высоким
энергопотреблением

Процедура для большинства
внутренних AD преобразователи МК,
стандартный метод

быстрый, высокоточный,
сложный

Мультиметр
Прецизионные измерения,
аудиотехника

низкая стоимость, хорошая
линейность, медленный
недорогой, медленный

● 91

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

9.2 Точная регистрация напряжения: самодельный вольтметр
В первом примерном приложении должна быть продемонстрирована оценка
аналогово-цифровых преобразователей в среде Micro-Python. Для этого аналоговое
напряжение, генерируемое потенциометром, записывается и отображается на
консоли. Выводы 25-34 следует использовать как универсальные входы АЦП.
Другим входам АЦП назначены важные двойные функции, поэтому их следует
использовать только в том случае, если другие каналы уже заняты.
В следующем примере используется аналоговый вход 34. Следующая программа
показывает самый простой способ считывания АЦП ESP32:
# ADC_atten_11db.py
from machine import ADC, Pin
from time import sleep
adc = ADC(Pin(34))

#

инициировать

АЦП на пине ADC

adc.atten(ADC.ATTN_11DB)
while True:
print(adc.read())

# прочитанное значение, 0-1024

sleep(1)

С аппаратной стороны к контакту 34 необходимо подключить только потенциометр
на 10 кОм:

Рис.9.2: Измерение напряжения с помощью потенциометра.

● 92

Chapter 9 • Using Sensors
Дополнительный резистор 1 кОм используется только для защиты чипа ESP. В
случае неисправности максимальный ток ограничивается, если напряжение,
подаваемое на потенциометр, слишком велико. Таким образом можно избежать
повреждения чипа.

Рис.9.3: Макет для записи аналоговых измеренных значений.
Значения от 0 до 4095 выводятся для различных настроек напряжения на
потенциометре. Это соответствует разрешению 12-разрядного АЦП: 212–1 = 4095,
но если вы измерите напряжения внешним мультиметром, вы обнаружите, что
значение 4095 уже достигается при напряжении 1 вольт.
Таким образом, при использовании стандартной конфигурации входные
напряжения на выводе ADC должны находиться в диапазоне от 0,0 В до 1,0 В. Для
всех напряжений выше 1,0 В отображается значение 4095. Чтобы увеличить этот
полезный диапазон напряжения, можно активировать внутренний делитель
напряжения.
Использование команд
Демпфир. (дБ)

Демпфиров. (лин.)

Ui max

dc.atten(ATTN_0DB)

0 dB

1

1.00 V

adc.atten(ATTN_2_5DB)

2.5 dB

0.75

1.34 V

adc.atten(ATTN_6DB)

6 dB

0.5

2V

adc.atten(ATTN_11DB)

11 dB

0.282

3.6 V

можно активировать внутреннее демпфирование. Затухание 0 дБ является
стандартной настройкой. Разрешение также можно настроить. Возможные
варианты:

● 93

ADC.WIDTH_9BIT:
ADC.WIDTH_10BIT:
ADC.WIDTH_11BIT:
ADC.WIDTH_12BIT:

9-bit data
10-bit data
11-bit data
12-bit data (standard configuration)

Важное примечание: абсолютное максимальное номинальное напряжение для входных
контактов составляет 3,6 В. Более высокие напряжения могут повредить ESP32!
После загрузки программы измеренные значения выводятся в консоль:

Рис.9.4: Отображение измеренных значений в консоли Thonny.
При высоких скоростях измерения отдельные значения становятся трудно
читаемыми. В этом случае функция плоттера Thonny-IDE является средством
выбора. С использованием
View → Plotter
измеренные значения могут отображаться графически.

● 94

Chapter 9 • Using Sensors

Рис.9.5: Графическое представление в плоттере.
Эта функция идеально подходит для быстрого и четкого представления обширных
данных измерений, результатов или значений датчиков и т. д.

9.3 Коррекция линейности
Преобразование АЦП контроллера ESP32 имеет тот недостаток, что результирующая
характеристическая кривая является нелинейной. При значениях ADC выше 3000
отчетливо видно отклонение от идеальной характеристической кривой.
Значительные отклонения возникают и вблизи нулевой точки (см. рис.9.7). В
результате возникают большие ошибки измерения, особенно на краях. Тем не
менее, их можно значительно уменьшить с помощью подходящих мер, таких как
линеаризация с помощью полинома компенсации или ограничение диапазона
измерения.
Нелинейность АЦП можно легко отобразить графически с помощью (линейного)
ЦАП. Следующая программа предоставляет соответствующие данные измерений:
# ADC_DAC_tst.py
from machine import DAC, ADC, Pin
import time
dac0=DAC(Pin(25))
adc0=ADC(Pin(34))
adc0.atten(ADC.ATTN_11DB)

● 95

for n in range(0, 256):
print(n, end =' ‚)
dac0.write(n)
time.sleep(0.1)
print(adc0.read())
time.sleep(0.1)

Полученные таким образом значения можно отобразить в виде слайд-диаграммы
с помощью Excel или Libre-Office:

Рис.9.6: Нелинейная характеристика АЦП.

9.4 Линеаризация путем ограничения диапазона значений
Полином компенсации позволяет линеаризовать значения во всем диапазоне
измерения. Однако при этом невозможно добиться очень высокой точности. Лучше
использовать только преимущественно линейные участки характеристической
кривой. Из рис.9.6 видно, что АЦП работает в основном линейно в диапазоне до
прибл. 3000 отсчетов. Если ограничиться этим диапазоном, получится
калибровочная линия, показанная на рис. 9.7. С полученной из него формулой
регрессии:
Напряжение = 0.000816 * ADC_count + 0.037822
значения напряжения от 200 мВ до 2,5 вольт теперь могут быть измерены очень
точно. Обычно этого вполне достаточно для сенсорных приложений, так как многие
датчики в любом случае не достигают значений менее 0,2 вольта. Программа
измерения для этого выглядит следующим образом:
# ADC_lin.py
from machine import Pin, ADC
from time import sleep
pot = ADC(Pin(34))
pot.atten(ADC.ATTN_11DB) #Full range: 3.3v
while True:
pot_value = pot.read()
voltage = 0.000816*pot_value + 0.037822

● 96

Chapter 9 • Using Sensors
print(voltage)
sleep(0.1)

С помощью высококачественного и точно откалиброванного вольтметра значения
можно измерить повторно. Отклонения должны оставаться значительно ниже 3%.
Это означает, что ничто не препятствует использованию аналоговых измерительных
преобразователей, таких как фотодиоды, аналоговые датчики температуры или
тензометрические датчики.
Для еще более высоких требований также могут использоваться цифровые
преобразователи. ESP32 также идеально подходит для этого. Эти датчики могут
напрямую связываться с процессором через подходящие системы шин. Более
подробную информацию можно найти, начиная с Раздела 9.10.

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

9.5 Линеаризация входа АЦП с помощью компенсационного полинома
Если необходимо использовать весь диапазон значений внутреннего
аналого-цифрового преобразователя ESP32, требуется программная коррекция. Это
делается путем использования точек интерполяции, отличных от фактической
кривой измерения. Они используются для создания так называемого «многочлена
кривой компенсации». Затем значения АЦП можно скорректировать с помощью
параметров полинома. Определенный таким образом полином компенсации равен
y =



-0.000000000009824x^3 +
0.000000016557283x^2 +
0.000854596860691x

+

0.065440348345433

● 97

Для этого в MicroPython реализована функция:
# ADC_lin_poly.py
from machine import ADC, Pin
from time import sleep
adc = ADC(Pin(34))

# инициализация АЦП на 34 пине

adc.atten(ADC.ATTN_11DB)
def ReadVoltage():
ADC=adc.read()
return -0.000000000009824*pow(ADC,3)+0.000000016557283*pow(ADC,2)+0.000854596860691*ADC+0.065440348345433;
while True:
print(adc.read(), " ", end="")
print(ReadVoltage())
sleep(0.1)
}

С помощью этого метода достигается хорошая линейность и точность. Теперь
отклонения остаются ниже 60 мВ во всем диапазоне измерения. Этого вполне
достаточно для большинства практических приложений. Для еще большей
точности можно также использовать полином 4-й степени. Однако тогда уже будут
заметны другие воздействия, такие как шум оцифровки, так что усилия вряд ли
окупятся.
Дополнительные улучшения теперь могут быть сделаны путем дальнейшего
ограничения диапазона напряжения. Однако это не обязательно для следующих
приложений.

9.6 Измерение напряжения
На вход АЦП чипа ESP32 можно подавать только напряжение 3,3 В или меньше.
Более высокие напряжения могут привести к разрушению всего контроллера.
Однако с помощью делителя напряжения диапазон измерения можно расширить
почти до бесконечности. На следующем рисунке показана схема измерения
входного напряжения до прибл. 30 В. С делителем напряжения, состоящим из
резистора 100 кОм и резистора 10 кОм, входное напряжение уменьшается до 1/11
его значения:
Uo = R1 / (R1 + R2) = 10 kohm / 110 kohm = 1/11

● 98

Chapter 9 • Using Sensors

Рис.9.8: Делитель напряжения для расширения диапазона измерения АЦП.

ВАЖНО: Перед подачей внешнего напряжения необходимо тщательно проверить
конструкцию. Если, например, перепутать резисторы, это может привести к
разрушению платы ESP!
В электронных схемах и системах напряжения питания обычно ниже 30 В. Таким
образом, диапазон измерения схемы, показанной на рис. 9.8, достаточен для
многих приложений. В любом случае напряжение выше 50 В разрешается измерять
только с помощью проверенных на безопасность измерительных приборов. В этом
контексте всегда необходимо соблюдать следующее примечание:
Напряжение выше 50 В при особых обстоятельствах может быть опасным для жизни!
Таким образом, при использовании предделителя фактическое входное
напряжение 30 В снижается до 2,73 В на входе АЦП. Это означает, что
внутренний АЦП ESP32 теперь также может измерять напряжения в расширенном
диапазоне до 30 В.
Диоды Шоттки (SD1 и SD2), показанные на принципиальной схеме, не требуются
для фактического измерения. Они только защищают входы микросхемы ESP от
перегрузки в случае ошибки. Как только напряжение на входе контроллера падает
ниже 0 В или превышает 3,3 В, диоды становятся проводящими и тем самым
предотвращают возможные перенапряжения на АЦП.
Влияние делителя напряжения, конечно же, должно быть учтено в программном
обеспечении. За это отвечает калибровочный коэффициент cal. Он используется
для расчета коэффициента масштабирования делителя напряжения.
# Voltmeter_30V.py
from machine import ADC, Pin
from time import sleep
adc = ADC(Pin(34))

# Инициировать АЦП на 34 пине

adc.atten(ADC.ATTN_11DB)

● 99

Vref=3.30

# внутреннее опорное напряжение

R1=100

# для делителя напряжения

R2=10

# для деления напряжения

cal=1*(R1+R2)/R2

# калибровочный коэффициент

while True:
output="V = {:5.1f} V"
print(output.format(adc.read()*Vref/4095*cal))
sleep(1)

Сравнение измеренных значений с качественно откалиброванным мультиметром
выявляет уже упомянутую нелинейность ESP32-ADC. Ошибка может быть более
одного вольта. Следующая программа обеспечивает гораздо более точные
значения:
# Voltmeter_30V_lin.py
from machine import ADC, Pin
from time import sleep
adc = ADC(Pin(34))

# Инициировать АЦП на 34 пине

adc.atten(ADC.ATTN_11DB)
Vref=3.30

# внутреннее опорное напряжение

R1=100

# для делителя напряжения

R2=10

# для деления напряжения

cal=1*(R1+R2)/R2

# калибровочный коэффициент

def ReadVoltage():
ADC=adc.read()
return -0.000000000009824*pow(ADC,3)+0.000000016557283*pow(ADC,2)+0.000854596860691*ADC+0.065440348345433;
while True:
output="V = {:5.1f} V"
print(output.format(ReadVoltage()*cal))
sleep(1)

Пошаговое сравнение с калиброванным настольным вольтметром дает следующую
таблицу:
U_Reference/V

● 100

U_ESP32/V

0.201

0.22

0.496

0.49

1.007

1.01

2.005

1.99

Chapter 9 • Using Sensors

3.007

3.02

5.022

5.05

10.055

10.09

15.013

15.12

20.039

20.04

25.019

25.06

30.018

30.16

Константы, используемые здесь в программе в виде коэффициента калибровки и
эталонного напряжения, называются параметрами калибровки программного
обеспечения. В качестве альтернативы аппаратная калибровка может быть
выполнена с помощью прецизионного потенциометра или триммера. Триммеры,
специально разработанные для данного применения, могут быть отрегулированы
очень точно и имеют хорошую долговременную стабильность благодаря своей
закрытой конструкции. При сравнении с калиброванным измерительным прибором
триммер настраивается до тех пор, пока вольтметр ESP32 не покажет правильное
значение. Тогда больше нет необходимости изменять параметры в программе.
Таким образом, в особых условиях окружающей среды (например, при
экстремальных температурах) повторная калибровка может быть выполнена без
изменения программы.
Недостатком аппаратной калибровки является то, что требуются дополнительные
компоненты. Потенциометры и особенно триммеры сравнительно дороги и всегда
показывают некоторый дрейф. Воздействие окружающей среды приводит к
изменению электрических параметров, что ухудшает долговременную стабильность
измерительного устройства. Если для потенциометра выбрано общее сопротивление
1 кОм, измеренное значение может быть изменено примерно на 5%. Более высокие
значения сопротивления обеспечивают более широкий диапазон регулировки, но
также снижают точность регулировки.

9.7 Перекрестные помехи: побочные эффекты сенсорной техники
Измерение значений аналогового напряжения с помощью АЦП ESP-32 больше не
должно быть проблемой. Это открывает путь для оценки датчиков с аналоговым
выходным напряжением. С этими зондами или датчиками доступны компоненты,
которые могут преобразовывать физические величины в электрические значения.
Почти все физические величины могут быть записаны в электронном виде. В
дополнение к уже упомянутым параметрам, таким как температура, влажность или
интенсивность света, это также относится к другим важным переменным, таким как
Громкость или интенсивность звука
Механическая печать
Радио, тепловое или инфракрасное излучение
Уровни радиоактивного излучения
Ускорения или механические силы
Все типы магнитных и электрических полей
Химические параметры, такие как значение pH или
электропроводность растворов.
• и т.д.








● 101

Сотни различных измерительных трансформаторов установлены на химических
заводах, самолетах, спутниках или современных автомобилях. Без качественных
датчиков все эти технические средства были бы немыслимы.
В идеале датчики измеряют точно определенное конкретное значение. Это
значение воспроизводимо и с максимально возможной точностью преобразуется в
электрическую величину, такую как напряжение или значение сопротивления.
Желательна линейная зависимость между измеряемой переменной и электрическим
значением. Однако для микроконтроллеров, таких как ESP32, даже нелинейная
передаточная функция не представляет проблемы, поскольку линеаризация может
быть выполнена с помощью подходящих программных методов без особых усилий.
Так называемые «перекрестные помехи» устранить не так-то просто. Многие
датчики реагируют не только на желаемую измеряемую переменную, но и на другие
физические величины. Некоторые примеры:






Температурная зависимость фотодатчиков
Влияние вибраций на преобразователи звука
Влияние влажности воздуха на датчики электрических полей
Реакция газовых сенсоров на некоторые химические соединения
Тепловые помехи датчикам влажности или давления

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

9.8 Прикосновение разрешено: емкостные сенсорные датчики
Сенсорные датчики — это классика сенсорной техники. В 1970-х и 80-х годах они
были обязательными для каждого телевизора и стереосистемы. Они заменили
привычные кнопки управления и дали возможность менять программы или
регулировать громкость просто на ощупь. Но и экраны современных смартфонов —
это, в принципе, сенсорные датчики, которыми можно управлять без клавиатуры
или механических элементов управления.
Обычный сенсорный датчик состоит из металлических электродов. Иногда они
покрыты тонкой защитной поверхностью. Если к датчику прикоснуться пальцем, это
можно определить по изменению емкости электрода.
Чтобы использовать сенсорные датчики ESP32, в машинном модуле должен быть
загружен класс TouchPad. После этого доступен метод TouchPad.read():
from machine import TouchPad, Pin
t=TouchPad(Pin(14))
t.read() # Возвращает меньшее число при касании

● 102

Chapter 9 • Using Sensors
TouchPad.read() возвращает изменение относительной емкости. Без прикосновения
к сенсорным поверхностям, подключенным к ESP, возвращаются большие числа, то
есть обычно значения больше 800. При прикосновении к активному электроду
значения падают ниже 200. Однако результаты являются относительными и могут
различаться в зависимости от формы и размера электрода. В следующей таблице
приведены некоторые сведения
об ожидаемых значениях:

Неподключенный контакт:
> 1000

С подключенным электродом - без прикосновения: 800 to 1000
С прикосновением:
< 200
Таким образом, может потребоваться калибровка, прежде чем сенсорные панели
можно будет использовать в конкретной прикладной среде.
ESP32 предоставляет десять входов сенсорной панели (площадок).
Они расположены на контактах 0, 2, 4, 12, 13, 14, 15, 27, 32 и 33.
Для проверки работы сенсорных входов можно использовать следующую
программу:
# touch_test.py
from machine import TouchPad, Pin
from time import sleep
from machine import TouchPad, Pin
t1 = TouchPad(Pin(2))
t2 = TouchPad(Pin(4))
while True:
cap1 = t1.read()
print(cap1, end=" ")

cap2 = t2.read()
print(cap2)
sleep(1)

В качестве электродов можно использовать такие предметы, как чертежные кнопки
или мелкие медные монеты. На следующем рисунке показана предполагаемая
схема управления входами 2 и 4:

● 103

Рис.9.9: Датчики, подключенные к ESP32.
После загрузки программы выводятся значения датчиков. Если ни к одному из
датчиков не прикасаться, числовые значения будут больше 800. Если слегка
коснуться пальцем одного из электродов, значения соответствующего канала упадут
ниже 200. На плоттере можно проследить ход сигнала:

Рис.9.10: Изменение сигнала при прикосновении к сенсорным датчикам.
С помощью следующего скрипта два светодиода на портах 25 и 26 можно
переключать с помощью сенсорных площадок. При касании площадки
загорается соответствующий светодиод:
# touch_LED.py
from machine import TouchPad, Pin
from time import sleep
t1 = TouchPad(Pin(2))
t2 = TouchPad(Pin(4))
led1 = Pin(25, Pin.OUT)
led2 = Pin(26, Pin.OUT)
while True:

● 104

Chapter 9 • Using Sensors
if t1.read() < 500:
led1.value(1)
else:
led1.value(0)
if t2.read() < 500:
led2.value(1)
else:
led2.value(0)

Примечание: ESP32 также можно вывести из спящего режима с помощью сенсорных
панелей. Дополнительные сведения об использовании методов сна см. в главе 17.

9.9 Хорошо охлажденный или перегретый: датчики температуры
обеспечивают четкость
Точное измерение температуры является одним из наиболее важных применений
датчиковвэлектроннойизмерительнойтехнике. Термодатчикиидатчики температуры
используются
для
контроля
процессоров
современных
ПК
или
химических реакций на промышленных предприятиях, а также температуры масла в
моторных лодках или серверных больших компьютерных систем. Точный и
непрерывный мониторинг температуры также часто чрезвычайно важен в области
медицины.
Классическими спиртовыми или ртутными термометрами можно измерять только
текущую температуру. С другой стороны, электронный термометр также позволяет
проводить измерения с временным разрешением. Это чрезвычайно важно для
мониторинга температуры силовых транзисторов, микропроцессоров, инкубаторов
или серверных ферм, поскольку только наблюдение в течение более длительных
периодов времени обеспечивает безопасную работу. В случае чрезвычайной
ситуации может быть активирован дополнительный блок охлаждения или даже
может быть остановлена работа всей линейки серверов.
Простые датчики NTC (с отрицательным температурным коэффициентом) недороги
и обеспечивают достоверные показания температуры, но существенным
недостатком является необходимость калибровки. Для одиночных датчиков и в
непрофессиональных приложениях это обычно приемлемо. Однако в
профессиональной среде и при использовании большого количества датчиков
усилия по калибровке могут быстро стать нерентабельными. Здесь
предпочтительны датчики с заводской калибровкой, такие как LM35 или TMP36.
Высокая точность измерения достигается за счет индивидуальной настройки
производителем. Таким образом, эти датчики можно использовать напрямую без
какой-либо дополнительной подготовительной работы. Цоколевку широко
используемого датчика типа TMP36 можно увидеть на следующем рисунке:

Рис.9.11: Распиновка датчика TMP36.
● 105

Следующие данные относятся к TMP36:
Напряжение питания:
Калибровка:
Масштабный коэффициент:
Точность:
Линейность:
Диапазон температур:
Ток замкнутой цепи:










от 2,7 В до 5,5 В
заводская настройка в °C
10 мВ/°C
±2 °C (типичная)
±0,5 °C (тип.)
от –40 °C до +125 °C
400.000 lx

Лазерная указка (5 мВт)

10.000 lx

20 мA

Телевизионная студия

2.000 lx

4 мA

Освещение офиса или комнаты 1.000 lx

2 мA

Типичное освещение коридора

100 lx

0.2 мA

0 lx

100 нA

Абсолютная темнота

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

● 113

Для самодельного люксметра можно снова использовать внутренний АЦП ESP32,
аналогичный TMP36. Датчик температуры просто заменяется измерительной схемой
с BPW40.
На следующем рисунке показана аппаратная структура. Как и любой транзистор,
фототранзистор должен быть установлен с соблюдением полярности. Более
короткий соединительный провод (коллектор) должен быть подключен к
напряжению питания 3,3 В. Это соединение также отмечено уплощением на
корпусе. Если измеренные значения не меняются или меняются очень
незначительно при попадании света, полярность BPW40 должна быть изменена. На
следующем рисунке показана схема люксметра:

Рис.9.17: Схема подключения электронного люксметра.
Программа для этого следующая:
# BPW40_luxmeter.py
from machine import Pin, ADC
from time import sleep
fotoPin = ADC(Pin(34))
fotoPin.atten(ADC.ATTN_11DB)

# входной диапазон 0 ... 3,3 В

averages=10
while True:
luxValue=0
for average in range(averages):
luxData=fotoPin.read()
luxValue+=luxData/40.96
luxValue/=averages
output="Light level: {:6.1f} %"
print(output.format(luxValue))
sleep(1)

● 114

Chapter 9 • Using Sensors
Текущие значения яркости отображаются на консоли. Там, где освещение
обеспечивается электрическими лампами, работающими на 230 В, 50 Гц,
нефильтрованные измерения показывают сильные колебания. Этот эффект
особенно заметен для современных светодиодных ламп. Это явный признак того,
что светодиоды на самом деле мерцают сильнее, чем обычные лампы накаливания,
даже если глаз сознательно не воспринимает эти быстрые колебания света. Таким
образом, измеренные значения рассчитываются по ряду средних значений:
для среднего в диапазоне (средних):
luxData=fotoPin.read()
luxValue+=luxData/40.96

При масштабировании до 40,96 (= 212/100) уровни освещенности отображаются в
процентах, то есть от 0,0 до 100,0. Значения выводятся в формате с десятичной
точкой:
output="Light level: {:6.1f} %"
print(output.format(luxValue))

В полной темноте должно отображаться значение значительно ниже 1%. С другой
стороны, при ярком освещении можно достичь почти 100%.
В качестве рабочего сопротивления можно использовать значение 100 кОм или 10
кОм. При использовании сопротивления 100 кОм люксметр достигает очень
высокой чувствительности. Это позволяет обнаруживать даже самые низкие уровни
освещенности, едва заметные глазу. Отображение производится в относительных
значениях. Для определения абсолютных значений, например. для измерений на
промышленных рабочих местах или путях эвакуации система должна быть
откалибрована с использованием сравнительного прибора. Тогда также возможны
значения в люменах, люксах или канделах.
В разделе 16.4 фототранзистор используется для визуального наблюдения за
помещением.

.15 Электронные летучие мыши: измерение расстояния с помощью
ультразвука
В принципе, расстояния можно измерять и оптическими датчиками. Однако методы
измерения отражения на оптической основе имеют тот недостаток, что результаты
сильно зависят от свойств поверхности светоотражающих материалов. Из-за
высокой скорости света для измерения оптического времени прохождения
требуются сложные электронные процедуры оценки. По этим причинам ультразвук
часто используется для измерения расстояния. Для измерения расстояний в
диапазоне средних расстояний, т. е. от нескольких сантиметров до нескольких
метров, подходят соответствующие методы. Так как скорость звука в воздухе при
20°С составляет ок. 343 м/с, время прохождения звука на расстояние в один
сантиметр составляет около 30 микросекунд. Этот промежуток времени можно
очень точно измерить с помощью MicroPython.
Применения этого метода измерения включают определение высоты помещения,
измерение высоты просвета моста или измерение числа квадратных метров в
помещениях и площадях. Высокая надежность ультразвуковых измерительных
систем позволяет использовать их как в робототехнике, так и в обычных или
автономных транспортных средствах. С помощью ультразвука роботизированные
системы способны обнаруживать препятствия. При парковке расстояние автомобиля
от стены можно точно определить с помощью датчиков в кузове автомобиля.
● 115

На рынке появились очень экономичные приемо-передающие модули с резонансной
частотой 40 кГц. Таким образом, самостоятельная сборка ультразвуковых систем
вряд ли имеет смысл. На следующем рисунке показан широко используемый модуль
типа HC-SR04.

Рис.9.18: Ультразвуковой модуль с двумя преобразователями.
Это экономичный ультразвуковой модуль со встроенными капсюлями передатчика и
приемника. Эта версия идеально подходит для активации с помощью контроллера
ESP32. HC-SR04 может обнаруживать объекты на расстоянии от 2 см до прибл. 3 м.
Разрешение измерения составляет около 3 мм. Точность зависит от скорости звука
и, следовательно, от температуры воздуха, а также от уровня шума. В следующей
таблице приведены технические данные модуля:
Напряжение питания VCC:
Потребление тока:
Уровень сигнала (триггер):
Измеряемые расстояния:
Разрешение измерения:
Измерений в секунду:
Размеры (д, ш, г) в мм:










+5 В ±10%,
ок. 2 мА
от 3 до 5 В
от 2 см до примерно 3 м
ок. 3 мм
максимум 50
45 х 20 х 20 мм

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

● 116

Chapter 9 • Using Sensors

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

Рис.9.20: Устройство для ультразвукового измерения расстояния.
Для триггерного входа достаточно 3,3 В выхода ESP, так что преобразователь
уровня не нужен. Показанный также зуммер нужен только в следующей главе, и
его в начале можно не использовать.
С программной стороны управление модулем очень простое. После срабатывания
по заднему фронту модуль автоматически измеряет расстояние и преобразует его в
широтно-импульсный сигнал, поступающий на выход модуля. Интервал измерения
имеет длительность 20 мс. Это означает, что можно выполнять 50 измерений в
секунду.
● 117

После запуска измерительного цикла модуль посылает ультразвуковой
измерительный импульс длительностью прибл. 200 мкс. Сразу после этого выход
переходит на высокий уровень, и модуль ожидает приема эхо-сигнала. Если он
обнаружен, эхо-выход возвращается к низкому уровню. Через двадцать
миллисекунд после срабатывания может быть выполнено другое измерение. Если
эхо не обнаружено, выходной сигнал остается на высоком уровне в течение 200 мс,
указывая, таким образом, сообщением «превышение диапазона», что ни один
объект не находится в пределах диапазона. Затем модуль ожидает следующего
спадающего фронта на входе триггера, и измерение начинается снова.
Наилучшие результаты измерения получаются при отражении от гладких и плоских
поверхностей. На расстояниях до одного метра материал поверхности не столь
критичен. Угол к объекту может быть от менее 1 до примерно 45° на коротких
расстояниях. Объекты размером с карандаш надежно обнаруживаются.
Разрешение измерения 3 мм определяется внутренней скоростью сканирования
модуля. Точность измерений в основном ограничивается температурной зависимостью
скорости
звука
в
воздухе.
В
приближении
скорость
звука
как
функцию температуры можно рассчитать в диапазоне от –20°С до +40°С по
следующей формуле:
Vs = (331.5 + 0.6 * Tair / °C) м/с.
Для комнатной температуры 20°C это дает
с = 331,5 + (0,6 х 20 ) м/с = 343,5 м/с
На основе этого значения следующая программа обеспечивает значения измерения
расстояния в сантиметрах:
# HCSR04_US_distance_demo.py
# измерение расстояния с помощью ультразвука
from hcsr04 import HCSR04
from time import sleep
sensor = HCSR04(trigger_pin=2, echo_pin=4)
while True:
distance = sensor.distance_cm()
output="Distance: {:6.1f} cm"
print(output.format(distance))
sleep(.1)

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

● 118

Chapter 9 • Using Sensors

Рис.9.21: Импульс передачи ультразвука (верхняя кривая) и импульс
приема (нижняя кривая).
ESP32 нужно только определить ширину эхо-импульса. Это делается библиотечной
функцией. Функция
sensor.distance_cm()
непосредственно возвращает измеренное расстояние в сантиметрах. Затем
измеренное значение может быть выведено на оболочку через
output="Distance: {:6.1f} cm" print(output.format(distance))
и форматируется с одним десятичным знаком.
При разнице температур в 20 °С уже возникает погрешность в 3,4 %. Поэтому для
использования вне помещений и измерения больших расстояний полезна
температурная компенсация. Для простых приложений, таких как помощь при
парковке, температурная компенсация не требуется, как показывает пример
приложения в следующем разделе.

9.16 Больше никаких вмятин и царапин: дальномер для гаражей
Современные гаражи обычно очень компактны с точки зрения затрат. В частности,
подземные парковочные места становятся все более узкими. Здесь повреждения
автомобиля могут быстро произойти при парковке. Устройство предупреждения о
расстоянии очень полезно в таких ситуациях.
Ультразвуковой дальномер может быть легко модернизирован до такого устройства.
Для этого требуется только пороговое значение. Если расстояние между
автомобилем и стеной меньше этого значения, должен прозвучать
предупредительный сигнал. Если ультразвуковой модуль установить в подходящем
месте, можно избежать поломки собственного автомобиля.

● 119

Функцию ШИМ можно использовать для вывода предупредительного звукового
сигнала. В следующей строке отчетливо слышен сигнал частотой 1 кГц:
PWM(Pin(14), freq=1000, duty=512)

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

Рис.9.22: Пьезо-зуммер.
Это дополнит программу из предыдущей главы:
# HCSR04_anti_colission.py
from machine import Pin, PWM
from hcsr04 import HCSR04
from time import sleep
sensor = HCSR04(trigger_pin=2, echo_pin=4)
beeper = PWM(Pin(14), freq=1000, duty=512)
beeper.deinit()
minDist=10
while True:
distance = sensor.distance_cm()
output="Distance: {:6.1f} cm"
print(output.format(distance))
if (distance