While working on my Arduino based robot vehicle project the idea came to me that the Bluetooth module that I'm using as a remote control receiver for my robot would make a great addition to my Raspberry Pi.
In this article I describe how to enable the Raspberry Pi's serial port to talk to other devices over Bluetooth using this module.
The nice aspect of this project is that it requires very little hardware, most of the action happens in the software side. But of course we do need some hardware, which I list below:
A Raspberry Pi.
If you have been living under a rock or in another planet for the last year or two and never heard of the Raspberry Pi then you should know that this is a credit card sized Linux computer created in the UK that sells for just $35 USD. I've got mine through Element 14.
A Bluetooth slave module
This is a small and inexpensive Bluetooth to serial adapter that is mainly targeted to Arduino users. I've got mine from the Virtuabotix store at Amazon.com for $14.95. The Chinese electronics stores on Ebay sell it for less, but of course you have to wait longer to get it.
Four female-to-female breadboard wires
If you buy the Bluetooth module from the Virtuabotix store at Amazon (link above) then you get the wires included with it. If you are buying from another place you may want to ask if wires are included or sold separately.
A computer or device with a Bluetooth terminal software
To establish a communication with the Raspberry Pi over Bluetooth you need another device that can speak Bluetooth. If your computer has a Bluetooth adapter then you just need to find a terminal software that you can use to send and receive data, like HyperTerminal on Windows, or
screenon OS X and Linux. A computer is not the only choice, though. For example, I will use my Android cell phone with the free BlueTerm app installed.
The wiring is very simple and is better explained with a diagram:
If you prefer to see it in table format, here are the four connections that you need to make:
|RPi GPIO pin||BT module pin|
|5V (Pin #2)||VCC|
|GND (Pin #6)||GND|
|TXD (Pin #8)||RXD|
|RXD (Pin #10)||TXD|
Note that the
RXD connections between the RPi and the Bluetooth module are crossed, this is what makes one end receive what the other end sends.
Raspberry Pi configuration
I'm going to assume you are running a recent release of Raspbian on your Raspberry Pi. If you are running another OS then you will need to find out how the changes below are done in your system.
By default the Raspberry Pi is configured to write boot time messages to the serial port, and also to start a login console on it. Unfortunately, the default baud rate that the RPi uses for its serial port is 115200 bps, while the Bluetooth module comes preconfigured from factory to 9600 bps.
It is easier to configure the RPi to use 9600 bps so we will try that first. There are two config files that need to be updated.
/boot/cmdline.txt contains the kernel options that are used to boot the system. In my Raspbian based system this file contains the following options:
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
The interesting options are
kgdboc, because these configure the serial port device
/dev/ttyAMA0 to 115200 bps. You need to change these two configurations to 9600 bps. After you make these changes the file should read:
dwc_otg.lpm_enable=0 console=ttyAMA0,9600 kgdboc=ttyAMA0,9600 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
The second configuration file is
/etc/inittab. Inside this file you have to locate the following line:
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
This tells the system to start a terminal on the serial port, and again it uses 115200 bps to configure the port. You have to change this line to use 9600 bps:
T0:23:respawn:/sbin/getty -L ttyAMA0 9600 vt100
Remeber that these are configuration files so they are not writable to the default
pi user, to edit these files you have to use
sudo. As far as text editors, Raspbian provides two,
pico. If you don't know either then you will probably be more confortable using
pico. For example, to edit
pico you would run the following command:
$ sudo pico /boot/cmdline.txt
The system will ask for your password and after that you will be able to make changes to this file. I recommend that you save original copies of these config files in case you make a mistake.
With those changes made the RPi is configured to talk to the Bluetooth module. If you now power up your Raspberry Pi you will notice that the LED in the Bluetooth module blinks rapidly. This is the sign that the Bluetooth module is ready and waiting to be paired with another device.
Connecting from a Bluetooth terminal
Now leave the RPi running with the Bluetooth module in its blinking state and go to the Bluetooth enabled computer or smartphone that you will connect to it. Your device should now find the Bluetooth module with the name
linvor when you set it to discover devices.
If you are using an Android device with BlueTerm then start the app and from the app menu select "Connect device". Android does the baud selection automatically so you don't have to configure it. From a terminal software running in a computer it is likely that you will need to configure the speed, number of data bits per character, parity, and number of stop bits per character. The values you need to use are:
- Speed: 9600 bps
- Data bits: 8 bits
- Parity: None
- Stop bits: 1 bit
The Bluetooth module comes preconfigured with a PIN number. To complete the connection your computer or smartphone will ask you to enter this PIN. The factory default PIN is
The LED in the Bluetooth module will now stop blinking and remain lit, indicating that it has made a connection.
And here comes the fun part. You need to reboot the Raspberry Pi so that the new serial port settings take effect. To reboot the RPi run the following command in a local or network shell:
$ sudo reboot
Now watch the Bluetooth terminal on your PC or smartphone while the Pi reboots. Boot messages should be appearing on your terminal, and as soon as the RPi is up you should get a login prompt there as well.
You can now login from your Bluetooth terminal and use the command line prompt as you normally would over a local or network shell.
Below is a short video that shows my Raspberry Pi connected to my Android smartphone:
Direct serial port access
While you can't deny there is a coolness factor in being able to run a Raspberry Pi from a smartphone, let's be honest, that isn't extremely useful. But having a wireless serial connection into the RPi can be useful for regular applications, for example for debugging or for remote control.
To be able to use the serial port from a user application running in the Raspberry Pi we first need to tell the system to not use it as a console. To do this we need to go back to the two configuration files we touched before. I once again recommend that you back up your config files before changing them, in case things don't work out well and you need to revert the changes.
/boot/cmdline.txt we are going to remove the two serial references by taking away the first
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
And in file
/etc/inittab we will comment out the serial console task:
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
After making these changes reboot the system so that they take effect. With these changes the RPi will not use the serial port at all, so the port will be free to any application that wants to use it as
If you want to play with sending and receiving data through the serial port then you can install
minicom into your RPi using the following command:
$ sudo apt-get install minicom
And then you can open a terminal on the serial port with this command:
$ minicom -b 9600 -o -D /dev/ttyAMA0
Anything you type inside the
minicom terminal will be sent to the serial port, and anything the other side sends will be displayed.
Configuring the Bluetooth module
The Bluetooth module comes preconfigured from the factory with a set of defaults, which are:
- Baud rate: 9600
- Bluetooth ID: linvor
- PIN: 1234
But these values can be changed by sending special commands through the communication channel. Now that the Raspberry Pi is connected to the module we can try this.
These special commands that configure the Bluetooth module can be sent from a connected remote device, or they can be sent from the local system, in this case the Raspberry Pi. Since the Raspberry Pi is the star of the article I'm going to also use it to do the configuration.
Here is a quick summary of the most useful configuration commands:
|AT||Test the communication with the Bluetooth module.|
|AT+VERSION||Report the module's version number|
|AT+NAMEname||Change the Bluetooth ID to name (maximum 20 characters).|
|AT+PINnnnn||Change the PIN to nnnn, which must be a four digit number.|
|AT+BAUDn||Change the baud rate. Use one of the following values for n:
One tricky aspect of sending these commands is that the Bluetooth module has a very short timeout, so all the characters in a command must be entered really quickly. The safest way to get the entire command in time is to type it in a text editor window and then use copy/paste to send it really fast.
If your Raspberry Pi session is local, then there is no clipboard support unless you work inside the X environment, so you will need to run
startx and then open a Terminal window. If you are using a remote shell over the network then you can use the clipboard in your host operating system.
To send the commands we can use
minicom. So let's fire it up one more time:
$ minicom -b 9600 -o -D /dev/ttyAMA0
Note that it isn't necessary to have a connection to do this, so you can do this while the Bluetooth module is in its blinking state.
You now need to use any method to get the string
AT into the clipboard, and then hit paste inside the minicom window to send the command to the module.
When you send
AT the module should respond with this in the
If you get this response then you know that everything is all right. If you don't get a response then for some reason the Raspberry Pi is unable to communicate with the Bluetooth module.
When I send
AT+VERSION to the module I get the following response:
To change the baud rate to the fastest rate of 115200 we need to issue the command
AT+BAUD8, and the module will respond with:
Because the baud rate was changed now the communication will break, and we will need to exit and restart minicom with the updated speed:
$ minicom -b 115200 -o -D /dev/ttyAMA0
To change the name of the module to MyBT we must issue the command
AT+NAMEMyBT, and the module will respond with:
And to change the PIN to 4321 the command is
AT+PIN4321 and the response from the Bluetooth module will be:
Note that when the name and/or the PIN change the module requires a power cycle for the changes to take effect.
Also don't forget that if you change the baud rate and later want to reestablish the serial console you will need to change the two config files to reflect the new baud rate you have selected in the Bluetooth module.
I hope this article gives you some ideas to bring new life to the serial port in your Raspberry Pi. If you have any questions feel free to ask below in the comments!