Arduino+加速度センサー（KXR94-2050）+SDカードシールド+乾電池で簡易な振動測定をやってみる

#はじめに
海底地すべりを簡易な計測器で測定できないかという命題にあたりました。Iotだと電波を飛ばすため、アンテナ部分やバッテリーを地上部に用意する必要があります。海底ブイなどがありますが、高波にも耐えられるような頑丈な構造が必要で、かなり高額で大掛かりになってしまいます。そこで、Arduino+加速度センサー+乾電池で、どこまで使え実現性があるか、可能性を確かめてみました。

#材料
材料は以下を用いました。いずれも秋月電子やAmazonなどで用意に手に入ります。

* Arduino Uno
* SDカードシールド
* USB2.0ケーブル(A-Bタイプ)50cm
* ブレッドボード
* 単1型乾電池
* Micro SDカード32G
* ３軸加速度センサモジュール　KXR94-2050
* 電池ボックス　単１×２本用（プラスチック・リード付）

接続するとこんな感じになります。テスト用含めると今回3セット作成しました（写真を参照）。
 ![DLRuK_zU8AAl2DW.jpg](https://qiita-image-store.s3.amazonaws.com/0/278731/0fdbf178-ee34-f575-abf2-50e1d430a0bf.jpeg)

#稼動時間の計算
乾電池4個（単一）の並列つなぎでArduino+加速度センサーがどれくらい稼動するか計算しました。条件は以下の表の一般的な値を用いました。センサーを使用するとやはり少し電流が増えるようです。

【ボード・センサーの電力】

|　ボード  |電圧  |電流  | Wh(a) |
|---|---|---|---|
| Arduino Uno  |5.0V  |0.025A  |0.125|
| Arduino Uno + KXR94-2050 |5.0V  |0.050A  |0.250|


【乾電池の容量】

|　種類  |  電流  |  電圧  |
|-------|-------|-----|-------|
| 単一 |  12500mAh ～ 17000mAh  | 1.5V |
| 単二 |  5700mAh ～ 7700mAh  | 1.5V |
| 単三 |  2000mAh ～ 2700mAh  | 1.5V |
| 単四 |  850mAh ～ 1300mAh  | 9V |

【稼動時間の計算】

```math
\frac{電池電流(mAh)}{1000} × 電池電圧（V）×電池個数（n）=Wh（b)･･･電池全容量 \\
\ Wh（b） \div Wh(a) = 稼動時間（h） \\
```

上記の条件と計算式を用いた場合、稼動時間は約10日と推定されました。Arduinoがけっこう電池を食ってしまうせいか、あまり長く持ちません。タイマーセットで、稼動時間を制限したり、Arduino microを使えば随分違うのかもしれませんが、ひとまず今回はUnoで検証しました。

【参考サイト】

* https://qiita.com/windows222/items/1f4834cecb63f578877c
* http://blog.livedoor.jp/victory7com/archives/46227409.html
* http://www.usagi1975.com/19aug170655/


#Arduinoスケッチの例
Arduinoには時計が備わっていないため、ロギングされた時間は、稼動し始めた時間を2000/1/1 0:00とし、データ吸い上げ後、Excel上で逆算して算出するようにしました。Sleepの値はそれぞれの環境に応じて変更してください。

```bash
#include <SD.h>
#include <TimeLib.h>
#include <stdarg.h>

const int chipSelect = 4;
byte val=0;

void setup(){
    pinMode(SS, OUTPUT);
    SD.begin(chipSelect);
    setTime(0, 0, 0, 1, 1, 2000);
    Serial.begin(9600);
}

String myPrintf(char *fmt, ...) 
{
    char buf[128];
    String result;
    va_list args;
    va_start(args, fmt);
    vsnprintf(buf, 128, fmt, args);
    va_end(args);
    //Serial.print(buf);
    result = buf;  
    return result;
}

void loop(){
    //シリアル読み取り
    val = Serial.read();
    
    File dataFile = SD.open("datalog.txt", FILE_WRITE);

    float x , y , z ;
    x = x + analogRead(3)  ;  // Ｘ軸を読込む
    y = y + analogRead(4)  ;  // Ｙ軸を読込む
    z = z + analogRead(5)  ;  // Ｚ軸を読込む
    
  if (dataFile) {
    String value;
    value = String(x) + "," + String(y) + "," + String(z) + "," + myPrintf("%02d:%02d:%02d", hour(), minute(), second() ) + myPrintf(",%02d/%02d/%04d", day(), month(), year() );
    dataFile.println(value);
    dataFile.close();
    Serial.println(value);
  }
  //10min
  delay(600000);
}


```

#結果（その1：電圧降下）
Amazon乾電池を用いて、実際に連続稼動してみました。USBの電圧チェッカーを用いて、定期的に電圧の状況を調べました。10日目になると3Vまで電圧降下し、Arduinoの正常な稼動に耐えられなくなります。やはり計算どおりでした。

![電圧降下.JPG](https://qiita-image-store.s3.amazonaws.com/0/278731/38ec8eb5-9e21-3bbf-e365-ad0134178c30.jpeg)


#結果（その2：センサーの値）
加速度センサーのx,y,zの値が、SDカードに書き込まれています。時間もしっかり刻まれております。

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/278731/ecde4949-bdf4-f150-3c9c-aa5ee91f7060.jpeg)

自分で少し傾けたりして遊んでみました。ちゃんと反応しているようです。

![キャプチャ2.JPG](https://qiita-image-store.s3.amazonaws.com/0/278731/8ab3a2f6-37bb-0275-0bff-cd72294e3c0f.jpeg)


#おわりに
今回は、Arduinoを用いて乾電池式のロガータイプの振動計を作成してみました。稼動時間については、ロガータイプであれば最低でも1ヶ月は持ってほしいものです。ですので、まだこれから改良は必要かと思います。また、振動の計測には、加速度センサー（KXR94-2050）そのものの精度の検証も必要となると思います。この辺については、また別の記事にて投稿します。