How to connect raspberry pi with HC-05 bluetooth module + arduino programm

In this tutorial we will configure a raspberry pi to connect with hc-05 bluetooth module and arduino using a python script.

The hardware

  • Arduino micro
  • HC-05 Bluetooth module

System requirements

  • picocom
  • python 3

Configurations for Bluetooth module HC-05

  • Set PIN

Configurations for Raspberry Pi

Configurations for arduino

  • Make physical connections
  • Copy arduino code and upload to arduino board

HC-05 Setup

Test AT commands in serial port from USB to serial converter. The default baud rate for AT commands is 38400

$ echo -e "AT\r" | picocom -b 38400 -qrx 1000 /dev/ttyUSB0
OK

Set with AT commands

$ echo -e "AT+NAME=ARDUINOBT\r" | picocom -b 38400 -qrx 1000 /dev/ttyUSB0
OK

Set password

$ echo -e "AT+PSWD=1379\r" | picocom -b 38400 -qrx 1000 /dev/ttyUSB0
OK

Set default baud rate

$ echo -e "AT+UART=115200,1,0\r" | picocom -b 38400 -qrx 1000 /dev/ttyUSB0
OK

Disconnect and test settings

Raspberry Pi Setup

$ sudo apt install -y pi-bluetooth bluetooth bluez picocom blueman python3-pip

First edit Bluetooth service in /etc/systemd/system/dbus-org.bluez.service
Add the following lines

ExecStart=/usr/lib/bluetooth/bluetoothd -C
ExecStartPost=/usr/bin/sdptool add SP

Reload systemd units

$ sudo systemctl daemon-reload

Enable Bluetooth service

$ sudo systemctl enable --now bluetooth

Add rfcomm module in /etc/modules-load.d/modules.conf to load automatically

echo "rfcomm" | sudo tee -a /etc/modules-load.d/modules.conf

Reboot the system

Pair with HC-05 module

$ sudo bluetoothctl

Pair with Bluetooth module

[bluetooth]# agent on
[bluetooth]# scan on
Discovery started
[NEW] Device 98:D3:31:50:4A:C1 98-D3-31-50-4A-C1
[CHG] Device 98:D3:31:50:4A:C1 LegacyPairing: no
[CHG] Device 98:D3:31:50:4A:C1 Name: ARDUINOBT
[CHG] Device 98:D3:31:50:4A:C1 Alias: ARDUINOBT
[bluetooth]# scan off
[CHG] Controller B8:27:EB:80:2D:06 Discovering: no
Discovery stopped
[bluetooth]# pair 98:D3:31:50:4A:C1
Attempting to pair with 98:D3:31:50:4A:C1
[CHG] Device 98:D3:31:50:4A:C1 Connected: yes
Request PIN code
[agent] Enter PIN code: 1379
[CHG] Device 98:D3:31:50:4A:C1 UUIDs: 00001101-0000-1000-8000-00805f9b34fb
[CHG] Device 98:D3:31:50:4A:C1 ServicesResolved: yes
[CHG] Device 98:D3:31:50:4A:C1 Paired: yes
Pairing successful
[CHG] Device 98:D3:31:50:4A:C1 ServicesResolved: no
[CHG] Device 98:D3:31:50:4A:C1 Connected: no
[bluetooth]# trust 98:D3:31:50:4A:C1
[CHG] Device 98:D3:31:50:4A:C1 Trusted: yes
Changing 98:D3:31:50:4A:C1 trust succeeded
[bluetooth]# exit

Create a serial device

$ sudo rfcomm bind rfcomm0 <device's MAC>

If everything works, connect with picocom and test communication in both sides

Install pyserial library for python3

$ sudo pip3 install pyserial

Copy pythonClient directory to raspberry pi and execute client.py script

$ python pythonClient/client.py

Arduino Setup

Physical connections

  • GND -> GND Arduino
  • VCC -> VCC Arduino
  • RX -> D14 Arduino
  • TX -> D15 Arduino
  • EN -> N/C

Compile and upload the sketch

$ arduino-cli compile -b arduino:avr:micro -u -p /dev/ttyACM0 arduinoBT-HC05/

Test Communications

Raspberry pi output example

developer@raspberrypi:~ $ python pythonClient/client.py
Enter your message below.
Insert "exit" to leave the application.
You message >> hi from raspberry pi
Server Response >> hi
You message >> test connection
Server Response >> test connection from arduino
You message >> exit

Arduino Output example

$ picocom -b 115200 /dev/ttyACM0
Terminal ready
Server response: hi from raspberry pi
You response -> hi
Server response: test connection
You response -> test connection from arduino
Terminating...
Skipping tty reset...
Thanks for using picocom

Source code

Engineer || MSc student || DevOps in progress