banner
Heim / Blog / Verwendung des Raspberry Pi Pico W für Bluetooth Low
Blog

Verwendung des Raspberry Pi Pico W für Bluetooth Low

Jun 16, 2023Jun 16, 2023

Fred Eady | 31. August 2023

Mit der Einführung der Version 1.5.1 unterstützt das Raspberry Pi Pico SDK jetzt Bluetooth Classic und Bluetooth Low Energy (BLE) auf der Entwicklungsplattform Raspberry Pi Pico W. Wie erwartet wurden nach der Ankündigung der Bluetooth-Unterstützung eine Reihe von Pico-Bluetooth-Beispielen basierend auf einer Portierung von BlueKitchens BTstack verfügbar. Der zum Raspberry Pi Pico SDK portierte Beispielcode behält das ursprüngliche BTstack C-Sprachformat bei. Die meisten BTstack-basierten Pico-Bluetooth-Beispiele, die im öffentlichen Bereich zu finden sind, wurden jedoch in MicroPython oder Arduino realisiert. Das Ziel dieser Diskussion besteht darin, ein funktionierendes Pico Bluetooth Low-Energy-Beispiel in C-Sprache zu erstellen, das unter Ubuntu 22.04 LTS unter Verwendung von Visual Studio Code und der neuesten Raspberry Pi Pico SDK-Toolchain entwickelt wurde. Sie können den Quellcode des Beispielprojekts von der Download-Site von EDTP Electronics erhalten.

Für diejenigen unter Ihnen, die mit dem Raspberry Pi Pico W möglicherweise nicht vertraut sind: Der PicoW ist eine grundlegende BLE-Hardwareimplementierung, die aus einem Mikrocontroller besteht, der die Übertragung und den Empfang von Bluetooth-Funkverkehr über ein Bluetooth-Funkmodul überwacht. Der Mikrocontroller wird von einem Bluetooth-Stack gesteuert; Durch die Einbeziehung eines Bluetooth-Stacks kann die PicoW-Hardware die Rolle eines Clients oder Servers in einer Bluetooth-Anwendung übernehmen. Somit kann der PicoW so programmiert werden, dass er als Remote-Datenerfassungsgerät zur Wartung von Sensoren oder als Datenspeicher- und -weiterleitungsgerät fungiert, das Sensordaten von Remote-Geräten sammelt und die gesammelten Daten an einen zentralen Verarbeitungsort überträgt. Die PicoW-Hardware ist auch in der Lage, im Standalone-Modus eingehende Bluetooth-Informationen zu verarbeiten und über ihre GPIO-Pins und On-Chip-Peripheriegeräte entsprechend zu reagieren.

Wir beginnen den Firmware-Entwicklungsprozess mit der Installation der Version 1.5.1 des Raspberry Pi Pico SDK. Anweisungen zur Installation des Raspberry Pi Pico SDK und der GNU-Toolchain für Linux finden Sie auf der Raspberry Pi-Website. Der nächste Schritt beinhaltet die Installation von Visual Studio Code. Für Ubuntu 22.04 LTS möchten wir die Debian-Version von Visual Studio Code herunterladen und installieren. Die Installation von Visual Studio Code kann mit dem in Ubuntu 22.04 LTS integrierten Debian-Anwendungsinstallationsprogramm durchgeführt werden.

Nach der Installation erfordert Visual Studio Code einige Anpassungen. Um den Kompilierungsprozess zu unterstützen, müssen wir die Visual Studio Code-Erweiterungen CMake Tools, die auch die CMake-Erweiterung installieren, und Serial Monitor installieren. Für eine erfolgreiche Kompilierung muss CMake wissen, wo das Raspberry Pi Pico SDK installiert ist. Der absolute Raspberry Pi Pico SDK-Speicherort wird durch die Cmake:Environment-Einstellung PICO_SDK_PATH identifiziert, die wir manuell in die CMake Tools-Erweiterungseinstellungen eingeben. Wir betreiben das Raspberry Pi Pico SDK und die zugehörige Toolchain unter Linux. Daher müssen wir auch Unix-Makefiles in das CMake Tools Cmake:Generator-Einstellungsfeld eingeben. Das ist es. Visual Studio Code ist einsatzbereit.

