マイコン工作実験日記

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

EEPROM設定を変更してみる -- その1

2017-08-15 10:49:58 | WT32/BM20
工場出荷時状態での動作がほぼ確認できたので、EEPROMを書き換えて設定を変更してみることにします。

BM20には設定用ツールとして、次の4つのWindowsアプリが用意されています。
  1. UI Tool
    User Interface関連のパラメータを設定変更するツールで、.txtファイルを生成します。サポートするプロファイル、ボタンへの機能割付け、LEDの点滅パターン、トーン設定や音声ガイドなどの設定ができます。
  2. DSP Tool
    音声信号入出力に関連するフィルターやイコライザー、アンプゲインなどの設定を変更するツールです。.txtファイルを生成します。
  3. MPET Tool
    UI ToolとDSP Toolの出力したファイルをマージして、EEPROMへの書き込みデータを作成するツール。.ipfファイルを生成します。
  4. EEPROM Tool
    MPET Toolの出力したデータ(.ipfファイル)をBM20に内蔵するEEPROMに書き込むためのツール。

手順が多くて面倒ですが、上記の4つのツールをこの順番で使ってEEPROMへの書き込みを行います。この4つのツールのうち、実際にBM20とつないで作業を行う必要があるのは、最後のEEPROMツールだけです。

さて、これらのツールはBM20のページのDocumentation/Softwareからダウンロードできるのですが、そこにはBM20_203 Tools SetIS2020_002 Toolsの2種類のzipファイルが掲載されています。両方をダウンロードしてみると、どちらにも4種類のツールが含まれています。どちらを使えばいいのかわからないので、試しにUI Toolを立ち上げてみると、そもそも最初の画面の表示内容が違います。

BM20_203のUI Tool表示画面


IS2020_002のUI Tool表示画面


どちらもディフォルトではSPPがイネーブルされていないことを示しているようなんですが、BM20_203の方ではそもそもPBAPのサポートが無いように見受けられます。いよいよ混乱してきましたが、ツールセットの中に含まれていたアプリケーションノートを読んでようやくとその違いがわかりました。どうやら、SiliconのバージョンにIS20xxx_002 とIS20xxx_203の2種類があり、まずはEEPROMツールを使ってシリコンのバージョンを確認し、それに対応したツールを使う必要があるとのことです。

EEPROMツールを使うためにFT232とBM20のHCI_TX/HCI_RX端子をつなぎ、DIP SWを P1-ON, P2-OFF, P3-ONに設定し直します。USB 5Vを加えてやるとLED1とLED2の両方が点灯状態となり、EEPROMツールからのアクセスができました。MFBボタンの操作は必要ありませんでした。



わたしの購入したモジュールのSiliconバージョンはIS20xxx_203であることが判明しましたので、Tool Set としてはBM20_203 Tools Setを使えば良いことになります。しかし、これはPBAPが使えないことが確定ということなんでしょうか? 改めて資料を確認してみるとデータシートにはPBAPサポートが明記されているのですが、BM20の製品ホームページにはPBAPという文字はありません。なんか騙された気分がしないでもありませんが、まぁこんなトラブルも中華チップを楽しむ上での醍醐味かもしれません。

前置きが長くなったので、続きは その2に書くことにします。

BM20を動かしてみる

2017-08-14 01:07:54 | WT32/BM20
準備は整ったので、いよいよ実際にBM20を動かしてみます。もともとBM20はサウンドバーとかスピーカー・フォンのような民生機器に用いられることを意識したモジュールなので、制御マイコン無しでも電源を入れてやるだけでBlueoothスピーカとして十分な機能を提供してくれます。

電源を入れる前に、まずDIP SWの設定を行っておきます。PIN1とPIN2をOFF, PIN3をONにしてやることで、BM20のP20, P24, EANの各端子を全てHighにして電源を入れることで、通常動作モードで起動します。実験ボード上にはLED1とLED2の2つのLEDが実装されています。ADP_INに5Vを入れてやるとLED2がしばらく点灯して、消えました。この状態では、接続された電池への充電機能は動くものの、Bluetooth部分はオフになっているようです。

BM20評価ボードのマニュアルによると、MFBボタンをクリックすると電源が入って、ペアリングモードになり、LEDがブリンクするとのことだったのですが、何度ボタンをクリックしても電源が入らず、焦りました。試しに長押しすると2つのLEDが点滅して電源が入り、さらにMFBボタンを押し続けるとペアリングモードに入って、ふたつのLEDが交互に点滅することがわかりました。また、電源が入った時とペアリングモードに入った時には、動作状態を知らせるトーンがスピーカから鳴って知らせてくれます。電源投入時には、あらかじめスピーカあるいはイヤフォンをつなげておきましょう。

