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 ←ここで止まります