建設現場の危険検出などに使えるIoTアプリを開発してみた

IoTの応用事例として多いのが、建設関係ではないかと思います。今回は、そんな建設業界の課題の一つとして挙げられる「建設重機周りの作業員を確認する」というソリューションを、VAB-630とSmartETKで作ってみました。

今回のアプリ提供の開発元になっているのは、VIA TechnologyのIoTパートナーであるSMART-INNOVATION株式会社です。

今回開発したアプリのデモ機今回開発したアプリのデモ機

アプリ開発の前に

今回のアプリを開発するにあたり、何をどうするか?という視点で下記の課題がありました。

  • どのテクノロジーを採用するか?
  • どのように検出するか?
  • どのくらいで開発できるか?

それでは、細かくみていきましょう

どのテクノロジーを採用するか?

これは、開発する案件でいつも課題に上がるポイントなのではないでしょうか?最適なテクノロジーを選択することが、組み込みシステムの醍醐味です。ということで、今回は、時代の流れにのまれつつ、「Bluetooth Low Energy(BLE)」を使うことにします。また、今回はVAB-630を使用しているので、OSのプラットフォームは、Android 5.0になります。Android 5.0からはBLEを正式にサポートしています。VAB-630には、PCIeのソケットがあり、WiFiとBLEのモジュールを搭載させています。(使用可能な型番は、EMIO-2531)

EMIO-2531については、こちら

どのように検出するか?

では、Androidを使用して、Bluetoothを使うにはどうすればいいのでしょうか?もちろん、検索すれば多くの記事が上がっています。今回は、AndroidでBluetoothを使う部分で、必要なところのみ取り上げておきます。コードの詳細は、アプリ全てのダウンロードができるようにしてありますので、そちらでみてください。

Bluetoothのパッケージを指定する

Bluetoothのパッケージをimportします。Bluetoothを使うには、下記のパッケージが必要になりますので、同じように記述してもらえればいいと思います。

					import android.bluetooth.BluetoothAdapter;
					import android.bluetooth.BluetoothDevice;
					import android.bluetooth.BluetoothManager;
					

Bluetoothを有効にする

Bluetoothを使うには、BluetoothManagerというものに、サービスを登録する必要があります。そのあとに、Bluetoothのアダプタを登録すると、周辺にあるBluetoothのScanができるようになります。

					final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
					final BluetoothAdapter mBluetoothAdapter = bluetoothManager.getAdapter();
					mBluetoothAdapter.startLeScan(mLeScanCallback);
					

ここで注意して置くべき点として、startLeScanは推奨されていない実装方法になりますが、Android 5.0では問題ありません。ですが、今後VAB-630でサポートするOSのバージョンがアップすると、この実装も変更する必要はあります。その時は、AndroidのDeveloperサイトがサンプルコードも豊富なので、参考になると思います。

Android Developer Siteは、こちら

Bluetoothの再スキャンを個別に実装

今回の実装で、あまり使わないと思いますが、保険として実装したものがあります。それが、「ReScan」です。BletoothはScanをしている時が、もっとも電力を消費します。なので、モジュール自身でも常にリアルタムでスキャンをしているつもりでも、間欠動作になっています。間欠時間は、ランダムなので早い時があれば遅いタイミングの時もあります。もちろん、APIで指定することもできますが、今回はデフォルト設定で使用しています。

再スキャンですが、Discovery()という機能で、Scannerの停止と開始を指定することができます。もっといい実装方法があると思いますが、再スキャンする際には、一度Cancelするのが、ここでのポイントです。

					mBluetoothAdapter.cancelDiscovery();
					mBluetoothAdapter.startDiscovery();
					mBluetoothAdapter.startLeScan(mLeScanCallback);
					

Bluetoothのモジュール

今回は、建設業界ということでヘルメットの内部に、Bluetoothのモジュールを組み入れてみました。特に何か通信する訳でもないので、手元にあったBluetoothのモジュールを使いました。

今回使用したBLEモジュール今回使用したBLEモジュール

今回使用したヘルメットと、BLEモジュールの大きさ今回使用したヘルメットと、BLEモジュールの大きさ

ヘルメットにBLEモジュールを組み込んだ様子ヘルメットにBLEモジュールを組み込んだ様子

検出方法

