今回は、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
# echo 40 > export
# cd gpio40
# echo out > direction
ポートのON/OFF(LED点灯)テストは以下の操作により行います。
# echo 1 > value
# echo 0 > 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;
}
}
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
.:
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 件のコメント:
コメントを投稿