概要
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) アクチュエータを動かす 音編 (これ)
外付けのパーツを動かす方法
光の次は音を出してみる。圧電スピーカーを使う。
ケーブルが赤黒の2本のみなのでLEDと同じようにつないで/sys/class/gpio
配下に値を書き込めばよいのかな?と思ったが、
1. ムックに「他励式」「自励式」というキーワードが出てきた。
2. シンプルなはずのムックのソースコードがわざわざライブラリを使って書かれている。
この2点から気になってググったところ、以下のことが判明した。
・自励式は電池につなぐと音が出る。
・他励式は電池につなぐだけでは音は出ず、文字通り誰かが励ましてあげないと音が出ない(らしい)。
手元のパーツセットに入っているのはどうやら他励式らしいので、素直にライブラリを使うこととする。
回路(ネタ)
ムック「日経Linux ラズパイマガジン 2015年春号 」第3部 はじめての電子工作ステップ50の内、「No.28 WiringPiのSoftware Toneライブラリを活用 圧電スピーカーで音を鳴らそう」に記載されている回路でやってみる。
回路(設計)
回路(実装)
WiringPiの導入
# cd /var/tmp
# git clone git://git.drogon.net/wiringPi
# cd wiringPi
# ./build
導入確認のためにバージョンを確認してみる。
# gpio -v
バージョンが表示されること。
Raspberry Pi 2上で音を出してみる
ムック読者限定サイトに用意されたプログラム「software_tone.c」をコンパイル・実行してみる。
ドレミファソラシドを1度だけ鳴らす。
root権限が必要。
$ cd ~/bin
$ ll software_tone.c
$ gcc -o software_tone software_tone.c -lwiringPi
$ sudo ./adc_lm35dz
出力例)
音 : ドレミファソラシド
画面 : 数値はドレミファソラシドの各音の周波数値を表す。
動画を撮ってみた。
#RaspberryPi #Bluemix #IoT #MQTT pic.twitter.com/l5ynRtj2oD
— m (@getapojim) 2015, 10月 28
プログラムの改修内容
BluemixのRaspberryPi登録レシピに登場するデバイス用のsampleプログラムを次の通り修正する。
修正前のソースコードはこちらで参照可能
修正するファイル | 新規で追加するファイル |
---|---|
iotmain.c mqttPublisher.c |
なし |
追加・修正内容は以下の通り。
修正内容1
char subscribeTopic[MAXBUF] = "iot-2/cmd/reboot/fmt/json";
char subscribeTopic[MAXBUF] = "iot-2/cmd/buzzer/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/software_tone");
syslog(LOG_INFO, "Received command to control buzzer");
プログラムの改修手順
作業は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/buzzer/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 | buzzer | トピックの一部になるため固定 |
Format | json | トピックの一部になるため固定 |
Data | {"delay":1} | 数字は何でもよい |
Name | IoTF | Node-RED上の表示名なだけなので何でもよい |
上記2つのノードを線でつないだら、右上の「Deploy」ボタンを押してデプロイする。
injectノードをポチッとすると、RasPi上でプログラム(/home/pi/bin/software_tone)が実行される。
ドレミファソラシドが鳴る。(動画を再掲)
#RaspberryPi #Bluemix #IoT #MQTT pic.twitter.com/l5ynRtj2oD
— m (@getapojim) 2015, 10月 28
所感
ライブラリが中できっと/sys/class/gpio
を使ってるんだと信じたい!
環境
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/