ESP32 UNO - Control Car via Web

Want to drive a robot car from your phone with no extra remote? Turn the ESP32 Uno into an RC car brain that serves its own control page over WiFi. The ESP32 Uno form board pushes every arrow tap to an L9110S motor driver through a WebSocket, so the 2WD robot car moves the moment you touch the screen and stops when you let go.

By the end, you can:

  1. Connect an L9110S motor driver and a 2WD robot car to the ESP32 Uno
  2. Explain why a WebSocket beats page reloads for real-time car control
  3. Add the DIYables ESP32 WebServer library through the Library Manager
  4. Steer the car in four directions from any phone or laptop browser
ESP32 Uno RC car via web

Components You Need

1×ESP32 Uno-form Board
1×USB Cable Type-A to Type-C (for USB-A PC)
1×USB Cable Type-C to Type-C (for USB-C PC)
1×2WD RC Car
1×L9110S Motor Driver Module
1×IR Remote Controller Kit
1×CR2025 Battery (for IR Remote controller)
1×1.5V AA Battery (for ESP32 Uno and Car)
1×Jumper Wires
1×Breadboard

Or you can buy the following kits:

1×DIYables Sensor Kit (18 sensors/displays)
Disclosure: Some of the links provided in this section are Amazon affiliate links. We may receive a commission for any purchases made through these links at no additional cost to you.
Additionally, some of these links are for products from our own brand, DIYables .

The Car, the Driver and the WebSocket

After this part, you know what each piece does and why the browser link must stay open.

Part Job in This Project
2WD robot car Two DC motors turn the two drive wheels, and a castor wheel keeps the car level
L9110S module Takes four logic signals from the board and feeds battery power to the two motors
ESP32 Uno Joins your WiFi, hosts the control page and sets the four driver inputs
WebSocket Keeps one open channel between the browser and the board for instant commands

A normal web page needs a full reload for each new request. For a car, that means a delay every time you change direction, and the car feels slow. A WebSocket opens once and stays open. Each button press then travels to the board in a few milliseconds, with no reload, so steering feels direct.

Good to know: the ESP32 Uno pins cannot supply the current a motor needs. The L9110S does the heavy work, and the board only sends low-current 3.3V control signals.

Dig deeper with ESP32 Uno - WebSocket and ESP32 Uno - DC Motor.

How It Works

This part shows the path of one button press, from your finger to the wheels.

Step 1 — The page comes from the board

Enter the ESP32 Uno IP address in the address bar of a browser. The web server on port 80 replies with the control page, made of HTML, CSS and JavaScript stored in index.h.

Step 2 — The browser opens the WebSocket

You tap Connect. The JavaScript on the page opens a WebSocket to port 81 on the same IP address, and the state label turns to OPEN.

Step 3 — Buttons become numbers

Touching an arrow sends one small number. Lifting your finger always sends 0. The sketch reads that number and sets the L9110S inputs.

Button on Page Number on Press Number on Release What the Car Does While Held
UP 1 0 Drives forward
DOWN 2 0 Drives backward
LEFT 4 0 Turns left
RIGHT 8 0 Turns right
STOP 0 0 Stays still

Because a release always sends 0, the car moves only while you hold a button. That makes desk tests safe.

Step 4 — Numbers become motor signals

Each command puts one fixed pattern on the four driver inputs:

Command A-IA A-IB B-IA B-IB
Forward (1) HIGH LOW HIGH LOW
Backward (2) LOW HIGH LOW HIGH
Left (4) HIGH LOW LOW LOW
Right (8) LOW LOW HIGH LOW
Stop (0) LOW LOW LOW LOW

ESP32 Uno Pinout

Your sketch talks to GPIO numbers, while the wires go into Uno header holes. Match the two with the diagram below before you plug in the driver.

ESP32 Uno pinout diagram

How to Connect the Car to the ESP32 Uno

When this part is done, the driver, the motors and the battery pack share one circuit with the board.

The wiring diagram between ESP32 Uno 2WD RC car

This image is created using Fritzing. Click to enlarge image

L9110S Pin ESP32 Uno Pin
A-IA D5 (GPIO16)
A-IB D6 (GPIO27)
B-IA D9 (GPIO13)
B-IB D10 (GPIO5)
VCC Battery + (6V)
GND Battery - and ESP32 Uno GND

