Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Télémétrie de ma moto

Composants et fournitures

Arduino UNO
× 1
u-blox gps neo 7m
× 1
Microchip Technology LM35DT
× 1
SparkFun TMP006 - Déclenchement de la température infrarouge
× 1
Module Bluetooth HC-05
× 1
Capteur à ultrasons - HC-SR04 (Générique)
× 2
SparkFun ADXL345
× 1
Ducati Monster
× 1
Kit SparkFun ProtoShield
× 1
Planche à pain sans soudure demi-taille
× 1
Batterie 9V (générique)
× 1
Clip de batterie 9V
× 1
Câbles de raccordement (générique)
× 1
Lumia 650
× 1

Applications et services en ligne

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

À propos de ce projet

Chaque fois que je démarre un nouveau projet, j'essaie de créer quelque chose en exploitant les dernières technologies liées à mes passions. Pour ce projet, je décide de combiner ma passion pour la moto avec mon passe-temps préféré (utiliser l'Arduino).

L'idée

J'ai toujours été fasciné par les images de télémétrie que je vois à la télévision sur la course motogp. En voyant des images comme ci-dessous, j'ai imaginé comment je pourrais le construire en utilisant mon gadget préféré (Arduino) et mes connaissances en programmation.

J'ai donc décidé de développer un système de télémétrie basé sur Arduino et Azure, qui était facile à reproduire afin que tous les passionnés de moto puissent en avoir un dans leur moto.

Comme nous le montrerons ci-dessous, ce système de télémétrie pourra obtenir les informations suivantes sur votre style de conduite :

  • Vitesse [Km/h]
  • Position GPS (Latitude/Longitude)
  • Informations satellite (numéro Sat, Hdop)
  • Altitude [mètres]
  • Angle d'inclinaison
  • Angle de roue
  • G Accélération dans les 3 axes [m/s^2]
  • Température externe [°C]
  • Température du pneu arrière [°C]
  • Amortisseur avant [cm]
  • Amortisseur de dos [cm]

Pour cela j'ai utilisé un Arduino Uno R3, des capteurs, un UWP déployé dans un Windows Phone et des services Azure.

Le workflow est décrit dans l'image suivante :

  • Phase 1 - Toutes les données télémétriques sont acquises à partir de l'unité de contrôle environ deux fois par seconde (la centrale est positionnée sur la moto).
  • Phase 2 - Chaque fois que les données sont acquises, les données sont envoyées par bluetooth d'Arduino à Windows Phone .
  • Phase 3 - Les données sont affichées dans le téléphone (pour plus de détails, veuillez lire la section "Logiciel") puis envoyées par le réseau 3G/4G vers Azure IoT HUB .
  • Phase 4 - Sur Azure, il existe un Stream Analytics Job qui reçoit les données de l'IoT HUB et enregistre les informations dans une base de données SQL Azure.
  • Phase 5 - Sur azur a été déployée une WebApp qui utilisent les données de la base de données SQL afin d'afficher les données de télémétrie en temps réel (veuillez lire la section Application Web)
  • Phase 6 - La WebApp , utilise un processus d'authentification et affiche toutes les informations de télémétrie dans des graphiques. (Toutes les données sont récupérées à partir de la base de données sql azur à l'aide d'Entity Framework)
  • Phase 7 - Toutes les données enregistrées sur la base de données SQL azur sont traitées par un Machine Learning afin de récupérer des informations sur votre « style de conduite ». La portée sera de comprendre comment modifier votre style de conduite en fonction des paramètres de télémétrie afin d'améliorer vos performances de conduite.

Je pense que c'est plutôt cool !!! Commençons à décrire le projet

Configuration matérielle

Ma configuration matérielle est indiquée ci-dessous.

Ma configuration matérielle est composée de :

  • 1 x Arduino Uno R3
  • 2 x module de télémétrie à ultrasons HC-SR04 , Utilisé pour déterminer l'extension de l'amortisseur (avant et arrière)
  • 1 x capteur de température sans contact à thermopile infrarouge TMP006, utilisé pour déterminer la température des pneus (peut également déterminer la température extérieure - en option)
  • 1 x GPS-NEO7M , utilisé pour déterminer la position GPS, la vitesse, l'altitude
  • 1 x ADXL345 , Utilisé pour évaluer l'accélération G sur 3 axes et calculer l'angle d'inclinaison et l'angle de roue
  • 1 x LM35DT afin de déterminer la température extérieure
  • 1 x HC-05 , module bluetooth, pour communiquer entre arduino et windows phone
  • 1 x Alimentation (batterie générique ou banque d'alimentation mobile )

ÉTAPE 1 - Connectivité Bluetooth

J'ai utilisé le SofwareSerial bibliothèque pour connecter le module bluetooth avec l'Arduino et activer la communication sans fil avec le Windows Phone.

Un HC-05 Le module Bluetooth a été choisi pour cette portée. Il s'agit d'un module Bluetooth de classe 2 avec profil de port série, qui peut être configuré en tant que maître ou esclave.

L'étape suivante a consisté à modifier le nom par défaut de mon appareil Bluetooth, le nom par défaut était HC-05 ... ce n'était pas "attrayant"

Comment utiliser cet appareil :

Dans votre code Arduino :

  • inclure le SoftwareSerial bibliothèque
  • définir le port RX/TX
  • initialiser la communication :
#include [...]SoftwareSerial BTSerial (10,11); // RX-TX[...]void setup(){BTSerial.begin(9600);[...]} 

Vous êtes maintenant prêt à envoyer via Bluetooth chaque chaîne que vous souhaitez en utilisant la ligne de commande suivante :

...BTSerial.print("Bonjour Hackster");... 

La communication entre Windows Phone et Arduino est maintenant prête et c'était très simple !

ÉTAPE 2 - Communication GPS

Le matériel utilisé pour cette portée a été un GPS-NEO7M module, il s'agit d'un module GPS à faible consommation qui dispose de 56 canaux et génère des mises à jour précises de la position à 10 Hz.

La communication entre Arduino et le module GPS a été faite par le SoftwareSerial Bibliothèque et exploitant une bibliothèque très intéressante nommée TinyGPS++

Comment communiquer avec ce capteur :

  • Définir le port RX/TX
  • initialiser l'objet TinyGPS
  • initialiser la communication

Voir le code ci-dessous :

#include #include // Définir la connexion série avec le GPSSoftwareSerial ss(12,13); // RX-TX// Définir un TinyGPS ObjectTinyGPSPlus gps;void setup(){// GPS Inizializess.begin(9600);[...]}void loop(){// Pendant que le GPS est disponible, lisez les informations pendant (ss .available()>0){if(gps.encode(ss.read())){if(gps.location.isValid()){double lat=gps.location.lat();double lon=gps.location .lng(); }}}[...]} 

ÉTAPE 3 - Accéléromètre

Afin de déterminer les valeurs d'accélérations dans les 3 axes et pour calculer l'angle de roulis et de tangage (angle Lean et Wheelie), j'ai utilisé un ADXL345

Le ADXL345 est un petit accéléromètre mince à très faible consommation d'énergie à 3 axes avec une mesure haute résolution (13 bits) jusqu'à ±16 g. Les données de sortie numériques sont formatées en complément à deux de 16 bits et sont accessibles via un SPI (3 ou 4 fils) ou I2C interface numérique.

La communication entre Arduino et le capteur ADXL345 se fait à l'aide du ADXL345.h Bibliothèque.

Il est très important de comprendre que lorsque vous connectez ce capteur, vous pourrez déterminer l'accélération de la gravité dans les 3 axes mais les valeurs ne sont pas immédiatement calibrées. Vous devez créer un code pour régler l'OFFSET.

J'ai décidé de déterminer le "point zéro" dans la première boucle. Pour ce faire, l'accélération G dans la première boucle sera les valeurs de référence que vous devrez soustraire aux mesures suivantes.

// première boucle à if (i ==0) {refXg =Xg; réfYg =Yg ; refZg =Zg;i =1;}// soustraire le point zéroXg =Xg - refXg;Yg =Yg - refYg;Zg =Zg - refZg + 1; 

Ensuite, vous devez calculer l'angle d'inclinaison et l'angle de roue en fonction des composants d'accélération g.

Ci-dessous, vous pouvez voir les 2 équations mathématiques simples pour le faire :

// Roll &Pitch Equationsroll =-(atan2(-fYg, fZg) * 180.0) / M_PI; pitch =(atan2(fXg, sqrt(fYg * fYg + fZg * fZg)) * 180.0) / M_PI; 

Dans ce projet, vous devez considérer :

  • L'axe Z est l'axe de gravité naturel
  • L'axe Y est la direction du mouvement
  • L'axe X est le mouvement latéral

Comment communiquer avec ce capteur :

  • initialiser l'objet ADXL345
  • initialiser la communication

Vous êtes maintenant prêt à lire les informations d'accélération, consultez le code ci-dessous :

#include #include #include // Définir la connexion série avec le GPSSoftwareSerial ss(12,13) ; // RX-TX// Définir un objet ADXL345ADXL345 acc;void setup(){// ADXL345 Inizializeacc.begin();[...]}void loop(){// Lire g composants d'accélérationdouble Xg,Yg,Zg; acc.read(&Xg,&Yg,&Zg);} 

ÉTAPE 4 - Température des pneus

Pour déterminer la température des pneus, j'avais besoin d'un capteur qui, pour des raisons évidentes, ne touche pas le pneu. le moyen unique a été d'utiliser un capteur de température infrarouge. Pour cela j'ai décidé d'utiliser un TMP006 capteur

Les TMP006 sont des capteurs à thermopile MEMs entièrement intégrés qui mesurent la température d'un objet sans avoir à être en contact direct. La thermopile absorbe l'énergie infrarouge passive d'un objet à des longueurs d'onde comprises entre 4 um à 16 um dans le champ de vision défini par l'utilisateur final.

Le changement correspondant de tension à travers la thermopile est numérisé et signalé avec la mesure du capteur thermique sur puce via un I2C

Maintenant, la question est, où dois-je positionner mon capteur ? En regardant la fiche technique, vous pouvez trouver des informations importantes sur la distance recommandée entre le capteur et l'objet.

Vous devez observer la règle selon laquelle la distance doit être inférieure à la moitié du rayon de l'angle solide de l'objet.

en d'autres termes, ma largeur de pneu est de 160 mm, la demi-largeur sera le rayon (R) de l'angle solide, donc le résultat final de R sera de 80 mm. La distance recommandée sera donc de 40 mm (ou moins) , égal à R/2

La communication entre Arduino et le TMP006 est réalisé à l'aide du SerialSoftware bibliothèque et Adafruit_TMP006.h bibliothèque

#include #include "Adafruit_TMP006.h"/Variables pour les fonctions TMP006************************* **************/Adafruit_TMP006 tmp006;void setup(){}void loop(){// Lecture de la température IR de l'objet float objt =tmp006.readObjTempC();// Lecture de la température du capteur ( Température externe)régime flottant =tmp006.readDieTempC();} 

ÉTAPE 5 - Température externe

La valeur de la température extérieure a été déterminée à l'aide de et LM35 capteur (package DT).

La série LM35 sont des dispositifs de température à circuit intégré 1 de précision avec une tension de sortie linéairement proportionnelle à la température centigrade.

Chaque degré centigrade produit une tension d'augmentation/diminution de 10 mV

La valeur du capteur a été déterminée en lisant l'entrée analogique Arduino (AI)

int TempExtPin =A1; // sélectionnez la broche d'entrée float celsius =0, farhenheit =0; // les variables de température flottent en millivolts ; int sensor;[...]sensor =analogRead(TempExtPin); //Lire la valeur LM35 millivolts =( capteur / 1023.0) * 5000 ; //millivolts de sortie Voltagecelsius =millivolts / 10;  

ÉTAPE 6 - Positionnement par ultrasons

Le but d'utiliser ce capteur est de déterminer l'escursion des suspensions de la moto.

Le HC-SR04 mesurer le temps mis par les ondes sonores pour faire demi-tour après avoir rencontré un obstacle. Le faisceau émis par les ondes sonores a une forme conique et il en va de même pour les ondes réfléchies par un obstacle.

La vitesse des ondes sonores dans l'air à 20°C est d'environ 343,4 m/s, dans cet exemple pour simplifier nous considérerons la valeur approximative de 340 m/s .

Considérant la loi cinématique S=V x t (où S :espace ou déplacement de l'objet, V :vitesse, t :temps) on peut signaler que dans notre cas la distance est S=0.034 x T .

Nous devons diviser le temps par 2 car le temps que nous avons converti est celui utilisé pour aller et revenir par les vagues, la formule finale où t est le temps renvoyé par le capteur en cm/microseconde est :

S=0,034 x t/2

Ci-dessous, vous pouvez voir un exemple que vous pouvez essayer d'utiliser pour déterminer la distance de l'objet.

digitalWrite( triggerPort, LOW );// Envoie une impulsion de 10 micros à triggerdigitalWrite( triggerPort, HIGH );delayMicroseconds(10);digitalWrite(triggerPort, LOW);long duration =pulseIn( echoPort, HIGH );long r =0,034 * durée / 2 ; 

Le code ci-dessus décrit bien le fonctionnement du capteur mais vous découvrirez que ce code est très lent et mal exécuté .

Pour ce projet, j'ai décidé d'essayer la nouvelle bibliothèque nommée NewPing.h pour plus de détails, veuillez visiter ce lien et voir le code Arduino complet du projet.

Utilisez le NewPing.h la bibliothèque est très simple.

  • Inclure la bibliothèque
  • définir le déclencheur et le port d'écho du HC-SR04
  • initialise l'objet
  • appelez la fonction ReadPositionPing.
#include /************************************ *******Définir les variables pour les fonctions HC RS04****************************************** ******/// HC-RS04 portsint triggerPort =2;int echoPort =3;// NewPing configuration des broches et distance maximaleNewPing sonar (triggerPort, echoPort, 200);void setup(){}void loop() {/*** READ POSITION ***/int Pos=ReadPositionPing();}int ReadPositionPing(){unsigned int uS =sonar.ping();return sonar.convert_cm(uS);} 

Le logiciel UWP

Le logiciel se compose d'une interface utilisateur connectée à l'unité de contrôle via Bluetooth. L'interface utilisateur affiche toutes les données envoyées depuis l'Arduino et envoyées à IoTHub les valeurs du capteur.

La communication série entre Arduino et l'UWP est interprétée en lisant à partir de la chaîne d'entrée.

Chaque chaîne reçu est validé en vérifiant qu'il contient le START et FIN Marqueurs. Si la chaîne d'entrée est correctement formatée, l'application crachera les informations et les affichera sur l'interface utilisateur de l'application.

Ci-dessous, vous pouvez voir un exemple de chaîne envoyée depuis Arduino qui contient les marqueurs START/END, cette chaîne sera divisée par le caractère "pipe" afin de déterminer les valeurs de chaque capteur :

$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|$END|

sous la définition du tableau après la division de la chaîne envoyée :

  • Position 0 - Marqueur START
  • Position 1 - Latitude
  • Position 2 - N (Nord)
  • Position 3 - Longitude
  • Position 4 - E (Est)
  • Position 5 - mois
  • Position 6 - jour
  • Position 7 - année
  • Position 8 - hh:MM.ss
  • Position 9 - vitesse (Km/h)
  • Position 10 - altitude (m)
  • Position 11 - satellites (nombre de satellites)
  • Position 12 - hdop (nombre de satellites utilisés)
  • Position 13 - rouler
  • Position 14 - pitch
  • Position 15 - Xg
  • Position 16 - Yg
  • Position 17 - Zg
  • Position 18 - Audio (Facultatif-désactivé actuellement )
  • Position 19 - Distance (m)
  • Position 20 - Température (Température externe par LM35)
  • Poste 21 - Pneu de température (température du pneu de TMP006)
  • Position 22 - Amortisseur avant (cm)
  • Position 23 - Amortisseur de dos (cm)
  • Poste 24 - Marqueur de fin

par "Serial Monitor" de l'IDE Arduino, vous pouvez voir comment fonctionne le code Arduino :

Afin de gérer toutes les données envoyées depuis l'unité centrale via Bluetooth, j'ai développé une application Windows universelle qui est un bel exemple de la puissance de l'UWP. Comme vous le savez, un UWP est une plate-forme qui vous permet d'exécuter l'application dans toutes les familles d'appareils avec Windows 10 intégré.

L'interface utilisateur est très simple et intuitive, sur le côté gauche, vous pouvez voir la fonction de connexion Bluetooth, au milieu 3 jauges utilisées pour afficher la vitesse, l'angle d'inclinaison et l'angle de roue. Tous les composants G sont affichés et sur la droite il y a des informations sur la position GPS, les températures et les excursions d'amortisseur.

Comment déployer l'application dans Windows 10 Mobile ?

Avec Windows 10 SDK Preview Build 10166, Microsoft a introduit l'outil de déploiement d'applications Windows 10 (WinAppDeployCmd.exe).

Le déploiement d'applications Windows 10 (WinAppDeployCmd) est un utilitaire de ligne de commande qui peut être utilisé pour déployer une application Windows universelle à partir d'un PC Windows 10 vers n'importe quel appareil mobile Windows 10. Il permet aux utilisateurs de déployer un fichier .AppX sur un appareil connecté via USB ou disponible sur le même sous-réseau sans avoir besoin d'accéder à la solution complète de Visual Studio.

ÉTAPE 1 :

Tout d'abord déplacez votre appareil mobile en "Mode développeur" (allez dans MISE À JOUR ET SÉCURITÉ => POUR DÉVELOPPEUR ).

après cela, connectez votre appareil via USB et rendez-le visible connexion USB (un code PIN vous sera retourné)

ÉTAPE 2 :

Faites un clic droit sur votre Projet =>Magasin =>Créer des packages d'applications

ÉTAPE 3 :

Dans l'assistant de création de packages d'applications, sélectionnez NON Si vous souhaitez créer un package local et cliquez sur SUIVANT . Après cela, choisissez les plates-formes de processeur à cibler. Dans notre cas, choisissez la plate-forme ARM et cliquez sur CRÉER .

À la fin du processus de création, l'assistant nous donne une URL locale où le package a été créé.

en ouvrant l'URL, vous trouverez le fichier Appx disponible pour être déployé sur l'appareil.

ÉTAPE 4 :

Ouvrez une invite de commande et déplacez votre focus vers C:\Program Files (x86)\Windows Kits\10\bin\x86\

et tapez la ligne de commande suivante

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

(où AAA123 est le code PIN renvoyé par votre téléphone connecté à l'USB en mode Association)

À la fin du processus, l'application sera installée sur votre appareil et vous pourrez « épingler pour démarrer » :

AZURE

Nous sommes maintenant prêts à décrire comment configurer les services Azure. Pour ce projet il faudra créer :

  • WebApp + SQL Azure
  • IoTHUB
  • JOB d'analyse de flux
  • Un DeviceId qui sera utilisé pour envoyer des données à IoTHUB .

OK VAS-Y! Avez-vous un compte AZURE ?

  • Si NON, accédez à https://azure.microsoft.com/ et créez-en un.
  • Si OUI... BIEN ! Allez sur https://portal.azure.com

ÉTAPE 1 - Créer et configurer IoT Hub :

L'IoTHUB est le point d'accès des valeurs de télémétrie au Cloud.

Créez votre IoTHub, Cliquez sur Nouveau => Internet de la pensée => IdO Hub et compilez les champs Hub et cliquez sur Créer

Par la suite, dans votre tableau de bord Azure, vous pourrez voir le IoT HUB déploiement et après quelques secondes, votre IoT HUB sera prêt.

Cliquez sur la nouvelle vignette dans votre tableau de bord et accédez à Tous les paramètres lame.

Voir votre IotHub Nom d'hôte et notez :

Dans les Politiques d'accès partagé lame, cliquez sur iothubowner stratégie, puis copiez et notez la chaîne de connexion dans iothubowner lame

Ok... votre hub Iot a été créé avec succès, vous êtes presque prêt à l'utiliser !

ÉTAPE 2 - Créer et configurer l'analyse de flux

Le flux Analytics a pour but de lire et d'écrire toutes les données envoyées à l'IoTHUB et de les enregistrer dans une table de base de données.

Créez une nouvelle tâche Stream Analytics :

Cliquez sur Nouveau => Internet de la pensée => Tâche d'analyse de flux

Compilez tous les champs et cliquez sur le bouton Créer.

Nous sommes maintenant prêts à configurer Input/Output et la requête du JOB streamAnalityncs.

Configurer l'entrée - Sélectionnez la source . Dans notre cas la source sera l'IoTHub

Configurer la sortie - Sélectionnez la destination. Dans notre cas, la sortie sera une table de la base de données SQL Azure (je vais vous montrer comment créer une base de données sql à l'étape suivante)

ÉTAPE 3 - Créer une WebApp + SQL Azure

Accédez au tableau de bord et sélectionnez WebApp+SQL (Nouveau => Mise en réseau => Web + Mobile => Application Web + SQL )

Configurez maintenant votre webapp en compilant les champs suivants :

  • Nom de l'application
  • Choisissez un abonnement
  • Choisissez un groupe de ressources (si vous n'en avez pas, créez votre premier groupe de ressources)
  • Choisissez un plan de service d'application et un niveau de tarification (pour cet exemple, vous pouvez envisager de choisir un plan gratuit F1)

Configurez votre SQL, créez-en un nouveau et choisissez le nom , niveau de tarification , nom du serveur et ajoutez les identifiants de connexion administrateur :

Revenons maintenant à l'ÉTAPE 2 , nous sommes maintenant prêts à créer la requête StreamAnalitycs. Cliquez sur la vignette StreamAnalyticJob et sélectionnez « Requête ». Insérez votre requête dans le panneau de droite.

Comme vous pouvez le voir, la requête décrit le workflow du processus. 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 bouton.

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 bouton
  • 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

Schémas

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

Processus de fabrication

  1. Télémétrie du capteur 2.0.1
  2. Évitement d'obstacles à l'aide de l'intelligence artificielle
  3. Gyroscope amusant avec l'anneau NeoPixel
  4. Contrôleur de jeu Arduino
  5. Costume nuage
  6. Suiveur de ligne industrielle pour la fourniture de matériaux
  7. Pixie :une montre-bracelet NeoPixel basée sur Arduino
  8. Bouteille d'eau alimentée par Arduino
  9. Théâtre d'ombres des Fêtes