Digi-Dot-Booster über Bluetooth am nRF51822

Vor etwa einem Jahr wollte ich mich mit der Bluetooth Low Energy (BLE) Technologie beschäftigen. Im Vergleich zu WLAN Modulen haben BLE Module je nach Einsatz weit kleineren Stromverbrauch und können längere Zeit von Batterien betrieben werden. Zudem waren sie schon damals viel kompakter und vor dem Erfolg der ESP-Module auch  viel günstiger. Ich bin damals wie immer vorgegangen: im Internet nach den günstigsten Modulen (damit man mehrere davon besorgen kann und es nicht weh tut, wenn mal das eine oder das andere kaputt geht) gesucht mit der Möglichkeit diese umzuprogrammieren. Sie sollten auch klein sein, damit sie leicht versteckt werden können…

Damals bin ich auf günstige kleine Module gestoßen, die als Blueooth – Seriell Bridges verkauft wurden. Diese Module gibt es auch heute noch, sie basieren auf den TI Chips CC2540 und CC2541. Sie haben einen 8-bit 80C51 MCU-Kern und Bluetooth Schnittstelle. Ziemlich schnell hat sich jedoch herausgestellt, dass die Entwicklung für diese Plattform für einen Hobby-Entwickler kaum möglich ist. Zum einen kann man nicht einfach einen beliebigen 80C51 Compiler nehmen und es mit dem vorkompilierten BLE-Stack verwenden. Man ist auf die Keil- und IAR-Tools angewiesen, die nicht gerade günstig sind. Zum anderen kommt man als Privatperson weder an den BLE-Stack noch an das SDK dran. Letztendlich brauch man noch ein extra Programmiergerät für diese Chips, das man auch vermutlich nie zum anderen Zweck verwenden wird. Das ganze funktioniert nur unter Windows wohl gemerkt. Mit einer Testversion der IAR IDE und einigen Beispielen von github konnte ich einige Experimente damit machen. Das SDK und die vorgegebene Code Struktur war jedoch so komplex, dass es irgendwann keinen Spaß mehr gemacht hat. Zu dem Zeitpunkt gab es auch eine Alternative von Nordic Semiconductor – BLE Chips mit ARM Cortex-M0 Kern. Diese waren jedoch um einiges teurer. Bis heute…

nRF51822 Boards rechts, c2540 zum Vergleich links

nRF51822 Boards rechts, c2540 Modul zum Vergleich links

Inzwischen gibt es sehr viele Entwickler-Boards auf Basis von nRF51 Chips. Die meisten haben nRF51822 onboard und so gut wie alle haben auch mbed Unterstützung. D.h. die Boards haben einen zusätzlichen Chip, der ein USB Laufwerk emuliert, sodass man darauf vom mbed online Compiler erzeugte Datei ablegen kann und diese dann automatisch in den Flash vom nRF51822 programmiert wird. Inzwischen kann man jedoch die Updates mit einem passenden Bootloader auch über Bluetooth einspielen. Neben mbed kann man die Entwicklung auch mit dem SDK von Nordic starten. Der BLE Stack (SoftDevice gennant) liegt hier als hex-Datei vor und muss einfach in den Flash geschrieben werden und nicht wie bei TI nach dem Kompilieren verlinkt werden. Den Rest des eigenen Programms kann man praktischerweise mit einem beliebigen ARM Cortex-M0 kompatiblem Compiler übersetzen. In meinem Fall ist es GCC geworden. Ich habe wieder die günstigsten und kompaktesten Module gesucht und bin dann auch fündig geworden. WT51822-S4AT Module werden auch als BLE – UART Bridges verkauft, sind aber frei umprogrammierbar – die SWD (ARM’s Serial Wire Debug protocol) Pins sind praktischerweise an den Board Pins vorhanden. Kleiner Hinweis an der Stelle: bei meinem Modul ist die QFAA Version des Chips mit 16 kB RAM verbaut, die QFAC Version hat dagegen 32 kB.

Als Testkandidaten für erste Schritte mit neuer Hardware habe ich wie schon öfter den Digi-Dot-Booster genommen. Aus den gleichen Gründen wie beim ESP12-Modul: Er liefert 3V Versorgungsspannung und liefert mit der SPI Schnittstelle den ersten Eindruck, wie das SDK in der Praxis zu handhaben ist.

