So you wanna hack a Roomba eh? Well here’s a collection of info to help you on your way. Myself, Jeremie, and Mark Martens did a little bit of the dirty work so you don’t have to. I hope you find this list of resources helpful:
First off somehow the ultimate resource for taking control of your Roomba, which is the book: “Hacking Roomba” by ThingM’s own Tod E. Kurt, managed to find itself on the interwebs as a full download and it hasn’t been taken down for some reason: http://www.robotiklubi.ee/_media/kursused/roomba_sumo/failid/hacking_roomba.pdf
Next you should know that while every Roomba is hackable from a general hardware perspective there is an easy way to hack em’ and there’s a hard way to hack em’ (Thanks for your hard work Hacker Dino!). We’re just gonna focus on the easy way. Using the easy method we will absolutely need a Roomba that has firmware that post-dates Oct. 2005, anything previous to that and you are most welcome to completely rip apart and repurpose your Roomba. The Roomba pictured (above) on the right was manufactured after October 2005 and includes what they call SCI (Serial Command Interface) Firmware. The one on the left isn’t as luckly. The SCI firmware allows a Roomba to be externally controlled (via the SCI port) using a Microcontroller (Arduino/Freeduino/EZ-B) or other TTL-serial communications device such as FTDI breakouts, or Xbee/Synapse Wireless RF modules as well.
There’s a quick way to tell approximately what year your Roomba’s firmware is, just flip it over and find the manufacturing date, if it’s 2006 or later you are good, if it’s 2005 or earlier then you’ll have to dig a little deeper to find the exact date.
Finding your Firmware date
With a charged battery plugged in and Roomba off, hold down the power button down for 10 seconds. The Roomba will then start to continuously beep in a looping sequence. This morse-code beeping sequence is a date code in base 5 format, where “dots” equal 1′s and “dashes” are 5′s. These numbers add together to establish the firmware date. Its in the format: year-month-day with short pauses between them. Don’t worry if you miss the code the first time as it will continuously repeat the code until you power it down.
Here’s an example of the code: …. PAUSE – …. PAUSE —- .
Which translates to …. = 1+1+1+1= 4 PAUSE -…. = 5+1+1+1+1 = 9 PAUSE – - – - . = 5+5+5+5+1 = 21
So the date code is 04-09-21 = Sept 21, 2004.
Here’s the link where I got such info:
Note: If you’d like to attempt to update your Roomba’s firmware with the Scheduler please use it as a last resort as you could downgrade your firmware if you use it on a newer Roomba.
While it is possible to update a Roomba’s firmware with a Scheduler remote, unfortunately I haven’t found a Remote with firmware on it that post-dates Oct 2005. Also keep in mind that you either have to buy or build yourself a firmware uploading cable as you have to interface from the mini-B connector on the side of the scheduler remote to the SCI port on the Roomba. If you’d like to try to use the Scheduler remote to upgrade, the cable needed to program the Roomba has the following wiring pinout:
Mini-B USB 7 Pin Din
1 RED +V 1 +14.4V
2 WHT D- 3 RxD
3 GRN D+ 4 TxD
4 Goes to USB Pin 5 5 DD
N/C 6 GND
5 BLK GND 7 GND
In other words:
7 pin mini (1) connects to USB (1) +V
7 pin mini (2) No Connection
7 pin mini (3) connects to USB (2) D-
7 pin mini (4) connects to USB (3) D+
7 pin mini (5) connects to USB (4) GND
7 pin mini (6) No Connection
7 pin mini (7) connects to USB (5) GND
Pictured are the pinouts for the Roomba Female 7 pin Din and the Male Mini-B USB Connector, to make it easier for wiring a cable up. The cable plugs into the side of the Scheduler remote and then into the female SCI port of the Roomba. Follow the instructions from the pictures of the Scheduler Remote manual to apply a firmware update.
Note: A previous alternative to upgrading this way was to use an OSMO upgrade module for your specific Roomba, but unfortunately they are no longer available. Apparently though a fellow called Robot-Doc on the EZ-Robot forums may be able to help if you sweet talk him.
SCI Specs and Info
Here’s the Roomba SCI manual: http://www.irobot.com/images/consumer/hacker/Roomba_SCI_Spec_Manual.pdf
The SCI manual will give you the pinout of the SCI port as well as the commands to control your Roomba serially. One great command I found was to shut down the vacuum motor, this saved my head from exploding as the constant vacuum noise was a bit irritating while I was debugging. I can’t remember which code it was but I will update this post when I find it.
Default baud rate: 57600
Alternate Default baud rate (using 1 of 2 configuration methods): 19200
Data bits: 8
Stop bits: 1
Flow control: None
- iRobot Roomba Vacuum Cleaner – with Firmware later than Oct. 2005
- 14.4V Roomba Battery
- iRobot Charger (or equivalent power supply)
Specs for the iRobot Charger are:
Input – 120 VAC 60Hz 0.3A (20W)
Output – 22VDC 0.75A – Tip Positive
Probably the number one reason why people either sell, give away, or throw away their Roomba is because the low end, blue NiCd based Battery sucks! They seem to run out of power extremely quickly, you’ll either want to upgrade to the Yellow Batteries or replace the batteries inside.
You could always upgrade your battery pack as well to 12 fresher Sub-C sized batteries (make sure you get the kind with tabs on them to easily solder them together). Please note that you’ll need a triangle bit to open the batteries up, or you can just use a flatblade that fits, or grind down a scrap piece of metal to fit.
New Roomba’s have a built-in shrink wrapped battery as opposed to an external removable battery, but not to worry their batteries usually last pretty well.
Building a Serial Communication cable
To plug into the SCI port on the roomba you will need a mini Din connector, luckly the common PS/2 connector from an old mouse or keyboard fits quite nice once you have removed the center alignment tab. Use a pair of needle nose pliers to snap it off and you are on your way. The nice thing about a PS/2 connector is that it includes an alignment dimple at the top so you’ll never plug it in backward.
Be aware when salvaging a PS/2 connector that there are many connectors that use a reusable white thermo plastic called “Caprolactone” behind the connector for strain relief of the wires, and although it may look permanent it can easily be melted away with a heatgun.
If you don’t want to salvage a connector DJ from EZ-Robot found you can purchase PS/2 connectors sometimes quite easily from your local electronics shop. Here’s some instructions on how he easily interfaced an EZ-B to a Roomba.
To use an Arduino as the main controller first download a sample program found here and upload it to your Arduino. You’ll then want to hook up the hardware Arduino Pin 2 to Roomba TXD, Pin 3 to RXD, & pin 4 to DD and then you can rob power from the Roomba to power your Arduino from the +14.4V and GND pins to a 2.1mm Barrel plug (or you can use the Vin header). Instead of using hardware serial pins 0 & 1 we are using software serial on pins 2 & 3 to keep the hardware serial lines free for something like an xbee or synapse wireless module if we want to add it later. If you would rather use a different battery to supply your Arduino you can do that too, just make sure the GND references are tied together somewhere as both sides of the circuit need to share a common negative reference.
Now with everything plugged in, power on your roomba and your Arduino program should take over move the roomba in a certain pattern, and the front bump sensor should still be reactive. Keep in mind that you have other sensors on the Roomba to take advantage of and you now have the ability to add external sensors to the Arduino’s A/D ports if you like. Anyway, Congrats you’ve hacked your Roomba the easy way!
Couple of Troubleshooting suggestions
With the EZ-B I had a bit of trouble getting it to activate right away, turns out that with my Roomba I had to run a jumper from the DD line to Ground (breadboard jumpers work well for this) in order to take the Roomba out of sleep mode.
If your Roomba doesn’t seem to be communicating to the Arduino try swapping the Rx and Tx you may have mixed them up. It’s like I know this from experience or something :).
More great misc. resources: