Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Telemetría de mi moto

Componentes y suministros

Arduino UNO
× 1
u-blox gps neo 7m
× 1
Tecnología de Microchip LM35DT
× 1
SparkFun TMP006 - Ruptura de temperatura infrarroja
× 1
Módulo Bluetooth HC-05
× 1
Sensor ultrasónico - HC-SR04 (genérico)
× 2
SparkFun ADXL345
× 1
Ducati Monster
× 1
Kit SparkFun ProtoShield
× 1
Protoboard sin soldadura de tamaño medio
× 1
batería de 9V (genérica)
× 1
Clip de batería de 9V
× 1
Cables de puente (genéricos)
× 1
Lumia 650
× 1

Aplicaciones y servicios en línea

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

Acerca de este proyecto

Cada vez que comienzo un nuevo proyecto trato de crear algo explotando las últimas tecnologías relacionadas con mis pasiones. Para este proyecto decido combinar mi pasión por la motocicleta con mi pasatiempo favorito (usar el Arduino).

La idea

Siempre me han fascinado las imágenes de telemetría que veo en la televisión sobre la carrera de motogp. Al ver imágenes como las de abajo, imaginé cómo podría construirlo usando mi dispositivo favorito (Arduino) y mis conocimientos de programación.

Entonces decidí desarrollar un sistema de telemetría basado en Arduino y Azure, que fuera fácil de replicar para que todos los entusiastas de las motocicletas pudieran tener uno en su motocicleta.

Como se mostrará a continuación, este sistema de telemetría podrá obtener la siguiente información sobre su estilo de conducción:

  • Velocidad [km / h]
  • Posición GPS (latitud / longitud)
  • Información de satélite (número de satélite, Hdop)
  • Altitute [metros]
  • Ángulo de inclinación
  • Ángulo de caballito
  • G Aceleración en los 3 ejes [m / s ^ 2]
  • Temperatura externa [° C]
  • Temperatura del neumático trasero [° C]
  • Amortiguador delantero [cm]
  • Amortiguador trasero [cm]

Para ello utilicé un Arduino Uno R3, algunos sensores, una UWP implementada en un Windows Phone y algunos servicios de Azure.

El flujo de trabajo se describe en la siguiente imagen:

  • Fase 1 - Todos los datos de telemetría se obtienen de la unidad de control aproximadamente dos veces por segundo (la unidad de control está colocada en la motocicleta).
  • Fase 2 - Cada vez que se adquieren los datos, los datos se envían por bluetooth desde Arduino a Windows Phone .
  • Fase 3 - Los datos se muestran en el teléfono (para obtener más detalles, lea la sección "Software") y luego se envían por red 3G / 4G a Azure IoT HUB .
  • Fase 4 - En azure hay un Trabajo de análisis de flujo que recibe los datos del IoT HUB y guarda la información en una base de datos SQL Azure.
  • Fase 5 - En azure se ha implementado una WebApp que utilizan los datos de la base de datos SQL para mostrar los datos de telemetría en tiempo real (lea la sección Aplicación web)
  • Fase 6 - La WebApp , utiliza un proceso de autenticación y muestra toda la información de telemetría en gráficos. (Todos los datos se recuperan de la base de datos sql azure usando Entity Framework)
  • Fase 7 - Todos los datos guardados en la base de datos SQL azure son procesados ​​por un Machine Learning para recuperar información sobre su "estilo de conducción". El alcance comprenderá cómo modificar su estilo de conducción en función de los parámetros de telemetría para mejorar su rendimiento de conducción.

¡¡¡Creo que ES MUY BUENO !!! Comencemos a describir el proyecto

Configuración de hardware

Mi configuración de hardware se muestra a continuación.

Mi configuración de hardware se compone de:

  • 1 x Arduino Uno R3
  • 2 x módulo de rango ultrasónico HC-SR04 , Se utiliza para determinar la extensión del amortiguador (delantero y trasero)
  • 1 x sensor de temperatura sin contacto de termopila infrarroja TMP006, se utiliza para determinar la temperatura de la llanta (también puede determinar la temperatura externa - opcional)
  • 1 x GPS-NEO7M , utilizado para determinar la posición GPS, la velocidad, la altitud
  • 1 x ADXL345 , Se utiliza para evaluar la aceleración G en 3 ejes y calcular el ángulo de inclinación y el ángulo de caballito
  • 1 x LM35DT para determinar la temperatura externa
  • 1 x HC-05 , módulo bluetooth, para comunicarse entre arduino y el teléfono windows
  • 1 x Fuente de alimentación (batería genérica o banco de energía móvil )

