ども、cloudpack の 39 歳のかっぱ@inokara)です。

はじめに

前の記事「RabbitMQ の mqtt プラグインを Ruby で試した」で RabbitMQ with mqtt を触ってみましたが、今度は mqtt を使って Raspberry Pi につないだ LED を光らせるリモコンを使ってみたいと思います。


参考


なんてことないですが…

構成

LED を on にする場合。

RabbitMQ/mqtt を使った Raspberry Pi のLED制御: 構成図(LEDをonにする場合)

LED を off にする場合。

RabbitMQ/mqtt を使った Raspberry Pi のLED制御: 構成図(LEDをoffにする場合)

シンプルですな。

リモコン

リモコンって言いつつタダのスクリプトです。

!/usr/bin/env ruby

require 'mqtt' require 'json'

host = 'xxx.xxx.xxx.xxx' port = 1883

client = MQTT::Client.connect(:remote_host => host, :remote_port => port, :username => 'user', :password => 'pass') json = {type: "test", switch: ARGV[0]}.to_json client.publish('record', json , retain=false)

以下のように使います。

./remocon.rb [on|off|blink]

無駄に JSON 形式で信号(LED を ON 又は OFF)を送りたいと思います。

リモコン受信機

リモコン受信機と言いつつタダのスクリプトです。

!/usr/bin/env ruby

require 'mqtt' require 'json' require 'pi_piper'

def config { :host => 'xxx.xxx.xxx.xxx', :port => 1883 } end

def mqtt_conn MQTT::Client.connect(:remote_host => config[:host],:remote_port => config[:port], :username => 'guest', :password => 'guest') end

GPIO 25 番を使いまっせ

def pin_init PiPiper::Pin.new(:pin => 25, :direction => :out) end

GPIO 25 番はもう使いまへん

def pin_close uexp = open("/sys/class/gpio/unexport", "w") uexp.write(25) uexp.close end

def blink pin = pin_init 10.times do pin.on sleep 0.5 pin.off sleep 0.5 end end

mqtt_conn.get('record') do |topic,message| record = JSON.load(message) action = record['switch'] pin = pin_init case action when "on" p "on" pin.on when "off" p "off" pin.off when "blink" p "blink" blink end end

pin_close

動作としてはキューに入っている JSON を取得して解析して actionon であれば LED を点灯、off であれば LED 消灯というシンプルな内容となります。ちなみに LED の点灯を制御しているのは前回も利用した pi_piper という gem です。

Raspberry Pi の準備

こちらの「Raspberry PiとRubyでLED制御 – Raspberry Pi 電子工作」の記事を参考に以下のように配線しました。(ちなみに図も見よう見まねです…)

RabbitMQ/mqtt を使った Raspberry Pi のLED制御: Raspberry Pi の準備

ブレッドボードのマイナスと Raspberry Pi の 6 番(GROUND)をジャンパで接続します。そして、GPIO 端子の 25 番と LED のプラスとなるアノード側に接続しましょう。(LED のプラス側をアノード、マイナス側をカソードと言うそうです…)


デモ

動画で見せられないのがツライですが適当な端末から…LED を ON にしてみたいと思いますが、まずは Raspberry Pi 側で受信機を起動しておきます。

./receiver.rb

実行すると Rabbitmq with mqtt に接続して Subscribe が開始されます。

そして、適当な端末から…

./remocon.rb on

LED が点灯しますね。

RabbitMQ/mqtt を使った Raspberry Pi のLED制御: デモ(1)

今度は…

./remocon.rb off

LED が消灯します。

RabbitMQ/mqtt を使った Raspberry Pi のLED制御: デモ(2)

そして…

./remocon.rb blink

これでマバタキが始まります。

RabbitMQ/mqtt を使った Raspberry Pi のLED制御: デモ(3)

続けて…10 秒間 LED が点滅します。

RabbitMQ/mqtt を使った Raspberry Pi のLED制御: デモ(4)

おおっ。


お疲れ様でした

別に RabbitMQ with mqtt を介さなくても LED の点灯、点滅は出来てしまうのですが、RabbitMQ のようなメッセージングミドルウェアを利用することで、遠隔操作的なことが任意のタイミングで自動で行えるようになるのでいくつか自分がイメージしている方向で利用出来そうな気がしています!また、mqtt の特徴の一つである動作が軽いという点は Raspberry Pi のようなマシンリソースが潤沢ではないマシンでの取り扱いに適したプロトコルなのではと思っています。

楽しい!

元記事はこちらです。
RabbitMQ with mqtt で Raspberry Pi に繋いだ LED を ON したり OFF したりする