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

システム開発エンジニアの西田五郎が運営しております。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

執筆者:

関連記事

Remote.itを利用してRaspberry Piを公開する

remote.itを利用してRaspberry Piをインターネットに公開する方法についてです。 公開するとは文字通り何かのサービスを実装したサーバーとして利用するとか、リモートでメンテナンスするとか …

Raspberry Pi 3でモニタとキーボードなしで設定する方法

Raspberry Pi 3でモニタとキーボードなしで設定する方法についてです。 以下のような条件ごとに方法を確認しました。あちらこちらで書いてしまったのでここで整理させてください。当然環境によって違 …

Raspberry PiでC言語版Lチカを試す(その2)レジスタを操作する

Raspberry PiでC言語を使ったLEDの点灯、消灯(いわいるLチカ)を試してみました。今回は2回目です。前回デバイスドライバを利用する方法を書きました。今回はレジスタを直接操作する方法を使いま …

Node.jsでRaspberryPiのGPIOを使う(その1)デバイスドライバでLED

Node.jsでRaspberryPiのGPIOを使ってみます。今回はデバイスドライバを使ってLEDのONとOFFを操作します。以下のような簡単な回路でLEDを操作します。 準備、前提は以下です。 以 …

Raspberry Piでタッチスクリーン付3.5インチTFTを使ってみた

Raspberry Piでタッチスクリーン付モニタを使ってみました。PiScreenという商品名で3.5インチTFT(480×320) でタッチスクリーン付です。以下の商品です。以下は完成品 …