工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

部品と材料

部品数量備考
Arduino UNO1
u-blox GPS NEO-7M156チャネル、10Hz更新、低消費電力
LM35DT 温度センサー1外気温測定用
SparkFun TMP006 非接触赤外線温度センサー1リア・タイヤ温度測定用(外気温も可)
HC-05 Bluetoothモジュール1Arduino⇔Windows Phone通信用
超音波距離センサー HC-SR042フロント/リア・サスペンション・ストローク測定用
SparkFun ADXL345 3軸加速度センサー13軸G加速度、バンク角・ウィリー角算出用
Ducati Monster 6951実験車両
SparkFun ProtoShield Kit1
ハーフ・サイズ・ブレッドボード1
9V電池1またはモバイル・バッテリー
9V電池スナップ1
ジャンパー・ワイヤー1セット
Lumia 650 (Windows 10 Mobile)1表示・クラウド送信用

使用アプリ・サービス

プロジェクト概要

新しいプロジェクトを始めるたびに、自分の情熱に関連する最新テクノロジーを駆使した何かを作りたくなります。今回は「バイクへの情熱」と「Arduinoというお気に入りガジェット」、そしてプログラミング知識を組み合わせました。

着想

MotoGP中継で見るテレメトリー映像(速度、バンク角、Gフォース等)にいつも魅了されてきました。これをArduinoで自作できないかと考え、Azureと連携したテレメトリー・システムを開発。全バイク愛好家が自分のバイクに装着できるよう、再現性を重視しました。

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
目指したMotoGP風テレメトリー表示

本システムで取得可能なデータ:

使用ハードウェア:Arduino Uno R3、各種センサー、UWPアプリ搭載Windows Phone、Azureサービス群。

システム・ワークフロー

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
全体データ・フロー
  1. フェーズ1:制御ユニット(バイク搭載)が全テレメトリー・データを秒間約2回取得
  2. フェーズ2:データ取得ごとにBluetoothでArduinoからWindows Phoneへ送信
  3. フェーズ3:Phoneでデータ表示、3G/4G経由でAzure IoT Hubへ送信
  4. フェーズ4:AzureのStream Analytics JobがIoT Hubからデータ受信、SQL Azureデータベースに保存
  5. フェーズ5:AzureにデプロイしたWeb AppがSQLデータを用いてリアルタイム表示
  6. フェーズ6:Web Appで認証後、全テレメトリー情報をチャート表示(Entity FrameworkでSQL Azureから取得)
  7. フェーズ7:SQL Azureの全データをMachine Learningで処理、「運転スタイル」を分析。テレメトリー・パラメータに基づき運転改善ポイントを提示

I Think IT'S PRETTY COOL!!! さあ、プロジェクト詳細へ

ハードウェア・セットアップ

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
ハードウェア構成

構成部品:

ステップ1:Bluetooth接続

SoftwareSerialライブラリでHC-05とArduinoを接続、Windows Phoneとの無線通信を実現。HC-05はクラス2、シリアル・ポート・プロファイル対応、マスター/スレーブ両対応。

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

デフォルト名「HC-05」を変更(魅力的でないため)。

Arduino側コード例

#include 
SoftwareSerial BTSerial(10, 11); // RX, TX
void setup() {
  BTSerial.begin(9600);
}
void loop() {
  BTSerial.print("Hello Hackster");
}

Windows PhoneとArduinoの通信準備完了、簡単です!

ステップ2:GPS通信

ハードウェア:GPS-NEO7M(56チャネル、10Hz更新、低消費電力)。

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

SoftwareSerialライブラリとTinyGPS++ライブラリで通信。

#include 
#include 
SoftwareSerial ss(12, 13); // RX, TX
TinyGPSPlus gps;
void setup() {
  ss.begin(9600);
}
void loop() {
  while (ss.available() > 0) {
    if (gps.encode(ss.read())) {
      if (gps.location.isValid()) {
        double lat = gps.location.lat();
        double lon = gps.location.lng();
      }
    }
  }
}

ステップ3:加速度センサー(ADXL345)

3軸加速度とロール/ピッチ角(バンク角/ウィリー角)取得用。ADXL345は小型・薄型・超低消費電力、13ビット分解能、±16g測定可能。SPI(3/4線)またはI2Cインターフェース。

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

