Bluetooth code for Arduino USB Host

I am pleased to announce addition of Bluetooth dongles to the family of USB devices supported by USB Host Shield. Bluetooth dongles are affordable, interface is well documented, and USB transport layer is very simple. Even though full Bluetooth protocol is heavy and takes a lot of program space, it can be stripped down quite a bit for a particular application. One good example of such approach is Richard Ibbotson’s HID over Bluetooth implementation – see Wiimote Game Controller Interfacing article for details. I wanted to have simple communication transport over Bluetooth which would fit into Arduino and the code I’m presenting in this article is doing just that – it’s lightweight terminal program allowing two Arduinos talk to each other over Bluetooth. The code has been developed by George Lgotkin.

The source is hosted in GitHub repository. Standard Arduino library format of the code has not been tested yet, for now it’s easier to just copy all the files in a directory and open btclass_h.pde in Arduino IDE. To use the program, you need two Arduinos, two USB Host Shields, and two Bluetooth dongles. You need to compile and load the sketch into both Arduinos and then open two terminal windows, one to a serial port of each Arduino – this can be done from a single computer. Don’t use Arduino IDE built-in terminal. Also, SPI library shipped with recent versions of Arduino IDE is not compatible with USB Host library, if you have compiler errors related to SPI, replace your library with one from Arduino-0018 or the Playground. Serial port speed is set to 115200 in the sketch, it can be changed in setup(), if necessary.

Sketch starts by printing short help (see screenshot below) and then waits for the command. In order for two Bluetooth devices to talk to each other, one has to be the server and another one client. In one terminal, type ‘S’ and press Enter. This starts the server. If you are curious, type ‘M’, Enter – the address of the module will be printed. Note that if you send address request before starting the server, address containing all zeroes will be returned.

To establish connection, type ‘C’, Enter in other terminal. The sketch will print “Connecting…”. After some time ( 30 seconds or less ) both terminals will print “Connected”. Now type something in one terminal and press Enter – the string you just typed will appear in other terminal window. Easy.

This code is just a small example, error handling is minimal. It works better if no other Bluetooth radios are transmitting nearby. If client Arduino reports “Connected” but server doesn’t, it means that client has connected to some other server, most likely your laptop or phone. This can also be used to your advantage for testing – start Bluetooth on a PC and then see if both Arduinos are able to connect to it in client mode.

It is possible to instruct client Arduino to connect to a particular host. Look into Serial.cpp file. InbufAnalyse function contains addrA.bytes array initialization. You can initialize it with address of the Bluetooth dongle connected to other Arduino (note that address bytes are loaded backwards), recompile, load, and then use ‘A’ instead of ‘C’ for client connection.

Bluetooth sketch screenshot

The code has been tested with different Bluetooth dongles from different manufacturers and they all seem to work fine. Sometimes one dongle refuses to work as a client so alternating server and client roles on Arduino may help. If you see any other errors, leave a comment here and I’ll try to help.

In this sketch, communication occurs over plain HCI so it can’t be used to talk to a PC or a phone. On the other hand, the code takes less than 11K of program space and can be used on Atmega168-based Arduinos. The code which implements SDP, L2CAPS and RFCOMM is in the works and will be released soon along with the documentation. For the time being, play with this code and tell me what you think.

138 comments to Bluetooth code for Arduino USB Host

Hi, great job!!!
I need to connect 2 arduinos.
One with a usb bluetooth dongle (through a USB host shield).
The other has no usb host shiel but a bluetooth module connected to RX/TX (a JY-MCU)
Could I use that code to transmit data form one to the other????

This code is very old, it is unlikely to work with current rev. of the library. Current BT implementation only supports client side so you can’t make 2 Arduinos talk to each other with it. To make it work you either need to make this code work with current library or add server support to current BT code. Pick your poison.

Would it at least be possible to send commands to a slave bluetooth dongle running SPP to turn on pins and such? Since I cannot use two arduinos, would it be possible to run a script on my computer that pairs with one arduino over bluetooth and checks the state of pins on the Arduino? I’ve downloaded Putty. Could I run a script on that? Would I need a bluetooth transmitter like the BlueSmirf to do these functions?

I am trying to interface a ps3 controller via bluetooth to arduino mega 2560 adk.BUt didn’t change the data coming from the ps3 controller.
after uploading the code i get result on serial monitor as given below.

I did all the connection and tried uploading code into arduino UNO r3
But I found on serial monitor that “PS3 Bluetooth Library Started”.
It dose not show me any further change even I reset USB Host shield