Android Things入门-控制GPIO

原创 2017年08月13日 12:04:17

(1) Android Things入门-环境搭建

上一篇简单的叙述一下Android Things系统的安装和环境配置,在文章最后我们导入了一个模板样例,使用Android Studio进行了编译和下载。环境也搭建好了,应用也都可以正常下载了,那接着就该对树莓派已有的接口和Android Things的功能进一步学习了。

我还是在 new-project-template 这个空白模板里学习GPIO控制的,而没有直接去看官方的GPIO例程,是希望自己可以写几行代码,出错了之后也能明白哪里的问题。

先介绍一下硬件电路连接,开关的一端连接输入引脚GPIO7,另一端连接GND;LED发光二极管正极接GPIO0,负极接GND。(关于树莓派3引脚图可自行搜索)

连接图

我们要实现当开关按下之后LED亮,松开开关后LED灭,是嵌入式入门最基础的GPIO操作。

接着看程序,MainActivity继承Activity之后重写了父类的onCreate和onDestroy方法,如果打开调试窗口里的Android Monitor可以看到下载之后启动会打印onCreate方法里的输出提示,我们就在onCreate方法里面处理GPIO读写功能。

在MainActivity中加入两个私有成员变量

private Gpio inputPin; // 输入引脚
private Gpio outputPin; // 输出引脚

把鼠标停留在当前行,按Alt+Enter可导入包含Gpio的包。

在onCreate方法里对这两个引脚进行设置

PeripheralManagerService service = new PeripheralManagerService();
try {
    inputPin = service.openGpio("BCM4");
    inputPin.setDirection(Gpio.DIRECTION_IN);
    inputPin.setActiveType(Gpio.ACTIVE_HIGH);

    outputPin = service.openGpio("BCM17");
    outputPin.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
}
catch(IOException e) {}

我们需要实例化GPIO处理类PeripheralManagerService,初始化输入引脚打开“BCM4”引脚对应GPIO7(树莓派有几种不同的引脚命名方式),设置引脚为输入,设置引脚悬空时为高电平。初始化输出引脚打开“BCM17”引脚对应GPIO0,设置输出默认为低电平。

检测GPIO可以有轮询中断两种方式。
我们首先介绍轮询方式,就是不断的读输入IO的电平值。因此我们在onCreate方法里新建一个线程启动之后不断的读输入IO的值,对应的改变输出IO的值来控制LED发光。

(new Thread(new Runnable() {
    @Override
    public void run() { 
        try {
            while (true) {  // 线程中死循环的读inputPin对应IO的值
                boolean status = inputPin.getValue();
                if (status) {
                    outputPin.setValue(true);  // 如果status为true,我们就设置outputPin为true,则LED亮
                }
                else {
                    outputPin.setValue(false);
                }
                Thread.sleep(5000);
             }
       }
       catch(Exception e) 
       { 
            e.printStackTrace();
       }
   }
})).start();

中断方式在Android Things中用监听器来封装,我们对输入引脚设置监听,如果被触发则调用事件回调方法处理我们的逻辑。我们还是在onCreate这个方法里去实现,把上面介绍的建立线程部分注释掉防止冲突,留下输入输出的配置。我们以上升沿和下降沿都触发的事件为例,其他事件分别为
* EDGE_NONE
* EDGE_RISING
* EDGE_FALLING
* EDGE_BOTH

PeripheralManagerService service = new PeripheralManagerService();
try {
    inputPin = service.openGpio("BCM4");
    inputPin.setDirection(Gpio.DIRECTION_IN);
    inputPin.setActiveType(Gpio.ACTIVE_HIGH);
    gpioPin.setEdgeTriggerType(Gpio.EDGE_BOTH);  // 设置触发事件类型

    outputPin = service.openGpio("BCM17");
    outputPin.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);

    SensorCallBack callback = new SensorCallBack();
    gpioPin.registerGpioCallback(callback);  // 注册我们的回调
}
catch(IOException e) {}

我们在上面设置了事件之后,必须创建一个回调类来处理这个事件的触发,这个回调类必须继承GpioCallback,在MainActivity中最后面加入以下代码

private class SensorCallBack extends GpioCallback {
    @Override
    public boolean onGpioEdge(Gpio gpio) { 
        try {
            boolean callBackState = gpio.getValue();
            if(callBackState) {
                outputPin.setValue(false);
            }
            else {
                outputPin.setValue(true);
            }
        }
        catch(IOException ioe) { 
            ioe.printStackTrace();
        } 
        return true;
    } 
    @Override
    public void onGpioError(Gpio gpio, int error) {
        super.onGpioError(gpio, error);
    }
}

在回调类里有两个父类的方法需要我们重写来实现要处理的行为,一个是IO中断触发,另一个IO异常错误
* public boolean onGpioEdge
* public boolean onGpioError

最后编译下载,按照电路图的接线方法,当按键按下之后灯亮,松开之后灯灭。试试看吧。

版权声明:本文为博主原创文章,未经博主允许不得转载。

使用xampp搭建mysql、php的web开发环境

1.第一步,搭建环境[安装xampp] (http://jingyan.baidu.com/article/48a42057bda4d0a9242504b8.html%20%E5%AE%89%E8%...

php入门之基本语法

开了博客后又一段时间没有写文章了,今天介绍一下php的基本语法。在语法上,php跟c++是比较相似的,好了,不多说废话,直接上代码吧。 //php代码必须包含在中间 //有时候?>可以省略,条件是...
  • wapttle
  • wapttle
  • 2015年03月09日 10:57
  • 192

Android Things物联网开发--外围I/O接口之GPIO(三)

Android Things开发,Android Things物联网开发, GPIO,PWM,I2C,SPI,UART, 外围I/O接口Android Things提供外围I/O接口APIs 使用工业...

树莓派Android Things物联网开发:树莓派GPIO引脚图

本章内容介绍可用于Android Things应用API的 树莓派3 外围IO引脚。树莓派具有引脚复用功能,一些引脚功能不能同时使用(比如说蓝牙和UART0),详情查看 function mode m...
  • Leytton
  • Leytton
  • 2017年09月09日 00:24
  • 388

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

一、接口简介 通用输入/输出(General Purpose Input/Output),简单的传感器使用这个API,如运动探测器、距离探测器,和电平开关使用一个二进制值-高或者低来报告它们的状态。 ...

树莓派Android Things物联网开发:入门及资料汇总

本文包含AndroidThings介绍、树莓派网盘、文章开发资料和各类Android Things、Win10 IOT文档资料,大量干货批发,童叟无欺 :-)...
  • Leytton
  • Leytton
  • 2017年09月08日 23:19
  • 770

Android下led控制(下)--Linux驱动部分--script与gpio(全志)

前面写了三篇关于全志CQA83T下Android控制led的博文,但是还是有很多东西可以学习,可以写写作为学习记录。如果看源码,绕不过script这个东西,这个不是像其他系统脚本一样,这里的scrip...

【转】Android应用程序:(jni方式)控制LED/GPIO

GPIO的英文全称General-Purpose Input /Output Ports,中文意思是通用I/O端口。 在嵌入式系统中,经常需要控制许多结构简单的外部设备或者电路,这些设备有的需要通...

android平台应用层控制GPIO口

android平台通过gpio口控制led灯

[RK3288][Android6.0] 调试笔记 --- 通用GPIO驱动控制LED

Platform: ROCKCHIP OS: Android 6.0 Kernel: 3.10.92 由于板子没有lcd无法得知sd卡升级是否完成,因此使用LED显示. Recovery中升级完成...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android Things入门-控制GPIO
举报原因:
原因补充:

(最多只允许输入30个字)