mbedを使ってwave音源をRTOS環境上で再生する方法。
こんにちは。無事期末試験も終わり、春休みを満喫しているあさきです。
今回は少し変わり種になります。院の講義内でmbedについて個人的に新しく学んだことがあったので、忘れないためにも備忘録を残したいと思った次第です。
尚、mbedやRTOS環境に長けてる人にとって今回のテーマは「ふん、何だそんな事か」と鼻で笑う程度の内容ですので、悪しからず。
経緯(方法だけ知りたい方は読み飛ばしてください)
チームを組んでテーマを設定して何かプロジェクトを成し遂げよう、という授業の一環での出来事です。僕のチームのテーマは端折って言うと、光るスマートデバイスを作ることでした。
その制御をmbedで行なっていたのですが、要求の一つに音楽を鳴らす機能があります。僕が提案しました。なので、僕自身経験のあるwave音源を鳴らすことにし、当然その部分は僕が担当することになりました。
wave再現プログラムを一旦単体で組み、動作確認が取れた後にメインのプログラムとマージしたその時、不具合が起きました。まあ、異なる人が組んだプログラムをマージしようとしたので、当然といえば当然の出来事ですよね...
SDカードからwave音源を再生する
今回プロジェクト期間が短く、あまり凝ったプログラムを組む時間も無かったため、ネットに転がっている手法をほぼそのまま流用しました。
動作の流れとしてはこんな感じ。
コーディングもいたってシンプルです。
使用したライブラリです。Import into Compilerでインポートします。
使用した部品はこちら。
- HT82V739使用ミニモノアンプ基盤
- マイクロSDカードスロットDIP化キット
- ダイナミックスピーカー
- 部屋に転がっていた2GBのマイクロSDカード
配線は各部品の仕様書に書いてある通りに繋げれば問題ありません。mbedのSPI接続端子はp5~p8とp11~14、アナログピンはp15~p20です。VOUTは3.3v出力、VUは5vとなっています。
しかし上記のままではRTOS環境で動作しない
ここまでは普通に動作します。しかし、そのままRTOS環境で動かそうと思うと動きません。コンパイルエラー地獄となります。
当初、まさかこんな事になるとは思いませんでした。しかも僕はデバイスのメインプログラム担当じゃないので、それがRTOS環境で動いているなんて知る由もありません。今回の不具合でバグ修正の視野が広がりました。
既に書いてしまったプログラムをRTOS環境で動作するように変える
今回のように超短いプログラムであれば、RTOS環境でも動くように書き換えてもいいのですが、作りこんで長くなったプログラムを一から書き換えるのは正直面倒です。
なので、手っ取り早く公式RTOSのライブラリをインポートし、画像のように追記します。
たったこれだけです。ただ、他のライブラリとの相性問題も無いとも言い切れないため、この方法が有効であるとは一概には言えません。
ちなみにThread毎にこのwave再生プログラムを実行する場合、音楽再生中にThread変更するとちゃんとプログラムが終了処理されず、次のThreadが実行されません。
僕の場合、Thread実行中はずっと音楽を流す必要があったため、次のThread開始時間までに再生が終了するように音源をクロップしました。
今回のプログラム以外でも応用できそうですよね。
最後に
正直あまりプログラミングの知識が無くても、この程度ならすぐ出来てしまいます。waveplayerのコードをコピペし、必要なライブラリをインポートするだけなので。ただ、RTOS環境下では動作しないことが分かったので、次に生かせそうです。
あと、今回は手法を知らなかったというより、原因が突き止められなかった、ということになりますね。チームプロジェクトを進行する際は、常に「ほうれんそう」を心掛けたい。そんなことを痛感したチーム活動でした。
以上。参考になりましたら幸いです。
ここまで読んでいただき、ありがとうございました。