本文主要是說明使用這些GPIO口時出現的問題及解決的方案。
串口:
物理接線方式:
紅線接:5v/3.3v(串聯電阻不要應該也可以 我自己選的10k電阻)
黑線接:接GND
綠色線:隨便接一個BCM即可。(這裏是BCM21)
代碼:
這邊千篇一律就不說了。官網給說的很明白了。不過如果想一下使用多個 你可以多註冊幾個。我這隻有一個
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頻繁觸發,導致的高頻波動。
以上。如有問題歡迎指出。