ESP32-S3 CAM: создаём радиоуправляемую машинку с видеокамерой

Микроконтроллеры семейства ESP32 давно завоевали популярность среди любителей электроники благодаря сочетанию высокой производительности, встроенного Wi-Fi и доступной цены. Одним из наиболее интересных применений таких плат является создание радиоуправляемых устройств с передачей видео. В этой статье рассмотрим проект машинки с камерой на базе ESP32-S3 CAM, которой можно управлять через обычный браузер со смартфона или компьютера.

 

Что представляет собой проект

По своей сути это небольшая роботизированная платформа на колёсах, оснащённая видеокамерой и беспроводным интерфейсом управления. Машинка создаёт собственную точку доступа Wi-Fi или подключается к домашней сети, после чего пользователь открывает веб-страницу управления и получает изображение с камеры в реальном времени.

Одновременно с просмотром видео можно управлять движением: ехать вперёд и назад, поворачивать влево и вправо, а также изменять скорость. В результате получается простейший FPV-робот (First Person View), позволяющий наблюдать за окружающей обстановкой глазами установленной камеры.

Такой проект отлично подходит для изучения робототехники, беспроводных технологий и программирования микроконтроллеров.

Почему именно ESP32-S3 CAM

Раньше для подобных проектов приходилось использовать несколько отдельных модулей: микроконтроллер, Wi-Fi адаптер и камеру. ESP32-S3 CAM объединяет всё это в одном устройстве.

Основные преимущества платы:

  • встроенный модуль Wi-Fi;
  • поддержка камеры;
  • высокая производительность;
  • большое количество GPIO-пинов;
  • поддержка современных средств разработки;
  • низкая стоимость.

Благодаря этому удаётся существенно упростить конструкцию и уменьшить количество проводов.

 

Необходимые компоненты

Для сборки понадобятся:

  • плата ESP32-S3 CAM;
  • шасси для роботизированной машинки;
  • два двигателя постоянного тока с редукторами;
  • драйвер двигателей L298N или DRV8833 + L2596;
  • аккумуляторный блок;
  • выключатель питания;
  • комплект проводов;
  • крепёжные элементы.

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

Зачем нужен драйвер двигателей

Микроконтроллер не способен напрямую питать электродвигатели. Для этого используется специальный модуль — драйвер двигателей.

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

  • подаёт необходимый ток на моторы;
  • позволяет менять направление вращения;
  • обеспечивает регулировку скорости;
  • защищает микроконтроллер от перегрузки.

Наиболее распространёнными являются драйверы L298N, TB6612FNG и их аналоги. Для небольших машинок обычно предпочтительнее современные драйверы с меньшими потерями энергии.

 

Питание проекта

Большинство проблем начинающих связано именно с питанием.

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

  • самопроизвольные перезагрузки;
  • зависания микроконтроллера;
  • обрывы видеотрансляции;
  • нестабильная работа Wi-Fi.

Поэтому рекомендуется использовать качественные литий-ионные аккумуляторы 18650 или готовые аккумуляторные сборки.

Для повышения стабильности рядом с драйвером двигателей часто устанавливают электролитический конденсатор большой ёмкости, который сглаживает кратковременные просадки напряжения.

 

Сборка механической части

Процесс сборки начинается с установки двигателей на шасси. После этого закрепляются колёса и аккумуляторный отсек.

Плату ESP32-S3 CAM желательно разместить в верхней части конструкции. Такое расположение обеспечивает лучший обзор для камеры и уменьшает вероятность повреждения электроники при столкновениях.

Камеру следует направить немного вверх относительно горизонтали. Это позволяет видеть не только пол перед машинкой, но и объекты на расстоянии нескольких метров.

 

Подключение электроники

После сборки механической части необходимо соединить между собой микроконтроллер, драйвер двигателей и источник питания.

Микроконтроллер передаёт драйверу управляющие сигналы, а драйвер уже управляет моторами. Важно соблюдать соответствие выводов, указанное в программе.

Перед первым включением рекомендуется ещё раз проверить:

  • правильность подключения питания;
  • отсутствие коротких замыканий;
  • надёжность соединений;
  • полярность аккумуляторов.

Ошибки на этом этапе могут привести к выходу компонентов из строя.

 

Подготовка программного обеспечения

Для разработки удобно использовать Visual Studio Code с расширением PlatformIO.

Такой подход имеет несколько преимуществ:

  • автоматическая установка необходимых библиотек;
  • удобная компиляция проекта;
  • простая загрузка прошивки;
  • встроенные средства отладки.

После открытия проекта необходимо указать параметры своей сети Wi-Fi или настроить режим точки доступа. Параметры и используемые выходы ESP можно задать в файле Config/src/Config.h.

// WiFi credentials
#define WIFI_SSID "YOUR_SSID"
#define WIFI_PWD "YOUR_PASSWORD"

// Access Point mode
// + true = creates a WiFi network without internet connection 
// the car IP will always be http://192.168.4.1:8000
// + false = connect to an existing WiFi with internet connection
// the car IP will be assigned by the router http://X.X.X.X:8000
#define WIFI_AP_MODE true

// Set minimum motor speed (0 to 255)
#define MIN_MOTOR_SPEED 80

// Enable debug (prints car speed and direction in the serial)
#define JOYSTICK_DEBUG false

// Set camera model
#define CAMERA_FREENOVE_ESP32S3_CAM
// #define CAMERA_MODEL_XIAO_ESP32S3
// #define CAMERA_MODEL_AI_THINKER