ボタンへの機能割り当てやLEDの点滅パターン、トーンの種類はUI ToolというWindowsアプリでモジュール内に内蔵されているEEPROMの設定内容を変更することで、設定変更できるようです。またいくつかのイベントはトーンでの通知の代わりに音声ガイド(中/英/仏/西の4ヶ国語対応)での通知にも変更できるようです。ディフォルトでは音声ガイドは無く、トーン通知だけのようですので、後ほどEEPROM書き換えを試してみるつもりです。

ペアリング状態では、スマホから発見可能になるので、次のように表示されます。



EDDY SHSというのが、モジュール名とか内部で使用しているチップ名称というわけでも無く、何を示しているのかわからないのがちょっと不思議です。まぁ、この名前もUI Toolで変えられるようですので、何でもいいのですが。。

この後、ペアリングを行うと、そのまま接続もHFP, A2DP, AVRCPでの接続も行われるようです。



詳細は省略しますが、何の問題もなく音楽の再生や、電話の着信が行えました。残念ながらタクトスイッチの数が足りないのでAVRCPでの操作まではまだ確認できていません。さて、ここまでのところでちょっと疑問が。。
  • データシートにはPBAP 1.0に対応と書いてあるが、 HFP接続時に電話帳へのアクセス承認を求められない。つまり、BM20はPBAPでのアクセス要求を出していないのではないか?
  • データシートにはSPPをサポートしていると書かれているが、SPPでアクセスできない。

データシートを読んでも、サポートするプロファイルについては、名前が列挙されているだけで、それ以上の説明はありません。そこで Linuxを立ち上げて sdptoolでサービスを確認してみました。
Browsing 34:81:F4:09:43:17 ...
Service RecHandle: 0x10001
Service Class ID List:
  "PnP Information" (0x1200)
Language Base Attr List:
  code_ISO639: 0x656e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "PnP Information" (0x1200)
    Version: 0x0103

Failed to connect to SDP server on 34:81:F4:09:43:17: Connection refused
Service Name: Headset unit
Service RecHandle: 0x10002
Service Class ID List:
  "Headset" (0x1108)
  "Generic Audio" (0x1203)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 2
Language Base Attr List:
  code_ISO639: 0x656e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "Headset" (0x1108)
    Version: 0x0102

Service Name: Hands-free unit
Service RecHandle: 0x10003
Service Class ID List:
  "Handsfree" (0x111e)
  "Generic Audio" (0x1203)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 1
Language Base Attr List:
  code_ISO639: 0x656e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "Handsfree" (0x111e)
    Version: 0x0106

Service Name: Audio SNK
Service Provider: ISSC
Service RecHandle: 0x10008
Service Class ID List:
  "Audio Sink" (0x110b)
Protocol Descriptor List:
  "L2CAP" (0x0100)
    PSM: 25
  "AVDTP" (0x0019)
    uint16: 0x0102
Language Base Attr List:
  code_ISO639: 0x656e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "Advanced Audio" (0x110d)
    Version: 0x0102

Service Name: AVRCP CT
Service Provider: ISSC
Service RecHandle: 0x10006
Service Class ID List:
  "AV Remote" (0x110e)
  "AV Remote Controller" (0x110f)
Protocol Descriptor List:
  "L2CAP" (0x0100)
    PSM: 23
  "AVCTP" (0x0017)
    uint16: 0x0104
Language Base Attr List:
  code_ISO639: 0x656e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "AV Remote" (0x110e)
    Version: 0x0105

Service Name: AVRCP TG
Service Provider: ISSC
Service RecHandle: 0x1000c
Service Class ID List:
  "AV Remote Target" (0x110c)
Protocol Descriptor List:
  "L2CAP" (0x0100)
    PSM: 23
  "AVCTP" (0x0017)
    uint16: 0x0104
Language Base Attr List:
  code_ISO639: 0x656e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "AV Remote" (0x110e)
    Version: 0x0105

HSP, HFP, A2DP, AVRCPをサポートしていることはわかりますが、SPPのサービスが見当たりません。どうやら、出荷時の設定では SPPはイネーブルされていないようで、EEPROM設定を変更してやらなければならないようです。

