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.hellothings
import android.app.Activity
import android.content.ContentValues.TAG
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
class 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的库来实现,这里就不展开了,下次用到了再来讲解吧。