2017-06-02 11 views
1

GPIO(出力)が非常に短い(10u)パルスを生成し、別のGPIO(入力)を介してそのパルスを読み取ろうとしている、非常に簡単なセットアップアンドロイドの設定があります。GpioCallbackは、「false」を2回連続して登録できますか?

しかし、私のログは私を夢中にしています:どうすれば2つの「偽」の読みを連続して得ることができますか?私はライトスイッチを持っている場合、私は連続して2回それをオフにすることはできません...私は、間にそれをオンにする必要がありますか? GpioCallbackはイベントを削除できますか?私の時間は短すぎますか? 「エッジ」としてカウントされない電圧間にソフトなランプがありますか?

06-02 06:33:37.052 I/NetGpioListener: NET GPIO LISTENER: 118730013 true 
06-02 06:33:37.091 I/NetGpioListener: NET GPIO LISTENER: 118769152 false 
06-02 06:33:37.094 I/NetGpioListener: NET GPIO LISTENER: 118772102 false 
+0

問題を再現したいのですが、どのgpio出力を使用していますか? – Blundell

+0

私はピン20でリッスンしていましたが、文字通りVCCからワイヤーを取り出し、それを静かに入力ピンポートに置き、それをたくさん振った。非常に科学的、私は知っている。 :) –

答えて

2

val gpioIn = PeripheralManagerService().openGpio(gpioPinName) 
gpioIn.setEdgeTriggerType(Gpio.EDGE_NONE) // reset for Android Things bug 
gpioIn.setDirection(Gpio.DIRECTION_IN) 
gpioIn.setActiveType(Gpio.ACTIVE_HIGH) 
gpioIn.setEdgeTriggerType(Gpio.EDGE_BOTH) // I should get all changes, right? 
gpioIn.registerGpioCallback(object : GpioCallback() { 
    override fun onGpioEdge(gpio: Gpio?): Boolean { 
     netLog((gpio?.value ?: "null").toString()) 
     return true 
    } 
    override fun onGpioError(gpio: Gpio?, error: Int) { 
     netLog("GPIO $gpio Error event $error") 
    } 
}) 

結果はい、これは押しボタン、リレー接点、及び「波状線」のようなノイズの多い入力信号とはかなり一般的です。接点クロージャ中に発生する信号バウンスは非常に急速に発生し、すべてのエッジトリガイベントが入力レジスタに取り込まれるわけではありません。

これはすべてのGPIOシステム(Androidのものだけでなく)にも当てはまります。その理由の1つは、signal debounceがそのような一般的な方法です。 button driverのデバウンスコードは、実際にこのようなケースを処理して、誤ったイベントを生成しないようにしました。

関連する問題