Cirkit Designer LogoCirkit DesignerYour all-in-one circuit design IDE Launch Cirkit Designer App

Wi-Fi Controlled Robotic Car with ESP32-CAM and L298N Motor Driver

View and Edit Project In Cirkit DesignerImage of Wi-Fi Controlled Robotic Car with ESP32-CAM and L298N Motor Driver

Circuit Documentation

Summary

This document provides a detailed overview of a circuit designed to control a robotic car with an ESP32-CAM module. The circuit includes multiple DC motors, a motor driver, a servo motor, a push switch, a step-down buck converter, and a 12V battery. The ESP32-CAM module is used for both camera functionality and controlling the motors and servos. The circuit is designed to be controlled via a web interface, allowing for remote operation.

Component List

  1. DC Motor

    • Description: A motor that converts direct current electrical energy into mechanical energy.
    • Pins: pin 1, pin 2
  2. L298N DC Motor Driver

    • Description: A dual H-Bridge motor driver that allows for control of two DC motors.
    • Pins: OUT1, OUT2, 12V, GND, 5V, OUT3, OUT4, 5V-ENA-JMP-I, 5V-ENA-JMP-O, +5V-J1, +5V-J2, ENA, IN1, IN2, IN3, IN4, ENB
  3. ESP32-CAM

    • Description: A microcontroller with integrated camera module, WiFi, and Bluetooth capabilities.
    • Pins: 5V, GND, IO12, IO13, IO15, IO14, IO2, IO4, VOT, VOR, VCC, IO0, IO16, 3V3
  4. 12V Battery

    • Description: A power source providing 12V DC.
    • Pins: -, +
  5. Mini-360 DC-DC Step Down Buck Converter

    • Description: A voltage regulator that steps down 12V to a lower voltage.
    • Pins: Input -, Input +, Output +, Output -
  6. Servo

    • Description: A motor that allows for precise control of angular position.
    • Pins: gnd, vcc, pulse
  7. 2Pin Push Switch

    • Description: A simple push-button switch.
    • Pins: Input +, Output +

Wiring Details

DC Motor

L298N DC Motor Driver

ESP32-CAM

12V Battery

Mini-360 DC-DC Step Down Buck Converter

Servo

2Pin Push Switch

Code Documentation

Overview

The code is written for the ESP32-CAM module and is responsible for controlling the motors, servos, and camera. It sets up a web server to provide a user interface for controlling the car and viewing the camera feed.

Code Breakdown

Includes and Definitions

#include "esp_camera.h"
#include <Arduino.h>
#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <iostream>
#include <sstream>
#include <ESP32Servo.h>

#define PAN_PIN 14
#define TILT_PIN 15

Servo panServo;
Servo tiltServo;

struct MOTOR_PINS
{
  int pinEn;  
  int pinIN1;
  int pinIN2;    
};

std::vector<MOTOR_PINS> motorPins = 
{
  {2, 12, 13}, //RIGHT_MOTOR Pins (EnA, IN1, IN2)
  {2, 1, 3},  //LEFT_MOTOR  Pins (EnB, IN3, IN4)
};
#define LIGHT_PIN 4

#define UP 1
#define DOWN 2
#define LEFT 3
#define RIGHT 4
#define STOP 0

#define RIGHT_MOTOR 0
#define LEFT_MOTOR 1

#define FORWARD 1
#define BACKWARD -1

const int PWMFreq = 1000; /* 1 KHz */
const int PWMResolution = 8;
const int PWMSpeedChannel = 2;
const int PWMLightChannel = 3;

//Camera related constants
#define PWDN_GPIO_NUM     32
#define RESET_GPIO_NUM    -1
#define XCLK_GPIO_NUM      0
#define SIOD_GPIO_NUM     26
#define SIOC_GPIO_NUM     27
#define Y9_GPIO_NUM       35
#define Y8_GPIO_NUM       34
#define Y7_GPIO_NUM       39
#define Y6_GPIO_NUM       36
#define Y5_GPIO_NUM       21
#define Y4_GPIO_NUM       19
#define Y3_GPIO_NUM       18
#define Y2_GPIO_NUM        5
#define VSYNC_GPIO_NUM    25
#define HREF_GPIO_NUM     23
#define PCLK_GPIO_NUM     22

const char* ssid     = "MyWiFiCar";
const char* password = "12345678";

AsyncWebServer server(80);
AsyncWebSocket wsCamera("/Camera");
AsyncWebSocket wsCarInput("/CarInput");
uint32_t cameraClientId = 0;

const char* htmlHomePage PROGMEM = R"HTMLHOMEPAGE(
<!DOCTYPE html>
<html>
  <head>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    <style>
    .arrows {
      font-size:30px;
      color:red;
    }
    td.button {
      background-color:black;
      border-radius:25%;
      box-shadow: 5px 5px #888888;
    }
    td.button:active {
      transform: translate(5px,5px);
      box-shadow: none; 
    }

    .noselect {
      -webkit-touch-callout: none; /* iOS Safari */
        -webkit-user-select: none; /* Safari */
         -khtml-user-select: none; /* Konqueror HTML */