...

Intel x86 Galileoボードの センサーを操作する

by user

on
Category: Documents
8

views

Report

Comments

Transcript

Intel x86 Galileoボードの センサーを操作する
//internet of things /
Intel x86 Galileoボードの
センサーを操作する
GASTÓN HILLAR
IoTの神髄であるデータの取得と応答をJavaと安価なx86プロセッサ・ボードを使った実例で学ぶ
本
記事では、計測した環境光に反応して赤、緑、青(RGB)のLEDを
調整するプロジェクトについて説明し、実際に開発を行います。
この過程を通して、Java SE 8でアナログ入力やパルス幅変調(PWM)
出力を扱う方法について理解できるでしょう。本記事では、Javaもサ
ポートされている最新バージョンのIntel IoT Development Kitを使用
します。
また、Pentiumアーキテクチャに基づいたArduino互換x86チ
ップを搭載したIntel Galileo Gen 2ボードを制御するために、高水準
インタフェースを提供するupmとmraaの両方のライブラリを利用しま
す。
さらに、配線した電子部品、
センサー、
アクチュエータの制御方法
についても説明します。
前提条件
Intel Galileo Gen 2ボードでは、Yocto Poky Linuxイメージが起動しま
す。
このイメージは、Intel Galileo用Linuxオペレーティング・システム
のmicroSDカード向けイメージの最新バージョンです。Galileo用の最
新バージョンのYocto Pokyイメージは、IntelのWebサイトからダウン
ロードできます。
開発には、Intel System Studio IoT Editionソフトウェアを使用し
ます。
このEclipseベースのIDEを使うと、Javaをメインのプログラミン
グ言語として簡単に新しいIoTプロジェクトを作ることができます。
ま
た、利用可能な最新バージョンのmraaとupmの2つのライブラリを両
方とも使用します。mraaライブラリは、Linuxプラットフォームで通信を
行うための低水準のスケルトン・ライブラリです。upmライブラリは、
センサーやアクチュエータと通信するための一連のライブラリです。
いずれも、Intel IoT Development Kitに含まれています。Intel System
ORACLE.COM/JAVAMAGAZINE /////////////////// SEPTEMBER/OCTOBER 2016
Studio IoT Editionは、IntelのIoTサイトからダウンロードできます。
Javaで新しいIoTプロジェクトを開始する際に直面する可能性が
ある主な問題の1つは、Intel System Studio IoT Editionに含まれる
upmおよびmraaライブラリのバージョンが、Intel Galileo Gen 2ボー
ドで実行されているYocto Poky Linuxにインストールされているラ
イブラリのバージョンと一致しなければならないことです。残念なが
ら、IDEに含まれている同期機能を使うとさまざまな問題が発生しま
す。
そのため、最初にIDEのライブラリをアップデートし、次にボード
をアップデートするというように、別々に操作を行うことをお勧めしま
す。IDEのメイン・メニューで「Intel(R) IoT ¦ Libraries Update…」
を
選択し、利用可能な最新バージョンのライブラリをインストールする
手順に従ってください。
ボードでmicroSDカードのLinuxオペレーティング・システム・イ
メージの起動プロセスが終了し、
イーサネット・ポートがLANに接続さ
れると、DHCPサーバーによってボードにIPアドレスが割り当てられま
す。
このIPアドレスは後ほど必要になります。割り当てられたアドレス
は、
さまざまな方法で確認できます。たとえば、DHCPサーバーのWeb
インタフェースにアクセスすれば、
そこで、ボード上のラベルに記載さ
れているMACアドレスに一致するデバイスに割り当てられたIPアドレ
スを確認できます。
ゼロ・コンフィギュレーション・ネットワーク実装によって、LAN上
で自動的にボードとサービスを検出することもできます。Windows
では、Bonjour Browser for Windows(無料)
を、OS Xでは、Bonjour
Browser for OS X(無料)
を使うことができます。
いずれのアプリケーションも、利用可能なBonjourサービスを表
05
//internet of things /
示するもので、galileoという名前のものにだけ着目すれば大丈夫で
す。galileoという名前のSSHサービス用に表示されるIPアドレスが、ボ
ードとの接続を確立するために使用できるIPアドレスです。
次に、お気に入りのSSH端末ツールを使って、Intel Galileo Gen 2
ボードで実行されているYocto Linuxに接続します。
その際に、先ほど
取得したIPアドレスと、rootユーザーおよび空のパスワードを使用し
ます。続いて、SSH端末から次のコマンドを実行します。
opkg update
opkg install mraa
opkg install upm
次に、
「Create an IoT Project」
をクリックし、IDEで「Java Project」
を選択します。
この例では、
プロジェクト名をAmbientLightAndLedと
し、Intel Galileo Gen 2ボードの接続名とIPアドレスを入力します。
こう
すると、IDEにより、指定したボードにプロジェクトをアップロードして
実行する環境が構築されます。
プロジェクトからの出力はコンソール
に表示され、
コマンドは端末から実行できます。
しかし、
よくあるよう
に、動作の仕組みがわかってしまえば、独自のスクリプトを作成して独
自のコマンドを実行し、生成されたJARをアップロードして実行する方
が簡単なことがわかるでしょう。IDEによって統合デバッグ環境が提供
されるため、Javaでmraaライブラリやupmライブラリを使うようにな
ると、
とても便利になります。
す。今回は、分圧回路構成に含まれる2つの抵抗の1つとしてフォトレ
ジスタを使用します。分圧回路の出力電圧値は、
フォトレジスタへの入
射光が強い場合には高くなり、入射光が弱い場合またはまったくない
場合には低くなります。
Intel Galileo Gen 2ボードでは、PWM出力ピンとして6つのデジ
タルI/Oピンのみを使用できます。
これらの6つのピンには、
チルダ記号
( )の後にボード上の番号が付いた名前が付いています。
今回は、
フォトレジスタを含む分圧回路の正(+)の側をA0と表示
されたアナログピンに接続します。
さらに、次のPWM対応ピンを使っ
てRGB LEDの輝度レベルを制御します。
■■ ピン 6をRGB LEDの赤色コンポーネント用のアノード
・ピンに接続
■■ ピン 5をRGB LEDの緑色コンポーネント用のアノード
・ピンに接続
■■ ピン 3をRGB LEDの青色コンポーネント用のアノード
・ピンに接続
今回の例を動作させるには、次のパーツが必要になります。
■■ フォトレジスタ
■■ 10,000Ω
(10kΩ)の抵抗(許容差5%)
。抵抗のカラー・コードは、茶、
黒、橙、金
■■ カソード
・コモンの5mm RGB LED
■■ 270Ωの抵抗
(許容差5%)3個。抵抗のカラー・コードは、赤、紫、茶、
金
電子部品の配線
フォトレジスタは、光依存性抵抗(LDR)やフォトセルとも呼ばれる電
子部品です。
この部品は高い水準の正確性を備えた、環境光を検知す
る最適な手段というわけではありません。
しかし、暗い環境であるかど
うかを判定する場合には有用であり、今回の例では、
レイテンシ
(光の
明暗を伝える遅延)
も問題にはなりません。
さらに複雑なプロジェクト
で環境光を検知する必要がある場合は、正確性とレイテンシも考慮し
てください。
フォトレジスタは、環境光の強度に応じて抵抗が変化する可変抵
抗です。環境光の強度が増加するとフォトレジスタの抵抗が低下し、強
度が減少すると抵抗が上昇します。
ボードでは、
アナログ入力ピンの電圧値を読み取ることができま
ORACLE.COM/JAVAMAGAZINE /////////////////// SEPTEMBER/OCTOBER 2016
06
//internet of things /
図 1 は、前述の電子部品をブレッドボードに接続して必要な
配線を行い、Intel Galileo Gen 2 ボードとの配線を終えたものです
(元
の図は、有名な Fritzing マルチプラットフォーム・アプリケーション
PWM を使用して LED の明るさを調整するクラス
のコーディング
必要な配線を終えた後は、暗い環境であるかどうかを判定し、環境
を使って作成しました。Fritzingファイルは、Java Magazineダウンロー
ド・サイトからダウンロードできる、本記事に関連するコード・バン
光の値に応じて RGB LED の 3 色の明るさを制御する Java コードを
ドルに含まれています)
。
PWM 対応の GPIO(汎用入出力)ピンには、 6、 5、 3 の
3 つがあります。それぞれを 270 Ωの抵抗に接続し、各色の LED
に対応するアノード・ピンに配線します。カソード・コモンはグラン
ド(GND)に接続し、アナログ入力ピン A0 を、フォトレジスタと
10k Ω抵抗(許容差 5%)で構成された分圧回路に接続します。フォ
トレジスタを IOREF ピンに配線します。今回はボードのデフォルトの
構成を使っているため、IOREF の電圧は 5V です。10k Ωの抵抗は、
GND に配線します。
読み取り、そのアナログ値をデジタル表現に変換します。さらに、デ
書く必要があります。このコードは、抵抗値を電圧に変換した結果を
ジタル値を電圧値にマッピングし、その電圧値を暗さの度合い、す
なわち環境光計測値にマッピングします。
コードを読みやすくわかりやすいものにするために、以降で説
明する Java クラスでは、実行した各操作の結果のチェックを行って
いません。ただし、完成版のコードでは、さまざまな mraa クラスの
インスタンスにおける各メソッド呼出しの結果をチェックし、戻り値
が mraa.Result.SUCCESS であることを確認する必要があります。
この例では、次の 3 つのクラスを作成します。
■■
VariableBrightnessLed:ボードに接続された LED を表します。
このクラスにより、輝度レベルを制御できます。
■■
VoltageInput:ボードのアナログ入力ピンに接続された電圧源
を表します。アナログ入力から読み取った未処理値を電圧値にマッ
ピングできます。
■■
SimpleLightSensor:光センサーを表します。VoltageInput イ
ンスタンスで計測された電圧値を光計測値と説明に変換できます。
次に、VariableBrightnessLed クラスと SimpleLightSensor クラ
スのインスタンスを作成する BoardManager クラスを作成し、2 つ
のクラスとやり取りを行います。最後に、これまで説明した各クラス
の操作を統括する AmbientLightAndLed というマスター・クラス
を作成します。
図1:ブレッドボードに接続し、Intel Galileo Gen 2ボードに配線した電子部品
07
ORACLE.COM/JAVAMAGAZINE /////////////////// SEPTEMBER/OCTOBER 2016
//internet of things /
validBrightnessLevel / 255f;
this.pwm.write(convertedLevel);
this.brightnessLevel = validBrightnessLevel;
System.out.format(
"%s LED connected to PWM Pin #%d " +
"set to brightness level %d.%n",
this.name,
this.gpioPin,
validBrightnessLevel);
それではまず、ボードに接続されたLEDを表す
VariableBrightnessLedクラスを新規に作成します。LEDは、0以上
255以下の輝度レベルをとることができます。次のコードは、すべての
クラスで使用するインポート文と新しいクラスのコードを示していま
す。
import mraa.Aio;
import mraa.Pwm;
class VariableBrightnessLed {
private final int gpioPin;
private final String name;
private final Pwm pwm;
private int brightnessLevel;
public VariableBrightnessLed(int gpioPin,
String name) {
this.name = name;
this.gpioPin = gpioPin;
this.pwm = new Pwm(gpioPin);
this.pwm.period_us(700);
this.pwm.enable(true);
// 輝度レベルの初期値を0に設定
this.setBrightnessLevel(0);
}
public void setBrightnessLevel(
int brightnessLevel) {
int validBrightnessLevel = brightnessLevel;
if (validBrightnessLevel > 255) {
validBrightnessLevel = 255;
} else if (validBrightnessLevel < 0){
validBrightnessLevel = 0;
}
float convertedLevel =
ORACLE.COM/JAVAMAGAZINE /////////////////// SEPTEMBER/OCTOBER 2016
}
public int getBrightnessLevel() {
return this.brightnessLevel;
}
public int getGpioPin() {
return this.gpioPin;
}
}
VariableBrightnessLedクラスのインスタンスを作成する際に
は、LEDが接続されているGPIOピン番号をint型のgpioPin引数
で、LEDの名前をString型のname引数で指定する必要があります。
コンストラクタは、受け取ったgpioPinを、
ピンを表す引数として使用
し、新しいmraa.Pwmインスタンスを作成します。
その参照をpwmフ
ィールドに保存し、period_usメソッドを呼び出してPWMの周期を
700マイクロ秒(700µs)に設定します。
これによって、700µsの間に信
号をオン状態にする時間の割合を出力デューティ比で指定できるよう
になります。
たとえば、出力デューティ比が0.10(10%)の場合、700µsのうち
70µsの間、信号がオンになります。次に、
コンストラクタはtrueをパラ
メータにしてpwm.enableメソッドを呼び出し、PWM対応ピンの状
08
//internet of things /
態を有効に設定します。
これによって、
コードからpwm.writeメソッドを呼び
出してPWMピンの出力デューティ比の
設定を開始できるようになります。
最後に、
コンストラクタは
brightnessLevel引数の値として0を
使い、setBrightnessLevelメソッドを
呼び出します。
これによって、
コンストラ
クタは指定されたピン番号に配線され
たLEDの輝度レベルを0に設定し、消灯
します。具体的には、
この呼出しによっ
て、指定された色のコンポーネントの
RGB LEDが消灯します。
このクラスに
は、setBrightnessLevelメソッドが宣
言されています。
このメソッドでは、0以
上255以下の輝度レベルをPWMピンで使う適切な出力デューティ比
の値に変換しています。
このメソッドは、int型のbrightnessLevel引
数で輝度レベル値を受け取ります。
コードでは、最初に輝度レベルが0以上255以下の値であること
を確認しています。値が範囲外の場合は、最低値または最高値にした
上で、輝度レベルをローカル変数validBrightnessLevelに保存しま
す。
次に、PWMピンで必要となる出力デューティ比を計算し、輝度
レベルを1.0fから0.0fの間の浮動小数点値(100%から0%)
として表現
します。
そのためには、有効な輝度レベル(validBrightnessLevel)
を255fで割る必要があります。
その値は、convertedLevel変数に保
存されます。次の行では、
比率を示す引数としてconvertedLevel変
数を使ってthis.pwm.writeメソッドを呼び出しています。
これに
よって、PWM出力に設定されているピンの出力デューティ比を
convertedLevelに設定します。
最後に、有効な輝度レベルをbrightnessLevelフィールドに保
存します。
このフィールドには、getBrightnessLevelメソッドから読
取り専用でアクセスできます。最後の行では、LEDの識別名、配線先
のピン番号、および設定した輝度レベルを出力しています。
この行
は、System.out.formatを使って出力しています。生成されたJARフ
このクラスには
メソッドが宣言
されており、0
以上255以下の
輝度レベルを
PWMピンで使
う適切な出力
デューティ比の
値に変換して
います。
ORACLE.COM/JAVAMAGAZINE /////////////////// SEPTEMBER/OCTOBER 2016
ァイルをIDEから実行するか、ボード上で実行されているYocto Linux
にSSH経由で接続してコマンドを実行すると、出力の内容を確認でき
ます。後ほど、有用な情報を出力することのメリットについて説明しま
す。
アナログ入力による環境光計測
ここで、ボード上のアナログ入力ピンに接続された電圧源を表す
VoltageInputクラスを新しく作成します。
この新しいクラスのコード
を以下に示します。
class VoltageInput {
private final int analogPin;
private final Aio aio;
public VoltageInput(int analogPin) {
this.analogPin = analogPin;
this.aio = new Aio(analogPin);
// ADC(アナログ・デジタル・
// コンバータの略)の分解能を
// 12ビット
(0から4095)に設定
this.aio.setBit(12);
}
public float getVoltage() {
long rawValue = this.aio.read();
float voltageValue =
rawValue / 4095f * 5f;
return voltageValue;
}
public int getAnalogPin() {
return analogPin;
}
}
09
//internet of things /
VoltageInputクラスのインスタンスを作成する際には、電圧源が
接続されているアナログ・ピン番号をint型のanalogPin引数で
指定する必要があります。
コンストラクタでは、受け取ったアナロ
グ・ピン番号をanalogPinフィールドに保存しています。
この値に
は、getAnalogPinメソッドから読取り専用でアクセスできます。次に、
コンストラクタは、受け取ったanalogPinを、
ピンを表す引数として使
用し、新しくmraa.Aioインスタンスを作成します。
その参照をaioフィ
ールドに保存し、setBitメソッドを呼び出してアナログ・デジタル・コン
バータ
(ADC)の分解能を12ビットに設定します。
こうすると、ADCは
12
0Vから5Vを表す4,096種類の値(2 = 4096)
を提供するようになりま
す。ADCから読み取った値が0の場合は0V、4095の場合は5Vを意味し
ます。
アナログ・ピンから読み取った未処理値は、線形関数を適用して
変換し、対応する入力電圧値にマッピングする必要があります。
その
ために、
コードではアナログ・ピンから読み取った未処理値に5を掛け
てから4095で割り、未処理値から入力電圧値を得ています。分解能を
12ビットにしているため、検出する値は5V/4095 = 0.001220012V、つ
まり約1.22ミリボルトの精度になります。
VoltageInputクラスには、getVoltageメソッドが宣言されてい
ます。
このメソッドでは、
まずthis.aio.readメソッドを呼び出してアナ
ログ・ピンから未処理値を取得し、long型の変数rawValueに保存し
ています。
この変数に値を保存するのは、
デバッグを容易にし、
コード
の仕組みをわかりやすくするためです。次に、rawValueを4,095で割
ってから5を掛けたものをfloat型の変数voltageValueに保存してい
ます。
このメソッドは、最終的にvoltageValue変数の値を返します。
以上のような仕組みによって、
このメソッドは、this.aio.readメソッド
から取得した未処理値を変換して電圧値を返しています。
以上で、電圧源から電圧値を取得できるクラスを作成しました。
次は、新しくSimpleLightSensorクラスを作成します。
このクラスは、
分圧回路に含まれ、ボードのアナログ・ピンに配線されているフォトレ
ジスタを表します。
この新しいクラスでは、先ほど作成した、
アナログ
入力を読み取って変換するVoltageInputクラスを使用します。
この新
しいクラスを使うと、電圧値を光の測定値に変換し、
その説明を表示
できるようになります。
この新しいクラスのコードを以下に示します。
class SimpleLightSensor {
// 光レベルの説明
public static final String
LL_EXTREMELY_DARK = "Extremely dark";
public static final String
LL_VERY_DARK = "Very dark";
public static final String
LL_JUST_DARK = "Just dark";
public static final String
LL_SUNNY_DAY = "Like a sunny day";
// 光レベルを決定する最大電圧
private static final float
EXTREMELY_DARK = 2.1f;
private static final float
VERY_DARK = 3.1f;
private static final float
JUST_DARK = 4.05f;
private final VoltageInput voltageInput;
private float measuredVoltage = 0f;
private String lightLevel =
SimpleLightSensor.LL_SUNNY_DAY;
public SimpleLightSensor(int analogPin) {
this.voltageInput =
new VoltageInput(analogPin);
this.measureLight();
}
10
ORACLE.COM/JAVAMAGAZINE /////////////////// SEPTEMBER/OCTOBER 2016
//internet of things /
public void measureLight() {
this.measuredVoltage =
this.voltageInput.getVoltage();
if (this.measuredVoltage <
SimpleLightSensor.EXTREMELY_DARK) {
this.lightLevel =
SimpleLightSensor.LL_EXTREMELY_DARK;
} else if (this.measuredVoltage <
SimpleLightSensor.VERY_DARK) {
this.lightLevel =
SimpleLightSensor.LL_VERY_DARK;
} else if (this.measuredVoltage <
SimpleLightSensor.JUST_DARK) {
this.lightLevel =
SimpleLightSensor.LL_JUST_DARK;
} else {
this.lightLevel =
SimpleLightSensor.LL_SUNNY_DAY;
}
}
public String getLightLevel() {
return this.lightLevel;
}
}
このクラスでは、次の3つのクラス・フィールドが定義されています。
こ
れらのフィールドでは、各光レベルを決定する最大電圧値を指定して
います。
■■ EXTREMELY_DARK
:2.1V
■■ VERY_DARK
:3.1V
■■ JUST_DARK
:4.05V
取得した電圧が2.1Vよりも低い場合、極端に暗い環境です。取得した
電圧が3Vよりも低い場合、かなり暗い環境です。取得した電圧が4.05V
よりも低い場合、少し暗い環境です。
これらの値は、特定のフォトレジ
ORACLE.COM/JAVAMAGAZINE /////////////////// SEPTEMBER/OCTOBER 2016
スタ向けのものです。お使いの構成で個
別の環境を判定する際に使う電圧値を確
認する必要があるかもしれません。
その場
合でも、
クラス・フィールドの値を変更する
だけで構いません。
SimpleLightSensorクラスの主な
目的は、定量値(電圧値)
を定性値(環境光
の説明)に変換することです。
このクラスで
は、光レベルを説明する次の4つのクラス・
フィールドが宣言されています。
この新しい
クラスを使う
と、電圧値を
光の測定値
に変換し、そ
の説明を表
示できるよう
になります。
LL_EXTREMELY_DARK
■■ LL_VERY_DARK
■■ LL_JUST_DARK
■■ LL_SUNNY_DAY
SimpleLightSensorクラスのイ
ンスタンスを作成する際には、analogPin引数に、
フォトレ
■■
ジスタを含む分圧回路が接続されているアナログ・ピン番
号を指定する必要があります。
コンストラクタは、受け取った
analogPin引数を使ってVoltageInputインスタンスを新しく作
成し、
その参照をvoltageInputフィールドに保存します。次の行
では、measureLightメソッドを呼び出しています。
このメソッド
は、VoltageInputインスタンス
(this.voltageInput)から取得した電
圧値を光レベルの説明に変換します。
このクラスでは、measureLightメソッドが宣言されています。
このメソッドでは、this.voltageInput.getVoltageメソッドを呼
び出して取得した電圧値をmeasuredVoltageフィールドに保存
しています。次の行では、先ほど説明したクラス・フィールドを使っ
て、measuredVoltageフィールドの値が各光レベルを決定する最大
電圧よりも低いかどうかを判定しています。
コードでは、計測した電圧
値に応じた適切な値をlightLevelフィールドに設定しています。
その
後、getLightLevelメソッドを呼び出すと、光レベルの説明にアクセス
できます。
11
//internet of things /
ボード・マネージャによる、1つの入力と3つの出力
の制御
String lightLevel =
this.lightSensor.getLightLevel();
switch (lightLevel) {
case SimpleLightSensor.LL_EXTREMELY_DARK:
this.setRGBBrightnessLevel(255);
break;
case SimpleLightSensor.LL_VERY_DARK:
this.setRGBBrightnessLevel(128);
break;
case SimpleLightSensor.LL_JUST_DARK:
this.setRGBBrightnessLevel(64);
break;
default:
this.setRGBBrightnessLevel(0);
break;
}
次は、BoardManagerクラスを新しく作成します。
このクラスで
は、先ほど作成したSimpleLightSensorクラスの1つのインスタ
ンスと、VariableBrightnessLedクラスの3つのインスタンスを作
成します。
こうすることによって、RGB LEDの各色コンポーネント
に、VariableBrightnessLedクラスのインスタンスが1つずつ割り当
てられます。
このクラスは、環境光が変化したときにアクションを発動
します。具体的には、計測した環境光に応じて、RGB LEDの3つの色コ
ンポーネントの明るさを調整します。
この新しいクラスのコードを以
下に示します。
class BoardManager {
public final SimpleLightSensor lightSensor;
public final VariableBrightnessLed redLed;
public final VariableBrightnessLed greenLed;
public final VariableBrightnessLed blueLed;
}
}
public BoardManager() {
this.lightSensor =
new SimpleLightSensor(0);
this.redLed =
new VariableBrightnessLed(6, "Red");
this.greenLed =
new VariableBrightnessLed(5, "Green");
this.blueLed =
new VariableBrightnessLed(3, "Blue");
}
public void setRGBBrightnessLevel(int value) {
this.redLed.setBrightnessLevel(value);
this.greenLed.setBrightnessLevel(value);
this.blueLed.setBrightnessLevel(value);
}
public void updateLedsBasedOnLight() {
ORACLE.COM/JAVAMAGAZINE /////////////////// SEPTEMBER/OCTOBER 2016
BoardManagerクラスには、次の4つのフィールドが宣言されており、
コンストラクタが各フィールドを初期化しています。
■■ lightSensor
:SimpleLightSensorのインスタンスです。
アナログ・
ピンA0に接続されている分圧回路に含まれるフォトレジスタを表し
ます。
■■ redLed
:VariableBrightnessLedのインスタンスです。GPIOピン
6に接続されているRGB LEDの赤色コンポーネントを表します。
■■ greenLed
:VariableBrightnessLedのインスタンスです。GPIOピ
ン 5に接続されているRGB LEDの緑色コンポーネントを表します。
■■ blueLed
:VariableBrightnessLedのインスタンスです。GPIOピン
3に接続されているRGB LEDの青色コンポーネントを表します。
setRGBBrightnessLevelメソッドは、受け取った
12
//internet of things /
valueを引数として、3つのVariableBrightnessLedインスタ
ンスのsetBrightnessLevelメソッドを呼び出します。
これによって、
一度の呼出しでRGB LEDの3つの色コンポーネントが同じ輝度レベル
に設定されます。
updateLedsBasedOnLightメソッド
は、SimpleLightSensorインスタンスから光レベルの説明を取得し、
先ほど説明したsetRGBBrightnessLevelメソッドを呼び出します。
こ
れにより、計測した光に応じてRGB LEDの3つのコンポーネントの輝
度レベルを設定します。極端に暗い場合は、輝度レベルを255に設定
します。かなり暗い場合は、輝度レベルを128に設定します。少し暗い
場合は、輝度レベルを64に設
定します。
それ以外は、輝度レ
ベルを0に設定します。
この場
合、RGB LEDは完全に消灯しま
す。
次に、BoardManagerク
ラスを利用して環境光を計測
し、計測した環境光に応じて
RGB LEDの3つの色コンポー
ネントの輝度を設定するコー
ドを記述します。
この新しい
AmbientLightAndLedクラ
スのコードを以下に示します。
SimpleLightSensor
クラスの主な目的
は、定量値(電圧値)
を定性値(環境光の
説明)に変換するこ
とです。
public class AmbientLightAndLed {
public static void main(String[] args) {
String lastlightLevel = "";
BoardManager board = new BoardManager();
while (true) {
board.lightSensor.measureLight();
String newLightLevel =
board.lightSensor.getLightLevel();
if (newLightLevel != lastlightLevel) {
// 計測した光レベルが変わった
lastlightLevel = newLightLevel;
System.out.format(
ORACLE.COM/JAVAMAGAZINE /////////////////// SEPTEMBER/OCTOBER 2016
"Measured light level: %s%n",
newLightLevel);
board.updateLedsBasedOnLight();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.err.format(
"Sleep interruption: %s",
e.toString());
}
}
}
}
このクラスには、mainメソッドが宣言されています。
プロジェクトをボ
ードにアップロードして起動すると、
このクラスが実行されます。最初
に、
ローカル変数lastLightLevelが空文字列で初期化され、boardと
いう名前の、BoardManagerクラスのインスタンスが作成されます。
次に、
メソッドは無限ループに入ります。
ループの中では、board.lightSensor.measureLightメソ
ッドが呼び出され、環境光の計測値が更新されます。次の行で
は、board.lightSensor.getLightLevelを呼び出して取得した光
レベルの説明を、newLightLevelローカル変数に保存していま
す。新しい光レベルが最後に記録された環境光レベルと異なる場
合、lastLightLevel変数の値を更新し、計測された光レベルを出力し
て、board.updateLedsBasedOnLightメソッドを呼び出します。
この例を実行し、懐中電灯やスマートフォンを使ってフォトレジ
スタに当てる光を変えてみてください。
メッセージの出力が確認さ
れ、RGBが暗くなって最終的に消灯するはずです。環境光が暗くなる
と、RGB LEDは明るくなります。
図2は、IDEのコンソール・ウィンドウに表示される出力の例で
す。
コンソール・ウィンドウには、
コードから出力されたすべてのメッ
セージが表示されます。
そのため、各部品で何が起きているのかを簡
単に理解できます。
13
//internet of things /
Listening for transport dt_socket at address: 8009
Red LED connected to PWM Pin #6 set to brightness level 0.
Green LED connected to PWM Pin #5 set to brightness level 0.
Blue LED connected to PWM Pin #3 set to brightness level 0.
Measured light level: Extremely dark
Red LED connected to PWM Pin #6 set to brightness level 255.
Green LED connected to PWM Pin #5 set to brightness level 255.
Blue LED connected to PWM Pin #3 set to brightness level 255.
Measured light level: Extremely dark
Red LED connected to PWM Pin #6 set to brightness level 128.
Green LED connected to PWM Pin #5 set to brightness level 128.
Blue LED connected to PWM Pin #3 set to brightness level 128.
図2:コンソール・メッセージ
まとめ
今回の簡単な例では、Java SE 8を活用してIntel Galileo Gen 2ボード
上のIoTコンポーネントとやり取りする高水準のコードを作成する例
を示しました。mraaライブラリやupmライブラリは定期的に更新され
ています。
この2つとJavaを組み合わせることによって、既存の知識を
活用しつつ、多様な入力、出力、
センサー、
ディスプレイ、
アクチュエー
タと連携するIoTプロジェクトを簡単に進めることができるようになり
ます。</article>
Gastón Hillar(@gastonhillar)
:Javaが初めてリリー
スされた頃からソフトウェア・アーキテクトとして働い
ており、
ソフトウェアの設計、開発に関する20年の経
験を有する。
ソフトウェア開発、ハードウェア、電子工
学、Internet of Thingsに関する多くの著書がある。
learn more
//java proposals of interest /
注目のJDK強化提案
JEP 293:コマンドライン・
オプションの形式の改定
この最新の強化提案は、
コマンドラインから実行されるJDKツー
ルに引数を渡す構文の共通化を提案するものです。
ドキュメント
で指摘されているように、現在のJDKツールではスイッチの表記
規則が共通化されていません。たとえば、ほとんどの読者はすべて
のツールで一貫性のあるヘルプ・コマンドを望むでしょうが、現在
は、-?、-help、--helpなど、ツールによって異なっています。
JEP 293は、主に今後のコマンドラインJDK製品での統一を
提唱するものです。有用であるとして、
このJEPで採用が提案され
ている形式は、一連のGNU構文表記規則です。
この規則の大部分
は、getopt(3)に記述されています。
これらの表記規則は、1つのハ
イフンと1文字(組み合わせ可能)のオプションに加え、いわゆる
「長
い」オプションとして2つのハイフンを使うものです。
この方式は、多
くのユーザーにとっておなじみであり、構文を解析しているライブ
ラリがすでに存在するため、
もっとも好ましいと考えられています。
とはいえ、特殊性(-Wが予約されている)による悪影響や、POSIX構
文との競合が発生する部分もあります。
もちろん、
この種の意見交
換、つまりコミュニティでのJDKの変更に関する議論を求める部分
こそ、
まさにこれらのJEPのポイントです。
この提案では、既存ツールのオプションの変更は提案されて
いません。そのため、互換性が失われる予定はありません。
しかし、
新しいリリースでは、すべてのツールにおいて、合意された構文を
サポートすることが推奨され、やがて既存のツールもそれに準拠す
るように重複したスイッチが導入される可能性があります。
Yocto ProjectのYocto Poky Linuxイメージ
Intel System Studio IoT Edition User Guide for Java
14
ORACLE.COM/JAVAMAGAZINE /////////////////// SEPTEMBER/OCTOBER 2016
Fly UP