Control a Sphero RVR with bluetooth joypad

A while back I contributed to the Sphero RVR Kickstarter project. It arrived in time for Christmas allowing me to gift it to my daughter. Ostensibly this was a fun educational present for her, but it also doubled up as a present to myself. Everyone’s a winner.

The RVR itself is an incredibly solid device and without a doubt the highest quality item I’ve received from a Kickstarter.

I did have some difficulties charging the battery (a dodgy connection on the battery, it seems), and after a chat with Sphero’s responsive support they sent another unit.

Anyway, being so inclined I attached a Raspberry Pi to the mounting plate and connected it to the RVR with a hand-built serial cable. I then attached a PiCamera and a Pimoroni Speaker pHAT to the Raspberry Pi. Combined with a USB C cable for power, it’s a neat and self-contained setup (excepting the slight pin bending in attaching the roll cage).

Sphero does provide an iOS app to control the RVR, but I wanted a little more control.

To this end I decided to use a bluetooth joypad, specifically an 8bitdo SF30 Pro, to control the RVR and drive it around. The camera can then display video on a screen, the speaker allows sounds to be played, and the joypad buttons change the LED colours.

Thanks to the availability of several Python libraries this was all fairly straightforward. I’m not especially proficient with Python, and this was a good opportunity to practice a bit more.

It’s surprisingly controllable and my daughter has great fun building LEGO carts and attaching them to the RVR, and then driving her three Yoshi toys around.

Anyway, it’s all here on Github:

And a video!


One response to “Control a Sphero RVR with bluetooth joypad”

  1. Nice touch with the horn!


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: