夜中もがんばる機械が止まってしまったことを、簡単に知りたい。そんなときに、IoT!
止まったことを検出したら「ALERT」と表示し、IoT通知!
動いているかどうかを調べるセンサーとして、加速度センサーを使ってみます。
「秋月電子通商のセンサー一般」から「加速度センサー」を選択、安い順に並べた一番最初が「MMA8452Q使用3軸加速度センサーモジュールキット」でした。
キットといっても、ピンヘッダーをはんだ付けするだけで、ブレッドボードで使用可能!(ピンソケットをはんだづけすれば、ジャンパーワイヤのみでOK!)
I2Cで接続するMMA8452を使う電子工作は、モジュールの3.3V、SDA、SCL、GNDからジャンパーワイヤでIchigoJamのCN5の表記通りに接続するだけ!回路を見ると、モジュール内にI2C用のプルアップも実装されています(必要ない場合はパターンカット)。
加速度センサーの値はI2Cで取得します。電源をいれた状態ではセンサーがアクティブになっていないので、ONにしてから、X,Y,Z、3軸分の値を取得。ビッグエンディアンなので1byteずつ取得してリトルエンディアンに変換し、分解能は12bitなので16で割って取得完了!
10 POKE#700,#2A,1:IF I2CW(#1D,#700,2) STOP 20 A=#700:POKEA,0:R=I2CR(#1D,A,1,A,7) 30 FORI=0TO2:A=A+2:[I]=(PEEK(A-1)<<8|PEEK(A))/16:NEXT 40 ?[0],[1],[2] 50 GOTO20
加速度センサーの値が表示されました!デフォルトでは、1024が1Gを表し、プラスマイナス2Gまで計測できます。
詳細はデータシート参照。加速度のスケールの設定や、割り込みやなどいろいろ高度な使い方もできます。
振動が止まったら通知するために、加速度の差分をとり、絶対値の合計値を見て、しきい値100を下回る回数が100回を越えたらアラートするプログラムを作ってみます。
まずは加速度センサーを使う初期化と値取得をサブルーチン化
100 @GINIT:POKE#700,#2A,1:IF I2CW(#1D,#700,2) STOP ELSE RTN 110 @GGET:A=#700:POKEA,0:R=I2CR(#1D,A,1,A,7) 120 FORI=0TO2:A=A+2:[I]=(PEEK(A-1)<<8|PEEK(A))/16:NEXT:RTN
これを使って、加速度の差分を表示
10 GSB@GINIT 20 GSB@GGET:FORI=0TO2:[I+3]=[I]:NEXT 30 GSB@GGET:FORI=0TO2:[I+6]=[I]-[I+3]:NEXT 40 ?[6],[7],[8] 50 FORI=0TO2:[I+3]=[I]:NEXT 60 GOTO30
加速度の差分の絶対値の合計を表示
40 N=ABS([6])+ABS([7])+ABS([8]):?N
しきい値100を越えていたら振動している、つまり機械が動いていると判定しLEDをつける
45 LED N>100
最後に、止まっている時間をLループ分検出したら、ALERTと表示し、IOT通知
5 C=0:L=100 46 IF N<100 C=C+1 ELSE C=0 47 IF C>L LED1:?"ALERT!!":IOT.OUT 1:WAIT60
Let's 想像、身近なIoT!
(追記、150円高いけど簡単で高速、アナログ加速度センサーKXSC7-2050モジュールによる作例)