Androidプログラマへの道 〜 Moonlight 明日香 〜 - GPIOピンの状態変化を待つ

Android Things

GPIOピンの状態変化を待つには, GpioCallbackクラスを利用する.

状態変化を待つ

  • GpioActivity.java
    • Gpio#setEdgeTriggerTypeメソッドで, トリガー条件を設定する.
意味
EDGE_NONE値の変化を検知しない
EDGE_RISINGLow->Highへの状態変化を検知
EDGE_FALLINGHigh->Lowへの状態変化を検知
EDGE_BOTHLow->HighまたはHigh->Lowへの状態変化を検知
    • Gpio#registerGpioCallbackメソッドで, コールバック関数を登録する.
    • 状態変化を検知したら, コールバック関数がコールされる.
    • 状態変化の検知が不要になった場合, コールバック関数の登録を解除する.
package com.moonlight_aska.androidthings.gpio;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import com.google.android.things.pio.Gpio;
import com.google.android.things.pio.GpioCallback;
import com.google.android.things.pio.PeripheralManagerService;
import java.io.IOException;

public class GpioActivity extends Activity {
  private static final String TAG = "GpioActivity";
  private static final String PIN_NAME = "BCM21";
  private Gpio mGpio;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    PeripheralManagerService manager = new PeripheralManagerService();
    try {
      // ピン指定
      mGpio = manager.openGpio(PIN_NAME);
      // 入力ピンに設定
      mGpio.setDirection(Gpio.DIRECTION_IN);
      // HighをACTIVEに設定
      mGpio.setActiveType(Gpio.ACTIVE_HIGH);
      // 検知する状態変化を設定
      mGpio.setEdgeTriggerType(Gpio.EDGE_RISING);
      // コールバック登録
      mGpio.registerGpioCallback(mGpioCallback);
    } catch (IOException e) {
      Log.e(TAG, "Error on PeripheralIO API", e);
    }
  }

  // コールバック関数
  private GpioCallback mGpioCallback = new GpioCallback() {
    @Override
    public boolean onGpioEdge(Gpio gpio) {
      Log.d(TAG, "Edge rising.");
      return true;
    }
  };

  @Override
  protected void onDestroy() {
    super.onDestroy();

    try {
      if (mGpio != null) {
        // コールバック登録解除
        mGpio.unregisterGpioCallback(mGpioCallback);
        mGpio.close();
      }
    } catch (IOException e) {
      Log.e(TAG, "Error on PeripheralIO API", e);
    } finally {
      mGpio = null;
    }
  }
}
  • 動作例
ボード:Raspberry Pi 3