こんなわけで、次の段階としてはEEPROM設定を変更してみる予定です。しかしながら、ここまでの段階でも、BM20はMFBスイッチとスピーカをつけて電源を与えてやれば、何の設定も無しにそれだけでBluetooth対応スピーカとして使えるということがわかりました。ディフォルトの設定で、何の不自由もなく使えてしまうので、簡単な電子工作ネタとしても手頃ですね。ただし、そのディフォルトの設定というのがわかりにくいが難点でもあります。ディフォルトの設定内容がデータシートやアプリケーションノートに明示されていないのです。

BM20実験基板

2017-08-13 17:51:39 | WT32/BM20
BM20の動作確認のために発注しておいた実験用基板が届きました。今回はElecrowを使って青色基板を指定してみました。5枚で$4.9のコースで、送料込みでも$9.88でしたが、実際には7枚の基板が送られてきました。



基板の回路はBM20の評価ボードであるBM-20-EVBを真似ていますが、まずは必要最低限の動作確認ができればいいので、コネクタや使用部品数を減らして基板サイズも小さくしてあります。
  • 電源の供給とホストとの接続はピンヘッダ経由。
  • ジャックは音声出力用にひとつだけ用意。マイクは基板上に載せてしまうことに。
  • ライン入力は使わないことにして、代わりにブザー用のパターンを用意。
  • NFCタグは使わないことにして、関連部品を省略。
  • DISP SWには秋月で売られていたハーフピッチの4Pを使用。実際には3Pしか使いません。
  • 電源ON/OFFにはMFBだけを使うことにして、スライドSW関連部品を省略。

早速、手持ちの部品を載せてみました。残りがあるつもりだったタクトスイッチがひとつだけしか見つからなかったので、これを電源ON/OFFも兼ねるMFBボタンとして使うことにします。残る5つのスイッチで音量上下や Play/Pause, Fwd/Rev操作ができるのですが、また後で部品箱を漁ってみることにしましょう。ちなみにMFBというのは Multi Function Buttonの略のようです。



続いて、実際に動作を確認するために、電源とスピーカーを接続。 100均のアンプ無しスピーカーなので、音量は出ませんが動作確認にはこれでも十分です。もちろん、イヤホンをつなげれば十分な音量で鳴ります。



電源はFT232ボードを介してUSBからの5VをBM20のADP_INに供給しています。BM20にはLiPo電池の充電機能も備わっており、ヘッダピンには電池をつなぐBAT_IN端子も出してありますが、電池をつながなくても動いてくれるので、オープンのままで動作確認を始めることにします。

BM20

2017-08-11 16:17:24 | WT32/BM20
6年ほど前にWT32で随分と遊びましたが、久しぶりにBluetoothモジュールで遊んでみようと思い、音声対応のClassicのモジュールを探してみました。世の中はIoT流行りなのでBLEのモジュールは色々と出回っていますし、次から次へと新しい製品が出てきます。その反面、HFP, A2DP, SPPに対応した製品はあまり目立たなくなったような気がします。以前は秋月でもRN-52を扱っていたと思うのですが、今は取り扱っていないようです(マルツにはあるようです)。ESP32でもA2DPやAVRCPが使えるようになってきているようですが、こちらは皆さん手を出すでしょうし。他に何か面白そうなものはないかと思って探しいたところ、MicrochipがBM20というモジュールを出しているのを見つけたので、試しにDigikeyから購入してみました。Mouserにも在庫はありましたが、なぜか日本には輸出できないという扱いになっていました。




このBM20はもともは台湾のISSCという会社が製造していたチップを使ったモジュールなのですが、2014年にMicrochipがISSCを買収しています。BM20以外にも、I2S対応したBM23とかBLE対応したBM6xシリーズとかもあるのですが、今回は機能的にはベーシックであり安く買える(1枚1103円)BM20を購入してみました。これらのモジュールですが、Microchipが買収してくれたおかげて、日本向けにもちゃんと技適を取ってくれています。BM20も2年前に取得済みなのですが、上の写真に示すようにモジュールの上面には技適マークの刻印がありません。しかし、裏側を確認すると....




FCC IDも技適番号もこちら側にはシルクで入っています。オイオイ、裏側にシルクがあっても実装したら、見えねぇじゃねーか!

技術基準ではラベルを表示する必要があることが明記されていますが、そのことはMicrochipもちゃんと承知しているので、データシートには「このモジュールを装置に組み込む者がラベルを作成するように」と断り書きがしてあります。

