ESP8266と3軸加速度センサーADXL345を使って振動を測定し、IoTデーター可視化サービスAmbientで可視化します。
3軸加速度センサーADXL345
ADXL345は次のような仕様の3軸加速度センサーです。
- 設定により±2Gから±16Gまで測定可能
- 分解能は1ビット当たり3.9mG(設定による)
- SPIとI2Cでアクセス可能
この他にもタップ、ダブルタップの検出、動きの有無の検出など豊富な機能を持っています。
ADXL345の制御にはESP8266を使います。ESP8266とADXL345はSPIで接続しました。
ESP8266 | ADXL345 |
---|---|
3V3 | VDD |
GND | GND |
IO14 | SCL |
IO12 | SDO |
IO13 | SDA |
IO5 | CS |
プログラム
振動と言っても様々な振動がありますが、今回は建物の振動を測ることにします。振動の周波数は建物によりますが、50Hzぐらいまでを測定することにして、10m秒間隔で加速度センサーの値をサンプリングすることにしました。
センサーのx軸、y軸を水平方向、z軸を鉛直方向になるように設置すると、x軸、y軸はほぼ0G、z軸は重力の約1Gの加速度がかかった状態になります。そこで最初に10m秒間隔で100回、x軸、y軸、z軸の加速度を測定して平均値を求め、これを基準値にします。振動の測定値はセンサーから読んだ値と基準値の差分にします。ADXL345の分解能は1ビット3.9mGなので3.9倍すると加速度が得られます。
プログラムでハマったのはSPIのモード設定でした。ADXL345のデーターシートには、次のように書いてあります。
SCLK はシリアル・ポート・クロックであり、非伝送時にCSがハイレベルの場合、SCLK はハイレベルにしてください。データは、SCLK の立上がりエッジでサンプリングしてください。
この説明はSPI Mode3です。ところが
SPI.setDataMode(SPI_MODE3);
とすると正しそうな値が取得できません。「ESP8266 ( ESP-WROOM-02 ) SPI 通信高速化、その2」というブログに「ESP8266 のSPI ライブラリでは、SPI.setDataMode(SPI_MODE2); は Mode 3 です!!」と書いてあるのを見つけ、
SPI.setDataMode(SPI_MODE2);
としたところ、正しい値を取得することができました。
プログラムはGithubに公開しました。
プログラムをビルドするにはAmbientのArduinoライブラリーが必要です。インストール方法は「Arduino ESP8266で温度・湿度を測定し、Ambientに送ってグラフ化する」をご覧ください。
データー測定
プログラムをビルドして動かしてみました。Wi-Fiに接続し、基準となるx、y、z軸の加速度を測定して表示した後、10秒間、振動を測定します。試しにセンサーを置いた机をx軸方向、y軸方向、z軸(鉛直)方向に、それぞれ3回ずつ軽く叩いて見た時の様子が最初に載せたグラフです。
x軸、y軸、z軸それぞれの方向に叩いた時に対応する方向の振動が検出されているのが分かります。y軸方向に叩いた時はy軸だけでなくx軸にも振動が検出されていますが、これは机がx軸方向に揺れやすかったのかも知れません。
z軸方向のグラフを拡大してみたのが下の図です。
10m秒のサンプリングで振動は測定できているように思います。
測定結果は以下のアドレスで公開しています。