こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Raspberry Pi B+ .wavファイル

Raspberry Pi B+で設定時刻になると、LEDを点灯し、アラームを鳴らして、設定した時間が経つとLEDをOFFにし、アラームを止めるプログラムを書きました。

電源を入れて、1回目は正常に動作します。しかし、2回目はアラームが鳴りません。途中で止まります。

そこで sudo halt で一旦電源を落とし、ACアダプタを抜いて、再びACアダプタを差して、実行するとうまくいきます。

また、 sudo reoot で再起動して再度実行してもうまくいきます。

アラームは.wavファイルで、再生に使っているソフトはomxplayerです。プログラム言語はC言語です。

Cのプログラムでsystem関数で、

int play_main_alarm() {
printf("Play: Main Alarm\n");
if (system("omxplayer -o local ./wav/ma.wav")) {
puts("execution error !!\n");
return -1;
}
return 0;
}

のように使っています。

何か、バッファとかキャッシュとかをクリアしないといけないのでしょうか。

それと、LEDをON/OFFする為に wiringPi.h を使っています。試作の段階でLEDを取り扱わなかった時は、2回でも3回でもアラームは鳴っていたと思います。LEDを使うようになってから2回目の起動に問題が出るようになりました。

LinuxもC言語も初心者です。よろしくお願い申し上げます。

投稿日時 - 2015-07-26 19:44:43

QNo.9019248

困ってます

質問者が選んだベストアンサー

ラズパイのホームページは、御存知ですよね。
https://www.raspberrypi.org/forums/
ここには、フォーラム、FAQ、プログラミングと言ったものがあります。
ここを覗いてみるのも一つです。

2chとしては、
http://hayabusa6.2ch.net/test/read.cgi/linux/1424619905/

投稿日時 - 2015-07-31 18:57:20

お礼

これではいつまで続くか分からないので締め切ることにしました。
yakan9さんには随分お世話になりました。本当にありがとうございました。

投稿日時 - 2015-07-31 20:21:30

ANo.5

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.4

回答番号3で、記載ミスをしました。
> それは、ストアードプログラミングと言われる方式です。
構造化プログラミングの間違いです。

投稿日時 - 2015-07-31 03:52:32

ANo.3

> man omxplayer でオプションを調べている所です。
限られた範囲内だけでなく、WEB検索してみるのも良いです。
キーとして、「ラズパイでomxplayerを使う」
http://blog.mamemomonga.com/2015/01/raspberry-pi-modelb.html
omxplayer の記事があるのは、
http://deviceplus.jp/hobby/raspberrypi_entry_012/
この辺くらいかな。

> このプログラムは単にLEDをつけて音を出すだけではないのです。
> でも頭に思い描いているものを
> 作り上げるには避けて通れないです。

Raspberry Pi というと、日経Linuxで毎号記事として載っていますね。
確か、去年の4月号あたりからでしょうか。
略して、「ラズパイ」という記事は、毎号見ます。
最近は、ロボット製作になってきました。

記事を見ていて感じることは、
プログラム記述がなっていないことです。
正式なプログラム技法といわれる方式で作られたプログラムは、非常にデバッグしやすい特徴があります。
それは、ストアードプログラミングと言われる方式です。
ラズパイ自身、昔の「マイコンキッド」みたいなものですが、
昔に比べたら、格段に高品質であることは間違いないです。
しかし、OSは、Linuxを使用しているので良いと思いますが、その他のサブルーチン等は、「趣味」の域のものと思われますので、余り信頼しない方が良いかも知れません。
それは、回答1に記載した、リユーザブルの保証をしていない可能性もあるということです。

投稿日時 - 2015-07-31 03:18:02

お礼

そうです。日経 Linuxのムックの「ラズパイマガジン 2015年春号」とネットを頼りにここまで来ました。
何回もトラブルに見舞われ、なんとかここまで来たので諦める訳には行きません。

投稿日時 - 2015-07-31 19:55:19

ANo.2

> omxplayer の使い方に問題があるのではないかと思います。

