Raspberry Pi mit Arduino per Bluetooth verbinden

Bluetooth-Module, die eine serielle Schnittstelle zur Verfügung stellen, lassen sich leicht in ein Mikrocontroller-Projekt integrieren und sind bei Bastlern beliebt. In diesem Beitrag wird gezeigt wie die Verbindung zwischen Raspberry Pi und einem Arduino per Bluetooth realisiert wird.

Die Bluetooth Module HC-05 und HC-06 sind bei Bastlern sehr beliebt, da sie für einen relativ niedrigen Preis zu haben sind. Beide Module sind für einen TTL Pegel von 3.3V ausgelegt. Um sie auch in einer 5V Schaltung betreiben zu können, werden sie oft auch mit Trägerboard angeboten.

Folgende Dinge wurden im Beitrag verwendet:

  • Computer mit Linux und Arduino IDE
  • Arduino per USB mit Computer verbunden(alternativ auch Anschluss an Raspberry Pi möglich)
  • HC-05/HC-06 auf Trägerboard BT_Board
  • Raspberry Pi mit Raspbian 2014-01-07
  • USB Bluetooth Dongle am Raspberry Pi

Arduino

Zunächst wird das BT_Board an den Arduino angeschlossen. In diesem Beispiel wird der serielle Anschluss des Arduino zur Kommunikation mit dem Computer und ein zusätzlicher Serieller Anschluss in Software(SoftwareSerial) für die Kommunikation über das Bluetooth-Modul verwendet. Die müssen müssen wie folgt verbunden werden.

BT_Board Arduino
VCC 5V
GND GND
TX Pin 3
RX Pin 2

Das Beispiel ist vom SoftwareSerial-Beispiel der Arduino IDE abgeleitet. Es stellt eine Brücke zwischen den seriellen Anschlüssen über Bluetooth und USB dar.

#include <SoftwareSerial.h>

SoftwareSerial btSerial(3, 2); // RX, TX

void setup()
{
  Serial.begin(57600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  btSerial.begin(9600);
}

void loop() // run over and over
{
  if (btSerial.available())
    Serial.write(btSerial.read());
  if (Serial.available())
    btSerial.write(Serial.read());
}

Raspberry Pi

Für die Installation und Konfiguration des Bluetooth auf dem Raspberry Pi wird ein frisch installiertes Raspbian 2014-01-07 als Ausgangspunkt genommen.

Zunächst müssen die Pakete installiert werden.

$ sudo apt-get update
$ sudo apt-get install bluetooth bluez-utils
...
[ ok ] Starting bluetooth: bluetoothd rfcomm.
...
Hinweis
Auf Grund von Abhängigkeiten werden relativ vielen Pakete wie zum Beispiel cups und verschiedene Drucker-Treiber installiert. Leider umfasst die Installation im Moment 80 Pakete, von denen ca. 90% für die spätere Kommunikation nicht benötigt werden.

Anschließend wird der Bluetooth Dongle angesteckt. Ob der Dongle richtig erkannt wurde kann wie folgt geprüft werden. Dabei sollte die Ausgabe ähnlich der hier gezeigten sein.

$ dmesg | tail
[ 1747.563688] usb 1-1.3: New USB device found, idVendor=1131, idProduct=1001
[ 1747.563731] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 1747.563776] usb 1-1.3: Product: ISSCBTA
[ 1747.808059] Bluetooth: Core ver 2.16
[ 1747.809892] NET: Registered protocol family 31
[ 1747.809921] Bluetooth: HCI device and connection manager initialized
[ 1747.809972] Bluetooth: HCI socket layer initialized
[ 1747.810002] Bluetooth: L2CAP socket layer initialized
[ 1747.810066] Bluetooth: SCO socket layer initialized
[ 1747.839132] usbcore: registered new interface driver btusb

In der Liste aller USB Geräte sollte auch der Bluetooth Dongle auftauchen. Hier auf der letzten Zeile zu sehen.

$ lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 1131:1001 Integrated System Solution Corp. KY-BT100 Bluetooth Adapter

Wurde die Hardware richtig erkannt, können bei Bedarf noch weitere Informationen zum Bluetooth Dongle abgefragt werden.

$ hciconfig
hci0:       Type: BR/EDR  Bus: USB
        BD Address: 66:55:44:33:22:11  ACL MTU: 678:8  SCO MTU: 48:10
        UP RUNNING PSCAN
        RX bytes:1223 acl:0 sco:0 events:44 errors:0
        TX bytes:446 acl:0 sco:0 commands:44 errors:0

Sieht soweit alles funktionstüchtig aus, kann nach neuen Bluetooth-Geräten in der Umgebung gesucht werden. Das Bluetooth-Modul meldet sich mit der MAC 11:22:33:44:55:66 und dem Namen HC-06.

$ hcitool scan
Scanning ...
        11:22:33:44:55:66   HC-06

Bei den ersten Versuchen bietet es sich an eine Sicherheitskopie der Konfiguration anzulegen.

$ cp /etc/bluetooth/rfcomm.conf rfcomm.conf.orig

Ist das geschafft, sollte der Konfiguration nichts mehr im Weg stehen. Hierfür wird die Konfigurationsdatei wie folgt angepasst. Wichtig ist, dass die Adresse von dem Gerät angegeben wird, welches beim Scannvorgang erkannt wurde.

#
# RFCOMM configuration file.
#

rfcomm0 {
        # Automatically bind the device at startup
        bind yes;

        # Bluetooth address of the device
        device 11:22:33:44:55:66;

        # RFCOMM channel for the connection
        channel     1;

        # Description of the connection
        comment "Arduino";
}

Da für die Kommunikation mit dem Modul eine Pin erforderlich ist, muss diese angegeben werden. In diesem Fall handelt es sich um die Pin 1234.

$ echo "11:22:33:44:55:66 1234" | sudo tee /var/lib/bluetooth/66\:55\:44\:33\:22\:11/pincodes
11:22:33:44:55:66 1234

Anschließend ist ein Neustart des Bluetooth-Dienstes notwendig, damit die Konfiguration übernommen wird.

$ sudo service bluetooth restart
[ ok ] Stopping bluetooth: rfcomm /usr/sbin/bluetoothd.
[ ok ] Starting bluetooth: bluetoothd rfcomm.

Ist dies geschafft sollte ein neuer serieller Port /dev/rfcomm0 verfügbar sein.

Hinweis
Zunächst sind Bluetooth Donge und Modul noch nicht miteinander verbunden. Die Verbindung wird erst aufgebaut, wenn der serielle Port /dev/rfcomm0 geöffnet wird. Die Verbindung bleibt so lange bestehen, bis der serielle Port wieder geschlossen wird.

Test

Für die Tests wird der "Serielle Monitor" über die Arduino IDE geöffnet und eine Baud-Rate von 57600 eingestellt.

Anschließend werden Daten in den Seriellen-Anschluss des Bluetooth-Dongels geschrieben. Diese Daten sollten in der Arduino IDE angezeigt werden.

$ echo "test" > /dev/rfcomm0

Im zweiten Test werden Daten über den Bluetooth-Dongle gelesen. Wird jetzt etwas in den Seriellen Monitor geschrieben und abgesendet sollte es auf der Konsole angezeigt werden.

$ cat /dev/rfcomm0

Verwandte Artikel