Arduino、Windows、Azureをベースにした転倒検知システム
コンポーネントと消耗品
> |
| × | 1 | |||
| ||||||
| ||||||
| ||||||
|
このプロジェクトについて
はじめに :
致命傷につながる転倒は、高齢者にとって無視できない大きな課題となっています。ここ数年、転倒検知領域でさまざまなアプローチが提案されており、ウェアラブルデバイスベース、アンビエンスセンサーベース、ビジョンベースの3つのタイプに説明および分類できます[1]。まず第一に、ウェアラブルデバイスは通常、加速度計、磁力計、ジャイロスコープなど、埋め込まれたセンサーを利用して体の動きと位置を検出します[2、3]。また、ウェアラブルデバイスベースのアプローチのコストは非常に低く、設置と操作は高齢者にとって複雑ではありません。第二に、アンビエンスベースのアプローチでは、常に圧力センサーを使用して体を検出および追跡します。このソリューションは、費用対効果が高く、導入も簡単です[4、5]。ただし、人体以外の物体を感知する可能性は、このアプローチの検出精度に顕著な課題をもたらします。最後になりましたが、ビジョンベースのソリューションは、展開されたカメラを最大限に活用して、人体を含む範囲内のすべてのオブジェクトを監視します[6、7]。観察スペースが限られており、ユビキタスモニタリングを実現できない一方で、上記の2つのアプローチよりも、人々の日常生活への侵入が少なくなっています。
このプロジェクトでは、リアルタイムの落下検出のためのArduino、Windows 10、およびMicrosoftAzureに基づく監視システムが提案されています。 3次元加速度計の生データは、ADXL345を搭載したArduinoによって提供されます。 Windows 10デバイスは、この情報を利用して、効率的なデータ融合および落下検出アルゴリズムによって対象の向きを取得します。 MicrosoftAzureサービスとモバイル/ PCアプリケーションは、インターネットにアクセスできる限り、いつでもどこからでもシームレスなデータ処理、分析、保存、および取得を実現するように設計されています。システムアーキテクチャを図1に示します。
<図>参考資料
[1] L.JianおよびT.E. Lockhart、「衝撃前の落下イベント検出アルゴリズムの開発と評価」、Biomedical Engineering、IEEE Transactions on、vol。 61、pp。2135-2140、2014。
[2] P. Pierleoni、A。Belli、L。Palma、M。Pellegrini、L。Pernini、およびS. Valenti、「高齢者の転倒検出のための高信頼性ウェアラブルデバイス」、Sensors Journal、IEEE、vol。 15、pp。4544-4553、2015年。
[3] R. Freitas、M。Terroso、M。Marques、J。Gabriel、A。TorresMarques、およびR. Simoes、「落下検出用のモバイルデバイスでサポートされるウェアラブルセンサーネットワーク」、SENSORS、2014 IEEE、2014、 pp。2246-2249。
[4] Z. Xiaodan、H。Jing、G。Potamianos、およびM. Hasegawa-Johnson、「ガウス混合モデルとGMMスーパーベクトルを使用した音響落下検出」、音響、音声および信号処理、2009年。ICASSP2009。IEEE International会議、2009年、69〜72ページ。
[5] L. Yun、K。C。Ho、およびM. Popescu、「Microsoft Kinectを使用した音響落下検出のための効率的なソース分離アルゴリズム」、Biomedical Engineering、IEEE Transactions on、vol。 61、pp。745-755、2014。
[6] M. Yu、S。M。Naqvi、A。Rhuma、およびJ. Chambers、「ビデオベースの落下検出システムに適用するための1つのクラス境界法分類器」、Computer Vision、IET、vol。 6、pp。90-100、2012。
[7] E. E.StoneおよびM.Skubic、「Microsoft Kinectを使用した高齢者の家庭での転倒検出」、Biomedical and Health Informatics、IEEE Journal of、vol。 19、pp。290-301、2015。
姿勢認識による転倒検出の原理
このプロジェクトでは、落下検出アルゴリズムは、BharadwajSreenivasanのAndroidでの落下検出に従って設計されています。アルゴリズムには、姿勢認識と転倒検出の2つのモジュールがあります。まず、加速度計からx、y、zの値を読み取ります。次に、x、y、zのL2ノルムを計算します。これは、姿勢認識および転倒検出モジュールで使用されます。
姿勢認識モジュールでは、ユーザーの姿勢は、座る、立つ、歩くの3つの基本的な姿勢に分類されます。 「y」の値には、方向を見つけるためのしきい値が適用されます。重力によるL2ノルムw.r.t平均加速度の変化率(9.8)を使用して、データを歩行または状態間の遷移に分類します。
落下検出モジュールは、信号内の特定のパターンを検索します。図2は、落下イベント中のL2ノルムの典型的なパターンを表しています。
<図>連続する最小値と最大値の差が2gより大きい場合、出力は低下として決定されます。転倒のイベントに関する最終決定は、姿勢認識と転倒決定モジュールの両方の出力に基づいています。転倒が検出されると、姿勢認識モジュールからの判断により、誤警報かどうかがわかります。状態がまだ歩いている場合は、秋のイベントの決定を破棄できます。表1は、最終決定をまとめたものです。
<図>前提条件
このプロジェクトでは、Arduinoデバイスの場合、Bluetooth通信は安価で小型のパッケージモジュールであるHC-06によって実現されます。 Windows 10デバイスの場合、SurfaceProとLumia1520を使用する場合、Bluetoothモジュールは必要ありません。ただし、RaspberryPiまたはMBMをWindows10 IoTデバイスとして使用する場合は、Bluetoothドングルが必要になります。環境をセットアップするには、MVPのDavidJonesのGenericSerial Bluetooth with Win 10 IoT-CoreRPI2を参照してください。
注:Windows10とVisualStudio 2015がまだセットアップされていない場合、前提条件を完了するには2〜3時間かかりますが、その時間のほとんどは無人です。
必要なもの
パーツ:
1. ArduinoUnoと標準のA / BUSBケーブル
2. HC-06Bluetoothモジュール
3.ADXL345加速度計モジュール
4.オス-オスおよびオス-メスのジャンパー線
5.ミニブレッドボード
6. Lumia1520またはその他のWindowsPhone10互換デバイス
7. ORICOBluetoothモジュール
プロジェクトの説明
ステップ1:加速度計モジュールADXL345をArduinoに接続します
時間 :5分
パーツ :Arduino Uno R3、ADXL345、ジャンパー線、ミニブレッドボード
ツール :該当なし
ADXL345は、最大+ -16 gの高分解能(13ビット)測定を備えた、小型、薄型、低電力の3軸MEMS加速度計です。デジタル出力データは16ビットの2の補数としてフォーマットされ、SPI(3線式または4線式)またはI2Cデジタルインターフェースのいずれかを介してアクセスできます。
ADXL345はSPIとI2Cの両方をサポートしています。このプロジェクトでは、ここでI2Cについて説明します。 I2Cは2線式シリアル接続であるため、通信のためにSDA(データ)およびSCL(クロック)ラインをArduinoUNOに接続する必要があります。 Arduino UNOでは、SDAはアナログピン4にあり、SCLはアナログピン5にあります。センサーのVCCピンとCSピンの両方が3.3vに接続されていることを確認してください。 CSを3.3Vに接続して、SPIデバイスではなくI2Cデバイスとして使用することをセンサーに通知します。
<図>ステップ2:Bluetoothモジュールを接続する
時間 :5分
パーツ :Bluetoothモジュール、ジャンパー線
ツール :該当なし
このプロジェクトでは、BluetoothモジュールとしてHC-06を使用します。これは、SparkFunのBlueSMiRFシルバーモジュールよりもはるかに安価です。さらに、HC-05には「フル」ファームウェアと多くのATコマンドがあり、マスターモジュールとスレーブモジュールの両方にすることができます。一方、HC-06ファームウェアは、ATコマンドが非常に制限されたスレーブデバイスにしかなれません。次の表は、すべてのHC-06ファームウェアコマンドとその応答を示しています。
<図>まず、Bluetoothモジュールをブレッドボードに接続して、接続を簡単にします。モジュールに電力を供給するために、Arduinoの5V電源レールからモジュールのVccピンにジャンパーを実行します。そして、モジュールのGNDピンからArduinoのGNDピンのいずれかにオス-オスジャンパーを実行します。シリアル通信を確立するには、BluetoothモジュールのTXピンからArduinoのRXピン(デジタルピン0)にオス-オスジャンパーを接続し、モジュールのRXピンからArduinoのTXピン(デジタルピン1)に別のジャンパーを接続します。
注:BluetoothのTXピンとRXピンがArduinoに接続されている場合、ArduinoIDEからArduinoにスケッチをアップロードすることはできません。スケッチをアップロードする必要がある場合はそれらを切断し、スケッチが正常にアップロードされたら再接続します。下のスケッチでは、HC-05が使用されていることが示されています。実際、上で説明したように、HC-05とHC-06はどちらも問題ありません。
<図>Bluetoothと加速度計を接続すると、実物は次のように表示されます。
<図> <図>ステップ3:BluetoothモジュールとWindows10デバイスのペアリング
時間 :5分
パーツ :Bluetoothモジュール、Windows 10デバイス、ORICO Bluetoothモジュール(オプション)
ツール :該当なし
Bluetoothモジュールは、SPP(Serial Protocol over Bluetooth)プロトコルを実行します。したがって、SPPをサポートするすべてのデバイスがSPPに接続できます。 Windows 10デバイスでは、これは仮想COMポートのように見えます。接続する前に、モジュールの電源が入っていて、ペアリングの準備ができていることを確認してください。モジュールの赤いLEDはステータスを示します。点滅は「ペアリングの準備ができている」ことを意味し、点灯している場合は「ペアリングされている」ことを意味します。
Windows 10 for PCでは、[設定]-> [デバイス]-> [Bluetooth]に移動し、Bluetoothを開くと、画面に「HC-06」モジュールが表示されます。タップしてデバイスをペアリングし、デバイスのペアリングコードを入力します。デフォルトのペアリングコードは1234であり、デフォルトのシリアルポート速度は9600ボーであることを忘れないでください。次に、Bluetoothページは次のように表示されます。
<図>Windows 10 for Mobileの場合は、[設定]-> [デバイス]-> [Bluetooth]に移動し、上記のセクションで説明したのと同じ手順を実行します。ペアリングされたデバイスのページは次のように表示されます:
<図>Raspberry Pi 2、MBM、Dragon Board410cなどのWindows10 IoT Coreデバイスの場合、ペアリングプロセスは大きく異なります。まず、Bluetoothモジュールが搭載されていないRaspberry Pi 2とMBMの場合は、Bluetooth USBドングルを購入してプラグインする必要があります。ハードウェア互換性リストを参照して、検証済みのBluetoothUSBドングルを選択してください。
<図>このプロジェクトでは、ORICOBTA-403モジュールを選択します。
Dragon Board 410cでこのプロジェクトを試す場合、Dragon Board 410cにはBluetoothモジュールが搭載されているため、Bluetoothドングルは必要ありません。
次のように、ORICO BTA-403 BluetoothUSBドングルをRaspberryPi2のUSBインターフェイスに接続します。
<図>ORICO BTA-403 Bluetooth USBドングルを接続すると、Windows 10 IoTCoreデバイスのデフォルトのアプリ画面にメッセージが表示されます。
<図>Windows 10 IoT CoreデバイスでのBluetoothペアリングについては、BLEデバイスとGATT属性テーブルダンプツールのペアリングページを参照し、「センサータグのペアリング」セクションで説明されている「ステップ1 –ステップ6」に従ってください。ここでは、SSHを使用してWindows IoT Coreに接続し、コマンドラインツールを実行してデバイスを構成する必要があります。
注:メインメニューでBRモードを選択する必要があることに注意してください。また、デフォルトのペアリングコードは1234です。
ペアリングが成功すると、デバイスのBluetoothページは次のように表示されます。
<図>ステップ4:Azureストレージアカウントを作成する
時間 :10分
パーツ :該当なし
ツール :Azureアカウント
このプロジェクトでは、Windows 10 IoTCoreデバイスからのデータを格納するためのAzureStorageTableが必要になります。したがって、次のように作成できます。
(1)Azure管理ポータル(https://manage.windowsazure.com)で、左側にある[STORAGE]アイコンをクリックして、既存のストレージアカウント(存在する場合)を表示し、[+ NEW]ボタンをクリックします。左下隅にあります。
(2)「新規」パネルで「データサービス」|を選択します。 「ストレージ」| 「クイッククリエイト」。 「URL、ロケーション/アフィニティグループ、レプリケーション」のフィールドに入力し、「ストレージアカウントの作成」ボタンをクリックします。
(3)新しいストレージアカウントのステータスが「オンライン」と表示されるのを待ちます。
<図>(4)新しく作成したストレージアカウントを選択し、ページの下部にある[アクセスキーの管理]をクリックします。ストレージアカウント名とアクセスキーの1つをコピーします。
<図>ステップ5:Azureストレージテーブルを作成する
Azure Storage Explorer(codeplexで利用可能なサードパーティのオープンソースツール:https://azurestorageexplorer.codeplex.com)を使用して、Azure StorageTableを作成します。
(1)アカウントの追加に移動し、アカウント名とアクセスキーを入力します。アカウントが確立されると、BLOBコンテナー、キュー、およびテーブルを表示するストレージにアクセスできます。
(2)テーブルを選択し、新しいボタンをクリックして、次のように「加速度計テーブル」という名前の新しいテーブルを作成します。
<図>ステップ5:コードをダウンロードしてデプロイする
時間 :10分
パーツ :該当なし
ツール :該当なし
まず、すべてがArduinoに接続されたので、「ADXL345_HC06.ino」プロジェクトを(以下のコードセクションで提供)からダウンロードして、PCのArduinoIDEにロードします。必ずHC-06モジュールのTX / RXジャンパー線を抜いてから、スケッチをアップロードしてください。 TX / RXジャンパー線をArduinoのデジタル0ピンとデジタル1ピンに再接続します。電源を入れると、アプリケーションはArduinoUnoで実行されます。
次に、githubから「GenericBluetoothSerialUWApp」プロジェクトをダウンロードします。 Visual Studio2015とUpdate1を使用して、「GenericBluetoothSerialUWApp」を読み込みます。このアプリは、MVPのDavidJonesの汎用シリアルBluetoothとWin10 IoT-CoreRPI2を使用して設計されています。このUWPアプリをPCで実行する場合は、ローカルデバイスのデバッグでx86またはx64を選択します。このUWPアプリをWindows10 Mobileで実行する場合は、[デバイスデバッグ付きのARM]を選択します。このUWPアプリをWindows10 IoTデバイス(Raspberry Pi 2など)で実行する場合は、デバイスに「リモートデバッグ」ポイントを設定してください。
次に、ソリューションエクスプローラーでMainPage.xaml.csを開き、「dataTransferTick」を見つけます。セクション4で保存したストレージアカウント名とアクセスキーを追加します。
<図>HC-06をWindows10デバイスとペアリングした後、Visual StudioからF5キーを押して、ユニバーサルWindowsプラットフォームアプリを起動します。
<図>「HC-06」記号をダブルタップすると、アプリケーションの最上部に次のようにIDと名前が表示されます。
<図>間もなく、HC-06のLEDの状態が点滅から点灯に変わることがわかります。また、Bluetoothモジュールの通信チャネルが確立されるとすぐに「StartRev」ボタンが有効になります。
<図>[受信の開始]をクリックして、データの受信を有効にします。次に、[受信の停止]、[データの処理]、および[データのアップロード]ボタンが有効になっていることがわかります。 [データの処理]ボタンをクリックするだけで、落下検出アルゴリズムを実行できます。 RecvdTextBlockのデータとデバイスを持っている人の状態が表示されます。
<図>データは、次のようにVisualStudioのデバッグウィンドウに表示されます。
<図>次に、[アップロード]ボタンをクリックして、データをAzureにアップロードします。データは3秒ごとに送信されます。時間間隔を変更したい場合は、「AzureButton_Click」のコードを次のように変更できます。
private void AzureButton_Click(object sender、RoutedEventArgs e){
timerDataTransfer =ThreadPoolTimer.CreatePeriodicTimer(dataTransferTick、TimeSpan.FromMilliseconds(Convert.ToInt32( 3000 )));
}
間もなく、AccelerometerTableのデータが次のように表示されます
<図>第三に、githubから「FallDetectionClient」をダウンロードします。 Visual Studio2015とUpdate1を使用して、このプロジェクトを読み込みます。このアプリケーションはWindowsUniversal Templeで構築されているため、Windows 10 PC / Mobile、およびWindows 10 IoTCoreデバイスで実行できます。次に、ソリューションエクスプローラーでStorageSensor.csを開き、「_ accountName」と「_key」を見つけます。セクション4で保存したストレージアカウント名とアクセスキーを追加します。
これで、Visual StudioからF5キーを押すことができるはずです。アプリがデプロイされて起動し、デバイスの出力にこれが表示されます。
<図>
コード
- Arduinoスケッチ(ADXL345_HC06.ino)
Arduinoスケッチ(ADXL345_HC06.ino) Arduino
ADXL345加速度計+ HC-06Bluetoothモジュール#include#include #define Register_ID 0#define Register_2D 0x2D#define Register_X0 0x32#define Register_X1 0x33#define Register_Y0 0x34#define Register_Y1 0x35#定義Register_Z00x36#define Register_Z1 0x37int ADXAddress =0xA7>> 1; int reading =0; int val =0; int X0、X1、X_out; int Y0、Y1、Y_out; int Z1、Z0、Z_out; double Xg、Yg、Zg; void setup(){Serial.begin(9600); Wire.begin(); delay(100); Wire.beginTransmission(ADXAddress); Wire.write(Register_2D); Wire.write(8); Wire.endTransmission();} void loop(){double tempx =0; char strx [5]; double tempy =0; char stry [5]; double tempz =0; char strz [5];文字列gy; Wire.beginTransmission(ADXAddress); Wire.write(Register_X0); Wire.write(Register_X1); Wire.endTransmission(); Wire.requestFrom(ADXAddress、2); if(Wire.available()<=2); {X0 =Wire.read(); X1 =Wire.read(); X1 =X1 <<8; X_out =X0 + X1; } Wire.beginTransmission(ADXAddress); Wire.write(Register_Y0); Wire.write(Register_Y1); Wire.endTransmission(); Wire.requestFrom(ADXAddress、2); if(Wire.available()<=2); {Y0 =Wire.read(); Y1 =Wire.read(); Y1 =Y1 <<8; Y_out =Y0 + Y1; } Wire.beginTransmission(ADXAddress); Wire.write(Register_Z0); Wire.write(Register_Z1); Wire.endTransmission(); Wire.requestFrom(ADXAddress、2); if(Wire.available()<=2); {Z0 =Wire.read(); Z1 =Wire.read(); Z1 =Z1 <<8; Z_out =Z0 + Z1; } Xg =X_out / 256.00; Yg =Y_out / 256.00; Zg =Z_out / 256.00; if(Xg> 0){gy =String( "")+ "x =+" + Xg; } else {gy =String( "")+ "x =" + Xg; } if(Yg> 0){gy + =String( "")+ "y =+" + Yg; } else {gy + =String( "")+ "y =" + Yg; } if(Zg> 0){gy + =String( "")+ "z =+" + Zg + "、"; } else {gy + =String( "")+ "z =" + Zg + "、"; } Serial.print(gy);}
Bluetoothシリアルアプリ
HC-06 Bluetoothを介してArduinoと通信し、ADXL345データをAzurehttps://github.com/shijiong/FallDetection/tree/master/GenericBluetoothSerialUWAppに送信しますFallDetectionClient
秋の検出用のUWPクライアントアプリhttps://github.com/shijiong/FallDetection/tree/master/FallDetectionClient 回路図
ADXL345 + HC-06 ADXL345接続用の%20Schematic.fzzSketchを完了します製造プロセス
- PythonでArduinoとRFIDを使用した出席システム
- ArduinoUnoを使用した人間検出ロボティクスシステム
- Windows 10UWPアプリ用のPM2.5およびPM10検出器の設計
- 森林火災監視および検出システム(SMSアラート付き)
- u-blox LEA-6H 02GPSモジュールとArduinoおよびPython
- ArduinoおよびOLEDベースのセルオートマトン
- eDOT-Arduinoベースの精密時計および気象観測所
- ArduinoとGoogleスプレッドシートに基づく出席システム
- Arduinoベースの衝突検出警告システム
- ArduinoUnoとBluetoothによる車の制御
- ArduinoとAndroidベースのパスワードで保護されたドアロック