Follow @TheRoomba on Twitter to see what mine is doing!
Step 1: Needed Parts and Tools
- 1x - Small signal, low power PNP transistor (I used a 2N2907A (may also be known as NTE159))
- 1x - 8-Pin mini DIN male connector
- 1x - 7805 5V voltage regulator
- 1x - Solderless breadboard
- 1x - Arduino board
- 1x - Sparkfun WiFly Arduino shield
- Row of five or more male pin headers
- A short piece of Cat5 cable or similar wire (Cat5 is 24 AWG)
- And last but certainly not least, a Roomba*
- Soldering iron
- Small scissors
- Third hand
- Hot glue gun
- For the purpose of this Instructable, I am going to be assuming that you have a basic knowledge of basic electronics, the Arduino and the Arduino's programming language.
*I have only tested this with the 500 Series. However, it should work with newer models, but I am not sure about older models.
Step 2: Roomba's Serial Connector
To access the serial connector: remove the bin, gently pull up on the back edge of the top plate until the two clips in the back release. Now, use a flat blade screwdriver to gently pry up the rest of the plate. The connector is to the right of the control buttons.
You may wish to drill a hole in the plate to access the port without the plate removed.
Step 3: Creating a Connection Cable
It may be tricky to solder the wires into the small cups of the mini DIN connector. Use your Third Hand to hold the wire and mini DIN connector. You may wish to place the wire between a small piece of folded paper to prevent teeth marks from the Third Hand. Work form the inside out. If the wire is soldered in the cup properly, you can use a solder vacuum to clean up an excess solder on the exterior of the cup. Make a chart of what cup you attached each wire to.
Use a multimeter to check for shorts between pins.
The pins may be bent slightly out of place. Insert the pins into the Roomba's connector to realign them.
Use some hot melt glue between each wire so the do not bend and short against each other. Wrap some tape around all the wires to prevent shorts against the case. Reassemble the mini DIN connector, but do NOT slide the outer case of the mini Din over the pins until functionality has been verified. This will make it easier to modify if necessary. Strip the other end of the wire. Pins 6 and 7 (see image below) are both ground; attach them to the same pin header. Pins 1 and 2 are both positive. The voltage on these pins varies. When docked, it is about 20V, otherwise it is the voltage of the battery (about 14V). Attach them both to the same header. Attach the rest of the wires to their own headers.
Step 4: Connecting the Arduino
Attach the cable by connecting the mini DIN connector to the Roomba and the pin headers to the breadboard.
Use the wiring diagram that you created in step 3 to help you connect the wires properly for the instructions below.
In his write up of the Roomba library for the Arduino, Mike McCauley tips us that we must use a PNP transistor in order to trigger the Arduino's RX pin from the Roomba. Use a jumper to connect the Roomba's TX pin of the cable to the Base pin of the transistor. Connect the Collector pin of the transistor to ground and the Emitter pin to the Arduino RX.
Attach the Arduino's TX pin to Roomba's RX pin on the cable. Attach the ground pin from the cable to the Arduino's ground.
Next we have a slight problem. The Roomba's power output can be up to 20V when it is being charged. While the Arduino's voltage regulator can handle this, the WiFly 3.3V voltage regulator cannot. We will need to add our own voltage regulation circuit to the breadboard. To do this we use a 7805 voltage regulator to bring the voltage down to 5V. Connect the Ground of the 7805 to ground, the Vin pin to the Roomba's power, and the Vout to the 5V pin on the Arduino.
When you attach the connector to the Roomba, the Arduino's power LED should light up.
Click here for a larger version of the Breadboard diagram.
Remember to disconnect the cable from the Roomba before reprogramming the Arduino!
Step 5: Complete Code
In order for it to work, you will need to replace "TWITTER oAUTH KEY" with the oAuth key created in Step 8 "Programming 3: Twittering". Then we just need to set the router passphrase and SSID. All of these options may be found in the "Credentials.h" file. The Arduino should now be able to access your network and your Twitter account. The code is also well commented so you should be able to modify several of the values easily, including what the Roomba says for certain events.
If you have any difficulties, scroll down to Step 9: Troubleshooting for help or feel free to contact me.
Make sure you have the Roomba Library(Step 6), the Twitter Library (Step 8), and the WiFly Library available from SparkFun.
Step 6: Programming 1: Communication
Instead of writing Arduino code to interface with the OI ourselves, we will use the fabulous library by Mike McCauley for interfacing with the OI. (Thanks Mike!) Mike's library features every basic OI command for the Roomba.
Full details of iRobot's OI can be found here.
Step 7: Programming 2: Web Control
The hard part of this is configuring the router correctly. Firstly, we need to tell the router to give the WiFly Shield a static IP address. Unfortunately, since all routers are different, I cannot tell you how to do this. You will need to look in your router's manual for instructions on how to assign a manual IP address.
Unless you don't mind other people potentially controlling your Roomba, this is mostly for control over the network and not the internet. However, if you understand the security risks (or know how to set up an authentication system), it is possible to configure most routers to forward to the Arduino web server. Again, you will need to look in your router's manual on how to do this. You may also be able to find instructions using Google.
To control the Roomba over the network, simply enter the IP address you assigned to the WiFly into you browser's address bar and voila! If you did connect it to the internet, you can access it anywhere by entering the IPv4 address of your router, which can be found here.
Step 8: Programming 3: Twittering
We now have a Twitter library that is fully compatible with the WiFly shield. In order to start using the library we will need to allow it access to our Twitter account by clicking Here and then clicking "Get a token to post a message using OAuth". Once we have granted it access, we will see a webpage with what is called an oAuth key. All we need to do now is place this in "Credentials.h" file where noted. We can now start Tweeting with the Arduino!
However, here we hit another snag: we cannot tweet something that we have already tweeted in the past. So, the Roomba will only be able to tell you that it has finished once. There are few ways to get around this:
Add a Real Time Clock (RTC) to our hardware and add the time to the beginning of each Twitter post. This method is more expensive, but will look prettier on the tweets.
Read a couple of sensor values from the Roomba to generate a random number. This method is less expensive, but it does not look quite as nice as using an RTC to time-stamp the tweets.
We could also use the Arduino's millis() function to tag on to the tweet. This is the most reliable and the easiest. However, it will also look ugly compared to the RTC time-stamp.
For this Instructable, we will be using the latter as it is the least difficult and least expensive. The millis() function returns the number of milliseconds since the program was started. We do not need to worry about the number getting too long as it resets to zero after fifty days. The highest the number may be is about 4.32x10^9, which is ten digits. As for it resetting, we do not need to worry about duplicate tweets as the likelihood of an exact match is near impossible.
Step 9: Troubleshooting
Issue - Possible Solutions
WiFly does not connect - Confirm your SSID and router passphrase in the Credentials.h file
If you are using WEP, try changing to WPA/PSK+WPA2/PSK
Twitter does not update - Confirm that your oAuth key is correct (see Step 8)
Check your solder joints
Web control page does not show correct information - Check your solder joints
Cannot access web control page - Ensure that you are using the right IP address (see Step 7)
If none of these solutions helped you, please feel free to contact me.
Step 10: Conclusion
There are many ways that I considered furthering the code. Including:
* Driving it around manually.
* Adding Cosm support to log cleaning times, battery-life, etc.
* Moving the components onto a PCB instead of using a the breadboard.
Please comment any questions or suggestions. I welcome your feedback.