Bluetooth Modul HC-05
Die hier vorgestellten Bluetooth Module ermöglichen es, serielle Geräte drahtlos mit einem PC oder Smartphone zu verbinden. Dabei kommt das RFCOMM Protokoll aus dem SPP-Profil zum Einsatz.
Das HC-05 aus China ist für 3,3V gedacht, man kann es allerdings auch zusammen mit einer Adapterplatine für 5V kaufen. Bei meinen Tests erreichte es nur 5 Meter Reichweite, darüber wurde die Datenübertragung langsam und unzuverlässig. Außerdem klappt der Verbindungsaufbau zum PC oder Smartphone manchmal erst beim zweiten oder dritten Versuch.
Solange das Modul keine Funkverbindung hat, kann es (an den Anschlüssen RxD und TxD) mit AT-Befehlen konfiguriert werden. Nach dem Verbindungsaufbaun überträgt es serielle Daten transparent zum Verbindungspartner.
Die Pinbelegung ist folgende:
Der Pin 34 kann benutzt werden, um (auch während einer Verbindung) in den Befehlsmodus zu wechseln:
Standardmäßig hat der serielle Port 9600 Baud und das Modul ist bereit, Verbindungen von jedem Master (PC oder Smartphone) anzunehmen. Am seriellen Port kann das Modul mit Befehlen konfiguriert werden. Das sind die wichtigsten Befehle für den Slave Modus:
Weitere Befehle sind:
Alle Befehle werden mit einem Zeilenumbruch (CRLF oder \r\n) abgeschlossen. Wenn Du mehrere Befehle nacheinander an das Modul sendest, musst Du ihm nach jedem einzelnen Befehl genug Zeit geben, den Befehl auszuführen. Das Modul kann den nächsten Befehl erst empfangen, wenn der vorherige Befehl abgearbeitet wurde.
Um das Modul in den Master Modus zu versetzen und mit einem Slave zu verbinden, sind folgende Befehle zu verwenden:
Nach diesen Befehlen verbindet sich das Modul zukünftig automatisch mit dem Slave. Mit AT+ROLE=0 gefolgt von AT+RESET kommt man zurück in den Slave Modus.
Die folgenden Befehle können benutzt werden, um nach erreichbaren Slaves zu suchen:
In manchen Dokumentationen werden Befehle genannt, mit denen man einzele I/O Pins direkt ansteuern kann. Dieses Feature ist aber offensichtlich optional und wird nicht von jeder Firmware unterstützt.
Hier ist eine englische Beschreibung vom HC-05 und HC-06, sowie der Befehlssatz.
Das HC-06 Modul sieht genau so aus, wie das HC-05. Es wird in zwei Varianten verkauft: Master und Slave, wobei nur sehr wenige Händler die Master Variante verkaufen.
Die Betriebsart kann nicht umkonfiguriert werden. Äußerlich sehen die Module identisch aus. Die Anschlussbelegung des HC-06 ist allerdings etwas anders, als beim HC-05:
Und auch der Befehlssatz ist anders. Die folgende gilt für Firmware Versionen bis 2.x:
Beim HC-06 dürfen die Befehle nicht mit Zeilenumbruch abgeschlossen werden, sonst ignoriert es sie einfach!
Ab Firmware Version 3.0 gilt hingegen, dass die Zeilen mit einem Zeilenumbruch (CRLF oder \r\n) abgeschlossen werden müssen. Und die Kommandos sind anders:
Hier ist eine englische Beschreibung vom HC-05 und HC-06, sowie der Befehlssatz.
Das Modul BTM-222 und sein Nachfolger BTM-238 von Rayson haben beide ein geschlossenes Gehäuse und schaffen schon mit einem simplen Stück Draht als Antenne eine gute Reichweite. Sie arbeiten viel zuverlässiger, als die HC-05 und HC-06 Module.
Solange die Module keine Funkverbindung haben, können sie (an den Anschlüssen RxD und TxD) mit AT-Befehlen konfiguriert werden. Nach dem Verbindungsaufbau übertragen sie serielle Daten transparent zum Verbindungspartner.
Man schließt nur wenige Pins an:
Die wichtigsten Befehle, sie gehen nur am seriellen Port:
Befehle werden mit einem Zeilenumbruch (CRLF oder \r\n) abgeschlossen. Wenn Du mehrere Befehle nacheinander an ein Modul sendest, musst Du ihm nach jedem einzelnen Befehl genug Zeit geben, den Befehl auszuführen. Die Module können den nächsten Befehl erst empfangen, nachdem der vorherige Befehl abgearbeitet wurde.
Auf dem seriellen Port erscheinen Statusmeldungen wie z.B. CONNECT '001D-D9-F71C7E', DISCONNECT '001D-D9-F71C7E' und AT+GCAP.
Datenblätter: BTM222 Pins und Befehlssatz, BTM238 Pins, BTM238 Befehlssatz
In den Datenblättern werden zahlreiche spannende Features erwähnt, wie programmierbare I/O Pins, USB Interface, Voice Funktionen, etc. All diese Funktionen werden von der gewöhnlichen "SPP" Firmware aber nicht unterstützt.
Stromversorgung einschalten, auf das Bluetooth Symbol in der Startleiste klicken. Man muss das Passwort des Moduls eingeben und es wird ein virtueller serieller Port installiert.
Danach kann man die Verbindung benutzen, z.B. mit einem Terminal Programm. Windows baut die Funkverbindung erst auf, wenn der virtuelle serielle Port geöffnet wird, und die Verbindung wird beim Schließen des seriellen Portes wieder getrennt.
Leider sind die Bluetooth Treiber von Windows oft mangelhaft. Es kommt immer wieder vor, dass der virtuelle COM-Port fehlt oder nicht geöffnet werden kann. Bei mir funktionierte es erst, nachdem ich den Treiber von Widcomm installierte, den ich auf der Support-Seite meines Notebook-Herstellers downloaden konnte. Interessanterweise waren alle anderen Treiber vorinstalliert, nur dieser nicht.
Um das Modul mit einem Java Programm anzusprechen, benötigst du die RxTx Library, vorzugsweise Version 2.1.7 (alternativer download).
Für erste Tests empfehle ich das Programm Hammer Terminal, Putty oder Cutecom.
Nachdem du in der Systemsteuerung die Paarung mit dem Bluetooth Gerät eingerichtet hast, benutze den Befehl hcitool scan, um dessen Geräte-Adresse herauszufinden und dann rfcomm bind 0 <adresse>, um einen virtuellen seriellen Port zu erstellen. Wegen der 0 heißt der serielle Port /dev/rfcomm0.
Um das Modul mit einem Java Programm anzusprechen, benötigst du die RxTx Library, vorzugsweise Version 2.1.7 (alternativer download). Erste Tests kann man prima mit Cutecom durchführen.
Da ich auf meinem Raspberry Pi keinen Desktop installiert habe, muss ich die Paarung an der Kommandozeile durchführen. Das geht so:
$ sudo su - $ systemctl start hciuart (scheint nicht bei allen Geräten nötig zu sein) $ hcitool scan Scanning ... 20:13:11:15:16:08 HC-06 $ bluetoothctl [bluetooth]# power on [bluetooth]# agent on [bluetooth]# pair 20:13:11:15:16:08 Attempting to pair with 20:13:11:15:16:08 [CHG] Device 20:13:11:15:16:08 Connected: yes Request PIN code [agent] Enter PIN code: 1234 [CHG] Device 20:13:11:15:16:08 UUIDs: 00001101-0000-1000-8000-00805f9b34fb [CHG] Device 20:13:11:15:16:08 ServicesResolved: yes [CHG] Device 20:13:11:15:16:08 Paired: yes Pairing successful [bluetooth]# exit $ rfcomm bind 0 20:13:11:15:16:08 $ picocom -b115200 /dev/rfcomm0
Das Android SDK enthält spezielle Klassen für Bluetooth Kommunikation, welche nach dem Verbindungsaufbau einen InputStream und einen OutputStream bereitstellen. Einen virtuellen seriellen Port erhält man bei Android nicht.
Zum Verbindungaufbau benötigt man die UUID "00001101-0000-1000-8000-00805F9B34FB". Das Beispielprogramm "Bluetooth Chat" vom Android SDK funktioniert erst nach Anpassung der UUID im Quelltext.
Du darfst gerne von meiner minimalen Beispiel-App BtTest abgucken, wie man die Bluetooth Klassen des Android SDK benutzt.
Wer Apps in C++ programmiert, kann die Bluetooth API über das Java Native Interface (JNI) ansprechen. Die Qt Anwendung AndroidBluetooth demonstriert, wie das geht. Ab Version 5.3 unterstützt Qt Bluetooth die selbe Technik. Trotzdem bevorzugen manche Programmierer mein Beispiel, da es angeblich zuverlässiger funktioniert (konnte ich nicht nachvollziehen).
Apples iOS Geräte unterstützen das RFCOMM Protokoll leider gar nicht. Hier muss man auf Bluetooth Low Energy (BLE) oder WLAN Produkte ausweichen, die allerdings anders programmiert werden. Für diese Produkte gibt es keinen einheitlichen Standard zur Emulation serieller Ports.