私のバイクのテレメトリ
コンポーネントと消耗品
> ![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
![]() |
| × | 1 | |||
![]() |
| × | 2 | |||
| × | 1 | ||||
| × | 1 | ||||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
| × | 1 |
アプリとオンラインサービス
> ![]() |
| |||
![]() |
| |||
| ||||
![]() |
| |||
| ||||
|
このプロジェクトについて
新しいプロジェクトを始めるたびに、自分の情熱に関連する最新のテクノロジーを活用して何かを作成しようとしています。このプロジェクトでは、オートバイへの情熱とお気に入りの趣味を組み合わせることにしました(Arduinoを使用してください)。
アイデア
私はいつも、motogpレースについてテレビで見ているテレメトリ画像に魅了されてきました。以下のような画像を見て、お気に入りのガジェット(Arduino)とプログラミングの知識を使用してどのように構築できるかをイメージしました。
<図>

そこで、ArduinoとAzureをベースにしたテレメトリシステムを開発することにしました。これは、すべてのオートバイ愛好家がバイクに1つ持つことができるように、簡単に複製できます。
以下に示すように、このテレメトリシステムは、運転スタイルに関する次の情報を取得できます。
- 速度[Km / h]
- GPS位置(緯度/経度)
- 衛星情報(土番号、Hdop)
- [メートル]を変更する
- リーンアングル
- ウイリー角度
- 3軸のG加速度[m / s ^ 2]
- 外部温度[°C]
- バックタイヤ温度[°C]
- フロントショックアブソーバー[cm]
- バックショックアブソーバー[cm]
そのために、Arduino Uno R3、いくつかのセンサー、Windows PhoneにデプロイされたUWP、およびいくつかのAzureサービスを使用しました。
ワークフローは次の図で説明されています:
<図>
- フェーズ1 -すべての遠隔測定データは、コントロールユニットから取得されます。 毎秒約2回(コントロールユニットはバイクに配置されています)。
- フェーズ2 -データが取得されるたびに、データは bluetooth によって送信されます。 Arduinoから Windows Phone 。
- フェーズ3 -データは電話に表示され(詳細については「ソフトウェア」セクションをお読みください)、3G / 4Gネットワークによって Azure IoT HUB に送信されます。 。
- フェーズ4 -紺碧にはストリーム分析ジョブがあります IoT HUBからデータを受信し、その情報をSQLAzureデータベースに保存します。
- フェーズ5 -Azureに WebApp がデプロイされました テレメトリデータをリアルタイムで表示するためにSQLデータベースデータを使用するもの(Webアプリのセクションをお読みください)
- フェーズ6 - WebApp 、認証プロセスを使用し、すべてのテレメトリ情報をグラフで表示します。 (すべてのデータはEntityFrameworkを使用してsqlazureデータベースから取得されます)
- フェーズ7 -SQL Azureデータベースに保存されたすべてのデータは、 Machine Learning によって処理されます。 あなたの「運転スタイル」に関する情報を取得するために。スコープは、運転パフォーマンスを向上させるために、テレメトリパラメータの機能で運転スタイルを変更する方法を理解します。
私はそれがかなりクールだと思います!!!
プロジェクトの説明を始めましょう
ハードウェアのセットアップ
私のハードウェア構成を以下に示します。
<図>
私のハードウェア設定は次のもので構成されています:
- 1 x Arduino Uno R3
- 2x超音波レンジングモジュール HC-SR04 、ショックアブソーバーの伸びを決定するために使用されます(前面と背面)
- 1x赤外線サーモパイル非接触温度センサー TMP006、 タイヤの温度を決定するために使用されます(外部温度も誤解する可能性があります-オプション)
- 1 x GPS-NEO7M 、GPSの位置、速度、高度を決定するために使用されます
- 1 x ADXL345 、3軸のG加速度を評価し、リーン角度とウィリー角度を計算するために使用されます
- 1 x LM35DT 外部温度を決定するために
- 1 x HC-05 、bluetoothモジュール、arduinoとWindowsPhoneの間で通信する
- 1 x 電源装置 (汎用バッテリーまたはモバイルパワーバンク )
ステップ1-Bluetooth接続
SofwareSerial を使用しました BluetoothモジュールをArduinoに接続し、WindowsPhoneとのワイヤレス通信を有効にするライブラリ。
HC-05 このスコープにはBluetoothモジュールが選択されました。これはシリアルポートプロファイルを備えたクラス2Bluetoothモジュールであり、マスターまたはスレーブとして構成できます。
<図>
次のステップは、Bluetoothデバイスのデフォルト名を変更することでした。デフォルト名は HC-05 でした。 ...それは「魅力的」ではありませんでした
このデバイスの使用方法:
Arduinoコードの場合:
- SoftwareSerial を含める ライブラリ
- RX / TXポートを定義する
- 通信を初期化する:
#include [...] SoftwareSerial BTSerial(10,11); // RX-TX [...] void setup(){BTSerial.begin(9600); [...]}
これで、次のコマンドラインを使用して必要なすべての文字列をBluetooth経由で送信する準備が整いました。
... BTSerial.print( "Hello Hackster"); ...
Windows PhoneとArduino間の通信の準備が整い、非常に簡単になりました!
ステップ2-GPS通信
このスコープに使用されているハードウェアは GPS-NEO7M モジュール、それは56チャンネルを持ち、10Hzで正確な位置更新を出力する低電力GPSモジュールです。
<図>
ArduinoとGPSモジュール間の通信は、 SoftwareSerial によって行われました。 ライブラリと TinyGPS ++ という名前の非常に興味深いライブラリの活用
このセンサーと通信する方法:
- RX / TXポートを定義する
- TinyGPSオブジェクトを初期化する
- 通信を初期化する
以下のコードを参照してください:
#include #include // GPSSoftwareSerial ss(12,13);とのシリアル接続を定義します。 // RX-TX // TinyGPSObjectを定義しますTinyGPSPlusgps; void setup(){// GPS Inizializess.begin(9600); [...]} void loop(){// GPSが使用可能になっている間、情報を読み取りますwhile(ss .available()> 0){if(gps.encode(ss.read())){if(gps.location.isValid()){double lat =gps.location.lat(); double lon =gps.location .lng(); }}} [...]}
ステップ3-加速度計
3軸の加速度値を決定し、ロール角とピッチ角(リーン角とウィリー角)を計算するために、 ADXL345 を使用しました。
<図>
ADXL345 は、最大±16 gの高分解能(13ビット)測定を備えた、小型、薄型、超低電力の3軸加速度計です。デジタル出力データは16ビットの2の補数としてフォーマットされ、 SPI からアクセスできます。 (3線式または4線式)または I2C デジタルインターフェース。
ArduinoとADXL345センサー間の通信は、 ADXL345.h を使用して行われます。 としょうかん。
このセンサーを接続すると、3軸の重力加速度を測定できますが、値はすぐには較正されないことを理解することが非常に重要です。 OFFSETを設定するためのコードを作成する必要があります。
最初のループで「ゼロ点」を決定することにしました。これを行うには、最初のループのG加速度が、後続の測定に差し引く必要のある参照値になります。
// if(i ==0){refXg =Xg;への最初のループrefYg =Yg; refZg =Zg; i =1;} //ゼロ点を引くXg =Xg --refXg; Yg =Yg --refYg; Zg =Zg --refZg + 1;
次に、g加速度成分に基づいてリーン角度とウィリー角度を計算する必要があります。
以下に、それを行うための2つの簡単な数学方程式を示します。
// Roll&Pitch Equationsroll =-(atan2(-fYg、fZg)* 180.0)/ M_PI;ピッチ=(atan2(fXg、sqrt(fYg * fYg + fZg * fZg))* 180.0)/ M_PI;
このプロジェクトでは、次のことを考慮する必要があります。
- Z軸は自然重力軸です
- Y軸はモーションの方向です
- X軸は横方向の動きです

このセンサーと通信する方法:
- ADXL345オブジェクトを初期化します
- 通信を初期化する
これで、加速度情報を読む準備ができました。以下のコードを参照してください。
#include #include #include // GPSSoftwareSerial ss(12,13);とのシリアル接続を定義します。 // RX-TX // ADXL345オブジェクトを定義ADXL345acc; void setup(){// ADXL345 Inizializeacc.begin(); [...]} void loop(){// gアクセラレーションコンポーネントを読み取るdoubleXg、Yg、Zg; acc.read(&Xg、&Yg、&Zg);}
ステップ4-タイヤ温度
タイヤの温度を測定するには、明らかな理由でタイヤに触れないセンサーが必要でした。ユニークな方法は、赤外線温度センサーを使用することでした。そのために、 TMP006 を使用することにしました。 センサー
<図>
TMP006は、完全に統合されたMEMサーモパイルセンサーであり、直接接触しなくても物体の温度を測定します。サーモパイルは、 4 um の波長で物体から受動赤外線エネルギーを吸収します 16 um エンドユーザーが定義した視野内。
<図>
サーモパイルの両端の電圧の対応する変化はデジタル化され、 I2C を介したオンチップダイ熱センサー測定で報告されます
問題は、センサーをどこに配置する必要があるかということです。データシートを見ると、センサーとオブジェクトの間の推奨距離に関する重要な情報を見つけることができます。
距離は、オブジェクトの立体角の半径の半分よりも小さくする必要があるという規則を遵守する必要があります。
<図>
つまり、私のタイヤ幅は160mmで、半分の幅は立体角の半径(R)になるので、Rの最終結果は80mmになります。したがって、 推奨距離は40mmになります (またはそれ以下)、R / 2に等しい
<図>
Arduinoと TMP006 間の通信 SerialSoftware を使用して作成されています ライブラリと Adafruit_TMP006.h ライブラリ
#include #include "Adafruit_TMP006.h" / TMP006関数の変数************************* ************** / Adafruit_TMP006 tmp006; void setup(){} void loop(){//オブジェクトのIR温度を読み取るfloat objt =tmp006.readObjTempC(); //センサー温度を読み取る(外部温度)フロートダイエット=tmp006.readDieTempC();}
ステップ5-外部温度
外部温度の値は、および LM35 を使用して決定されています。 センサー(DTパッケージ)。
<図>
LM35シリーズは、摂氏温度に直線的に比例する出力電圧を備えた高精度集積回路1温度デバイスです。
摂氏度ごとに、10mVの増加/減少電圧が生成されます
<図>
センサー値は、Arduinoアナログ入力(AI)を読み取って決定されました
int TempExtPin =A1; //入力ピンを選択しますfloatcelsius =0、farhenheit =0; //温度変数floatミリボルト; intセンサー; [...]センサー=analogRead(TempExtPin); // LM35値を読み取りますmillivolts =(センサー/ 1023.0)* 5000; //ミリボルト出力Voltagecelsius =ミリボルト/ 10;
ステップ6-超音波位置
このセンサーを使用する目的は、バイクのサスペンションの脱出を判断することです。
<図>
HC-SR04 障害物に遭遇した後、音波が戻るのにかかる時間を測定します。音波放射ビームは円錐形であり、同じことが障害物からの反射波にも当てはまります。
<図>
20°Cでの空気中の音波速度は約343,4m / sです。この例では、簡単にするために、 340 m / s の概算値を検討します。 。
運動学の法則を考慮する S =V x t (ここで、S:オブジェクトの空間または変位、V:速度、t:時間)この場合、距離は S =0.034 x T であるとアナウンスできます。 。
変換した時間は波によって行き来するために使用された時間であるため、時間を2で割る必要があります。これは、 t の最終的な式です。 センサーから返される時間( cm /マイクロ秒) は:
S =0.034 x t / 2
以下に、オブジェクトの距離を決定するために使用できる例を示します。
digitalWrite(triggerPort、LOW); // 10マイクロ秒のパルスをtriggerdigitalWrite(triggerPort、HIGH); delayMicroseconds(10); digitalWrite(triggerPort、LOW); long duration =pulseIn(echoPort、HIGH); longrに送信します=0.034 *期間/ 2;
上記のコードはセンサーがどのように機能するかをよく説明していますが、このコードは非常に遅く、パフォーマンスが低いことがわかります。 。
このプロジェクトでは、 NewPing.h という名前の新しいライブラリを試すことにしました。 詳細については、このリンクにアクセスして、プロジェクトの完全なArduinoコードを参照してください。
NewPing.h を使用します ライブラリはとても簡単です。
- ライブラリを含める
- HC-SR04のトリガーとエコーポートを定義します
- オブジェクトを初期化します
- ReadPositionPing関数を呼び出します。
#include / ************************************ ******* HCRS04関数の変数の定義************************************* ****** /// HC-RS04ポートinttriggerPort =2; int echoPort =3; //ピンのNewPingセットアップと最大距離NewPingsonar(triggerPort、echoPort、200); void setup(){} void loop() {/ *** READ POSITION *** / int Pos =ReadPositionPing();} int ReadPositionPing(){unsigned int uS =sonar.ping(); return sonar.convert_cm(uS);}
UWPソフトウェア
このソフトウェアは、Bluetoothを介してコントロールユニットに接続されたユーザーインターフェイスで構成されています。 UIには、Arduinoから送信され、 IoTHub に送信されるすべてのデータが表示されます センサー値。
ArduinoとUWPの間のシリアル通信は、入力文字列から読み取ることによって解釈されます。
各文字列 受信は、 START を含むチェックによって検証されます および END マーカー。入力文字列が正しくフォーマットされている場合、アプリケーションは情報を吐き出し、アプリケーションのユーザーインターフェイスに表示します。
以下に、START / ENDマーカーを含むArduinoから送信された文字列の例を示します。この文字列は、各センサー値を決定するために「パイプ」文字で分割されます。
<コード> $ 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 |
送信された文字列の分割後の配列定義の下:
- 位置0 -STARTマーカー
- ポジション1 -緯度
- ポジション2 --N(ノード)
- ポジション3 -経度
- ポジション4 -E(東)
- ポジション5 -月
- ポジション6 -日
- ポジション7 -年
- ポジション8 --hh:MM.ss
- ポジション9 -速度(Km / h)
- ポジション10 -高度(m)
- ポジション11 -衛星(衛星の数)
- ポジション12 --hdop(使用中の衛星の数)
- ポジション13 -ロール
- ポジション14 -ピッチ
- ポジション15 -Xg
- ポジション16 -Yg
- ポジション17 -Zg
- ポジション18 -オーディオ(オプション-現在無効 )
- ポジション19 -距離(m)
- ポジション20 -温度(LM35による外部温度)
- ポジション21 -温度タイヤ(TMP006からのタイヤ温度)
- ポジション22 -フロントショックアブソーバー(cm)
- ポジション23 -バックショックアブソーバー(cm)
- ポジション24 -ENDマーカー
Arduino IDEの「シリアルモニター」で、Arduinoコードがどのように機能するかを確認できます:
<図>
セントラルユニットからBluetooth経由で送信されるすべてのデータを管理するために、UWPのパワーの良い例であるユニバーサルWindowsアプリケーションを開発しました。ご存知のように、UWPは、Windows10を搭載したすべてのデバイスファミリでアプリケーションを実行できるプラットフォームです。
<図>
ユーザーインターフェイスは非常にシンプルで直感的です。左側にはBluetooth接続機能が表示され、中央の3つのゲージは速度、傾斜角、ウィリー角度を表示するために使用されます。すべてのGコンポーネントが表示され、右側にはGPSの位置、温度、ショックアブソーバーの可動域に関する情報が表示されます。
<図>




アプリをWindows10 Mobileにデプロイする方法は?
Windows 10 SDKプレビュービルド10166で、MicrosoftはWindows 10アプリケーション展開(WinAppDeployCmd.exe)ツールを導入しました。
Windows 10アプリケーション展開(WinAppDeployCmd)は、ユニバーサルWindowsアプリをWindows 10PCから任意のWindows10モバイルデバイスに展開するために利用できるコマンドラインユーティリティです。これにより、ユーザーは、完全なVisual Studioソリューションにアクセスしなくても、USB経由で接続されたデバイス、または同じサブネット上で利用可能なデバイスに.AppXファイルを展開できます。
ステップ1:
まず、モバイルデバイスを「開発者モード」に移動します(更新とセキュリティに移動します) => 開発者向け 。
その後、USB経由でデバイスを接続し、USB接続を表示します(PINコードが返されます)
<図>

ステップ2:
プロジェクトを右クリックします => ストア => アプリパッケージを作成する
<図>
ステップ3:
アプリパッケージの作成ウィザードで、いいえを選択します ローカルパッケージを作成して次へをクリックする場合 。その後、ターゲットとするプロセッサプラットフォームを選択します。私たちの目的のために、ARMプラットフォームを選択し、作成をクリックします 。
<図>

作成プロセスの最後に、ウィザードはパッケージが作成されたローカルURLを提供します。
<図>
URLを開くと、デバイスにデプロイできるAppxファイルが見つかります。
<図>
ステップ4:
コマンドプロンプトを開き、フォーカスをC:\ Program Files(x86)\ Windows Kits \ 10 \ bin \ x86 \
に移動します。次のコマンドラインを入力します
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
( AAA123 アソシエーションモードでUSBに接続された携帯電話から返されるPINコードです)
<図>

プロセスの最後に、アプリケーションがデバイスにインストールされ、「ピン留めして開始」できるようになります。
<図>
紺碧
これで、Azureサービスを構成する方法を説明する準備が整いました。このプロジェクトでは、以下を作成する必要があります:
- WebApp + SQL Azure
- IoTHUB
- ストリーム分析ジョブ
- IoTHUB にデータを送信するために使用されるDeviceId 。
OK GO! AZUREアカウントをお持ちですか?
- いいえの場合は、https://azure.microsoft.com/にアクセスして作成してください。
- はいの場合...良いです! https://portal.azure.comにアクセスします
ステップ1-IoTハブを作成して構成します:
IoTHUBは、クラウドへのテレメトリ値のアクセスポイントです。
IoTHubを作成し、新規をクリックします => インターネットオブシンク => IoTハブ ハブフィールドをコンパイルして、作成をクリックします。
<図>
その後、Azureダッシュボードに IoT HUB が表示される場合があります デプロイすると、数秒後にIoTHUBの準備が整います。
<図>

ダッシュボードの新しいタイルをクリックして、[すべての設定]に移動します ブレード。
IotHub ホスト名を参照してください とメモをとる:
<図>
共有アクセスポリシー ブレード、 iothubowner をクリックします ポリシーを作成し、 iothubowner の接続文字列をコピーしてメモします。 ブレード
<図>
わかりました... Iotハブが正常に作成されました。ほぼ使用できるようになりました!
ステップ2-StreamAnalyticを作成して構成する
ストリーム分析には、IoTHUBに送信されたすべてのデータの読み取りと書き込みを行い、それらをデータベーステーブルに保存することを目的としています。
新しいStreamAnalyticsジョブを作成します:
新規をクリックします => インターネットオブシンク => ストリーム分析ジョブ
すべてのフィールドをコンパイルし、[作成]ボタンをクリックします。
<図>
これで、入力/出力とstreamAnalityncsJOBのクエリを構成する準備が整いました。
入力の設定-ソースを選択 。この場合、ソースはIoTHub
になります <図>
出力の設定-宛先を選択します。この場合、出力はSQL Azureデータベースのテーブルになります(次のステップでSQLデータベースを作成する方法を説明します)
<図>
ステップ3-WebApp + SQLAzureを作成する
ダッシュボードに移動し、WebApp + SQL(新規)を選択します => ネットワーキング => ウェブ+モバイル => Webアプリ+ SQL )
<図>
次に、次のフィールドをコンパイルするWebアプリを構成します。
- アプリ名
- サブスクリプションを選択してください
- リソースグループを選択します(リソースグループがない場合は、最初のリソースグループを作成します)
- アプリサービスプランと料金階層を選択します(この例では、F1無料プランを選択することを検討できます)

