Friday, 25 January 2013

RUDEBOT: Rolling Ubiquitous Display Engine for Binary-Organic Transliteration

About a year ago the humble folks at nibbler.io and vmfarms.com introduced Rudy to the internet community through a quick and fun project that allowed a remote employee to video chat in and control the motion of a laptop on a rotating platform over TCP/IP. At the time we were looking for a way to bridge a 4,400km gap between one of our employees and the rest of our crew. Unfortunately, he couldn't follow us to the meeting room or stroll up to someone he wanted to chat with. We needed to fix this. A few beers, some scope creep, and the usual sacrifice of a sleep was all that was needed to give Rudy some wireless physical mobility; All controlled on the other side of a continent with a PS3 gamepad, sweet!



Features

  • Fully mobile wifi robot/cyborg.
  • Roughly 15 hours of mobility per charge.
  • 5-speed available through keyboard control (0 to instability - click here to see a video).
  • Tablet-brand-agnostic mounting system.
  • Two independent 3A motors for navigating even the toughest of office terrain.
  • Optional wireless PS3 remote integration for fine-grained control (check source code repo below).
  • Optional speakers for increased volume.

This type of telepresence technology has been explored quite a bit recently by hobbyists and commercial players. You can purchase something like this for anywhere between $2,000-$15,000 depending on the model you're looking for. Being active participants in the open source community we figure it's our duty to give back ideas and methods as often as possible, for as free as possible, so you can get the same results for a lot less. You can get something like this built for under $400 (which is what we spent), but with some creative scavenging and even substitution of certain components, you can knock it down even further. Tablet not included.


This project was fun, but the usual disclaimers apply if you want to go ahead and replicate. If you're not comfortable brandishing a soldering iron, reading documentation, or understanding what's happening when you look at a schematic, this project is not for you. However, if you're yearning to ultimately become a cyborg, read on!

A lot of these components can be substituted for others. For example, the cheaper Arduino Ethernet shield and a wifi router with a 12v input vs. the expensive Official Arduino Wifi shield, if you have those parts kicking around. You can also build your own motor driver circuit instead of purchasing one. The possibilities and cost savings are endless. The choices we made balanced expediency and cost. The project took about 96 man hours in total, working in the middle of the night, when we should've been sleeping. This includes code, debugging and everything else.

Warning: There are many issues to deal with along the way. Most notably the Official Arduino Wifi Shield is brand new and the wifi library is full of bugs and a lack of UDP client/server support, which would have been perfect for this application. We've been in contact with the community and some of these issues are being worked on slowly. I'm confident eventually it'll be stable, but in the meantime, be prepared and competent with C++ and Arduino programming if you chose to venture down this path. There are other wifi shields out there that may make your life easier.



Warning! At the time of this blog post release we had to completely replace the Arduino Wifi-Shield with an Arduino Ethernet Shield + in-house Hacked TP-Link Wifi Router. The Arduino Wifi Shield is a very young product and the firmware integration for it is still extremely unstable for this application. We suffered from frequent crashes when data was streaming in. Stay tuned for the next blog post that details the changes and hacks to get RUDEBOT 100% stable...
Have any suggestions? Give us a shout by navigating to nibbler.io and click on About! We'd like to hear your feedback.

Tools List

  • Drill
  • Various Drill and Screwdriver Bits
  • Scroll/Jig/Hand/Table Saw
  • Screwdriver
  • Hammer
  • Square
  • Pencil
  • Vernier Caliper
  • Wire Strippers
  • Soldering Iron

Materials List


Method


  1. Cut out the base of the rover - 12"x14" and optionally round out the corners with a jigsaw.
  1. Align the universal wheel mounts on the wheels to make sure they're centred. Hammer in the finishing nails *half-way* while maintaing alignment. Apply a good helping of superglue in the gap between the mount and the wheel (and wear gloves as it bonds skin instantly). We're going for a mechanical and chemical fastening.
  1. Intentionally bend the nails by hammering them on an angle to wrap down around the mount. Make sure the mounts remain aligned and are compressed to the wheel. Allow the glue to set.
  1. Attach the caster wheels to the underside of the platform.
  1. Mount the motor mounting brackets. Mount the motors to the mounting bracket.
  1. Mount the battery on the opposite side of the motors using copper strapping to provide a counterweight to the chassis.
  1. Place the Arduino between the motors so the USB connector is easily accessible. Mark the mounting holes with a pencil so you can install the standoffs. Drill holes slightly smaller than the standoffs you have. Screw the standoffs in and mount the Arduino.
  1. Carefully align the header pins and plug the Arduino Wifi Shield in to the Arduino.
  1. Now we must put together and modify the Pololu Motor Shield so we can remap some of the pins it uses. The default pin mapping conflicts with the pins that the Wifi Shield uses. You *MUST* read the documentation for the motor to do this for the next few steps as well as being reasonably competent with electronics. You will need to sever pins 4,7,10,12 on the bottom of the motor PCB. You must be exact and delicate so as to not sever any other connections. You will need to channel the skills of a soldering ninja for this.
  1. Bridge pins 4,7,10,12 to 5,6,3,2 respectively with the additional headers you've installed. If you're using an Arduino UNO before rev. 3 you must connect the 3.3Vref pin to the pin detailed here: http://arduino.cc/en/Guide/ArduinoWiFiShield
  1. Align the motor shield with the Wifi Shield header pins and plug it in. Put a jumper in the jumper block that will provide power from the motor shield to the Arduino.
  1. Wire the motors to the Motor Shield terminal blocks. Twist the connecting wires around each other to help reduce the motor induced back-EMF.
  1. Wire the battery to the switch. Wire the switch to the terminal blocks on the motor shield. Fire it up.
  1. Mount the 1/2" flange in the middle of the platform, preferably closest to the battery for proper balance.
  1. Screw in your 1/2" steel pipe in to the flange. Securely attach a tablet mount of your devising to the steel pipe.
16. Grab the server and client code from http://github.com/KOSTECKY/RUDEBOT. Create a keys.h file in the RUDEBOT project and put in the SSID and password of your wireless network, like so:
char ssid[] = "YOUR_WIFI_SSID";
char pass[] = "SSID_PASSWORD";

17. Compile the code and upload it to your Arduino. Connect via the serial monitor or terminal program to grab the IP that it acquired via DHCP. We recommend uncommenting the code that displays the MAC address, and using it to assign a static IP to your wifi shield via your DHCP server.

18. If you don't have a PS3 controller to utilize the client code, you can send commands to the rover by initiating a connection to the server via socat: 'socat -,raw,echo=0,escape=0x03 TCP:XXX.XXX.XXX.XXX:8888,keepalive,nodelay'. Refer to the README for the key bindings.