Go Down

Topic: Arduino to iRobot Roomba/Create (Read 5038 times) previous topic - next topic


I have been working on a project over the summer and I had to add functionality to Todd E. Kurt's (author of "Hacking Roomba") code; I added in functionality to include ALL the sensor readings, and (rudimentary, but effective) error checking for serial data packets.

Here's the code that handles all serial communication with the Roomba/Create:

Code: [Select]

char sensorbytes[10];

// Sensor Packet 1
#define BUMPRIGHT (sensorbytes[0] & 0x01)  
#define BUMPLEFT  ((sensorbytes[0] & (1<<1))>>1)
#define WHEELDROP_C ((sensorbytes[0] & (1<<4))>>4)  
#define WHEELDROP_L ((sensorbytes[0] & (1<<3))>>3)
#define WHEELDROP_R ((sensorbytes[0] & (1<<2))>>2)
#define WALL (sensorbytes[1])
#define CLIFF_L (sensorbytes[2])
#define CLIFF_FL (sensorbytes[3])
#define CLIFF_FR (sensorbytes[4])
#define CLIFF_R (sensorbytes[5])
#define VWALL (sensorbytes[6])
#define MOTOROVER_L ((sensorbytes[7] & (1<<4))>>4)
#define MOTOROVER_R ((sensorbytes[7] & (1<<3))>>3)
#define DIRT_L (sensorbytes[8])
#define DIRT_R (sensorbytes[9])

// Sensor packet 2
#define REMOTE (sensorbytes[0])
#define BUTTON_CLEAN ((sensorbytes[1] & (1<<1))>>1)
#define BUTTON_SPOT ((sensorbytes[1] & (1<<2))>>2)
#define BUTTON_POWER ((sensorbytes[1] & (1<<3))>>3)
#define DISTANCE ((sensorbytes[2] << 8) +  sensorbytes[3])
#define ANGLE ((360*((sensorbytes[4] << 8) + sensorbytes[5]))/(258*PI))   // Degrees
#define RADIANS ((2 * ((sensorbytes[4] << 8) + sensorbytes[5])) / 258)    // Radians

// Sensor Packet 3
#define CHARGE_STATE (sensorbytes[0])
#define VOLTAGE ((sensorbytes[1] << 8) + sensorbytes[2])
#define CURRENT ((sensorbytes[3] << 8) + sensorbytes[4])
#define TEMP (sensorbytes[5])
#define CHARGE ((sensorbytes[6] << 8) + sensorbytes[7])
#define CAPACITY ((sensorbytes[8] << 8) + sensorbytes[9])


void updateSensors(byte packet) {
 Serial.print(142, BYTE);
 Serial.print(packet, BYTE);  
 delay(100); // wait for sensors
 char i = 0;
 while(Serial.available()) {
   int c = Serial.read();
   if( c==-1 ) {
   sensorbytes[i++] = c;
 if(i < 6) {     // Size of smallest sensor packet is 6
void SensorError() {
 for(byte i = 0; i < 10; i++) {
   digitalWrite(ledPin, HIGH);
   digitalWrite(ledPin, LOW);

void WakeUp() {
 // wake up the robot
 digitalWrite(ddPin, LOW);
 digitalWrite(ddPin, HIGH);

The '...' indicates I've left out all the other stuff (required loop(), setup(), etc). This is just the stuff you'll need in addition to your code.

In the void setup(){} function, you can put this to control the roomba:

Code: [Select]

 for(i = 0; i < 3; i++) {     // Set baud rate to 19200bps
   digitalWrite(ddPin, LOW);
   digitalWrite(ddPin, HIGH);
 // set up ROI to receive commands  
 Serial.print(128, BYTE);  // START (Now in PASSIVE Mode)

 Serial.print(133, BYTE);  // POWER; Turn off to see if we are plugged in
 Serial.print(130, BYTE);  // CONTROL (Now in SAFE Mode)

In the 'ChargeMonitor' routine, I added some code to use alongside an Emic TTS module to speak out charging/battery status, but the code doesn't seem to work (somehow I'm sending the data to it improperly...). I used the SoftSerial library to communicate with the Emic.

Also, a milestone that, according to my online searches, close to nobody knows:

In order to communicate to the roomba, the ATmegaxxx MUST be disconnected from the Tx/Rx pins of the FT232 USB-Serial chip. The FT232 seems to drop the voltage coming from the roomba/from the arduino to the roomba, and therefore voltage trigger thresholds (HI/LO) are out of whack for serial communication, and it almost always doesn't work.

Have fun!


Being a noob. I am researching this. I have a used Roomba that I am awaiting a battery for and an arduino uno. Anyway before I attempt this I was wondering how do you disconnect the Tx/Rx pins from the FT232 USB-Serial Chip? I have seen this comment twice in my searches but I don't know how to disconnect anything that is on the Arduino.



Go Up