share facebook facebook2 twitter menu hatena pocket slack

2014.11.18 TUE

RabbitMQ with mqtt で Raspberry Pi に繋いだ LED を ON したり OFF したりする

川原 洋平

WRITTEN BY 川原 洋平

ども、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にする場合)

シンプルですな。

リモコン

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

</p>

<h1>!/usr/bin/env ruby</h1>

<p>require 'mqtt'
require 'json'</p>

<p>host = 'xxx.xxx.xxx.xxx'
port = 1883</p>

<p>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)を送りたいと思います。

リモコン受信機

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

</p>

<h1>!/usr/bin/env ruby</h1>

<p>require 'mqtt'
require 'json'
require 'pi_piper'</p>

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

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

<h1>GPIO 25 番を使いまっせ</h1>

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

<h1>GPIO 25 番はもう使いまへん</h1>

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

<p>def blink
  pin = pin_init
  10.times do
    pin.on
    sleep 0.5
    pin.off
    sleep 0.5
  end
end</p>

<p>mqtt_conn.get('record') do |topic,message|
  record = JSON.load(message)
  action = record['switch']
  pin = pin_init
  case action
  when "on"
    <span class="nb">p</span> <span class="s2">"on"</span>
    <span class="n">pin</span><span class="o">.</span><span class="n">on</span>
  when "off"
    p "off"
    pin.off
  when "blink"
    p "blink"
    blink
  end
end</p>

<p>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 したりする