android things 樹莓派B3 GPIO口測試及問題總結

本文主要是說明使用這些GPIO口時出現的問題及解決的方案。

串口:

物理接線方式:

紅線接:5v/3.3v(串聯電阻不要應該也可以 我自己選的10k電阻)

黑線接:接GND

綠色線:隨便接一個BCM即可。(這裏是BCM21)

Schematics for Raspberry Pi 3

代碼:

這邊千篇一律就不說了。官網給說的很明白了。不過如果想一下使用多個 你可以多註冊幾個。我這隻有一個

    private val GPIO_BCM2 = "BCM2

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        var gpio1 = PeripheralManager.getInstance().openGpio(GPIO_BCM2)
        configureInput(gpio1)
    }    
    private fun configureInput(gpio : Gpio){
        gpio.apply {
            try {
                // Initialize the pin as a high output
//                setDirection(Gpio.DIRECTION_OUT_INITIALLY_HIGH)
//                setActiveType(Gpio.ACTIVE_HIGH)
//                value = false

                setDirection(Gpio.DIRECTION_IN)
                setActiveType(Gpio.ACTIVE_HIGH)
//                // Register for all state changes
                setEdgeTriggerType(Gpio.EDGE_BOTH)
                registerGpioCallback(gpioCallback)

                Log.i(TAG,"GPIO:${gpio.name} value:$value")
            }catch (e:Exception){
                Log.w(TAG,"GPIO:${gpio.name}  exc:$e")
            }

        }
    }
    private val gpioCallback = object : GpioCallback {
        @SuppressLint("SetTextI18n")
        override fun onGpioEdge(gpio: Gpio): Boolean {
            // Read the active low pin state
//            if (gpio.value) {
//                // Pin is LOW
//                Log.i(TAG,"Low ${gpio.name}  ")
//            } else {
//                // Pin is HIGH
//                Log.i(TAG,"HIGH ${gpio.name}")
//            }
            sample_text.text = "gpio:${gpio.name}  value:${gpio.value}"
            // Continue listening for more interrupts
            return true
        }

        override fun onGpioError(gpio: Gpio, error: Int) {
            Log.w(TAG, "$gpio: Error event $error")
        }
    }
    override fun onDestroy() {
        super.onDestroy()
        try {
             gpio1.unregisterGpioCallback(gpioCallback);
             gpio1.close()
        }catch (e:Exception){
            Log.w(TAG, "Unable to close GPIO", e)
        }
    }

最後說說問題:

上文代碼中選擇的是通過中斷代碼回調來獲取當前按鈕點擊狀態。

1.在中斷回調中通過Log打印當前日誌,發現日誌莫名觸發或者無法響應正常觸發怎麼辦?

答:不知道爲什麼Log打印沒法每次都觸發,這裏建議直接使用TextView.text輸出到屏幕。我剛剛開始就遇到這問題。我以爲androidthings這也太垃圾了了。結果後來發現,按鈕點擊和不點擊時萬用表顯示的數值是正確的。/sys/class/gpio/gpiox  (x代表對應BCM的序號)目錄中 cat value 得到的值也是正確的。後來打斷點發現tmd回調也能正常執行,就是log沒打印,氣的一批。原因未知。

2. 中斷回調中 出現高頻次跟按鈕無關胡亂觸發。

答:這種情況一般是接錯線了。建議還是按官方實例給的接法接線(就上圖那種 三線的 帶上拉電阻的)。上圖接線方式中如果你將5v的線拔掉 你會發現同樣的問題。順便說一下,這塊板子的所有GPIO串口中,除了BCM2/3的默認電平爲高電平(3.3v)外,其他一律是低電平。拆除5v供電後,可能是bcm串口電壓不穩定,與GND頻繁觸發,導致的高頻波動。

以上。如有問題歡迎指出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章