Bluetooth Module
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.
HC-05
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:
- 1 = TxD (Ausgang)
- 2 = RxD (Eingang)
- 11 = Eingang Low=Reset (unbeschaltet = High)
- 12 = Versorgung normal 3,3V 50mA (3..4,2V, kurzzeitig 250mA)
- 13 = GND
- 31 = LED 1, blinkt ständig
- 32 = LED 2, Low bei Bereitschaft und High bei Verbindung.
- 34 = Eingang Low=Normalbetrieb, High=Befehlsmodus (unbeschaltet = Low)
Der Pin 34 kann benutzt werden, um (auch während einer Verbindung) in den Befehlsmodus zu wechseln:
- Low: Das Modul kann Verbindungen aufbauen und einige AT Befehle ausführen solange es nicht per Funk verbunden ist. Es gilt die mit AT+UART eingestellte Baudrate.
- Wechsel von Low nach High: Das Modul geht in den Befehlsmodus. Es gilt die mit AT+UART eingestellte Baudrate.
- High während die Stromversorgung eingeschaltet wird: Das Modul startet im Konfigurations-Modus, wo es alle Befehle unterstützt. Die Baudrate ist in diesem Modus immer 38400. Um diesen Modus zu verlassen, muss die Stromversorgung aus und wieder an geschaltet werden.
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:
- AT+ORGL Alle Einstellungen auf die Vorgabewerte zurück setzen
- AT+PSWD=1234 Passwort ändern (Vorgabe 1234, eventuell sind Anführungsstriche nötig: "1234")
- AT+NAME=HC-05 Name ändern (Vorgabe HC-05)
- AT+UART=9600,0,0 Baudrate auf 4800 bis 1300000 ändern (Vorgabe 9600)
- AT+CMODE=1 Erlaube Verbindung mit beliebigem Partner (Vorgabe)
- AT+CMODE=0 Erlaube Verbindung nur mit einem bestimmten Partner (entweder dem letzten Bekannten oder mit AT+BIND festlegen)
- AT+BIND=A854,B2,3FB035 Binde das Modul an den angegebenen Partner (Parameter ist die Adresse aber mit Komma statt Bindestrichen)
Weitere Befehle sind:
- AT+ROLE? Master/Slave Modus abfragen
- AT+ADDR? Eigene Adresse abfragen
- AT+PSWD? Passwort abfragen
- AT+NAME? Eigenen Namen abfragen
- AT+CMODE? Verbindung-Modus abfragen
- AT+RMAAD Aktuelle Verbindung und Parung beenden (falls vorhanden)
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:
- AT+ORGL Alle Einstellungen auf die Vorgabewerte zurück setzen
- AT+ROLE=1 Master Modus
- AT+PSWD=1234 Stelle das gleiche Passwort ein, wie beim Slave (eventuell sind Anführungsstriche nötig: "1234")
- AT+RMAAD Aktuelle Parung beenden (falls vorhanden)
- AT+CMODE=0 Erlaube Verbindung nur mit einem bestimmten Partner
- AT+BIND=A854,B2,3FB035 Binde das Modul an den angegebenen Partner (Parameter ist die Adresse aber mit Komma statt Bindestrichen)
- AT+RESET Neustart, das Modul sucht nach dem Slave und versucht sich zu verbinden.
- AT+LINK=A854,B2,3FB035 Verbinde mit dem angegebenen Slave
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:
- AT+CMODE=1 Erlaube jeden Verbindungspartner
- AT+INQM=0,5,9 Suche bis zu 5 Geräte in 9 Sekunden
- AT+INIT Falls das Modul mit ERROR(17) antwortet: ignorieren und weiter machen
- AT+INQ? Startet die Suche, liefert zum Beispiel die Adresse A854:B2:3FB035
- AT+RNAME?A854,B2,3FB035 Zeigt den Namen eines erreichbaren Partners an
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.
Der kleine Bruder HC-06
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 Slave Variante HC-06-S wartet darauf, dass sie von einem Master (Computer oder Smartphone) kontaktiert wird.
- Die Master Variante HC-06-M baut automatisch eine Verbindung zu irgendeinem erreichbaren Slave auf und merkt sich diesen dann für spätere Verbindungen.
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:
- 1 = TxD (Ausgang)
- 2 = RxD (Eingang)
- 11 = Eingang Low=Reset (unbeschaltet = High)
- 12 = Versorgung normal 3,3V 50mA (3..4,2V, kurzzeitig 250mA)
- 13 = GND
- 24 = Status LED, blinkt bei Bereitschaft, High bei Verbindung.
- 26 = Eingang Low=Normalbetrieb, High=Löschen des gespeicherten Verbindungspartners (nur HC-06-M, unbeschaltet = Low)
Und auch der Befehlssatz ist anders. Die folgende gilt für Firmware Versionen bis 2.x:
- AT+BAUD1 Baudrate auf 1200 einstellen
- AT+BAUD2 Baudrate auf 2400 einstellen
- AT+BAUD3 Baudrate auf 4800 einstellen
- AT+BAUD4 Baudrate auf 9600 einstellen (=Vorgabe)
- AT+BAUD5 Baudrate auf 19200 einstellen
- AT+BAUD6 Baudrate auf 38400 einstellen
- AT+BAUD7 Baudrate auf 57600 einstellen
- AT+BAUD8 Baudrate auf 115200 einstellen
- AT+NAMExxxxxx Gerätename auf xxxxxx ändern (Vorgabe linvor)
- AT+PINxxxx Passwort einstellen (Vorgabe 1234)
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:
- AT+BAUD=9600,0,0 Baudrate auf 9600 einstellen
- AT+NAME=xxxxxx Gerätename auf xxxxxx ändern (Vorgabe linvor)
- AT+PSWD="1234" Passwort einstellen (Vorgabe 1234)
Hier ist eine englische Beschreibung vom HC-05 und HC-06, sowie der Befehlssatz.
BTM-222 und BTM-238
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:
- 1 = GND
- 2 und 17 = Versorgung 3,3V 100mA (3..3,3V, kurzzeitig 300mA)
- 13 = Status-LED, blinkt bei Bereitschaft und ist High bei Verbindung.
- 26 = RxD (Eingang)
- 27 = TxD (Ausgang)
- 37 = Antenne: 3cm oder 12cm Draht
Die wichtigsten Befehle, sie gehen nur am seriellen Port:
- ATP? Passwort abfragen
- ATP=1234 Passwort einstellen (Vorgabe 1234)
- ATP0 Passwort abschalten
- ATN? Gerätename abfragen
- ATN=BTM-222 Gerätename ändern
- ATL0 4800 Baud
- ATL1 9600 Baud
- ATL2 19200 Baud (Vorgabe)
- ATL3 38400 Baud
- ATL4 57600 Baud
- ATL5 115200 Baud
- ATL6 230400 Baud
- ATL7 460800 Baud
- ATD? Verbindungspartner abfragen
- ATD0 Erlaube beliebigen Partner (Vorgabe)
- ATD=A854-B2-3FB035 Verbindungspartner festlegen
- ATF? Erreichbare Geräte auflisten
- ATR0 Master Modus
- ATR1 Slave Modus (Vorgabe)
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.
Hinweise zur Programmierung
Verwendung unter Windows
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.
Verwendung unter Linux
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.
Linux ohne grafische Oberfläche
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
Verwendung unter Android
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).
Verwendung unter iOS
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.