以前から興味があったのだが、対応機器が高価だったりした事もあり、あまり使う事が なかったが、いろいろわけあってBluetoothを調べているので、メモを残しておきたい と思う。
以前iPhoneとMacをつないで試したときにはXcodeに入っていた、サンプルコードを 使った。iPhoneにはSPPなプロファイルが入っていて、Macから接続すると/dev/tty なデバイスが登録され通信が可能だ。ただしこの機能を使ったアプリはMFiの契約が 必要になり、普通には公開できないようだ。もちろんJailBreakした環境や、adhoc ビルドなどでは試す事はできる。
このMac OS XのサンプルコードはXcode3.2以降入っていない上に、Appleのデベロッパー のサイトにもない。Xcodeの3.1などをインストールしてサルベージするしかない。
10年ほど前に最初に買ったMac mini G4用のBluetooth 1.1のUSBドングルは一万円近く したような気がするが2014/3現在、最新の4.0 LEでも1000円くらいで購入できるように なった。
Appleは10.3(?)位でIOBluetooth.frameworkとIOBluetoothUI.frameworkというフレーム ワークでBluetoothをサポートしていたが、10.7でこのフレームワークのラッパークラス のCoreBluetoothというフレームワークを提供して、BLEのサポートを提供している。
IOKitなどはオープンソースになっているが、Bluetooth関係はオープンソースにはなっ ていないようだ。AppleのBlueoothサポートはBrodcomとCSRのチップを対象にしている ようだ。最初にG4 mini用に買ったApple公式USBモジュールはCSRの物だったがAirには Brodcomのモジュールが入っている。
ドングルが格安で入手できるようになったのでUSBホスト機能がある PIC32MXでBluetooth 機器を作ろうとしているのだが、なかなかうまくいかない。(2014/03/03)
PIC24(16bit)とPIC32(32bit)はCPUアーキテクチャは 全く違うが、IO回りは同じようだ。YTS | ? | 北海道大学の辻見裕史さんが作られたコードです。Microchipsの "Host - MCHPUSB - Generic Driver Demo"にBTなコードを追加したようです。 LEのコードもあります。物理の先生が実験機器の接続用に作ったコードのようで、 簡易な実装です。 |
SmallTooth | Apache License 2.0 | PIC32用に作られたスタックです。Legacy BTのコードです。オリジナルは512 の大きなFlashで作られていたが、PIC32MX220F032Bで使えるようにして ここに置いてみた。 |
lwBT | ? | PIC32用ではありませんが移植されています。Legacy BTのコードです。 もともとdynawaさんが作ったコードで、リンクはforkしたコードのようです。 いろいろなところにforkしたコードがあるようです。 |
btstack | dual license | マイコン系はTIの16ビットマイコンのMSP430をターゲットにしていますが、LEの コードを含んでいます。libusbでもビルドできMac OS XやFreeBSDでも利用できます。 smalltoothを参考に PIC32MX でも使えるようにしてみた。作っているのはスイスの大学のコンピュータサイエンスの 先生のよう。 |
btnode | ? | AVRのコードですがオープンソースのようです。btstackと同じ人がつくってる。 |
以前ハードオフで入手したInitiumという韓国の会社のBT RS232Cの変換をMacからSPP で接続して、さるのこしかけでオシロスコープのデータを 取得できるように設定してみた。この会社は買収されたのか、現在は Sena Technologiesが後継の製品を販売しているようだ。さるのこしかけのコードは、 上記のサンプルコードをベースにしている。
AT+BTINFO? (000000000000,PSDv3b-000000,MODE0,STANDBY,0,0,HWFC) AT+BTMODE,3 AT+BTSCAN AT+UARTCONFIG,38400,N,1,0 AT+BTINFO? (000000000000,PSDv3b-000000,MODE3,PENDING,0,0,NoFC) ATS10=0 ATS11=0 ATS14=1 ??? AT&V S0: 0; S1: 0; S2: 0; S3: 0; S4: 1; S5: 0; S6: 0; S7: 0; S8: 0; S9: 0; S10: 0; S1 1: 0; S12: 0; S13: 0; S14: 0; S15: 0; S16: 3; S17: 0; S18: 1; S19: 3; S20: 0; S2 1: 0; S22: 0; S23: 0; S24: 10; S25: 0; S26: 0; S27: 0; S28: 43; S29: 70; S30: 30 0; S31: 300; S32: 600; S33: 30; S34: 5; S35: 157; S36: 4353; S37: 32000; S38: 27 0; S39: 2048; S40: 36; S41: 2048; S42: 36; S43: 001F00; S44: 000000; S45: 000000 ; S46: 000000000000
PIC32 + BLEの進展が思わしくないため、リファレンスとしてRedBearLabの Arduino BLEシールド を買ってみた。(2014/04/04)
このシールドにはNordicのnRF8001というチップが使われている。この チップはセントラルにはなれず、ペリフェラルのみのサポートになる。BLEのみの サポートで、レガシーなBTとは通信できない。Arduinoからの制御は Proprietary Application Controller Interface(ACI)と呼ばれるインターフェースで おこなわれていて、ライブラリコードが用意されている。GATTの処理もこのライブラリ とACIでおこなわれ、デバイスのサービスの定義はWindowsのツール(nRFgo Studio)を 使いXMLファイルを作成して、これをコマンドでCヘッダーに変換して利用している。
ライブラリではPCやiPhoneとArudinoの制御はFirmataというライブラリの仕様を使って いる。制御用のiPhoneアプリもAppStoreにあり以下のような制御が可能だ。
NordicにはnRF51822というBLEチップもあって、こちらはセントラルにもなれて、iOS7で サーポトされたANCSのデバイスが作れそうだが、入手方法が見当たらない。
RedBearLabにはminiというモジュールもあって、こちらはTIのCC2540というチップを 使っている。最初はこちら買うつもりだったのだが、シールドの方が安かったので シールドにした。CC2540には8051というサイプレスのEZ-USBなどでも使われている Intelの古典的マイコンチップが搭載されていて、フラッシュも128Kあり、いろいろ 出来そうだ。 RedBearLabのモジュールは最初からフラッシュにプログラムが書き込まれていて、外部 からコントロールできるようになっている。フラッシュに書き込まれているファームの ソースはオープンソースなっているがTIの開発キットが有料との情報があり、深みに はまりそうなのでとりあえず手は出さないつもりだ。8051なのでSDCCが使えないの かな?
これらのRedBearLabのモジュールは両方とも秋葉原の千石電商で入手可能だが、技適 を通していないので、あまり大ピラに使えない。
とりあえずLegacy BTのオープンソーススタックsmalltoothをPIC32MX220F032Bで使える ようにしてGitHubに置いて みた。smalltoothはPIC32MX795F512Lを使って実装されたようだが、mips16 インストラクションを使うと32Kにも収まっています。Microchipの無料のXC32では mips16のインストラクションが吐けないので、 Pinguinoのgccを利用してmakeでビルドするようにしました。このページの上の方 にもあるRFCOMM_Open_SPP_Exampleを利用してMac OSと通信できた。当初動かな かったのだがデバッグライトを入れると動くようになったので、Delayをいろいろ入れて みた。またl2capのpingが実装されていないようだった。
bash-3.2$ mips-elf-size main32.elf text data bss dec hex filename 24864 2112 4192 31168 79c0 main32.elf
btstackはlibusbでも処理できるようなので、ダウンロードしてビルドして試したところ うまくいった。内蔵のBTモジュールはOSのkextが握っているので利用できないがたまたま 購入してあったBroadcomのモジュールでビルドしてみたところancs_clientでiOS7からの 通知を受け取る事ができた。btstackのページには内蔵のBTを使う場合はkextをunload しろと書いてあるが、kext is in use or retained (cannot unload).でunloadできな い。依存があるのでガッサリunloadしないとダメなんだと思うがBroadcomのモジュール が使えたので深追いしていない。
FreeBSDでbtstackでビルドしたバイナリを試すには、事前にdevdをkillしてから ドングルを接続して、実行する必要がある。そうしないとkldが握ってしまって モジュールへアクセスできない。またUSBアクセスはroot権限が必要なのでsudo で実行する。
三連休で時間があったので、とりあえずBTstackのANCSのサンプルコードををPIC32MX で使えるようにしてみた。ソースを添付してGoogle codeのIssuesに 書き込んで おいた。 ビルド環境を作る事と、Microchipのusbhostとbtstackのhciをつなぐコードを書いた。 ビルド環境はsmalltoothでやったのと同じようにPinuinoのgccをを使うようにした。 PIC32MX250F128Bで試していたが64Kでも入るようだ。 (2014/07/21)
bash-3.2$ mips-elf-size main32.elf text data bss dec hex filename 44108 2184 5236 51528 c948 main32.elf
PIC32ではusbhostというスタックがMicrochipから提供されていて、このコードは usb_config.cに定義された、モジュールを処理するように作られている。Classや VID/PIDがマッチする場合は、usbClientDrvTableの最初のエントリーのInit ファンクションを呼び出す。メインループでUSBHostTasks()とUSBエンドポイントの 読み込みを実行する。読み込みが終わるとusbClientDrvTableの二つ目に設定された ファンクションが呼び出されるのでエンドポイント毎の処理を実行する。
iOS7からancsで送られてくるメッセージは以下のような感じになる。 ANCSの解説のページ。
AppIdentifier: com.apple.mobilemail IDTitle: Mori Hiroki IDSubtitle: Re: Zzz IDMessage: ----- Original Message ----- Fro IDMessageSize: 158 IDDate: 20140721T121807
BTstackでレガシーBTのサンプルも試してみたが動かない。。。ちょっと調べたら ドングルにリセットを送っても、レスポンスが返ってこないような感じだった。 レガシーBTはsmalltoothが動いているので、とくに必要ではないのだが時間が出来たら もう一度確認してみたい。
CSRのチップは3.3Vで動作しているようで、USBドングルは5Vから3.3Vのレギュレータが 入っているようだ。低損失のレギュレータであれば、3.3Vで駆動できる可能性があるが 手元のモジュールは3.3Vも問題なく動作するようだった。
久しぶりにANCSを試してみたら、動かなくなっていて、いろいろ確認したらiOS(7.1.1) を再起動したらまた動くようになった。なんだかな。。。
OpenHackDay3でV-Sidoというロボットをいじったのだが、これのインターフェースに SBDBT(PIC24 3.3V)を使ったSPPが使われていて、Macから直接コントロールしようと していろいろいじってなかなかうまくいかず夜どうし調べていた。明け方にようやく 原因が判明た。IOBluetoothRFCOMMChannelのsetSerialParametersで115200を設定しな ければいけなかった。設定しないと文字化けを起こしていた。接続先からボーレート の設定が出来る事は知らなかった。
SPPはMacOS Xの環境設定で認識させて/dev/cu*としてBSDのシステムコールで利用する 事も可能だ。
Aitendoでいろいろなモジュールが安く販売されていて、試しにCSRのチップを使った モジュールを購入してみた。このモジュールもモデムのようにATコマンドセットを持 っていて直接の通信以外にコマンドモードが存在する。ダム端として使う場合この コマンドモードを完全にオフにする必要があり、事前に設定しておくか、接続機器 から設定するかの必要がある。ちょっと面倒だ。
上のANCSデバイスをiOS 8.2で試したら動かなかった。8.3にしたらちょっと挙動が 変わったような気がしたが、使えないままだ。。。
iOS 8.0.2では動くようだ。WATCH向けの修正が影響しているのかもしてない。 なんともだ。
勘違いしていたようで、ArduinoのRedBareのモジュールはANCSに出来るようである。 avr_nrf_ancs_library というライブラリコードがあった。エラーがあったので、ちょっといじって焼いてみたところ やはりペアリングできない。Exampleのancs_lcdはLeonardoに焼くとシリアルが見えなく なるのでちょっとやっかいだ。
MacでMagic Mouseのコマンドラインでペアリングを行う方法を調べてみたのだが、 接続を直接おこなう方法は無いが、BlueToothのoff/onを行うと同じような効果が ありそれができるblueutilという簡単なプログラムが見つかった。
こんなBLEなソースがあった。
MSP430なファームを作ってBSLで放り込んで使えるようにしてみた。