m3piをBluetooth keyboardでコントロールしてみました
.
はじめに
m3piをBluetooth keyboardでコントロールするようにしてみました。
mbedのCookbookにリンクされていたPeter Barrettさんの BlueUSBを拝見したところ、USBに接続したBluetoothドングルを使って、キーボードやマウスやWiiリモコンなどのデータを受信して表示できることがわかりました。
これを応用すればすぐできそうです。まずはこれを動かしてみます。
m3piへのUSBコネクタの取り付け
まずは、m3piにUSBコネクタを取り付けます。といってもmbedにUSBコネクタを接続するだけですが。
3piの拡張基板ですが、mbedを実装するとそんなに空きスペースはありません。 とりあえず空いているスペースに手持ちのUSB Aコネクタをハンダ付けしてmbedに接続しました。 もし縦型のUSB Aコネクタが手に入るようであれば、それに付け替えたいと思います。
Bluetoothドングルの動作確認
m3piのUSBコネクタに手持ちのPLANEX(PCI) Bluetooth USBアダプタ BT-MicroEDR2Xを接続しました。 Vccは3piから取っているので、3piの電源をいれるとBluetoothアダプタのLEDが点灯しました。 次にBlueUSBプログラムをmbedに書き込みました。手持ちのBluetoothキーボードとの通信も無事できているようです。
ちなみにBlueUSBの出力情報によると、以下のようにデータが受信されるようです。
Keyboard | Receive data |
---|---|
接続した直後 | A1 03 FF |
数字の"1"を押す | A1 01 00 00 1E 00 00 00 00 00 |
数字の"2"を押す | A1 01 00 00 1F 00 00 00 00 00 |
数字の"3"を押す | A1 01 00 00 20 00 00 00 00 00 |
数字の"4"を押す | A1 01 00 00 21 00 00 00 00 00 |
キーを離す | A1 01 00 00 00 00 00 00 00 00 |
m3piクラスライブラリの組み込み
BlueUSBのTestShell.cppにm3piのライブラリを組み込み、キーボードの値によってm3piに与えるコマンドを決めました。 まずはキーボードを押すと、m3piのLCDにキーコードが表示されるようにして動作確認を行い、その後に実際にモーター制御のコマンドを追加しました。 具体的には以下のようになります。
Keyboard | m3pi function |
---|---|
数字の"1"を押す | m3pi.left(0.1); |
数字の"2"を押す | m3pi.forward(0.1); |
数字の"3"を押す | m3pi.backward(0.1); |
数字の"4"を押す | m3pi.right(0.1); |
キーを離す | m3pi.stop(); |
BlueUSBのオリジナルのTestShell.cppとの差分は以下のようになります。
*** TestShell.cpp.org 2010-12-12 20:48:53.000000000 +0900 --- TestShell.cpp 2010-12-12 20:51:01.000000000 +0900 *************** *** 29,34 **** --- 29,37 ---- #include "Utils.h" #include "USBHost.h" #include "hci.h" + #include "m3pi.h" + + m3pi pi(p8,p9,p10); void printf(const BD_ADDR* addr) { *************** *** 134,139 **** --- 137,199 ---- printf("WII %04X %d %d %d\n",pad,x,y,z); } break; + + case 0x01: // Mini Keyboard + { + int keycode = (d[4]); + printf("Keycode = %02x \n",keycode); + switch(keycode) + { + case 0x00: // key off + { + pi.locate(0,1); + pi.printf("Key OFF"); + pi.stop(); + break; + } + case 0x1e: // "1" + { + pi.locate(0,1); + pi.printf("Key 1 "); + pi.left(0.1); + break; + } + case 0x1f: // "2" + { + pi.locate(0,1); + pi.printf("Key 2 "); + pi.forward(0.1); + break; + } + case 0x20: // "3" + { + pi.locate(0,1); + pi.printf("Key 3 "); + pi.backward(0.1); + break; + } + case 0x21: // "4" + { + pi.locate(0,1); + pi.printf("Key 4 "); + pi.right(0.1); + break; + } + default: + pi.locate(0,1); + pi.printf("Key ???"); + break; + + } + } + break; + case 0x03: // Connected? + { + pi.locate(0,1); + pi.printf("Connect!"); + break; + + } default: printHex(data,len); }
動作確認
動画はYouTubeにアップしましたが、キーボードで思ったようにコントロールできます。 今回は初めてなのでスピードは控えめに0.1ぐらいにしてみました。
まとめ
Bluetoothでの通信を無事行うことができました。 コントローラがキーボードですので、他にもいろんな機能や動きを組み込むことができそうです。
1 comment on m3piをBluetooth keyboardでコントロールしてみました:
Please log in to post comments.
Bluetooth Keyboard(ELECOM TK=FBM023)、ドングル(PLanex BT-Micro3E1X)でBlueUSBを実行しても、キーボードからデータが受信されません。 OnHidControl()は実行されるのですが、OnHidInterrupt()が実行されないみたいです。 なにか解決策があれば、教えてください。 よろしくお願いします。
TeraTermの表示(一部)
ConnectionComplete 0C:FC:83:03:78:0910000358 10000290 L2CAPAddr size 8 Socket_Open size 8 OPEN DEVICE CLASS 3: 40 25 00 L2CAP_CONN_RSP Result 1 Connect failed? L2CAP_CONN_RSP Result 0 L2CAP_CONF_RSP Result 0 OnHidControl L2CAP_CONF_REQ Result 513 ←ここで止まります