さてこのモジュールですが、もともと台湾メーカの品ということもあって、資料が充実しているとは言い難いところがあります。しかし、とりあえず電源といくつかのスイッチとアンプ、スピーカを繋げるだけでもバカチョンで Bluetoothスピーカが組み立てられるようです。さらに UARTでマイコンとつないで制御することもできるようなのですが、丁寧な解説はほとんど無いので、実際に使ってみながら理解する必要がありそうです。謎解きしながらしばらく楽しめそうです。

モジュールを実装するための実験基板もすでに発注してあり、もうすぐ届く予定です。基板が届き次第、動作実験を開始するつもりです。

WT32をつなげる -- build764からbuild992へ

2016-03-14 22:21:06 | WT32/BM20
SLICからの音声をSAIを使って送信できない問題で時間を潰してしまいました。

SAIの設定を変えてみても無音状態のままだったので、問題の切り分けのために試験データを使ってのSAIからの送信動作を確認してみることにしました。ロジアナで確認すると、用意したデータが正しくI2Sの信号となってWT32に送られているものの電話の通信相手には送られないことがわかったので、問題はSTM32のソフトではなくWT32側にあることが判明。WT32の設定はPS Key設定を確認してみたものの問題はなし。すがる思いでBluegigaのForumを探してみたら次のようなスレッドを発見。。

https://bluegiga.zendesk.com/entries/41721266-Connecting-two-WT-32-via-I2S

iWRAP5.0.2を使っているのですが、これまで使っていたイメージは build764でしたので、このビルドにはオーディオ信号のデジタル入力に問題があることになります。確認してみると現在は iWRAP 5.0.2のリーリースイメージは build992になっています。バージョンが同じでも、バグ修正されたビルドが出ていたんですね。気が付きませんでした。

iWRAPを更新してみると、無事双方向で音声がとおり、通話できるようになりました。

HFP1.6の動きを確認してみる

2016-02-11 09:21:34 | WT32/BM20
ずっと記事にしようと思っていた事を思い出したので、遅まきながら記録として残しておくことにします。

昨年、スマホを更新してAndroid 5.0.2になりました。HFP1.6に対応しているので、WT32と接続しての動作確認です。
WT32とHFP接続してから、スマホから117番へ発信してみました。



呼がつながると、CODECとしてMSBCが選択されていることが確認できます。WT32のCODEC設定は、I2Sマスターとしてあるので、その出力信号を確認してました。




フレーム同期信号が16KHzになっていることがわかります。HFP 1.5まではMSBCがなかったのでフレーム同期は8KHzと決まっていたのですが、HFP 1.6を使うとつなぐ相手端末や実際の呼によって8KHzあるいは16KHzのどちらになるかが動的に決定されることになるようです。WT32ではMSBCを使わないようにも設定できますので、その場合には8KHz固定で動作させることもできます。

新たな拡張ボード

2013-12-19 00:06:00 | WT32/BM20
新しいネタを探していたところ、ちょうど面白そうなものが見つかったので、その準備作業としてWCA-009実験ボード用に新たな拡張ボードを製作。



液晶を下側に配置し、キーパッドは無し。新たなヘッダピンを立ててありますが、これは手配中のボードを接続するためのものです。先日、Digikeyでポチったところなので、あさってくらいに届く予定。詳しくは、ボードが届いてから記することとしたいと思います。

notificationとbrowsing

2013-12-04 10:38:58 | WT32/BM20
久しぶりにBluetoothネタです。

最近はしばしばスマート・ウォッチが話題になりますが、その典型的な使い方がMail, SMS, SNSのメッセージが読み取れるという通知機能の利用です。近頃は低電力化のためにBLEのシングルモードを使った製品が多いようですが、Bluetooth ClassicではもともとMAP (Message Access Profile)が定義されているので、カーナビのような用途では引き続きMAPが利用される場面もあるのではないでしょうか。

MAPではメッセージを保持するサーバ側をMSE, メッセージにアクセスするクライアント側をMCEと呼びますがWT32がサポートしているのはMCE側です。MAPの重要な機能として、次の2種類の機能があります。
  1. Message Notification
    MSEが新着のメッセージが届いたことをMCEに通知する機能です。
  2. Message Browsing
    MCEがMSEのメッセージを閲覧する機能です。