WARNING

D10 (GPIO5) is a boot strapping pin on the ESP32 Uno. The chip checks it at power-up, and it can also send a short pulse during boot, so motor B may twitch for a moment when you switch on. The L9110S input rarely pulls it to a bad level. If the board does not start or will not take an upload, pull the B-IB wire out of D10, upload, and plug it back in.

Good to know: the L9110S accepts the 3.3V HIGH level of the ESP32 Uno, so you need no level shifter for the four input wires.

Power for the whole car

The L9110S runs the motors straight from its VCC and GND pins, and it has no 5V regulator on board. One pack of four 1.5V AA cells (6V) can run everything:

  1. Wire the 6V pack to VCC and GND on the L9110S. This feeds the motors.
  2. Wire the same pack to VIN and GND on the ESP32 Uno. This feeds the board.
  3. Join the L9110S GND and the ESP32 Uno GND. Without a shared ground, the driver cannot read the control signals.

The L9110S is easier to wire than an L298N. You will not find ENA/ENB jumpers or a 12V screw terminal on it.

The car chassis has an on/off switch. Put it in the battery line if you want one-touch power. To keep the build short, you can leave the switch out.

ESP32 Uno Code

The project is split into two tabs, so the motor logic and the web page stay apart.

File What It Holds
newbiely.com.ino WiFi setup, web server, WebSocket server and the five car functions
index.h The control page (HTML, CSS and JavaScript) stored as one text string

Upload and Test

  1. First time with this board? Set it up with ESP32 Uno - Getting Started before you continue.
  2. Build the circuit by following the wiring table above.
  3. Plug in the USB Type-C cable between the ESP32 Uno and your computer.
  4. Select the board in Arduino IDE: pick ESP32 Dev Module and the COM port of the board (CH340).
  5. Open the Library Manager with the Library Manager icon in the left bar of the Arduino IDE.
  6. Install the web server library: search for "DIYables ESP32 WebServer", then press Install on the DIYables entry.
  • Search for DIYables ESP32 WebServer created by DIYables.io and click the Install button.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32 Dev Module
