Это бонус-урок поверх урока 6. Железо и код почти те же — другая плата и связь «по воздуху». Если урок 6 ещё не собран, сначала пройди его.
| Урок 6 | Урок 7 | |
|---|---|---|
| Плата | Arduino UNO R3 (5 В) | ESP32 (3.3 В) |
| Связь | провод USB | WiFi (по воздуху) |
| Прошивка | Telemetrix4Arduino | Telemetrix4Esp32 |
| Библиотека | telemetrix | telemetrix-esp32 |
| Подключение в коде | Telemetrix() | TelemetrixEsp32(transport_address="IP") |
Команды (forward/back/stop), ШИМ, чтение кнопок и окно
pygame — остаются прежними. Меняются только плата, способ связи и номера ножек.
«Ум» по-прежнему в Python на ноутбуке. Новое — между ноутбуком и платой нет провода: ноутбук шлёт команды ESP32 по WiFi. ESP32 при этом всё равно надо питать (от USB-зарядки, повербанка или от модуля питания).
Схема как в уроке 6, только вместо UNO — ESP32, и на IN1/IN2/EN, светодиоды и кнопки идут её ножки (GPIO). Кнопки — между ножкой и GND (у ESP32 тоже есть внутренняя подтяжка):
Полная таблица — что куда воткнуть:
| Откуда | Куда | Зачем |
|---|---|---|
| ESP32 GPIO25 | L293D EN (пин 1) | включение + скорость (ШИМ) |
| ESP32 GPIO26 | L293D IN1 (пин 2) | направление «вперёд» |
| ESP32 GPIO27 | L293D IN2 (пин 7) | направление «назад» |
| ESP32 GPIO13 | 150–220 Ом → светодиод → GND | лампочка «вперёд» |
| ESP32 GPIO14 | 150–220 Ом → светодиод → GND | лампочка «назад» |
| ESP32 GPIO32 / GPIO33 | кнопки → GND (внутренняя подтяжка) | читать «вперёд» / «назад» |
| ESP32 GND | общая земля (см. ниже) | общий ноль |
| 9 В батарейка | вход модуля MB102 | источник энергии |
| MB102: выход 5 В | L293D VCC1 (пин 16) и VCC2 (пин 8) | питание чипа и мотора |
| MB102: GND («−») | L293D GND (пины 4, 5, 12, 13) и ESP32 GND | общая земля |
| L293D OUT1 (пин 3), OUT2 (пин 6) | два провода вентилятора | мотор крутится |
У разных ESP32 надписи на ножках чуть отличаются — сверь со своей платой. Не бери для этого ножки GPIO 0, 2, 12, 15 — это «загрузочные», они мешают плате стартовать. Распиновку L293D (где какой пин) смотри в уроке 5.
Как и в уроке 6 — один раз заливаем готовую прошивку, но теперь её esp32-версию, и вписываем в неё имя и пароль твоей WiFi-сети:
192.168.1.50). Запиши его — он нужен в коде.Поставь библиотеку: pip install telemetrix-esp32 (pygame у тебя уже есть). Ноутбук
должен быть в той же WiFi-сети, что и ESP32. Дальше — почти код урока 6. Меняется только
подключение: вместо «найди плату по USB» пишем «соединись по IP»:
# Было (урок 6, UNO по проводу USB): from telemetrix import telemetrix board = telemetrix.Telemetrix() # Стало (урок 7, ESP32 по WiFi): from telemetrix_esp32 import telemetrix_esp32 IP = "192.168.1.50" # IP из Serial Monitor board = telemetrix_esp32.TelemetrixEsp32(transport_address=IP) # связь по WiFi!
Ножки теперь — GPIO ESP32, а команды — те же:
IN1, IN2, EN = 26, 27, 25 # GPIO ESP32 → входы L293D LED_FWD, LED_BACK = 13, 14 # лампочки вперёд/назад board.set_pin_mode_digital_output(IN1) board.set_pin_mode_digital_output(IN2) board.set_pin_mode_analog_output(EN) # EN — это ШИМ (скорость) board.set_pin_mode_digital_output(LED_FWD) board.set_pin_mode_digital_output(LED_BACK) def forward(): board.digital_write(IN1, 1); board.digital_write(IN2, 0) board.analog_write(EN, 220) board.digital_write(LED_FWD, 1); board.digital_write(LED_BACK, 0) def back(): board.digital_write(IN1, 0); board.digital_write(IN2, 1) board.analog_write(EN, 220) board.digital_write(LED_FWD, 0); board.digital_write(LED_BACK, 1) def stop(): board.analog_write(EN, 0) board.digital_write(LED_FWD, 0); board.digital_write(LED_BACK, 0)
А окно pygame (пульт со стрелками) — точь-в-точь из урока 6: просто скопируй его, оно
вызывает те же forward / back / stop. И физические кнопки
читаются так же (на ножках GPIO32 / GPIO33):
def on_button(data): # telemetrix зовёт это при нажатии/отпускании if data[2] == 0 and data[1] == 32: # кнопка «вперёд» (GPIO32, нажато = 0) forward() if data[2] == 0 and data[1] == 33: # кнопка «назад» (GPIO33) back() if data[2] == 1: # любую кнопку отпустили stop() board.set_pin_mode_digital_input_pullup(32, on_button) # кнопка «вперёд» board.set_pin_mode_digital_input_pullup(33, on_button) # кнопка «назад»
Запусти программу — и рули вентилятором стрелками по WiFi, без провода к плате. 🎉
Помнишь шаг 2 — IP приходилось искать в Serial Monitor и переписывать руками? От этого можно избавиться: подключим к ESP32 маленький экранчик 0.96″ OLED, и плата будет показывать свой IP сама. Подал питание — через пару секунд адрес горит прямо на плате. Ни ноутбук, ни Serial Monitor, чтобы его прочитать, больше не нужны.
Такой экранчик — это 128×64 точки, внутри контроллер SSD1306, общается по I²C
(всего два сигнальных провода — SDA и SCL). Питание 3.3 В — как раз
«родное» для ESP32. Всего 4 ножки:
| Ножка экрана | Куда на ESP32 | Зачем |
|---|---|---|
| VCC | 3V3 (3.3 В) | питание экрана |
| GND | GND (та же общая земля) | общий ноль |
| SDA | GPIO21 | данные I²C |
| SCL | GPIO22 | такт I²C |
GPIO21/22 — «штатные» ножки I²C у классической ESP32, и они
не пересекаются с ножками вентилятора (25/26/27/13/14/32/33). Если на экране есть пины с
подписями SDA и SCL — это I²C-версия (самая частая), инструкция для неё.
Берём тот же скетч, в который на шаге 2 вписывали SSID и пароль, и добавляем в него показ IP:
// сверху скетча — подключаем экранчик #include <Adafruit_SSD1306.h> Adafruit_SSD1306 screen(128, 64, &Wire, -1); // 128×64, по I²C, без отдельного reset
setup(), сразу после того как плата узнала IP (там, где он печатается в
Serial Monitor), добавь несколько строк — нарисовать его на экране:// ...внутри setup(), сразу ПОСЛЕ того как плата узнала IP: screen.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 0x3C — обычный адрес экранчика screen.clearDisplay(); screen.setTextColor(SSD1306_WHITE); screen.setTextSize(1); screen.setCursor(0, 0); screen.println("ESP32 na svyazi!"); // латиницей — экран не знает русских букв screen.println("IP adres:"); screen.setTextSize(2); // крупнее screen.println(WiFi.localIP()); // тот же IP, что и в Serial Monitor screen.display(); // показать на экране
"IP adres:"), а не по-русски. Сам IP — это цифры, он покажется как есть.
Залей скетч как обычно (шаг 2). Теперь при каждом включении ESP32 через пару секунд показывает свой IP
прямо на экранчике — остаётся переписать его в строку IP = "…" в Python. 🎉
screen.begin(...).SDA и SCL (надо SDA→21, SCL→22).screen.display() — без него экран не обновится.
Выбери ответ. Ошибёшься — 30 секунд на то, чтобы вернуться в урок и перечитать.
Чем урок 7 отличается от урока 6?
Откуда узнать IP-адрес ESP32 для подключения?