SQLを構成し、新しいSQLを作成して、名前を選択します 、価格帯 、サーバー名 管理者ログインの資格情報を追加します :
<図>
ここで、ステップ2 に戻ります。 これで、StreamAnalitycsクエリを作成する準備が整いました。 StreamAnalyticJobタイルをクリックし、[クエリ]を選択します。右側のパネルにクエリを挿入します。
<図>
ご覧のとおり、クエリはプロセスワークフローを説明しています。 「MyTelemetryInputHub」からデータを取得し、「SqlAzureMyTelemetry」に保存します...簡単で素晴らしい!!
最後に、 JOB を開始するだけです。 開始をクリックします ボタン。
<図>

HUBのDeviceIdを作成する
この手順は、デバイスとIoTHUBの間に接続を作成するために必要です。新しいデバイスIDを作成し、IoTHUBのIDレジストリに追加する必要があります。
詳細については、以下をご覧ください
<コード>リンクコード>
新しいものを生成するには deviceId、 VisualStudioでコンソールアプリケーションを作成する必要があります。
NuGetパッケージマネージャー内 ウィンドウで、 Microsoft.Azure.Devices を検索してインストールします パッケージ。
以下のコードを追加しますコンソールアプリケーションで、 IoTHub を置き換えます 接続文字列とdeviceIdエイリアスを選択しました(私の場合、devicedは MyDucatiMonsterDevice )。
class Program {//インストールパッケージMicrosoft.Azure.DevicesstaticRegistryManager RegistryManager; //接続文字列HUBstaticstring connectionString ="xxxxxxxxxxxxxx"; static void Main(string [] args){registryManager =RegistryManager.CreateFromConnectionString( connectionString); AddDeviceAsync()。Wait(); Console.ReadLine();} // IDを持つ新しいデバイスIDを作成しますmyFirstDeviceprivateasync 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( "生成されたデバイスキー:{0}"、device.Authentication.SymmetricKey.PrimaryKey);}}
コンソールアプリケーションを実行し(F5キーを押す)、デバイスキーを生成します。
WEBアプリケーション
プロジェクトのこの時点で、テレメトリデータを表示する方法と、それらを友人に表示してソーシャルメディアで結果を共有する方法について考えました。そのために、ASP.NETでレスポンシブWebサイトを作成することにしました
ウェブサイトはダッシュボードで構成され、私のすべてのテレメトリが含まれています。データはエンティティフレームワークを使用して読み取られました SQLAzureから。
次のURLでWebサイトを見つけることができます:
すべての ハックスターユーザーのアカウントが作成されました 、次のユーザー/ pswクレデンシャルを使用してサインインします:
ユーザーID:demoPassword:デモ
Webサイトは次のようになります:
<図>





そして、モバイル版では次のようになります:
<図>





無料利用枠を使用してAzureでWebアプリを作成すると、ドメイン名は次のようになります。
<ウェブサイト名> .azurewebsites.net
ドメイン名を変更するには、ドメイン名を購入する必要があります。紺碧では、これは非常に簡単です。次の手順に従ってください:
- Azure ダッシュボードに移動します Webアプリのタイルをクリックします。
- [カスタムドメインとSSL ]を選択します "をクリックし、[ドメインを購入]をクリックします "。
- すべてのフィールドに入力します(ドメイン名と連絡先情報について)



ドゥカティモンスターの配線
今が私のバイクを紹介する時です、これは私のドゥカティモンスター695 です このプロジェクトのそれはモルモットでした。
<図>
搭載されている私のハードウェア(コントロールユニット)に関するいくつかの写真の下。
<図>





タイヤの温度を測定するために、ホイールの後ろに固定されたブラケットを作成しました。
<図>

1つの超音波レンジングモジュール HC-SR04 フロントヘッドライトの下に固定されています。ヘッドライトとフロントマッドガードの間の距離を誤解します。
<図>
もう1つの超音波距離計モジュールは、シートとリアタイヤの間の距離を測定するバックショックアブソーバーを決定するために、バイクシートの下に固定されています。
<図>
Arduino、GPS、加速度計、外部温度センサーを含む中央ユニットは、シートの後ろに固定されています。
<図>




そして最後に、配線後、私のバイクは次のようになります
<図>

機械学習
このプロジェクトの最後のアイデアは、私の運転スタイルを改善する方法を理解するために、遠隔測定データ間に相関関係が存在するかどうかを理解しようとすることでした。
毎回異なるルートを作成し、交通状況が同じになることはないため、データサンプルは関連性がありません。スピードウェイでの使用は良い状態だと思います。実際のレースでは、速度を上げることができるか、出力値に応じて速度を下げる必要があるかをテレメトリで理解するのに役立つと想像してみてください。
機械学習 (ML)は、データに関するソフトウェアの洞察の魔法を具体化し、特定の進化を表す情報を提供することによって問題を解決します。 MLは、特定の現象がその知識のデータに従ってどのように進化するかを理解しています。
MLを使用する最初のアプローチは、実験を行うことです 。データを使用して、私たちが興味を持っている現象を調査することを目的として、遊んで分析を行うことができます。
では、Azure MachineLearningの発見に行きましょう
https://studio.azureml.netにアクセスし、Azureアカウントを使用してサインインします。
ページの左側にある[スタジオ]をクリックします
<図>
個人のダッシュボードにリダイレクトされ、実験を作成する準備が整います。
<図>
- 実験ブレードで、[新規]をクリックします (ページの左ボタン) 。
- 最初のステップは、MLで使用するデータをインポートすることです。私の場合、SQLAzureからデータをインポートしました。


- 私のテーブルには、すべてのデータが varchar です。 そのため、最高品質のレコードのみを取得するために、フロートに変換し、一部の不良データを除外する必要がありました。以下に、データのインポートに使用されるクエリを示します
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)_BackAbsorber from mytelemetrywhere CAST(speed as float)> 3 float)> 0およびCAST(BackAbsorber as float)> 0およびCAST(roll as float)<60およびCAST(roll as float)>-60
- 次に、 分割データを追加します 一部のデータを使用してトレーニングするための要素 あなたの ML 構成に使用するデータの割合を決定します。
- データ部分はテンプレートを構成するために使用され、他の部分はモデルが正常に機能するかどうかを確認するために使用されます。これにより、良さを評価することができます。
- トレーニングモデルを追加します モデルが推測するフィールドを決定し、列車に使用するアルゴリズムを決定します。

