Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Meine Motorrad-Telemetrie

Komponenten und Verbrauchsmaterialien

Arduino UNO
× 1
u-blox gps neo 7m
× 1
Mikrochip-Technologie LM35DT
× 1
SparkFun TMP006 - Infrarot-Temperaturausbruch
× 1
HC-05 Bluetooth-Modul
× 1
Ultraschallsensor - HC-SR04 (Generic)
× 2
SparkFun ADXL345
× 1
Ducati Monster
× 1
SparkFun ProtoShield Kit
× 1
Lötbares Breadboard Half Size
× 1
9-V-Batterie (generisch)
× 1
9-V-Batterieklemme
× 1
Jumper (generisch)
× 1
Lumia 650
× 1

Apps und Onlinedienste

Microsoft Azure
Microsoft Visual Studio 2015
Microsoft Blend
Arduino-IDE
GIMP
Fritzing

Über dieses Projekt

Jedes Mal, wenn ich ein neues Projekt beginne, versuche ich, etwas zu schaffen, indem ich die neuesten Technologien in Bezug auf meine Leidenschaften ausnutze. Für dieses Projekt entscheide ich mich, meine Leidenschaft für das Motorrad mit meinem Lieblingshobby zu verbinden (benutze den Arduino).

Die Idee

Ich war schon immer fasziniert von den Telemetriebildern, die ich im Fernsehen über MotoGP-Rennen sehe. Als ich Bilder wie unten sah, stellte ich mir vor, wie ich es mit meinem Lieblings-Gadget (Arduino) und meinen Programmierkenntnissen erstellen könnte.

Also beschloss ich, ein auf Arduino und Azure basierendes Telemetriesystem zu entwickeln, das einfach nachzubilden ist, damit alle Motorrad-Enthusiasten eines in ihrem Motorrad haben können.

Wie unten gezeigt, kann dieses Telemetriesystem die folgenden Informationen über Ihren Fahrstil abrufen:

  • Geschwindigkeit [Km/h]
  • GPS-Position (Breite/Länge)
  • Satelliteninformationen (Sat-Nummer, Hdop)
  • Höhe [Meter]
  • Schrägwinkel
  • Wheelie-Winkel
  • G Beschleunigung in den 3 Achsen [m/s^2]
  • Außentemperatur [°C]
  • Reifentemperatur hinten [°C]
  • Stoßdämpfer vorne [cm]
  • Rückenstoßdämpfer [cm]

Dazu habe ich ein Arduino Uno R3, einige Sensoren, ein in einem Windows Phone bereitgestelltes UWP und einige Azure-Dienste verwendet.

Der Arbeitsablauf ist im folgenden Bild beschrieben:

  • Phase 1 - Alle Telemetriedaten werden von der Steuereinheit erfasst etwa zweimal in der Sekunde (die Steuereinheit ist am Motorrad positioniert).
  • Phase 2 - Jedes Mal, wenn die Daten erfasst werden, werden die Daten per Bluetooth . gesendet von Arduino zu Windows Phone .
  • Phase 3 - Die Daten werden im Telefon angezeigt (weitere Informationen finden Sie im Abschnitt "Software") und werden dann über das 3G/4G-Netzwerk an den Azure IoT HUB gesendet .
  • Phase 4 - Auf Azure gibt es einen Stream Analytics Job das die Daten vom IoT HUB empfängt und die Informationen in einer SQL Azure Datenbank speichert.
  • Phase 5 - Auf Azure wurde eine WebApp bereitgestellt die die SQL-Datenbankdaten verwenden, um die Telemetriedaten in Echtzeit anzuzeigen (siehe Abschnitt Web-App)
  • Phase 6 - Die WebApp , verwendet einen Authentifizierungsprozess und zeigt alle Telemetrieinformationen in Diagrammen an. (Alle Daten werden mithilfe von Entity Framework aus der SQL Azure-Datenbank abgerufen)
  • Phase 7 - Alle in der SQL Azure-Datenbank gespeicherten Daten werden von einem Machine Learning . verarbeitet um Informationen über Ihren "Fahrstil" abzurufen. Der Umfang wird verstehen, wie Sie Ihren Fahrstil in Abhängigkeit von den Telemetrieparametern ändern können, um Ihre Fahrleistung zu verbessern.

Ich finde es ziemlich cool!!! Beschreiben wir das Projekt

Hardware-Setup

Meine Hardwarekonfiguration ist unten dargestellt.

