Raspberry pi 未收到Android东西GpioCallback

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

我正在尝试从示例中实现按钮。我已建立如中所示的连接。按下按钮后,我没有收到GPIO回调

我使用的代码与示例代码相同。没有例外,只有“启动活动”在日志中打印

@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
    未更新
  • 尝试了不同的边缘触发器类型,但从未调用onGpioEdge
  • 下面是我的设置图片


    我发现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(但查看了代码,它就这样做了),没有,日志根本不一致或不可靠。在让它工作并四处玩后,我发现日志和按钮驱动程序是可靠的,但缺乏去盎司实现,因此可能会得到多次点击