そしてMAPの標準仕様としては、この2つのうちのどちらかをサポートすることが必須とされています。言い方を変えれば、片方だけサポートすれば、MAPに準拠していると言えるということです。では、WT32ではどうなっているかと言うと、Browsingの方しかサポートされていません。そのため、残念ながら携帯に新着SMSが届いても通知をWT32に飛ばすことはできません。

さて、このMAP機能ですがiPhoneだけでなくAndroidでも使えていたのですが、Android 4.2でBluetoothの周りがBlueZからBluedroidに切り替わったことも影響してか、端末によっては4.1から4.2にアップデートしたらMAPが使えなくなったという悲鳴があがっていたようです。BluedroidではBluetooth部分のHALを定義しているらしく、BlueZの方では改めてこのHALに対応したリリースを出しているようです。

iWRAP5.0.2

2013-09-18 11:36:11 | WT32/BM20
近頃、BluegigaからPCN (Product Change Notification)がメールで送られてくるようになりました。昨日の朝、PCNで知ったのはiWRAP5.0.2がリリースされたこと。これまでは、時折サポートサイトを覗きにいってはチェックしていたので、こうして知らせてくれるのは、大変ありがたいことです。

現行のリリースであるiWRAP5.0.1からおよそ1年を経ての5.0.2のリリースとなります。基本的にはこれまでのバグ・フィックスです。マニュアルを読むと、わたしがレポートしてあったバグ2点の修正も含まれていました。個人的には今後は、5.0.2を使っていくつもりです。Bluegigaからの出荷は11月11日以降とのことなので、わたしの売店でも当面は5.0.1を入れて出荷するつもりです。

いくつかの機能追加もなされています。ちょっと興味あるのはSET CONTROL AUDIOによるオーディオインタフェースの設定でしょうか。これまでは入力/出力は同じインタフェースが選択されていましたが、5.0.2では別の種類を選択できるようになりました。マイク入力はI2Sで音声出力は内蔵CODECとか指定できるようになります。

音声パス切り替え

2013-07-02 22:39:46 | WT32/BM20
Bluetoothヘッドセットの利用経験の無い方にBlueHANDをデモすると、しばしば見られる行動がひとつあります。それは、「Bluetooth接続したので、こちらのBlueHANDで着信応答や、発信ができます。」と説明しても、実際に着信が入ると先に鳴動する携帯やスマホので思わず応答してしまうという条件反射的とも言える行動です。

もちろん、携帯側でも応答はできます。ところが、次の段階で困った状況が発生します。「もしもし?」と話しかけても相手の声は聞こえません。なぜなら、相手側の音声は、HFPで接続されたヘッドセット側に流れており、携帯側では音声再生されないからです。こういう時に、どう対処すればいいかというと、慌てずに音声パスをBluetoothハンドセット側から携帯側に切り替えればいいのです。通話中の操作メニューや画面に切り替え法が用意されているハズです。例えば、Galaxy S3では下図のように「ヘッドセット」のタッチボタンが表示されています。図の状態はボタン表示が緑色になっており、ヘッドセット側が有効になっていることを示しています。ボタンを押せば、音声は端末側に切り替わり、ボタン表示はグレーに変化します。



上記は携帯端末側での操作でしたが、音声パス切り替えはヘッドセットデバイス側でも操作可能であるべきです。実際、HFPの仕様書では必須項目となっていますので、この機能をもたないヘッドセットがあるとしたら、それはHFPに準拠していないことになります。それでは、これらの機能をWT32を使って実現するには、具体的にはどのようにすれば良いでしょうか?

まず、HF側であるWT32が音声パスをもっている状態から, AGである携帯側に音声パスを転送する手順ですが、これは極めて単純明快です。音声パスである、SCOリンクをクローズすればいいだけです。

closeコマンドでクローズしたのは、音声パスであるSCOコネクションでありHFPリンクではないので、HFP接続や呼が切れてしまうことはありません。次に、WT32側に切り戻す方法ですが、こちらは

というようにsco openコマンドを用います。ここで引数として指定している番号はHFPのリンク番号になります。このコマンドは、AG側に対して音声パスを開くように要求を出し、その結果としてAG側からSCOリンクが張られてきます。

SCO OPENコマンドについては、iWRAPのマニュアルにもちゃんと記載されているのですが、どのような局面で使われるかという説明に欠けています。わたしは、音声パスを切り替えるにはどうすれば良いかを考えてみて、SCO OPENコマンドが使えるのではないかと思いつきました。最初から、マニュアルで上記のような例を明示してもらえれば、わかりやすいのですが。。