Raspberry PiでIoT MQTTで遠隔操作編の4回目です。2台のRaspberry Piでインターネット経由でGPIOを操作するというテーマで書いています。
前回はMQTTのSub側となるRaspberry PiのAC100Vをリレー経由でON/OFFを制御しました。Pub側はHerokuのCloudMQTT Consoleから利用出来るWebsocket UIを使いました。これで確かにインターネット経由での遠隔操作が出来ました。今回はPub側もRaspberry Piにしてブレッドボード上のスイッチからMQTTのPublishを実行してSub側のライトを点灯させてみます。
以下の順に書きます。
1.スイッチを接続する
2.Pub側のPythonプログラムの準備
3.Sub側のRaspberry Piの準備とPublishの実行
1.スイッチを接続する
以下のように接続しました。抵抗は1KΩを使っています。この抵抗がないと単純にショートしますので使っていますが抵抗値はもっと大きくてもいいです。(※私のようなソフトウェアエンジニアとしてはスイッチは単純なオンとオフの切り替えと思ってしまいますが、プルアップ、プルダウンとチャタリングという課題があります。)ON/OFFをGPIO21に接続して判定します。
2.Pub側のPythonプログラムの準備
このスイッチを押した時にpublishを実行するPythonプログラムが以下です。スイッチの認識は割り込み処理にしています。チャタリングによる誤動作防止をこのようにしてみました。ボタンは1個なのでなくてもいいようなチェックもありますがとりあえずこのようにしてみました。
# coding: UTF-8 import paho.mqtt.client as mqtt import RPi.GPIO as GPIO import time GPIO_BT = 21 BUTTON_SLEEP = 0.05 status = 0 def on_connect(client, userdata, rc): print("Connected with result code "+str(rc)) def on_message(client, userdata, msg): print(msg.topic+" "+str(msg.payload)) # ボタンの割込み関数 def gpio_callback(channel): global status # チャタリングによる誤動作防止のため2回読む value1 = GPIO.input(channel) if value1 == 0: return time.sleep(BUTTON_SLEEP) value2 = GPIO.input(channel) if value2 == 0: return if value1 != value2: return if channel != GPIO_BT: return if status == 0: client.publish("isyjp/gpio21", "on", 0) status = 1 return if status == 1: client.publish("isyjp/gpio21", "off", 0) status = 0 return # 入力モード,PULLDOWNモードに設定 GPIO.setmode(GPIO.BCM) GPIO.setup(GPIO_BT, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # GPIOの値の変化(0から1)を検出し、割り込み処理を行う GPIO.add_event_detect(GPIO_BT, GPIO.RISING) GPIO.add_event_callback(GPIO_BT, gpio_callback) client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.tls_set("/etc/ssl/certs/ca-certificates.crt") client.username_pw_set("cloudMQTTのユーザ名", "パスワード") client.connect("cloudMQTTのURL", SSLポート番号) client.loop_forever()
3.Sub側のRaspberry Piの準備とPublishの実行
Sub側は前回のように準備しておきます。これでPub側、Sub側の両方がインターネットに接続されてそれぞれのPythonプログラムが起動されていればスイッチで100Vのライトが操作出来るはずです。
以下はアニメGIFですがクリックで再生します。(※再生開始まで少し時間がかかるとは思います。)リレーのLEDとライトの点灯が連動しています。この場合はすぐ近くで操作しているので遠隔操作の感じはあまりないですが確かにスイッチと連動しました。
今回でこのシリーズは終了です。またいろいろと書きたいと思います。