USB シリアル (Arduino)


20140301usb_cdc_sample

Android から USB シリアルで通信します。
USB シリアル機器には、 Arduino Uno を使います。

ソースコードは Github に置いています。

Arduino Uno の USB インタフェースは下記のとおりです。

VendorId  : 9025
ProductId  : 67
Interface 0
  Class : CDC ( Communication Devices Class ) Interface
  Subclass : ACM ( Abstract Control Model )
  Protocol : AT Commands: V.250
Endpoint 0
  Direction : IN device to host
  Transfer Type : Interrupt
Interface 1
  Class : CDC ( Communication Devices Class ) Data
  Subclass : Data Interface
Endpoint 0
  Direction : OUT host to device
  Transfer Type : Bulk  
Endpoint 1
  Direction : IN device to host
  Transfer Type : Bulk

ソースコードの簡単な説明
(1) 送信
送信 UsbEndpoint を取得して、bulkTransfer で送信する
(2) 受信
受信 UsbEndpoint を取得して、bulkTransfer で受信する
受信はいつ来るのは分からないので、Thread でエンドレスループにする。
UIスレッドからは実行できないので、メッセージ・ハンドラーを介して、受け取る。
(3) ボーレートの設定
controlTransfer で設定する。
Request Code は SET_LINE_CODING ( 20h ) です。
Line Coding Format は7バイト構成です。
 0-3 バイト : ボーレート
 4 バイト : ストップビット長
 5 バイト : パリティ種別
 6 バイト : データ長

参考
Class definitions for Communication Devices
IMPLEMENTING USB COMMUNICATION DEVICE CLASS (CDC) ON SiM3U1XX MCUS
USB ホスト
Android USB Host + Arduino: How to communicate without rooting your Android Tablet or Phone
usb-serial-for-android
PhysicaloidLibrary


Android と Wii リモコンを接続する


20140303wii

Android と Wii リモコンを接続する方法を調べてみた。

概要

Android は、フレームワークとして Bluetooth HID をサポートしており、Bluetooth キーボードやマウスが使用できる。
Bluetooth API では、HID はサポートされていないので、InputManager を経由してキー入力を検出する。
なお、Bluetooth API では、RFCOMM をサポートしており、シリアル通信が可能である。

Wii リモコンは、Bluetooth HID を使っている。
HID といっても、一般的なキーボードやマウスとは異なる、独自の仕様である。

Linux レイヤの変更

CWiid という Linux 用のドライバーがある。
CWiid とは、C言語で記述された Wii の Driver の意味らしい。
BeagleBoard Android に移植した例

ルート化

ルート化して、HID をサポートする。
androhid がソースコードを公開している。

リフレクション

公式の API では、L2CAP をサポートしていないが、内部的には用意されている。

BluetoothSocket.java

static final int TYPE_L2CAP = 3;
BluetoothSocket(int type, int fd, boolean auth, boolean encrypt,
	BluetoothDevice device, int port, ParcelUuid uuid) throws IOException {

これをリフレクションで利用して、Wii リモコンと接続する。

Constructor<BluetoothSocket> construct = BluetoothSocket.class.getDeclaredConstructor( int.class, int.class, boolean.class, boolean.class, BluetoothDevice.class, int.class, ParcelUuid.class );
construct.setAccessible(true);
construct.newInstance( TYPE_L2CAP, -1, false, false, dev, port, null );

BluezIMEFitScales がソースコードを公開している。

Android 4.2

Android 4.2 からリフレクションが使えなくなった。
btif_sock.c で UNSUPPORTED になった。

btif_sock.c

case BTSOCK_L2CAP:
	BTIF_TRACE_ERROR1("bt l2cap socket type not supported, type:%d", type);
	status = BT_STATUS_UNSUPPORTED;
	break;

Connecting to a bluetooth HID device (mouse) using L2CAP


Android から RAPIRO を動かす


20140302rapiro_move20140302rapiro_pose

PC から Rapiro を動かすには、PC と Rapiro をUSBケーブルで接続して、
シリアルモニタを起動して、コマンドを入力します。
これは、簡単な仕組みでいいのですが。
毎回コマンドをタイプするのは面倒です。

Android から制御できるようにしてみました。
Rapiro を Android の USB ホストで接続します。
Move コマンドをボタン1つで送信できます。
Pose コマンドを シークバーで送信できます。

ソースは code.google で公開しています。
PhysicaloidLibrary が必要です。 別途ダウンロードしてください。

関連
Android から RAPIRO を動かす
Chrome App から RAPIRO を動かす


RAPIRO を動かす


20140301rapiro

Rapiro では Arduino のサンプルスケッチが配布されています。
しかしながら、説明書は付いていません。

最初に行うのは、トリム角度の調整です。
これはオンラインマニュアルの最後に書かれています。

// Fine angle adjustments (degrees)
int trim[MAXSN] = { 0,  // Head yaw
                    0,  // Waist yaw
                    0,  // R Sholder roll
                    0,  // R Sholder pitch
                    0,  // R Hand grip
                    0,  // L Sholder roll
                    10,  // L Sholder pitch
                    0,  // L Hand grip
                    5,  // R Foot yaw
                    3,  // R Foot pitch
                    12,  // L Foot yaw
                    14}; // L Foot pitch

ソースを読んでみたところでは、4種類のコマンドが定義されていました。
(1) Move
(2) Pose
(3) Q
(4) C

Move コマンド

#M0 : Stop 停止
#M1 : Forward 前進
#M2 : Back 後退
#M3 : Right 右回り
#M4 : Left 左回り
#M5 : Greed 目を緑色にする
#M6 : Yellow 目を黄色にする
#M7 : Blue 目を青色にする
#M8 : Red 目を赤色にする
#M9 : Push 右腕を前に延ばす

Pose コマンド

#P のあとに5つのサブコマンドがあります。
S : Servo
R : Red
G : Green
B : Blue
T : Time

Servo
SxxAxxx
Sxx はサーボ番号 00 から 11まで
Axxx はサーボ角度 000 から 180 まで

Red Green Blue
Rxxx Gxxx Bxxx
xxx は明度 000 から 255 まで

Time
Txxx
xxx は時間 000 から 999 まで 単位は 0.1秒

使い方
(1) 単発
#PR128T001 のように使います。
サブコマンドの終了には T が必要です。
#PR128 だとエラーになります。
#PR128T000 だと実行されません。

(2) 組合せ
#P S01A100 R128 T001 のように組合せも出来ます。
全てのサーボとLEDをいっぺんに設定するのが、本来の使い方のようです。

Q コマンド

Move や Pose コマンドで設定した動作を実行させます。

C コマンド

T サブコマンドで設定した時間の残り時間を表示させます。

サーボ番号と稼働範囲

00 : Head yaw : 0 – 90 – 180
01 : Waist yaw : 0 – 90 – 180
02 : R Sholder roll : 0 – 0 – 180
03 : R Sholder pitch : 40 – 130 – 130
04 : R Hand grip : 60 – 90- 110
05 : L Sholder roll : 0 – 180 – 180
06 : L Sholder pitch : 50 – 50 – 140
07 : L Hand grip : 60 – 90- 110
08 : R Foot yaw : 70 – 90 – 130
09 : Foot pitch : 70 – 90 – 110
10 : L Foot yaw : 50 – 90 – 110
11 : L Foot pitch : 50 – 90 – 110

数値は、角度の 最小 – 初期値 – 最大

サーボの特性

EMAX ES3103ES08A の動作角度を180度にしたモデルらしい。