In diesem Beitrag möchte ich dir ein Python-Skript für die drahtlose Bluetooth-Kommunikation zwischen einem Raspberry Pi und einem Mikrocontroller präsentieren. Mit diesem Skript kannst du recht einfach Zeichenketten senden und so auf einem Mikrocontroller Befehle ausführen.
Wie du auf einem Raspberry Pi die drahtlose Kommunikation via Bluetooth aktivierst, habe ich dir im Beitrag Schritt-für-Schritt-Anleitung: Einrichten von Bluetooth auf dem Raspberry Pi ausführlich erläutert.
Inhaltsverzeichnis
- Wozu dient dieses Python-Skript?
- Was muss vor dem Versenden von Daten erledigt werden?
- Python-Skript für die Bluetooth-Kommunikation mit Mikrocontroller
- Code für das Empfangen von seriellen Daten am Arduino UNO R3
Wozu dient dieses Python-Skript?
Das Python-Skript kannst du wie eingangs erwähnt nutzen, um zum Beispiel mit einem Zeichen auf einem Mikrocontroller einen Befehl auszuführen oder auch Daten zu versenden, welche weiterverarbeitet werden sollen.
Du kannst das Skript auch als Basis für deinen eigenen Ideen nutzen und beliebig umschreiben.
Ich möchte das Skript nutzen, um später mit dem Raspberry Pi via Bluetooth ein kleines Auto zu steuern, aber dazu gibt es einen separaten Beitrag!
Was muss vor dem Versenden von Daten erledigt werden?
Das Skript sucht beim Starten zunächst nach Bluetoothgeräte. Jedoch musst du zunächst dein gewünschtes Gerät mit dem Raspberry Pi koppeln.
In meinem Fall habe ich eine kleine Schaltung am Arduino UNO R3* mit dem HC-06* aufgebaut.
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Das Bluetooth Modul HC-06 ist mit dem Passwort 1234 gesichert und so muss vor dem Aufbau einer Verbindung mit dem Skript dieses eingerichtet werden.
Koppeln des Bluetooth Moduls HC-06 mit dem Raspberry Pi
Im nachfolgenden YouTube-Video erläutere ich dir, wie du ein HC-06 Modul mit dem Raspberry Pi koppelst und Daten vom Pi an den angeschlossenen Arduino sendest.
Schritt 1 – Kommandozeilentool “bluetoothctl” aufrufen
Zum Koppeln des Bluetooth Moduls HC-06 musst du das Kommandozeilentool “bluetoothctl” aufrufen. Dort gibst du nun “scan on” ein und wartest, bis dein Gerät gefunden wurde.
Manchmal dauert dieses ein paar Sekunden und auch wenn der Prompt erscheint, können trotzdem noch Zeilen hinzugefügt werden!
pi@raspberrypi:~/Python/BluetoothSearch $ bluetoothctl
Agent registered
[bluetooth]# scan on
Discovery started
[CHG] Controller B8:27:EB:AA:D5:1A Discovering: yes
[CHG] Device 4D:C0:06:78:46:4D RSSI: -58
[CHG] Device 4D:C0:06:78:46:4D TxPower: 7
[CHG] Device 4D:6A:69:C7:A6:F7 RSSI: -82
[CHG] Device 4D:6A:69:C7:A6:F7 TxPower: 7
[CHG] Device DE:28:81:28:4A:5C RSSI: -52
[NEW] Device 20:15:12:15:21:33 HC-06
[bluetooth]#
In meinem Fall wurde das Bluetooth Modul HC-06 mit der MAC-Adresse 20:15:12:15:21:33 gefunden. Diese benötigen wir, um die beiden Geräte (den Raspberry Pi und das Modul HC-06) zu koppeln.
Schritt 2 – Koppeln des Moduls HC-06 mit dem Raspberry Pi
Im nächsten Schritt geben wir jetzt den nachfolgenden Befehl ein und vergeben dann das Passwort 1234.
[bluetooth]# pair 20:15:12:15:21:33
Attempting to pair with 20:15:12:15:21:33
[CHG] Device 20:15:12:15:21:33 Connected: yes
Request PIN code
[agent] Enter PIN code: 1234
[CHG] Device 20:15:12:15:21:33 ServicesResolved: yes
[CHG] Device 20:15:12:15:21:33 Paired: yes
Pairing successful
[CHG] Device 20:15:12:15:21:33 ServicesResolved: no
[CHG] Device 20:15:12:15:21:33 Connected: no
Wenn dieses erfolgreich war, dann sollte “Pairing successful” ausgegeben werden!
Schritt 3 – Aufbauen der Verbindung
Nachdem erfolgreichen koppeln kann eine Verbindung aufgebaut werden.
[bluetooth]# connect 20:15:12:15:21:33
Attempting to connect to 20:15:12:15:21:33
[CHG] Device DE:28:81:28:4A:5C RSSI: -49
[CHG] Device 20:15:12:15:21:33 Connected: yes
[CHG] Device 20:15:12:15:21:33 ServicesResolved: yes
Python-Skript für die Bluetooth-Kommunikation mit Mikrocontroller
Wenn du das kleine Python-Skript startest, dann wird zunächst nach Bluetoothgeräte gesucht und diese dann aufgelistet. Zusätzlich erhältst du noch die Möglichkeit erneut nach Geräte zu suchen und das Skript zu beenden. (Wie jedes Python-Skript kann dieses aber auch mit Strg+X beenden.)
import bluetooth import time nearby_devices = None def sendData(target_address, geraetename): try: msg = input("Eingabe: ") print(msg) if len(msg) > 0: print(f"Aufbau der Verbindung zu {geraetename} {target_address} wird aufgebaut.") for s in msg: port = 1 sock=bluetooth.BluetoothSocket( bluetooth.RFCOMM ) sock.connect((target_address, port)) sock.send(s) print(s) sock.close() time.sleep(2) searchDevices() except Exception as err: print(f"Fehler beim senden der Daten an {geraetename}!") print(f"{err=}, {type(err)=}") def searchDevices(): global nearby_devices if nearby_devices == None: print("Suche Bluetoothgeräte") nearby_devices = bluetooth.discover_devices(lookup_names=True) print(f"Es wurde(n) {len(nearby_devices)} Gerät(e) gefunden!") if len(nearby_devices) > 0: print("Gefundene Geräte:") index = 0 for addr, name in nearby_devices: print(f"\t[{index}] Gerätename: {name}, Adresse: {addr}") index = index + 1 print("\t[S] Suche neustarten") print("\t[E] Ende") eingabe = input("Wähle ein Gerät zum senden von Daten: ") if eingabe.upper() == "E": print("Ende") elif eingabe.upper() == "S": nearby_devices = None searchDevices() elif eingabe.isnumeric(): adresse = nearby_devices[int(eingabe)][0] geraetename = nearby_devices[int(eingabe)][1] sendData(adresse, geraetename) searchDevices()
Warum die Pause zwischen dem Senden von Daten?
Ich habe viel herumexperimentiert, aber ich konnte immer nur maximal 2 Zeichen am Stück korrekt übertragen. Jedes weitere Zeichen war entweder im Minusbereich oder ein komplett anderer Character wurde übertragen.
for s in msg: port = 1 sock=bluetooth.BluetoothSocket( bluetooth.RFCOMM ) sock.connect((target_address, port)) sock.send(s) print(s) sock.close() time.sleep(2)
Somit kam mir die Idee, jedes Zeichen einzeln zu übertragen. Die Pause habe ich erstmal auf 2 Sekunden gesetzt, diese kannst du jedoch nach Belieben anpassen, jedoch sollte diese nicht kleiner als 0,5 Sekunden sein.
Download des Skriptes
Code für das Empfangen von seriellen Daten am Arduino UNO R3
Hier nun das kleine Programm für den Arduino UNO R3. Das Bluetooth Modul HC-06 wird lediglich via serieller Kommunikation angesprochen und daher lesen wir hier von einer seriellen Schnittstelle.
#include <SoftwareSerial.h> SoftwareSerial BT(11, 10); void setup() { Serial.begin(9600); BT.begin(9600); BT.println("Hallo vom Arduino UNO R3"); } void loop() { if (BT.available()) { char data = BT.read(); Serial.println(data); BT.println("Daten empfangen!"); } }
Dieses Programm können wir jetzt erweitern, um bei bestimmten Zeichen eine Aktion auszuführen.
1 thought on “Drahtlose Datenübertragung: Python-Skript für Bluetooth-Kommunikation mit Mikrocontroller”