Forked from probonopd/Send infrared commands from the Arduino to the iRobot Roomba
Last active
August 26, 2018 17:58
Revisions
-
probonopd created this gist
Mar 17, 2013 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal 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"); */ }