Key Features
Intuitive Controls
Web-based control interface with keyboard and gamepad support for precise movement control.
- WASD keyboard controls
- Xbox controller support
- Sensitivity adjustment
Live Video Stream
Real-time HD video streaming with pan/tilt camera control and night vision capabilities.
- HD streaming
- ESP32-CAM camera
Remote Connectivity
Secure internet connection allowing global access with low-latency communication protocols.
- WebSocket Connection
- MQTT over Mosquitto
- SSL encryption
- Global accessibility
- Auto-reconnection
OmniMotor for the Rover
Motor driver for omnidirectional movement and precise control.
Project Gallery
Rover in Action
Demonstration of the rover's omnidirectional movement and control system.

Control Interface
Web-based dashboard with live control of the rover.

Camera
Close-up of the rover's camera (POWERED BY ESP32-CAM)
Technical Challenges
Motors Would Randomly Stop
The motors would intermittently stop when the Arduino was powered via USB from a laptop. The USB port could not supply enough current to power both the Arduino UNO R4 WiFi and the motor driver, leading to voltage drops and unstable behavior.
We switched to a dedicated external power supply, separating motor power from logic power. This resolved brownouts and ensured stable operation even under load.
MQTT Only Worked Over Mobile Hotspot
MQTT communication worked fine when connected to a mobile hotspot but failed over standard Wi-Fi networks. Public and many home routers often block MQTT’s default port (1883) or restrict unknown protocols.
We configured a reverse proxy using NGINX, which listens on port 443 (TLS/HTTPS) and forwards connections to the internal MQTT broker. This allowed the Arduino to connect securely using MQTT over TLS on port 443, bypassing most firewall restrictions.
Web Frontend Could Not Connect to MQTT
The browser-based control interface couldn’t communicate with the MQTT broker because browsers require MQTT over WebSockets (WSS), not raw MQTT.
We enabled MQTT over WebSockets on port 9001 on the broker and routed it through NGINX. The frontend now uses WSS on port 9001 to communicate, while the Arduino continues to use port 443 over TLS.