1. 今回のやりたいこと
音楽再生システムを作ります。
これを実現するためには、下記4つの機能が必要になります。
- 表示機能
- ダウンロード機能
- 音楽受信機能
- 音楽再生機能
詳細については下記リンクを参照ください。
音楽再生システムを作ってみた (前編)
本記事では、音楽受信機能と音楽再生機能の設計編に関する内容を記載します。
2. 音楽受信/再生機能
音声データのフォーマットはWAVファイルとし、BlueTooth経由で受信します。BlueToothデバイスには、HC-06を使用します。(HC-06の詳細についてはKOZOS上で超音波センサのデータを周期的にPCへ送信してみた (設計編)を参照ください)
音楽受信/再生機能のソフトウェア構成図を以下に示します。
下記図の左半分が音楽受信機能、右半分が音楽再生機能になります。
次章から、各ソフトウェアの説明をします。
2.1 音楽受信/再生アプリケーション
改めての説明にはなりますが、音楽データはBlueTooth経由で受信します。BlueToothデバイスとして使用するHC-06の通信インタフェースはUARTであり、その最大通信速度は115200bpsとなっています。音声の仕様としては、1サンプル16bit、モノラル、サンプリング周波数16kHzとなっています。
1サンプルは16bitのため、1サンプルをBlueTooth経由で受信するのに約0.13ms((1/115200)×16)かかります。1s分の音声を再生するには16000サンプル必要になるため、1s分の音声データを受信するのに約2s(16000×0.13)かかってしまいます。
ある程度連続で音声を再生させたいため、アプリにて音声データをためる必要があります。
音楽データをためるためのバッファ構造を以下に示します。
バッファは2次元配列で定義し、1つ1つのデータが1サンプルに相当します。x方向は160サンプル(10ms分の音声データ)とし、これを1フレームと定義します。今回は、最大3秒分の音声データを格納するようにするため、y方向は300フレームとします。
2.2 WAVファイル解析マネージャ
WAVファイルにはヘッダとデータがあります。ヘッダを解析し、WAVファイルと認識した場合は、データを音楽受信/再生アプリケーションへ通知します。
2.2 BlueToothデバイスドライバ
BlueToothデバイスを制御するためのソフトウェアになります。
BlueToothデバイスドライバ下記2つのタスクから構成されています。
-
データ受信タスク
BlueToothからのデータを受信するタスクになります。
データを受信するとWAVファイル解析マネージャへ通知します。 -
データ送信/接続チェックタスク
BlueToothデバイスと接続状態を管理し、接続されている場合はデータをBlueToothデバイスへ送信します。(ただし、今回はデータ送信は行いません。デバッグ用にATコマンドを送信するときにのみ使用します。)
デバイスとの接続方法については結構調べたため、詳しく説明したいと思います。KOZOS上で超音波センサのデータを周期的にPCへ送信してみた (設計編)でも接続方法について記載しているのですが、今回はより詳細に調査いたしました。
今回、HC-06と使用しているマイコンとは以下のように接続しています。
HC-06には、STATE、RXD、TXD、GND、VCC、WAKE UPピンがあります。いろいろ調査したところSTATEピンがデバイスとの接続チェックに使えることがわかりました。
以下に何かしらと接続されているときと接続されていないときのSTATEピンの波形を載せます。
・接続されているときの波形
・接続されていないときの波形
上記の通り、何かしらと接続されているときは常に3.3V、接続されていないときは約200ms周期でhighとlowを繰り返しています。10ms周期でSTATEピンを確認し、16回連続同じ値であれば”接続された”、そうでない場合は"接続されていない"と判断することとしました。
2.3 USARTドライバ
USART通信を行うためのソフトウェアになります。
BlueToothデバイスとはUARTで通信するため、USARTドライバが必要になります。
2.4 GPIOドライバ
GPIOの制御を行うためのドライバになります。
2.1のデバイス接続チェックタスクで述べたように、STATEピンで接続状態を確認する必要があるため、GPIOドライバが必要になります。
3. 最後に
今回作成したソースコードを下記githubに置きました。
Nucleo-L4R5ZI_System
簡単な動作確認しかできていませんので、使用される場合は自己責任でお願いいたします。
次回は、音楽再生機能についての記事を作成する予定です。