Java ME 8 + Raspberry Pi +センサー=IoT World(パート1)
センサーをRaspberryPiに接続し、Javaで制御する方法を学びます。
2014年9月公開
Java ME 8の最新リリースには、LED、リレー、LCD、センサー、モーター、スイッチなどのデバイスを制御するための強力なAPIが含まれています。
この記事は、汎用入出力(GPIO)、集積回路間バス(I2C)、シリアルペリフェラルインターフェイスバス(SPI)を使用して電子センサーをRaspberryPiモデルBに接続する方法に関する3部構成のシリーズの最初の記事です。 、またはユニバーサル非同期レシーバ/トランスミッタ(UART)インターフェイス。
Java ME 8を使用して、さまざまなタイプのインターフェイスを備えたデバイスを制御し、デバイスをRaspberry Piに接続することで、モノのインターネット(IoT)の世界を作成できます。
この記事では、GPIOの使用に焦点を当て、Java ME8で可能なクラスを開発する方法の例を示します
- DFRobot火炎センサー(モデルDFR0076)を使用して火炎を検出します
- HC-SR501パッシブ赤外線(PIR)モーションディテクターを使用して動きを検出します
- HC-SR04超音波測距モジュールを使用して距離を測定する
注 :このNetBeans IDE8.0プロジェクトの完全なサンプルコードはここからダウンロードできます。
デバイスI / O API
デバイスI / O API仕様は、小さな組み込みデバイスで実行されるJavaアプリケーション用の汎用周辺機器I / OAPIを定義します。以下を含む、最も一般的な周辺機器のAPIを定義します。
- GPIOデバイス
- I2Cデバイス
- SPIデバイス
- アナログ-デジタルコンバーター(ADC)
- デジタル-アナログコンバーター(DAC)
- UARTデバイス
- メモリマップドI / O(MMIO)デバイス
- ATコマンドデバイス
- ウォッチドッグタイマー
- パルスカウンター
- パルス幅変調(PWM)ジェネレーター
- 汎用デバイス
作成する回路
GPIOデバイスは、デジタル入力またはデジタル出力のいずれかとして使用でき、無効または有効にでき、「割り込み」ラインを駆動するために使用できます。ただし、非常に重要な考慮事項は、すべてのRaspberry PiGPIOピンが3.3Vで動作することです。したがって、接続するデバイスの技術仕様をチェックして、3.3Vと5Vのどちらを使用しているかを判断することが非常に重要です。 、このようなロジックレベルコンバータを使用する必要があります。
火炎検出器の接続
DFRobotのDFR0076火炎センサーを使用して、約760 nm〜1100nmの火災またはその他の波長の光を検出できます。 3.3Vまたは5Vに接続でき、検出範囲は約20cm(4.8V)〜100cm(1V)です。火災が検出されると、信号ピンが引き上げられます。
図3に示すように、火炎センサーをRaspberryPiの3.3V、Gnd、およびGPIO 22ピンに接続し、火炎検出器センサー制御用のJava ME8クラスを作成しましょう。
まず、クラス DFR0076Device
を作成します デバイスアクセスAPIを使用し、変数 pin
を定義します リスト1に示すように、GPIOへのインターフェースをサポートします。
public class DFR0076Device {private GPIOPin pin =null; //火炎センサー制御用のピンを定義します
リスト1.火炎検出器センサー制御のクラス
次に、 DeviceManager
を使用してGPIO22ピンを初期化およびアクティブ化するクラスコンストラクターを作成します APIと GPIOPinConfig
クラス(リスト2を参照)を使用して、次の条件を確立します。
- デバイス名:0
- ピン番号:GPIO 22(
pinGPIO
で指定) ) - 方向:入力のみ
- モード:プルアップ
- トリガー:立ち上がりエッジ
- 初期値:false
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)); ...}
リスト2.初期条件の確立
次に、リスト3に示すように、火炎検出イベントをサポートする定義済みのリスナークラスを受け取るメソッドを作成します。
public void setListener(PinListener FlameListener){... if(pin!=null)pin.setInputListener(flameListener); ...}
リスト3.火炎検出イベントをサポートする方法
リスト4に示すように、完了したらピンを閉じ、ピンリスナーを解放することも重要です。
public void close(){... if(pin!=null){pin.setInputListener(null); pin.close(); } ...}
リスト4.ピンを閉じてリスナーを解放する
次に、リスト5に示すように、コードを呼び出し、火炎検出イベントを処理するためのリスナークラスを定義するメインMIDletを作成します。
public class TestSensors extends MIDlet {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;クラスFlameSensorはPinListenerを実装します{publicvoid valueChanged(PinEvent event){if(event.getValue()&&--waitnext ==0){System.out.println( "WARNING Flamedetected !!!"); waitnext =10; }}}}
リスト5.コードを呼び出すためのMIDletの作成
モーションディテクターの接続
それでは、モーション検出機能を TestSensors
に追加しましょう。 MIDlet。そのためには、図2に示すHC-SR501などのモーションセンサーが必要です。
PIRセンサーを使用すると、動きを感知できます。すべてが少量の赤外線を放射し、何かが高温になるほど、より多くの放射を放射します。 PIRセンサーは、検出ゾーン内で発生するIRレベルの変化を検出できるため(たとえば、人間が部屋に入ったとき)、動きを感知できます。
使用するPIRセンサーには、アース、デジタル出力、3〜5 Vdc入力の3つのピンがあります。アイドル状態では、動きが検出されない場合、デジタル出力信号はローのままになります。ただし、モーションが検出されると、デジタル出力信号はパルスハイ(3.3 V)になります。デジタル出力ピンをRaspberryPiに直接接続しても問題ありません。
テスト用に、PIRセンサーにはジャンパーがあります(図4を参照)。
- ジャンパーを「L」の位置に設定すると、単一の(繰り返し不可能な)トリガーが作成されます。ジャンパーがこの位置にある場合、検知イベントが発生した後に検知が有効になり、連続的な動きの検出が可能になります。動きが検出されなくなった後も、出力は3秒間ローにラッチされます。
- ジャンパーを「H」の位置に設定すると、繰り返し可能なトリガーが作成されます。ジャンパーが「H」(デフォルト)の位置に設定されている場合、検知イベントが発生した後(つまり、出力がハイになると)、検知は無効になります。
次の調整を行うことができます:
- 感度ポテンショメータを時計回りに調整すると、検出距離が約7メートルに増加します。反時計回りに調整すると、検知距離が約3メートルに減少します。
- 時間遅延ポテンショメータを時計回りに調整すると、誘導遅延が300秒に長くなります。反時計回りに調整すると、誘導遅延が5秒に短縮されます。
図3に示すように、PIRセンサーをRaspberry Pi 5 V、Gnd、およびGPIO 24ピンに接続し、Java ME8クラス HCSR501Device
を作成しましょう。 リスト6に示すように、Device AccessAPIを使用して制御します。
public class HCSR501Device {private GPIOPin pin =null;
リスト6. HCSR501Device
クラス
次に、 DeviceManager
を使用してGPIO24ピンを初期化およびアクティブ化するクラスコンストラクターを作成します。 APIと GPIOPinConfig
クラス(リスト7を参照)を使用して、次の条件を確立します。
- デバイス名:0
- ピン番号:GPIO 24(
pinGPIO
で指定) ) - 方向:入力のみ
- モード:プルダウン
- トリガー:立ち上がりエッジ
- 初期値:false
- PIRを初期化する前に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); // 3秒待ちます...}
リスト7.初期条件の確立
次に、リスト8に示すように、モーション検出イベントをサポートする定義済みのリスナークラスを受け取るメソッドを作成します。
public void setListener(PinListener pirListener){... if(pin!=null)pin.setInputListener(pirListener); ...}
リスト8.モーション検出イベントをサポートする方法
完了したらピンを閉じることも重要です。また、リスト9に示すように、ピンリスナーを解放することも重要です。
public void close(){... if(pin!=null){pin.setInputListener(null); pin.close(); } ...}
リスト9.ピンを閉じてリスナーを解放する
リスト10に示すように、MIDletクラスを拡張してPIRセンサーとそのリスナーをサポートしましょう。
// HCSR501デバイスオブジェクトの定義HCSR501Devicepir; private static final int MOTION_DETECTOR_PIN =24; @Overridepublic void startApp(){... // PIRセンサーの初期化pir =new HCSR501Device(MOTION_DETECTOR_PIN); pir.setListener(new PirSensor()); ...} @Overridepublic void destroyApp(boolean unconditional){... pir.close(); ...} //モーション検出クラスのPIRセンサーを確認するPirSensorはPinListenerを実装します{@Override public void valueChanged(PinEvent event){if(event.getValue()){System.out.println( "警告モーションが検出されました!!!"); }}}
リスト10.PIRセンサーとそのリスナーをサポートするためにMIDletクラスを拡張する
詳細:Java ME 8 + Raspberry Pi +センサー=IoT World(パート1)
製造プロセス
- Java Hello World プログラム
- Raspberry Piのマルチチャネルプロフェッショナルデータロガー–パート1
- IoT 101プロジェクト:RaspberryPiからのストリーム温度
- 1つのGPIOピンでアナログセンサーを読み取る
- RaspberryPiにアナログ入力のないアナログセンサー
- Raspberry Pi 1-Wireデジタル温度計センサー(DS18B20)
- Java ME 8 + Raspberry Pi +センサー=IoT World(パート1)
- JAVAのRaspberryPiデジタルホールセンサー
- RaspberryPiセンサー
- RaspberryPiを使用して自宅の温度を監視します
- MCP3008を使用したRaspberryPiのアナログセンサー