MA-S120/LA,GLA で計測したアナログデータをSORACOM Harvestに送信する(ステップ1:必要なコマンドを確認しよう)
やりたいこと
Century Systems社のルーターについているアナログ入力インターフェースに入力したセンサからの信号(電圧/電流)値を取得して、SORACOM Harvest Dataに送信する方法をご紹介します。
準備
必要なもの
- MA-S120/LA または MA-S120/GLA 一式
(以下、MA-S120と呼びます。) - SORACOM IoT SIM
- PC
(本ブログではWindows11) - シリアルコンソール接続可能なターミナルエミュレータソフトウェア
(本ブログではTeraTermを利用します。) - USB micro-B(MA-S120側) - USB-C(PC側に合わせて適切に選択)
- センサ
(本ブログではダミーセンサとしてアルカリ乾電池2本使用)
MA-S120でSORACOMに接続
こちらのブログを参考にSORACOM IoT SIMをMA-S120に入れてSORACOMに接続するための設定を完了しましょう。
SORACOM Harvest Dataを使えるようにする
- グループを作成する
https://users.soracom.io/ja-jp/docs/group-configuration/create-group/ - グループの設定画面からSORACOM Harvest Dataを有効化する
グループ設定画面でSORACOM Harvest Dataのトグルスイッチを「on」にして保存します。以下のような状態になっていればOKです。
- SORACOM Harvest Dataを有効化したグループにIoT SIMを所属させる
以下を参考に、先ほど作成したグループにSIMを所属させます。
https://users.soracom.io/ja-jp/docs/group-configuration/set-group/
センサをつないでデータを送る
ここからが本編です。MA-S120の電源がONになっている場合は、一旦MA-S120の電源を落としましょう。
MA-S120にセンサとPCを接続
MA-S120にセンサとPCを接続します。MA-S120の電源を切って以下の図のように接続をしてください。
センサは信号線を下記のように端子台に押し込んで接続します。
今回は電圧信号を入力するのでDIPスイッチを上側に設定していますが、4-20mAの信号を出力するセンサを接続する場合は、DIPスイッチを下側に設定します。
PCからTeraTermでシリアルコンソール接続
TeraTermを起動
今回は手っ取り早く操作するためにシリアルコンソール接続をします。
Tera Termを起動します。
シリアルのラジオボタンを押して、プルダウンから今回接続しているCOMポートを選択します。
シリアルポートの設定
メニューの「設定」からシリアルポートを以下のように設定します。
電源投入
ここから暫くだだだだだっと起動時のログが表示されます。
ログのストリームが落ち着いたところで、login:
という表示が出るのを待ちます。
管理者権限でログインします。
初期状態ではusername:root, password:rootでログインできます。
ここまで来たら、MA-S120にコマンドを打っていろいろできるようになりました。
SORACOMにつながっていることを確認しよう
以下のコマンドを打ってみます。返事が返ってきたらSORACOMにつながっていることが確認できます。
ping -c 3 pong.soracom.io
以下のように
3 packets transmitted, 3 received, 0% packet loss
となればちゃんとつながっていることが確認できています。
アナログに入力されている信号の値をとってみよう
計測された値は
/sys/bus/iio/devices/iio\:device1/in_voltage0_raw
に入っているということで、以下のコマンドを打ってみます。
cat /sys/bus/iio/devices/iio\:device1/in_voltage0_raw
そうすると、以下のように18666
が返ってきます。
この値の意味はCenturySystems社のこちらのサイトに記載されたとおり、AD変換値(+2.5V を中心に -65535 〜 65535 の値)となっています。
この値を電圧に直すためには、スケール(1bit あたりの電圧 [mV])をかけた値に2500[mV]を足した値となります。
スケールの値は、/sys/bus/iio/devices/iio\:device1/in_voltage_scale
に入っているので、以下のコマンドで表示させてみましょう。
cat /sys/bus/iio/devices/iio\:device1/in_voltage_scale
0.038146972
が表示されました。
これらの値を変数に入れて電圧を算出してみます。
# scaleという変数にcatコマンドで取得したscaleの値を代入する
scale=`cat /sys/bus/iio/devices/iio\:device1/in_voltage_scale`
# echoコマンドでscaleの値を表示して確認。変数名の先頭に$を付けると変数の値を呼び出せる。
echo $scale
# rawという変数にcatコマンドで取得したAD変換値を代入する
raw=`cat /sys/bus/iio/devices/iio\:device1/in_voltage0_raw`
# rawの値も確認
echo $raw
# 電圧の値を(scale x raw + 2500) / 1000 [V]で計算する。
# 小数の掛け算を行うため、bcコマンドで実施する。
voltage=`bc -l <<< "($scale*$raw+2500)/1000"`
# voltageの値を確認
echo $voltage
#ダミーセンサーの電圧値であればOK
コマンドの結果は以下の通りで、電圧の計測値は3.212[V]に対して、
マルチメータでの計測値は、3.206[V]ということで、6[mV]程度の誤差となっており、ちゃんと計測できていそうなことが分かりました。
取得した値をUnified Endpointに送信して、SORACOM Harvest Data確認しよう
後はこの値をunified endpointに送信するだけです。
curlコマンドを使って、POSTメソッドのHTTPリクエストでJSONで送信します。
curl -v -X POST http://uni.soracom.io:8888/ \
-H "Content-Type:application/json" \
-d '{
"voltage": '${voltage}'
}'
以下のように
HTTP/1.1 201 Created
のレスポンスがあれば、ひとまずOKです。
実際のSORACOM Harvest Dataに送信されたデータを見てみましょう。
でーたの確認方法は以下の通りです。
無事、約3.2[V]の値が送信できていることが確認できました。
この後の流れ
IoTデータとして定期送信
上記のコマンドをshell scriptにしてcronで設定して定期的に実行されるようにしましょう。
ステップ2で説明します!
計測値に対して演算をしてから送信したい
ちょっとした計算(例:ノイズが多い場合に、10回計測した値の平均値を算出)をしてデータを送信したい場合などはpythonをインストールして、pythonで送信しましょう。
複数のデバイスに展開したい
必要な設定済ませたOSイメージを作成し、SORACOMブート機能で配布しましょう。
Discussion