// Set JPEG quality (0 to 63 - lower means higher quality)
// NOTE: Higher image quality reduces CPU usage for compression.
#define JPEG_QUALITY 15

// Improve FPS by using double buffering (usually works perfectly
// for ESP32S3 family)
#define INCREASE_FPS true

// Customize PINS
#if defined(CAMERA_FREENOVE_ESP32S3_CAM)
#define PIN_M1_IN1 42
#define PIN_M1_IN2 41
#define PIN_M2_IN1 40
#define PIN_M2_IN2 39
#define PIN_FRONT_LED 3
#define PIN_RGB_LED 48
// NOTE: higher resolutions affect framerate
#define FRAME_SIZE FRAMESIZE_VGA

#elif defined(CAMERA_MODEL_XIAO_ESP32S3)
#define PIN_M1_IN1 1
#define PIN_M1_IN2 2
#define PIN_M2_IN1 3
#define PIN_M2_IN2 4
#define PIN_FRONT_LED 9
#define PIN_BOARD_LED 7
// NOTE: higher resolutions affect framerate
#define FRAME_SIZE FRAMESIZE_VGA

#elif defined(CAMERA_MODEL_AI_THINKER_V2)
#define PIN_M1_IN1 14
#define PIN_M1_IN2 47
#define PIN_M2_IN1 38
#define PIN_M2_IN2 39
#define PIN_FRONT_LED 40
#define PIN_RGB_LED 48
// NOTE: higher resolutions affect framerate
#define FRAME_SIZE FRAMESIZE_VGA

#elif defined(CAMERA_MODEL_AI_THINKER)
#define PIN_M1_IN1 14
#define PIN_M1_IN2 15
#define PIN_M2_IN1 12
#define PIN_M2_IN2 13
#define PIN_FRONT_LED 3
#define PIN_BOARD_LED 33
// NOTE: higher resolutions affect framerate
#define FRAME_SIZE FRAMESIZE_VGA

#else
#error "Camera model not selected"

#endif

Тонкую настройку параметров можно выполнить в отдельных файлах, таких как DCMotor.h, для изменения параметров скорости.

#ifndef DCMOTOR_H
#define DCMOTOR_H
#include <Arduino.h>

class DCMotor
{
public:
    DCMotor(uint8_t pinIn1, uint8_t pinIn2);
    void backward(uint8_t speed = 100);
    void forward(uint8_t speed = 100);
    void setMinAbsSpeed(uint8_t absSpeed);
    void stop();

private:
    uint8_t pinIn1;
    uint8_t pinIn2;
    uint8_t absSpeed = 0;
    uint8_t maxAbsSpeed = 255;
    uint8_t minAbsSpeed = 50;
    uint8_t ignoreAbsSpeed = 30;

    void setSpeed(uint8_t speed);
};

Затем выполняется компиляция и загрузка программы в память ESP32-S3 CAM.

 

Как работает управление

После запуска микроконтроллер поднимает веб-сервер и начинает передавать изображение с камеры.

Пользователь открывает браузер и переходит по адресу устройства. На экране появляется панель управления с видеопотоком и кнопками движения.

При нажатии кнопок браузер отправляет команды через Wi-Fi, а микроконтроллер преобразует их в сигналы управления двигателями.

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

Мышь

По умолчанию управление автомобилем осуществляется через веб-страницу с виртуальным джойстиком.

Клавиатура

Чтобы использовать клавиатуру, в любой момент нажмите клавишу Enter. Нажмите её ещё раз, чтобы вернуться к виртуальному джойстику.

  1. Включить/Выключить: Нажмите Enter
  2. Левая/Правая: A/D, или ←/→
  3. Вверх: W или ↑
  4. Обратный ход: S или ↓
  5. Камера: P или C
  6. Передние светодиоды: L или F
  7. Максимальная скорость: от 1 (10) до 0 (100)

Геймпад

Чтобы использовать USB-геймпад, совместимый с PlayStation 3, нажмите кнопку Start в любое время. Нажмите ее еще раз, чтобы вернуться к виртуальному джойстику.

  • Включить/Выключить: Запуск
  • Левая/Правая сторона: левый аналоговый джойстик
  • Вверх: R2
  • Обратный ход: L2
  • Камера: △
  • Передние светодиоды: □

Если у вас "Белый" IP адрес, то данным роботом можно управлять из любой точки мира, где есть интернет. Для этого в роутере необходимо:

  1. Назначить статический IP адрес;
  2. Настроить следующие правила переадресации портов:
    • 8000 (веб-страница);
    • 8001 (видеостриминг);
    • 8002 (команды WebSocket / джойстика);
  3. Настроить службу DDNS (например, No-IP).

 

Возможные доработки

После успешной сборки базовой версии можно постепенно расширять возможности проекта.

Популярные улучшения:

  • сервопривод для поворота камеры;
  • светодиодные фары;
  • инфракрасная подсветка;
  • датчики препятствий;
  • автоматическое торможение;
  • запись видео на карту памяти;
  • управление через Интернет;
  • интеграция с системами умного дома.

Подобные доработки превращают простую игрушку в полноценную экспериментальную роботизированную платформу.

 

Заключение

Машинка на базе ESP32-S3 CAM — отличный проект для знакомства с робототехникой и беспроводными технологиями. Она сочетает в себе управление двигателями, передачу видео по Wi-Fi и работу встроенного веб-интерфейса. При относительно небольших затратах можно получить интересную платформу для экспериментов, дальнейшего обучения и разработки собственных проектов.

ZIP-архив с исходным кодом 📥 Скачать