Shiki’s Weblog

新キーボード プロジェクト? - Bluetooth版NISSEの実験

2014/07/13 #新キーボードプロジェクト

前回から2ヶ月半ぶりのブログです。おかげさまで新キーボードNISSEも少しずつ出荷が続いています。
さて、新キーボード プロジェクトをはじめてから、ときどきBluetooth版の予定を聞かれることがありました。NISSEはエルゴノミックキーボードとしては小さめとは言え、毎日持ち歩く大きさでもないので少し意外だったのですが、作業スタイルがノートパソコンから、タブレットとキーボードという組み合わせに変わってきているということもあるのかもしれませんね。

Bluetooth版のNISSEの試作品と8inchタブレットBluetooth版のNISSEの試作品と8inchタブレット

というわけで、Google+にときどき書き込んでいたように、Bluetooth版の実現方法を調べたりしていたのですが、ひとまず試作品が動くところまできたので、今回はそれについてまとめておきます。

LinuxのパソコンからBluetooth版NISSEを接続するところLinuxのパソコンからBluetooth版NISSEを接続するところ

BluetoothモジュールRN42XVP

日本国内でBluetooth機器を作る場合は、技適マークが付いている通信モジュールを組み込んで作成するか、独自に電波法が定める技術基準に機器が適合していることの認定を受けないといけません。後者は相当な量産品でもないとコスト的に合わないので、今回は前者で進めています。
技適マーク付きのモジュールを利用する場合、選択肢はいまのところそれほど多くないようで、

  1. Microchip社のBluetooth通信モジュールRN42XVPとマイコンをUARTで繋いで作る、あるいは、
  2. USBホストコントローラ内蔵のマイコンとUSBのBluetoothアダプタ(ドングル)を繋いで作る、

の2択くらいが簡単に入手して試すことができそうな様子でした。
今回の試作品では、USB版のNISSEで使っているマイコンPIC18F4550にはUSBホストコントローラ機能がないということもあって、RN42XVPを使ってみることにしました。

ブレッドボードで実験中(左側の赤い基板がRN42XVP)ブレッドボードで実験中(左側の赤い基板がRN42XVP)

上の写真はブレッドボード上に実際にRN42とPIC18F4550をつないで組んでみた様子です。RN42を使ってBluetoothキーボードを作る場合は、RN42をHIDキーボードプロファイルを使うように一度設定して、あとはUSBで送信するときと同じ形式でキースキャンコードをマイコンからRN42に向けてUART経由で送信するだけで良いのでわりと簡単です。

実験用基板

RN42の基本的な動作を確認できたところで実際に基板に起こしてみました。

RN42XVPを組み込めるようにしたNISSEの基板RN42XVPを組み込めるようにしたNISSEの基板

今回はBluetooth用のNISSEのファームウェアの開発がある程度進まないと電池の持ちが非常に悪いことが予想できたので、電池の代わりにLiPoバッテリーを組み込んでUSBから充電できるようにしてみました。

充電中のNISSE充電中のNISSE

充電中は背面の制御基板に付いているLEDが点灯します(充電が終わると消灯します)。背面のLEDの左側に電源スイッチが付いています。
参考までに今回の基板の回路図を載せておきます。キーマトリクスやLEDの部分はUSB版のNISSEと共通です(ピン配置はリビジョンによって変わっています)。

制御基板の回路図制御基板の回路図

制御基板はUSB版のNISSEと兼用できるようにした関係で、LiPoの3.7VからPIC18F4550用に5Vに昇圧したり、RN42XVP用にそれを3.3Vに変換したりと、ちょっと大げさなことになっています。
注意: LiPoバッテリーは必ず保護回路を内蔵したものを使ってください。LiPoバッテリーの取り扱いにはくれぐれもご注意を。

RN42XVPまわりの回路図RN42XVPまわりの回路図

RN42XVPまわりでは、GPIO4は工場出荷状態へのリセット用、GPIO5がBluetoothの通信状態のモニターLED用になります(試作品ではPICのI/Oピンに接続してファームウェア側で未接続時にキーボード本体の青色のLEDが点滅するようにしています)。

ファームウェア

ファームウェアについてもGitHubに公開してあります(firmware/bluetooth/MPLAB.XをMPLAB X IDEで開いてビルドできます)。いまのところは単純にBluetoothで動くというところまでの実装で、少電力化の工夫などが入っていません。そのため、実際のバッテリーの持ちは接続するLiPoバッテリーの容量にもよりますが接続状態で数時間から長くても10時間はもたないような感じです。いまのところ毎晩充電しておいて使うような感じですね。
USB版と利用時に異なるのは、FN-F1を押した時の表示が、

esrille nisse bt
rev. 3
ver. 0.11
copyright 2013, 2014 esrille inc.
f2 104a
f3 us
f4 tron
f5 d12
f6 c
f7 goog
f8 c-c
3.6v

といった具合に変わります。1行目の最後にbtと付いているのがBluetooth版ということになります。それから最後の行にLiPoバッテリーのおよその電圧が表示されます。使っていると充電完了時の4.2v程度からLiPoバッテリー側の過放電防止のリミット2.7v程度まで下がっていきます。
またFN-ESCでBluetoothの接続を強制的に切断できます。
それからRN42でひとつ残念な点が。RN42では、USBのキーコードが0x65より大きなキーを使えないようです。英語104キーボードであればこれで問題ないのですが、日本語キーボードでは、変換(0x8a), Macのかな(0x90)といったキーが使えないので、日本語キーボードを無線化する用途には使えないということになってしまいます。具体的には、RN42が送信しているキーボードのHIDレポートデスクリプタ内で使用するキーのIDの上限値が0x65となってしまっています。マニュアルにはこれを変更するような方法の記載がないのですが、ひょっとして何か方法があったりするでしょうか?

まとめ

というわけで今回はRN42XVPを使ったBluetooth版NISSEの試作品を紹介しました。Bluetoothモジュールを利用する形でBluetoothキーボードのハードウェアを作るのはそれほど困難ではない一方で、電池を長持ちさせるためのファームウェア側の工夫は別にちょっと必要になりそう、という感じです。それからBluetoothモジュール側のファームウェアを修正したい場合どうするのか、という部分も課題かもしれません。
補足: 今回の試作品は当面のファームウェアの開発・実験用に用意したものなので、このまま完成品としてお配りする予定はありません。LiPoバッテリーの扱いなどに慣れている方向けの開発キットという形であれば基板はありますのでお尋ねください。