Mein Hardware-Setup besteht aus:

  • 1 x Arduino Uno R3
  • 2 x Ultraschall-Entfernungsmodul HC-SR04 , Wird verwendet, um die Stoßdämpferverlängerung (vorne &hinten) zu bestimmen
  • 1 x Infrarot-Thermosäule kontaktloser Temperatursensor TMP006, verwendet, um die Reifentemperatur zu bestimmen (kann auch die Außentemperatur messen - Optional)
  • 1 x GPS-NEO7M , verwendet, um die GPS-Position, Geschwindigkeit, Höhe zu bestimmen
  • 1 x ADXL345 , Wird verwendet, um die G-Beschleunigung in 3 Achsen zu bewerten und den Neigungswinkel und den Wheelie-Winkel zu berechnen
  • 1 x LM35DT um die Außentemperatur zu bestimmen
  • 1 x HC-05 , Bluetooth-Modul, um zwischen Arduino und dem Windows-Telefon zu kommunizieren
  • 1 x Netzteil (generischer Akku oder mobile Powerbank )

SCHRITT 1 - Bluetooth-Verbindung

Ich habe die SoftwareSerial verwendet Bibliothek, um das Bluetooth-Modul mit dem Arduino zu verbinden und die drahtlose Kommunikation mit dem Windows Phone zu ermöglichen.

Ein HC-05 Für diesen Bereich wurde das Bluetooth-Modul ausgewählt. Es handelt sich um ein Bluetooth-Modul der Klasse 2 mit Serial Port Profile, das entweder als Master oder als Slave konfiguriert werden kann.

Der nächste Schritt war, den Standardnamen meines Bluetooth-Geräts zu ändern, der Standardname war HC-05 ... es war nicht "attraktiv"

So verwenden Sie dieses Gerät:

In Ihrem Arduino-Code:

  • fügen Sie die SoftwareSerial hinzu Bibliothek
  • definieren Sie den RX/TX-Port
  • initialisieren Sie die Kommunikation:
#include [...]SoftwareSerial BTSerial(10,11); // RX-TX[...]void setup(){BTSerial.begin(9600);[...]} 

Sie können jetzt jede gewünschte Zeichenfolge über Bluetooth senden, indem Sie die folgende Befehlszeile verwenden:

...BTserial.print("Hallo Hackster");... 

Die Kommunikation zwischen Windows Phone und Arduino ist jetzt fertig und es war sehr einfach!

SCHRITT 2 - GPS-Kommunikation

Die für dieses Zielfernrohr verwendete Hardware war ein GPS-NEO7M Modul, es ist ein stromsparendes GPS-Modul, das über 56 Kanäle verfügt und präzise Positionsaktualisierungen bei 10 Hz ausgibt.

Die Kommunikation zwischen Arduino und dem GPS-Modul erfolgt über die SoftwareSerial Bibliothek und Nutzung einer sehr interessanten Bibliothek namens TinyGPS++

Kommunikation mit diesem Sensor:

  • Definieren Sie den RX/TX-Port
  • inizialisiere das TinyGPS-Objekt
  • initialisieren Sie die Kommunikation

Siehe den folgenden Code:

#include #include // Definiere die serielle Verbindung mit der GPSSoftwareSerial ss(12,13); // RX-TX// Definiere ein TinyGPS-ObjektTinyGPSPlus gps;void setup(){// GPS Inizializes.begin(9600);[...]}void loop(){// Während GPS verfügbar ist, lies die Informationen während(ss .available()>0){if(gps.encode(ss.read())){if(gps.location.isValid()){double lat=gps.location.lat();double lon=gps.location .lng(); }}}[...]} 

SCHRITT 3 - Beschleunigungsmesser

Zur Ermittlung der Beschleunigungswerte in den 3 Achsen und zur Berechnung des Roll- und Nickwinkels (Lean- und Wheelie-Winkel) habe ich einen ADXL345 . verwendet

Der ADXL345 ist ein kleiner, dünner 3-Achsen-Beschleunigungsmesser mit extrem geringem Stromverbrauch und hoher Auflösung (13 Bit) bis zu ±16 g. Digitale Ausgabedaten werden als 16-Bit-Zweierkomplement formatiert und sind entweder über einen SPI . zugänglich (3- oder 4-Draht) oder I2C digitale Schnittstelle.

Die Kommunikation zwischen Arduino und dem ADXL345-Sensor erfolgt über die ADXL345.h Bücherei.

Es ist sehr wichtig zu verstehen, dass Sie beim Anschließen dieses Sensors die Erdbeschleunigung in den 3 Achsen bestimmen können, die Werte jedoch nicht sofort kalibriert werden. Sie müssen einen Code zum Einstellen des OFFSET erstellen.

Ich beschloss, den "Nullpunkt" in der ersten Schleife zu bestimmen. Um dies zu tun, ist die G-Beschleunigung in der ersten Schleife die Referenzwerte, die Sie von den nachfolgenden Messungen abziehen müssen.

 // erste Schleife zu if (i ==0) {refXg =Xg; refYg =Yg; refZg =Zg;i =1;} // Subtrahiere den NullpunktXg =Xg - refXg;Yg =Yg - refYg;Zg =Zg - refZg + 1; 

