福野泰介の一日一創 - create every day

眼鏡協会でのIoTデバイスづくり勉強会。鯖江市内に600社もあるメガネ関係会社。たくさんの製造機械が支えてます。

夜中もがんばる機械が止まってしまったことを、簡単に知りたい。そんなときに、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モジュールによる作例

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / アイコン画像 / プロフィール画像