Inhaltsverzeichnis:

Erstellen Sie einen tragbaren Motion Tracker (BLE von Arduino zu einer benutzerdefinierten Android Studio-App) - Gunook
Erstellen Sie einen tragbaren Motion Tracker (BLE von Arduino zu einer benutzerdefinierten Android Studio-App) - Gunook

Video: Erstellen Sie einen tragbaren Motion Tracker (BLE von Arduino zu einer benutzerdefinierten Android Studio-App) - Gunook

Video: Erstellen Sie einen tragbaren Motion Tracker (BLE von Arduino zu einer benutzerdefinierten Android Studio-App) - Gunook
Video: High Density 2022 2024, Juli
Anonim
Erstellen Sie einen tragbaren Motion-Tracker (BLE von Arduino zu einer benutzerdefinierten Android Studio-App)
Erstellen Sie einen tragbaren Motion-Tracker (BLE von Arduino zu einer benutzerdefinierten Android Studio-App)

Bluetooth Low Energy (BLE) ist eine Form der Bluetooth-Kommunikation mit geringem Stromverbrauch. Tragbare Geräte, wie die intelligenten Kleidungsstücke, die ich bei Predictive Wear entwerfe, müssen den Stromverbrauch nach Möglichkeit begrenzen, um die Batterielebensdauer zu verlängern, und häufig BLE verwenden. Die Bluetooth Special Interest Group (SIG) definiert mehrere Spezifikationen, die ein Gerät implementieren sollte, um mit einem Bluetooth-Gerät zu interagieren, die sie als "Profile" bezeichnen. Die meisten Anwendungsprofile verwenden das General Attribute Profile (GATT), um Daten über einen BLE-Link zu senden. Es gibt drei grundlegende Konzepte in BLE: Profile, Dienste und Attribute.

Bluetooth SIG hat viele gängige Profile, Dienste und Attribute standardisiert. Beim Erstellen benutzerdefinierter Hardware müssen jedoch häufig benutzerdefinierte Dienste und Attribute erstellt werden, und es stehen nicht viele Tutorials zur Verfügung. Erschwerend kommt hinzu, dass Adafruit keine Anleitung zum Entwerfen von mobilen Anwendungen bietet, die mit ihren BLE-Modulen gekoppelt werden können, und der Quellcode für ihre Anwendungen ist schwer zu rekonstruieren.

Dieses Tutorial soll erklären:

  1. So entwerfen Sie benutzerdefinierte GATT-Dienste und -Eigenschaften
  2. So programmieren Sie den Adafruit Bluefruit LE SPI Friend, um als GATT-Server für diese benutzerdefinierten Dienste und Eigenschaften zu fungieren
  3. So programmieren Sie ein Android-Gerät als GATT-Client, um die Daten vom GATT-Server zu lesen

Dieses Tutorial soll nicht in eine produktionsreife Anwendung übersetzbar sein - dies ist lediglich eine Einführung in BLE.

Hintergrund lesen:

  • Adafruit Bluefruit LE SPI Friend-Dokumentation
  • Wenn Sie mit GATT oder BLE nicht vertraut sind

Lieferungen

  • 1x - Ein Arduino-Gerät (ich verwende die UNO für dieses Tutorial)
  • 1x - Adafruit Blaufrucht LE SPI Friend
  • 8x - Stecker-zu-Stecker-Überbrückungsdrähte
  • Grundlegende Lötausrüstung (zum Löten von Headerpins am SPI Friend)
  • Ein Computer (um das Arduino-Gerät und das Android-Gerät zu programmieren)

Schritt 1: Entwerfen Sie kundenspezifische Dienste und Eigenschaften

EINLEITUNG

Dieser Artikel leistet hervorragende Arbeit, um zu erklären, wie benutzerdefinierte Dienste und Eigenschaften entwickelt werden. Ich empfehle dringend, diesen Artikel durchzulesen. Im Folgenden gebe ich einen sehr einfachen Überblick, der die Feinheiten zugunsten der Einfachheit vernachlässigt.

GATT-Dienste sind eine Sammlung von Merkmalen.

GATT-Merkmale enthalten eine Eigenschaft, einen Wert und null oder mehr Deskriptoren.

  • Eigenschaft: wie die Daten vom Client (Android App) behandelt werden sollen, z. B. lesen, schreiben, ohne Antwort schreiben, benachrichtigen und anzeigen.
  • Wert: der aktuelle Wert des Merkmals z. B. 1089
  • Deskriptoren: Dies sind Informationen über den Wert, z. B. die Einheit, Millisekunden

ENTWURF

Okay, jetzt wissen Sie, was Dienste und Merkmale sind. Wir müssen herausfinden, wie wir einige Dienste und Merkmale entwerfen, um unsere benutzerdefinierten Daten zu erhalten und sie von unserem GATT-Server (Arduino) an den Client (Android-App) zu senden. Betrachten wir ein Arduino-Gerät, das Daten von einem Beschleunigungsmesser-Gyroskop-Modul (AGM) sammelt. Wir wollen Gyroskop- und Beschleunigungsmessungen von drei Raumachsen und den Zeitpunkt dieser Messungen sammeln und diese Daten an unsere mobile Anwendung übermitteln. Wir möchten auch wissen, wann wir das Gerät aufladen müssen, also möchten wir den Akkustand lesen und an unsere mobile Anwendung übertragen.

