今回は久々にセンサー触ってみたシリーズです。
先日ソラコムさんのIoTカンファレンス「SORACOM Discovery」に参加しました。
前回参加した時はちょっとだけセッションに登壇したのですが、今年はなんとIoTプロトタイピングの展示をしてきました!
ここではコーヒーメーカーのIoT化として、コーヒーの取り忘れ、取りに来たことを確認するシステムを開発しました。
以下がその動画です。
当日はこの機材一式をすべて会場に持ち込みデモでお見せしましたが、かなりウケが良く多くの方にみていただきました。
その中でも特に多かった声が「電流の検知ってどうやってるんですか?」「電流センサーってArduinoで使えるんですね!」
ここでは詳細には書きませんが、実は大人の事情で却下になった幻のシステム構成がありまして、その代替のシステムに電流センサーを用意しました。
展示の1週間前に緊急でピボットしたので間に合うかどうか不安になりつつ必死に電流センサーの使い方をめちゃくちゃ調べまくりましたw
型番を調べまくって出てくる情報は大体英語のブログやらどこの国かわからない言語のYouTubeの動画しか見当たらず、日本語のドキュメントはピッタリなものが見つかりませんでした。
というわけで今回はここで使っていたセンサーをArduinoで動かす方法を紹介します。
今回購入したもの
今回はAmazonで販売されてたADコンバーターもセットになっている以下の商品を購入しました。
Arduinoで動かすことを想定したドンピシャなセットで安心したのですが、運悪く僕が購入したやつはセットに入ってたジャックケーブルが断線しているっぽくそもそも通電すらしませんでした。たまたまとはいえ切羽詰まっている状態で辛い…
というわけで追加で以下のオーディオジャックのボードを用意しました。ブレッドボードに配線して使う想定であればむしろこれを使って接続するのもありです。
そして今回使用するマイコンボードはM5Stack Basicを使用しています。
ハードウェア
センサーの取り付け
今回使用するセンサーは電源コードの電線の片方にクランプで挟んで電流を取得する方式なので、避けることができるコードなどを用意して以下の図のような取り付けのできる延長コードを自作する必要があります。電源コードの自作自体は特に資格なくてもできますが、既存の電源コードを加工すると第二種電気工事士試験でいうところの欠陥扱いになる可能性があるので加工はおすすめしません。
配線
配線は以下の通りです。電流センサーの3.5mmプラグのうち、先端とプラグの根本がセンサーの出力になるので、それぞれキットに入っているADコンバーターの入力に配線し、Arduino側はI2C使ってセンサー値を取得します。
ポイントとしては電流センサー(SCT013-000)にはコイルを使用しており、ノイズが乗りやすいです。そこでそのノイズを軽減するために値が小さめの抵抗(30Ωぐらい)を挟むことでセンサー値をきれいに取得することができます。
後は、センサーのプラグをジャックに差し込めばハードウェアの用意は完了です。
ソフトウェア
必要なライブラリ
今回は以下のライブラリを使用します(カッコは検証したバージョン)
- M5Stackのモジュールの制御: M5Stack(0.4.6)
- ADコンバーターの制御:Adafruit_ADS1X15(2.5.0)
ソースコード
今回使用するプログラムはこちらのサイトで紹介されてたコードを参考にM5StackのLCDでセンサー値を表示できるように改良したコードを動かします。
#include <Wire.h> #include <M5Stack.h> #include <Adafruit_ADS1X15.h> Adafruit_ADS1115 ads; const float FACTOR = 20; //20A/1V from teh CT const float multiplier = 0.00005; void setup() { M5.begin(); Serial.begin(115200); ads.setGain(GAIN_FOUR); // +/- 1.024V 1bit = 0.5mV ads.begin(); } void printMeasure(String prefix, float value, String postfix) { Serial.print(prefix); Serial.print(value, 3); Serial.println(postfix); } void loop() { float currentRMS = getcurrent(); printMeasure("Irms: ", currentRMS, "A"); String irms_str = String(currentRMS, 3) + "A"; M5.Lcd.printf("Irms: %s\n", irms_str); delay(1000); } float getcurrent() { float voltage; float current; float sum = 0; long time_check = millis(); int counter = 0; while (millis() - time_check < 1000) { voltage = ads.readADC_Differential_0_1() * multiplier; current = voltage * FACTOR; //current /= 1000.0; sum += sq(current); counter = counter + 1; } current = sqrt(sum / counter); return (current); }
これでコンパイル、ボードに書き込みをすれば動作確認ができる状態です。
動かしてみる
書き込みが完了してセンサー値がLCDに表示されたら動作は正常に確認しています。センサーで測定している家電の電源をオン・オフしてセンサー値が変化することを確認してみましょう。
まとめ
今回はM5Stackを使ってAmazonで販売していた電流センサーを制御してみました。
Amazonでセンサーを買うとものにもよりますが大体ドキュメントは愚かデータシートすらなくて久々に動かすのに手こずりました。
海外でも奇跡的にドンピシャなサンプルを見つけられたのは不幸中の幸いでした。
何より当日の展示に間に合ってちゃんと安定稼働してくれたのも良かった…