2017年11月12日日曜日

Android Things をやってみよう - Peripheral 操作編

Peripheral の操作は PeripheralManagerService を使って行います。

GPIO の名前の一覧は PeripheralManagerService.getGpioList() で取得できます。
  1. val pioService = PeripheralManagerService()  
  2. for (name in pioService.gpioList) {  
  3.     Log.d(TAG, "gpio : $name")  
  4. }  
実行結果
  1. gpio : GPIO_10  
  2. gpio : GPIO_128  
  3. gpio : GPIO_172  
  4. gpio : GPIO_173  
  5. gpio : GPIO_174  
  6. gpio : GPIO_175  
  7. gpio : GPIO_32  
  8. gpio : GPIO_33  
  9. gpio : GPIO_34  
  10. gpio : GPIO_35  
  11. gpio : GPIO_37  
  12. gpio : GPIO_39  


PeripheralManagerService.openGpio() で GPIO を開きます。戻り値は Gpio です。引数には getGpioList() で取得した名前を指定します。
  1. val ledPin = pioService.openGpio(name)  

GPIO は General-purpose input/output のことで、GPIO pin はソフトウェアからコントロールできる集積回路上の物理的ピンです。GPIO pin は入力として使って電圧値を読んだり、出力として使って電圧値を変えたりできます。

扱えるのは論理値(true / false)のみで、low value(ピンがグラウンドと同じ電圧値)と high value(ピンが IOREF と同じ電圧値)が論理値にマッピングされます。論理値と high/low のマッピング(true が high/low どちらに対応するか)は設定で変えることができます。

GPIO pin を開くということは、システム全体でこのピンに対するオーナシップを取るということです。これにより close() が呼ばれるまで他から GPIO を開いたりアクセスしたりするのを防ぎます。close() を呼ぶのを忘れると、同じプロセス・アプリに関係なくどこからも GPIO が使えなくなるので注意が必要です。


論理値と high/low のマッピングは Gpio.setActiveType() で指定します。
true に high を対応させるときは Gpio.ACTIVE_HIGH を、true に low を対応させるときは Gpio.ACTIVE_LOW を指定します。
  1. ledPin.setActiveType(Gpio.ACTIVE_HIGH)  

ピンの方向(入力 or 出力)は Gpio.setDirection() で指定します。
ピンを入力として使うときは Gpio.Gpio.DIRECTION_IN を指定します。出力として使うときは、初期状態を high にするときは Gpio.DIRECTION_OUT_INITIALLY_HIGH を初期状態を low にするときは Gpio.DIRECTION_OUT_INITIALLY_LOW を指定します。
  1. ledPin.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW)  

値が変わったときのトリガーのタイミングを Gpio.setEdgeTriggerType() で指定することができます。
ピンを出力として使うときはトリガーの必要がないので Gpio.EDGE_NONE を指定します。
ピンを入力として使う場合、立ち上がり時(low から high になったとき)だけトリガーさせるなら Gpio.EDGE_RISING を指定します。立ち下がり時(high から low になったとき)だけトリガーさせるなら Gpio.EDGE_FALLING を指定します。立ち上がり、立ち下がり両方トリガーさせるなら Gpio.EDGE_BOTH を指定します。
  1. ledPin.setEdgeTriggerType(Gpio.EDGE_NONE)  

現在の値を変更するときは Gpio.setValue() を使います。このメソッドはピンが出力として設定されているときだけ使うことができます。
  1. ledPin.value = isChecked  

現在の値を読むときは Gpio.getValue() を使います。このメソッドはピンが入力として設定されているときだけ使うことができます。
  1. val value = ledPin.value  

ピンの値が変わった時にコールバックを受け取るには Gpio.registerGpioCallback()GpioCallback を登録します。登録した GpioCallback は Gpio.unregisterGpioCallback() で登録解除します。
  1. private val callback: GpioCallback = object : GpioCallback() {  
  2.     override fun onGpioEdge(gpio: Gpio?): Boolean {  
  3.         Log.d(TAG, "onGpioEdge: ${gpio?.name}, ${gpio?.value}")  
  4.         return true  
  5.     }  
  6.   
  7.     override fun onGpioError(gpio: Gpio?, error: Int) {  
  8.         super.onGpioError(gpio, error)  
  9.         /** error : [android.system.OsConstants] */  
  10.         Log.d(TAG, "onGpioError: ${gpio?.name}, $error")  
  11.     }  
  12. }  
  13.   
  14. override fun onCreate(savedInstanceState: Bundle?) {  
  15.     ...  
  16.     ledPin.registerGpioCallback(callback)  
  17. }  
  18.   
  19. override fun onDestroy() {  
  20.     super.onDestroy()  
  21.   
  22.     try {  
  23.         ledPin.unregisterGpioCallback(callback)  
  24.         ledPin.close()  
  25.     } catch (e: IOException) {  
  26.         Log.e(TAG, "Error closing GPIO", e)  
  27.     }  
  28. }  

0 件のコメント:

コメントを投稿