Online-Controlled Rover

Advanced robotics project featuring remote control capabilities, live video streaming, and omnidirectional movement.

Ongoing Robotics • IoT • Node.js • MQTT • Real-time Systems • Web Development • UI/UX

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

Technical Challenges

Motors Would Randomly Stop

Solved
Problem:

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.

Solution:

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

Solved
Problem:

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.

Solution:

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

Solved
Problem:

The browser-based control interface couldn’t communicate with the MQTT broker because browsers require MQTT over WebSockets (WSS), not raw MQTT.

Solution:

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.