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

システム開発エンジニアの西田五郎が運営しております。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でIoT(温度・湿度・気圧データ編 その1)BME280でデータ取得

Raspberry PiでIoTに取り組んでみるという内容で実際に動作させながら書きたいと思います。まずは、IoTとは、Internet of Thingsの略です。もう既にこの言葉も普及していて様々 …

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

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

Raspberry PiでIoT(温度・湿度・気圧データ編 その4)アラートメール送信

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

Raspberry Piでタッチアプリ開発(その4)ボタンとGPIOの連動

Raspberry Piでタッチアプリ開発の4回目です。前回作成したレイアウトとボタンのコールバックにGPIOの処理を組み込みます。そして、このアプリを自動起動するように設定します。 (※2021/0 …

Raspberry Piをモニターとキーボードなしで導入する(その3)コンソールを使う

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