Library Manager
Type:
All
Topic:
All
DIYables ESP32 WebServer by DIYables.io
DIYables ESP32 WebServer library designed for ESP32 boards. It includes multi-page web server capabilities and WebSocket support for real-time communication, perfect for IoT projects and DIYables ESP32 boards. More info
1.0.1
INSTALL
Newbiely.ino
···
1 void setup() {
Output
Serial Monitor
Ln 1, Col 1
ESP32 Dev Module on COM15
1
  1. Start a new sketch and save it under a name such as newbiely.com.ino.
  2. Paste the main code below into that sketch.
/* * This ESP32 Uno code was developed by newbiely.com * * This ESP32 Uno code is made available for public use without any restriction * * For comprehensive instructions and wiring diagrams, please visit: * https://newbiely.com/tutorials/esp32-uno/esp32-uno-controls-car-via-web */ #include <DIYables_ESP32_WebServer.h> #include "index.h" #define CMD_STOP 0 #define CMD_FORWARD 1 #define CMD_BACKWARD 2 #define CMD_LEFT 4 #define CMD_RIGHT 8 #define MOTOR_A_IA_PIN 16 // D5 (GPIO16) goes to A-IA on the L9110S (motor A) #define MOTOR_A_IB_PIN 27 // D6 (GPIO27) goes to A-IB on the L9110S (motor A) #define MOTOR_B_IA_PIN 13 // D9 (GPIO13) goes to B-IA on the L9110S (motor B) #define MOTOR_B_IB_PIN 5 // D10 (GPIO5) goes to B-IB on the L9110S (motor B), boot strapping pin // your network name and password const char WIFI_SSID[] = "YOUR_WIFI_SSID"; const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // the HTTP server object and a pointer to its WebSocket part DIYables_ESP32_WebServer server; DIYables_ESP32_WebSocket* webSocket; // sends the control page when the browser asks for "/" void handleHome(WiFiClient& client, const String& method, const String& request, const QueryParams& params, const String& jsonData) { server.sendResponse(client, HTML_CONTENT); // the page text lives in index.h } // runs when a browser opens the WebSocket link void onWebSocketOpen(net::WebSocket& ws) { Serial.println("New WebSocket connection"); // greeting text (kept for later use) const char welcome[] = "Connected to ESP32 Uno WebSocket Server!"; } void onWebSocketMessage(net::WebSocket& ws, const net::WebSocket::DataType dataType, const char* message, uint16_t length) { String angle = String(message); int command = angle.toInt(); Serial.print("command: "); Serial.println(command); switch (command) { case CMD_STOP: Serial.println("Stop"); CAR_stop(); break; case CMD_FORWARD: Serial.println("Move Forward"); CAR_moveForward(); break; case CMD_BACKWARD: Serial.println("Move Backward"); CAR_moveBackward(); break; case CMD_LEFT: Serial.println("Turn Left"); CAR_turnLeft(); break; case CMD_RIGHT: Serial.println("Turn Right"); CAR_turnRight(); break; default: Serial.println("Unknown command"); } } void onWebSocketClose(net::WebSocket& ws, const net::WebSocket::CloseCode code, const char* reason, uint16_t length) { Serial.println("WebSocket client disconnected"); } void setup() { Serial.begin(9600); delay(1000); pinMode(MOTOR_A_IA_PIN, OUTPUT); pinMode(MOTOR_A_IB_PIN, OUTPUT); pinMode(MOTOR_B_IA_PIN, OUTPUT); pinMode(MOTOR_B_IB_PIN, OUTPUT); Serial.println("ESP32 Uno Web Server and WebSocket Server"); // link the "/" path to the page handler server.addRoute("/", handleHome); // join the WiFi network, then start serving pages server.begin(WIFI_SSID, WIFI_PASSWORD); // open the WebSocket server on port 81 webSocket = server.enableWebSocket(81); if (webSocket != nullptr) { // attach the open, message and close callbacks webSocket->onOpen(onWebSocketOpen); webSocket->onMessage(onWebSocketMessage); webSocket->onClose(onWebSocketClose); } else { Serial.println("Failed to start WebSocket server"); } } void loop() { // serve any waiting page request server.handleClient(); // check for new WebSocket data server.handleWebSocket(); } void CAR_moveForward() { digitalWrite(MOTOR_A_IA_PIN, HIGH); digitalWrite(MOTOR_A_IB_PIN, LOW); digitalWrite(MOTOR_B_IA_PIN, HIGH); digitalWrite(MOTOR_B_IB_PIN, LOW); } void CAR_moveBackward() { digitalWrite(MOTOR_A_IA_PIN, LOW); digitalWrite(MOTOR_A_IB_PIN, HIGH); digitalWrite(MOTOR_B_IA_PIN, LOW); digitalWrite(MOTOR_B_IB_PIN, HIGH); } void CAR_turnLeft() { digitalWrite(MOTOR_A_IA_PIN, HIGH); digitalWrite(MOTOR_A_IB_PIN, LOW); digitalWrite(MOTOR_B_IA_PIN, LOW); digitalWrite(MOTOR_B_IB_PIN, LOW); } void CAR_turnRight() { digitalWrite(MOTOR_A_IA_PIN, LOW); digitalWrite(MOTOR_A_IB_PIN, LOW); digitalWrite(MOTOR_B_IA_PIN, HIGH); digitalWrite(MOTOR_B_IB_PIN, LOW); } void CAR_stop() { digitalWrite(MOTOR_A_IA_PIN, LOW); digitalWrite(MOTOR_A_IB_PIN, LOW); digitalWrite(MOTOR_B_IA_PIN, LOW); digitalWrite(MOTOR_B_IB_PIN, LOW); }
  1. Enter your network details: put your WiFi name and password in place of YOUR_WIFI_SSID and YOUR_WIFI_PASSWORD. The board joins 2.4GHz networks only.
  2. Add the index.h tab:
    • Press Ctrl+Shift+N, or click the button under the Serial Monitor icon and pick New Tab.
    Arduino IDE 2 adds file
    • Enter index.h as the file name and confirm with OK.
    Arduino IDE 2 adds file index.h
    • Paste the page code below into the new tab.
    /* * This ESP32 Uno code was developed by newbiely.com * * This ESP32 Uno code is made available for public use without any restriction * * For comprehensive instructions and wiring diagrams, please visit: * https://newbiely.com/tutorials/esp32-uno/esp32-uno-controls-car-via-web */ const char *HTML_CONTENT = R"=====( <!DOCTYPE html> <html> <head> <title>ESP32 Uno Control Car via Web</title> <meta name="viewport" content="width=device-width, initial-scale=0.7, maximum-scale=1, user-scalable=no"> <style type="text/css"> body { text-align: center; font-size: 24px;} button { text-align: center; font-size: 24px;} #container { margin-right: auto; margin-left: auto; width: 400px; height: 400px; position: relative; margin-bottom: 10px; } div[class^='button'] { position: absolute; } .button_up, .button_down { width:214px; height:104px;} .button_left, .button_right { width:104px; height:214px;} .button_stop { width:178px; height:178px;} .button_up { background: url('https://esp32io.com/images/tutorial/up_inactive.png') no-repeat; background-size: contain; left: 200px; top: 0px; transform: translateX(-50%); } .button_down { background: url('https://esp32io.com/images/tutorial/down_inactive.png') no-repeat; background-size: contain; left:200px; bottom: 0px; transform: translateX(-50%); } .button_right { background: url('https://esp32io.com/images/tutorial/right_inactive.png') no-repeat; background-size: contain; right: 0px; top: 200px; transform: translateY(-50%); } .button_left { background: url('https://esp32io.com/images/tutorial/left_inactive.png') no-repeat; background-size: contain; left:0px; top: 200px; transform: translateY(-50%); } .button_stop { background: url('https://esp32io.com/images/tutorial/stop_inactive.png') no-repeat; background-size: contain; left:200px; top: 200px; transform: translate(-50%, -50%); } </style> <script> var CMD_STOP = 0; var CMD_FORWARD = 1; var CMD_BACKWARD = 2; var CMD_LEFT = 4; var CMD_RIGHT = 8; var img_name_lookup = { [CMD_STOP]: "stop", [CMD_FORWARD]: "up", [CMD_BACKWARD]: "down", [CMD_LEFT]: "left", [CMD_RIGHT]: "right" } var ws = null; function init() { var container = document.querySelector("#container"); container.addEventListener("touchstart", mouse_down); container.addEventListener("touchend", mouse_up); container.addEventListener("touchcancel", mouse_up); container.addEventListener("mousedown", mouse_down); container.addEventListener("mouseup", mouse_up); container.addEventListener("mouseout", mouse_up); } function ws_onmessage(e_msg) { e_msg = e_msg || window.event; // event object with the received data //alert("msg : " + e_msg.data); } function ws_onopen() { document.getElementById("ws_state").innerHTML = "OPEN"; document.getElementById("wc_conn").innerHTML = "Disconnect"; } function ws_onclose() { document.getElementById("ws_state").innerHTML = "CLOSED"; document.getElementById("wc_conn").innerHTML = "Connect"; console.log("socket was closed"); ws.onopen = null; ws.onclose = null; ws.onmessage = null; ws = null; } function wc_onclick() { if(ws == null) { ws = new WebSocket("ws://" + window.location.host + ":81"); document.getElementById("ws_state").innerHTML = "CONNECTING"; ws.onopen = ws_onopen; ws.onclose = ws_onclose; ws.onmessage = ws_onmessage; } else ws.close(); } function mouse_down(event) { if (event.target !== event.currentTarget) { var id = event.target.id; send_command(id); event.target.style.backgroundImage = "url('https://esp32io.com/images/tutorial/" + img_name_lookup[id] + "_active.png')"; } event.stopPropagation(); event.preventDefault(); } function mouse_up(event) { if (event.target !== event.currentTarget) { var id = event.target.id; send_command(CMD_STOP); event.target.style.backgroundImage = "url('https://esp32io.com/images/tutorial/" + img_name_lookup[id] + "_inactive.png')"; } event.stopPropagation(); event.preventDefault(); } function send_command(cmd) { if(ws != null) if(ws.readyState == 1) ws.send(cmd + "\r\n"); } window.onload = init; </script> </head> <body> <h2>ESP32 Uno - RC Car via Web</h2> <div id="container"> <div id="0" class="button_stop"></div> <div id="1" class="button_up"></div> <div id="2" class="button_down"></div> <div id="8" class="button_right"></div> <div id="4" class="button_left"></div> </div> <p> WebSocket : <span id="ws_state" style="color:blue">closed</span><br> </p> <button id="wc_conn" type="button" onclick="wc_onclick();">Connect</button> <br> <br> <div class="sponsor">Sponsored by <a href="https://amazon.com/diyables">DIYables</a></div> </body> </html> )=====";
    1. Check the tabs: two tabs are open now, newbiely.com.ino plus index.h.
    2. Upload: press Upload and wait until the IDE reports "Done uploading".
    3. Open the Serial Monitor at 9600 baud and press the reset (EN) button once. The log looks similar to this:
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    ESP32 Dev Module
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
    New Line
    9600 baud
    ESP32 Uno Web Server and WebSocket Server Connecting To WiFi..... SSID: Tutorial_2G4 Signal strength (RSSI): -58 dBm Web Server Address: http://192.168.1.47 WebSocket server started
    Ln 11, Col 1
    ESP32 Dev Module on COM15
    2
    1. Load the control page: type the IP address from the log into a browser on a phone or PC that uses the same WiFi.
    2. Check the page: it should look like this.
    ESP32 Uno controls car via web browser
    1. Tap Connect and wait until the WebSocket label reads OPEN.
    2. Drive: hold an arrow to move or turn, and lift your finger to stop. Each press also shows up in the Serial Monitor:
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    ESP32 Dev Module
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
    New Line
    9600 baud
    WebSocket client connected from: 192.168.1.33 New WebSocket connection command: 1 Move Forward command: 0 Stop command: 8 Turn Right command: 0 Stop
    Ln 11, Col 1
    ESP32 Dev Module on COM15
    2
    1. Pro tip: test with the wheels off the table first. Put the car on a small box, press each arrow, and watch which wheel turns. Fix any wrong direction before the car goes on the floor.

    The arrow pictures on the page are not stored in the ESP32 Uno flash. The browser downloads them from the internet, so your phone or PC needs internet access to show them.

    ※ NOTE THAT:

    The Arduino IDE may skip a rebuild when only index.h has changed. If your page edits do not appear, add a blank line or a comment to newbiely.com.ino, then upload again.

Code Explanation

Every line of the sketch has a comment, so read the code itself for details. The table below shows the main blocks.

Code Part What It Does
MOTOR_..._PIN defines Name the four driver inputs on D5, D6, D9 and D10 (GPIO16, 27, 13, 5)
server.begin(WIFI_SSID, WIFI_PASSWORD) Joins your WiFi and starts the web server on port 80
server.enableWebSocket(81) Opens the WebSocket server and returns a pointer to it
onWebSocketMessage() Turns the text it gets into a number and picks a car function with switch
CAR_moveForward() and the other CAR_ functions Write one HIGH/LOW pattern to the four pins
loop() Calls handleClient() and handleWebSocket() again and again

The result is a car that reacts only to WebSocket commands and stops itself on every button release.

ESP32 Uno vs UNO R4 for This Project

Moving this car from the UNO R4 WiFi to the ESP32 Uno changes the library and the GPIO numbers, not the wiring holes.

Item Arduino UNO R4 ESP32 Uno
Logic voltage 5V 3.3V
Driver pins D5, D6, D9, D10 D5 (GPIO16), D6 (GPIO27), D9 (GPIO13), D10 (GPIO5)
Web server library UnoR4WiFi_WebServer DIYables ESP32 WebServer
WiFi chip Separate WiFi module with its own firmware Built into the main chip
Firmware update step Sometimes needed Not needed
Arduino IDE board Arduino UNO R4 WiFi ESP32 Dev Module

The same wires go into the same Uno holes, and the L9110S works with 3.3V signals. The one pin to watch is D10, a boot strapping pin on the ESP32 Uno.

Try These Next

  1. Speed control: add a slider to the page and use analogWrite() on the IA pins so the car can creep or rush.
  2. Status back to the page: send the current direction from the board to the browser with the WebSocket and show it under the arrows.
  3. Auto brake: add an ultrasonic sensor and stop forward motion when a wall is closer than 15 cm.
  4. Keyboard drive: add arrow-key listeners to index.h so you can steer from a laptop keyboard.

Troubleshooting

Problem Possible Cause Solution
No COM port appears in Arduino IDE CH340 driver missing or a charge-only USB cable Install the CH340 driver and use a USB cable that carries data
Upload stops at "Failed to connect" or "Waiting for download" Board did not enter upload mode Hold the BOOT button while the upload starts, then release it
Board does not boot or upload with the car connected D10 (GPIO5) boot strapping pin pulled the wrong way Unplug the B-IB wire from D10 while uploading, or use another pin
Serial Monitor stops at "Connecting To WiFi" Wrong WiFi name or password, or a 5GHz-only network Check the two WiFi lines in the code and use a 2.4GHz network
Serial Monitor shows garbage text Baud rate does not match the code Set the Serial Monitor to 9600 baud
Page opens but the arrows are blank Phone or PC has no internet access Use a network with internet, since the arrow images load online
Arrows react but nothing prints and the car stays still WebSocket is not open Tap Connect and wait for the OPEN label
Commands print but the wheels do not move No shared GND or flat batteries Join the L9110S GND to the board GND and fit fresh AA cells
Car turns when it should go straight One motor is wired in reverse Swap the two wires of that motor on the L9110S output
Board restarts as soon as the car starts Battery voltage dips under motor load Fit fresh cells, add a large capacitor across the pack, or power the board on its own

FAQ

How fast does the car react to a button press?

On a normal home network, a command reaches the ESP32 Uno in a few milliseconds. The WebSocket stays open, so there is no page reload in between. You will not notice any lag while driving indoors.

Do I need a level shifter between the ESP32 Uno and the L9110S?

No. The L9110S reads the 3.3V HIGH from the ESP32 Uno as a logic 1. The motor current comes from the battery via the VCC pin of the module, and the board supplies none of it.

Can I run the board and the motors from one battery pack?

Yes. Feed the 6V pack into VIN on the ESP32 Uno and into VCC on the L9110S, and join the grounds. Never feed the pack into the 3.3V pin. If the board resets when the motors start, the cells are too weak or need a capacitor across them.

Why does motor B twitch when I turn the car on?

B-IB sits on D10 (GPIO5), a boot strapping pin of the ESP32 Uno. During boot, this pin can change state for a short moment before your code takes over. The twitch is harmless and stops once setup() sets the pins to OUTPUT.

Can I copy the UNO R4 WiFi sketch to the ESP32 Uno?

Not as-is. The UNO R4 WiFi sketch uses the UnoR4WiFi_WebServer library, while the ESP32 Uno uses DIYables ESP32 WebServer. The calls look almost the same, but the GPIO numbers are different too, so use the code on this page.

Which board do I select for the ESP32 Uno in Arduino IDE?

Install the "esp32 by Espressif Systems" core, then pick ESP32 Dev Module. Also install the CH340 driver if the COM port does not show up.

Can I fit an Uno motor shield on the ESP32 Uno instead of the L9110S?

Many Uno shields fit the headers. Check two things first. The shield must work with 3.3V logic, and it must not use the A2 to A5 pins (GPIO35, 34, 36, 39) as outputs, because those pins are input only on the ESP32 Uno.

Can I change the motor speed from the web page?

Yes. The ESP32 Uno supports PWM with analogWrite() on D5, D6, D9 and D10. Add a slider to index.h, send its value over the WebSocket, and write it to the IA pins instead of HIGH.

Can I drive the car from outside my home?

Not with this sketch. The control page opens only on devices inside your home network. Remote access needs port forwarding, a VPN or a cloud service, which this guide does not cover.

What if my car build needs more pins than the Uno headers give?

The ESP32 Uno has a few extra holes near the power header. GPIO32 and GPIO33 give I/O, PWM and analog on ADC1, so they still read analog values while WiFi is on. GPIO15 gives I/O, PWM and analog on ADC2. To use them, solder on pin headers and put the GPIO number in your sketch. For this car, GPIO32 and GPIO33 suit an ultrasonic sensor or a battery voltage divider. Two warnings: GPIO15 and GPIO0 (the IO0 pin at the unused Uno NC position) are boot strapping pins, and a wrong connection can stop the board from booting or uploading, so use GPIO32/33 first. Also, never use the six holes under the digital header (SD0 to SD3, CMD, CLK = GPIO6 to GPIO11). They are wired to the flash chip, and using them crashes the board.

※ OUR MESSAGES

  • As freelancers, We are AVAILABLE for HIRE. See how to outsource your project to us
  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!