2014年8月8日金曜日

[.tested] OpenECHO [debian Wheezy][AX3][A7][A6]

OpenECHOは、ECHONET LiteをJavaで実装したライブラリであり、以下のサイトで公開されています。


今回は、OpenBlocks A7の内部GPIOポートを用い、ECHONET Lite対応機器として、簡単な実装を行ってみました。

OBDN技術ブログによる動作検証は、該当するデバイスやソフトウェアの動作について、保証およびサポートを行うものではありません。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。

<検証環境>
OpenBlocks A7 Debian 7.5 kernel:3.2.54

1. ハードウェアの準備


今回は、A7の基板上に実装された内部GPIOポートを利用しました。

(A6の場合は、背面よりGPIOポートが接続可能です。AX3の場合は、GPIOのポートがないため、USB-GPIOアダプタなどを利用する必要があります。 )


実際に何か照明機器を接続するといいのですが、今回は、LEDを抵抗(470Ω)と直列に接続しています。

A7の内部GPIOピンは、以下の配置になっています。

1: MPP17(GPIO_17)
2: MPP7 (GPIO_7) ※PD禁止
3: MPP29 (GPIO_29)
4: MPP28 (GPIO_28)
5: MPP35 (GPIO_35)
6: MPP34 (GPIO_34)
7: MPP40 (GPIO_40)
8: 未使用
9: 外部リセット入力
10: GND

ピンの配置
| 9| 7| 5| 3| 1|
|10| 8| 6| 4| 2|

今回は、P7(GPIO 40)へLEDを接続しました。

2. ソフトウェア (一般照明機器としての設定)


A7を一般照明機器としてセットアップする方法です。

今回は、新たにGPIO回りのライブラリを作成せず、簡単なセットアップで試しました。

・GPIOデバイスの作成

GPIOデバイスは、以下の手順により操作可能となります。
今回、プログラム上では、この設定を行っていませんので、下記の手順を実行した後、評価プログラムを起動させてください。

# cd /sys/class/gpio
# echo 40 > export
# cd gpio40
# echo out > direction

ポートのON/OFF(LED点灯)テストは以下の操作により行います。

# echo 1 > value
# echo 0 > value

・OpenECHOによるサンプルプログラム

今回は、以下のサイトのプログラムの一部を修正して使用しました。

 Howto : ArmadilloでECHONET Lite (まとめ)

ellight.jarのソースパッケージである、ellight.zipを展開して、Netbeans IDE 8.0により修正、ビルドしてください。
今回、A7に搭載されたJREが、

Java(TM) SE Embedded Runtime Environment (build 1.7.0_40-b43, headless)

となりますので、JDKも7を導入して指定しています。


MyLighting.javaを書き換えます。

package ellight;

import com.sonycsl.echo.eoj.device.housingfacilities.GeneralLighting;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.logging.Level;
import java.util.logging.Logger;

public class MyLighting extends GeneralLighting {
    byte[] mStatus = {0x31};
    byte[] mMode = {0x41};
    byte[] mLocation = {0x00};
    byte[] mVersion = {0x01, 0x01, 0x61, 0x00};
    byte[] mFaultStatus = {0x42};
    byte[] mManufacturerCode = {0x00, 0x00, 0x00}; /* 未定義 */

    @Override
    protected boolean setOperationStatus(byte[] edt) {
        Runtime rt = Runtime.getRuntime();
        Process pr = null;
        try {
            /* LEDをON/OFF */
            if (edt[0] == 0x30)
                pr = rt.exec(new String[]
                             { "/bin/sh", "-c",
                               "echo 1 > /sys/class/gpio/gpio40/value" });
            else if (edt[0] == 0x31)
                pr = rt.exec(new String[]
                             { "/bin/sh", "-c",
                               "echo 0 > /sys/class/gpio/gpio40/value" });
            if (pr != null)
                pr.waitFor();
            /* 状態をECHNET Lite送信 */
            inform().reqInformOperationStatus().send();
        } catch (InterruptedException | IOException ex) {
            Logger.getLogger(MyLighting.class.getName()).log(Level.SEVERE,
                                                             null, ex);
        }
        return true;
    }

    @Override
    protected byte[] getOperationStatus() {
        try {
            Runtime rt = Runtime.getRuntime();
            /* LEDの点灯状態を取得 */
            Process pr = rt.exec("cat /sys/class/gpio/gpio40/value");
            InputStream is = pr.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String line = br.readLine();
            if (line != null && line.equals("0"))
                mStatus[0] = 0x31;
            else
                mStatus[0] = 0x30;
        } catch (IOException ex) {
            Logger.getLogger(MyLighting.class.getName()).log(Level.SEVERE, null, ex);
        }
        return mStatus;
    }

    @Override
    protected boolean setLightingModeSetting(byte[] edt) {
        mMode[0] = edt[0];

        try {
            inform().reqInformLightingModeSetting().send();
        } catch (IOException ex) {
            Logger.getLogger(MyLighting.class.getName()).log(Level.SEVERE,
                                                             null, ex);
        }
        return true;
    }

    @Override
    protected byte[] getLightingModeSetting() {
        return mMode;
    }

    @Override
    protected boolean setInstallationLocation(byte[] edt) {
        mLocation[0] = edt[0];

        try {
            inform().reqInformInstallationLocation().send();
        } catch (IOException ex) {
            Logger.getLogger(MyLighting.class.getName()).log(Level.SEVERE,
                                                             null, ex);
        }
        return true;
    }

    @Override
    protected byte[] getInstallationLocation() {
        return mLocation;
    }

    @Override
    protected byte[] getStandardVersionInformation() {
        return mVersion;
    }

    @Override
    protected byte[] getFaultStatus() {
        return mFaultStatus;
    }

    @Override
    protected byte[] getManufacturerCode() {
        return mManufacturerCode;
    }
}

ビルドしたパッケージを以下の構成でA7に転送します。

# ls -lsR
.:
total 16
4 -rw-r--r-- 1 root root 1323 Jul 17 13:29 README.TXT
8 -rw-r--r-- 1 root root 5395 Jul 16 17:54 ellight.jar
4 drwxr-xr-x 2 root root 4096 Jul 17 13:29 lib

./lib:
total 1040
1040 -rw-r--r-- 1 root root 1061315 Jul 17 16:02 OpenECHO.jar

起動方法は以下の通りです。

# java -jar ellight.jar

3. ソフトウェア (コントローラ)


コントローラとしては、Kadecot [公開実験版]を利用させてもらいました。
Androidマシンを用意し、PlayStoreよりアプリをダウンロードして使用します。


 Kadecot: 機器のリスト画面



画面の照明機器をクリックすることにより、本体のLEDの点灯制御を行っています。

3. さいごに


今回はOpenECHOを評価するのが目的でしたので、GPIO回りの実装は、最低限動作確認出来る程度のものとなっています。

0 件のコメント:

コメントを投稿