住環境の測定、橋など構造物の監視、工場の機械設備の監視などで温度、湿度、照度、振動を長期に渡って測定、記録、可視化するアプリケーションを想定し、センサーでこれらの値を測定してAmbientに送り、記録、可視化します。制御プログラムはMicroPythonで記述しました。

ハードウェア

センサーとマイコンは次のものを使いました。

  • マイコン: ESP-WROOM-02 (ESP8266)
  • 温度、湿度: 温度湿度センサーHDC1000
  • 照度: フォトトランジスターNJL7502L + ADコンバーターMCP3425
  • 振動: 3軸加速度センサーADXL345

回路図と写真を示します。

マイコンとセンサーはI2Cで接続しました。今回、MicroPythonでプログラムを記述しましたが、
MicroPythonではSPIインタフェースが動かなかったので、I2Cでアクセスしました。

振動加速度レベル

3軸加速度センサーADXL345から得られる値はx、y、z、3方向の加速度値で、分解能は1ビットあたり3.9ミリGです。加速度の単位には m/s2も使われ、1.0 G = 9.80665m/s2という関係です。ADXL345からの値をxとすると

x * 3.9 / 1000 * 9.80665 [m/s2]

になります。

この値を基準値:10-5m/s2の比で表した物が振動加速度レベル(VAL: Vibration Acceleration Level)と呼ばれ、次のような関係になります。単位はdBです。

VAL = 20 * log10(α/α0) [dB]
   α: 振動加速度の実効値 [m/s2]
   α0: 基準振動加速度 10-5 [m/s2]

さらに振動に対する人間の感覚を考慮した周波数補正をおこなったものは振動レベル(VL: Vibration Level)と呼ばれます。

今回は振動加速度レベルを計算しました。

ESP8266と3軸加速度センサーADXL345で振動を測定する」では、3軸加速度センサーADXL345で10m秒間隔で1000回(10秒間)、x、y、z軸、3方向の加速度を測定して、Ambientに送って振動波形を可視化しました。

今回は振動を長期に渡って測定するため、1秒間隔で300回(5分間)、3方向の加速度を測定し、値の大きい方から10%の値を計算し、これを5分間隔でAmbientに送信して記録、可視化します。

なお、正確な振動を測定するには検定を受けた振動レベル計を使う必要があり、今回の測定はあくまでも簡易な振動測定になります。

プログラム

加速度を300回測定して上位から10%の値を求めるためにsortをおこなったり、logの計算をしたりするため、MicroPythonでプログラミングしました。MicroPythonはマイコンで動作するPython3の処理系です。mathやsocketなどのライブラリーも提供されています。

MicroPythonをESP8266で動かす方法は「ESP-WROOM-02でMicroPython (mac)」を参考にしました。今回使ったファームウェアのバージョンはesp8266-20170612-v1.9.1.bin です。

マイコンの周辺デバイスをアクセスするライブラリーとしてGPIO、I2C、SPIなどが提供されています。最初SPIライブラリーを使ったのですが、どうしてもADXL345を制御できなかったのでI2CライブラリーでADXL345を制御しました。

プログラムはADXL345、HDC1000、MCP3425それぞれの制御とAmbientのデーター送受信をモジュール化しました。メインプログラムは次のような流れです。

10m秒間隔で100回、加速度を読み、キャリブレーション値にする

Wi-Fiアクセスポイントに接続し、Ambientの初期化をおこなう

while True:

    1秒間隔で300回(5分間)、加速度を読み、x、y、z、それぞれキャリブレーション値で補正した後、
    それぞれの上から10%(30個目)の値を求める

    それぞれの値を振動加速度レベルに変換する

    温度、湿度を測定する
    照度を測定する
    電源電圧を測定する

    温度、湿度、照度、加速度、電源電圧をAmbientに送信する

プログラムはGithubに公開しました。

ambient-python-lib
    +-- ambient.py # Ambientライブラリー(Python/MicroPython対応)
    +-- examples
          +-- ulib # MicroPython用のライブラリー群
          +-- uenv # 温度、湿度、照度、振動測定メインプログラム

ESP8266で実行する

Githubのambient-python-libの下にあるambient.pyと、examples/ulib の下にあるadxl345.py、hdc1000.py、mcp3425.py、examples/uenv の下にある main.pyをご自分の開発環境にダウンロードします。main.py以外のファイルをmpfshellなどのツールを使ってマイコンのローカルファイルシステムにコピーしてください。mpfshellについては「ESP-WROOM-02でMicroPython (Mac) shellの導入」をご覧ください。

$ mpfshell

mpfs [/]> open マイコンが接続されたデバイス名

mpfs [/]> put ambient.py
mpfs [/]> put adxl345.py
mpfs [/]> put hdc1000.py
mpfs [/]> put mcp3425.py

メインプログラムのmain.pyをエディターで開き、Wi-FiのSSIDとパスワード、AmbientのチャネルIDとライトキーをご自分の環境に合わせて修正します。プログラム全体をコピーし、MicroPythonのインタープリターに「CTRL-E」を入力してペーストモードにして、コピーしたプログラムをペーストします。「CTRL-D」を入力するとペーストモードから戻り、プログラムが実行されます。

MicroPythonはローカルファイルシステムにmain.pyというファイルがあると、リセット後にそれを実行します。main.pyの動作が確認できたら、main.pyをmpfshellなどを使ってローカルファイルシステムにコピーすると、ESP8266をリセットするとメインプログラムが実行されるようになります。

Ambientで確認する

最初に掲載したスクリーンショットがデーターをAmbientでグラフ化したものです。

ADXL345の分解能は1ビットが3.9ミリGです。これは振動加速度レベルにすると71.7dBになります。「振動の基礎知識」という資料では65dBで震度2、75dBで震度3ということなので、ここで得られた値は、絶対値としては正しくなく、あくまで傾向を示しているものだと思います。