Java ME 8でRaspberry Pi上のIoTを構築: パート1 - GPIOセンサー統合
Java ME 8を使用してRaspberry Pi上のセンサーを接続・制御する方法を発見し、強力なIoT機能を解き放ちます。
2014年9月公開
Java ME 8の最新リリースは、LED、リレー、LCD、センサー、モーター、スイッチの制御を簡素化する堅牢なDevice I/O APIを導入しました。
この記事は、GPIO、I²C、SPI、UARTインターフェースを通じてRaspberry Pi Model Bと電子センサーを統合する3部構成シリーズの始まりです。
これらのインターフェースを通じてデバイスを駆動するJava ME 8を活用することで、完全に機能するIoTエコシステムを構築できます。
この号ではGPIOに焦点を当て、以下のセンサー用のすぐに使用できるJava ME 8クラスを提供します:
- DFRobot DFR0076炎センサーでの炎検知
- HC-SR501 PIRセンサーでの動き検知
- HC-SR04超音波モジュールでの距離測定
注: すべてのソースファイルを含む完全なNetBeans IDE 8.0プロジェクトはこちらからダウンロードできます。
Device I/O APIの概要
Device I/O API仕様は、組み込みプラットフォーム上のJavaアプリケーション向けの汎用ペリフェラルI/Oインターフェースを定義します。以下の一般的なデバイスをカバーします:
- GPIO、I²C、SPI、UART
- ADCとDAC
- メモリマップドI/O
- ATコマンドモジュール
- ウォッチドッグタイマーとパルスカウンター
- PWMジェネレーターと汎用デバイス
重要な回路考慮事項
すべてのRaspberry Pi GPIOピンは3.3Vで動作します。センサーを接続する前に、その電圧要件を確認してください。デバイスが5Vを期待する場合、ロジックレベルコンバーター(例: BSS138 MOSFETベースのシフター)を使用して信号を安全に変換してください。
炎検知器の接続
DFR0076炎センサーは、約760nm〜1100nmの波長の光を検知し、検知範囲は20〜100cmです。炎が存在すると、その信号ピンがハイになります。
図3に示すように、センサーをPiの3.3V、GND、GPIO 22に配線し、それを制御するJava ME 8クラスを作成します。
リスト1 - DFR0076Deviceクラス
public class DFR0076Device {
private GPIOPin pin = null; // 炎センサー制御用ピン
}
リスト2 - GPIOピンの初期化
public DFR0076Device(int pinGPIO) {
pin = (GPIOPin) DeviceManager.open(new GPIOPinConfig(
0, pinGPIO, GPIOPinConfig.DIR_INPUT_ONLY,
GPIOPinConfig.MODE_INPUT_PULL_UP,
GPIOPinConfig.TRIGGER_RISING_EDGE, false));
}
リスト3 - リスナー登録
public void setListener(PinListener flameListener) {
if (pin != null) {
pin.setInputListener(flameListener);
}
}
リスト4 - リソースクリーンアップ
public void close() {
if (pin != null) {
pin.setInputListener(null);
pin.close();
}
}
リスト5 - 炎センサーを使用するMIDlet
public class TestSensors extends MIDlet {
private DFR0076Device flame;
private static final int FLAME_DETECTOR_PIN = 22;
public void startApp() {
flame = new DFR0076Device(FLAME_DETECTOR_PIN);
flame.setListener(new FlameSensor());
}
public void destroyApp(boolean unconditional) {
flame.close();
}
private static int waitNext = 1;
private class FlameSensor implements PinListener {
public void valueChanged(PinEvent event) {
if (event.getValue() && --waitNext == 0) {
System.out.println("WARNING Flame detected!!!");
waitNext = 10;
}
}
}
}
動き検知器の接続
動き検知時に3.3Vパルスを出力するHC-SR501 PIRセンサーを統合します。センサーの3ピンはGND、VCC(3-5V)、デジタル出力です。
PIRの感度と遅延をポテンショメーターで調整し、ジャンパーを「L」(単発トリガー)または「H」(繰り返しトリガー)に設定します。
PIRを5V、GND、GPIO 24に配線し、専用のHCSR501DeviceクラスでMIDletを拡張します。
リスト6 - HCSR501Deviceクラス
public class HCSR501Device {
private GPIOPin pin = null;
}
リスト7 - 3秒遅延付きピン初期化
public HCSR501Device(int pinGPIO) {
pin = (GPIOPin) DeviceManager.open(new GPIOPinConfig(
0, pinGPIO, GPIOPinConfig.DIR_INPUT_ONLY,
GPIOPinConfig.MODE_INPUT_PULL_DOWN,
GPIOPinConfig.TRIGGER_RISING_EDGE, false));
I2CUtils.I2Cdelay(3000); // センサー安定化待機
}
リスト8 - 動きリスナー登録
public void setListener(PinListener pirListener) {
if (pin != null) {
pin.setInputListener(pirListener);
}
}
リスト9 - クリーンアップ
public void close() {
if (pin != null) {
pin.setInputListener(null);
pin.close();
}
}
TestSensors MIDletを拡張して動きイベントを処理:
リスト10 - PIRサポート付きMIDlet
// PIRセンサーを初期化
private HCSR501Device pir;
private static final int MOTION_DETECTOR_PIN = 24;
@Override
public void startApp() {
pir = new HCSR501Device(MOTION_DETECTOR_PIN);
pir.setListener(new PirSensor());
}
@Override
public void destroyApp(boolean unconditional) {
pir.close();
}
private class PirSensor implements PinListener {
public void valueChanged(PinEvent event) {
if (event.getValue()) {
System.out.println("WARNING Motion detected!!!");
}
}
}
詳細については、完全シリーズを参照: Java ME 8 + Raspberry Pi + Sensors = IoT World (Part 1)。
製造プロセス
- Raspberry Piマルチチャネルデータロガー構築 – パート1:要件 & アーキテクチャ
- 初心者向けIoTチュートリアル:Raspberry Piから温度データをストリーミング
- Raspberry Piで単一GPIOピンを使ってアナログセンサーを測定
- ネイティブADCなしでRaspberry Pi上のアナログセンサーを測定
- DS18B20ワンワイヤーデジタル温度計をRaspberry Piに接続 - ステップバイステップガイド
- Java ME 8でRaspberry Pi上のIoTを構築: パート1 - GPIOセンサー統合
- Raspberry Piでリニアホールセンサーを読み取り: JavaガイドとADC0832の知見
- Raspberry Piセンサーをマスター: 電子工学と通信プロトコルの実践ガイド
- Raspberry Piダッシュボードで家庭の温度を監視する
- MCP3008 ADCでRaspberry Piにアナログセンサーを読み取る
- Java Hello World:最初のプログラム