ADXL345.hライブラリで通信。重要:接続直後は重力加速度の値が未校正。最初のループで「ゼロ点」を決定し、以降の測定値から差し引く校正が必要。


// 初回ループでゼロ点取得
if (i == 0) {
  refXg = Xg; refYg = Yg; refZg = Zg;
  i = 1;
}
// ゼロ点減算
Xg = Xg - refXg;
Yg = Yg - refYg;
Zg = Zg - refZg + 1;  // +1は重力補正

バンク角(ロール)とウィリー角(ピッチ)の計算式:

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

座標系:Z軸=重力方向、Y軸=進行方向、X軸=横方向。

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
加速度センサー座標系

ADXL345通信コード例


#include 
#include 
#include 
SoftwareSerial ss(12, 13);
ADXL345 acc;
void setup() {
  acc.begin();
}
void loop() {
  double Xg, Yg, Zg;
  acc.read(&Xg, &Yg, &Zg);
}

ステップ4:タイヤ温度(TMP006)

タイヤに触れずに温度測定するため、赤外線温度センサーTMP006を採用。

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

TMP006はMEMSサーモパイル・センサーで、物体からの受動的赤外線エネルギー(4〜16μm)を吸収し、オンチップ・ダイ温度センサー測定値と共にI2Cで出力。

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

センサー配置距離が重要。データシート推奨:センサー-物体距離 < 物体の立体角半径の半分。タイヤ幅160mm → 半径R=80mm → 推奨距離 ≤ 40mm (R/2)。

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

TMP006通信コード例


#include 
#include "Adafruit_TMP006.h"
Adafruit_TMP006 tmp006;
void setup() {}
void loop() {
  float objt = tmp006.readObjTempC();  // 対象物体温度(タイヤ)
  float diet = tmp006.readDieTempC();  // センサー温度(外気温)
}

ステップ5:外気温(LM35)

LM35DTで外気温測定。出力電圧は摂氏温度に比例(1°C = 10mV)。

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

Arduinoアナログ入力で読み取り:


int TempExtPin = A1;
float celsius = 0, millivolts;
int sensor;
sensor = analogRead(TempExtPin);
millivolts = (sensor / 1023.0) * 5000;
celsius = millivolts / 10;

ステップ6:超音波センサーでサスペンション・ストローク測定

HC-SR04でサスペンションの伸縮量を測定。音波の往復時間を測り距離を算出。

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

音速 ≈ 340 m/s(20°C)。距離 S = 0.034 × t/2 (t: マイクロ秒)。

基本コード例(低速・低性能):


digitalWrite(triggerPort, LOW);
digitalWrite(triggerPort, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPort, LOW);
long duration = pulseIn(echoPort, HIGH);
long r = 0.034 * duration / 2;

本プロジェクトでは高性能なNewPing.hライブラリを採用:


#include 
int triggerPort = 2;
int echoPort = 3;
NewPing sonar(triggerPort, echoPort, 200); // 最大200cm
void setup() {}
void loop() {
  int Pos = ReadPositionPing();
}
int ReadPositionPing() {
  unsigned int uS = sonar.ping();
  return sonar.convert_cm(uS);
}

UWPソフトウェア(Windows Phoneアプリ)

Bluetoothで制御ユニットと接続するユーザー・インターフェース。Arduinoから送信される全データを表示し、IoT Hubへセンサー値を送信。

シリアル通信は入力文字列の解釈で処理。STARTとENDマーカーを含むか検証し、正しければ「|」で分割して各センサー値を抽出、UIに表示。

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|

分割後の配列定義(全25要素)

位置内容
0STARTマーカー
1緯度
2N(北緯)
3経度
4E(東経)
5月
6日
7年
8時:分:秒
9速度 (km/h)
10高度 (m)
11衛星数
12HDOP
13ロール(バンク角)
14ピッチ(ウィリー角)
15Xg
16Yg
17Zg
18オーディオ(無効)
19走行距離 (m)
20外気温 (LM35)
21タイヤ温度 (TMP006)
22フロント・ショック・ストローク (cm)
23リア・ショック・ストローク (cm)
24ENDマーカー

Arduino IDEのシリアル・モニタで動作確認可能:

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