- ここで、彼がアルゴリズムをどのように動作させて良さを感じさせたかを確認します。そのためには、「スコアモデル」を使用する必要があります。 "。SMは入力2ソースを受け入れます。最初のソースは、トレインモデルからのものです。 SPLIT DATA の2つ目 。
- 最後に、テストデータに従ってモデルを推定し、まだ使用していないモデルと比較する準備が整いました(モデルの評価 。
"
に関する公式ドキュメント モデルの評価 "
<コード>が見つかりますコード> こちら
以下に、評価モデルを使用して2つのアルゴリズムを比較するのに役立つサンプル実験を示します。 、2つのアルゴリズムは 2クラスの意思決定ジャングルです。 および 2クラスの決定フォレスト 。
<図>

スコアリングされたモデルを渡すとき 「2つのクラス」の分類アルゴリズムの場合、評価モデル 以下に示すメトリックを生成します:
<図>
分類モデル
上記の指標は、分類モデルを評価するために報告されています。
(すべての指標が報告されますが、モデルは評価用に選択した指標によってランク付けされます)
- 精度 分類モデルの良さを、ケース全体に対する真の結果の割合として測定します。精度=(TP + TN)/(TP + TN + FP + FN)
- 精度 すべての肯定的な結果に対する真の結果の割合です。精度=TP /(TP + FP)
- リコール モデルによって返されるすべての正しい結果の割合です。リコール=TP /(TP + TN)
- Fスコア 適合率と再現率の加重平均として計算されます。ここで、理想的なFスコア値は1です。F1=2TP /(2TP + FP + FN)
- AUC y軸に真陽性、x軸に偽陽性でプロットされた曲線の下の面積を測定します。このメトリックは、さまざまなタイプのモデルを比較できる単一の数値を提供するため、便利です。
ご覧のとおり、 2クラスの決定フォレスト アルゴリズムには精度があります 、精度 、リコール および F1スコア 1に等しい値に近いので、私のモデルは適切に記述されていると思います。 GREAT !!!
の詳細 モデルの評価
次の
にアクセスしてください LINK
予測実験:
機械学習の予測機能に注意を向けるときが来ました。
トレーニング実験は予測実験に変換されます。この機能により、他のアプリケーションにモデルを使用する機会を統合し、モデルに基づいて予測を行うことができます。
そのために、新しい実験が作成されました。データソースはSQL Azureですが、今回使用されたテーブルは新しいものです。テレメトリ値に基づいてデータを分類しようとしました。
これで、私のデータは次のようになります。ご覧のとおり、 という名前の新しい列があります。 スコア それは私の分類を表しています:
<図>
以下のように実験を作成し、トレインモデルを選択して、マルチクラスアルゴリズムを追加します。
<図>
- 実験を実行して結果を確認します:


- 列車モデルを選択し、ウェブサービスの設定をクリックします => 予測Webサービス

- 数秒待つと、予測サービスの準備が整います。以下に、私の予測実験のレイアウトを示します。

- このモデルを実行してから、 DEPLOY WEB SERVICE をクリックしてWebサービスをデプロイします。 ボタン

- サービスをすぐに使用できるようになり、ダッシュボードが表示されます。このボタンには、手動でデータを入力してサービスをテストできる[テスト]ボタンが含まれています。

- [テスト]ボタンをクリックしてすべてのフィールドをコンパイルし、いくつかの偽の値を使用して、予測結果を確認します。


ご覧のとおり、結果は「安全運転」と同じです。 「これは、私の予測サービスが、私の運転スタイルは安全であり、アクションは不要であると予測したことを意味します。
結果がたとえば「 HIGHSTRESS HIGH SPEED 」の場合 「つまり、速度を落とさなければならないということです!
MLに関する結論:
このセクションでは、いくつかのことを理解しています。
- ML紺碧の環境で実験を構成する方法
- 2クラスの決定フォレストが見つかりました アルゴリズムは私のモーターバイクのテレメトリをよく表しており、マルチクラス決定フォレストを使用して予測実験用にMLをトレーニングします アルゴリズム
- 予測実験を作成するWebサービスでモデルを変換する方法
- 私のスタイルのガイドに関するいくつかの有用な情報を見つけました。以下のグラフからわかるように、実際には次のようになります。



私は右に傾くのが好きで、傾く角度はタイヤの温度や速度に依存しません。つまり、私のタイヤは高品質であり、さらに、タイヤの温度が35°Cを超えると、バイクがウィリーを好むことを理解していませんでした。
最終結論
このプロジェクトでは、多くの技術分野をカバーしました。
Arduinoと一部のセンサーを使用して60ドル未満で、マイクロソフトが提供する多くのサービスを使用して、面白いハードウェアを作成する方法を発見しました。
Azureの使いやすさと、Machine LearningStudioスイートの面白さを学びました。
確かに改善が必要なプロトタイプが実現されましたが、C#、Azure、Arduino、MotorBikeに熱心な各人からの将来の開発の良い出発点になると思います。
可能な将来の開発
このプロトタイプを改善するには、いくつかのことを実装すると便利だと思います:
- モバイルアプリ(UWP)について、3G / 4Gネットワークが利用できない場合、Azureにデータを送信できないため、データが失われます。 「ネットワークが利用できない」場合にデータを保存して後で送信するバッファリングロジックを開発すると便利です。
- Xamarinを使用してモバイルプラットフォーム用のアプリを作成します。AndroidOSとiOSでも実行できるアプリがあれば便利です。
- より正確なセンサーを使用して、パフォーマンス/精度を向上させます。
- 中央ユニットを小さくします。おそらくArduinoを使用します MKR1000 。
- ソーシャルメディアのウェブアプリを作成して、バイクの旅行やテレメトリを共有し、バイカーのユーザーに危険なカーブを提案して安全性を高めます。
- Steamアナリティクスを使用して、機械学習のソースを変更します。私の場合、自転車に乗ると同時にMLを開発することはできなかったため、sqlAZUREデータソースを使用することを好みました:)

新しいブランチワークフロー:
- 新しいブランチは、 IoTHub を介してデバイスに送り返すことで構成されます 、 ML予測に関する情報 サービス。
- 速度の値が100km / hを超える場合は、新しい stream analyticsJob テレメトリデータをイベントハブに送信します。
- クラウドサービスは、このデータを EventHub から読み取ります ML予測にリクエストを送信します スコアを取得するためのサービス 運転スタイルについて 。
- クラウドサービス スコアを送り返します IoTHub へ 、および IoTHub デバイスに送り返します(この場合はWindows Phone)
...そして今すぐお楽しみください!! :-) ご不明な点やヒントがございましたら、お気軽にお問い合わせください。
コード
UWPアプリのC#コード
https://github.com/lentzlive/MotorbikeArduinoARDUINOコード-自転車テレメトリ
https://github.com/lentzlive/BikeTelemetryArduino 回路図
テレメトリシステムの回路図。オンボードスケジュール 
製造プロセス