概要
BluemixのRaspberryPi登録レシピに登場するデバイス用のsampleプログラムは、Bluemixからのデータの受信によってシステム停止(Linuxのshutdownコマンド)のみ行える作りになっている。
Raspberry Pi 2にアクチュエータを付け加えてBluemixからアクチュエータを制御するには、sampleプログラムのソースコードを修正してビルドすれば良い。その方法を整理する。
※以下でやったことの反対方向(Bluemix→Raspberry Pi 2)をやってみる。
BluemixでRaspberryPi2のセンサーデータを拾う (1)仕組みの理解
BluemixでRaspberryPi2のセンサーデータを拾う (2)センサーを付けてデータを拾う 温度センサーデジタル編
BluemixでRaspberryPi2のセンサーデータを拾う (3)センサーを付けてデータを拾う 温度センサーアナログ編
BluemixでRaspberryPi2のセンサーデータを拾う (4)センサーを付けてデータを拾う 温度センサーデジタル編(リベンジ)
BluemixでRaspberryPi2のセンサーデータを拾う (5)センサーを付けてデータを拾う 温度・湿度・気圧まとめて採取編
番外編 『ムック「日経Linux ラズパイマガジン 2015年春号 」電子工作入門キット パーツセット』に入っていたもの
これから整理するにあたりきっとまた長い道のりになりそうなので、(1)Sampleプログラムの仕組みの整理と(2)どこをどのように変更すればよいのかを分けることにした。
(1) 仕組みの理解
(2) アクチュエータを動かす 光編 RasPi2のオンボードLED (これ)
(3) アクチュエータを動かす 光編 外付けのLED
(4) アクチュエータを動かす 音編
前提
RaspberryPi2がBluemixのIoTFサービスに「レシピ」を使って接続済みであること。
手始めに
RasPi2オンボードのLEDを制御できる(らしい)ので、まずは何も付けずにこれ↓をやってみる。
http://blog.livedoor.jp/victory7com/archives/43512294.html
Raspberry Pi 2上でオンボードLEDを制御してみる。
LEDのモード確認
念のため最初に確認しておく。
$ cat /sys/class/leds/led0/trigger
none [mmc0] timer oneshot heartbeat backlight gpio cpu0 cpu1 cpu2 cpu3 default-on input
$ cat /sys/class/leds/led1/trigger
none mmc0 timer oneshot heartbeat backlight gpio cpu0 cpu1 cpu2 cpu3 default-on [input]
"led0"(ACT LED)が"mmc0"、"led1"(PWR LED)が"input"になっていることが分かる。
shellスクリプト作成
上記のサイトの内容を参考にshellスクリプトを作成する。
そのままだと再起動するまで点滅しっぱなしなので、後片付けの処理も入れた。
$ cd ~/bin
$ vi ctlLedRPi.sh
$ chmod 755 ctlLedRPi.sh
#!/bin/bash
# ACT LEDを0.5秒間隔で、PWR LEDを2秒間隔で点滅させる
echo timer > /sys/class/leds/led0/trigger # ACT LEDである"led0"を"timer"モードにする
echo 250 > /sys/class/leds/led0/delay_on # ACT LEDを250ミリ秒点灯する
echo 250 > /sys/class/leds/led0/delay_off # ACT LEDを250ミリ秒消灯する
echo timer > /sys/class/leds/led1/trigger # PWR LEDである"led1"を"timer"モードにする
echo 1000 > /sys/class/leds/led1/delay_on # PWR LEDを250ミリ秒点灯する
echo 1000 > /sys/class/leds/led1/delay_off # PWR LEDを250ミリ秒消灯する
# 10秒続けたらLEDのモードを元に戻してから終了する。
sleep 10
echo mmc0 > /sys/class/leds/led0/trigger # ACT LEDである"led0"を"mmc0"モードに戻す
echo input > /sys/class/leds/led1/trigger # PWR LEDである"led1"を"input"モードに戻す
exit 0
shellスクリプト実行
root権限が必要
$ cd ~/bin/
$ sudo ./ctlLedRPi.sh
動画を撮ってみた。
#RaspberryPi #Bluemix #IoT #MQTT pic.twitter.com/8yw7k1YqFA
— m (@getapojim) 2015, 10月 27
プログラムの改修内容
BluemixのRaspberryPi登録レシピに登場するデバイス用のsampleプログラムを次の通り修正する。
修正前のソースコードはこちらで参照可能
修正するファイル | 新規で追加するファイル |
---|---|
iotmain.c mqttPublisher.c |
なし |
追加・修正内容は以下の通り。
修正内容1
char subscribeTopic[MAXBUF] = "iot-2/cmd/reboot/fmt/json";
char subscribeTopic[MAXBUF] = "iot-2/cmd/ledrpi/fmt/json";
修正内容2
ソースコードのファイル名が「Publisher」になっていて紛らわしいが、下記の抜粋はSubscribe時の処理。
sprintf(command,"sudo /sbin/shutdown -r %d", time_delay);
syslog(LOG_INFO, "Received command to restart in %d minutes.",time_delay);
sprintf(command,"sudo /home/pi/bin/ctlLedRPi.sh");
syslog(LOG_INFO, "Received command to control LED onboard);
プログラムの改修手順
作業はRaspberryPi2にログインして行う。
実行時ユーザは次の通り
$ : pi
# : root
設定ファイルの退避
# cd /etc/iotsample-raspberrypi/
# cp -p device.cfg device.cfg.`date +%Y%m%d`_1
※これで、アンインストール(dpkg -P)してもフォルダとバックアップファイルが残るので安心。必要パッケージのインストール
# apt-get install dpkg-dev build-essential devscripts
# apt-get install libssl-dev
ソースコード一式を入手
$ cd ~
$ git clone https://github.com/ibm-messaging/iot-raspberrypi.git
ソースコード修正・追加
$ cd ~/iot-raspberrypi/samples/c/
$ vi iotmain.c
$ vi mqttPublisher.c
ビルド
$ debuild -b
署名のエラーは無視する。
iotサービスの再インストール
アンインストール(古いのを)
# dpkg -P iot
インストール
# cd /home/pi/iot-raspberrypi/samples/
# dpkg -i ./iot_1.0-1_armhf.deb
サービスの確認
# service iot status
※起動している(okが表示される)こと。設定ファイル作成
# cd /etc/iotsample-raspberrypi/
# cp -p device.cfg.`date +%Y%m%d`_1 device.cfg
※1.でいったん削除されてしまうので、1.で退避したファイルで復元サービスの再起動
# service iot restart
※起動している(okが表示される)こと。起動モードの確認
# service iot getdeviceid
※registerd mode で起動している(registerd modeが表示される)こと。
BluemixからMQTTプロトコルでJSONデータを送信
MQTTの構成
BluemixのNode-REDアプリからMQTTプロトコルでpublishし、Raspberry Pi 2上のsampleプログラムからsubscribeする。
MQTTブローカー : BluemixのIoT Foundataionサービス
MQTTクライアント(pub) : BluemixのNode-REDアプリ ※Node-REDでなくても良い。
MQTTクライアント(sub) : デバイス用のsampleプログラム
MQTTのトピック : iot-2/cmd/ledrpi/fmt/json
MQTTのメッセージ : {"delay":1}
MQTTクライアント(publish)の構成
今回はNode-REDアプリとする。
「inject」ノードと「ibmiot out」ノードを使う。
項目名 | 設定値 | 備考 |
---|---|---|
Output Type | Device Command | |
Device Type | iotsample-raspberrypi | IoT Foundationで登録した通りに。 IoTFダッシュボードで確認可能 |
Device Id | xxxxxxxxxxxx | RasPi上で以下のコマンドの出力する値# service iot getdeviceid IoTFダッシュボードで確認可能 |
Command Type | ledrpi | トピックの一部になるため固定 |
Format | json | トピックの一部になるため固定 |
Data | {"delay":1} | 数字は何でもよい |
Name | IoTF | Node-RED上の表示名なだけなので何でもよい |
上記2つのノードを線でつないだら、右上の「Deploy」ボタンを押してデプロイする。
injectノードをポチッとすると、RasPi上でシェル(/home/pi/bin/ctlLedRpi.sh)が実行される。
すぐにLEDの点滅が始まる。(動画を再掲)
#RaspberryPi #Bluemix #IoT #MQTT pic.twitter.com/8yw7k1YqFA
— m (@getapojim) 2015, 10月 27
環境
Raspberry Pi 2 Model B
Raspbian
Bluemix IoT Foundation
Node-RED
参考
BluemixのRaspberryPi登録レシピ
https://developer.ibm.com/recipes/tutorials/raspberry-pi-4/
BluemixのRaspberryPi登録レシピに登場するデバイス用のsampleプログラム
(Linux用のdaemonになっている)
https://github.com/ibm-messaging/iot-raspberrypi/blob/master/samples/c/
[コラム] Raspberry Pi 2のオンボードLEDを自由に光らせよう
http://blog.livedoor.jp/victory7com/archives/43512294.html