Java ME Embedded 8を使ったGPIOを操作するアプリケーション開発(1/2)

以前ブログにて紹介した、Java ME Embedded 8を使ったM2Mアプリケーション開発の記事をご覧いただけたでしょうか。今回はJava ME Embedded 8を使ったGPIOを操作するアプリケーションの開発手順をご紹介したいと思います。

概要

デスクトップ開発環境を利用してGPIOを操作するJava ME Embedded 8のアプリケーションを作成します。
スイッチボタン(入力)とLED(出力)はGPIOで接続していて、作成したアプリケーションを実行すると、ボタンを押すたびにLEDの状態を変更します。

ハードウェア要件

利用したハードウェアは以下になります。

  • Raspberry Pi Model B Revision 2.0 (512 MB)
  • ブレッドボード
  • ブレッドボードワイヤ
  • プッシュボタン(モーメンタリ、4ピン推奨)
  • LED(2.2V 順電圧、20mA推奨)
  • 10KΩ抵抗(プッシュボタン用)
  • 560Ω抵抗(LED用)

事前準備

開発環境の構築です。詳細は以下の記事を参考にしてください。
本記事ではRaspberry Piは利用しませんが、あわせて構築しておくことをおすすめします。

GPIOを利用するJava ME Embeddedプロジェクトの作成

NetBeansを使用してプロジェクトを作成し、Windowsエミュレータを使用して、ローカルでテストします。

NetBeansでのJava ME Embeddedプロジェクトの作成

  1. NetBeansを起動し、ファイル > 新規プロジェクトを選択します。
  2. カテゴリJava ME EmbeddedプロジェクトJava ME Embeddedアプリケーションを選択し、次 >をクリックします。
  3. 新規Java ME Embeddedアプリケーションウィンドウで以下のように変更し、終了をクリックします。
    • プロジェクト名にTestGPIOと入力
    • デバイスはEmbeddedDevice1を選択
    • MIDletの作成にcom.example.GPIOIMletと入力

GPIOPinTestクラスの追加と実装

GPIOPinTestクラスは入力ピン(プッシュボタン)での変更をし、出力端子(LED)の状態を変更する

  1. com.exampleを右クリック、新規 > Javaクラスを選択します。
  2. クラス名GPIOPinTestと入力し、終了をクリックします。
  3. PinListenerインターフェースを実装するクラスを変更します。

    public class GPIOPinTest implements PinListener {

    }


  4. クラス内にボタン(入力)とLED(出力)で利用するGPIO端子のクラスフィールドを記入します。

      // Emulator Pin values
      private static final String LED1 = "LED 1";
      private static final int LED1_ID = 1;
      private static final int Button_Port = 0;
      private static final int Button_Pin = 0;
      private GPIOPin led1;
      private GPIOPin button1;

  5. startメソッドではボタンとLEDコンポーネントを初期化します。以下のメソッドをクラス内に記入します。

      public void start() throws IOException {
        // Open the LED pin (Output)
        led1 = (GPIOPin) DeviceManager.open(LED1_ID);
        // Config file for the button - trigger on a rising edge (from low to high)
        GPIOPinConfig config1 = new GPIOPinConfig(Button_Port, Button_Pin, GPIOPinConfig.DIR_INPUT_ONLY, DeviceConfig.DEFAULT, GPIOPinConfig.TRIGGER_BOTH_EDGES, false);

        // Open the BUTTON pin (Input)
        button1 = (GPIOPin) DeviceManager.open(config1);

        // Add this class as a pin listener to the buttons
        button1.setInputListener(this);

        // Turn the LED on, then off - this tests the LED
        led1.setValue(true);
        try {
          Thread.sleep(1000);
        } catch (InterruptedException ex) {
        }
        // Start the LED's off (false)
        led1.setValue(false);
      }

  6. stopメソッドではボタンとLEDリソースをクローズします。以下のメソッドをクラス内に記入します。

      public void stop() throws IOException {
        if (led1 != null) {
          led1.setValue(false);
          led1.close();
        }
        if (button1 != null) {
          button1.close();
        }
      }

  7. valueChangedメソッドは入力ピン(ボタン)の状態が変化したときに呼び出されます。以下のメソッドをクラス内に記入します。

      @Override
      public void valueChanged(PinEvent event) {
        GPIOPin pin = (GPIOPin) event.getDevice();

        // Simple one button = one LED
        try {
          if (pin == button1) {
            System.out.println("setting led1" );
            led1.setValue(!led1.getValue()); // Toggle the value of the led

          }
        } catch (IOException ex) {
          System.out.println("IOException: " + ex);
        }
      }

  8. Ctrl + Shift + Iを押し、必要なインポート文を追加します。