1. Können wir alle Standarddienste und -merkmale nutzen?

Bluetooth SIG hat viele gängige Dienste und Eigenschaften standardisiert. Prüfen Sie zunächst, ob Sie einen der standardisierten Dienste und Merkmale übernehmen können. Die Standarddienste und -merkmale können viel kleinere Datenpakete verwenden, da der Universally Unique Identifier (UUID) 16 Bit beträgt, während benutzerdefinierte Dienste und Merkmale 128 Bit für ihre UUIDs verwenden müssen. Mehr zu UUIDs später. Bei unserer Suche haben wir einen standardisierten "Batterieservice" gefunden, der ein charakteristisches "Batteriestand" enthält.

2. Trennen Sie alle Datenwerte, die Sie über BLE senden möchten, in Merkmale und Dienste

Wir können unsere benutzerdefinierten Datenpunkte in sieben benutzerdefinierten Merkmalen innerhalb eines benutzerdefinierten Dienstes aufteilen. Diesen Service nennen wir "AGM-Service". Es enthält 7 Merkmale: x-Beschleunigung, y-Beschleunigung, z-Beschleunigung, x-Gyroskop, y-Gyroskop, z-Gyroskop und eine Zeitreferenz.

3. Bestimmen Sie die benötigten Eigenschaften für jedes Merkmal

Es gibt mehrere Eigenschaften, die ein Merkmal haben kann.

  1. Lesen: Der Client (Android App) kann einen Wert vom GATT Server (Arduino) lesen
  2. Schreiben: Der Client kann einen Wert vom GATT-Server ändern
  3. Hinweis: Der Client wird benachrichtigt, wenn sich ein Wert vom GATT-Server ändert und vom Client wird erwartet, dass er eine Bestätigung an den GATT-Server sendet
  4. Notify: Der Client wird benachrichtigt, wenn sich ein Wert vom GATT-Server ändert und vom Client nicht erwartet wird, dass er eine Bestätigung an den GATT-Server sendet

In diesem Tutorial stellen wir alle unsere Eigenschaften auf Lesen ein, mit Ausnahme des Batteriestands, der sowohl Benachrichtigungs- als auch Leseeigenschaften hat.

4. Generieren Sie UUIDs für benutzerdefinierte Dienste und Merkmale und finden Sie Standard-UUIDs

Wie ich bereits kurz erwähnt habe, verwenden die standardisierten Bluetooth-SIG-Dienste und -Eigenschaften eine 16-Bit-UUID, während benutzerdefinierte Dienste und Eigenschaften 128-Bit-UUIDs verwenden. Sehen Sie sich beispielsweise die dem Batteriedienst zugewiesene Nummer auf der Bluetooth-SIG an. Die zugewiesene Nummer 0x180F repräsentiert die 128 Bit UUID "0000180F-0000-1000-8000-00805F9B34FB". Die vier fett gedruckten Ziffern (16 Bits) sind für den jeweiligen standardisierten Dienst oder das besondere Merkmal eindeutig, während die anderen Zeichen zwischen allen standardisierten Diensten und Merkmalen erhalten bleiben. Da sowohl der Client als auch der GATT-Server wissen, dass sich standardisierte Dienste und Eigenschaften nur durch die fett gedruckten Ziffern unterscheiden, können die Paketgrößen der Daten erheblich reduziert werden. Benutzerdefinierte Dienste und Merkmale können jedoch nicht unter dieser gleichen Annahme funktionieren.

Stattdessen müssen benutzerdefinierte Dienste und Merkmale ungekürzte 128-Bit-UUIDs verwenden. Hier ist ein Online-UUID-Generator. Jede andere UUID als die standardisierte UUID ist für eine benutzerdefinierte UUID akzeptabel. Eine typische Namenskonvention besteht jedoch darin, einen benutzerdefinierten Service 00000001-… und Merkmale innerhalb dieses benutzerdefinierten Service 00000002-… zu bezeichnen.

Hier ist eine zusammenfassende Tabelle der Dienste und Merkmale, die wir zusammen mit ihren UUIDs implementieren werden

Schritt 2: Arduino-Code

AKTUALISIEREN SIE DEN BLUEFRUIT LE SPI FRIEND

Schließen Sie zuerst den Adafruit Bluefruit LE SPI Friend an, wie in ihrer Anschlussanleitung angegeben, und schalten Sie das Arduino-Gerät ein. Stellen Sie sicher, dass Sie den Adafruit Bluefruit LE SPI Friend auf Ihrem Android-Gerät finden, wenn Sie nach Bluetooth-Geräten suchen. Laden Sie die Bluefruit Connect App herunter, stellen Sie eine Verbindung zum Adafruit Bluefruit LE SPI Friend her und erlauben Sie ihm, die Firmware auf dem Gerät zu aktualisieren. Dieser Schritt ist wichtig. Wenn Sie die Firmware nicht aktualisieren, werden die Befehle, die Sie dem Gerät über Arduino ausgeben, wahrscheinlich fehlschlagen und es wird kein offensichtlicher Fehler angezeigt, um das Problem zu ermitteln.

