Cloud-Connected Sphero RVR Robot with AWS IoT Core and Seeed Studio XIAO ESP32S3


A Sphero RVR integrated with a Seeed Studio XIAO ESP32S3 with telemetry uploaded into, and also, basic drive remote control commands received from any where leveraging AWS IoT Core.
Overview
Lately I have been aiming to go deep on AI Robotics, and last year I have been slowly experimenting more and more with anything that is AI, IoT and Robotics related; with the intention of learning and going as wide and as deep as possible in any pillars I can think of. You can check out my blogs under the Robotics](/projects/robotics) Project to see what I have been up to. This year I want to focus on enabling mobility for my experiments - as in providing wheels for solutions to move around the house, ideally autonomously; starting off with wheel based solutions bought off-shelve, followed by solutions that I build myself from open-sourced projects people have kindly contirbuted online, and then ambitiously designed, 3D Printed and built all from the ground up - perhaps in a couple of years time.
This project uses a Seeed Studio XIAO ESP32S3 microcontroller to communicate with a Sphero RVR robot via UART, while simultaneously connecting to AWS IoT Core over WiFi. The system publishes real-time sensor telemetry and accepts remote drive commands through MQTT.
Hardware Components
| Component | Description |
|---|---|
| Seeed Studio XIAO ESP32S3 | Compact ESP32-S3 microcontroller with WiFi, 8MB flash |
| Sphero RVR | Programmable robot with motors, IMU, color sensor, encoders |
| XIAO Expansion Board | Provides OLED display (128x64 SSD1306) for status info |
Hardware Wiring

Features
Real-time Telemetry
The system publishes comprehensive sensor data every 60 seconds:
- IMU Data: Pitch, roll, yaw orientation
- Accelerometer & Gyroscope: Motion and rotation data
- Color Sensor: RGB values with confidence
- Compass: Heading in degrees
- Ambient Light: Lux measurements
- Motor Thermal: Temperature and protection status
- Encoders: Wheel tick counts
- Position & Velocity: Locator data in meters
Remote Commands via MQTT
Control the RVR from anywhere using JSON commands:
- Drive: Speed and heading control
- Tank: Independent left/right motor control
- Raw Motors: Direct motor speed control
- LED Control: Headlights, brakelights, status LEDs
- Navigation: Reset yaw, reset locator
- Power: Wake and sleep commands
Local OLED Display
The XIAO Expansion Board's OLED display shows real-time sensor readings for local monitoring.
MQTT Message Flow

Sensor Data Pipeline

Architecture
The XIAO ESP32S3 acts as a bridge between the Sphero RVR and AWS IoT Core:
- UART Communication: The ESP32S3 communicates with the RVR via UART (GPIO43/44)
- WiFi Connection: Connects to local WiFi network
- MQTT over TLS: Secure connection to AWS IoT Core with X.509 certificates
- Bidirectional: Publishes telemetry and subscribes to command topics


Sphero RVR Protocol
The Sphero RVR uses a binary packet-based protocol over UART. Each packet contains a start-of-packet byte (0x8D), an 8-byte header with device ID and command ID, variable-length data body, checksum, and end-of-packet byte (0xD8). The RVR has two internal processors: Nordic (handles BLE, power, color detection) and ST (handles motors, IMU, encoders).

Source Code
I ported the code into this project to control the RVR using the UART protocol based on the Sphero SDK.
You can find the source code for this project here: https://github.com/chiwaichan/platformio-aws-iot-seeed-studio-esp32s3-sphero-rvr
