© S&S Media
Teil 2: Wie man Hardware mit Bluetooth steuert

Kommunikation mit Bluetooth


Im vorangegangenen Artikel habe ich die Nutzung von Bluetooth zur Realisierung von Multiplayerspielen beschrieben. Das ist aber nur ein kleiner Teil der Möglichkeiten des Funkstandards – Bluetooth lässt sich auch zur Kommunikation mit Prozessrechnern und ähnlicher Hardware einsetzen.

Vorweg: Der Autorin dieses Artikels ist das Vorhandensein eines dedizierten USB-API in Windows 10 Mobile hinreichend bekannt. Die unter [1] im Detail beschriebene Programmierschnittstelle ist zwar durchaus umfangreich, Bluetooth aber dennoch in vielen Fällen unterlegen.

Grund Nummer eins ist die störende Kabelverbindung: Wer sein Telefon an Hardware anschließen muss, ist nicht mehr mobil. Das sorgt insbesondere dann für Ärger, wenn das betreffende Produkt keine Energie liefern kann und so den Ladeport belegt. Grund Nummer zwei ist das Fehlen von mehreren USB-Ports am Smartphone.

Dank der rapiden Entwicklung chinesischer Chipfertiger ist es heute ohne Weiteres möglich, Prozessrechner ohne bzw. mit nur minimalem Aufwand mit einer Bluetoothschnittstelle auszustatten. Dieser Artikel demonstriert die dazu notwendige Vorgehensweise anhand eines primitiven Oszillographen auf Arduino-Basis. Neben einigen Kniffen im Bereich der Bluetoothprogrammierung gibt es auch Tricks aus der Elektronikpraxis.

Daten aufnehmen und visualisieren

Fertige Prozessrechner mit Bluetooth sind teuer. Bei AliExpress finden sich Funkmodule wie das in Abbildung 1 gezeigte HC-06 bereits ab rund drei Euro. Ich möchte das Modul hier im Zusammenspiel mit einem Arduino Uno einsetzen, um Daten aufzunehmen und sie zur Visualisierung in Richtung des Windows-Smartphones zu senden.

bosbach_bluetooth_1.tif_fmt1.jpgAbb. 1: Das HC-06 ist nicht sonderlich teuer

Aus schaltungstechnischer Sicht ist das keine besonders komplexe Aufgabe. Der im AVR-Mikrocontroller verbaute ADC reicht für unsere Bedürfnisse aus, das Funkmodul kommuniziert über einen seriellen Port. Damit bin ich bei der in Abbildung 2 gezeigten Schaltung, die nicht besonders komplex ist.

bosbach_bluetooth_2.tif_fmt1.jpgAbb. 2: Vier Litzen verbinden Prozessrechner und Funkmodul

Aufmerksame Leser fragen sich an dieser Stelle mitunter, wieso das auf der Rückseite mit 3,3 Volt beschriftete Funkmodul hier mit einem 5-Volt-Arduino verbunden wird. Das liegt daran, dass die Ein- und Ausgänge dieses spezifischen Moduls auch mit 5-Volt-Signalspannung zurechtkommen. Das ist kein Freibrief für das beliebige Ignorieren von Spannungsvorschriften. Für daraus entstehende Schäden lehnt die Autorin jegliche Haftung ab.

Ein weiteres wichtiges Detail ist, dass an RXD und TXD angeschlossene Hardware den Brennprozess des Arduinos blockiert. Sie müssen das Bluetoothmodul also vom Prozessrechner trennen, bevor Sie ihn über die Arduino-IDE mit neuer Software versorgen.

Aufgrund der Einfachheit unseres „Oszillographen“ genügt es fürs Erste, wenn ich das Signal direkt an den Eingang des ADC anlege. In komplexeren Oszillographen muss man hier um einiges smarter vorgehen: In den Servicehandbüchern der 1970 und 1980 erschienenen Geräte finden sich oftmals komplette Innenschaltungen, die ein wunderbares Quell der Inspiration für eigene Frontend-Designs darstellen.

Übrigens: Die in Abbildung 1 gezeigte Realisierungsweise ist aus thermischer Sicht subideal. „Planare“ Lötstellen neigen laut dem Schaltungsexperten Bob Pease dazu, bei Temperaturänderungen auseinanderzubrechen.

Eine Frage der Akquise

Nun stellt sich die Frage, wie Hardware den Beginn des Sampling-Prozesses erkennt. Normale Oszillographen setzen dabei auf ein Konzept namens Triggering. Ein neuer Durchlauf des Signals beginnt immer dann, wenn die eingelesene Spannung einen als Trigger-Level bezeichneten Wert von unten nach oben durchschreitet. Ich löse dies durch einen Zustandsautomaten, der durch eine Char-Variable gesteuert wird:

char state; #define STA_WAITING_TRIG 0 #define STA_SENDING_FILES 1

Im Fall des Auftretens einer Triggerbewegung beginnt der eigentliche Sampling-Prozess. Ein von unten nach oben laufender Zähler weist dem ADC nacheinander Werte in einem Array zu, die mit den eingelesenen Informationen bevölkert werden (Listing 1).

Listing 1

void loop() { if(state==STA_WAITING_TRIG){ int tempIn=analogRead(A0); if(myLastIn<myTriggerLevel && tempIn>= myTriggerLevel){ digitalWrite(13, HIGH); for(int i=0;i<512;i++){ mySensorData[i]=analogRead(A0); } digitalWrite(13, LOW); state=STA_SENDING_FILES; mySendCounter=0; myLastIn=tempIn; } else{ myLastIn=tempIn; }

Bei der Fehlersuche bzw. Zustandsüberwachung von auf Prozessrechnern laufender Software ist es oftmals hilfreich, auf die LEDs zurückzugreifen, die auf der Planare verbaut sind. Mein „Minioszillograph“ schaltet die LED ein, wenn ein Triggerimpuls entgegengenommen wurde. Das menschliche Auge kann auch vergleichsweise kurzes Aufblinken von LEDs erkennen – das gilt übrigens nicht für kurzfristiges Ausschalten.

Aufgrund des vergleichsweise geringen Arbeitsspeicherausbaus des auf diesem Arduino verwendeten Mikrocontrollers müssen wir uns hier auf 512 Samples beschränken. Auf größeren Controllern können Sie insbesondere im Zusammenspiel mit externen Hochleistungs-ADCs und/oder einer dedizierten DMA-Engine wesentlich...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang