HHKBを無線化したい!そしてArduino×2とXBee×2を用意すれば無線化できるかも!と思ったのが最初の構想。
しかし情報漏洩対策が叫ばれる昨今、仕事場でUSBハブに怪しげなデバイスが刺さってたら疑われるだろうと、Bluetoothによる無線キーボードの実装方法について調査したのですが、大変ハードルが高くてグワーッ!
調べたこと
- 無免許でBluetoothやZigBee等の無線モジュールを使うなら、技適(技術適合証明)*1取得済モジュールが必須。技適マークのないモジュールを使うと電波法違反に
なるなる可能性がある *2。 - 技適マークなしのモジュールの輸入や販売はOKで使用はNGという扱い*3なので、国内のお店で売ってるモジュールでも油断できない。
- 無免許&技適マークなしだと相当小さな電力でしか通信できない*4。BluetoothもZigBeeも無理っぽいけど詳しい調査はしてない。
- 技適のないモジュールも、免許を持っている人なら無線局の開設手続きをすれば使えるけど、その場合も機器の設計を添えて申請が必要*5。電波強度の測定なんかも必要みたい。事実上、個人レベルでは技適取得済モジュールを使う他ない。
- Bluetoothの通信速度は方向対称・非対称の場合で異なり、対称の場合は最大1.3Mbps程度*6。USBの信号を載せるならバッファリングとか要りそう。
- Bluetoothにはプロファイルというのがあって、送信側・受信側が同じプロファイルで話さないといけない。対応してるプロファイルはモジュール毎・受信機毎に違う。
- Bluetoothモジュール自体に信号を与えるインタフェースもモジュール毎に違う。UARTだったり、USBだったり。
- Bluetoothデバイスは使う前にペアリングが必要。OS上で動作するドライバソフトウェがペアリングを行う受信機と、ハードウェア単体でペアリングできる受信機とがある。
- BIOS操作や、シンクライアントで使うとかなら、ハードウェア単体でペアリングできる受信機が必要。ロジクール RCBT-MX*7やBelkin F8T016*8がある。ただし前者はBIOS画面でFnキーが動作しない模様で、シンクライアントでも怪しいかもと思っている*9。
- ロジクール RCBT-MXは、ハードウェアペアリングの場合HIDプロファイルにのみ対応の模様。F8T016が対応しているプロファイルの情報は見つからなかった……
- Arduino等でBluetooth通信を容易に行えるようにしたモジュールもある*10。それを使わないならBluetoothのプロトコルスタック*11を実装する必要がある。
- USBなど、1.5Mbps程度の通信を行うならクロックジェネレータは水晶を使ったほうがよい。AVR内蔵のクロックでは精度不足。セラロックの場合は選別が必要*12。通信速度を抑えれば大丈夫?
- 技適取得済みBluetoothモジュールとしてはBT-MOD100R*13があるが、対応しているプロファイルはSPPのみなのでRCBT-MXでは使用できない。F8T016がSPPに対応しているかは謎。
- 技適取得済みBluetoothモジュールとして他にもSurfGridのBlack Shield*14があるが、これもAndroid向けのモジュールなのでプロファイルはSPP(とGAP)にしか対応していない。
- 技適を通っており、かつHIDプロファイルに対応しているBluetoothモジュールとしてはBroadcom BC2045*15を搭載したJ27H002*16が手に入れやすいが、これはデータシートがネット上で見つからない*17。また、インタフェースがUSBなので、このモジュールとは別にArduinoからUSBを喋る用のモジュールなりが要る。Teensy*18をArduino化したりすれば良いのかな?
- Blugiga WT-12はデータシートが簡単に手に入るらしく*19、海外ではその点が好評みたい。
- Arduinoで使えそうなBluetoothモジュールがまとめられているページを見つけた*20。
作例など
- ArduinoにBluetoothモジュールを載っけたArduino BT*21というものもあるが、これは技適を通っていない。BluetoothモジュールはBluegiga WT-11を積んでいる。
- Android向けにHHKBをBluetooth化している例*22もあるが、これはBT-MOD100Rを使ってSPPプロファイルで実現している。
- HHKBをHIDプロファイルでBluetooth化している例*23もあるが、ここで使用しているBluetoothモジュール(Bluegiga WT-12)は技適を通っていない。
- Arduinoを使ってBluetooth HIDデバイスを作成するためのHOW TO*24もあるが、ここで使用しているBluetoothモジュール(BlueSMiRF HID*25)も技適を通っていない。
- Bluetoothキーボードを実現するためのチップとしてはBroadcom BC2042*26がある。
調査の際の注意事項
"Arduino Bluetooth"などでググると、Bluetoothレシーバ(ホスト側のこと。ドングルなど)を使ったBluetoothホストコントローラの使い方がよく引っかかる。作りたいのはBluetoothトランスミッタ(クライアント側のこと。Bluetoothデバイス)なので、作例調査の際は何を作っているのか要注意。例えば、Broadcom BCM2045はWiiのマザーボード側に搭載されている*30チップで、これはレシーバ用チップ。トランスミッタ用のチップは前述したBCM2042で、これはWiiのコントローラ側に搭載されている*31。「すzのAVR研究」で安価なWii用Bluetoothモジュールとして紹介されている*32のはレシーバの方。- 船田戦闘機氏のブログでも*33、Bluetoothクライアント用モジュールに関しては苦戦しているみたい。
。また、ハンドシェイクの際にどちらがマスタ(PC側)でどちらがスレーブ(周辺機器側)か決めるらしい*35。
プロトコルスタックについて
- Bluetoothにはプロトコルスタックというのがある。一番下がHCIという規格で、これはBluetoothのチップとやりとりする手順の規格。HCI-USBやHCI-UARTなどがある。
- HCIの上には、ハンドシェイクをしたり、プロファイル情報を提供したり、プロファイル通りのデバイスとして振舞ったりといったプロトコルが載っかってくる。
- 高価なモジュールには「プロファイル通りのデバイスとして振る舞う」あたりのプロトコルスタックが実装されているけれど、安いUSBのBluetoothドングルにはそれがない(HCIくらいしか実装されていない)ため、OS上でデバイスドライバがそれより上のプロトコルを喋る役割をしている。
- 当初はBluetoothスタックを搭載したモジュールばかりを探してたから気づかなかったが、HCI以下のレイヤだけを実装したドングルを使って、上位レイヤをソフトウェアで実装すれば、理論上は何でもできるのでは?と考えている(上のBluetooth+PICマイコンの例みたいに)。
ArduinoにおけるUSB
- ArduinoをUSBホスト*39として動かすには、通常USB Host Shield*40というものを使う。でっかいArduino用。
- USB Host Shieldを使えば、Arduinoを簡単にUSBホストにできるみたい。でも結構お値段が張る……
- Arduino Leonard*43に載る石(ATMega32U4)には、USB端子を操作するための機能も付いているらしい。ならUSB-HCIもイケるかな?と調べたところ、V-USB*44やLUFA*45などを使えばArduinoにUSBを喋らせることができそう。
- つまり、USB Host Shieldがやってくれる処理をソフトウェアで代替するということだろうね(処理は重くなるだろうけど)
- V-USBは基本的にUSBデバイスとして動くためのプロトコルスタックで、つまりATMega32U4にハードウェア的に載っているのと同じ機能なんではないかと理解している。
- LUFAはUSBのデバイスにもホストにもなれるみたい。LUFAの作者がAVRマイコンにBluetoothドングルを挿して動作させているのを発見*46。
- 結局LUFAがやってくれる処理と、ATMega32U4が提供するUSB制御機能の関係はどうなるんだろう?
LUFA, V-USB, USB Host Shield, ADKの関係
- LUFAはAVRに内蔵されたUSB制御機能を使用してUSBデバイスを実現する。
- V-USBはAVRにUSB制御機能が内蔵されていなくても、割り込み用の信号線を利用してUSBプロトコルを喋らせる(つまり、USB制御機能をソフトウェアで実装する)プロジェクト。
- USB Host Shieldでは、AVRとは別のチップにUSBを喋らせる。使っている石はMAX3421E*49。
Harpyについて
キーボード内部の仕組みについて
Bluetoothについて
今後の予定?
- Circuits@Homeの"Bluetooth code for Arduino USB Host"*63を読む。
- USBドングルを入手する。"Bluetooth code for Arduino USB Host"で使っているものか、「Bluetoothドングルを使った無線通信実験」*65で使っているものがよい。
- Harpy Nano*66が欲しい。
→ 続きを書きました(id:satob:20120603)
*1:http://ja.wikipedia.org/wiki/%E6%8A%80%E8%A1%93%E5%9F%BA%E6%BA%96%E9%81%A9%E5%90%88%E8%A8%BC%E6%98%8E
*2:http://www.tele.soumu.go.jp/j/adm/monitoring/summary/qa/giteki_mark/
*3:http://blog.livedoor.jp/spiritual_area/archives/51727060.html
*4:http://www.tele.soumu.go.jp/j/ref/material/rule/
*5:http://2chnull.info/r/radio/1273029907/226-226
*7:http://store.logicool.co.jp/lcs/catalog/product_info.php?cPath=67_221&products_id=2000898
*8:http://www.belkin.com/IWCatProductPage.process?Product_Id=398674
*9:ただしこの件については、(1)Fnキーが効かないとそもそもF2とかでBIOS画面に入れないんじゃ? (2)職場のシンクライアントでBluetoothキーボードを使っている先輩がRCBT-MXを使っているっぽい、の2点から心配しなくて良いかもと思っている
*10:http://www.kobakant.at/DIY/?p=3310
*11:http://en.wikipedia.org/wiki/Bluetooth_stack#Embedded_implementations
*12:http://www.geocities.jp/arduino_diecimila/obaka/project-5/
*13:http://park11.wakwak.com/~microtechnica/cgi-bin/goodslist.cgi?mode=view_detail&genre_id=00000028&goods_id=00000001
*14:http://www.junglejapan.com/products/surfgrid/
*15:http://ja.broadcom.com/products/Bluetooth/Bluetooth-RF-Silicon-and-Software-Solutions/BCM2045
*16:http://suz-avr.sblo.jp/article/39493974.html
*17:聞いた所ではBroadcomは製品のデータシートの無料公開はしていないらしい
*18:http://www.pjrc.com/teensy/
*19:http://d.hatena.ne.jp/ramencozo/20110327/1301203353
*20:http://side2.jp/2010/01/bluetooth-module/
*21:http://arduino.cc/en/Main/ArduinoBoardBluetooth
*22:http://blog.livedoor.jp/jun_dime/archives/51548297.html
*23:http://geekhack.org/showwiki.php?title=Island:20851
*24:http://www.kobakant.at/DIY/?p=3310
*25:http://www.sparkfun.com/products/10938
*26:http://ja.broadcom.com/products/Bluetooth/Bluetooth-RF-Silicon-and-Software-Solutions/BCM2042
*27:http://www.bluepacket.net/BluePacket/solutions/solutions.aspx
*28:http://www.wayneandlayne.com/blog/2010/05/28/bluetooth-keyboard-module-part-1/
*29:http://www.keyglove.net/2011/03/15/interfacing-with-a-bcm2042-bp20422-bluetooth-hid-module/
*30:http://wiire.org/Wii/console/bluetooth_card
*31:http://wiire.org/Wii/wiimote
*32:http://suz-avr.sblo.jp/article/39493974.html
*33:http://www.nnar.org/archives/1800
*34:http://mobiquitous.com/device/bluetooth-serial.html
*35:http://www.musenka.com/bluetooth/zeal_manual.html
*36:http://homebrew.jp/show?page=1203
*37:https://sites.google.com/site/csrbluetooth/home
*38:データシートは http://www.datasheetarchive.com/BC417*%20CSR-datasheet.html で見つかる
*39:BluetoothドングルはUSBの周辺機器(スレーブ)だから、Arduinoはマスタとして働く必要がある
*40:http://www.switch-science.com/products/detail.php?product_id=438
*41:http://www.circuitsathome.com/products-page/arduino-shields/usb-host-shield-for-arduino-pro-mini
*42:http://iwatanlab.blogspot.jp/2011/07/arduino-pro-miniadk.html
*43:実際にはダ・ヴィンチ32Uの使用を想定。 http://strawberry-linux.com/support/25005/1187959
*44:http://www.obdev.at/products/vusb/index.html
*45:http://www.fourwalledcubicle.com/LUFA.php
*46:http://fourwalledcubicle.com/blog/2011/09/oh-and-that-robot-thing/
*47:https://code.google.com/p/micropendous/wiki/MicropendousA
*48:http://d.hatena.ne.jp/deb/20110103/1294060194
*49:http://www.sparkfun.com/products/9628
*50:http://japan.maxim-ic.com/datasheet/index.mvp/id/3639
*51:USB Host Shieldの開発元?
*52:http://www.circuitsathome.com/mcu/bluetooth-code-for-arduino-usb-host
*53:http://www.ytsuboi.org/wp/archives/1989
*54:http://www.ytsuboi.org/wp/archives/1989
*55:http://side2.jp/2011/05/try-adk-part1/
*56:https://sites.google.com/a/gclue.jp/android-docs-2009/arduino-unodeadkwo-zi-zuo
*58:http://www.harpyhack.com/#cc-m-product-5644560415
*59:https://groups.google.com/group/harpyhack/browse_thread/thread/3f7484e81712ec3?hl=ja
*60:http://geekhack.org/showwiki.php?title=Island:12047
*61:http://fnya.cocolog-nifty.com/blog/2009/05/bluetooth-d6e8.html
*62:http://robo.mydns.jp/Lecture/index.php?Arduino
*63:http://www.circuitsathome.com/mcu/bluetooth-code-for-arduino-usb-host
*64:https://sites.google.com/site/csrbluetooth/home