Das Raspberry Pi Pico SDK nutzt Python und PyCryptodomex, um ein binäres Datenbank-Image der Bluetooth-Dienste und -Eigenschaften zu erstellen, die in den Quellcode unserer Bluetooth-Anwendung aufgenommen werden müssen. Python wird mit dem Ubuntu 22.04 LTS-Paket installiert. Wir müssen PyCryptodomex manuell installieren. Die Installation von PyCryptodomex erfolgt mit dem Standard-Ubuntu-Sudo-Apt-Installationsprozess. Detaillierte Installationsanweisungen für PyCryptodomex finden Sie auf der Dokumentationsseite von PyCryptodomex. Mit der Hinzufügung von PyCryptodomex zu unserer Raspberry Pi Pico SDK-Toolchain sind wir nun bereit, mit der Codierung unserer Raspberry Pi Pico W BLE-Anwendung zu beginnen.

Unsere BLE-Anwendung basiert auf dem nordic_spp_le_counter-Beispiel des Raspberry Pi Pico SDK. Das nordic_spp_le_counter-Beispiel ist eine ähnliche Version des Nordic NUS (Nordic UART Service). Mit Nordic NUS können BLE-Geräte über Bluetooth kommunizieren, als ob auf beiden Seiten der Kommunikationsverbindung ein UART vorhanden wäre. Das Raspberry Pi Pico SDK nordic_spp_le_counter-Beispiel ist eigentlich eine Kopie des gleichnamigen BTstack-Beispiels. Sie finden den vollständigen Block des nordic_spp_le_counter-Beispielquellcodes nicht im Raspberry Pi Pico SDK-Verzeichnisbaum. Daher werden wir den Beispielquellcode von BTstack nordic_spp_le_counter als Vorlage für unseren Firmware-Build verwenden.

Der nordic_spp_le_counter erhält sein NUS-Erscheinungsbild durch die Verwendung identischer Kopien des ursprünglichen 128-Bit-NUS-Dienstes und der charakteristischen UUIDs und API-Aufrufe, die in der BTstack-Datei nordic_spp_service_server.c enthalten sind. Wir erstellen manuell eine Datei namens picow_nus.gatt, in der wir die 128-bti-NUS-UUIDs platzieren. Die NUS-UUIDs werden von einem Python-Skript (compile_gatt.py) im Kompilierungsprozess verwendet, um eine Attributdatenbank (ATT) zu generieren, die als Array mit dem Namen „profile_data“ endet und sich in einer von „compile_gatt.py“ generierten Datei mit dem Namen „picow_nus“ befindet. H. Wenn Sie sich den Inhalt der Datei picow_nus.h ansehen, finden Sie auch Attribut-Handle-Definitionen für den NUS-Dienst und die charakteristischen UUIDs. In diesem Fall ist ein Attribut-Handle nichts anderes als eine 16-Bit-Zahl, die den jeweiligen Dienst- oder Merkmalswert identifiziert. Die Attribut-Handle-Werte werden im API-Aufruf nordic_spp_service_server_init verwendet. Die Generierung der NUS-Attributdatenbank und der Datei picow_nus.h wird durch den Inhalt der Datei CMakeLists.txt gesteuert.

Unser nordic_spp_le_counter-Beispiel läuft als BLE-Server. Der BLE-Client besteht aus einer Anwendung namens LightBlue, die auf einem Android-Telefon ausgeführt wird. Die BLE-Serveranwendung besteht aus einer Werbekomponente, einem Heartbeat-Timer-Modul und einigen Pakethandlern. Der UART0 des Raspberry Pi Pico W wird für die Steuerung der Visual Studio Code Serial Monitor-Erweiterung aktiviert.