Dann müssen Sie den Neigungswinkel und den Wheelie-Winkel basierend auf den g-Beschleunigungskomponenten berechnen.

Unten sehen Sie die 2 einfachen mathematischen Gleichungen, um dies zu tun:

// Roll- und Pitch-Gleichungenroll =-(atan2(-fYg, fZg) * 180.0) / M_PI; Tonhöhe =(atan2(fXg, sqrt(fYg * fYg + fZg * fZg)) * 180.0) / M_PI; 

Bei diesem Projekt müssen Sie Folgendes berücksichtigen:

  • Z-Achse ist die natürliche Schwerkraftachse
  • Y-Achse ist die Bewegungsrichtung
  • X-Achse ist die seitliche Bewegung

Kommunikation mit diesem Sensor:

  • Inizialisieren Sie das ADXL345-Objekt
  • initialisieren Sie die Kommunikation

Jetzt können Sie die Beschleunigungsinformationen lesen, sehen Sie sich den folgenden Code an:

#include #include #include // Definiere die serielle Verbindung mit der GPSSoftwareSerial ss(12,13); // RX-TX// Definiere ein ADXL345 ObjectADXL345 acc;void setup(){// ADXL345 Inizializeacc.begin();[...]}void loop(){// Lese g Beschleunigungskomponentendouble Xg,Yg,Zg; acc.read(&Xg,&Yg,&Zg);} 

SCHRITT 4 - Reifentemperatur

Um die Reifentemperatur zu bestimmen, brauchte ich einen Sensor, der aus offensichtlichen Gründen den Reifen nicht berührt. Der einzigartige Weg war die Verwendung eines Infrarot-Temperatursensors. Dafür habe ich mich für einen TMP006 entschieden Sensor

Die TMP006 sind vollintegrierte MEMs Thermopile-Sensoren, die die Temperatur eines Objekts ohne direkten Kontakt messen. Die Thermosäule absorbiert passive Infrarotenergie von einem Objekt bei Wellenlängen zwischen 4 um bis 16 um innerhalb des vom Endbenutzer definierten Sichtfelds.

Die entsprechende Spannungsänderung an der Thermosäule wird digitalisiert und mit der Temperatursensormessung auf dem Chip über einen I2C . gemeldet

Jetzt stellt sich die Frage, wo muss ich meinen Sensor positionieren? Im Datenblatt finden Sie wichtige Informationen zum empfohlenen Abstand zwischen Sensor und Objekt.

Sie müssen die Regel beachten, dass der Abstand kleiner als der halbe Radius des Raumwinkels des Objekts sein muss.

Mit anderen Worten, meine Reifenbreite beträgt 160 mm, die halbe Breite ist der Radius (R) des Raumwinkels, sodass das Endergebnis von R 80 mm beträgt. Der empfohlene Abstand beträgt also 40 mm (oder weniger) , gleich R/2

Die Kommunikation zwischen Arduino und dem TMP006 wird mit der SerialSoftware erstellt Bibliothek und Adafruit_TMP006.h Bibliothek

#include #include "Adafruit_TMP006.h"/Variablen für TMP006-Funktionen**************************** **************/Adafruit_TMP006 tmp006;void setup(){}void loop(){// Leseobjekt IR-Temperatur float objt =tmp006.readObjTempC();// Sensortemperatur lesen ( Externe Temperatur)float-Diät =tmp006.readDieTempC();} 

SCHRITT 5 - Außentemperatur

Der Wert der Außentemperatur wurde mit LM35 . ermittelt Sensor (DT-Paket).

Die LM35-Serie sind Präzisions-Temperaturgeräte mit integriertem Schaltkreis 1 mit einer Ausgangsspannung, die linear proportional zur Celsius-Temperatur ist.

Jedes Grad Celsius erzeugt eine Zunahme/Abnahme-Spannung von 10 mV

Der Sensorwert wurde durch Lesen des Arduino-Analogeingangs (AI) bestimmt

int TempExtPin =A1; // Wählen Sie den Eingangsstift aus Float Celsius =0, Farhenheit =0; // Temperaturvariablenfloat Millivolt; int sensor;[...]sensor =analogRead(TempExtPin); // LM35-Wert Millivolt lesen =(Sensor / 1023.0) * 5000; // Millivolt-Ausgang VoltageCelsius =Millivolt / 10;  

SCHRITT 6 - Ultraschallposition

Der Zweck dieses Sensors besteht darin, die Auslenkung der Federung des Motorrads zu bestimmen.