PASO 1:conectividad Bluetooth

Usé SofwareSerial biblioteca para conectar el módulo bluetooth con Arduino y habilitar la comunicación inalámbrica con Windows Phone.

Un HC-05 Se eligió el módulo Bluetooth para este alcance, es un módulo bluetooth de clase 2 con perfil de puerto serie, que se puede configurar como maestro o esclavo.

El siguiente paso ha sido cambiar el nombre predeterminado de mi dispositivo Bluetooth, el nombre predeterminado era HC-05 ... no era "atractivo"

Cómo utilizar este dispositivo:

En su código Arduino:

  • incluir SoftwareSerial biblioteca
  • defina el puerto RX / TX
  • inicializar la comunicación:
  #include  [...] SoftwareSerial BTSerial (10,11); // RX-TX [...] void setup () {BTSerial.begin (9600); [...]}  

Ahora está listo para enviar por Bluetooth cada cadena que desee usando la siguiente línea de comando:

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

¡La comunicación entre Windows Phone y Arduino ya está lista y fue muy fácil!

PASO 2:Comunicación GPS

El hardware utilizado para este visor ha sido un GPS-NEO7M módulo, es un módulo GPS de baja potencia que tiene 56 canales y genera actualizaciones de posición precisas a 10 Hz.

La comunicación entre Arduino y el Módulo GPS ha sido realizada por SoftwareSerial Biblioteca y explotación de una biblioteca muy interesante llamada TinyGPS ++

Cómo comunicarse con este sensor:

  • Defina el puerto RX / TX
  • inicializar el objeto TinyGPS
  • inicializar la comunicación

Vea el código a continuación:

  #include  #include  // Defina la conexión serial con GPSSoftwareSerial ss (12,13); // RX-TX // Definir un objeto TinyGPSTinyGPSPlus gps; void setup () {// GPS Inizializess.begin (9600); [...]} void loop () {// Mientras el GPS está disponible, lea la información mientras (ss .available ()> 0) {if (gps.encode (ss.read ())) {if (gps.location.isValid ()) {double lat =gps.location.lat (); double lon =gps.location .lng (); }}} [...]}  

PASO 3:Acelerómetro

Para determinar los valores de aceleración en los 3 ejes y para calcular el ángulo de balanceo y cabeceo (ángulo de inclinación y caballito), utilicé un ADXL345

El ADXL345 es un acelerómetro de 3 ejes, pequeño, delgado, de potencia ultrabaja, con medición de alta resolución (13 bits) de hasta ± 16 g. Los datos de salida digital están formateados como complemento a dos de 16 bits y se puede acceder a ellos a través de un SPI (3 o 4 hilos) o I2C interfaz digital.

La comunicación entre Arduino y el sensor ADXL345 ocurre usando el ADXL345.h Biblioteca.

Es muy importante entender que cuando conecte este sensor podrá determinar la aceleración de la gravedad en los 3 ejes pero los valores no se calibran inmediatamente. Necesita crear un código para configurar el OFFSET.

Decidí determinar el "punto cero" en el primer bucle. Para ello, la aceleración G en el primer bucle serán los valores de referencia que tendrás que restar a las siguientes medidas.

  // primer bucle a if (i ==0) {refXg =Xg; refYg =Yg; refZg =Zg; i =1;} // restar el punto ceroXg =Xg - refXg; Yg =Yg - refYg; Zg =Zg - refZg + 1;  

Luego, debe calcular el ángulo de inclinación y el ángulo de caballito en función de los componentes de aceleración g.

A continuación, puede ver las 2 ecuaciones matemáticas simples para hacer eso:

  // Ecuaciones Roll &Pitchroll =- (atan2 (-fYg, fZg) * 180.0) / M_PI; tono =(atan2 (fXg, sqrt (fYg * fYg + fZg * fZg)) * 180.0) / M_PI;  

En este proyecto debes considerar:

  • El eje Z son los ejes de gravedad natural
  • El eje Y es la dirección del movimiento
  • El eje X es el movimiento lateral

Cómo comunicarse con este sensor:

  • inicializar el objeto ADXL345
  • inicializar la comunicación

