RoRoRoomba - Ruby on Rails on Roomba Railsconf 2012
Upcoming SlideShare
Loading in...5
×
 

RoRoRoomba - Ruby on Rails on Roomba Railsconf 2012

on

  • 1,015 views

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, ...

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.

Statistics

Views

Total Views
1,015
Views on SlideShare
1,015
Embed Views
0

Actions

Likes
0
Downloads
7
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    RoRoRoomba - Ruby on Rails on Roomba Railsconf 2012 RoRoRoomba - Ruby on Rails on Roomba Railsconf 2012 Presentation Transcript

    • RoRoRoomba Roomba on Ruby on RailsFriday, April 27, 2012
    • Thanks! • Nancy Dussault-Smith • Joshua Lifton • and iRobot for the Roombas!Friday, April 27, 2012
    • Thanks!Friday, April 27, 2012
    • IntroductionsFriday, April 27, 2012
    • My RoombaFriday, April 27, 2012
    • konnichiwa • Charles Abbott • • Life in Japan www.forthecode.org • “The greatest obstacle...Friday, April 27, 2012
    • “Greatest obstacle... “The greatest obstacle to discoveryFriday, April 27, 2012
    • “Greatest obstacle... “The greatest obstacle to discovery is not ignoranceFriday, April 27, 2012
    • “Greatest obstacle... “The greatest obstacle to discovery is not ignorance, butFriday, April 27, 2012
    • “Greatest obstacle... “The greatest obstacle to discovery is not ignorance, but the illusion of knowledge” - Daniel J. BoorstinFriday, April 27, 2012
    • “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 that routes remote requests • ??? • Profit!Friday, April 27, 2012
    • 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
    • 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 = transmitFriday, April 27, 2012
    • 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, Disconnect Headless Documentation woesFriday, April 27, 2012
    • 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::NONE) sleep 0.2 api_setup_start sleep 0.1 api_setup_control endFriday, April 27, 2012
    • 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
    • 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
    • Complex Write and Read def api_querylist(*bytes) write(149, bytes.length, *bytes) wait_for_rx read endFriday, April 27, 2012
    • The Bottom of the Barrel def write(*args) args.each do |a| @serial.write a.chr end endFriday, April 27, 2012
    • 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
    • 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
    • “Hello Roomba” Demo “Don’t Assume It--Prove It” - Tip, The Pragmatic ProgrammerFriday, April 27, 2012
    • 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 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
    • 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, 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
    • 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
    • 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
    • ‘Move’ DemoFriday, April 27, 2012
    • Pitfall #2 L...a...te..n....c..y ... no! no! yes! ... no!Friday, April 27, 2012
    • Cut out the Middle Men *Arduino is still awesome, and I encourage you to try it.Friday, April 27, 2012
    • What Freedom Looks LikeFriday, April 27, 2012
    • Logic Level Converter http://www.sparkfun.com http://www.sparkfun.comFriday, April 27, 2012
    • 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)Friday, April 27, 2012
    • UART an AngelFriday, April 27, 2012
    • 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
    • Pitfall #3 All you get is #$@#! Solution #1: RTFMFriday, April 27, 2012
    • Pitfall #3 All you get is #$@#! Solution #2: Factory DefaultsFriday, April 27, 2012
    • Pitfall #3 All you get is #$@#! Solution #3: RTFM, again...Friday, April 27, 2012
    • Pitfall #3 All you get is #$@#! Solution #3: RTFM, again...Friday, April 27, 2012
    • 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
    • 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) sleep 0.2 api_setup_start sleep 0.1 api_setup_controlFriday, April 27, 2012
    • Hurdle 3 Device Busy CONCURRENT REQUESTS OK Errno::EBUSY: Resource busyFriday, April 27, 2012
    • 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
    • Extended Demo “Coding Ain’t Done ‘Til All The Tests Run” - Tip 63, The Pragmatic ProgrammerFriday, April 27, 2012
    • Looking ForwardFriday, April 27, 2012
    • Testing Drones • How do you run software tests on something in the physical world?Friday, April 27, 2012
    • 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, April 27, 2012
    • Physical Computing? Why you should care. Jeremiah Palecek http://nerdkore.comFriday, April 27, 2012
    • By 2020 Ericsson White Paper 284 23-3149 Uen | February 2011Friday, April 27, 2012
    • 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
    • People then Things Ericsson White Paper 284 23-3149 Uen | February 2011Friday, April 27, 2012
    • People and Things https://trandi.wordpress.com/2011/09/26/vfd-clock-connects-to-the-internet/Friday, April 27, 2012
    • 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 - Tip 8, The Pragmatic Programmer “Simon Stevin!”Friday, April 27, 2012
    • An EccentricFriday, April 27, 2012
    • 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
    • 1585, De Thiende “The Tenths” 35pgFriday, April 27, 2012
    • Changes the World “What seems a wonder, is not really a wonder.” - Simon StevinFriday, April 27, 2012
    • Fork it! github.com/tokyorails Charles Abbott www.forthecode.orgFriday, April 27, 2012
    • RoRoRoombaFriday, April 27, 2012