Bluetoothの信号を検出するもっとも簡単な方法は、RSSI(Received Signal Strength Indicator:受信強度 dBmが単位)と呼ばれるBluetoothの信号レベルを調べることです。BluetoothのScan時に、どのモジュールがどのくらいの信号なのかを同時に知ることができます。モジュール自体は、コイン電池で、1-2ヶ月以上は動作します。

今回の実装は、このRSSI信号が、-50(dBm)を境に近いの、近くないのかを判断しています。もっとも近い信号レベルは、-30(dBm)でした。

補足

このRSSIは、本来W(ワット)表記が正しいです。たとえば、無線LANの受信強度を20mWとし、干渉波は0.00000001mW以下。ただ、これではなんとなくよく分からない。そこで、dBm表記をする。dBmとは、1mWのときの信号強度を0dBmとした相対数値。よって、小さい場合はマイナス表記になる。

【計算式:電力(dBm) = 10log電力(mW)】

  1. 10mWをdBmにすると、
    10log10=10x(log1 + 1)=10
  2. 0.1mWをdBmにすると、
    10log0.1=-10
  3. 0.00000001mWをdBmにすると、
    10log0.00000001=-80(dBm)
  4. -50dBmをmWにすると、
    10^(-50/10) = 0.00001(mW)

どのくらいで開発できるか?

IoTのアプリケーションは、短期間での開発を求められることも少なくありません。Androidのアプリといえども、同じことです。そこで活躍するのが、VIAの「Smart ETK」です。前回のコンテンツでもたっぷり紹介していますので、詳しい実装方法はそちらを参考にしてみてください。今回も、Smart ETKを使ってGPIOのポートを制御しています。どのように実装しているのか、紹介します。

Bluetoothの信号が指定した範囲に入ったらLEDを点ける

このようなシチュエーションはたくさんあると思います。SmartETKを使うことで、より簡単に扱うことができます。

					if (rssidCur < -56) {
					  bicomName.setText("今は安全です。");
					  if(mp.isPlaying()) {
					   mp.pause();
					  }
					  SmartETK.Gpio_Write(1, 0);
					  } else {
					   SmartETK.Gpio_Write(1,1);
					}
					

SmartETKによるGPIO制御

ここでは、rssidCurが-56dBmより小さな値(-60dBmなど)では、GPIOをOffにしています。それ以外の大きくなった場合(-50dBmなど)になると、GPIOをOnにしています。

					GPIO:On  SmartETK.Gpio_Write(1,1);
					GPIO:Off SmartETK.Gpio_Write(1,0);
					

SmartETKのGpioで12VのLEDをリレーで制御

GPIOの先には、LEDをつけていますが、12V系のブリンクタイプのLEDをしようしています。VAB-630から駆動できるGPIOは、3.3Vなので大電流が流せるリレーを介在させて、GPIOのOn/Offで12Vの信号をOn/Offさせています。こういったところも、実際のアプリケーションに近いものを想定してみました。

VAB-630の上に、リレーとLEDとスピーカーを搭載VAB-630の上に、リレーとLEDとスピーカーを搭載

VAB-630のGPIOは、D-SUBシュリンク15ピンコネクタを使っています。ピン配置は、データシートを確認してみてください。今回は、1番ピンを使用しています。

D-SubとリレーをつないでいるD-Subとリレーをつないでいる

ついでに音声もMediaPlayerで鳴らす

おまけ機能として、近づいたらLEDだけなく、音声も流せるようにしてみました。100均で購入した安いスピーカですが、なんとなく音は出ています。深追いはしませんが、アンプを通して、ボリュームを上げると、周囲の人にも聞こえると信じています。

まとめ

実装という意味では、あまり時間をかけなくても実装できるのが、AndroidとSmartETKの組み合わせです。最後の仕上げとして、実際に重機をイメージしたラジコンに無理やり搭載してみました。これからこのようなアプリを作ってみようと考えてる方の参考になればと思います。

ラズパイも悪くはないですが、こういったリアルなシステムを想定すると、VAB-630とSmartETKの組み合わせも、候補の一つとしてあげられるのではないでしょうか?

今回使用したソフトウェアは、以下からダウンロードできます。コード記述に、ムラがありますので、あまり突っ込まないでください。(うまく動かない場合は、twitter(@APS_WEB)のDMでご連絡ください!)