[EDIT]The standard RFCOMM/SPP implementation is available in rev.2.0 of the library.[/EDIT]
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
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.
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.