mrubyで人感センサー


4日目の@mikawanさんの記事に触発されて、かなり以前サトー電気で買ってあった人感センサーを使ってみました。

使わなくなった古い無線ルーターのBroadcom BCM4712というSOCを使ったモジュールでmrubyを動かしてThingSpeakにポストするようにしてみました。

#
# yabm mruby script
#
# thingspeak channel update 
#

APIKEY = "naisyo"

def delay(yabm, val) 
  start = yabm.count() 
  while yabm.count() < start + val do
  end
end

begin

# ip address setting

yabm = YABM.new

yabm.netstartdhcp

ntpaddr = "10.0.1.18"

yabm.sntp(ntpaddr)

ip = yabm.getaddress

yabm.print ip

interval = 0

last = yabm.gpiogetdat & 0x01

while 1 do
  yabm.print "."
  delay(yabm, 1000)
  if interval == 0 && last != yabm.gpiogetdat & 0x01
    yabm.print "*" 
    res = SimpleHttp.new("https", "api.thingspeak.com", 443).get("/update?api_key=" + APIKEY + "&field1=1", {'User-Agent' => "test-agent"})
    interval = 1
  end
  if interval != 0
    interval = interval + 1
  end
  if interval == 60
    last = yabm.gpiogetdat & 0x01
    interval = 0
  end
end

rescue => e
  yabm.print e.to_s
end

蟹さんとこのBCM/mipsをまとめて、Yet Another Bare Metal(YABM)と呼ぶ事にしました。

httpsでBearSSLを使っているのですが、証明書の有効期間を確認するためにある程度正確な時間が必要なのでおうちの中のntpサーバに接続して時間を取得しています。

センサーの出力をルーターのボタンに接続してあります。それをGPIOで拾っています。ボタンはプルアップされて0ビット目になります。使っていませんが、裏のボタンが2ビット目でLEDが3,4ビット目になります。

このセンサーモジュールの仕様はアクティブセルさんのページが参考になります。

センサーの電源はルーターから分けてもらっているのですが、ルーター電圧が3.3Vだったのでセンサーのレギュレーターを外して、直結にしました。

スイッチはヒートガンではがしたのですが、暖め方が足りずパターンをはがしてしまいました。スイッチを使えるように取ろうとしたのが失敗だったかもしれません。かろうじてプルアップの抵抗のところで接続しています。

このモジュールは上のカバーを外してから、全面のパネルを外すと分解できます。ネジを使わないはめ込みでプラスチックの爪が折れやすいです。

スクリプトを起動するとこんな感じで出力されます。

ThingSpeakにはこのようにデータが入りました。

このルーターはHardOffに108円でたくさん転がっていて、気軽にIoTができて楽しいと思います。

プリコンパイルしたVMバイナリ用意してみました。