GPIOIMletクラスの実装

  1. GPIOIMletクラスに次のクラスフィールドを追加します。

      private GPIOPinTest pinTest;

  2. startAppメソッドはIMletが一時停止から起動中に状態が変化したときに呼び出されます。NetBeansが生成したstartAppメソッドを以下のコードに書き換えます。

      @Override
      public void startApp() {
        pinTest = new GPIOPinTest();
        try {
          pinTest.start();
        } catch (IOException ex) {
          System.out.println("IOException: " + ex);
          notifyDestroyed();
        }
      }

  3. NetBeansが生成したpauseAppメソッドを削除します。
  4. destroyAppメソッドはIMletが実行中または一時停止から破棄された状態に変化したときに呼び出されます。NetBeansが生成したdestroyAppメソッドを以下のコードに書き換えます。

      @Override
      public void destroyApp(boolean unconditional) {
        try {
          pinTest.stop();
        } catch (IOException ex) {
          System.out.println("IOException: " + ex);
        }
      }

  5. Ctrl + Shift + Iを押し、必要なインポート文を追加します。

API権限の設定

Device Access APIへのアクセスを必要とするアプリケーションでは、JADファイル内に適切な権限を設定する必要があります。 以下の手順で権限を付与します。

  1. TestGPIOプロジェクト上で右クリックし、プロパティを選択します。
  2. [プロジェクト・プロパティ]ウィンドウで、カテゴリからアプリケーション・ディスクリプタを選択し、API権限タブの追加をクリックします。
  3. [APIの権限の追加]ウィンドウで、以下の手順で権限の追加を行います。
    1. 権限プルダウンでjdk.dio.DeviceMgmtPermissionを選択
    2. 保護されたリソース名に*:*を入力
    3. 要求されたアクションにopenを入力
    4. OKをクリック
  4. 3.同様、以下の手順で権限の追加を行います。
    1. 権限プルダウンでjdk.dio.gpio.GPIOPinPermissionを選択
    2. 保護されたリソース名に*:*を入力
    3. 要求されたアクションにopenを入力
    4. OKをクリック
  5. 3.同様、以下の手順で権限の追加を行います。
    1. 権限プルダウンでjdk.dio.gpio.GPIOPortPermissionを選択
    2. 保護されたリソース名に*:*を入力
    3. 要求されたアクションにopenを入力
    4. OKをクリック
  6. OKをクリックします。

Windowsエミュレータ上での実行とテスト

  1. TestGPIOプロジェクトを右クリックし、実行を選択します。

    エミュレータが起動し、IMletが実行状態で表示されます。
  2. GPIOピンタブをクリックし、現在のピン状態のビューを開きます。
    LED 1BUTTON 1のオープンカラムが排他的となっていることを確認してください。

  3. 外部イベントの作成アイコンをクリックします。
  4. 外部イベントの作成画面のGPIOタブをクリックします。
  5. BUTTON 1をクリックします。(ボタンのラベルは、現在の状態を示していて、低はオフの状態を示しています。)

    ボタンのラベルが[高]に変わります。

    ボタンが[高]に変化したので、LED 1の値が[高]に変わります。

  6. 再びBUTTON 1をクリックすると、LED 1の値が[低]に変わります。

次回はエミュレータ上で動作したアプリケーションをRaspberry Pi上で動作させます。

Comments:

Post a Comment:
  • HTML Syntax: NOT allowed
About

日本オラクルのエンベデッドJavaチームから、最新情報をお送りしていきます。

Search

Archives
« 3月 2015
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    
       
Today