Sensoren und Steuerungen mit dem RN487x Bluetooth-Modul von Microchip
Erfahren Sie mehr über die RN487x-Familie von Bluetooth-Modulen und wie Sie sie für Ihre stromsparenden Peripherieprojekte konfigurieren.
Wenn Sie ein kleines Peripheriegerät mit geringem Stromverbrauch entwickeln, stehen die Chancen gut, dass Sie Bluetooth als Ihre Kommunikationsschicht in Betracht ziehen.
Mit der Weiterentwicklung des Standards haben sich Bluetooth-verbundene Geräte vermehrt. Es wurden Hardwaremodule eingeführt, die ein vollständiges SoC (System on Chip) für fast jedes Peripheriedesign bereitstellen. Die nordische nrf52840 ist ein gutes Beispiel. Der Systemkern ist ein 32-Bit-Prozessor und ein Multiprotokoll-Bluetooth-Funk. Dieser Kern ist von jeder Schnittstelle umgeben, die Sie möglicherweise benötigen; GPIO, PWM, USB, SPI, I 2 S und viele mehr.
Der Nachteil dieses und anderer leistungsstarker SoCs ist die Komplexität. Es ist eine beträchtliche Lernkurve und Entwicklungszeit erforderlich, um die erforderliche eingebettete Software für diese SoCs zu erstellen und zu integrieren.
Für einige der gängigsten Peripheriegerätetypen gibt es jedoch einfachere Alternativen. Wenn Ihr Peripheriegerät in erster Linie ein Fernbedienungssensor oder eine Fernbedienung mit einer begrenzten Anzahl von Kanälen (analog und digital) ist, können Sie Ihre Ziele wahrscheinlich mit dem RN487x-Modul von Microchip erreichen.
Diese Familie von zwei Bluetooth-Modulen bietet mehrere gleichzeitige bidirektionale digitale und analoge Kanäle. Das Modul wird auf spezifische Designs zugeschnitten, indem nur ein wenig Konfiguration im Modul-NVRAM gespeichert wird. Trotz der Einfachheit entspricht das Modul dennoch dem BLE-Standard (Bluetooth Low Energy), sodass es mit den neuesten Bluetooth-Clients, wie beispielsweise modernen Smartphones, kompatibel ist.
In dieser Serie demonstrieren wir die Verwendung des RN487x-Moduls. Wir werden für jede der vier Aufgaben ein funktionsfähiges, per Bluetooth verbundenes Peripheriegerät erstellen; einen digitalen Sensor, eine digitale Steuerung, einen analogen Sensor und eine analoge Steuerung. Jedes Beispiel enthält eine Nennschaltung und die erforderliche Konfiguration auf dem RN487x. Ein einfaches Anwendungsskript zum Trainieren des Peripheriegeräts wird ebenfalls bereitgestellt. Die Schnittstellenpunkte im Anwendungsskript sind gut dokumentiert; Maximierung des Potenzials, diese Peripheriegeräte als Subsysteme in größere Designs zu integrieren.
Designübersicht
Sehen wir uns eine grafische Aufschlüsselung für das Beispiel „Analogsensor“ an, mit den wichtigsten Schnittstellen in Rot.
Eine Darstellung eines Linux-Systems, das mit einem Peripheriegerät kommuniziert
Es gibt drei Systemelemente, die wir erstellen werden. Für das Peripheriegerät müssen wir Hardware erstellen, die unser Sensorsignal bereitstellt; der Wandler in diesem Beispiel. Er erzeugt eine variierende analoge Spannung. Für den Nutzer erstellen wir eine Anwendung zur Darstellung der Daten; das Python-Skript in diesem Beispiel.
Das Skript muss die GATT-API verwenden, um Informationen zum und vom Peripheriegerät zu übertragen. Wir müssen auch einige Konfigurationen im RN487x-Modul erstellen. Diese Konfiguration steuert den Datenfluss zwischen der Anwendung und der Hardware.
Komponentenauswahl
Es gibt zwei Module in der RN487x-Familie; die RN4870 und die RN4871. Sie unterscheiden sich in der Anzahl und Art der Pins, die für I/O vorgesehen sind. Sie finden diese Einschränkungen im Datenblatt und im Benutzerhandbuch, aber sie sind etwas verstreut. Unten sehen Sie eine Neuordnung des Pin-Budgets für die beiden Chips. Diese Anordnung sollte es einfacher machen, zu erkennen, welchen Chip Sie für Ihr Peripheriegerät benötigen.
Auf den c-Modulen stehen drei I/O-Pin-Typen zur Verfügung:
Typ | Beschreibung |
ADC | Analoger Eingang:Ein Eingangssignalpegel wird in einen numerischen Bereich umgewandelt. |
PWM | Analoge Ausgabe:Ein Zahlenpaar wird in eine Rechteckwelle umgewandelt. Die Zahlen steuern die Frequenz und das Tastverhältnis der Rechteckwelle. |
DIO | Digitaler Eingang oder Ausgang:Beim digitalen Eingang steht der hohe bzw. niedrige Signalpegel für 1 bzw. 0. Umgekehrt für Digitalausgang. |
Und hier sind die Pin-Budgets für die beiden Module:
RN4870
Bild aus dem RN487x-Datenblatt
Pin-Name/Funktion | P1_0 | P1_1 | P1_2 | P1_3 | P2_2 | P2_3 | P2_4 | P2_5 |
ADC | x | x | x | x | ||||
PWM | x | x | ||||||
DIO | x | x | x | x | x |
RN4871
Bild aus dem RN487x-Datenblatt
Pin-Name/Funktion | P1_2 | P1_3 |
ADC | x | |
PWM | ||
DIO | x | x |
Diese Tabellen sollten deutlich machen, dass Sie den 4871 verwenden, wenn Sie PWM nicht benötigen und nur ein oder zwei Signale verwalten müssen. Dies spart Ressourcen. Wenn Sie PWM benötigen oder mehr als zwei Signale verwalten möchten, dann brauchen Sie den 4870. Für unseren analogen Sensor haben wir nur einen analogen Eingang, daher würde der 4871 ausreichen. Wir würden das Signal an den P1_2 Pin des Moduls anschließen.
GATT-Profilschicht (Generic Attribute) des BLE-Protokollstapels
Wir sind fast bereit, einige echte Beispiele zu implementieren. Um die Benutzeranwendung zu schreiben, benötigen wir jedoch ein genaueres Verständnis der API, die wir verwenden, wenn wir mit dem Peripheriegerät sprechen.
Alle Bluetooth Low Energy-Geräte verwenden das Generic Attribute (GATT)-Profil für den Austausch strukturierter Daten. In diesem Modell ist das Peripheriegerät als Server organisiert, der eine einfache Datenbank enthält. Die Datenbank wiederum enthält eine Reihe von Variablen, die die Nutzdaten darstellen. Anwendungen wie unser Python-Skript sind als Clients organisiert, die die GATT-API verwenden, um namensbasierte Abfragen in die Datenbank zu stellen. Die API kann verwendet werden, um Werte aus der Datenbank zu lesen und Werte in die Datenbank zu schreiben.
Als Vorschau sind hier zwei nützliche GATT-API-Methodenaufrufe in Python:
gatt_rq.connect() gatt_rq.write_by_handle(vh_light, str(bytearray([8]))
Der erste wird verwendet, um eine Verbindung zum Peripheriegerät herzustellen. Der zweite schreibt einige Werte in die Datenbank; diese Werte werden sofort als digitale Ausgänge am Peripheriegerät ausgegeben. Das erste Argument der Methode „write“ ist ein Handle, das für den oder die digitalen Ausgänge spezifisch ist, die wir steuern möchten. Für ein funktional vollständiges Beispiel sind nur noch wenige Zeilen erforderlich.
Diese API wird als Teil von Bluetooth-Diensten in iOS, Android, Windows und Linux bereitgestellt. Die Beispiele in diesem Artikel sind in Python geschrieben und werden in vielen gängigen Linux-Distributionen ausgeführt.
Modulkonfiguration
Der Parameter ‚vh_handle‘ in der obigen Skriptmethode führt uns zum letzten Element in diesem Entwurfsmuster. Der Parameter ist eine Referenz in der Software für ein bestimmtes Signal auf physikalischer Ebene am Peripheriegerät. Aber wie wird dieser Datenpfad vervollständigt? Es gibt zwei Konfigurationselemente im NVRAM des RN487x, die dies tun; charakteristische Definition und Pinbindung.
- Eigenschaftsdefinition: Befehle, die Platz für Werte in der Datenbank zuweisen und jedem Wert eine eindeutige Kennung zur Bezugnahme durch Clientanwendungen zuweisen.
- Pin-Bindung: Skripte, die physikalische Signale in Datenbankwerte umwandeln und umgekehrt.
Die RN487x-Konfiguration wird mit einer benutzerdefinierten Befehlssprache in das Modul geladen. Im Anhang finden Sie eine allgemeine Anleitung zum Herstellen einer Konsolenverbindung zum Modul und zum Ausgeben von Konfigurationsbefehlen.
Nachdem wir diese Befehle ausgegeben haben, sieht die nichtflüchtige Konfiguration im RN487x etwa so aus:
Beachten Sie, dass alle Datenwerte innerhalb einer zweistufigen Hierarchie von „Diensten“ und „Eigenschaften“ existieren. Diese Organisation ist mehr als wir brauchen, wird aber für komplexe Systeme nützlich, in denen mehrere Sensoren und Steuerungen in logisch getrennten Diensten vorhanden wären.
Damit ist Teil eins unserer dreiteiligen Serie zum RN487x-Modul abgeschlossen. Die Teile 2 und 3 verwenden dasselbe Designmuster, um einen digitalen Eingang, eine digitale Steuerung, einen analogen Sensor und eine analoge Steuerung zu erstellen.
Teil 4 enthält auch einige Themen für weitere Studien, die für alle Beispiele gelten.
Im Folgenden finden Sie vor jeder Projektbeschreibung, die in anderen Artikeln folgt, einen Anhang mit Informationen zur Konfiguration Ihrer Module und deren Verwendung.
Verwenden einer Konsolenverbindung zum Konfigurieren des RN487x
Um das RN487x zu konfigurieren, versorgen Sie zuerst das Modul mit Spannung und stellen Sie eine serielle Verbindung zwischen dem Modul und einer Workstation her. Jede unserer Demonstrationsschaltungen verfügt über einen 3-poligen „Prog“-Jumper, der die erforderlichen RX-, TX- und GND-Signale freigibt. Wenn Sie sich nicht sicher sind, wie Sie diese Verbindung zu Ihrer Workstation herstellen, finden Sie hier eine hervorragende Anleitung.
Starten Sie einen Terminalemulator auf Ihrer Workstation. Ein besonders gut geeigneter und weit verbreiteter Emulator ist das Dienstprogramm „miniterm“, das in den meisten Python-Umgebungen enthalten ist. In einer Workstation-Shell kann es wie folgt gestartet werden:
python -m serial.tools.miniterm --eol LF /dev/ttyUSB0 115200
Dieses Beispiel zeigt einen Portnamen (/dev/ttyUSB0), der für ein Linux-System geeignet ist. Die Form des Portnamens unterscheidet sich für andere Betriebssysteme. Die Standardbaudrate für das Modul ist 115200 und es gibt wenig Grund, sie zu ändern.
Das RN487x-Modul befindet sich standardmäßig im DATA-Modus. Wir brauchen den COMMAND-Modus. Dieser Modus wird durch die Eingabe von drei Dollarzeichen („$$$“) in die Terminalemulatoranwendung aktiviert. Sie werden die Zeichen im Terminalfenster nicht sehen, aber das Ergebnis sollte eine Eingabeaufforderung sein, die vom RN4871 zurückgegeben wird:
CMD>
Versuchen Sie, die 'd'-Taste gefolgt von der 'Enter'-Taste zu drücken. Als Ergebnis sollten Sie Folgendes sehen:
Dies ist eine minimale Beschreibung des Modulstatus. Beachten Sie, dass der Befehlsinterpreter das von Ihnen eingegebene Zeichen ('d') nicht anzeigt. Sie sollten 'Echo' aktivieren, um dies zu beheben. Drücken Sie dazu die '+'-Taste gefolgt von der 'Enter'-Taste. Das Gerät sollte wie folgt reagieren:
Sie befinden sich jetzt an einem Punkt, an dem Sie verschiedene Konfigurationsaufgaben ausführen können, die im Rest dieses Projekts beschrieben werden. So erstellen Sie beispielsweise einen Dienst, indem Sie einfach einen vollständigen „PS“-Befehl in eine Zeile eingeben, gefolgt von der „Enter“-Taste. Beispiel:
CMD> PS,59c88760536411e7b114b2f933d5fe66 AOK
Jede der Projektkonfigurationen erfordert außerdem, dass ein mehrzeiliges Skript an den Modul-NVRAM übergeben wird. Diese Art von mehrzeiligen Befehlen erfordert etwas mehr Erklärung. Sie beginnen die Skripteingabe mit einem ‚WW‘-Befehl, gefolgt von ‚Enter‘. Geben Sie dann jede Skriptzeile ein. Jede Skriptzeile, auch die letzte Zeile, wird ebenfalls mit der Eingabetaste abgeschlossen.
Schließlich übergeben Sie das Skript, indem Sie die Taste ‚esc‘ drücken. Beispiel:
Gemeinsame Initialisierung des Moduls
Wenn Sie ein RN487x-Modul für eines der Beispiele in diesem Projekt verwendet haben oder das Modul für einen ganz anderen Zweck verwendet haben und das Modul für ein anderes Beispiel konfigurieren möchten, ist es möglich, dass das Modul eine Konfiguration hat die in Konflikt mit der nächsten beabsichtigten Verwendung stehen.
Die folgenden Schritte sollten vor jedem Beispiel in diesem Projekt durchgeführt werden:
- Löschen Sie alle vorhandenen Skripte.
- Aktiviere die Skriptverarbeitung.
- Löschen Sie alle vorhandenen Dienst-/Merkmalsdefinitionen.
- Entfernen Sie alle Sonderfunktionen von dem von uns verwendeten Pin (P1_2, Index 0A).
- Starten Sie das Modul neu.
Verwenden Sie den vorherigen Anhangsabschnitt, um auf die Befehlsshell des Moduls zuzugreifen. Verwenden Sie dann die folgende Befehlsfolge, um die erforderliche Initialisierung durchzuführen:
Linux-Setup zum Ausführen von Python-Beispielskripten erforderlich
Hardware
Das System, auf dem diese Skripte ausgeführt werden, benötigt natürlich Hardware, die Bluetooth Low Energy (BLE) unterstützt. BLE wurde in Version 4 eingeführt. Wenn Ihre Bluetooth-Hardware also eine niedrigere Version angibt, wird es für diese Beispiele wahrscheinlich nicht funktionieren.
Wenn Sie einen USB-Adapter für eine Workstation kaufen möchten, um diese Beispiele auszuprobieren, empfehle ich jeden Adapter, der den Qualcomm CSR8510 verwendet. Eine Instanz kann hier erworben werden.
Software
Dieses Setup wurde für Debian 10 verifiziert. Es sollte für Debian-basierte Distributionen wie Ubuntu anwendbar sein. Es gibt zwei Komponenten, auf die von diesen Beispielen direkt zugegriffen wird, die nicht standardmäßig in Debian 10 installiert sind;
- Das Python-Modul für den Zugriff auf den Bluetooth-Stack. Diese Komponente ist über das Paketverwaltungssystem verfügbar und heißt ‚python-bluez‘.
- Das Python-Modul speziell für Bluetooth-GATT-Aufrufe; ‚gattlib‘. Diese Komponente ist im offiziellen Python-Paketindex verfügbar (über das Dienstprogramm 'pip').
Die ‚pip‘-Installation von ‚gattlib‘ erstellt eine ELF-Bibliothek. Dieser Vorgang erfordert auch einige Tools und Bibliotheken.
Zusammenfassend muss eine Liste von Paketen vom Systempaketmanager angefordert werden, gefolgt von einer einzelnen Modulanfrage an „pip“. Ein Skript zum Ausführen dieser Aktionen wurde hier bereitgestellt. Wenn Sie sich entscheiden, das Skript auszuführen, müssen Sie ihm nach dem Download die Berechtigung zum Ausführen erteilen.
Referenzen
- RN487x-Datenblatt
- RN487x-Benutzerhandbuch
- GATT-API in Windows
- GATT-API in iOS
- GATT-API in Python
Schauen Sie zurück für die nächsten Teile dieser Projektserie, in denen wir die vollständigen Beispiele erstellen werden.
Springe zu den Projekten 1 und 2:Aufbau eines digitalen Eingangs und einer digitalen Steuerung.
Internet der Dinge-Technologie
- Die Synergie von mobilem IoT und Bluetooth LE
- Entwerfen mit Bluetooth Mesh:Chip oder Modul?
- Contrinex:Cloud-fähige intelligente Sensoren und Sicherheits-Lichtvorhänge mit Bluetooth-Schnittstelle
- ADLINK:Bereitstellung von KI vom Edge bis zur Cloud mit Edge AI Solutions und der NVIDIA EGX-Plattform
- Analoge Sensoren ohne analoge Eingänge auf dem Raspberry Pi
- Auslesen von analogen Sensoren mit Raspberry Pi und Zabbix Supervisor
- Was mache ich mit den Daten?!
- Nutzung von IoT-Daten vom Edge in die Cloud und zurück
- Digitalisierung und Lebensmittel- und Getränkeindustrie
- The Edge und IoT:Einblicke aus der IoT World 2019