用Android Things使一个LED闪烁

一、什么是Android Thing?
2015年的全球开发大会上,谷歌对外宣布将会开发一个面向物联网设备的安卓操作系统,内部代号为“Brillo”,而在2016年12月,这一操作系统最终定名为Android Things,它将是安卓系统的一个分支版本,类似于面向智能手表和穿戴设备推出的Android Wear等。

二、启动、接入!

我们首先将树莓派Android Thing镜像烧写进SD卡,当我们烧写好系统镜像,连接好树莓派到路由器,如果一切正常,树莓派就会成功启动并接入到本地网络,如果树莓派连接了显示器,显示器则会显示树莓派的IP地址,如果没接显示器,也可以在路由器的管理界面看到树莓派的IP,这个IP地址很重要,有了这个IP地址,我们就可以在局域网内远程调试安卓设备,将程序上传到树莓派上。

当我们确定了IP后,就可以通过网络连接设备了,我们使用连接到同一路由器的台脑,打开软件工具里的ADB调试工具,ADB全称Android Debug Bridge(安卓调试桥),双击运行shell.bat打开一个命令提示符界面。

现在我们使用ADB连接安卓设备的5555端口,我们输入下面的命令:
adb connect <设备IP>
即假如树莓派的IP是192.168.0.15,你就可以在ADB内输入:
Adb connect 192.168.0.15
如果显示如图所示的
Connected to xxxxxxx:5555
就说明连接成功,就可以进行下一步,运行一个例程了。

三、运行!

连接好目标设备以后,我们就可以先运行一个例程了,在进行软件方面的操作之前,我们首先需要将硬件的线路填好,在官网或者github我们都可以找到例程,这里我们运行一个最简单的例程blink,blink属于simplepio中的例程,它是一个基本的IO输出例程,它可以让树莓派的BCM6引脚每隔1000毫秒输出一个低电平,从而使LED每隔1000毫秒亮一次,可以达到LED闪烁的效果。

我们可以到:
https://github.com/androidthings/sample-simplepio
查看更多详细内容,大家可以访问网站查看也可以直接按照下图接线。

下面是连接好以后的实物图

下图是树莓派3的GPIO引脚定义图,在进行编程时,可以参考下图定义GPIO的输入输出。

以上就是硬件部分的连接,每个例程都会有一张硬件连接图,在实验不同的demo时,只需要按照github上给出的线路连接图连接好硬件即可。
软件方面使用标准的安卓开发工具,官方要求是使用Android Studio 2.2.3以上的版本,大家只需要下载最新的Android Studio即可。安装好后打开最新的Android Studio,选择导航栏file选项下的open选项,大家可以上github上自行下载例程,也可以直接打开资料中例程文件夹下的sample-simplepio-master,选择好以后,Android Studio会开始导入项目,等到工具栏运行按钮的三角图标由灰色变为绿色时,就说明导入完成了。

当我们准备好硬件和软件,点击左侧项目栏下的Blink工程,进入java目录下的BlinkActivity源码文件,只需要按下Android Studio的运行按钮就可以看到实验现象了,如果一切正常,我们可以看到面包板上的LED开始一明一暗地闪烁起来。
在BlinkActivity.java文件中,我们可以看到程序的源码,其中onCreate()函数是整个代码的主要部分:


private static final String TAG = BlinkActivity.class.getSimpleName();
private static final int INTERVAL_BETWEEN_BLINKS_MS = 1000;

private Handler mHandler = new Handler();
private Gpio mLedGpio;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, “Starting BlinkActivity”);

PeripheralManagerService service = new PeripheralManagerService();
try {
String pinName = BoardDefaults.getGPIOForLED();
mLedGpio = service.openGpio(pinName);
mLedGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
Log.i(TAG, “Start blinking LED GPIO pin”);
// Post a Runnable that continuously switch the state of the GPIO, blinking the
// corresponding LED
mHandler.post(mBlinkRunnable);
} catch (IOException e) {
Log.e(TAG, “Error on PeripheralIO API”, e);
}
}

我们可以看到上面的代码里有一行
private static final int INTERVAL_BETWEEN_BLINKS_MS = 1000;
这一行代码定义了每次闪烁的间隔时间

private Gpio mLedGpio;
这一行新建了一个GPIO的对象

String pinName = BoardDefaults.getGPIOForLED();
这一行代码将获取不同开发板连接LED的引脚,从而使不同的开发板上获得相同的现象,具体的方法可以查看源码同一目录下BoardDefaults.java文件

mLedGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
这一行代码设置引脚输出低电平。