5

我正在尝试从simplepio实现按钮示例。我已经按照原理图所示进行了连接。按下按钮后,我没有收到 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);
    }
}

到目前为止我已经尝试过:

  1. 通过使用以下代码运行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)
    

    上面的代码在按下按钮时打印“Button Clicked”。所以我确信我的 PI 上的按钮和 GPIO 引脚不是问题。

  2. 为了确保日志记录没有问题,我还尝试修改原始程序以包含 aTextView和一个计数器,以便当单击按钮时计数器值增加并显示在TextView但再次未收到回调 TextView且未更新.
  3. 尝试了不同的边沿触发类型,但从未调用 onGpioEdge。

以下是我的设置图片

在此处输入图像描述

4

3 回答 3

3

只是我还是你的电阻在错误的面包板行中

错误的

箭头显示它在哪里,圆圈显示它应该在哪里。

根据熔结图:

在此处输入图像描述

于 2017-01-16T19:53:24.937 回答
0

可能是我没有按照原理图连接电路,或者电阻器接触不良。正如 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) 
于 2017-01-17T16:14:52.623 回答
0

我发现 Button 驱动程序在带有 Android 设备的 Raspberry PI 上非常不可靠,毕竟驱动程序与您拥有的代码几乎相同。

然而, ButtonInputDriver 工作完美。

实际上,您不需要直接寻址 GPIO 并且可以使用驱动层,这更简单。按钮驱动程序在这里:https ://github.com/androidthings/contrib-drivers/tree/master/cap12xx

我建议你试试 ButtonInputDriver。

于 2017-01-16T09:45:41.447 回答