android things “hello world” on Raspberry Pi3の続きで、GPIOに対する入出力です。
配線
公式に載っているように配線します。
- https://developer.android.com/things/sdk/pio/gpio.html
- 単純な入出力のサンプルがあります https://github.com/androidthings/sample-simplepio
21番を入力、6番を出力に設定して行きます。
ポートOpen
GPIOのリストを調べると、
1 2 |
PeripheralManagerService service = new PeripheralManagerService(); List<String> gpioList = service.getGpioList(); |
名前が以下の様に取得できるので、この名前を使ってポートをオープンする。
1 |
[BCM12, BCM13, BCM16, BCM17, BCM18, BCM19, BCM20, BCM21, BCM22, BCM23, BCM24, BCM25, BCM26, BCM27, BCM4, BCM5, BCM6] |
1 2 3 |
PeripheralManagerService manager = new PeripheralManagerService(); Gpio mGpio21 = manager.openGpio("BCM21"); Gpio mGpio6 = manager.openGpio("BCM6"); |
入力ポート設定
公式の「reading from an input」にある様に、
ポートの方向を setDirection() で「入力」にして、 setActiveType() でHi / Lo のどちらでtrueになるかを設定する。
1 2 3 4 5 6 7 8 9 10 |
public void configureInput(Gpio gpio) throws IOException { // Initialize the pin as an input gpio.setDirection(Gpio.DIRECTION_IN); // Low voltage is considered active gpio.setActiveType(Gpio.ACTIVE_LOW); // Register for all state changes gpio.setEdgeTriggerType(Gpio.EDGE_BOTH); gpio.registerGpioCallback(mGpioCallback); } |
その後、 setEdgeTriggerType() で入力が Hi/Lo どちらに変化したら通知するかを決めて、registerGpioCallback() で入力の変化を通知してもらう割込のコールバックを設定する。
ここでは Hi/Lo 両方を通知してもらうように設定。
割込み関数は以下の様な感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
private GpioCallback mGpioCallback = new GpioCallback() { @Override public boolean onGpioEdge(Gpio gpio) { // Read the active low pin state try { if (gpio.getValue()) { // Pin is LOW Log.d(TAG, "pin is low :val="+gpio.getValue()); } else { // Pin is HIGH Log.d(TAG, "pin is high :val="+gpio.getValue()); } } catch (IOException e) { e.printStackTrace(); } // Continue listening for more interrupts return true; } @Override public void onGpioError(Gpio gpio, int error) { Log.w(TAG, gpio + ": Error event " + error); } } |
コールバックは onStop() で登録抹消されるようにしておく。
1 2 3 4 5 6 |
@Override protected void onStop() { super.onStop(); // Interrupt events no longer necessary mGpio21.unregisterGpioCallback(mGpioCallback); } |
出力
入力と同様にポートの方向とACTIVE_HIGH/ACTIVE_LOWを設定する。
1 2 3 4 5 6 |
public void configureOutput(Gpio gpio) throws IOException { // Initialize the pin as a high output gpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_HIGH); // Low voltage is considered active gpio.setActiveType(Gpio.ACTIVE_LOW); } |
設定したポートに対して setValue() で Hi/Lo を制御する。
1 2 |
gpio6.setValue(true); gpio6.setValue(false); |
実行例
スイッチを押すと入力ポートがtrueになり、そのタイミングで出力ポートにtrueを設定しているだけの例です。