Der HC-SR04 Messen der Zeit, die die Schallwellen brauchen, um nach dem Auftreffen auf ein Hindernis umzukehren. Der emittierte Schallwellenstrahl hat eine konische Form und das gleiche gilt für die von einem Hindernis reflektierten Wellen.

Die Schallwellengeschwindigkeit in der Luft bei 20°C beträgt ca. 343,4 m/s, in diesem Beispiel betrachten wir der Einfachheit halber den ungefähren Wert von 340 m/s .

Unter Berücksichtigung des kinematischen Gesetzes S=V x t (wobei S:Raum oder Verschiebung des Objekts, V:Geschwindigkeit, t:Zeit) können wir ankündigen, dass in unserem Fall die Entfernung S=0,034 x T . beträgt .

Wir müssen die Zeit durch 2 teilen, denn die Zeit, die wir umgerechnet haben, ist die Zeit, die verwendet wurde, um von den Wellen zurückzukommen. Die endgültige Formel lautet t ist die vom Sensor zurückgegebene Zeit in cm/Mikrosekunde ist:

S=0,034 x t/2

Unten sehen Sie ein Beispiel, mit dem Sie versuchen können, die Entfernung des Objekts zu bestimmen.

digitalWrite(triggerPort, LOW);// Sende 10 Mikrosekunden Impuls an triggerdigitalWrite(triggerPort, HIGH);delayMicroseconds(10);digitalWrite(triggerPort, LOW);lange Dauer =pulseIn( echoPort, HIGH);long r =0,034 * Dauer / 2; 

Der obige Code beschreibt gut, wie der Sensor funktioniert, aber Sie werden feststellen, dass dieser Code sehr langsam und schlecht funktioniert .

Für dieses Projekt habe ich beschlossen, die neue Bibliothek namens NewPing.h auszuprobieren Für weitere Details besuchen Sie bitte diesen Link und sehen Sie sich den vollständigen Arduino-Code des Projekts an.

Verwenden Sie NewPing.h Bibliothek ist ganz einfach.

  • Bibliothek einbeziehen
  • definieren Sie den Trigger- und Echoport des HC-SR04
  • initialisiert das Objekt
  • rufen Sie die ReadPositionPing-Funktion auf.
#include /************************************ ****** Variablen für HC RS04 Funktionen definieren**************************************** ******/// HC-RS04 Portsint triggerPort =2;int echoPort =3;// NewPing Setup von Pins und maximale DistanzNewPing Sonar(triggerPort, echoPort, 200);void setup(){}void loop() {/*** POSITION LESEN ***/int Pos=ReadPositionPing();}int ReadPositionPing(){unsigned int uS =sonar.ping();return sonar.convert_cm(uS);} 

Die UWP-Software

Die Software besteht aus einer Benutzeroberfläche, die über Bluetooth mit der Steuereinheit verbunden ist. Die Benutzeroberfläche zeigt alle vom Arduino gesendeten Daten an und sendet sie an IoTHub die Sensorwerte.

Die serielle Kommunikation zwischen Arduino und dem UWP wird interpretiert, indem aus dem Eingabestring gelesen wird.

Jede Zeichenfolge empfangen wird, indem überprüft wird, ob das START und ENDE Markierungen. Wenn die Eingabezeichenfolge richtig formatiert ist, spuckt die Anwendung die Informationen aus und zeigt sie auf der Benutzeroberfläche der Anwendung an.

Unten sehen Sie ein Beispiel für einen von Arduino gesendeten String, der die START/END-Marker enthält. Dieser String wird durch das "Pipe"-Zeichen geteilt, um die einzelnen Sensorwerte zu bestimmen:

$START|40.909409|N|9.520008|E|8|2|2016|15:46:42|0.09|0.000000|0|0|-0.21|0.00|0.00|-0.02|0.98|-|0.00| 35.19|29.58|16|10|$ENDE|

unterhalb der Array-Definition nach der Aufteilung des gesendeten Strings:

  • Position 0 - START-Marker
  • Position 1 - Breitengrad
  • Position 2 - N (Nord)
  • Position 3 - Längengrad
  • Position 4 - E (Ost)
  • Position 5 - Monat
  • Position 6 - Tag
  • Position 7 - Jahr
  • Position 8 - hh:MM.ss
  • Position 9 - Geschwindigkeit (Km/h)
  • Position 10 - Höhe (m)
  • Position 11 - Satelliten (Anzahl der Satelliten)
  • Platz 12 - hdop (Anzahl der verwendeten Satelliten)
  • Position 13 - rollen
  • Position 14 - Stellplatz
  • Position 15 - Xg
  • Position 16 - Yg
  • Position 17 - Zg
  • Platz 18 - Audio (Optional – derzeit deaktiviert )
  • Platz 19 - Entfernung (m)
  • Position 20 - Temperatur (Außentemperatur von LM35)
  • Position 21 - Temperatur Reifen (Reifentemperatur von TMP006)
  • Position 22 - Stoßdämpfer vorne (cm)
  • Position 23 - Rückenstoßdämpfer (cm)
  • Position 24 - ENDE-Markierung

