だいぶ以前にnodeMcuで4chリレーモジュールのうち、3chを動かし、かつ、物理スイッチからも動かせるようにしました。
しかし、1ヶ月後、WiFiアクセスポイントを増やしたことからなにやら不安定に。
再起動を繰り返す始末。
別なモジュールを買っても同じ。
ESP8266は電源周りがだいぶシビアだそうでして、その影響なのか、exception(29)を吐いてstuckします。
3.3Vのピンに470μFの電解コンデンサをつけたけど、解消されず。
そこで、Raspberry Pi zero wに入れ替えた顛末を。
Raspberry piにRaspbian Strechを入れてSSHするところまではいろいろなところに乗っているので割愛。
rootでRaspbian Strechが動かせることを前提に話を進めます。
まずは、RaspbianにWebiopiをインストールします。
参考にしたのはこのページ
あ、ただ、Python3の有効化をし忘れました(^^ゞ
root@raspberrypi: ~/# mkdir webiopi
root@raspberrypi: ~/# cd webiopi
root@raspberrypi: ~/webiopi# wget https://sourceforge.net/projects/webiopi/files/WebIOPi-0.7.1.tar.gz
root@raspberrypi: ~/webiopi# tar xvzf WebIOPi-0.7.1.tar.gz
root@raspberrypi: ~/webiopi# cd WebIOPi-0.7.1
root@raspberrypi: ~/webiopi/WebIOPi-0.7.1# wget https://raw.githubusercontent.com/doublebind/raspi/master/webiopi-pi2bplus.patch
root@raspberrypi: ~/webiopi/WebIOPi-0.7.1#./setup.sh
んで、Basic認証をハズしました。
root@raspberrypi: ~/# nano /etc/webiopi/config
/etc/webiopi/configファイルの以下の2箇所をコメントアウト。
#passwd-file = /etc/webiopi/passwd
#prompt = "WebIOPi"
で、サービス有効化とスタートです。
root@raspberrypi: ~/# update-rc.d webiopi defaults
root@raspberrypi: ~/#
/etc/init.d/webiopi start
続いて、PythonでGPIOがGNDに落ちるとトグルスイッチになる(消えてたら付く、付いていたら消える)ようなスクリプトを書きます。
本当ならadd_event_detectを使いたいところなのですが、電位差の検出がシビアすぎて、隣のスイッチまで検出されてコールバックが実行されてしまう始末。
ここはCPUリソースを喰ってでも安定した動作を目指しました。
追記:add_event_detectでは確かに微妙なエッジも検出してしまいますが、検出後のコールバックに"本当に該当スイッチのGPIOが0なのか? を判定するif文を入れれば誤動作を抑止できることがわかりました。詳しくは「その2」へ
webiopiからGPIOのピン状況を取得したり、書き込んだりするために、Pythonのrequestsライブラリを利用します。
root@raspberrypi: ~/#
apt-get install python-requests
そして、Rpi.GPIOライブラリ(プリインストール)を活用してスイッチのGPIOがGNDに落ちるのを読み取って、リレーのGPIOの状況を取得し、その状況に応じてGPIOのValueを変化させます。
何度も誤動作しないよう、1度動作したら1秒スリープさせます。
スイッチの読み取りも0.1秒ごとにしました。
プッシュスイッチがGPIO16、リレーがGPIO19で、サインスマートのリレーなので0でON、1でOFFです。
追記:これはとても迅速に検出可能ですが、CPUリソースを喰いますのでおすすめしません。
/root/switch/switch1.py
#! /usr/bin/python
import RPi.GPIO as GPIO
import time
import requests
switch = 16
relay = 19
url_front = 'http://localhost:8000/GPIO/'
url_back = '/value'
url_function_out = '/function/out'
url = url_front + str(relay) + url_back
url_function = url_front + str(relay) + url_function_out
url0 = url + '/0'
url1 = url + '/1'GPIO.setmode(GPIO.BCM)
GPIO.setup(switch, GPIO.IN, pull_up_down=GPIO.PUD_UP)
gpio_function = requests.post(url_function)try:
while True:
if GPIO.input(switch)==0:
status = requests.get(url)
if status.text=='1':
requests.post(url0)
time.sleep(1)
else:
requests.post(url1)
time.sleep(1)
time.sleep(0.1)except KeyboardInterrupt:
print '\nswitch.py Stopped'
GPIO.cleanup()
これらのswitch変数とrelay変数の違いで3ch分をswitch1.py,switch2.py,switch3.pyとして作成しました。
起動時に実行するように、/etc/rc.localに記述します。
# switch read
/root/switch/switch1.py &
/root/switch/switch2.py &
/root/switch/switch3.py &exit 0
これでスイッチとリレーが連動するようになり、リビングのライトが通常通り使えるようになりました。
次は、homebrigeのconfigを書き換えます。