android things 树莓派B3 GPIO口测试及问题总结

本文主要是说明使用这些GPIO口时出现的问题及解决的方案。

串口:

android things 树莓派B3 GPIO口测试及问题总结_第1张图片

物理接线方式:

红线接:5v/3.3v(串联电阻不要应该也可以 我自己选的10k电阻)

黑线接:接GND

绿色线:随便接一个BCM即可。(这里是BCM21)

android things 树莓派B3 GPIO口测试及问题总结_第2张图片

代码:

这边千篇一律就不说了。官网给说的很明白了。不过如果想一下使用多个 你可以多注册几个。我这只有一个

    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频繁触发,导致的高频波动。

以上。如有问题欢迎指出。

你可能感兴趣的:(android,things,gpio,问题,树莓派3,android,things)