Mit "Serial Monitor" der Arduino IDE können Sie sehen, wie der Arduino Code funktioniert:

Um alle von der Zentraleinheit über Bluetooth gesendeten Daten zu verwalten, habe ich eine universelle Windows-Anwendung entwickelt, die ein schönes Beispiel für die Leistungsfähigkeit des UWP ist. Wie Sie wissen, ist eine UWP eine Plattform, die es Ihnen ermöglicht, die Anwendung in allen Gerätefamilien mit Windows 10 an Bord auszuführen.

Die Benutzeroberfläche ist sehr einfach und intuitiv, auf der linken Seite sehen Sie die Bluetooth-Verbindungsfunktion, in der Mitte 3 Anzeigen zur Anzeige von Geschwindigkeit, Neigungswinkel und Wheelie-Winkel. Alle G-Komponenten werden angezeigt und rechts gibt es Informationen zu GPS-Position, Temperaturen und Stoßdämpferausschlägen.

Wie wird die App in Windows 10 Mobile bereitgestellt?

Mit Windows 10 SDK Preview Build 10166 hat Microsoft das Tool zur Windows 10 Anwendungsbereitstellung (WinAppDeployCmd.exe) eingeführt.

Die Windows 10-Anwendungsbereitstellung (WinAppDeployCmd) ist ein Befehlszeilendienstprogramm, das verwendet werden kann, um eine universelle Windows-App von einem Windows 10-PC auf jedem mobilen Windows 10-Gerät bereitzustellen. Es ermöglicht Benutzern, eine .AppX-Datei auf einem Gerät bereitzustellen, das über USB verbunden ist oder im selben Subnetz verfügbar ist, ohne Zugriff auf die vollständige Visual Studio-Lösung zu benötigen.

SCHRITT 1:

Versetzen Sie Ihr Mobilgerät zunächst in den "Entwicklermodus" (gehen Sie zu UPDATE &SICHERHEIT => FÜR ENTWICKLER ).

Schließen Sie danach Ihr Gerät über USB an und machen Sie es sichtbar USB-Verbindung (ein PIN-Code wird zurückgegeben)

SCHRITT 2:

Klicken Sie mit der rechten Maustaste auf Ihr Projekt =>Shop =>App-Pakete erstellen

SCHRITT 3:

Wählen Sie im Assistenten zum Erstellen von App-Paketen NEIN Wenn Sie ein lokales Paket erstellen möchten und klicken Sie auf WEITER . Wählen Sie danach die Prozessorplattformen für das Ziel aus. Wählen Sie für unseren Zweck die ARM-Plattform und klicken Sie auf ERSTELLEN .

Am Ende des Erstellungsprozesses gibt uns der Assistent eine lokale URL, wo das Paket erstellt wurde.

Wenn Sie die URL öffnen, finden Sie die Appx-Datei, die auf dem Gerät bereitgestellt werden kann.

SCHRITT 4:

Öffnen Sie eine Eingabeaufforderung und verschieben Sie Ihren Fokus auf C:\Program Files (x86)\Windows Kits\10\bin\x86\

und geben Sie die folgende Befehlszeile ein

WinAppDeployCmd install -file "C:\work\uwp\Gps\MotorbikeArduino\MotorbikeArduino\AppPackages\V1.35\MotorbikeArduino_1.0.35.0_Debug_Test\MotorbikeArduino_1.0.35.0_arm_Debug.appxbundle" -ip 127.0.0.1 -pin AAA123

(wobei AAA123 ist der PIN-Code, der von Ihrem Telefon zurückgegeben wird, das im Zuordnungsmodus an den USB angeschlossen ist)

Am Ende des Vorgangs wird die Anwendung auf Ihrem Gerät installiert und Sie können "zum Starten anheften":

AZUR

Jetzt können wir beschreiben, wie die Azure-Dienste konfiguriert werden. Für dieses Projekt müssen erstellt werden:

  • WebApp + SQL Azure
  • IoTHUB
  • Stream Analytics-JOB
  • Eine DeviceId, die verwendet wird, um Daten an IoTHUB zu senden .

OK, GEH! Haben Sie ein AZURE-Konto?

  • Falls NEIN, gehen Sie bitte zu https://azure.microsoft.com/ und erstellen Sie eine.
  • Wenn JA... GUT! Gehen Sie zu https://portal.azure.com

SCHRITT 1 – IoT Hub erstellen und konfigurieren:

Der IoTHUB ist der Zugangspunkt der Telemetriewerte zur Cloud.