Bluetooth経由の全データを管理するUniversal Windows Platform (UWP)アプリを開発。UWPはWindows 10搭載全デバイス・ファミリーで動作可能なプラットフォームの好例です。

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
左:Bluetooth接続、中央:速度/バンク角/ウィリー角ゲージ、右:GPS・温度・サスペンション情報

Windows 10 Mobileへのアプリ展開手順

Windows 10 SDK Preview Build 10166で導入されたWinAppDeployCmd.exeを使用。PCからUSB/同一サブネット経由で.AppXをデバイスに配布可能(Visual Studioフル環境不要)。

  1. ステップ1:モバイル・デバイスを「開発者モード」に(設定>更新とセキュリティ>開発者向け)。USB接続し可視化(PINコード取得)
  2. ステップ2:Visual Studioでプロジェクト右クリック>ストア>アプリ・パッケージの作成
  3. ステップ3:ウィザードで「いいえ」(ローカル・パッケージ)、ARMプラットフォーム選択、作成
  4. ステップ4:コマンド・プロンプトで C:\Program Files (x86)\Windows Kits\10\bin\x86\ に移動し、
    WinAppDeployCmd install -file "パッケージパス" -ip 127.0.0.1 -pin PINコード 実行
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
「ピン留め」でスタート画面に配置可能

Azureクラウド構築

必要なAzureリソース:

Azureアカウント未取得なら こちら から作成。取得済みなら ポータル へ。

ステップ1:IoT Hub作成・設定

IoT Hubはテレメトリー・データのクラウド入り口。

  1. 新規>Internet of Things>IoT Hub で作成
  2. ダッシュボードでデプロイ完了待ち
  3. 設定ブレードでホスト名をメモ
  4. 共有アクセス・ポリシー>iothubowner>接続文字列をコピー・メモ
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

ステップ2:Stream Analytics Job作成・設定

IoT Hubからデータを読み取り、SQL Azureテーブルに書き込み。

  1. 新規>Internet of Things>Stream Analytics Job で作成
  2. 入力:IoT Hubをソースに設定
  3. 出力:SQL Azureテーブルを宛先に設定(次ステップでDB作成)
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

ステップ3:Web App + SQL Azure作成

ダッシュボード>新規>ネットワーク>Web + Mobile>Web App + SQL

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

Web App設定:アプリ名、サブスクリプション、リソース・グループ、App Service Plan(無料のF1で可)。
SQL設定:新規作成、名前、価格レベル、サーバー名、管理者資格情報。

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

Stream Analyticsのクエリ設定:

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

SELECT * INTO SqlAzureMyTelemetry FROM MyTelemetryInputHub

「MyTelemetryInputHub」からデータを取り、「SqlAzureMyTelemetry」へ保存。簡単かつ強力!

最後にジョブの「開始」ボタンをクリック。

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

ステップ4:Device ID作成

デバイスとIoT Hubを接続するため、IDレジストリにデバイスIDを登録。
詳細:公式ドキュメント

Visual Studioでコンソール・アプリ作成、NuGetでMicrosoft.Azure.Devicesインストール、以下のコードでデバイスキー生成:


class Program {
  static RegistryManager registryManager;
  static string connectionString = "あなたのIoT Hub接続文字列";
  static void Main(string[] args) {
    registryManager = RegistryManager.CreateFromConnectionString(connectionString);
    AddDeviceAsync().Wait();
    Console.ReadLine();
  }
  private 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);
  }
}

実行(F5)でデバイスキー生成完了!

Webアプリケーション

テレメトリー・データを友人と共有・SNS投稿するため、ASP.NETでレスポンシブWebサイトを構築。Entity FrameworkでSQL Azureからデータ読み取り、ダッシュボード表示。

URL:WebアプリURL
Hacksterユーザー用テスト・アカウント:
User ID: demo / Password: demo

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

モバイル版もレスポンシブ対応。

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

無料ティアで作成したWeb Appのドメインは <websitename>.azurewebsites.net。独自ドメイン取得もAzureで簡単:ダッシュボード>Web App>カスタム・ドメインとSSL>ドメイン購入。

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

Ducati Monster 695 への実装

実験車両:Ducati Monster 695

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

