0
RoRoRoomba                         Roomba on Ruby on RailsFriday, April 27, 2012
Thanks!                         • Nancy Dussault-Smith                         • Joshua Lifton                         • a...
Thanks!Friday, April 27, 2012
IntroductionsFriday, April 27, 2012
My RoombaFriday, April 27, 2012
konnichiwa                         • Charles Abbott                         •                         • Life in Japan www....
“Greatest obstacle...                         “The greatest obstacle to discoveryFriday, April 27, 2012
“Greatest obstacle...                         “The greatest obstacle to discovery is not                         ignorance...
“Greatest obstacle...                         “The greatest obstacle to discovery is not                         ignorance...
“Greatest obstacle...                         “The greatest obstacle to discovery is not                         ignorance...
“Hack Me”Friday, April 27, 2012
3 R’s                         tokyorails.orgFriday, April 27, 2012
RubyFriday, April 27, 2012
RailsFriday, April 27, 2012
RoombaFriday, April 27, 2012
Roomba on Ruby on Rails                         • SerialPort + Ruby controls Roomba                         • Rails site t...
Resources                         • http://hackingroomba.com/ (Open                           source Java package)        ...
Getting StartedFriday, April 27, 2012
Getting SuppliesFriday, April 27, 2012
and then...Friday, April 27, 2012
my firstbornFriday, April 27, 2012
Back on TrackFriday, April 27, 2012
Arduino Layout                                          RX = receive                                          TX = transmi...
iRobot OI or SCI?Friday, April 27, 2012
ROI? API?Friday, April 27, 2012
Wired UpFriday, April 27, 2012
Roomba + Arduino                              What’s next?Friday, April 27, 2012
Arduino SandwichFriday, April 27, 2012
Arduino Sketches           void setup(){}             void loop(){}Friday, April 27, 2012
RAD?Friday, April 27, 2012
Example Roomba SketchFriday, April 27, 2012
Debugging ArduinoFriday, April 27, 2012
Debugging Pains                           [137] [255] [56] [1] [244]                         Disconnect, Connect, Disconne...
Past First BaseFriday, April 27, 2012
ArduinoFriday, April 27, 2012
Arduino Wireless XBEEFriday, April 27, 2012
BluetoothFriday, April 27, 2012
USB to SerialFriday, April 27, 2012
WifiFriday, April 27, 2012
Where to Start?Friday, April 27, 2012
Simple SerialFriday, April 27, 2012
Writing Code         def initialize(port, baud=115200)               @serial = SerialPort.new(port, baud, 8, 1, SerialPort...
Writing Opcodes              # Must call this first to start the serial command interface              def api_setup_start...
Modeling the ROI     # api_drive(255, 0, 0, 0) //go backward     # api_drive(0, 255, 0, 0) //go forward     # api_drive(0,...
Complex Write and Read                  def api_querylist(*bytes)                    write(149, bytes.length, *bytes)     ...
The Bottom of the Barrel                         def write(*args)                           args.each do |a|              ...
The Bottom of the Barrel             def read(timeout=50)               @serial.read_timeout= timeout               bytes ...
Pulling it Together                                   ls /dev/tty.*                               find your serial device  ...
“Hello Roomba” Demo                         “Don’t Assume It--Prove It”                                      - Tip, The Pr...
Pitfall #1          Forgetting to say “when”Friday, April 27, 2012
Status ReportsFriday, April 27, 2012
down the rabbit hole                         Flash Your SignFriday, April 27, 2012
down the rabbit hole   Binary and Signed IntegersFriday, April 27, 2012
down the rabbit hole                          Dealing With Binary           def signed_integer(bytes)             case byt...
down the rabbit hole                         A Hex DigressionFriday, April 27, 2012
Better AbstractionFriday, April 27, 2012
Distance & Time        # distance is in mm        # velocity is in mm/s (-500 to 500)        def move(distance, degree=0, ...
High Byte, Low Byte                         # distance is in mm                         # velocity is in mm/s (-500 to 500...
Move!       api_drive(@velocity_high, @velocity_low, @radius_high, @radius_low)       start_moving = Time.now       until ...
‘Move’ DemoFriday, April 27, 2012
Pitfall #2                               L...a...te..n....c..y                                          ...               ...
Cut out the Middle Men                         *Arduino is still awesome, and I encourage you to try it.Friday, April 27, ...
What Freedom Looks LikeFriday, April 27, 2012
Logic Level Converter       http://www.sparkfun.com                                           http://www.sparkfun.comFrida...
Prototyping!Friday, April 27, 2012
SerialPort || TCPSocket                         All we need is an IP address and a Port!Friday, April 27, 2012
Connected and then...                ............................never ending silence..........Friday, April 27, 2012
UART                Universal                Asynchronous                Receiver (RX)                Transmitter (TX)Frid...
UART an AngelFriday, April 27, 2012
Pitfall #3                         All you get is #$@#!                                                                   ...
Pitfall #3                         All you get is #$@#!                              Solution #1: RTFMFriday, April 27, 2012
Pitfall #3                         All you get is #$@#!                           Solution #2: Factory DefaultsFriday, Apr...
Pitfall #3                         All you get is #$@#!                            Solution #3: RTFM, again...Friday, Apri...
Pitfall #3                         All you get is #$@#!                            Solution #3: RTFM, again...Friday, Apri...
Wifly Configuration                         P195:~ charles$ telnet 169.254.1.1 2000                         Trying 169.254.1...
Pretty Prototype...Friday, April 27, 2012
Roomba WifiFriday, April 27, 2012
Roomba WifiFriday, April 27, 2012
3 Final Hurdles                  nope         nope        huh?Friday, April 27, 2012
Hurdle 1                         Wifly Option (a)Friday, April 27, 2012
Hurdle 1                         “Hold, hold,...Friday, April 27, 2012
Hurdle 1                         Wifly Option (b)Friday, April 27, 2012
Hurdle 2                   The Stateless Web Tax                         def initialize(port, baud=115200)                ...
Hurdle 3                         Device Busy                              CONCURRENT                               REQUEST...
Hurdle 2 & 3                             Socket Server                                                             Pseudoc...
Extended Demo                         “Coding Ain’t Done ‘Til All The Tests Run”                                          ...
Looking ForwardFriday, April 27, 2012
Testing Drones                         • How do you run software tests on                           something in the physi...
Roomba SimulatorFriday, April 27, 2012
Test the SimulationFriday, April 27, 2012
Compare with Live Test                                  Bring it!Friday, April 27, 2012
Simulator ScenariosFriday, April 27, 2012
Challenges                         If i tape a marker on Roomba...                                 Map out a room...Friday...
Physical Computing?                         Why you should care.                           Jeremiah Palecek http://nerdkor...
By 2020                               Ericsson White Paper                         284 23-3149 Uen | February 2011Friday, ...
Already                            “By 2016, there will be 1.4 mobile devices per capita. That year, there will be over 10...
People then Things                                    Ericsson White Paper                              284 23-3149 Uen | ...
People and Things                           https://trandi.wordpress.com/2011/09/26/vfd-clock-connects-to-the-internet/Fri...
People and Things                           http://lifeboat.co.nz/the-finished-wireless-water-sensor/Friday, April 27, 2012
Just Getting StartedFriday, April 27, 2012
“A Pragmatic Philosophy”                         Invest Regularly in Your                           Knowledge Portfolio   ...
An EccentricFriday, April 27, 2012
Who is Simon Stevin?  •waterway, spillways, sluices  •navigation, steering  •interest rate tables  •The Art of Fortificatio...
1585, De Thiende                           “The Tenths”                               35pgFriday, April 27, 2012
Changes the World                            “What seems a wonder, is not                              really a wonder.” -...
Fork it!                         github.com/tokyorails                                Charles Abbott                      ...
RoRoRoombaFriday, April 27, 2012
Upcoming SlideShare
Loading in...5
×

RoRoRoomba - Ruby on Rails on Roomba Railsconf 2012

807

Published on

Charles Abbott's presentation slides about hacking Roombas using Ruby and a Rails app over serial cable, bluetooth, arduino, and a straight serial to wifi gateway (wifly). Given at RailsConf 2012, video available on Confreaks.com.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
807
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
8
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "RoRoRoomba - Ruby on Rails on Roomba Railsconf 2012"

  1. 1. RoRoRoomba Roomba on Ruby on RailsFriday, April 27, 2012
  2. 2. Thanks! • Nancy Dussault-Smith • Joshua Lifton • and iRobot for the Roombas!Friday, April 27, 2012
  3. 3. Thanks!Friday, April 27, 2012
  4. 4. IntroductionsFriday, April 27, 2012
  5. 5. My RoombaFriday, April 27, 2012
  6. 6. konnichiwa • Charles Abbott • • Life in Japan www.forthecode.org • “The greatest obstacle...Friday, April 27, 2012
  7. 7. “Greatest obstacle... “The greatest obstacle to discoveryFriday, April 27, 2012
  8. 8. “Greatest obstacle... “The greatest obstacle to discovery is not ignoranceFriday, April 27, 2012
  9. 9. “Greatest obstacle... “The greatest obstacle to discovery is not ignorance, butFriday, April 27, 2012
  10. 10. “Greatest obstacle... “The greatest obstacle to discovery is not ignorance, but the illusion of knowledge” - Daniel J. BoorstinFriday, April 27, 2012
  11. 11. “Hack Me”Friday, April 27, 2012
  12. 12. 3 R’s tokyorails.orgFriday, April 27, 2012
  13. 13. RubyFriday, April 27, 2012
  14. 14. RailsFriday, April 27, 2012
  15. 15. RoombaFriday, April 27, 2012
  16. 16. Roomba on Ruby on Rails • SerialPort + Ruby controls Roomba • Rails site that routes remote requests • ??? • Profit!Friday, April 27, 2012
  17. 17. Resources • http://hackingroomba.com/ (Open source Java package) • http://www.dprg.org/projects/ 2009-07a/ • http://roombahacking.com/ roombahacks/roombacmd/ • http://www.arduino.cc/Friday, April 27, 2012
  18. 18. Getting StartedFriday, April 27, 2012
  19. 19. Getting SuppliesFriday, April 27, 2012
  20. 20. and then...Friday, April 27, 2012
  21. 21. my firstbornFriday, April 27, 2012
  22. 22. Back on TrackFriday, April 27, 2012
  23. 23. Arduino Layout RX = receive TX = transmitFriday, April 27, 2012
  24. 24. iRobot OI or SCI?Friday, April 27, 2012
  25. 25. ROI? API?Friday, April 27, 2012
  26. 26. Wired UpFriday, April 27, 2012
  27. 27. Roomba + Arduino What’s next?Friday, April 27, 2012
  28. 28. Arduino SandwichFriday, April 27, 2012
  29. 29. Arduino Sketches void setup(){} void loop(){}Friday, April 27, 2012
  30. 30. RAD?Friday, April 27, 2012
  31. 31. Example Roomba SketchFriday, April 27, 2012
  32. 32. Debugging ArduinoFriday, April 27, 2012
  33. 33. Debugging Pains [137] [255] [56] [1] [244] Disconnect, Connect, Disconnect Headless Documentation woesFriday, April 27, 2012
  34. 34. Past First BaseFriday, April 27, 2012
  35. 35. ArduinoFriday, April 27, 2012
  36. 36. Arduino Wireless XBEEFriday, April 27, 2012
  37. 37. BluetoothFriday, April 27, 2012
  38. 38. USB to SerialFriday, April 27, 2012
  39. 39. WifiFriday, April 27, 2012
  40. 40. Where to Start?Friday, April 27, 2012
  41. 41. Simple SerialFriday, April 27, 2012
  42. 42. Writing Code def initialize(port, baud=115200) @serial = SerialPort.new(port, baud, 8, 1, SerialPort::NONE) sleep 0.2 api_setup_start sleep 0.1 api_setup_control endFriday, April 27, 2012
  43. 43. Writing Opcodes # Must call this first to start the serial command interface def api_setup_start write(128) end # Enables user control of Roomba, puts SCI in safe mode def api_setup_control write(130) end # Starts a normal cleaning cycle. def api_clean write(135) endFriday, April 27, 2012
  44. 44. Modeling the ROI # api_drive(255, 0, 0, 0) //go backward # api_drive(0, 255, 0, 0) //go forward # api_drive(0, 0, 0, 0) // stop def api_drive(velocity_high, velocity_low, radius_high, radius_low) write(137, velocity_high, velocity_low, radius_high, radius_low) endFriday, April 27, 2012
  45. 45. Complex Write and Read def api_querylist(*bytes) write(149, bytes.length, *bytes) wait_for_rx read endFriday, April 27, 2012
  46. 46. The Bottom of the Barrel def write(*args) args.each do |a| @serial.write a.chr end endFriday, April 27, 2012
  47. 47. The Bottom of the Barrel def read(timeout=50) @serial.read_timeout= timeout bytes = [] until (x = @serial.getbyte).nil? bytes.push(x) end bytes endFriday, April 27, 2012
  48. 48. Pulling it Together ls /dev/tty.* find your serial device then jump into rails console roo = Roomba.new(“/dev/tty.usbserial-xxx”) => #<Roomba:0x00000103e5bec0 @serial=#<SerialPort:fd 9>>Friday, April 27, 2012
  49. 49. “Hello Roomba” Demo “Don’t Assume It--Prove It” - Tip, The Pragmatic ProgrammerFriday, April 27, 2012
  50. 50. Pitfall #1 Forgetting to say “when”Friday, April 27, 2012
  51. 51. Status ReportsFriday, April 27, 2012
  52. 52. down the rabbit hole Flash Your SignFriday, April 27, 2012
  53. 53. down the rabbit hole Binary and Signed IntegersFriday, April 27, 2012
  54. 54. down the rabbit hole Dealing With Binary def signed_integer(bytes) case bytes.size when 1 return (bytes[0] & ~(1 << 7)) - (bytes[0] & (1 << 7)) when 2 sixteenbit = bytes[0] << 8 | bytes[1] return (sixteenbit & ~(1 << 15)) - (sixteenbit & (1 << 15)) end end learn more: http://en.wikipedia.org/wiki/Two%27s_complement#Calculating_two.27s_complementFriday, April 27, 2012
  55. 55. down the rabbit hole A Hex DigressionFriday, April 27, 2012
  56. 56. Better AbstractionFriday, April 27, 2012
  57. 57. Distance & Time # distance is in mm # velocity is in mm/s (-500 to 500) def move(distance, degree=0, velocity=200) distance = distance.to_i.abs #distance can never be negative if distance == 0 #not moving, just spinning on axis # time = wheelbase * PI / 360degrees * degrees / velocity ABS time_in_seconds = calculate_spin_time(velocity, degree) else time_in_seconds = (distance.to_f / velocity.to_f).abs endFriday, April 27, 2012
  58. 58. High Byte, Low Byte # distance is in mm # velocity is in mm/s (-500 to 500) def move(distance, degree=0, velocity=200) distance = distance.to_i.abs #distance can never be negative if distance == 0 #not moving, just spinning on axis # time = wheelbase * PI / 360degrees * degrees / velocity ABS # wheelbase might be different for different roombas time_in_seconds = calculate_spin_time(velocity, degree) # now that we know how long to spin, set degree to 1 so it will spin roomba instead of put it on an arc degree = 1 else time_in_seconds = (distance.to_f / velocity.to_f).abs end set_velocity(velocity) set_degree(degree)Friday, April 27, 2012
  59. 59. Move! api_drive(@velocity_high, @velocity_low, @radius_high, @radius_low) start_moving = Time.now until (start_moving - Time.now).abs >= time_in_seconds sensors = get_readings(:bumps_and_drops, :wall) break if sensors[:bumps_and_drops][:formatted].to_i(2) > 0 end api_drive(0,0,0,0) sensorsFriday, April 27, 2012
  60. 60. ‘Move’ DemoFriday, April 27, 2012
  61. 61. Pitfall #2 L...a...te..n....c..y ... no! no! yes! ... no!Friday, April 27, 2012
  62. 62. Cut out the Middle Men *Arduino is still awesome, and I encourage you to try it.Friday, April 27, 2012
  63. 63. What Freedom Looks LikeFriday, April 27, 2012
  64. 64. Logic Level Converter http://www.sparkfun.com http://www.sparkfun.comFriday, April 27, 2012
  65. 65. Prototyping!Friday, April 27, 2012
  66. 66. SerialPort || TCPSocket All we need is an IP address and a Port!Friday, April 27, 2012
  67. 67. Connected and then... ............................never ending silence..........Friday, April 27, 2012
  68. 68. UART Universal Asynchronous Receiver (RX) Transmitter (TX)Friday, April 27, 2012
  69. 69. UART an AngelFriday, April 27, 2012
  70. 70. Pitfall #3 All you get is #$@#! .0....T. ./....Y. .:....T. .*....Y. ./....L. ......+. .*..... .4....U. .7....M. .`....N. .....T. ......V. .6....Q. .=...... ./....W. .-....L. .2....L. ........ .,....U. .7....T. .7....U. ......H. ......Q. ./....S. ......P. .B...... .2....L. .0....O. .3....O. ........ .7....T. .4....V. .4....W. ........ ./....[. .-....S. .,....L. ......e. .(....V. .0....Y. .7....U. .!...... .-....N. .*....V. ......V. ........ .5....Q. .-....U. .-....Z. .l....,. .2....U. ......R. .)....Q. .W....V. ......N. .1....W. .2....V. .-....R. .5....V. .,....R. .-....^. .1....M. .-....Q. .1....V. .%....Q. .6....B. .2....T. .-....S. .2....O. .A....V. ./....O. .0....N. .4....M. .-....V. .4....U. .5....[. .6....Q. .-....N. ......Q. .(....M. .2....T. .5....H. .2....O. .6....R. ./....M. .;....T. .4....W. .1....Q. .6....X. ./....L. .,....N. .2....V. .+....N. .7....M. .5....W. .-....P. .5....N. .6....H. .,....S. .3....Y. .5....U. .;....K. .0....X. .*....S. ......R. .8....S. .+....S. .0....U. .1....`. .0....U. .0....Q. ......L. .#....Q. ......O. .2....T. .7....T. .2....U. .4....U. ./....L. ./....R. ......R. ......Q. .7....T. .1...... .1....J. .2....P. ./....V. .9....P. .3....R. .-....N. .3....O. .1....W. .5....S. .4....[. .,....U. .0....O. .(....R. ......I. .4....N. .1....X. .5....N. .+....Y. .5....P. .*....S. .3....O.Friday, April 27, 2012
  71. 71. Pitfall #3 All you get is #$@#! Solution #1: RTFMFriday, April 27, 2012
  72. 72. Pitfall #3 All you get is #$@#! Solution #2: Factory DefaultsFriday, April 27, 2012
  73. 73. Pitfall #3 All you get is #$@#! Solution #3: RTFM, again...Friday, April 27, 2012
  74. 74. Pitfall #3 All you get is #$@#! Solution #3: RTFM, again...Friday, April 27, 2012
  75. 75. Wifly Configuration P195:~ charles$ telnet 169.254.1.1 2000 Trying 169.254.1.1... Connected to 169.254.1.1. Escape character is ^]. *HELLO* $$$ CMD set comm close 0 AOK <2.23>set comm open 0 <2.23>set sys printlvl 0 <2.23> save Storing in config <2.23> rebootFriday, April 27, 2012
  76. 76. Pretty Prototype...Friday, April 27, 2012
  77. 77. Roomba WifiFriday, April 27, 2012
  78. 78. Roomba WifiFriday, April 27, 2012
  79. 79. 3 Final Hurdles nope nope huh?Friday, April 27, 2012
  80. 80. Hurdle 1 Wifly Option (a)Friday, April 27, 2012
  81. 81. Hurdle 1 “Hold, hold,...Friday, April 27, 2012
  82. 82. Hurdle 1 Wifly Option (b)Friday, April 27, 2012
  83. 83. Hurdle 2 The Stateless Web Tax def initialize(port, baud=115200) sleep 0.2 api_setup_start sleep 0.1 api_setup_controlFriday, April 27, 2012
  84. 84. Hurdle 3 Device Busy CONCURRENT REQUESTS OK Errno::EBUSY: Resource busyFriday, April 27, 2012
  85. 85. Hurdle 2 & 3 Socket Server Pseudocode server = TCPServer.open(port) # Socket to listen on start Roomba Socket Server roomba = Roomba.new(location) Thread.abort_on_exception = true loop do puts "Roomba Socket Server Running! (15 second timeout)" Thread.start(server.accept) do |client| # => Read the incoming TCP Socket request # => Pass the command to the roomba client.close # Disconnect from the client end endFriday, April 27, 2012
  86. 86. Extended Demo “Coding Ain’t Done ‘Til All The Tests Run” - Tip 63, The Pragmatic ProgrammerFriday, April 27, 2012
  87. 87. Looking ForwardFriday, April 27, 2012
  88. 88. Testing Drones • How do you run software tests on something in the physical world?Friday, April 27, 2012
  89. 89. Roomba SimulatorFriday, April 27, 2012
  90. 90. Test the SimulationFriday, April 27, 2012
  91. 91. Compare with Live Test Bring it!Friday, April 27, 2012
  92. 92. Simulator ScenariosFriday, April 27, 2012
  93. 93. Challenges If i tape a marker on Roomba... Map out a room...Friday, April 27, 2012
  94. 94. Physical Computing? Why you should care. Jeremiah Palecek http://nerdkore.comFriday, April 27, 2012
  95. 95. By 2020 Ericsson White Paper 284 23-3149 Uen | February 2011Friday, April 27, 2012
  96. 96. Already “By 2016, there will be 1.4 mobile devices per capita. That year, there will be over 10 billion mobile- connected devices, including machine-to-machine (M2M) modules.” http://techcrunch.com/2012/02/14/the-number-of-mobile-devices-will-exceed-worlds- population-by-2012-other-shocking-figures/Friday, April 27, 2012
  97. 97. People then Things Ericsson White Paper 284 23-3149 Uen | February 2011Friday, April 27, 2012
  98. 98. People and Things https://trandi.wordpress.com/2011/09/26/vfd-clock-connects-to-the-internet/Friday, April 27, 2012
  99. 99. People and Things http://lifeboat.co.nz/the-finished-wireless-water-sensor/Friday, April 27, 2012
  100. 100. Just Getting StartedFriday, April 27, 2012
  101. 101. “A Pragmatic Philosophy” Invest Regularly in Your Knowledge Portfolio - Tip 8, The Pragmatic Programmer “Simon Stevin!”Friday, April 27, 2012
  102. 102. An EccentricFriday, April 27, 2012
  103. 103. Who is Simon Stevin? •waterway, spillways, sluices •navigation, steering •interest rate tables •The Art of Fortification •Copernican system •treatise on perspective •musical tuning •Trigonometry •civil unrest handbook •hydrostatic paradox •optics, geography, philosophy •and more...Friday, April 27, 2012
  104. 104. 1585, De Thiende “The Tenths” 35pgFriday, April 27, 2012
  105. 105. Changes the World “What seems a wonder, is not really a wonder.” - Simon StevinFriday, April 27, 2012
  106. 106. Fork it! github.com/tokyorails Charles Abbott www.forthecode.orgFriday, April 27, 2012
  107. 107. RoRoRoombaFriday, April 27, 2012
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×