Erstellen Sie Ihren IoTHub, klicken Sie auf Neu => Internet des Denkens => IoT-Hub und kompilieren Sie die Hub-Felder und klicken Sie auf Erstellen

Anschließend sehen Sie in Ihrem Azure-Dashboard möglicherweise den IoT HUB Bereitstellung und nach einigen Sekunden ist Ihr IoT HUB bereit.

Klicken Sie auf die neue Kachel in Ihrem Dashboard und gehen Sie zu Alle Einstellungen Klinge.

Sehen Sie Ihren IotHub Hostnamen und notiere:

In den Richtlinien für den gemeinsamen Zugriff klicken Sie auf den iothubowner -Richtlinie, und kopieren und notieren Sie sich dann die Verbindungszeichenfolge im iothubowner Klinge

Ok...Ihr Iot-Hub wurde erfolgreich erstellt, Sie sind fast bereit, ihn zu verwenden!

SCHRITT 2 – Stream Analytics erstellen und konfigurieren

Der Stream Analytics hat den Zweck, alle an den IoTHUB gesendeten Daten zu lesen und zu schreiben und in einer Datenbanktabelle zu speichern.

Erstellen Sie einen neuen Stream Analytics-Auftrag:

Klicken Sie auf Neu => Internet des Denkens => Stream Analytics-Job

Kompilieren Sie alle Felder und klicken Sie auf die Schaltfläche Erstellen.

Jetzt können wir Input/Output und die Abfrage des streamAnalityncs JOB konfigurieren.

Eingang einrichten – Quelle auswählen . In unserem Fall ist die Quelle der IoTHub

Ausgabe einrichten - Wählen Sie das Ziel aus. In unserem Fall ist die Ausgabe eine Tabelle der SQL Azure-Datenbank (Ich zeige Ihnen im nächsten Schritt, wie Sie eine SQL-Datenbank erstellen)

SCHRITT 3 – WebApp + SQL Azure erstellen

Gehen Sie zum Dashboard und wählen Sie WebApp+SQL (Neu .). => Netzwerk => Web + Handy => Web-App + Sql )

Konfigurieren Sie nun Ihre Webapp, indem Sie die folgenden Felder kompilieren:

  • App-Name
  • Wählen Sie ein Abonnement
  • Wählen Sie eine Ressourcengruppe (wenn Sie keine haben, erstellen Sie Ihre erste Ressourcengruppe)
  • Wählen Sie einen App Service-Plan und eine Preisstufe (für dieses Beispiel können Sie einen kostenlosen F1-Plan wählen)

Konfigurieren Sie Ihr SQL, erstellen Sie ein neues und wählen Sie den Namen , Preisstufe , Servername und fügen Sie Anmeldedaten für Administratoren hinzu :

Nun zurück zum SCHRITT 2 , sind wir nun bereit, die StreamAnalitycs-Abfrage zu erstellen. Klicken Sie auf die StreamAnalyticJob-Kachel und wählen Sie "Abfrage". Fügen Sie Ihre Anfrage in das rechte Feld ein.

Wie Sie sehen, beschreibt die Abfrage den Prozess-Workflow. Catch the data from "MyTelemetryInputHub" and save them into "SqlAzureMyTelemetry" ... easy&wonderful!!

At the end, we have only to start the JOB clicking the START Taste.

Create a DeviceId for HUB

This step is necessary in order to create a connection between my device and the IoTHUB. We need to create a new device identity and add into the ID registry of the IoT HUB.

For more information please visit the follow link

To generate a new one deviceId, you have to create a Console Application in Visual Studio.

In the NuGet Package Manager window, search and install the Microsoft.Azure.Devices package.

Add the below code In your Console application, replace your IoTHub Connection String and chose a deviceId alias (in my case the deviced is MyDucatiMonsterDevice ).

class Program{//Install-Package Microsoft.Azure.Devicesstatic RegistryManager registryManager;// Connection String HUBstatic string connectionString ="xxxxxxxxxxxxxx";static void Main(string[] args){registryManager =RegistryManager.CreateFromConnectionString(connectionString);AddDeviceAsync().Wait();Console.ReadLine();}// creates a new device identity with ID myFirstDeviceprivate async static Task AddDeviceAsync(){ string deviceId ="myDucatiMonsterDevice";Device device;try{device =await registryManager.AddDeviceAsync(new Device(deviceId));}catch (DeviceAlreadyExistsException){device =await registryManager.GetDeviceAsync(deviceId);}Console.WriteLine("Generated device key:{0}", device.Authentication.SymmetricKey.PrimaryKey);}} 

Run the console application (press F5) and generate your device key!

WEB application

At this point of the project i thinked about how can i see my telemetry data and how can i show them to my friends and share the results on the social media. to do that I decided to create a responsive web site in ASP .NET

The website consist in a dashboard contains all my telemetries. The data has been read using the Entity framework from SQL Azure.

You can discover the web site by the following url:

Has been created an account for all Hackster Users , SignIn using the following user/psw credentials:

User ID:demoPassword:demo 

The web site is look like this:

And look like this in mobile version:

When you create a web app in azure using the Free tier, the domain name will be something like this:

.azurewebsites.net

To change the domain name you have to buy one and on azure this is very simple! Follow this steps:

  • Go to your Azure dashboard and click on you web app Tile.
  • Select "Custom domains and SSL " and click on "Buy domains ".
  • Fill all fields (about your domain name and your contact informations)

Ducati Monster Wiring

Now is time to Introduce my motorbike, this is my Ducati Monster 695 that for this project has been the cavy.

Below some pictures about my Hardware (control unit) mounted onboard.

to measure the tyre temperature I created a bracket clamped behind the wheel.

One Ultrasonic ranging module HC-SR04 has been fixed under the front headlight. It misures the distance between headlight and front mudguard.

The other one Ultrasonic ranging module has been fixed under the bike seat in order to determined the back shock absorber measuring the distance between seat and rear tyre.

The central unit containing the Arduino, the GPS, the Accelerometer and the external temperature sensor has been fixed behind the seat.

And at the end, after the wiring, my motorbike is look like this

Machine Learning

The last idea of this project has been try to understand if exist a correlation between telemetries data in order to try to understand how to improve my driving style.

My data samples are not relatable because I make different routes every time and the traffic conditions are never the same. I think that a good condition should be use the system in a speedway. I Imagine that in a real race could be usefull to understand by telemetry if you can increase the speed or if you have to decrease the speed according to the output values.

The Machine Learning (ML) embodies the magic of software insights about the data, solves problems by giving information that represents a certain evolution. The ML understands how a given phenomenon will evolve according to the data in its knowledge.

The first approach using the ML is to do Experiments . Using the data, you can play and be able to do the analysis with the aim of investigating the phenomenon that interests us.

Ok let's go to discover the Azure Machine Learning

Go to https://studio.azureml.net and sign in using your Azure account.

On the left of the page click on "Studio"

You will be redirect to your personal Dashboard and now you will be ready to create experiments

  • In the experiments blade, Click NEW (on the left button of the page) .
  • The first step is to Import data that you would like to use in your ML. In my case I imported the data from SQL Azure.
  • Into my Table all data are varchar so i needed to convert it in float and excluding some bad data in order to have only best quality records. Below you can see the query used to import data
select CAST(speed as float) _speed, CAST(roll as float) _roll, CAST(pitch as float) _pitch, CAST(Xg as float) _Xg, CAST(Yg as float) _Yg, CAST(Zg as float) _Zg, CAST(TempExt as float) _TempExt, CAST(TempTyre as float) _TempTyre, CAST(FrontAbsorber as float) _FrontAbsorber, CAST(BackAbsorber as float) _BackAbsorberfrom mytelemetrywhere CAST(speed as float)>3 and CAST(FrontAbsorber as float)>0 and CAST(BackAbsorber as float)>0 and CAST(roll as float)<60 and CAST(roll as float)>-60 
  • Then add a SPLIT DATA element in order to use some data to Train your ML and decide the data percentage to use for the configuration.
  • A data portion will be used to configure the template and the other portion to see if your model works fine. This will allow me to assess the goodness.
  • Add a Train Model and decide what is the field that would you like the model guess and decide which algorithm use for your train.
  • Now we verify how he behaved the algorithm giving us a feeling of goodness, to do that we need to use "Score Model ". the SM accept in input 2 sources, the first one is from Train Model and the second one from the SPLIT DATA .
  • At the end we ready to estimate the model according to the test data, comparing them with those that have not yet used (Evaluate Model ).

Official Documentation about " Evaluate Model" can be found here

Below there is a sample experiment useful for comparing 2 algorithms using the Evaluation Model , the 2 algorithms are Two-class decision jungle and Two-class decision forest .

When you pass on a scored model for a "two classes" classification algorithm, the evaluation model generates metrics shown below:

Classification Models

The above metrics are reported for evaluating classification models.

(All metrics are reported but the models are ranked by the metric you select for evaluation)

