
Abbildung 2: Der Verlauf einer Kommunikation zwischen dem Raspberry Pi und einem Android-Tablet via Bluetooth.
Die in Abbildung 2 auf dem Raspberry Pi manuell ausgeführten Schritte sollen automatisch ablaufen. Dazu richten Sie einen Systemd-Service mit der Definition aus Listing 4 ein. Das Argument watch in Zeile 7 funktioniert analog zu listen. Nach dem Aufbau der Verbindung startet Rfcomm das Skript /usr/local/sbin/bt-control.sh. Nach einem Verbindungsabbruch sorgt watch dafür, dass Rfcomm wieder in den listen-Modus wechselt.
Listing 4
Service-Definition
[Unit] Description=BT-Control service After=bluetooth.service Requires=bluetooth.service [Service] ExecStart=/usr/bin/rfcomm watch rfcomm0 1 /usr/local/sbin/bt-control.sh [Install] 10: WantedBy=multi-user.target
Das dazugehörige Kontrollprogramm sehen Sie in Listing 5. Im Beispiel handelt es sich um ein einfaches Shell-Skript, jede andere Programmiersprache wäre genauso möglich. Das Skript liest kontinuierlich von der RFCOMM-Schnittstelle (Zeile 18) und verarbeitet die vordefinierten Kommandos in der Funktion process_request() ab Zeile 3.
Listing 5
Kontrollprogramm
#!/bin/bash
process_request() {
case "$1" in
"hostname") hostname -f >&3 ;;
"mem") free -h >&3 ;;
"disk") df -h >&3 ;;
*) echo "Befehl unbekannt" >&3 ;;
esac
}
# --- Hauptprogramm -----------------------------
# Device für Lesen und Schreiben öffnen
exec 3<>/dev/rfcomm0
while true; do
if read -u 3 request; then
process_request "$request"
else
break
fi
done;
# Filedescriptor schließen
exec 3>&-
Die Android-App gestaltet die Steuerung sehr einfach, denn sie erlaubt es, Befehle direkt auf Buttons zu legen (Abbildung 3). Die Anzahl der Zeilen legen Sie in den Einstellungen fest. Mit einem langen Druck auf einen Button kommen Sie in den Editiermodus und ändern Titel, Befehl und Format. Ausblenden lassen sich einzelne Buttons allerdings nicht, auch die Schriftgröße kann man nicht ändern.
Auf Basis derselben RFCOMM-Technologie gibt es noch eine ganze Reihe von Apps im Playstore. Besonders interessant ist zum Beispiel die App Bluetooth Control Panel [3]. Das Besondere an ihr: Sie erstellt die Oberfläche dynamisch aufgrund von Daten, die der Raspberry Pi oder ein Mikrocontroller an sie sendet.
Daten kontaktlos
Im ersten Anwendungsfall war das Smartphone der Host und der Raspberry Pi das Device. Nun übernimmt der Mini-Rechner die Rolle des Hosts. Ein typischer Anwendungsfall besteht im Datenlogging über Bluetooth. Dazu schreibt wie üblich der Mikrocontroller seine Ausgabe auf die serielle Schnittstelle, aber statt eines Kabels hängt dort ein HC-05 (Abbildung 4). Dieser Baustein implementiert UART über Bluetooth. Der große Vorteil dabei: Sie müssen das Programm auf dem Mikrocontroller nicht ändern, wenn der sowieso schon seine Daten auf die serielle Schnittstelle schreibt.
Das Breakout gibt es in den unterschiedlichsten Versionen. Welches Exemplar man genau bekommt, spielt letztlich kaum eine Rolle. Typischerweise bringt die Platine einen Taster, eine LED und einen Spannungswandler mit. Letzterer gestaltet die Stromversorgung flexibel. Der Signalpegel auf den RX/TX-Leitungen beträgt aber immer 3,3 Volt. Wer also einen Arduino anschließt, muss die Spannung auf der RX-Leitung (Arduino: TX) per Spannungsteiler herabsetzen. Tutorials zur Verkabelung finden sich im Internet.
Der HC-05 kennt die Modi Kommando und Daten. Der erste Modus dient der Konfiguration, bei neuen Geräten sollten Sie dazu unbedingt die im Kasten “HC-05 konfigurieren” beschriebenen Schritt ausführen. Außerdem müssen Sie den Raspberry Pi und das Breakout einmalig wie bereits beschrieben koppeln; dabei merken Sie sich die MAC-Adresse des HC-05.
HC-05 konfigurieren
Der HC-05 kommt üblicherweise immer mit demselben voreingestellten Benutzernamen und Passwort, außerdem liegt die für den Datenmodus vorkonfigurierte Transferrate bei mageren 9600 Baud. Mit ein paar AT-Kommandos ändern Sie das, am einfachsten mit einem USB-auf-UART-Adapter, der 3,3 Volt unterstützt. Alternativ nutzen Sie den Raspberry Pi. Dessen serielle Schnittstelle belegt allerdings die Systemkonsole, sodass Sie sie erst freischaufeln müssen. Dazu entfernen Sie in der Datei /boot/cmdline.txt den String console=serial0,115200 und fügen die Zeile enable_uart=1 in die /boot/config.txt ein.
Nach einem Neustart verbinden Sie GPIO14 (TX) mit RX auf dem HC-05 sowie GPIO15 (RX) mit TX und GND. Bevor Sie die Spannung (3,3 oder 5 Volt) anlegen, drücken und halten Sie den kleinen Button auf dem Breakout. Die LED sollte jetzt langsam blinken. Das genaue Muster hängt von der Version ab, beim Autor ist es ein Doppelblinken im Sekundenabstand. Während die Transferrate im Datenmodus 9600 Baud beträgt, arbeitet der HC-05 im Kommandomodus mit 38 400 Baud. Sie verbinden sich deshalb mit dem Terminalprogramm Ihrer Wahl mit dem Gerät, etwa mit dem Befehl aus der ersten Zeile von Listing 6. Danach führen Sie die im Listing folgenden Befehle aus. Achten Sie dabei auf Großschreibung.
Der erste Befehl sollte OK zurückliefern (Zeile 5) – tut er das nicht, dann stimmt etwas mit der Verbindung nicht. Die weiteren Befehle fragen jeweils den aktuellen Wert ab (AT+XXX?) und setzen ihn neu. Wichtig sind vor allem die Befehle in Zeile 12 (Pin) und Zeile 15 (Transferrate). Auch wenn Bluetooth keine hohe Reichweite besitzt, bis in die Nachbarwohnung schafft es das Signal dennoch oft, deshalb empfiehlt sich das Ändern der Standard-PIN. Die Transferrate wählte der Autor in Zeile 15 so, dass sie dem Standard des Pi Pico entspricht. Wenn Sie einen anderen Mikrocontroller verwenden, passen Sie den Wert entsprechend an.
Listing 6
HC-05 konfigurieren
$ miniterm --eol CRLF -e /dev/ttyUSB0 38400 --- Miniterm on /dev/ttyUSB0 38400,8,N,1 --- --- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- AT OK AT+NAME? [...] AT+NAME=PICO_42 [...] AT+PSWD? [...] AT+PSWD="9999"AT+UART? [...] AT+UART=115200,0,0
So vorbereitet, gerät der Einsatz zum Kinderspiel. Sie verbinden den HC-05 mit dem Mikrocontroller, und der gibt seine Daten wie üblich per print respektive printf aus. Den Raspberry Pi verbinden Sie nun über den Befehl aus der ersten Zeile von Listing 7 mit dem HC-05 – der Wert aa:bb:cc:dd repräsentiert die MAC-Adresse des Breakouts. Anschließend steht das Device /dev/rfcomm0 bereit. Eingehende Daten lenken Sie dann per cat in eine Datei um (letzte Zeile). Falls der Mikrocontroller zudem Eingaben verarbeitet, lassen sich auch Befehle via /dev/rfcomm0 versenden, etwa, indem Sie ein Terminalprogramm mit der Device-Datei als Argument aufrufen.
Listing 7
HC-05 ansprechen
$ sudo rfcomm bind hci0 aa:bb:cc:dd $ cat /dev/rfcomm0 > MeineDaten.log
Statt über den Raspberry Pi können Sie sich auch über die Android-App mit dem HC-05 verbinden. Das erweist sich für einen schnellen Test als hilfreich, denn Sie sehen sofort, ob der Pi Pico erfolgreich Daten sendet. Ebenso ist es möglich, dass der RasPi oder die App Daten per HC-05 an den Mikrocontroller sendetn und diesen damit steuert (LED und Motoren an/aus und so weiter). Der Mikrocontroller muss dann aber auf die serielle Schnittstelle nicht nur schreiben, sondern auch von dort lesen.
Pico als Host
Das vorige Szenario zeigte, wie der RasPi die Daten beim Pi Pico abholt. Das funktioniert gut, solange der Mikrocontroller schon läuft und der Aufbau der Verbindung vom Raspberry Pi zum Pico deshalb klappt. Läuft der Mikrocontroller jedoch nicht, müsste der RasPi in einer Schleife ständig aufs Neue den Verbindungsaufbau herzustellen versuchen.