Der BLE-Server-Anwendungsfluss beginnt mit der Initialisierung des CYW43 BLE-Funktreibers des Raspberry Pi Pico W. Wenn der CYW43-Treiber das BLE-Radio erfolgreich aufruft, werden die BLE-Stapelschichten L2CAP (Logical Link Control and Adaptation Protocol) und SM (Security Manager Protocol) initialisiert. Im nächsten Schritt wird der Pakethandler (stack_event_packet_handler) eingerichtet und registriert, der die vom Bluetooth-Stack zurückgegebenen Ereignisse überwacht. Der stack_event_packet_handler wird ausgelöst, wenn der Bluetooth-Stack online geht und wenn der BLE-Client die Verbindung zum BLE-Server trennt. Mit Ausnahme des Verbindungsstatus-LED-Ein/Aus-Steuerbytes innerhalb des stack_event_packet_handler sind die vom stack_event_packet_handler bereitgestellten Funktionen rein informativ. Nach der Registrierung des stack_event_packet_handler wird der ATT-Server mithilfe der im Profildaten-Array enthaltenen ATT-Datenbankinformationen initialisiert, und alle ATT-serverbezogenen Ereignisse werden an den stack_event_packet_handler weitergeleitet. Bevor wir den Befehl zum Aktivieren von Bluetooth erteilen, muss der nordic_spp_packet_handler registriert werden, um Ereignisse und Daten zu überwachen, die an und von der nordic_spp_service_server-API übergeben werden. An diesem Punkt sind wir bereit, den 1000-mS-Heartbeat-Timer zu aktivieren, Bluetooth einzuschalten und mit der Werbung zu beginnen. Wenn alles wie geplant verläuft, beginnt die Verbindungsstatus-LED in 1000-ms-Intervallen zu blinken.

Der PicoW ist so programmiert, dass er als BLE-Peripheriegerät fungiert. Bevor eine Verbindung hergestellt wird, sendet ein BLE-Peripheriegerät Informationen, die sich selbst beschreiben, mithilfe einer Methode namens Werbung. Die LightBlue-Anwendung übernimmt die zentrale Rolle der BLE. Ein BLE-Zentralgerät sucht nach BLE-Peripheriegeräten und entscheidet anhand der Werbedaten, ob eine Verbindung zu einem BLE-Werbegerät hergestellt werden soll oder nicht. Zu den Werbedaten gehört der lokale Name PicoW, der in der Scanliste der LightBlue-Anwendung angezeigt wird. In diesem Fall bleibt die Entscheidung, eine Verbindung herzustellen, dem menschlichen Bediener überlassen. Wir werden das BLE-Zentralgerät über die LightBlue-Anwendung zwingen, eine Verbindung zum PicoW BLE-Peripheriegerät herzustellen. Nachdem Sie eine Verbindung zu PicoW hergestellt haben, tippen Sie auf die Funktion „Benachrichtigen“. Es erscheint ein neuer Bildschirm, in dem Sie das Datenformat auswählen und die vom BLE-Server (PicoW) übertragenen Zähldaten abonnieren können. Wählen Sie UTF-8-Zeichenfolge als Datenformat und tippen Sie auf Abonnieren. Die Verbindungsstatus-LED hört auf zu blinken und leuchtet dauerhaft. Im Bereich „LESE-/ANGEZEIGTE WERTE“ des Bildschirms wird „BTstack-Zähler xxx“ angezeigt, wobei xxx ein numerischer Zählwert ist. Schließen Sie die UART-Pins des Pico W über ein FTDI-USB-zu-Seriell-Kabel an Ihren PC an und führen Sie Serial Monitor in Visual Studio Code aus. Wählen Sie Port /dev/ttyUSB0-FTDI und stellen Sie die Baudrate auf 115200 ein. Im Serial Monitor-Fenster sollte „SEND: BTstack counter xxx“ angezeigt werden. Sie können Daten auch an den BLE-Server senden, indem Sie das Merkmal Beschreibbar wählen und im Bereich SCHRIFTLICHE WERTE Ihre zu übertragenden Daten eingeben. Wenn Sie sich für das Senden im Hex-Format entscheiden, werden die Daten, die Sie an den BLE-Server gesendet haben, im Fenster „Serial Monitor“ als „RECV: xx xx“ angezeigt, wobei „xx xx“ die Hex-Daten sind, die Sie zur Übertragung eingegeben haben.

Das nordic_spp_le_counter-Beispiel kann für die Fernsteuerung, Datenprotokollierung und Fernüberwachung angepasst werden. Sie können den LightBlue BLE-Client auch durch Ihre eigene Android BLE-Client-Anwendung ersetzen.

Weitere Informationen zu Textformaten