Ahora que está listo para leer la información de aceleración, consulte el siguiente código:

  #include  #include  #include  // Defina la conexión en serie con GPSSoftwareSerial ss (12,13); // RX-TX // Definir un objeto ADXL345 ADXL345 acc; void setup () {// ADXL345 Inizializeacc.begin (); [...]} void loop () {// Leer g componentes de aceleracióndouble Xg, Yg, Zg; acc.read (&Xg, &Yg, &Zg);}  

PASO 4:Temperatura de los neumáticos

Para determinar la temperatura del neumático, necesitaba un sensor que, por razones obvias, no toque el neumático. la forma única ha sido utilizar un sensor de temperatura por infrarrojos. Para hacer eso, decidí usar un TMP006 sensor

Los TMP006 son sensores de termopila MEM totalmente integrados que miden la temperatura de un objeto sin tener que estar en contacto directo. La termopila absorbe energía infrarroja pasiva de un objeto en longitudes de onda entre 4 um hasta 16 um dentro del campo de visión definido por el usuario final.

El cambio correspondiente en el voltaje a través de la termopila se digitaliza y se informa con la medición del sensor térmico del troquel en el chip a través de un I2C

Ahora la pregunta es, ¿dónde tengo que colocar mi sensor? Al mirar la hoja de datos, puede encontrar información importante sobre la distancia recomendada entre el sensor y el objeto.

Debe observar la regla de que la distancia debe ser menor que la mitad del radio del ángulo sólido del objeto.

en otras palabras, el ancho de mi llanta es de 160 mm, la mitad del ancho será el radio (R) del ángulo sólido, por lo que el resultado final de R será 80 mm. Por tanto, la distancia recomendada será de 40 mm (o menos), igual a R / 2

La comunicación entre Arduino y el TMP006 se realiza con el software de serie biblioteca y Adafruit_TMP006.h biblioteca

  #include  #include "Adafruit_TMP006.h" / Variables para funciones TMP006 ************************* ************** / Adafruit_TMP006 tmp006; void setup () {} void loop () {// Leer objeto IR temperature float objt =tmp006.readObjTempC (); // Leer temperatura del sensor ( Temperatura externa) float diet =tmp006.readDieTempC ();}  

PASO 5:Temperatura externa

El valor de la temperatura exterior se ha determinado utilizando y LM35 sensor (paquete DT).

La serie LM35 son dispositivos de temperatura de circuito integrado de precisión 1 con un voltaje de salida linealmente proporcional a la temperatura en grados centígrados.

Cada grado centígrado produce un aumento / disminución de voltaje de 10 mV

El valor del sensor se ha determinado leyendo la entrada analógica de Arduino (AI)

  int TempExtPin =A1; // seleccione el pin de entrada float celsius =0, farhenheit =0; // variables de temperatura flotar milivoltios; int sensor; [...] sensor =analogRead (TempExtPin); // Leer valor de LM35 millivoltios =(sensor / 1023.0) * 5000; // Salida de milivoltios Voltagecelsius =milivoltios / 10;  

PASO 6:Posición ultrasónica

El propósito de utilizar este sensor es determinar el escurrimiento de las suspensiones de la moto.

El HC-SR04 medir el tiempo que tardan las ondas sonoras en retroceder después de encontrar un obstáculo. El haz de ondas sonoras emitidas tiene forma cónica y lo mismo se aplica a las ondas reflejadas desde un obstáculo.

La velocidad de las ondas sonoras en el aire a 20 ° C es de aproximadamente 343,4 m / s, en este ejemplo por simplicidad consideraremos el valor aproximado de 340 m / s .

Considerando la ley cinemática S =V x t (donde S:espacio o desplazamiento del objeto, V:velocidad, t:tiempo) podemos anunciar que en nuestro caso la distancia es S =0.034 x T .

Tenemos que dividir el tiempo por 2 porque el tiempo que convertimos es el que solía ir y volver por las olas, la fórmula final donde t es el tiempo devuelto por el sensor en cm / microsegundo es:

S =0,034 x t / 2

A continuación puede ver un ejemplo que puede intentar utilizar para determinar la distancia del objeto.

  digitalWrite (triggerPort, LOW); // Envía pulsos de 10microsec a triggerdigitalWrite (triggerPort, HIGH); delayMicroseconds (10); digitalWrite (triggerPort, LOW); larga duración =pulseIn (echoPort, HIGH); long r =0.034 * duración / 2;  

El código anterior describe bien cómo funciona el sensor, pero descubrirá que este código es muy lento y mal ejecutado .

Para este proyecto, decidí probar la nueva biblioteca llamada NewPing.h para obtener más detalles, visite este enlace y vea el código Arduino completo del proyecto.

