Monday, December 08, 2014
Talking to an Arduino on Android with USB OTG
As part of the Thinkery robot project, we planned on creating an interface for the robots via a 7 inch Android tablet. The tablet was supposed to display things like sensor readings and play videos and music when the robots went into dance mode. In the end we didn't have time to finish this Android app, but I did some work in figuring out how the Android tablet and Arduino would communicate with each other.
Interfacing between an Arduino and Android devices is nothing new, the Amarino framework does it, and the MIT app inventor makes it really easy. The downside of this and many of the existing examples is that they require the Arduino to have a bluetooth interface. Using bluetooth for the interface is great if you need the connection between the Arduino and Android device to be wireless, but there are downsides to this approach. First, the cost increases on the Arduino side; a bluetooth interface can cost as much as the Arduino itself. Second, the Arduino must have its own power source, since there is no easy way for it to leech off the Android device's power supply if there is no wired connection to it.
I should mention here, for the sake of completeness, that there is another alternative besides using bluetooth: various IOIO boards. These board connect through USB to an Android device and provide IO capabilities similar to an Arduino. IMHO, these board still have some downsides: 1) they are still more costly than a standard Arduino board, and 2) they still require an external power source (they can't get their power from the Android device's USB port).
Since the robots were going to contain both a an on-board Arduino and Android tablet it made more sense to have a direct (wired) connection between the two. I knew from my experiences with Linux (Android runs on top of Linux), that it is certainly possible for a portable device to act as a USB host using USB OTG. So after a bit of searching I figured out that most recent Android devices do support USB OTG and have the correct drivers included to interface to USB serial devices (the Arduino enumerates as a USB serial device).
The next problem was how to physically connect the Arduino to the Android device. Most Android devices have a female microUSB connector and the Arduino has a female USB-B connector. To connect between them I got a USB OTG adapter from Monoprice. An interesting side note is that the USB OTG adapter works equally well to connect a keyboard or flash drive to an Android device.
After even more searching, I found a very useful Android library that makes it easy to interface to USB serial devices. While trying to build the example app I found that it was actually a little easier to use this fork of the original library project.
To test with my Android tablet (a Nexus 7), I programmed my Arduino with a simple sketch that sets the baud rate to 115200 and prints an integer string to the serial port every second, then I compiled and installed the example app from the USB serial library project and connected the Arduino to the Nexus. It detected the new USB connection immediately and launched the Android app, and I could see my integers happily printing!
I then modified the example app to include a button which, when pressed, sends data to the Arduino. On the Arduino side, the received data turns an LED on and off. I uploaded my final code to this github repo.
In the end, we didn't have time to flesh out the Android interface for the Thinkery Robot Army, but it is certainly a useful tool for a future project.