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

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

*

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

      2017/05/24

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

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




 - IoT, Raspberry Pi

AdSense

AdSense

  関連記事

Raspberry Piでタッチアプリ開発(その2)Kivyの導入と動作確認

Raspberry Piでタッチアプリ開発の2回目です。前回はハードウェア構成や …

Raspberry PiでのNode.jsの導入(その1)インストールと動作確認

Node.jsとは、Node.js 日本ユーザグループのサイトから引用させて頂き …

無線マイコン ToCoStick(トコスティック)をRaspberry Piで使ってみた

無線マイコンの ToCoStick(トコスティック)をRaspberry Piで …

Raspberry Piでも温度センサADT7310をつかってみる

以下の記事でArduino Unoで温度センサのADT7310を使ってみました。 …

Raspberry PiでIoT(温度・湿度・気圧データ編 その1)BME280でデータ取得

Raspberry PiでIoTに取り組んでみるという内容で実際に動作させながら …

Raspberry PiでC言語版Lチカを試す(その1)デバイスドライバ利用

Raspberry PiでC言語を使ったLEDの点灯、消灯(いわいるLチカ)を試 …

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

(※2017/02/19 最新の情報は以下です。) Raspberry Pi 3 …

Raspberry Piでタッチアプリ開発(その3)Kivyでレイアウト・ボタン作成

Raspberry Piでタッチアプリ開発の3回目です。前回はKivyの導入につ …

Raspberry PiでIoT(温度・湿度・気圧データ編 その2)Webサーバ側構築とデータ送信

Raspberry PiでIoT 温度・湿度・気圧データ編の2回目です。前回はR …

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

Node.jsでRaspberryPiのGPIOを使ってみます。今回はデバイスド …