[originally published 12 September 2006 on todbot]
Ever since Bluetooth adapters for Roombas appeared, I’ve wanted to control my Roomba with a cell phone. All my recent phones have had Bluetooth. But getting a devkit for a phone was expensive and phone-specific. Trying to develop J2ME (aka “JavaME”) applications for cell phones has been a mess, especially for non-Windows users. Thankfully, Mobile Processing wraps up the ugly details, like Processing does for normal Java. It makes writing little programs for your phone pretty easy, and makes whipping up a program to control a Roomba possible.
So here’s “RoombaCtrl”, a small Java program for your Bluetooth- and J2ME-compatible phone that works with the build-your-own Bluetooth adapter shown in the book “Hacking Roomba” or the pre-built RooTooth.
Now you can drive your Roomba with your cellphone like so:
You can download RoombaCtrl compiled, ready to install:
The “jad” file is if you’re doing “over-the-air” (OTA) installation. Don’t worry about that though. Just grab the jar file and copy it over with Bluetooth file transfer.
You can also download the Mobile Processing source:
Unzip that into your MobileProcessing sketch folder, open Mobile Processing, and choose RoombaCtrl from the available Sketches. Or if you want to see the entire source code right now:
You’ll also need a slightly patched Mobile Processing Bluetooth library:
In the “libraries” directory of the Mobile Processing application, move the existing “bluetooth” library directory out of the way and unzip the above zipfile in its place.
Mobile Processing Bluetooth Library Patch
The patch for Mobile’s Bluetooth library is only a few lines long:
All the patch does is allow one to specify short UUIDs when searching for services. The standard Bluetooth Serial Port Profile (SPP) has a short UUID of 0×1101. All the Roomba Bluetooth adapters appear as normal serial ports using SPP.
This patch allows you to search for Bluetooth serial ports (instead of other Mobile Processing apps) by doing:
Bluetooth bt = new Bluetooth(this, Bluetooth.UUID_SERIALPORT);
Conceivably, you could add additional static defines for the other pre-defined Bluetooth UUIDs.
RoombaCtrl Buildling and Installation
Installing a program on a cell phone can be mysterious; some cell providers even prohibit you from downloading programs. If you have Bluetooth on your phone, installation becomes a simple file transfer.
Building MIDlets (Java applets for cell phones) can also be a little puzzling. Mobile Processing makes it easier, but it still assumes a little too much knowledge. Mobile Processing is still pretty new so perhaps as it ages it’ll get easier. Of course, it doesn’t help that Sun doesn’t make a cross-platform toolkit for developing MIDlets.
Below is a small movie showing how, if everything is configured correctly, building and installing a new Mobile Processing program on your phone can be pretty quick. It uses Mac OS X, but the techniques are the same for any OS.
I had a real time trying to figure out why Mobile Processing wouldn’t let me talk to Bluetooth Serial Devices. I ended up learning how to write Java MIDlets by hand. Here’s some of the links I got knowledge from:
- Do-It-Yourself MIDP on Mac OS X
- MPower free MIDP SDK for Mac OS X (the tutorial in the SDK is great)
- Avetana Bluetooth implementation
- J2ME Javadocs
- Bluetooth library source code from Mobile Processing
- Java APIs for Bluetooth