Drahtlose Datenübertragung: Python-Skript für Bluetooth-Kommunikation mit Mikrocontroller (2024)

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?
    • Koppeln des Bluetooth Moduls HC-06 mit dem Raspberry Pi
      • Schritt 1 – Kommandozeilentool “bluetoothctl” aufrufen
      • Schritt 2 – Koppeln des Moduls HC-06 mit dem Raspberry Pi
      • Schritt 3 – Aufbauen der Verbindung
  • Python-Skript für die Bluetooth-Kommunikation mit Mikrocontroller
    • Warum die Pause zwischen dem Senden von Daten?
    • Download des Skriptes
  • 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.

Python-Skript zum Übertragen von Daten vom Raspberry Pi zum Arduino UNO R3

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 $ bluetoothctlAgent registered[bluetooth]# scan onDiscovery 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:33Attempting to pair with 20:15:12:15:21:33[CHG] Device 20:15:12:15:21:33 Connected: yesRequest 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: yesPairing 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:33Attempting 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 bluetoothimport timenearby_devices = Nonedef 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

PythonSkript zum senden von Zeichenketten via BluetoothHerunterladen

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.

Drahtlose Datenübertragung: Python-Skript für Bluetooth-Kommunikation mit Mikrocontroller (2024)
Top Articles
Latest Posts
Article information

Author: Rubie Ullrich

Last Updated:

Views: 5249

Rating: 4.1 / 5 (52 voted)

Reviews: 91% of readers found this page helpful

Author information

Name: Rubie Ullrich

Birthday: 1998-02-02

Address: 743 Stoltenberg Center, Genovevaville, NJ 59925-3119

Phone: +2202978377583

Job: Administration Engineer

Hobby: Surfing, Sailing, Listening to music, Web surfing, Kitesurfing, Geocaching, Backpacking

Introduction: My name is Rubie Ullrich, I am a enthusiastic, perfect, tender, vivacious, talented, famous, delightful person who loves writing and wants to share my knowledge and understanding with you.