  • Accuracy measures the goodness of a classification model as the proportion of true results to total cases. Accuracy =(TP + TN) / (TP + TN + FP + FN)
  • Precision is the proportion of true results over all positive results. Precision =TP / (TP + FP)
  • Recall is the fraction of all correct results returned by the model. Recall =TP / (TP + TN)
  • F-score is computed as the weighted average of precision and recall between 0 and 1, where the ideal F-score value is 1. F1 =2TP / (2TP + FP + FN)
  • AUC measures the area under the curve plotted with true positives on the y axis and false positives on the x axis. This metric is useful because it provides a single number that lets you compare models of different types.

As you can see, the Two-class decision forest Algorithm have an Accuracy , Precision ,Recall and F1 Score near the value equal to 1, so i suppose that my model is good described, GREAT !!!

For more details about Evaluate Model please visit the following LINK

Predictive Experiment:

It's time to move our attention on the predictive functionality of the machine learning.

The Training experiment will be convert to a predictive experiment, this feature allows to integrate in others applications the opportunity to use your model and based on your model have a Prediction.

For do that, has been created a new one Experiment, the data source has been the SQL Azure but this time the table used has been a new one. I tried to classify data based on telemetry values.

Now my data look like this and as you can see there is a new column named Scored that represents my classification:

Create the experiment like below, select the Train Model and add a Multiclass algorithm:

  • RUN the experiment and see the results:
  • Select the Train Model and click on SET UP WEB SERVICE => Predictive Web Service
  • Wait some seconds and your predictive service will be ready. Below you can see my Predictive Experiment layout:
  • Run this model and then deploy the web service by clicking on the DEPLOY WEB SERVICE button
  • Your service will be immediately ready to be used and a dashboard will appear, contain a "TEST" button where you can manually enter data and test your service
  • Click TEST button and compile all fields, use some fake values and see the Predictive result:

As you can see the result is equal to "SAFE DRIVING ", this mean that my Predictive service has predicted that my driving style is Safe and no action is needed.

If the Result has been for example "HIGH STRESS HIGH SPEED " that means that I have to reduce speed!

Conclusions about ML:

in this section we understand some things.

  • How configure an experiment in ML azure environment
  • we found that Two-class decision forest Algorithm well describe my motor bike telemetry and we train the ML for the predictive experiment using the Multiclass decision forest Algorithm
  • How to convert our Model in a Web Service creating a predictive experiment
  • we found some usefull information about my style of guide. Infact as you can see from the below graphs:

I prefer lean on the right and my lean angle doesn't depend for tyre temperature and from the speed. That mean that my tyres are high quality and in add I undestood that my motorbike prefers Wheelie when the tyre temperature is more than 35°C

Final Conclusions

In this project we covered many technological areas.

We discovered How is possible to create a funny Hardware using an Arduino and some sensor spending less then 60$ and using many services provided by microsoft.

We learned how is easy use Azure and how is interesting use Machine Learning Studio suite.

Has been realized a prototype that certainly needs improvements but i think is a good starting point for future developments from each people enthusiast about C#, Azure, Arduino and MotorBike.

Possible future Developments

To Improve this prototype i think will be usefull implements some things:

  • About the mobile app (UWP), in case that no 3G/4G network is available, the data are lost because i'm not able to send the data to azure. Would be usefull develop a buffering logic that in case of "no networking" available, stored the data and send them at a later time.
  • Create an APP for mobile platform using Xamarin, would be cool have an app who can run in Android OS and iOS also.
  • Use more precise sensors and increase performance/accuracy.
  • Make the central unit smaller, maybe using an Arduino MKR1000 .
  • Create a social media Webapp to share your motorbike travel and telemetries in order to suggest to biker users what is the dangerous curves and increase the safety.
  • Modify the source of the Machine Learning using the Steam Analytics. In my case i prefered use a sql AZURE datasource because it was not possible ride the bike and develop the ML in the same time :)

New branch work flow:

  • The new branch consists to sending back to device, through IoTHub , the information about the ML predictive service.
  • When the speed value is greater than 100 km/h a new one stream analyticsJob will send the telemetry data to Event Hub.
  • A cloud service reads this data from EventHub and send a request to the ML predictive service in order to have a score about the Driving Style .
  • The Cloud Service will send back the score to IoTHub , and IoTHub will send it to the device back (Windows Phone in this case)

... and now ENJOY !! :-) feel free to contact me for any questions and tips.

Code

UWP App C# Code
https://github.com/lentzlive/MotorbikeArduino
ARDUINO CODE - Bike Telemetry
https://github.com/lentzlive/BikeTelemetryArduino

Schaltpläne

circuit diagrams of the Telemetry system. On board scheda MotorbikeProject.fzz

Herstellungsprozess

  1. Sensortelemetrie 2.0.1
  2. Hindernisvermeidung durch künstliche Intelligenz
  3. Gyroskop-Spaß mit NeoPixel-Ring
  4. Arduino-Gamecontroller
  5. Wolkenkostüm
  6. Industrial Line Follower für die Materialversorgung
  7. Pixie:Eine Arduino-basierte NeoPixel-Armbanduhr
  8. Arduino-betriebene Wasserflasche
  9. Holiday Shadow Theatre
  10. Mobile Fernüberwachungskamera