This document provides a technical specification and operational manual for the Micro-Rover (Zade) platform, an ESP8266-based differential drive robot with an embedded real-time web server for telemetry and control.
The system consists of three main layers: the physical/mechanical layer, the embedded control layer, and the client-side user interface.
+-------------------------------------------------------------+
| Client Browser / Controller |
| (Virtual Joystick / Keyboard / Sensor API / Canvas UI) |
+-------------------------------------------------------------+
|
WiFi HTTP REST API
|
v
+-------------------------------------------------------------+
| ESP8266 Microcontroller |
| (ESP8266WebServer / DHCP Service / mDNS / GPIO Control) |
+-------------------------------------------------------------+
|
H-Bridge Control
|
v
+-------------------------------------------------------------+
| Dual H-Bridge Motor Driver |
| (Speed Modulation via 10-bit PWM) |
+-------------------------------------------------------------+
|
Differential Drive
|
v
+-------------------------------------------------------------+
| Left & Right DC Motors |
+-------------------------------------------------------------+
Below are the engineering, assembly, and physical build step-by-step photos of the Micro-Rover platform.
The following step-by-step visual log documents the assembly process of the rover's physical chassis, component mounting, wiring routing, and final validation:
The robot employs a two-wheel differential drive kinematics model. Steering is achieved by creating a velocity differential between the left and right wheels.
Given a normalized linear velocity input v ∈ [-1, 1] and a normalized angular velocity input ω ∈ [-1, 1] from the user interface:
VR = clamp(v - ω, -1, 1)
Where VL and VR are the target left and right wheel velocities respectively. These values are mapped to 10-bit pulse-width modulation (PWM) values for the motor driver pins:
PWMR = VR × 1023
By translating wheel speeds (VL, VR) into tangential physical velocities vL and vRvR using the wheel radius r, the and angular velocities ωL, ωR:
The aggregate linear velocity vrobot and angular velocity ωrobot are calculated relative to the wheelbase chassis track width L:
ωrobot = (vR - vL) / L
To track coordinates (x, y) and heading orientation θ in the global coordinate frame across small time increments Δt:
yt+Δt = yt + vrobot · sin(θt) · Δt
θt+Δt = θt + ωrobot · Δt
The firmware initialization and execution cycle inside the single-threaded microcontroller system are illustrated by the state diagram below:
The ESP8266 is configured to operate exclusively in Access Point (AP) mode. It creates an isolated IEEE 802.11 b/g/n wireless network.
- SSID (Network Name):
micro_rover - WPA2-PSK Key (Password):
12345678 - Gateway IP Address:
192.168.4.1 - Subnet Mask:
255.255.255.0 - DHCP Server: Integrated (leases IP addresses automatically to connected clients in the
192.168.4.Xsubnet range). - mDNS Responder: Resolves queries for
http://micro-rover.localto192.168.4.1.
The microcontroller directs the H-bridge controller using digital direction signals (HIGH/LOW) and analog speed modulation (PWM).
| ESP8266 GPIO Pin | Motor Driver Pin | Signal Type | Functional Description |
|---|---|---|---|
| D1 (GPIO5) | IN1 | Digital Output | Left Motor Phase Direction Control A |
| D2 (GPIO4) | IN2 | Digital Output | Left Motor Phase Direction Control B |
| D6 (GPIO12) | IN3 | Digital Output | Right Motor Phase Direction Control A |
| D7 (GPIO13) | IN4 | Digital Output | Right Motor Phase Direction Control B |
| D0 (GPIO16) | ENA | PWM Output (10-bit) | Left Motor Speed Enable / PWM Modulation |
| D5 (GPIO14) | ENB | PWM Output (10-bit) | Right Motor Speed Enable / PWM Modulation |
| GND | GND | Reference Ground | Common Ground Reference |
To prevent electromagnetic interference (EMI) and power brownouts, the logic circuitry (ESP8266) and power circuitry (Motors/H-Bridge) must be isolated:
- The ESP8266 should be powered via a regulated 5V USB connection.
- The H-Bridge driver must be powered by a separate DC battery pack capable of supplying the motor load current.
- All ground (GND) connections must be linked to establish a common electrical potential.
| Obsymptom / Fault | Potential Root Cause | Verification & Mitigation Procedure |
|---|---|---|
| Microcontroller resets or drops connection when starting motion | Ground bounce, inductive spikes, or momentary voltage sag on the logic line. | Verify electrical isolation between power supply lines. Add decoupling capacitors (e.g., 220μF to 470μF electrolytic) across the motor driver’s input supply terminals. |
| Chassis spins in place instead of moving forward | Polarity inversion on one of the DC motor terminal outputs. | Swap the physical wire connections on the motor driver terminal block for the inverted motor, or invert the digital output pins in the firmware. |
| mDNS URL resolves on MacOS/iOS but fails on Windows/Android | Lack of native multicast DNS (mDNS) resolution support on the host client's operating system. | Install an mDNS routing responder (like iTunes/Bonjour on Windows) or fall back to addressing the controller directly via its IP address: http://192.168.4.1. |
| Unstable motor speed or jittery navigation controls | Missing common ground reference between the MCU and the motor driver. | Verify that a physical wire connects a GND pin on the ESP8266 to the negative/GND terminal block on the H-Bridge driver board. |
All remote controls are negotiated using lightweight stateless HTTP GET requests:
-
Serving Dashboard Assets:
- Endpoint:
/ - Method:
GET - Response Headers:
Content-Type: text/htmlConnection: close
- Response Payload: The raw HTML, styling sheets, and JavaScript files compiled into the program storage space (
INDEX_HTML).
- Endpoint:
-
Differential Navigation Request:
- Endpoint:
/move - Method:
GET - Query Parameters:
left(Required, Type: Integer, Range:[-1023, 1023]): Target duty cycle speed for the left wheels.right(Required, Type: Integer, Range:[-1023, 1023]): Target duty cycle speed for the right wheels.
- Success Response:
Status Code:200 OKContent-Type:text/plainBody:OK
- Client Error Response:
Status Code:400 Bad RequestContent-Type:text/plainBody:Bad Request(Returned if query arguments are missing or malformed).
- Endpoint:
The firmware is executed sequentially in a single-threaded loop on the ESP8266 MCU.
The firmware configures the ESP8266 in standalone Access Point mode utilizing the following initialization snippet inside setup():
// From setup() in main.ino:
WiFi.mode(WIFI_AP);
WiFi.softAP(WIFI_AP_SSID, WIFI_AP_PASS);
Serial.printf("\nAccess Point Started! AP IP: %s\n",
WiFi.softAPIP().toString().c_str());
if (MDNS.begin(MDNS_NAME)) {
Serial.printf("mDNS: http://%s.local\n", MDNS_NAME);
}The H-bridge controller is driven using high/low direction states and variable PWM speed mapping to the enable pins:
// From main.ino:
void setMotor(int in1, int in2, int enablePin, int speedValue) {
speedValue = constrain(speedValue, -MAX_PWM, MAX_PWM);
if (speedValue > 0) {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(enablePin, speedValue);
} else if (speedValue < 0) {
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
analogWrite(enablePin, -speedValue);
} else {
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
analogWrite(enablePin, 0);
}
}The endpoint /move takes left and right arguments and translates them directly to PWM driver signals:
// From main.ino:
void handleMove() {
if (server.hasArg("left") && server.hasArg("right")) {
moveRover(server.arg("left").toInt(), server.arg("right").toInt());
server.send(200, "text/plain", "OK");
} else {
server.send(400, "text/plain", "Bad Request");
}
}- Open the main.ino file inside the Arduino IDE.
- Ensure the ESP8266 core is installed via the Boards Manager.
- Select the target board variant and COM port.
- Execute the compilation and upload pipeline.
- Connect the host workstation or mobile device to the wireless access point: SSID:
micro_rover, Password:12345678. - Navigate to
http://192.168.4.1orhttp://micro-rover.localto start the interface.
The scripts/ directory includes interface wrappers for remote script execution:
- keyboard_control.py: Low-latency keyboard command parsing.
- dance_sequence.py: Scripted pattern automation.
- cv_target_tracking.py: Target tracking integration template.
- trace_shapes.py: Geometric path tracing algorithms.
- Ensure your PC is connected to the
micro_roverWi-Fi network. - Install dependencies:
pip install requests
- Run the target script:
python scripts/keyboard_control.py
micro-rover/
├── control.html # Prototype standalone HTML interface
├── index.html # Embedded UI resource source code template
├── README.md # Technical specification manual (This file)
├── main/
│ └── main.ino # Primary ESP8266 C++ board firmware code
├── pictures/ # Mechanical design views & wiring diagram illustrations
│ ├── bottom_view.png
│ ├── electronics.png
│ ├── electronics_and_mechanical.jpeg
│ ├── electronics_checking.jpg
│ ├── electronics_placement.png
│ ├── electronics_plate.jpg
│ ├── fixing_mcu.jpg
│ ├── fixing_wires.jpg
│ ├── fixing_wires2.jpg
│ ├── mechanical.png
│ ├── power_cable.jpg
│ ├── rover_without_electronics_isometric.png
│ ├── top_view.png
│ └── top_view_after_electronics.jpg
└── scripts/ # Python scripting automation suite
├── cv_target_tracking.py
├── dance_sequence.py
├── keyboard_control.py
├── teleop.py
└── trace_shapes.py













