2017-06-02 91 views
1

我有一個非常簡單的設置android-things設置,其中GPIO(輸出)產生非常短的(10u)脈衝,並且我試圖通過另一個GPIO(輸入)讀取該脈衝。GpioCallback如何連續兩次註冊「false」?

但是,我的日誌讓我感到很頭疼:我怎麼能連續得到兩個「錯誤」的讀數?如果我有電燈開關,我無法連續關閉兩次......我需要將它打開,對不對? GpioCallback可以放下事件嗎?我的時間太短了嗎?電壓之間是否會出現一個不會被視爲「邊緣」的軟斜坡?

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") 
    } 
}) 

導致

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

是的,這是一個像按鈕開關,繼電器觸點,而「波浪線」噪聲輸入信號相當普遍。觸點閉合期間發生的信號反彈可能會非常迅速地發生,因此不是每個邊沿觸發事件都會被輸入寄存器捕獲。

所有GPIO系統(不僅僅是Android的東西)都是如此,爲什麼signal debounce是這樣一種常見做法。 button driver中的去抖處理代碼實際上是爲了處理這種情況而編寫的,以確保它們不會產生虛假事件。