一、接口简介

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

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

作为输入:外部源决定这个状态,你的app可以读取当前的值或者对状态的变化做出反应。

作为输出:你的app配置引脚的状态。

二、使用步骤

对于GPIO接口的操作,主要有如下几个步骤:

1.打开连接

创建PeripheralManagerService对象,使用你要打开的端口的名称调用openGpio()方法打开指定端口的连接。

@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.读取输入

使用DIRECTION_IN模式调用setDirection()方法配置端口为输入。

使用ACTIVE_HIGHT或者ACTIVE_LOW调用setActiveType()方法,配置高(接近LOREF)或者低(接近zero)电压状态作为true(活动的)返回。

使用getValue()方法返回当前状态。

public void configureInput(Gpio gpio) throws IOException {

gpio.setDirection(Gpio.DIRECTION_IN);

gpio.setActiveType(Gpio.ACTIVE_HIGH);

if (gpio.getValue()) {

} else {

}

}

3.监听输入变化

GPIO端口被配置为输入后,当它的状态在高和低之间改变时会通知你的app。注册这些改变事件:

在活动的端口连接添加一个GpioCallback。

使用setEdgeTriggerType()方法声明触发中断事件的状态变化。边缘触发器支持下面的四个类型:

EDGE_NONE:没有中断事件,这个是默认的值。

EDGE_RISING:从低到高过渡中断。

EDGE_FALLING:从高到底过渡中断。

EDGE_BOTH:在所有状态转换中断。

onGpioEdge()方法返回true意味着这个监听器会持续获取端口的每个状态改变事件。

当你的app不在监听输入事件的时候,注销所有中断Handler。

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.写入输出

使用DIRECTIOIN_OUT_INITIALLY_HIGHT或者DIRECTION_OUT_INITIALLY_LOW模式调用setDirection()方法配置它为输出。这些模式确保了端口的初始化状态在配置时间正确设置。

配置高 (接近IOREF)或者低(接近zero)电压信号作为true(活动)返回,使用ACTIVE_HIGHT或者ACTIVE_LOW调用setActiveType()方法。

使用setValue方法来设置当前状态。

public void configureOutput(Gpio gpio) throws IOException {

gpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_HIGH);

gpio.setActiveType(Gpio.ACTIVE_LOW);

gpio.setValue(true);

}

5.关闭连接

当完成GPIO端口通信,使用close()方法关闭连接并释放资源。

@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.代码编写

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();

}

}

}

}

3.运行结果

通过按钮的开关,来控制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造成。

欢迎大家关注“Android Things开发”微信公众号和加入讨论QQ群,在这里你可以获得Android Things相关的最新资讯,并且第一时间获得我的技术文章,和大家交流开发心得和遇到的问题噢!

android10开发io接口,Android Things:外设I/O接口-GPIO相关推荐

  1. android 调用系统短信接口开发,聚合数据Android SDK 短信api接口验证演示示例

    1.到libs聚合SDK是聚合数据平台,为移动开发者提供的免费数据接口.使用前请先到聚合平台(http://www.juhe.cn/)注册,申请相关数据. 2.下载聚合数据SDK,将开发包里的smsc ...

  2. android微信条码支付接口,Android中调用微信支付接口

    在我的项目中还没有接入这个功能的时候就听说微信支付的接口很坑爹,用完之后发现别人说的一点也没有错,蛋疼归蛋疼,该用还是要用.在这里把遇到的问题记录一下以免以后需要再次接入的话碰到问题浪费时间. 微信支 ...

  3. 一篇读懂:Android手机如何通过USB接口与外设通信(附原理分析及方案选型)

    更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,共同探讨软件知识经验,关注就有海量学习资料免费领哦: 目录 0背景 1.手机USB接口通信特点 1.1 使用方便 1.2 通用性强 1.3 ...

  4. 使用Arduino开发ESP32(11):IO口与相关外设说明与记录

    文章目录 目的 数字IO口 基本使用 外部中断 使用示例 参考链接 LEDC(PWM) 常用方法 使用示例 参考链接 SigmaDelta 参考链接 ADC 常用方法 使用示例 参考链接 存在的问题 ...

  5. android开发笔记之app应用间接使用frameworks接口

    背景 公司平台化开发,一个重要的地方是上层应用可以兼容不同的芯片平台.比如上层camera应用可以兼容Mtk和Qcom等不同平台.这个我们公司的camera不知道他们从哪里搞来了一个中间键的实现方法. ...

  6. android开发照相机啊,Android照相机开发详解(一)

    Android相机开发详解(一) Android相机开发详解(一) 请支持原创,尊重原创,转载请注明出处:http://blog.csdn.net/kangweijian(来自kangweijian的 ...

  7. android音视频播放器开发百度云,Android 播放端 SDK

    1 概述 PLDroidPlayer 是一个适用于 Android 平台的音视频播放器 SDK,可高度定制化和二次开发,为 Android 开发者提供了简单.快捷的接口,帮助开发者在 Android ...

  8. ReactNative开发——RN与android Native交互初探

    ReactNative开发--RN与android Native交互初探 环境 window10,reactnative 0.44版 RN调用android方法 1.导入NativeModules组件 ...

  9. 全网最全Android开发工具,Android开发框架大全

    涵盖Android方方面面的技术, 目前保持更新. 时刻与Android开发流行前沿同步. 目录 一.工具 Android开发工具 在线工具宝典大全 二.框架 *缓存框架* DiskLruCache ...

最新文章

  1. 华为又一重拳!全球首款5G基站核心芯片“天罡”发布!
  2. linux 加密可逆,RSA加密是可逆的吗
  3. 正确配置nginx和php
  4. 《FPGA全程进阶---实战演练》第一章之如何学习FPGA
  5. img title属性值利用#13换行
  6. qt linux 聊天室,Qt网络聊天室客户端
  7. Django create_user with is_active=False
  8. 论文浅尝 | 基于知识图的问答变分推理
  9. binwalk 提取bootimg_boot.img格式文件结构解析
  10. eth java,一个轻量级的Java实现的ETH库
  11. 泛型的应用-vue3之ref
  12. LoadRunner测试ajax框架,回放后系统中没有产生数据解决方法
  13. hmaster和datanaode启动后很快停止_手动和全自动柴油发电机启动方法各自有什么优点?...
  14. 设计模式 ( 四 ) 抽象工厂模式
  15. [随笔所想] 2021年新年碎碎念-加油了不起的干饭人!
  16. EXCEL中的定位条件(含快速删除空行,定位图片、文本框等对象)
  17. 如何查看电子元器件的丝印信息
  18. 小孩终生教育工程(人生管理):有些东西比努力比钱更重要
  19. powerpoint中如何使用母版
  20. 重邮计算机学院新闻,感知重邮丨重庆邮电大学计算机学院稳固学科建设核心 提升人才培养质量...

热门文章

  1. 少儿编程网站源码和scratch课程
  2. android模拟器pc版怎么玩,原神电脑版安卓模拟器怎么使用,电脑上怎么玩原神手游...
  3. Vue 开发在微信公众号中如何文件下载
  4. 【AAAI 2021】跨层知识蒸馏:Cross-Layer Distillation with Semantic Calibration
  5. HCIP-DATACOM H12-831(101-120)
  6. 债券基础知识和可转债剖析
  7. [Ubuntu]MW150us-rtl8188eu 驱动编译安装
  8. 浙江省2级C语言等级考试答案,2021年秋浙江省计算机等级考试二级C试卷及答案...
  9. 在页面上用$(#userName).val();获取不到值,提示$(#userName)未定义
  10. Tableau 日月环比同比