2013年9月20日

  • EV3 Direct Commands for Android
  • EV3技術情報
  • 外部連携

EV3 Direct Commands for Android

EV3Command API操作方法(Android - EV3)

1 必要なもの 

EV3 とAndroid のBluetooth 通信を行うために以下のライブラリを作成しました。このライブラリはAndroid アプリを作成する際に利用してください。
EV3Command

必要な機材は以下のとおりです。

  • LEGO MINDSTORMS EV3
    -モーター
    -各種センサー
  • Android 端末
    -Bluetooth 内蔵

2 準備

2.1 ライブラリの取り込み

まずは,このライブラリを使用するプロジェクトA を作成します。そして,プロジェクトA にEV3Command のjar ファイル
を取り込む必要です。Eclipse での開発であれば,EV3Command をインポートし,プロジェクトA の「プロパティ>Android」
のLibrary の項目で「Add...」ボタンを押してEV3Command を追加します。(図1).

図1: ライブラリの追加

                                                図1: ライブラリの追加

2.2 Manifest への追加項目

プロジェクトA のAndroidManifest.xml にBluetooth を使用するために以下のコードを書きます。

リスト1: AndroidManifest.xml への追加項目

<uses -permission android:name="android.permission.BLUETOOTH" />
<uses -permission android:name="android.permission.BLUETOOTH_ADMIN" />

2.3 ペアリング

Android とEV3 はBluetooth のペアリングをしておく必要があります。

3 使用手順

3.1 接続

接続にはEV3 のMAC アドレスを使い,BluetoothAdapter インスタンスのgetRemoteDevice(String) を用いて, BluetoothDevice
インスタンスを用意します。このインスタンスをライブラリに渡し,open() メソッドを用いると接続が完了します。概要を以下に示しました。

リスト2: 接続

private BluetoothAdapter mBtAdapter = null;

// --- ----

// Get default adapter
mBtAdapter = BluetoothAdapter.getDefaultAdapter();

// --- ----

// Get the device MAC address
String address = hoge();
// Get the BluetoothDevice object
BluetoothDevice device = mBtAdapter.getRemoteDevice(address);

AndroidComm.getInstance().setDevice(device); // Set device

// Connect to EV3
try {
             EV3Command.open();
}
catch (Exception e) {
          // This exception also occurs when this device hasn't
          // finished paring
          foo();
}

3.2 モーターの利用

モーターの利用の際には,Motor クラスを利用します。Motor クラスは,A~D のポートに対応して,Motor クラスでA~D が用意されています。
以下のようにMotor.A~Motor.D を使用できます。

リスト3: モーターのインスタンス

private Motor mLeftMotor = Motor.B;
private Motor mRightMotor = Motor.C;

接続を行った後に使用できるメソッドは以下のとおりです。

リスト4: モーター

/**
 * Get the ID of the motor. One of 'A', 'B', 'C' or 'D'.
 */
public final char getId()
/**
 * Causes motor to rotate forward.
 * @return Error value. 0x02 means success. 0x04 means fail.
 */
public int forward()
/**
 * Causes motor to rotate backward.
 * @return Error value. 0x02 means success. 0x04 means fail. 
 */
public int backward()
/**
 * Sets the motor speed.
 * NOTE: this method doesn't send commands to EV3. To update the speed ,
 * use forward or backward method following this.
 * @param speed (0 ~ 100 %)
 */
public void setSpeed(int speed)
/**
 * Gets the current motor speed.
 * @return speed (0 ~ 100 %)
 */
public int getSpeed()
/**
 * Stops the motor using brakes.
 *
 * @return Error value. 0x02 means success. 0x04 means fail.
 */
public int stop()

3.3 センサーの利用

カラーセンサーやタッチセンサーなどのセンサーの種類をタイプといい,各センサーにはいくつかのモードがあります。例えば,カラー
センサーならば反射光の強さを受けるモード,何色か判断するモードなどです。現在用意しているセンサのタイプとモードは
以下のとおりです。

  • 共通
    -UnidentifiedSensor
    *センサーのパーセント値
    *センサーのSI 単位の値

  • NXT 用
    -LightSensor
    *反射したパーセント値(SI 値も同じ)(NOT TESTED)
    -SoundSensor
    *DB 値(NOT TESTED)
    *DBA 値(NOT TESTED)

  • EV3 用
    -TouchSensor
    *今おされているか(TESTED)
    *何回押されたか(TESTED)
    -ColorSensor
    *反射した光のパーセント値(SI 値も同じ)(TESTED)
    *周囲の明るさのパーセント値(TESTED)
    *色(9 色に判断できるようだが何色がどの数値に対応するかは未調査)(TESTED)

※センサーは,初めに取得した値が正しくない場合があります。そのため,モードを変更した際などは空読みを行っておくことをお勧めします。
センサーは1~4 のポートに対応して,SensorPort クラスでS1~S4 が定義されています。センサーを作成する際に,以下のように
S1~S4 を指定します。

リスト5: センサーのインスタンス

private UnidentifiedSensor mUnidentifiedSensor = new UnidentifiedSensor(SensorPort.S1);
private TouchSensor mTouchSensor = new TouchSensor(SensorPort.S2);

 

3.3.1 接続されているセンサーがわからない場合

UnidentifiedSensor クラスを用います。使用できるメソッドは以下のとおりです。

リスト6: 不明なセンサー(共通)

/**
 * An unidentified sensor.
 * @param sensor
 * e.g. SensorPort.S1
 */
public UnidentifiedSensor(SensorPort sensor)
/**
 * Sets the type and mode of the sensor.
 * @param type
 * @param mode
 */
public void setTypeAndMode(int type , int mode)
/**
 * Gets the name of the sensor.
 * @return
 */
public String getName()
/**
 * Gets the SI unit value of the sensor.
 * @return
 */
public float getSiValue()
/**
 * Gets the percent value of the sensor.
 * @return
 */
public int getPercentValue()

3.4 LightSensor(NXT)

使用できるメソッドは以下のとおりです。

リスト7: 光センサー(NXT)

/**
* LightSensor.
 * NXT lights sensor.
 * @param sensor
 * e.g. SensorPort.S1
 */
public LightSensor(SensorPort sensor)

/**
 * Returns light reading as a percentage.
 *
 * @return 0 to 100 (0 = dark , 100 = bright)
 */
public int getLightPercent()

/**
 * Returns ambient light reading as a percentage.
 *
 * @return 0 to 100 (0 = dark , 100 = bright)
 */
public int getAmbientLightPercent()

3.5 SoundSensor(NXT)

使用できるメソッドは以下のとおりです。

リスト8: サウンドセンサー(NXT)

/**
* Used to detect the loudness of sounds in the environment.
 * NXT sound sensor.
 * @param sensor
 * e.g. SensorPort.S1
 */
public SoundSensor(SensorPort sensor)

/**
 * Returns the decibels measured by the sound sensor.
 *
 * @return dB - decibels
 */
public float getdB()

/**
 * Returns sound within the human hearing frequency range , normalized by
 * A-weighting. Extremely high frequency or low frequency sounds are not
 * detected with this filtering (regardless of loudness).
 *
 * @return dB(A) - decibels with A-weighting
 */
public float getdBA()

3.6 TouchSensor(EV3)

使用できるメソッドは以下のとおりです。

リスト9: タッチセンサー(EV3)

/**
 * EV3 touch sensor.
 * @param sensor
 * e.g. SensorPort.S1
 */
public TouchSensor(SensorPort sensor)

/**
 *
 * @return true if sensor is pressed.
 */
public boolean isPressed()

/**
 *
 * @return the number of bumped.
 */
public float getBumps()

3.7 ColorSensor(EV3)

使用できるメソッドは以下のとおりです。

リスト10: カラーセンサー(EV3)

/**
 * EV3 color sensor.
 * @param sensor
 * e.g. SensorPort.S1
 */
public ColorSensor(SensorPort sensor)

/**
 * Returns light reading as a percentage.
 *
 * @return 0 to 100 (0 = dark , 100 = bright)
 */
public int getLightPercent()

/**
 * Returns ambient light reading as a percentage.
 *
 * @return 0 to 100 (0 = dark , 100 = bright)
 */
public int getAmbientLightPercent()

/**
 * Returns color as a percentage.
 *
 * @return 0 to 100
 */
public int getColorPercent()

 /**
 * Returns color.
 *
 * @return 0 to 8
 * 4 - yellow ,
 * TODO investigation
 */
public float getColor()

4 既知の問題

接続の解除が正しく動作していません。接続解除は以下のように行います。

リスト11: 接続解除

// Close the connection
try {
            EV3Command.close();
}
catch (RuntimeException e) {
}

これは,内部でBluetoothSocket のclose() メソッドを使っているが,これを行うと次の接続時に失敗します。現在は,EV3 の
Bluetooth 機能を一旦立ち上げなおすことで解決しています。

 

Creative Commons License
LEGO Mindstorms Education technical information byAfrel. Co. Ltd. is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

SPIKE