Utilice NewPing.h biblioteca es muy fácil.

  • Incluya la biblioteca
  • defina el puerto de disparo y eco del HC-SR04
  • inicializa el objeto
  • llamar a la función ReadPositionPing.
  #include  / ********************************** ******* Definir variables para funciones HC RS04 *********************************** ****** /// HC-RS04 portsint triggerPort =2; int echoPort =3; // NewPing configuración de pines y distancia máxima NewPing 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);}  

El software para UWP

El software consta de una interfaz de usuario conectada a la unidad de control a través de bluetooth. La interfaz de usuario muestra todos los datos enviados desde Arduino y se envían a IoTHub los valores del sensor.

La comunicación en serie entre Arduino y UWP se interpreta leyendo de la cadena de entrada.

Cada cadena recibido se valida comprobando que contiene el INICIO y FIN marcadores. Si la cadena de entrada tiene el formato correcto, la aplicación escupirá la información y la mostrará en la interfaz de usuario de la aplicación.

A continuación puede ver un ejemplo de una cadena enviada desde Arduino que contiene los marcadores START / END, esta cadena se dividirá por el carácter de "tubería" para determinar los valores de cada sensor:

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

debajo de la definición de matriz después de la división de la cadena enviada:

  • Posición 0 - Marcador de INICIO
  • Posición 1 - Latitud
  • Posición 2 - N (Norte)
  • Posición 3 - Longitud
  • Posición 4 - E (este)
  • Posición 5 - mes
  • Posición 6 - día
  • Posición 7 - año
  • Posición 8 - hh:MM.ss
  • Posición 9 - velocidad (Km / h)
  • Posición 10 - altitud (m)
  • Posición 11 - satélites (número de satélites)
  • Posición 12 - hdop (número de satélites en uso)
  • Posición 13 - rollo
  • Posición 14 - tono
  • Posición 15 - Xg
  • Posición 16 - Yg
  • Posición 17 - Zg
  • Posición 18 - Audio ( Opcional, actualmente desactivado )
  • Posición 19 - Distancia (m)
  • Posición 20 - Temperatura (temperatura externa por LM35)
  • Posición 21 - Temperatura del neumático (temperatura del neumático de TMP006)
  • Posición 22 - Amortiguador delantero (cm)
  • Posición 23 - Amortiguador trasero (cm)
  • Posición 24 - Marcador de FIN

por "Serial Monitor" del Arduino IDE puede ver cómo funciona el Código Arduino:

Para administrar todos los datos enviados desde la unidad central a través de Bluetooth, he desarrollado una aplicación universal de Windows que es un buen ejemplo del poder de la UWP. Como sabe, una UWP es una plataforma que le permite ejecutar la aplicación en toda la familia de dispositivos con Windows 10 integrado.

La interfaz de usuario es muy simple e intuitiva, en el lado izquierdo puede ver la función de conexión Bluetooth, en el medio 3 indicadores utilizados para mostrar la velocidad, el ángulo de inclinación y el ángulo de caballito. Se muestran todos los componentes G y, a la derecha, información sobre la posición del GPS, las temperaturas y las excursiones de los amortiguadores.

¿Cómo implementar la aplicación en Windows 10 Mobile?

Con Windows 10 SDK Preview Build 10166, Microsoft presentó la herramienta de implementación de aplicaciones de Windows 10 (WinAppDeployCmd.exe).

La implementación de aplicaciones de Windows 10 (WinAppDeployCmd) es una utilidad de línea de comandos que se puede utilizar para implementar una aplicación universal de Windows desde una PC con Windows 10 a cualquier dispositivo móvil con Windows 10. Permite a los usuarios implementar un archivo .AppX en un dispositivo conectado a través de USB o disponible en la misma subred sin requerir acceso a la solución completa de Visual Studio.

PASO 1:

En primer lugar, mueva su dispositivo móvil en "Modo de desarrollador" (vaya a ACTUALIZACIÓN Y SEGURIDAD => PARA DESARROLLADORES ).

después de eso, conecte su dispositivo a través de USB y hágalo visible conexión USB (se devolverá un código PIN)

PASO 2:

Haz clic derecho en tu Proyecto . => Tienda => Crear paquetes de aplicaciones

PASO 3:

En el asistente Crear paquetes de aplicaciones, seleccione NO Si desea crear un paquete local y haga clic en SIGUIENTE . Después de eso, elija las plataformas de procesador para apuntar. Para nuestro propósito, elija la plataforma ARM y haga clic en CREAR .