車載ハードウェア(制御ユニット)の搭載写真:

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

タイヤ温度測定用ブラケットをホイール後ろにクランプ固定。

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

フロント・サスペンション測定用HC-SR04をヘッドライト下に固定(ヘッドライト〜フロント・フェンダー間距離測定)。

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

リア・サスペンション測定用HC-SR04をシート下に固定(シート〜リア・タイヤ間距離測定)。

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

中央ユニット(Arduino、GPS、加速度センサー、外気温センサー)をシート後ろに固定。

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

配線完了後の全景:

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

Machine Learning(機械学習)による運転スタイル分析

テレメトリー・データ間の相関を分析し、運転改善に役立てるのが最後のアイデア。データ・サンプルは毎回ルート・交通状況が異なるため直接比較は困難。サーキット走行での使用が理想的。実レースならテレメトリーに基づき、速度を上げるべきか下げるべきかを判断可能。

Azure Machine Learning Studio で実験:

  1. studio.azureml.net でAzureアカウントでサインイン、左メニュー「Studio」
  2. ダッシュボードで「NEW」>実験作成
  3. データ・インポート:SQL Azureから取得
  4. データ型変換(varchar→float)と不良データ除外

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 mytelemetry
WHERE 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
  1. Split Dataで学習用/テスト用に分割
  2. Train Modelで予測対象フィールドとアルゴリズム選択
  3. Score Modelで学習モデルをテスト・データで評価
  4. Evaluate Modelでモデル精度を検証
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

分類モデル評価指標

Two-class Decision ForestアルゴリズムでAccuracy/Precision/Recall/F1がほぼ1に近く、モデルがデータをよく記述できていることが判明。GREAT!

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

予測実験とWebサービス化

学習実験を予測実験に変換し、Webサービスとしてデプロイ。新しい実験でSQL Azureをデータソースとし、テレメトリー値に基づき分類(新規カラムScoredで分類結果表示)。

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

Multi-class Decision Forestアルゴリズムで学習、実行、予測Webサービスとしてデプロイ。ダッシュボードの「TEST」ボタンで手動テスト可能。

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
予測結果:「SAFE DRIVING」(安全運転)→ 対応不要

「HIGH STRESS HIGH SPEED」なら減速必要。

MLから得られた知見

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

最終結論と今後の展望

本プロジェクトでは多くの技術領域をカバーしました:

今後の改良案:

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム

新ワークフロー案:

  1. IoT Hub経由でデバイスにML予測サービスのスコアを返送
  2. 速度100km/h超で新Stream Analytics JobがテレメトリーをEvent Hubへ送信
  3. クラウド・サービスがEvent Hubからデータ読み取り、ML予測サービスにリクエストし運転スタイル・スコア取得
  4. クラウド・サービスがスコアをIoT Hubへ送信、IoT Hubからデバイス(Windows Phone)へ返送

... and now ENJOY !! :-) 質問・ヒントはお気軽にご連絡ください。

コード

回路図

Arduino、GPS、センサーによるリアルタイム・バイク・テレメトリー・システム
オンボード回路図

MotorbikeProject.fzz (Fritzingファイル)

製造プロセス

  1. Sensor Telemetry 2.0.1:Azure IoT Hubによる高度な温度監視
  2. Arduinoと超音波センサーで作るAI障害物回避ロボット 〜Q学習による強化学習実装〜
  3. NeoPixelリングとArduinoで作るインタラクティブジャイロスコープLEDディスプレイ
  4. DIY Arduino USBゲームコントローラー - 高性能ゲームパッドを自作
  5. DIYクラウドコスチューム: LEDストリップ、Arduino Nano & SparkFunパーツで光る雲に
  6. 産業用ラインフォロワーロボット - 物資輸送用自律走行ロボット
  7. Pixie: Arduino Pro Miniで作るNeoPixel腕時計 - アナログとデジタル融合のDIY光る時計
  8. スマートArduino水筒:リアルタイム監視とアラート機能付き
  9. DIY ホリデーシャドーシアター:ArduinoとアドレサブルLEDで作る光の影絵劇
  10. 携帯型リモート監視カメラロボット - Raspberry PiとArduinoで構築
  11. スマート手話グローブ:ジェスチャーをテキスト/音声に変換