LoginSignup
6
7

More than 5 years have passed since last update.

BluemixでRaspberryPi2を制御する (4)アクチュエータを動かす 音編

Last updated at Posted at 2016-01-09

概要

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ライブラリを活用 圧電スピーカーで音を鳴らそう」に記載されている回路でやってみる。

掲載されていた図(Excelで作図)
No28_圧電スピーカー.png

回路(設計)

元ネタの図の通りにFritzingで作ってみた。
No28_圧電スピーカー_ブレッドボード.png

回路(実装)

Fritzingで作った絵の通りにつなげてみた。
No28_圧電スピーカー.jpg

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

音を出してみる.png

出力例)
音  : ドレミファソラシド
画面 : 数値はドレミファソラシドの各音の周波数値を表す。

動画を撮ってみた。

#RaspberryPi #Bluemix #IoT #MQTT pic.twitter.com/l5ynRtj2oD

— m (@getapojim) 2015, 10月 28

プログラムの改修内容

BluemixのRaspberryPi登録レシピに登場するデバイス用のsampleプログラムを次の通り修正する。
修正前のソースコードはこちらで参照可能

修正するファイル 新規で追加するファイル
iotmain.c
mqttPublisher.c
なし

追加・修正内容は以下の通り。

修正内容1

iotmain.c(修正前 30行目)
char subscribeTopic[MAXBUF] = "iot-2/cmd/reboot/fmt/json";
iotmain.c(修正後)
char subscribeTopic[MAXBUF] = "iot-2/cmd/buzzer/fmt/json";

修正内容2
ソースコードのファイル名が「Publisher」になっていて紛らわしいが、下記の抜粋はSubscribe時の処理。

mqttPublisher.c(修正前 126~130行目)
        sprintf(command,"sudo /sbin/shutdown -r %d", time_delay);
        syslog(LOG_INFO, "Received command to restart in %d minutes.",time_delay);
mqttPublisher.c(修正後)
        sprintf(command,"sudo /home/pi/bin/software_tone");
        syslog(LOG_INFO, "Received command to control buzzer");

プログラムの改修手順

作業はRaspberryPi2にログインして行う。
実行時ユーザは次の通り
$ : pi
# : root

  1. 設定ファイルの退避
    # cd /etc/iotsample-raspberrypi/
    # cp -p device.cfg device.cfg.`date +%Y%m%d`_1
    ※これで、アンインストール(dpkg -P)してもフォルダとバックアップファイルが残るので安心。

  2. 必要パッケージのインストール
    # apt-get install dpkg-dev build-essential devscripts
    # apt-get install libssl-dev

  3. ソースコード一式を入手
    $ cd ~
    $ git clone https://github.com/ibm-messaging/iot-raspberrypi.git

  4. ソースコード修正・追加
    $ cd ~/iot-raspberrypi/samples/c/
    $ vi iotmain.c
    $ vi mqttPublisher.c

  5. ビルド
    $ debuild -b
    署名のエラーは無視する。

iotサービスの再インストール

  1. アンインストール(古いのを)
    # dpkg -P iot

  2. インストール
    # cd /home/pi/iot-raspberrypi/samples/
    # dpkg -i ./iot_1.0-1_armhf.deb

  3. サービスの確認
    # service iot status
    ※起動している(okが表示される)こと。

  4. 設定ファイル作成
    # cd /etc/iotsample-raspberrypi/
    # cp -p device.cfg.`date +%Y%m%d`_1 device.cfg
    ※1.でいったん削除されてしまうので、1.で退避したファイルで復元

  5. サービスの再起動
    # service iot restart
    ※起動している(okが表示される)こと。

  6. 起動モードの確認
    # 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」ノードを使う。
Node-RED_MQTT_pub_001.png

injectノードの中身
着火するだけなので空っぽでよい。
Node-RED_MQTT_pub_002.png

ibmiot outノードの中身
Node-RED_MQTT_pub_buzzer_001.png

項目名 設定値 備考
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」ボタンを押してデプロイする。
Node-RED_MQTT_pub_004.png

injectノードをポチッとすると、RasPi上でプログラム(/home/pi/bin/software_tone)が実行される。
Node-RED_MQTT_pub_005.png

ドレミファソラシドが鳴る。(動画を再掲)

#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/

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7