Al final del proceso de creación, el asistente nos da una URL local donde se creó el paquete.

Al abrir la URL, encontrará el archivo Appx disponible para implementar en el dispositivo.

PASO 4:

Abra un símbolo del sistema y mueva su enfoque a C:\ Archivos de programa (x86) \ Windows Kits \ 10 \ bin \ x86 \

y escriba la siguiente línea de comando

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_Debund.0.0" -.appxb código> AAA123

(donde AAA123 es el código pin devuelto por su teléfono conectado al USB en modo Asociación)

Al final del proceso, la aplicación se instalará en su dispositivo y podrá "anclar para comenzar":

AZUR

Ahora estamos listos para describir cómo configurar los servicios de Azure. Para este proyecto será necesario crear:

  • WebApp + SQL Azure
  • IoTHUB
  • TRABAJO de Stream Analytics
  • Un DeviceId que se usará para enviar datos a IoTHUB .

¡OK VE! ¿Tiene una cuenta AZURE?

  • Si la respuesta es NO, vaya a https://azure.microsoft.com/ y cree uno.
  • Si la respuesta es SÍ ... ¡BIEN! Vaya a https://portal.azure.com

PASO 1:Cree y configure IoT Hub:

IoTHUB es el punto de acceso de los valores de telemetría a la Nube.

Cree su IoTHub, haga clic en Nuevo => Internet del pensamiento => IoT Hub y compile los campos del Hub y haga clic en Crear

Posteriormente, en su panel de Azure, es posible que vea IoT HUB implementando y después de unos segundos su IoT HUB estará listo.

Haga clic en el nuevo mosaico en su panel y vaya a Todas las configuraciones hoja.

Ver su nombre de host de IotHub y anote:

En las políticas de acceso compartido hoja, haga clic en iothubowner política y, a continuación, copie y anote la cadena de conexión en el iothubowner hoja

Ok ... su concentrador Iot se ha creado con éxito, ¡ya casi está listo para usarlo!

PASO 2:crear y configurar Stream Analytic

Stream Analytics tiene el propósito de leer y escribir todos los datos enviados al IoTHUB y guardarlos en una tabla de base de datos.

Cree un nuevo trabajo de Stream Analytics:

Haga clic en Nuevo . => Internet del pensamiento => Trabajo de Stream Analytics

Compile todos los campos y haga clic en el botón Crear.

Ahora estamos listos para configurar Entrada / Salida y la consulta del TRABAJO streamAnalityncs.

Configurar entrada:seleccionar la fuente . En nuestro caso la fuente será IoTHub

Configure la salida:seleccione el destino. En nuestro caso, la salida será una tabla de la base de datos SQL Azure (le mostraré cómo crear una base de datos SQL en el siguiente paso)

PASO 3:Cree una aplicación web + SQL Azure

Vaya al panel y seleccione WebApp + SQL ( Nuevo => Redes => Web + Móvil => Aplicación web + SQL )

Ahora configure su aplicación web compilando los siguientes campos:

  • Nombre de la aplicación
  • Elija una suscripción
  • Elija un grupo de recursos (si no tiene uno, cree su primer grupo de recursos)
  • Elija un plan de servicio de aplicaciones y un nivel de precios (para este ejemplo, puede considerar elegir un plan gratuito F1)

Configura tu SQL, crea uno nuevo y elige el nombre , nivel de precios , nombre del servidor y agregue Credenciales de inicio de sesión de administrador :

Ahora volvamos al PASO 2 , ahora estamos listos para crear la consulta StreamAnalitycs. Haga clic en el mosaico StreamAnalyticJob y seleccione "Consulta". Inserte su consulta en el panel derecho.

Como puede ver, la consulta describe el flujo de trabajo del proceso. 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 botón.

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 botón
  • 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.

Código

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

Esquemas

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

Proceso de manufactura

  1. Telemetría del sensor 2.0.1
  2. Evitación de obstáculos utilizando inteligencia artificial
  3. Diversión con giroscopio con NeoPixel Ring
  4. Controlador de juego Arduino
  5. Traje de nube
  6. Seguidor de línea industrial para suministro de materiales
  7. Pixie:un reloj de pulsera NeoPixel basado en Arduino
  8. Botella de agua con tecnología Arduino
  9. Teatro de sombras navideño
  10. Cámara de vigilancia remota móvil
  11. Guante de mano inteligente