🤖 Робототехника ⚡ Основы электроники
1 2 3 4 5 6 7
Урок 7 · бонус: без провода

ESP32 по WiFi

Цель урока Тот же вентилятор и тот же пульт в окне pygame, что в уроке 6, но плата теперь — ESP32, и команды летят к ней по WiFi, без провода к ноутбуку. Поймём, что меняется совсем чуть-чуть.

Это бонус-урок поверх урока 6. Железо и код почти те же — другая плата и связь «по воздуху». Если урок 6 ещё не собран, сначала пройди его.

🔄 Что меняется по сравнению с уроком 6

Урок 6Урок 7
ПлатаArduino UNO R3 (5 В)ESP32 (3.3 В)
Связьпровод USBWiFi (по воздуху)
ПрошивкаTelemetrix4ArduinoTelemetrix4Esp32
Библиотекаtelemetrixtelemetrix-esp32
Подключение в кодеTelemetrix()TelemetrixEsp32(transport_address="IP")

Команды (forward/back/stop), ШИМ, чтение кнопок и окно pygame — остаются прежними. Меняются только плата, способ связи и номера ножек.

🖥️ окно pygame 🐍 telemetrix-esp32 📡 WiFi 🔌 ESP32 ⚡ L293D ⚙️ вентилятор

«Ум» по-прежнему в Python на ноутбуке. Новое — между ноутбуком и платой нет провода: ноутбук шлёт команды ESP32 по WiFi. ESP32 при этом всё равно надо питать (от USB-зарядки, повербанка или от модуля питания).

⚠️ ESP32 — 3.3 В, и важна общая земля • Ножки ESP32 — 3.3 В (не 5 В). Их сигнал L293D понимает как «1», это нормально.
• Мотор и L293D питай через модуль MB102 (9 В батарейка → 5 В), как в уроке 6.
• Соедини все «−» вместе: GND ESP32, GND модуля, GND L293D — без общей земли не заработает.
• ESP32 ловит только сети 2.4 ГГц (не 5 ГГц). Ноутбук — в той же сети.

🔌 Шаг 1. Подключаем провода

Схема как в уроке 6, только вместо UNO — ESP32, и на IN1/IN2/EN, светодиоды и кнопки идут её ножки (GPIO). Кнопки — между ножкой и GND (у ESP32 тоже есть внутренняя подтяжка):

Подключение: ESP32 + MB102 (9 В) → L293D → вентилятор связь по WiFi (без провода) ESP32 3.3 В · WiFi L293D H-мост GPIO25 → EN (ШИМ) GPIO26 → IN1 GPIO27 → IN2 OUT1/OUT2 вентилятор 9 В батарейка Модуль MB102 выход 5 В 5 В → VCC1, VCC2 GND GND общая земля — соедини все «−» вместе! 2 светодиода и кнопки → таблица ↓

Полная таблица — что куда воткнуть:

ОткудаКудаЗачем
ESP32 GPIO25L293D EN (пин 1)включение + скорость (ШИМ)
ESP32 GPIO26L293D IN1 (пин 2)направление «вперёд»
ESP32 GPIO27L293D IN2 (пин 7)направление «назад»
ESP32 GPIO13150–220 Ом → светодиод → GNDлампочка «вперёд»
ESP32 GPIO14150–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.

🛰️ Шаг 2. Заливаем прошивку Telemetrix4Esp32 и настраиваем WiFi

Как и в уроке 6 — один раз заливаем готовую прошивку, но теперь её esp32-версию, и вписываем в неё имя и пароль твоей WiFi-сети:

  1. В Arduino IDE добавь поддержку плат ESP32: Инструменты → Плата → Менеджер плат, найди «esp32» (от Espressif), установи.
  2. Поставь библиотеку прошивки: Инструменты → Управлять библиотеками, найди «Telemetrix4Esp32» и установи.
  3. Открой WiFi-пример: Файл → Примеры → Telemetrix4Esp32 (вариант для WiFi).
  4. Впиши в скетч свои имя сети (SSID) и пароль WiFi (сеть должна быть 2.4 ГГц).
  5. Подключи ESP32 по USB, выбери плату «ESP32 Dev Module» и порт, нажми Загрузить.
  6. Открой Serial Monitor — ESP32 подключится к WiFi и напечатает свой IP-адрес (например, 192.168.1.50). Запиши его — он нужен в коде.
💡 Если не подключается по WiFi • Нет IP в Serial Monitor → проверь имя сети и пароль; ESP32 любит только 2.4 ГГц.
• Python не находит плату → ноутбук и ESP32 должны быть в одной сети; мешать может брандмауэр.
• Для заливки по USB у дешёвых плат нужен драйвер чипа CP2102 или CH340.

