Android Things使用Android打开物联网的大门——Android Things开发

Android Things:外设I/O接口-GPIO

2017-04-23  本文已影响80人  1024工场

一、接口简介

通用输入/输出(General Purpose Input/Output),简单的传感器使用这个API,如运动探测器、距离探测器,和电平开关使用一个二进制值-高或者低来报告它们的状态。 它引脚提供了可编程的接口,来读取二进制输入设备的状态(如开关按钮)或者控制二进制输出设备的开关状态(例如LED等)。

你可以配置GPIO引脚为具有高低状态的输入或者输出:

二、使用步骤

对于GPIO接口的操作,主要有如下几个步骤:
1. 打开连接

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 
    // Attempt to access the GPIO
    try {
        PeripheralManagerService manager = new PeripheralManagerService();
        mGpio = manager.openGpio(GPIO_NAME);
    } catch (IOException e) {
         Log.w(TAG, "Unable to access GPIO", e);
    }
}

2. 读取输入

public void configureInput(Gpio gpio) throws IOException {
      gpio.setDirection(Gpio.DIRECTION_IN);
      gpio.setActiveType(Gpio.ACTIVE_HIGH);
      if (gpio.getValue()) {
      } else {
      }
}

3. 监听输入变化

public void configureInput(Gpio gpio) throws IOException {
      gpio.setDirection(Gpio.DIRECTION_IN);
      gpio.setActiveType(Gpio.ACTIVE_LOW);

      gpio.setEdgeTriggerType(Gpio.EDGE_BOTH);
      gpio.registerGpioCallback(mGpioCallback);
}
private GpioCallback mGpioCallback = new GpioCallback() {
      @Override
      public boolean onGpioEdge(Gpio gpio) {
          if (mDevice.getValue()) {
          } else {
          }
          return true;
      }
      @Override
      public void onGpioError(Gpio gpio, int error) {
          Log.w(TAG, gpio + ": Error event " + error);
      }
}; 
@Override
protected void onStop() {
      super.onStop();
      // Interrupt events no longer necessary
      mGpio.unregisterGpioCallback(mGpioCallback);
}

4. 写入输出

public void configureOutput(Gpio gpio) throws IOException {
      gpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_HIGH);
      gpio.setActiveType(Gpio.ACTIVE_LOW);
      gpio.setValue(true);
}

5. 关闭连接

@Override
protected void onDestroy() {
      super.onDestroy();
      if (mGpio != null) {
          try {
              mGpio.close();
              mGpio = null;
          } catch (IOException e) {
              Log.w(TAG, "Unable to close GPIO", e);
          }
      }
}

三、案例演示

这里我们演示一个案例,通过BCM21监听开关按钮的开关产生的输入信号,从而通过BCM5输出信号控制LED灯的开关。
1. 硬件准备

2. 电路搭建

电路图

3. 代码编写
GpioDemo\app\src\main\java\com\chengxiang\gpiodemo\MainActivity.java

public class MainActivity extends AppCompatActivity {
    //输入和输出GPIO引脚名称
    private static final String GPIO_IN_NAME = "BCM21";
    private static final String GPIO_OUT_NAME = "BCM5";

    //输入和输出Gpio
    private Gpio mGpioIn;
    private Gpio mGpioOut;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        PeripheralManagerService manager = new PeripheralManagerService();
        try {
            //打开并设置输入Gpio,监听输入信号变化(开关按钮的开关)
            mGpioIn = manager.openGpio(GPIO_IN_NAME);
            mGpioIn.setDirection(Gpio.DIRECTION_IN);
            mGpioIn.setEdgeTriggerType(Gpio.EDGE_FALLING);
            mGpioIn.setActiveType(Gpio.ACTIVE_HIGH);
            mGpioIn.registerGpioCallback(mGpioCallback);

            //打开并设置输出Gpio
            mGpioOut = manager.openGpio(GPIO_OUT_NAME);
            mGpioOut.setDirection(Gpio.DIRECTION_OUT_INITIALLY_HIGH);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private GpioCallback mGpioCallback = new GpioCallback() {
        @Override
        public boolean onGpioEdge(Gpio gpio) {
            try {
                //当按开关按钮的时候,改变输出Gpio的信号,从而控制LED灯的亮和灭
                mGpioOut.setValue(!mGpioOut.getValue());
            } catch (IOException e) {
                e.printStackTrace();
            }
            return true;
        }

        @Override
        public void onGpioError(Gpio gpio, int error) {
        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //关闭Gpio
        if (mGpioIn != null) {
            try {
                mGpioIn.unregisterGpioCallback(mGpioCallback);
                mGpioIn.close();
                mGpioIn = null;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        if (mGpioOut != null) {
            try {
                mGpioOut.close();
                mGpioOut = null;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

广告时间咯:如果你需要完成的Demo源码,请关注“1024工场服务号”->工场仓库->Things代码(文章底部二维码),就可以找到你想要的代码噢。

4. 运行结果
通过按钮的开关,来控制LED等的亮和灭。

开关关LED灭 开关开LED亮

提示1:在实验的过程中,发现使用BCM6引脚会报错如下:

03-04 15:12:48.497 29491-29491/com.chengxiang.gpiodemo W/System.err: com.google.android.things.pio.PioException: android.os.ServiceSpecificException: BCM6 driver failure
03-04 15:12:48.497 29491-29491/com.chengxiang.gpiodemo W/System.err:     at com.google.android.things.pio.GpioImpl.setDirection(GpioImpl.java:64)
03-04 15:12:48.497 29491-29491/com.chengxiang.gpiodemo W/System.err:     at com.chengxiang.gpiodemo.MainActivity.onCreate(MainActivity.java:39)
03-04 15:12:48.497 29491-29491/com.chengxiang.gpiodemo W/System.err:     at android.app.Activity.performCreate(Activity.java:6662)
03-04 15:12:48.497 29491-29491/com.chengxiang.gpiodemo W/System.err:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)

处理1:更换BCM5接口即正常,目前只能猜测是否是things系统的bug造成。


1.抛弃各种找元器件的烦恼,来“1024工场”旗舰店,一次性买到你所想要的:树莓派套装—专为Android Things打造。

树莓派套装
电脑用户,点击如下链接进入淘宝宝贝页面:
https://item.taobao.com/item.htm?spm=686.1000925.0.0.3f11c9ed68fPu7&id=549263158263
手机用户,打开淘宝客户端扫描二维码:
宝贝二维码
2.完整和持续更新的《使用Android打开物联网开发大门——Andoid Thigns开发》文档,欢迎大家阅读!
https://www.kancloud.cn/workshop1024/android_things_develop/360773
这里写图片描述
3.新技术,新未来!欢迎大家关注“1024工场”微信服务号,时刻关注我们的最新的技术讯息。(甭客气!尽情的扫描或者长按!)
服务号
4.加入“Android Things开发”QQ讨论群,一起学习一起Hi。(甭客气!尽情的扫描或者长按!)
qq群
上一篇 下一篇

猜你喜欢

热点阅读