m3piをBluetooth keyboardでコントロールしてみました

はじめに

m3piをBluetooth keyboardでコントロールするようにしてみました。

mbedCookbookにリンクされていたPeter Barrettさんの BlueUSBを拝見したところ、USBに接続したBluetoothドングルを使って、キーボードやマウスやWiiリモコンなどのデータを受信して表示できることがわかりました。

これを応用すればすぐできそうです。まずはこれを動かしてみます。

m3piへのUSBコネクタの取り付け

まずは、m3piにUSBコネクタを取り付けます。といってもmbedにUSBコネクタを接続するだけですが。

3piの拡張基板ですが、mbedを実装するとそんなに空きスペースはありません。 とりあえず空いているスペースに手持ちのUSB Aコネクタをハンダ付けしてmbedに接続しました。 もし縦型のUSB Aコネクタが手に入るようであれば、それに付け替えたいと思います。

http://kanpapa.com/today/assets_c/2010/12/m3pi_Bluetooth_1-thumb-320x240-204.jpg

Bluetoothドングルの動作確認

m3piのUSBコネクタに手持ちのPLANEX(PCI) Bluetooth USBアダプタ BT-MicroEDR2Xを接続しました。 Vccは3piから取っているので、3piの電源をいれるとBluetoothアダプタのLEDが点灯しました。 次にBlueUSBプログラムをmbedに書き込みました。手持ちのBluetoothキーボードとの通信も無事できているようです。

ちなみにBlueUSBの出力情報によると、以下のようにデータが受信されるようです。

KeyboardReceive 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にキーコードが表示されるようにして動作確認を行い、その後に実際にモーター制御のコマンドを追加しました。 具体的には以下のようになります。

Keyboardm3pi 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でコントロールしてみました:

03 Dec 2014

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

Please log in to post comments.