当方もそう思います。 
そこまで分っていれば、当方の場合であれば、
omxplayer が、
リユーザブルの保証
をしていない可能性があり、
別な個所に、omxplayerサブルーチンコールだけのロジックを作成しておき、このサブルーチンに入る前に、
必ず初期化して入るようにするか、
言い換えると、サブルーチンコール部分をコピーしてからというになります。

テスト的に、数個のomxplayerサブルーチンコールだけのロジックを作成しておき、順番に入って行かせてみることで、
リユーザブル性の保証がされていないことが分かるのではないでしょうか。

あるいは、この件に対しての、
man omxplayer
があれば、読んでみる。
あるいは、readme 的な説明があれば読んでみる。
WEB検索してみる。

投稿日時 - 2015-07-29 23:57:48

補足

前に書いたと思いますが、wiringPi を使う前は何回でもアラームが鳴っていましたので、試しに

#include <wiringPi.h>



LEDをON/OFFする関数の部分をコメントアウトしてコンパイルして実行してみた所、
2回目以降も何回でもアラームが鳴るようになりました。LEDをつないでいる、GPIOの部分が初期化できていないのではないかと思い、

https://tool-lab.com/2013/12/raspi-gpio-controlling-command-2/

を参考に、

if(wiringPiSetupGpio() == -1) return 1;

をコードの最初の方に書き足しましたが、1回目はOKですが2回目はやはり omxplayer の所で止まります。

あと、気付いたのは、2回目にアラームを鳴らす部分に来た時に、スピーカから「ブツッ」という音が
出ている点です。

解決に向かっている気はします。諦めずに続けます。

投稿日時 - 2015-07-31 19:52:36

お礼

ご回答ありがとうございます。

man omxplayer でオプションを調べている所です。

このプログラムは単にLEDをつけて音を出すだけではないのです。でも頭に思い描いているものを
作り上げるには避けて通れないです。なんとか実現に向けて頑張りたいと思います。

投稿日時 - 2015-07-30 18:44:41

ANo.1

> 電源を入れて、1回目は正常に動作します。
> しかし、2回目はアラームが鳴りません。
> 途中で止まります。

こうしたプログラムのデバッグ方法は、最も簡単な方法として、
判断ボックスの前後にメッセージ出力させてデバッグするのが初心者でも分かります。
print step1.
print step2.
といったコメント出力行を入れていきます。
すると、貴殿がこう通るはずだと思っていたルーチンを通らないことが判明するでしょう。
何故か。
内部スイッチを使っていませんか。
その内部スイッチをそのメインルーチン/サブルーチンに入る前に初期化していますか。
もし初期化していなければ、貴殿が想定した流れにならない場合も発生します。

こうしたプログラム作成上の知識は、特に、大きく分類すると、2つです。

大きく分けると、
1.リユーザブルの保証。
2.リエントラントの保証。
詳細は、コンピュータ辞典等で調査してください。
簡単な厳密さを少し欠ける説明としては、
1.reusable routine
再使用可能ルーチン。
2.reentrant routine
再入可能ルーチン。
当然再使用可能ルーチンでもある。
1.との違いは、各変数はルーチン内には持たず、別な管理テーブルで一括管理する。
OSの基本部分のジョブやタスクのディスパッチャ(dispatcher)は有名です。

投稿日時 - 2015-07-27 17:53:49

補足

yakan9さんのアドバイスを受けてprintf()で流れを調べましたが、意図通りに動いています。
しかし、2回目の実行時、 omxplayer を実行して、そこで止まります。流れはあっています。

設定ファイルを開いて時刻を設定していますが、そのファイルはきちんと終了時に閉じています。
omxplayer の使い方に問題があるのではないかと思います。 

投稿日時 - 2015-07-29 18:59:20

お礼

難しいですね。とりあえず、
print step1.
のようにプログラムの流れをはっきりさせようと思います。

あきらめません。初心者から脱却する為に。

ご回答、ありがとうございます。

投稿日時 - 2015-07-27 19:36:54

あなたにオススメの質問