Hier mein Repo für dieses Projekt. Sie können den vollständigen Arduino-Code hier sehen.

ÜBERBLICK

Ein paar wichtige Dinge zu beachten:

  1. In der Methode setup() müssen alle benutzerdefinierten UUIDs "-" zwischen jeweils zwei Zeichen enthalten. Beispielsweise funktioniert "AT+GATTADDCHAR=UUID128=00-00-00-05-62-7E-47-E5-A3-FC-DD-AB-D9-7A-A9-66". "AT+GATTADDCHAR=UUID128=00000005-627E-47E5-A3fCDDABD97AA966" funktioniert nicht.
  2. Beachten Sie, dass in der Methode setup() "battery.begin(true);" ruft "ble.reset();" automatisch. Wenn Sie den Batteriedienst nicht wie ich verwenden, müssen Sie das ble-Modul zurücksetzen (verwenden Sie "ble.reset();"), wobei ich den Befehl "battery.begin(true);" habe.
  3. Ändern Sie in der setup()-Methode "if (!ble.begin(false))" in "if (!ble.begin(true))", wenn Sie debuggen möchten.

Dieser Code ist ziemlich selbsterklärend. Ich habe Beschreibungen jeder benutzerdefinierten Methode hinzugefügt. Die Setup-Methode macht das BLE-Modul bereit, als GATT-Server zu fungieren. Die Schleifenmethode durchläuft einen gefälschten Sweep des Beschleunigungsmesser-Gyroskopmoduls (AGM) und generiert für diese Werte eine Zufallszahl von 1 bis 100. Die Batterie wird um 1% entladen, um die Batterienutzung zu simulieren. Sie können diesen Code einfach durch die tatsächlichen Sensorwerte ersetzen. Dieser Code geht davon aus, dass Sie ein Array von AGM-Daten mit einer Länge von 6 Messungen übertragen werden, anstatt eine einzelne Messung, da die Analyse eines Fensters von AGM-Daten wahrscheinlich nützlicher ist als ein einzelner Datenpunkt. Wenn Sie die Array-Größe ändern, beachten Sie, dass Änderungen im Android Studio-Code erforderlich sind. Um ein Daten-Array zu erfassen, müssen Sie zusammen mit den Daten, die Sie senden möchten, einen Zähler übergeben. Mit diesem Zähler können Sie in der Android Studio-Anwendung feststellen, wo Sie sich im Fenster befinden, sodass Sie darauf warten können, die fehlenden Datenpunkte im Fenster zu hören. Ohne den Zähler oder mit einem anders großen Array verpasst das Android Studio-Projekt entweder Datenpunkte oder bleibt in einer Schleife hängen und wartet auf die verbleibenden Datenpunkte, die es erwartet.

Schritt 3: Android Studio-Code

Hier mein Repo für dieses Projekt. Den vollständigen Android Studio-Code finden Sie hier.

ÜBERBLICK

Ich werde dies mit einem gründlicheren Überblick über die Funktionsweise des Arduino- und Android-Codes im Detail aktualisieren … Die App ist voll funktionsfähig, also schauen Sie sich den Code in der Zwischenzeit gerne selbst an.

Schritt 4: Endgültige Bewerbung

Endgültige Bewerbung
Endgültige Bewerbung
Endgültige Bewerbung
Endgültige Bewerbung
Endgültige Bewerbung
Endgültige Bewerbung

Herzliche Glückwünsche! Ihre Anwendung wird auf Ihr Telefon heruntergeladen und Ihr tragbares Gerät wird aufgeladen und überträgt Daten.

STARTEN SIE DIE APP

Um zu beginnen, klicken Sie auf das Launcher-Symbol für die Anwendung.

GENEHMIGUNGEN ERTEILEN

Sie müssen die Verwendung einiger Berechtigungen genehmigen, damit die App ordnungsgemäß funktioniert.

SUCHE NACH GERÄTEN

Klicken Sie anschließend auf die Schaltfläche "Scannen" in der oberen linken Ecke der App.

WÄHLEN SIE IHR TRAGBARES GERÄT

Wählen Sie als Nächstes Ihr tragbares Gerät aus der Liste der verfügbaren BLE-Geräte aus. Sein Name ist "BLE Arduino Hardware". GET DATAWarten Sie, während die App die AGM-Daten erhält und bestimmt, wo sich der Benutzer gerade befindet oder sich bewegt. SIEHE IHRE ERGEBNISSEÜberprüfen Sie die Ergebnisse auf dem Bildschirm! Klicken Sie auf die Sync-Schaltfläche, um die Daten erneut zu lesen.

Empfohlen: