株式会社インデペンデンスシステムズ横浜

システム開発エンジニアの西田五郎が運営しております。Raspberry Pi や Arduino その他新規開発案件のご依頼をお待ちしております。

IoT Raspberry Pi

Raspberry PiでIoT(MQTTで遠隔操作編 その4)Raspberry PiのGPIOとHeroku連動Pub編

投稿日:2017年4月23日 更新日:

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とライトの点灯が連動しています。この場合はすぐ近くで操作しているので遠隔操作の感じはあまりないですが確かにスイッチと連動しました。

今回でこのシリーズは終了です。またいろいろと書きたいと思います。

AdSense

AdSense

-IoT, Raspberry Pi

執筆者:

関連記事

Raspberry Pi 3でのコンソールケーブル利用と初期設定

Raspberry Pi 3 でコンソールケーブルを利用する方法と初期設定についてです。 以下のページ等で今までこのテーマについて書きました。 Raspberry Piをモニターとキーボードなしで導入 …

ASP.NET Web APIでデータ蓄積(その7)Raspbery Piからの温度データ蓄積

ASP.NET Web APIでデータ蓄積の7回目です。前回までで少なくとも温度データが登録出来るASP.NET Web APIが出来ました。今回はRaspbery Piに実際に温度センサを接続して温 …

Raspberry Piをモニターとキーボードなしで導入する(その2)初期設定とリモートデスクトップ

(※2021/05/02追記 現時点で最新版のRaspberry PI OSでモニターとキーボードなしで導入する手順を書きました。ぜひこちらを見て下さい。) Raspberry Piをモニターとキーボ …

Raspberry PiでIoT(温度・湿度・気圧データ編 その3)データ表示とグラフ表示

Raspberry PiでIoT 温度・湿度・気圧データ編の3回目です。前回までで、Raspberry Piから温度、湿度、気圧データをWebサーバへ送信してそのデータを蓄積出来るようになりました。今 …

Raspberry Pi Imager でSDカード書き込み時にWifiやSSH接続を設定する方法

Raspberry Pi Imager のV1.6からは、Raspberry Pi ImagerのOSや書き込み先を選択する画面からオプションでWifiやSSH接続が設定出来るようになっていました。 …