マイコン工作実験日記

Microcontroller を用いての工作、実験記録

BM20からのAVRCPイベントを調べる

2017-09-18 13:50:22 | WT32/BM20
BM20をシリアルでつなげる事によって得られる大きなメリットのひとつがAVRCPを使っての情報取得制御が可能となる事です。コマンドを送信する事で音楽プレーヤの再生開始(play), 休止(pause), 停止(stop)といった操作が行えますし、再生中のトラックの曲名やアルバム名を要求するコマンドを送信してやり、その応答としてそれらの情報を取得することができます。

特に何の操作もしなくても、AVRCPがつながると、次のようなイベントが上がってきました。

BM20から上がってくるイベントについては、SPK_Module_UARTCommandParameters.xlsというExcelファイルのそのフォーマットの説明があるのですが、どうも説明内容と実際に出力されるフォーマットが一致していないようです。もともと、フォーマット概要が記されているだけで、その内容の意味まで踏み込んだ説明があるわけでもないので、自分で調べるしかありません。AVRCPの仕様書を元に上記のパケットの意味を調べてみると、どうやらつぎのようになっているようです。
0F           Response: INTERIM
48           subunit_type: PANEL, subunit_id: 0
00           Opcode: Vendor Dependent
00 19 58     Company ID
31 00        PDU ID: Register Notification
00 02        Parameter Length = 2
01 02        EVENT_PLAYBACK_STATUS_CHANGED = PAUSED

マイコンソフトでは何もAVRCPのコマンドを投入していないのにもかかわらず、プレーヤの現在の状態を報告してくれているようです。最初の INTERIM応答というのは本来であれば、マイコン側から通知(Notification)の要求を出した際に、その暫定応答として帰ってくるべきパケットです。この動きからマイコン側から何もコマンドを出さずともBM20が自動的にプレーヤの状態変化通知の要求を出してくれているであろうことが推察できます。

プレーヤ側で音楽の再生を開始してみると次のような2つのパケットが出てきました。

先に出てきたパケットでは最初のパケットの最初のバイトが 0x0F (INTERIM) から 0x0D (CHANED)に変化し、最後のバイトが 0x02 (PAUSED)から0x01(PLAY)に変化しており、状態変化が発生したことを通知する内容となっています。

後のパケットは最初のパケットと同じように最初のバイトが0x0F (INTERIM)になっているので、BM20が次の状態変化に備えての通知要求を自動的に発行してくれた結果を示す応答であろうことがわかります。

このようにどうやらBM20は状態変化については自動的にAVRCP の通知要求を出してくれることがわかりました。しかし、そのほかの情報についてはマイコン側から明示的に通知要求を出してやる必要があります。そこで次のような内容のAVRCPパケットを組み立ててAVC_SPECIFIC_CMDとして送信してやる title コマンドを用意して、これを実行してみました。このコマンドパケットは、再生中の曲のタイトルとアーティスト名を要求するものです。
00                       dbindex = 0
20                       PDU ID: GetElementAttribute
00
00 11                    length = 17
00 00 00 00 00 00 00 00  Identifier: PLAYING
02                       AttributeCount = 2
00 00 00 01              Title of Media
00 00 00 02              Name of the artist



取得される情報が長くなるので、応答中の曲名とアーティスト名はデコードして表示するようにしています。

このようにAVRCPを使うことで、プレーヤの状態や再生中の曲に関する情報を取得することができますので、これらの情報をLEDやLCDを使って表示することも可能になります。

STM32L4+

2017-09-15 12:34:27 | Weblog
STM32 CubeMXが更新されたようなので、早速インストール。先日はまったSTM32L452のHSICalibrationValueを確認してみたものの、まだ修正が反映されていないようです。相変わらずディフォルトが16で、これ以上の値が指定できません。64が指定できればいいんですが。。

さてMCU Selectorを見ると、どうやら近日中にSTM32L4+シリーズというのが発表される模様。特徴はOCTOSPIとGFXMMUとかいう機能らしい。OCTOSPIはまぁ察しがつきますが、GFXMMUって何でしょうね?グラフィックスのアクセレータか何かでしょうか。ルックアップテーブルを持つようなので、何か変換に使うもののようです。

上位機種ではLTDCだけでなくDSI Host機能も持つようです。Low powerでもGUIの時代ということですね。

NUCLEO-L452RE

2017-09-10 20:03:57 | WT32/BM20
BM20を制御するためのボードを組み立てました。今回使用するのはBM20と一緒に購入しておいたNUCLEO-L452です。手持ちのNUCLEO-L476でも良かったのですが、Crystalress USBをためしてみたいというだけの理由で購入。



これまではジャンパでBM20基板をつなげていたのですが、EEPRM書き換えの時にはFTDIに常げ、プログラム動作の時にはSTM32にジャンパし直すという作業が面倒なので、基板を組むことにしました。STM32への接続がピンコネクタに刺すだけで済むので、かなり作業が楽になりました。コネクタの向きの都合上、BM20基板が裏向きになってしまいましたけど。

実際にBM20基板をつなげて動作を確認していたら、クロック源としてMSIを選択するとちゃんと動くのに、HSIを使うと送受信ができないというトラブルに遭遇。単純にクロック源の選択を変更するだけで動かなくなってしまうので、原因はクロックにあるとしか思えません。TIM15のタイマキャプチャを使ってLSEの周期を測定することでHSIの周波数を逆算してみると、16MHzで発振すべきところが13.8MHz程度になっていることが判明。コードを確認してもおかしなところは見つからないので、STM32 Forumでサーチしてみると「同じお悩み」が見つかりました。

CubeMXが吐いたコードが間違っているという良くあるバグなのですが、この問題のタチが悪いのはRMの解説の記述も間違っているという点です。マニュアルで説明されているHSIのキャリブレーションのディフォルト値がもともと間違った値なので、CubeMXが生成したコードを読んでも正しいコードのようにしか見えないのです。毎度のことですがCubeMX使って新しいプロジェクト起こすと、必ずバグに当たるんですよねー。

micro:bit

2017-09-06 19:31:42 | Weblog
秋月を始め、各店でmicro:bitの販売が始まったようですね。いわゆるTelec版というやつで、日本の工事設計認証を受けたタイプが製造されるようになり、国内での販売が開始されたようです。



で、ホームページの写真を見て気づいたことが2点。
  1. ボード上には証明番号の表示はないようである。どうやら、説明書には記述があるが、ボード上にはラベルやシルクでの表示はないようである。
  2. これまではWiFiやBLEのボードって、大概は認証を受けたモジュールを搭載したものだったのですが、こいつはボードとして認証を受けているんですね。

国内で販売されているモジュールは、ほとんど金属シールドで覆ったカンになっていますが、その背景には無線機部分を改造されることを防止する効果も期待されていたのではないかと思います。今やRF内蔵のマイコンにPCBのパターンアンテナで足りる時代なので、むき出しで良ければ当然コストダウンになります。今後は、むき出しのモジュールも大手を振って販売されるようになるんでしょうか?

BM20ではモジュールの裏側に証明番号のシルクが印字されていましたが、番号さえ控えておけば、何も恥じることなく、正々堂々と人前に出せるということですね。安心しました。

BM20の機能概要

2017-09-02 14:32:03 | WT32/BM20
今更ではありますが、データシートやアプリケーションノートに明記されていないことがありすぎるので、簡単に整理しておこうかと思います。これらの機能概要については、UI Toolの設定項目となっているので、実際にこれを使って設定を変更して動作を確認することで動作仕様を把握するということになります。なんか、 説明しなくても使えばわかるだろ!? と言われている感じ。

  • 基本的にハンズフリーのスピーカ用に設計されているデバイスである。HFP/HSP, A2DP/AVRCPに対応しているが、サポートするのはHF UnitならびにSink側だけ。AG (Audio Gateway)や Sound Source側の役割を果たすことはできない。
  • データシートににはPBAP v1.0対応と書かれているが、入手したデバイスではサポートされていなかった。どうすればPBAP対応したデバイスが入手できるのかは不明。また、PBAP対応のデバイスでは、HSPがサポートされないように思われる。
  • 初期設定ではSPPはイネーブルされていない。SPPデータの送受のためにはマイコンでの制御が必要。
  • 全てのプロファイルをイネーブルすると、BM20からのSPPデータ送信が動かないように思われる。さらに調査必要。
  • 8台までのペアリング相手を記憶できる。設定により、台数制限可能。
  • ディフォルトではイネーブルされていないが、マルチポイントをサポートできる。同時に2つのHFならびにA2DP/AVRCP接続を保持することができるようである。UARTコマンドでも2つのリンクのどちらを使うかを指定するパラメータが用意されている。
  • 起動時に最後に接続したデバイスに対して自動的に再接続することが可能。ペアリング情報を参照して、接続したことのあるデバイスに順次再接続を試みることもできる。
  • UARTコマンド上では、iAPにも対応できるようになっているが、詳しい使い方は不明。ライセンスがないと、情報開示もできないと思われる。