🐍 Шаг 3. Ноутбук и код

Поставь библиотеку: 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, без провода к плате. 🎉

🖥️ Дополнение: маленький экран с IP-адресом

Помнишь шаг 2 — IP приходилось искать в Serial Monitor и переписывать руками? От этого можно избавиться: подключим к ESP32 маленький экранчик 0.96″ OLED, и плата будет показывать свой IP сама. Подал питание — через пару секунд адрес горит прямо на плате. Ни ноутбук, ни Serial Monitor, чтобы его прочитать, больше не нужны.

💡 Это единственное, что плата делает «сама» Весь «ум» по-прежнему в Python. Но свой IP знает только сама плата — она только что получила его от WiFi. Поэтому показ IP живёт в прошивке (в том самом скетче, что мы заливаем), а не в Python. Управление вентилятором при этом не меняется ни на строчку.

Такой экранчик — это 128×64 точки, внутри контроллер SSD1306, общается по I²C (всего два сигнальных провода — SDA и SCL). Питание 3.3 В — как раз «родное» для ESP32. Всего 4 ножки:

4 провода: ESP32 → OLED 0.96″ (по I²C) ESP32 3.3 В IP adres: 192.168… OLED 128×64 3V3 → VCC GND → GND GPIO21 → SDA GPIO22 → SCL
Ножка экранаКуда на ESP32Зачем
VCC3V3 (3.3 В)питание экрана
GNDGND (та же общая земля)общий ноль
SDAGPIO21данные I²C
SCLGPIO22такт I²C

GPIO21/22 — «штатные» ножки I²C у классической ESP32, и они не пересекаются с ножками вентилятора (25/26/27/13/14/32/33). Если на экране есть пины с подписями SDA и SCL — это I²C-версия (самая частая), инструкция для неё.

Берём тот же скетч, в который на шаге 2 вписывали SSID и пароль, и добавляем в него показ IP:

  1. Поставь библиотеку: Инструменты → Управлять библиотеками, найди «Adafruit SSD1306» и установи (предложит заодно «Adafruit GFX» — соглашайся).
  2. Сверху скетча подключи экран:
// сверху скетча — подключаем экранчик
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 screen(128, 64, &Wire, -1);   // 128×64, по I²C, без отдельного reset
  1. Внутри 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();                           // показать на экране
⚠️ Экран не знает русских букв Дешёвый OLED умеет показывать только латиницу и цифры. Поэтому подписи на экране пишем латиницей ("IP adres:"), а не по-русски. Сам IP — это цифры, он покажется как есть.

Залей скетч как обычно (шаг 2). Теперь при каждом включении ESP32 через пару секунд показывает свой IP прямо на экранчике — остаётся переписать его в строку IP = "…" в Python. 🎉

💡 Если экран не загорелся • Чёрный экран → у части модулей адрес 0x3D, а не 0x3C; поменяй число в screen.begin(...).
• Ошибка при компиляции → проверь, что стоят обе библиотеки: Adafruit SSD1306 и Adafruit GFX.
• Каша вместо текста → перепутаны SDA и SCL (надо SDA→21, SCL→22).
• Текст не появляется → в самом конце обязательно вызови screen.display() — без него экран не обновится.
💡 Куда расти дальшеДальность: ноутбук может стоять в другой комнате — лишь бы та же WiFi-сеть.
Совсем без проводов: ESP32 можно питать и от модуля MB102 — тогда к ноутбуку не идёт ни один провод, только WiFi.
Без роутера: telemetrix-esp32 умеет и по Bluetooth (BLE) — связь напрямую с ноутбуком.
Экранчик: может показывать не только IP при старте, но и статус (вперёд/назад) — правда, этот текст уже пришлось бы слать на плату из Python, это сложнее.
• Это тот же приём, что у настоящих роботов: ум в Python, плата слушается — хоть по проводу, хоть по воздуху.
✅ Проверь себя Что в коде поменялось по сравнению с уроком 6, а что осталось? Откуда взять IP-адрес ESP32? Почему важно, чтобы ноутбук и ESP32 были в одной сети?

🧠 Проверь себя

Выбери ответ. Ошибёшься — 30 секунд на то, чтобы вернуться в урок и перечитать.

Чем урок 7 отличается от урока 6?

✅ Ум остаётся в Python на ноутбуке, команды те же — меняется только связь: вместо USB-провода WiFi.

Откуда узнать IP-адрес ESP32 для подключения?

✅ ESP32 подключается к WiFi и печатает свой IP в Serial Monitor — его и пишем в transport_address.
← НазадУрок 6 — Мостик к Arduino