はじめに
SensoDuinoは、Androidに、GSM、GPS、ジャイロスコープといった機能をもつ12個以上のセンサーを、まるでシールドとしてArduinoに接続したかのようにするアプリです。本物のArduino用シールドのように積み重ねたり、接続する必要はありませんが、シールドとしての働きをします。SensoDuinoは、Androidデバイスに内蔵されたセンサーからの計測データを、Arduino UNOをはじめとした任意のデバイスへ、HC-05 Bluetoothモジュールを経由し伝送する、フリーのAndroidアプリです。
こちらからSensoDuinoがダウンロードできます。
計測データは、CSVファイル(カンマ区切りのテキストファイル)に保存されます
。
このアプリは、HC-05(シリアルBluetoothモジュール)で設計・テストされています。他のBluetoothモジュールでは、稼働したり稼働しなかったりするかもしれません。
センサーデータ測定/送信/ロギングについての周期を変更設定することが可能です(センサーベンダの仕様を上限とします)。
また、携帯電話とArduino UNOを接続する際、(ケーブル、ハブ等の)USB接続用ハードウェアが不要になります。Arduino UNOと接続するには、HC-05 Bluetoothモジュール(または同等品)だけあれば良いです。
筆者が持っているサムスンGaraxy II PlusのようなミッドレンジAndroidデバイスがあれば、Arduino UNOでプロジェクトを作成するために必要なセンサーや部品の購入代金200ドル以上が節約できます。
サポートするセンサー
SensoDuinoは、以下のAndroid内蔵センサーを認識します。
- GPS
- 方位センサー
- 重力センサー
- 回転ベクトルセンサー
- ジャイロセンサー
- 加速度センサー
- リニア加速度センサー
- 磁気センサー
- 照度センサー
- 音量センサー
- 近接センサー
- 気圧センサー
- 温度センサー
- 相対湿度センサー
ソフトウェアセンサー(仮想センサー)は、搭載されるハードウェアセンサーに依存して機能します。
たとえば、重力センサー、リニア加速度センサー、回転ベクトルセンサーといったソフトウェアセンサーは、Androidデバイスに実装されたハードウェア・ジャイロセンサーに依存して機能します。
SensoDuinoは、Android上で使えるセンサーをスキャンし、Android上でサポートされるソフトウェア/ハードウェアセンサーをリストする機能もあります。主要な仕様(最大消費電力、分解能、製造者、ほか)も合わせてリストされます。
異なるベンダーから提供された同一機能のセンサーを重複して有するAndroidデバイスもあります。Android SDKは、デフォルトのセンサーを返します。
【訳者注:Android SDKのSensorManager.getDefaultSensor() というメソッドを使用すれば、上記のようなケースで、デフォルトのセンサーを取得することが可能です。】
主要機能
- Android内蔵センサーを読取
- センサーの測定値をCSVファイルに保存
- 測定値は、CSV(ASCII文字がカンマで区切られたフォーマット)で、Bluetoothを経由し伝送
- Androidデバイス内蔵センサーについて、ハードウェアセンサーまたはソフトウェアセンサーの両方を一覧表示
- センサデータ測定/送信/ロギング周期を100ミリ秒~10分の間で設定可(センサーの仕様を上限とする)
- センサー測定値について記録時の精度が追跡可(センサーデータが不正確であった場合の解析時に視覚的ヒントが得られます)
- Androidデバイス内蔵GPSを利用した位置情報(緯度経度)センサーの読取
- 操作速度や転送速度を最適化
- センサーデータのログ欠落防止のため、デバイスをアウェイク状態にキープ(スリープ状態に移行しない)
SensoDuinoで出来ること
SensoDuinoを使って、Arduino等により、ロボット制御やUAV(無人航空機)操縦ができるでしょう。12モーションをサポートする環境センサーがあるので、数値化可能な計測対象を広範囲にカバーします。
また、SensoDuinoを使って測定値のロギングができます。ロギング間隔を100ミリ秒~10分の間で設定できるので、センサー測定値の時系列ロギングを高頻度にできます。
ステップ1:SensoDuino の使用方法
SensoDuino の使い方は非常に簡単です。まず、画面にはセンサー名が各行に表示されます(センサーの数は将来変更される場合があります)。
各センサーには、横に、ON、TX、LOGと、3つのチェックボックスがあります。
チェックボックスで、センサーをオン/オフに切り替えます。
オン=計測中/オフ=計測停止中を表します。
TX:
チェックボックスをチェックすると、SensoDuinoとペアリング接続したHC-05(Bluetoothシリアルデバイス)に、該当センサーの測定値をBluetooth経由で送信します。
LOG:
チェックボックスをチェックすると、AndroidのSDカードのルート(最上位階層)にある「sensoduino.txt」という名のCSVファイルへ、該当センサーの測定値が記録されます。
センサーの測定頻度
環境設定メニューから、センサー測定周期を設定することができます。
100ミリ秒~10分の間で設定できます。センサーの速度は、ベンダー仕様の上限に従うものとします。
今日のほとんどのGPSセンサーは、秒あたり1回(1Hz)で位置データを生成しますが、中には、秒あたり10回(10Hz)の位置データを生成するGPSモジュールもあります。
また、他方では速度スペクトルを利用し、マイクロ秒の頻度で測定値を生成するセンサーもあります。
センサーの感度
モーションセンサー(ジャイロセンサー、加速度センサー、磁気センサー)は、多少の磁場や揺れがあるような環境条件でも敏感に反応します。したがって、お持ちのAndroidが平らな静止面上に置かれた場合でも、計測可能な最下位桁あたりでふらつき表示がされることがあります。
モーションセンサー計測値の最下位桁をそのまま使用してしまうと、アプリによっては不必要なデータになるかもしれません。アプリ要件に応じ、最下位桁を切り捨てるか、保持するかを決める必要があります。
ステップ2:HC-05へArduinoを配線
テキストファイルに、センサー測定値のロギングを開始させ、その後、ロギングされたデータを、無数にあるグラフ/データ分析ツールを使って処理すればよいだけです。
もし無線でArduinoにセンサー測定値を送信する、といった付加価値を付けたいのであれば、HC-05 Bluetoothシリアルモジュールを入手しましょう。
HC-05は、SMD(表面実装版)とブレイクアウトボード版(変換基板版)の2バージョンがあります。両方とも、eBayからわずか10ドルほどで購入することができます。
ただし、半田付けとデバッグ時の面倒臭さを回避したいのであれば、ブレイクアウトボード版HC-05のご購入を強く推奨します。
こちらのブレイクアウトボード版は、ペアリング中/接続中/コマンドモード表示/電源切断といった状態を、LED点滅パターンで表示する・・・などといった機能面での優位性があります。
3.3V→5Vへの変換
ArduinoのTXピンは、2kΩ+1kΩの抵抗器を使用し、5Vを3.3Vへ分圧(ドロップ)した後に接続します。これは、HC-05側の3.3V RXピンを保護するためです。いっぽう、Arduino の5V RXピンは、HC-05 TXピンから送信された 3.3Vを扱うことが出来ます。
ArduinoのTX出力を分圧しなかった場合、HC-05が正常に稼働しないのは言うまでもないでしょう。
Arduinoスケッチをアップロードするときの注意
Arduinoのスケッチをアップロードする際は、シリアル通信チャネルの競合を回避するため、HC-05モジュールの電源を切断する必要があります。代わりに、Arduinoの「SoftwareSerial」ライブラリーでサポートされる、違うArduino上のピン(即ち0ピン/1ピン以外のピン)へ、HC-05モジュールのTX/RXピンを接続するといった方法もあります。
ステップ3:SensoDuino→Arduinoへ送信
下記URLで公開しているArduinoプロジェクトでは、SensoDuinoから送信されたセンサーデータの利用方法についてデモしております。Bluetooth-controlled Pan/Tilt Servo Platform Using Android (SensoDuino) & Arduino
このプロジェクトでは「Pan/Tilt Servo Platform」(向きを左右上下に振るためのサーボモーター基板)の角度を制御するために、Androidデバイス上の加速度センサーを取り入れています。
SensoDuinoは、HC-05 Bluetoothモジュールを経由し、Arduinoへセンサー測定値を送信します。HC-05の同等品ですと、そのままで稼働するかもしれませんし、あるいはデフォルト設定の変更が必要かもしれません。
下記Arduinoのスケッチファイル「sensoduino.ino」は、Bluetooth経由でSensoDuinoが送信した計測データを読込み、データを解析して文字列から数値に変換します。
/*
PROJECT: SensoDuino 0.17
PROGRAMMER: Hazim Bitar (techbitar at gmail dot com)
DATE: Sep 30, 2013
FILE: sensoduino.ino
LICENSE: Public domain
*/
// センサー番号は名称に変換してください
// 【訳者注:このコードをそのまま使用すると、
// センサー番号がそのままシリアル出力されますので、
// 例えば '1'→'ACCELEROMETER' などのように、
// センサー番号から名称に変換するロジックを
// 適宜追加し、シリアル出力してください】
#define START_CMD_CHAR '>'
#define END_CMD_CHAR '\n'
#define DIV_CMD_CHAR ','
#define DEBUG 1 // センサーデータをシリアル出力しない場合は値を 0 に変更
String inText;
float value0, value1, value2;
void setup() {
Serial.begin(115200);
Serial.println("\nSensoDuino 0.13 by TechBitar.com (2013).\n");
Serial.println("Android Sensor Type No: ");
Serial.println("1- ACCELEROMETER (m/s^2 - X,Y,Z)");
Serial.println("2- MAGNETIC_FIELD (uT - X,Y,Z)");
Serial.println("3- ORIENTATION (Yaw, Pitch, Roll)");
Serial.println("4- GYROSCOPE (rad/sec - X,Y,Z)");
Serial.println("5- LIGHT (SI lux)");
Serial.println("6- PRESSURE (hPa millibar)");
Serial.println("7- DEVICE TEMPERATURE (C)");
Serial.println("8- PROXIMITY (Centimeters or 1,0)");
Serial.println("9- GRAVITY (m/s^2 - X,Y,Z)");
Serial.println("10- LINEAR_ACCELERATION (m/s^2 - X,Y,Z)");
Serial.println("11- ROTATION_VECTOR (Degrees - X,Y,Z)" );
Serial.println("12- RELATIVE_HUMIDITY (%)");
Serial.println("13- AMBIENT_TEMPERATURE (C)");
Serial.println("14- MAGNETIC_FIELD_UNCALIBRATED (uT - X,Y,Z)");
Serial.println("15- GAME_ROTATION_VECTOR (Degrees - X,Y,Z)");
Serial.println("16- GYROSCOPE_UNCALIBRATED (rad/sec - X,Y,Z)");
Serial.println("17- SIGNIFICANT_MOTION (1,0)");
Serial.println("97 - AUDIO (Vol.)");
Serial.println("98 - GPS1 (Lat., Long., Alt.)");
Serial.println("99 - GPS2 (Bearing, Speed, Date/Time)");
Serial.println("\n\nNOTE: IGNORE VALUES OF 99.99\n\n");
Serial.flush();
}
void loop()
{
Serial.flush();
int inCommand = 0;
int sensorType = 0;
unsigned long logCount = 0L;
char getChar = ' '; // シリアル入力
// 入力データを待つ
if (Serial.available() < 1) return; // 入力が無ければ、先頭に戻る
// 入力が、開始コマンド文字かどうかを判定
getChar = Serial.read();
if (getChar != START_CMD_CHAR) return; // 開始コマンド文字 ’<‘ でなければ、先頭に戻る
// 続けて入力された番号と値を解析(数値変換)する
sensorType = Serial.parseInt(); // センサー種類(番号)
logCount = Serial.parseInt(); // ログを記録した件数(連番)
value0 = Serial.parseFloat(); // 計測値1
value1 = Serial.parseFloat(); // 計測値2(もしあれば)
value2 = Serial.parseFloat(); // 計測値3(もしあれば)
if (DEBUG) {
Serial.print("Sensor type: ");
Serial.println(sensorType);
Serial.print("Sensor log#: ");
Serial.println(logCount);
Serial.print("Val[0]: ");
Serial.println(value0);
Serial.print("Val[1]: ");
Serial.println(value1);
Serial.print("Val[2]: ");
Serial.println(value2);
Serial.println("-----------------------");
delay(10);
}
}
こうしてArduinoのアプリケーションが、ロボットの制御や、UAVの操縦、センサーデータのロギングのために計測データを利用することが出来るようになります。
ArduinoにSensoDuinoを接続する作業は簡単です。
おおかたのBluetooth通信の通り、お手持ちのAndroidデバイスと、Arduinoに接続されたHC-05 Bluetoothモジュールをペアリングさせてください。ペアリングは1回だけ行なえば良いです。
Arduinoの0ピン/1ピンが、HC-05 Bluetoothモジュールへ接続されているにもかかわらず、スケッチのアップロード(書込み)時にエラーが発生する場合は、前ステップを参照していただき、問題解決してください。
【訳者注:即ちArduino TX出力の分圧方法や、書込み時にHC-05が電源切断されているかを再確認し、異なっていれば修正ください。】
ステップ4:SensoDuinoデータを、ファイルへロギングし、Excelへインポート
SensoDuinoのログは、全てのセンサデータについて、同一のフォーマットでCSVファイルに出力されますので、Excelや、その他の分析/グラフ作成ツールへ、簡単にインポートできます。ロギングされるセンサー測定値は、以下のフォーマットになります。
センサー種類(文字列)
連番(整数)
値1またはX(浮動小数点数)
値2またはY(浮動小数点数)
値3またはZ(浮動小数点数)
精度(整数)
No Comment to " 最安で14種類の複数のセンサーを手に入れてる方法:SensoDuino "