Raspberry pi 未收到Android东西GpioCallback
我正在尝试从示例中实现按钮。我已建立如中所示的连接。按下按钮后,我没有收到GPIO回调 我使用的代码与示例代码相同。没有例外,只有“启动活动”在日志中打印Raspberry pi 未收到Android东西GpioCallback,raspberry-pi,raspberry-pi3,android-things,Raspberry Pi,Raspberry Pi3,Android Things,我正在尝试从示例中实现按钮。我已建立如中所示的连接。按下按钮后,我没有收到GPIO回调 我使用的代码与示例代码相同。没有例外,只有“启动活动”在日志中打印 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, "Starting ButtonActivity"); PeripheralManagerServ
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "Starting ButtonActivity");
PeripheralManagerService service = new PeripheralManagerService();
try {
String pinName = BoardDefaults.getGPIOForButton();
mButtonGpio = service.openGpio(pinName);
mButtonGpio.setDirection(Gpio.DIRECTION_IN);
mButtonGpio.setEdgeTriggerType(Gpio.EDGE_FALLING);
mButtonGpio.registerGpioCallback(new GpioCallback() {
@Override
public boolean onGpioEdge(Gpio gpio) {
Log.i(TAG, "GPIO changed, button pressed");
// Return true to continue listening to events
return true;
}
});
} catch (IOException e) {
Log.e(TAG, "Error on PeripheralIO API", e);
}
}
到目前为止我所尝试的:
python
按钮程序在raspbian jessie
中使用以下代码
#!/usr/bin/env python
import os
from time import sleep
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(21, GPIO.IN, pull_up_down = GPIO.PUD_UP)
while True:
if (GPIO.input(21) == False):
print("Button Clicked")
sleep(0.1)
按下按钮时,上面的代码打印“按钮点击”。所以我
我确信我的PI上的按钮和GPIO引脚不是问题TextView
和计数器
因此,当单击按钮时,计数器值将递增并
显示在TextView
中,但再次没有收到回调,并且
TextView
未更新我发现Android的Raspberry PI上的按钮驱动程序非常不可靠,毕竟驱动程序与您的代码几乎相同 然而,ButtonInputDriver工作得完美无缺 事实上,您不需要直接处理GPIO,并且可以使用更简单的驱动程序层。按钮驱动程序在这里:
我建议您尝试一下ButtonInputDriver。是我还是您的电阻器放错了试验板排 箭头显示它在哪里,圆圈显示它应该在哪里 根据烧结图:
可能是我没有按照示意图连接电路,或者电阻器接触不良。最好的调试方法是按照Dave McKelvie的建议,使用电压表测量电压 Python代码之所以能够工作,是因为Raspberry PI 3具有内部上拉电阻器,正如Dave McKelvie在评论中建议的那样使用了该电阻器 该按钮可能不起作用的另一个原因是GPIO引脚已被其他应用程序使用。记录器显示以下场景的以下错误
Error on PeripheralIO API
com.google.android.things.pio.PioException: android.os.ServiceSpecificException: BCM21 is already in use
at com.google.android.things.pio.GpioImpl.<init>(GpioImpl.java:53)
at com.google.android.things.pio.PeripheralManagerService.openGpio(PeripheralManagerService.java:169)
at com.example.androidthings.simplepio.ButtonActivity.onCreate(ButtonActivity.java:129)
at android.app.Activity.performCreate(Activity.java:6662)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Caused by: android.os.ServiceSpecificException: BCM21 is already in use
at android.os.Parcel.readException(Parcel.java:1697)
at android.os.Parcel.readException(Parcel.java:1636)
at com.google.android.things.pio.IPeripheralManagerClient$Stub$Proxy.OpenGpio(IPeripheralManagerClient.java:776)
at com.google.android.things.pio.GpioImpl.<init>(GpioImpl.java:51)
at com.google.android.things.pio.PeripheralManagerService.openGpio(PeripheralManagerService.java:169)
at com.example.androidthings.simplepio.ButtonActivity.onCreate(ButtonActivity.java:129)
at android.app.Activity.performCreate(Activity.java:6662)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
外围设备API上的错误
com.google.android.things.pio.PioException:android.os.ServiceSpecificException:BCM21已在使用中
位于com.google.android.things.pio.GpioImpl.(GpioImpl.java:53)
位于com.google.android.things.pio.peripherandmanagerservice.openGpio(peripherandmanagerservice.java:169)
位于com.example.androidthings.simplepio.ButtonActivity.onCreate(ButtonActivity.java:129)
位于android.app.Activity.performCreate(Activity.java:6662)
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
位于android.app.ActivityThread.-wrap12(ActivityThread.java)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)上
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:154)
位于android.app.ActivityThread.main(ActivityThread.java:6077)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
原因:android.os.ServiceSpecificException:BCM21已在使用中
位于android.os.Parcel.readException(Parcel.java:1697)
位于android.os.Parcel.readException(Parcel.java:1636)
在com.google.android.things.pio.iperiperalmanagerclient$Stub$Proxy.OpenGpio(iperiperalmanagerclient.java:776)
位于com.google.android.things.pio.GpioImpl.(GpioImpl.java:51)
位于com.google.android.things.pio.peripherandmanagerservice.openGpio(peripherandmanagerservice.java:169)
位于com.example.androidthings.simplepio.ButtonActivity.onCreate(ButtonActivity.java:129)
位于android.app.Activity.performCreate(Activity.java:6662)
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
位于android.app.ActivityThread.-wrap12(ActivityThread.java)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)上
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:154)
位于android.app.ActivityThread.main(ActivityThread.java:6077)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
在Android代码运行且按钮激活的情况下,您是否能够用电压表确认Raspberry Pi针脚40(BCM 21)处的电压水平从3.3V变为0V。我相信您的python代码正在启用Raspberry Pi的内部上拉功能。因此,也许Android设备的外围设备无法正常工作,而且你的实验板上的外部拉起功能也无法建立良好的连接。@DaveMcKelvie:谢谢,这不仅非常有用,而且对将来的调试也非常有用。谢谢。我试试看。但是,当你使用简单的io代码时,你能在按下按钮时一致地看到日志吗?我只使用了驱动程序,没有直接使用GPIO(但查看了代码,它就这样做了),没有,日志根本不一致或不可靠。在让它工作并四处玩后,我发现日志和按钮驱动程序是可靠的,但缺乏去盎司实现,因此可能会得到多次点击