Für die Tests ein Modul huckepack mit dem DD-Booster und als Breakout für Breadbord

Für die Tests ein Modul huckepack mit dem DD-Booster und als Breakout für Breadbord

Zum Programmieren wurde ST-Linkv2 von einem STM32 Nucleo Board verwendet und openocd als Flash tool. Die Tools und Anleitungen von Nordic sind auf die Verwendung von Segger J-Link ausgelegt. Mit den zahlreichen Beispielen aus dem Nordic SDK 12.0 konnte ich auch recht schnell die SPI Schnittstelle ansprechen und die LEDs mit dem klassischen Regenbogen zum Leuchten bringen – das ganze erstmal ohne Bluetooth Funktionalität. Dabei ist eine Tatsache positiv aufgefallen: die Pins können beliebig für die Peripherie konfiguriert werden. Somit konnte ich die Pins an den Seiten der Platine ohne Probleme der SPI Schnittstelle und der RESET Leitung zuweisen.

WT51822-S4AT Modul Pin Belegung. P0.X entsprechen den Pins des nRF51822, in rot die zugewiesene SPI Belegung.

Vom schnellen Erfolg beflügelt, bin ich zu den Bluetooth Beispielen von Nordic gekommen, und musste dann erste Niederlagen erfahren. Egal was ich ausprobiert habe, lief der Bluetooth Stack überhaupt nicht. Ich bin bei den SDK Versionen bis zu der 6-en runter gegangen, verschiedene Versionen des GCC Kompilers ausprobiert, sowohl auf Windows als auch auf dem Mac – mit gleichem Ergebnis. Irgendwann hatte ich von Frustrationen genug und bin zum mbed online Compiler gewechselt (als Plattform RedBearLab BLE Nano ausgewählt). Seltsamerweise funktionierte hier Bluetooth sofort auf Anhieb, obwohl unter der Haube genauso ein SoftCore von nordic verwendet wird. Die Gründe haben mich wenig interessiert – ich war froh, dass es funktioniert. Die BLE API von mbed erwies sich auch um vielfaches einfacher in der Handhabung als das Nordic SDK. So bin ich dann recht schnell zu einer funktionierenden Version des Digi-Dot-Boosters mit BLE Schnittstelle gekommen. Dabei werden die über Bluetooth Service empfangene Befehle einfach 1:1 über SPI an den DD-Booster weitergeleitet. Die Programmierung erfolgt manuell: die aus dem Browser heruntergeladene Datei wird lokal abgelegt und mit openocd in den Flash geschrieben. Mit einem Script kann man sicherlich auch das automatisieren.

Für die Übertragung wird ein BLE Service von Nordic verwendet: NUS – Nordic UART Service. Er hat 2 Charakteristiken: eine zum Schreiben (RX Characteristic) und eine zum Lesen (TX Characteristic) von Daten. Das Schreiben erfolgt ohne Bestätigung, was den Datendurchsatz etwas verbessert. Da der DD-Booster keinen Rückkanal hat und nach dem fire & forget Prinzip funktioniert, wird hier auch nur die RX Charakteristik zur Steuerung benötigt.

nRF Connect Android App mit Infos zum NUS

nRF Connect Android App mit Infos zum NUS

Den Code für das BLE Modul gibt es hier bei mbed. Im Laufe der Tests ist auch eine vollwertige mbed DD-Booster Bibliothek entstanden, die analog zu der Arduino Library die einzelnen Befehle und die SPI Steuerung in Funktionen kapselt. Über die Import Funktion, kann sie in die eigenen Projekte hinzugefügt werden. Die Biblitohek wurde mit einem Nucleo Board getestet – das WaterDrop Beispiel gibt es auch dazu. Zusätzlich ist der Code der Bibliothek auch auf github zu finden. Probleme und Verbesserungen am besten dort melden.

Die Bluetooth Steuerung kann auf vielen Wegen erfolgen. Sowohl für Android als auch für iOS gibt es BLE Schnittstellen für die eigenen Apps. Seit Kurzem ist auch die Steuerung mit Chrome direkt aus dem Browser heraus möglich. Das ist auch der Weg, für den ich bei der Umsetzung meiner DD-Booster-BLE Web App entschieden habe. Mehr dazu folgt im nächsten Beitrag.

Schreibe einen Kommentar