In diesem Beitrag möchte ich dir zeigen, wie du das Bluetooth Modul HC-06 am Raspberry Pi Pico W mit Micropython programmiert wird.
Eigentlich bräuchten wir kein zusätzliches Modul, denn der Mikrocontroller verfügt über den Chip CYW43438 von Infineon (siehe Beitrag Raspberry Pi Pico W mit Infineon CYW43438 Chip). Aber die Bluetooth-Funktionalität sind auf diesem Softwareseitig deaktiviert worden, somit müssen uns einem zusätzlichen Modul behelfen.
Pinout des Bluetooth Modules HC-06
Das hier verwendete Bluetooth Modul HC-06 habe ich dir bereits im Beitrag Arduino Lektion 21: Bluetooth Modul HC-06 für den Arduino vorgestellt.
Es gibt neben dem HC-06 Modul noch das HM10 Modul, welches über Bluetooth 4.0 & BLE verfügt und somit deutlich schneller arbeitet.
Hier, in diesem Beitrag, möchte ich das Modul HC-06 mit Bluetooth verwenden, denn dieses kannst du auch mit einem alten Handy steuern und kannst somit ggf. alte Geräte wiederverwenden.
Anschluss des HC-06 Moduls an den Raspberry Pi Pico W
Das Bluetooth Modul HC-06 wird per UART am Raspberry Pi Pico W programmiert. Das macht den Anschluss recht easy, denn wir brauchen nur einen der beiden UART Schnittstellen und die Stromversorgung von 5V inkl. GND.
Bluetooth Modul HC-06 | Raspberry Pi Pico W |
---|---|
RXD | GP0, UART0 TX |
TXD | GP1, UART0 RX |
GND | 35, GND |
VCC | 40, VBUS |
Eine kleine Schaltung
Im nachfolgenden Beispiel möchte ich dir zeigen, wie du per Bluetooth zwei kleine LEDs schalten kannst.
In der Grafik von Fritzing verwende ich das Vorgängermodell Raspberry Pi Pico (also ohne WiFi Support), jedoch sind beide Modul von der Pinbelegung gleich und somit ist diese Grafik auch für den neuen Pico W gültig.
Die beiden LEDs sind jeweils an GPIO14 & 15 angeschlossen.
Android App zum Senden von Daten per Bluetooth
Für die nachfolgenden Beispiele verwende ich die Android-App Serial Bluetooth Terminal. Diese App ist sehr einfach zu bedienen und bietet die Grundfunktionalitäten, welche wir benötigen, um Daten per Bluetooth an den Pico W zu senden.
Es gibt für Apple Geräte sicherlich ein äquivalent, da mir jedoch kein solches Gerät zur Verfügung steht, bleibt dieser Test jedoch aus.
Programmieren des Bluetooth Moduls per UART
Aus der Schaltung kannst du übernehmen, dass wir das Modul per UART (RX & TX) programmieren werden.
Im ersten Schritt wollen wir zunächst eine Verbindung mit dem Handy aufbauen und Text versenden. Für die
# Bibliothek zum steuern der UART Kommunikation from machine import Pin,UART # beginn der UART Kommunikation auf dem ersten Kanal # GP0 & GP1 mit 9600 baud uart = UART(0,9600) # Endlosschleife while True: # pruefen ob irgendwelche Daten empfangen wurden if uart.any(): # lesen der Daten und speichern in # der Variablen command command = uart.readline() # ausgeben der Variablen command auf # der seriellen Schnittstelle print(command)
Dieses kleine Programm bewirkt, dass wir wie erwähnt Daten mit einer Bluetooth-Terminal-App versenden und empfangen können.
In dem Video siehst du, dass die Daten in der Konsole nach folgendem Muster ausgegeben werden.
MicroPython v1.19.1 on 2022-06-18; Raspberry Pi Pico with RP2040
Type "help()" for more information.
>>> %Run -c $EDITOR_CONTENT
b'H'
b'a'
b'l'
b'l'
b'o'
b'\r'
b'\n'
Damit wir die Daten von Byte in String konvertieren, müssen wir beim Ausgeben oder später beim Auswerten der Variable command die Funktion “decode()” aufrufen.
print(command.decode())
Wenn wir nun den Funktionsaufruf decode verwenden, so entfallen die zusätzlichen Zeichen.
MicroPython v1.19.1 on 2022-06-18; Raspberry Pi Pico with RP2040
Type "help()" for more information.
>>> %Run -c $EDITOR_CONTENT
H
a
l
l
o
Steuern von LEDs per Bluetooth am Raspberry Pi Pico W
Im nächsten Schritt wollen wir jedoch per Bluetooth unsere beiden LEDs steuern, dazu senden wir für die grüne LED den Buchstaben g und für die rote den Buchstaben r ab.
Den Quellcode passen wir an und implementieren die beiden Pins für die LEDs sowie die beiden If-Statements für den Check auf die empfangenen Daten.
# Bibliothek zum steuern der UART Kommunikation from machine import Pin,UART # beginn der UART Kommunikation auf dem ersten Kanal # GP0 & GP1 mit 9600 baud uart = UART(0,9600) # rote LED am Pin GPIO14 angeschlossen led_rot = Pin(14, Pin.OUT) # gruene LED am Pin GPIO15 angeschlossen led_gruen = Pin(15, Pin.OUT) # Variablen zum speichern das Status der LEDs led_rot_status = False led_gruen_status = False # Endlosschleife while True: # pruefen ob irgendwelche Daten empfangen wurden if uart.any(): # lesen der Daten und speichern in # der Variablen command command = uart.readline() # ausgeben der Variablen command auf # der seriellen Schnittstelle wenn # diese nicht leer ist if len(command.decode()) > 0: print(command.decode()) else # wenn ein leerer String empfangen wurde # dann soll die Funktion beendet werden return # Wenn der Buchstabe r empfangen wurde UND # die Variable led_rot_status ist False, dann ... if command.decode() == 'r' and not led_rot_status: # Ausgeben der Zeile auf der seriellen Schnittstelle print('LED rot ein') # umkehren des Signals auf dem Pin der LED led_rot.toggle() # setzen der Variable led_rot_status auf True led_rot_status = True # Wenn der Buchstabe r empfange wurde UND # die Variable led_rot_status ist True, dann ... elif command.decode() == 'r' and led_rot_status: # Ausgeben der Zeile auf der seriellen Schnittstelle print('LED rot aus') # umkehren des Signals auf dem Pin der LED led_rot.toggle() # setzen der Variable led_rot_status auf False led_rot_status = False # Wenn der Buchstabe g empfangen wurde UND # die Variable led_gruen_status ist False, dann ... if command.decode() == 'g' and not led_gruen_status: # Ausgeben der Zeile auf der seriellen Schnittstelle print('LED gruen ein') # umkehren des Signals auf dem Pin der LED led_gruen.toggle() # setzen der Variable led_gruen_status auf True led_gruen_status = True elif command.decode() == 'g' and led_gruen_status: # Ausgeben der Zeile auf der seriellen Schnittstelle print('LED gruen aus') # umkehren des Signals auf dem Pin der LED led_gruen.toggle() # setzen der Variable led_gruen_status auf False led_gruen_status = False
Wenn wir nun den Code auf den Pi Pico laden, dann können wir mit den Buchstaben r & g die entsprechenden LEDs steuern.
Quellenangabe
Für diesen Beitrag habe ich den englischen Beitrag https://www.instructables.com/Bluetooth-ModuleHC-05-With-Raspberry-Pi-Pico/ als Grundlage verwendet. Dieser Beitrag geht jedoch nur so weit, dass die Daten aus dem Bluetooth Terminal in die Konsole geschrieben wird.
Ich würde gerne einen X-box 360 controller mit dem pico w verbinden – wie kann ich den den paaren wie beim normalen Raspberry 4 b oder zero w? Ich habe auch das Modul H06 – jedoch möchte ich nicht die App auf dem Handy sondern die Console nutzen. Wie geht das?