Skip to content

Instantly share code, notes, and snippets.

Revisions

  1. @probonopd probonopd created this gist Mar 17, 2013.
    151 changes: 151 additions & 0 deletions Send infrared commands from the Arduino to the iRobot Roomba
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,151 @@

    #include <IRremote.h>

    /*

    Send infrared commands from the Arduino to the iRobot Roomba
    by probono

    2013-03-17 Initial release

    Copyright (c) 2013 by probono
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

    1. Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
    ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    IR Remote Control
    129 Left
    130 Forward
    131 Right
    132 Spot
    133 Max
    134 Small
    135 Medium
    136 Large / Clean
    137 Stop
    138 Power
    139 Arc Left
    140 Arc Right
    141 Stop

    Scheduling Remote
    142 Download
    143 Seek Dock

    Roomba Discovery Driveon Charger
    240 Reserved
    248 Red Buoy
    244 Green Buoy
    242 Force Field
    252 Red Buoy and Green Buoy
    250 Red Buoy and Force Field
    246 Green Buoy and Force Field
    254 Red Buoy, Green Buoy and Force

    Roomba 500 Drive-on Charger
    160 Reserved
    161 Force Field
    164 Green Buoy
    165 Green Buoy and Force Field
    168 Red Buoy
    169 Red Buoy and Force Field
    172 Red Buoy and Green Buoy
    173 Red Buoy, Green Buoy and Force Field

    Roomba 500 Virtual Wall
    162 Virtual Wall

    Roomba 500 Virtual Wall Lighthouse ###### (FIXME: not yet supported here)
    0LLLL0BB
    LLLL = Virtual Wall Lighthouse ID
    (assigned automatically by Roomba
    560 and 570 robots)
    1-10: Valid ID
    11: Unbound
    12-15: Reserved
    BB = Which Beam
    00 = Fence
    01 = Force Field
    10 = Green Buoy
    11 = Red Buoy

    */

    IRsend irsend; // hardwired to pin 3; use a transistor to drive the IR LED for maximal range

    void setup()
    {
    Serial.begin(9600);
    }

    void loop()
    {
    // Read 3-digit code from serial line and send it via IR
    char buffer[] = {
    ' ',' ',' ' }; // Receive up to 3 bytes
    while (!Serial.available()); // Wait for characters
    Serial.readBytesUntil('\n', buffer, 3);
    int incomingValue = atoi(buffer);
    if(incomingValue > 0) roomba_send(incomingValue);
    delay(1000);
    }

    void roomba_send(int code)
    {
    Serial.print("Sending Roomba code ");
    Serial.print(code);
    int length = 8;
    unsigned int raw[length*2];
    unsigned int one_pulse = 3000;
    unsigned int one_break = 1000;
    unsigned int zero_pulse = one_break;
    unsigned int zero_break = one_pulse;

    int arrayposition = 0;
    // Serial.println("");
    for (int counter = length-1; counter >= 0; --counter) {
    if(code & (1<<counter)) {
    // Serial.print("1");
    raw[arrayposition] = one_pulse;
    raw[arrayposition+1] = one_break;
    }
    else {
    // Serial.print("0");
    raw[arrayposition] = zero_pulse;
    raw[arrayposition+1] = zero_break;
    }
    arrayposition = arrayposition + 2;
    }
    for (int i = 0; i < 3; i++) {
    irsend.sendRaw(raw, 15, 38);
    delay(50);
    }
    Serial.println("");

    /*
    Serial.print("Raw timings:");
    for (int z=0; z<length*2; z++) {
    Serial.print(" ");
    Serial.print(raw[z]);
    }
    Serial.print("\n\n");
    */
    }