AndroidThings学习笔记--gpio控制Led和Button

来源:互联网 发布:数控车床螺纹编程 编辑:程序博客网 时间:2024/06/06 08:56

1.了解android things的框架

  Android things框架,其实和android原生区别不是非常的大。如下图所示:
这里写图片描述

  AndroidThings扩展了一些硬件相关的api,比如外设io的api,以及用户驱动的api。可以通过上层api来调用底层的硬件功能。
还是先来写一个控制灯的例子吧:

2. 准备

  AndroidThings比较新,所以需要以下的一些工具和api:

1.SDKtools需要25.0.3以上版本。2.需要android7.0也就是API 24更高的版本,

  需要在build.gradle中添加如下dependency:

dependencies {    ...    provided 'com.google.android.things:androidthings:0.4.1-devpreview'}

  在android manifest中需要添加如下信息:

<application ...>    <uses-library android:name="com.google.android.things"/>    ...</application>

  manifest 需要为主activity添加如下信息:

  ● Action: ACTION_MAIN  ● Category: CATEGORY_DEFAULT  ● Category: IOT_LAUNCHER

  使用category为iot_launcher的时候,系统启动的时候就可以直接自动启动这个activity了。

3. GPIO

3.1 控制LED灯

  我们可以通过管理外围连接的系统服务PeripheralManagerService来查看可使用端口的列表:

 PeripheralManagerService service = new PeripheralManagerService();        Log.d(TAG, "Available GPIO: " + service.getGpioList());

  然后我们来点亮一盏灯:
  创建GPIO的连接:

PeripheralManagerService service = new PeripheralManagerService();

  配置为输出:

setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);

  设置LED的状态。

setValue();

3.2 控制Button

  3.2.1 利用PeripheralManagerService 连接GPIO的端口。
  3.2.2 配置端口为 DIRECTION_IN
  3.2.3 配置状态生成回调事件的触发类型setEdgeTriggerType().
  3.2.4 注册回调事件函数,返回true用以继续接收事件。

4 java实现按键触发灯亮

  既然已经知道了怎么控制gpio来实现button和led的功能,那么我们来实现下按一下button,led灯点亮,再按一下button就熄灭的功能。开始下代码吧:

package com.jmigo.hellothings;import android.app.Activity;import android.os.Bundle;import android.util.Log;import com.google.android.things.pio.Gpio;import com.google.android.things.pio.GpioCallback;import com.google.android.things.pio.PeripheralManagerService;import java.io.IOException;public class MainActivity extends Activity {    private static final String TAG = MainActivity.class.getSimpleName();    private static final String LED_PIN_NAME = "BCM4";    private static final String BUTTON_PIN_NAME = "BCM17";    private Gpio mLedGpio;    private Gpio mButtonGpio;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        PeripheralManagerService pioService = new PeripheralManagerService();        try {            mLedGpio = pioService.openGpio(LED_PIN_NAME);            mLedGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);            mButtonGpio = pioService.openGpio(BUTTON_PIN_NAME);            mButtonGpio.setDirection(Gpio.DIRECTION_IN);            mButtonGpio.setEdgeTriggerType(Gpio.EDGE_FALLING);            mButtonGpio.registerGpioCallback(new GpioCallback() {                @Override                public boolean onGpioEdge(Gpio gpio) {                    setLedValue(!getLedValue());                    return true;                }            });        } catch (IOException e) {            Log.e(TAG, "Error configuring GPIO pins", e);        }    }    private void setLedValue(boolean value) {        try {            mLedGpio.setValue(value);        } catch (IOException e) {            Log.e(TAG, "Error updating GPIO value", e);        }    }    private boolean getLedValue() {        try {            return mLedGpio.getValue();        } catch (IOException e) {            Log.e(TAG, "Error updating GPIO value", e);        }        return false;    }    @Override    protected void onDestroy() {        super.onDestroy();        if (mButtonGpio != null) {            try {                mButtonGpio.close();            } catch (IOException e) {                Log.e(TAG, "Error on PeripheralIO API", e);            } finally {                mButtonGpio = null;            }        }        if (mLedGpio != null) {            try {                mLedGpio.close();            } catch (IOException e) {                Log.e(TAG, "Error closing LED GPIO", e);            } finally{                mLedGpio = null;            }            mLedGpio = null;        }    }}

5 kotlin实现按键触发灯亮

  既然知道了java代码如何写了,那么按照google的最新的android开发语言kotlin来学习下怎么写代码吧:

package com.jmigo.hellothingsimport android.app.Activityimport android.content.ContentValues.TAGimport android.os.Bundleimport android.util.Logimport com.google.android.things.pio.Gpioimport com.google.android.things.pio.GpioCallbackimport com.google.android.things.pio.PeripheralManagerServiceimport java.io.IOExceptionclass Main2Activity : Activity() {    val ledPinName = "BCM4"    val buttonPinName = "BCM17"    lateinit var ledGpio:Gpio    lateinit var buttonGpio:Gpio    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        val pioSevice:PeripheralManagerService = PeripheralManagerService()        try {            ledGpio = pioSevice.openGpio(ledPinName)            ledGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW)            buttonGpio = pioSevice.openGpio(buttonPinName)            buttonGpio.setDirection(Gpio.DIRECTION_IN)            buttonGpio.setEdgeTriggerType(Gpio.EDGE_FALLING)            buttonGpio.registerGpioCallback(object: GpioCallback() {                override fun onGpioEdge(gpio: Gpio?): Boolean {                    ledGpio.value = !ledGpio.value                    return true                }            })        }catch (e:IOException){            e.printStackTrace()        }    }    override fun onDestroy() {        super.onDestroy()        if (buttonGpio != null) {            try {                buttonGpio.close()            } catch (e: Exception) {                Log.e(TAG, "Error on PeripheralIO API", e)            }        }        if (ledGpio != null) {            try {                ledGpio.close()            } catch (e: Exception) {                Log.e(TAG, "Error on PeripheralIO API", e)            }        }    }}

6 硬件连接图

  树莓派和面包板的连接如下图所示,找对管脚,连接上对应的BCM4和BCM17,其中BCM4是控制led的,BCM17是控制按键的。


  按键按下点亮led蓝色的灯,再次按下按键就会熄灭led灯。


  关于led和按键的控制基本上就这些了,此外按键还可以通过drive的库来实现,这里就不展开了,下次用到了再来讲解吧。