ども、cloudpack の 39 歳のかっぱ(@inokara)です。
はじめに
前の記事「RabbitMQ の mqtt プラグインを Ruby で試した」で RabbitMQ with mqtt を触ってみましたが、今度は mqtt を使って Raspberry Pi につないだ LED を光らせるリモコンを使ってみたいと思います。
参考
なんてことないですが…
構成
LED を on にする場合。
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 を取得して解析して action
が on
であれば LED を点灯、off
であれば LED 消灯というシンプルな内容となります。ちなみに LED の点灯を制御しているのは前回も利用した pi_piper という gem です。
Raspberry Pi の準備
こちらの「Raspberry PiとRubyで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 が点灯しますね。
今度は…
./remocon.rb off
LED が消灯します。
そして…
./remocon.rb blink
これでマバタキが始まります。
続けて…10 秒間 LED が点滅します。
おおっ。
お疲れ様でした
別に RabbitMQ with mqtt を介さなくても LED の点灯、点滅は出来てしまうのですが、RabbitMQ のようなメッセージングミドルウェアを利用することで、遠隔操作的なことが任意のタイミングで自動で行えるようになるのでいくつか自分がイメージしている方向で利用出来そうな気がしています!また、mqtt の特徴の一つである動作が軽いという点は Raspberry Pi のようなマシンリソースが潤沢ではないマシンでの取り扱いに適したプロトコルなのではと思っています。
楽しい!
元記事はこちらです。
「RabbitMQ with mqtt で Raspberry Pi に繋いだ LED を ON したり OFF したりする」