iPaq Roomba 1

iPaq Roomba

Part I

Michael Menefee



While the Roomba is a very capable vacuum, it holds great potential as a ready-made robotics platform. It includes a number of basic sensors one would find on a research platform, and has the potential to carry a variety of extra sensors. Further, with the addition of a high-power on-board processor, it becomes an even more capable autonomous mobile platform.


My approach to automating Roomba is, perhaps, somewhat over-the-top. I have added an iPaq as a controller with an advanced software framework for control. This is perhaps “smarter” than a vacuum needs to be, but I have never used Roomba as a vacuum. My ultimate goal is to build a swarm of Roombas, but in this article I will address the first step: giving Roomba a brain.



Here’s what we’re building





To put this system together, you’ll need a few things:



You’ll also need some software


Other stuff

You’ll need some sort of Linux environment in which to compile software. I personally use Virtual PC with a copy of Debian.


The Roomba

You’ll need to prepare your Roomba if necessary. Flash the firmware with your Osmo and such. Also, now would be a good time to charge the battery if the bot needs it.


Serial converter/power source

I built a slightly different serial converter, with the consideration of adding extra devices later.

I used:


I'm having a bit of trouble getting the schematic to come out in JPEG right, so I'll update this soon. Its not too hard to hook all this up.



Okay, now the real fun begins. Head on over to http://familiar.handhelds.org and grab a copy of the install image of your choice. A few caveats:


Test the iPaq

Okay, so now you’ve got Linux installed. Go pick up a copy of minicom from http://ipkgfind.handhelds.org and get it installed with ipkg. Time to plug your Roomba in and test. The serial port on your iPaq is /dev/tts/0. Plug your serial converter in between the iPaq and the Roomba, start minicom at 57600 8N1 and push the power button on the Roomba. If all is well, you should see some text come up when Roomba wakes up. If not, try debugging with a desktop to determine if it’s your iPaq or the level shifter. When all is well, you’re ready to continue.


Development Environment

Now we need to get a way to compile programs for the iPaq. If you can’t compile on the iPaq (wouldn’t recommend it even if you could), go find yourself a copy of scratchbox and install it on your copy of Linux. I use the arm-linux-gcc3.4.cs-glibc2.3 toolchain, but I’m not certain it is the only one that works. Experiment if you like.


Scratchbox has a good walkthrough of their setup if you get stuck. Make sure you can compile a test program, and then you’ll want to get sbrsh set up between your Linux machine and your iPaq. Sbrsh will be necessary to compile more advanced apps. It executes code natively on your hardware, but makes it look as if it were executing at your scratchbox terminal. I used it to compile the Player server for my device.


Now, I happen to like Scratchbox. This probably also works just as well with another arm toolchain. I’m just lazy.


Compiling Player

Unzip player inside your scratchbox root, then do the usual ./configure. This will take some extra time with sbrsh, as it will be downloading code to your iPaq to execute. A helpful parameter here is the --prefix option, as you can make a player tree inside your scratchbox user directory and then tar it up and push it down to the iPaq.


Mike’s Roomba Driver

Now, here’s the fun part. Player-2.0.0 has a Roomba driver. I also started writing a Roomba driver at the end of last year for the 1.6.5 version of Player, which I’ve put up for download below. I have the bumpers, cliff sensors, wall sensor, and basic odometery implemented. However, mine only works with Player-1.6.5 at the moment. I’m planning on merging my code with the Player-2.0.0 code. However, if you want to use my driver, you’ll have to have 1.6.5 for the moment.


You can find my driver here: http://val.mnetwork.org/sci_driver.cc


To compile the driver, just do:

g++ -Wall -O3 -c sci_driver.cc

g++ -shared -nostartfiles -o sci_driver.so sci_driver.o


This will build a .so that you can use in your player config file like this:




plugin "sci_driver.so"

name "roombascidriver"

provides ["position:0" "dio:0" "bumper:0"]

port "/dev/tts/0"





Okay, so at this point you should have a Roomba you can talk to over a network. Now, fire up the playerjoy utility and give it a shot. You should be able to move the Roomba around on command.


Your Turn

So there you have it. Now you can give your Roomba a brain, and that brain can be anywhere on your network. Using the Player client libraries, you can make it do all sorts of interesting things now. Go have fun!


Up Next

The next article will cover adding a CMUCam (or maybe an AVRCam if I can find time to build one), as well as some other useful sensors.