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

时间:2023-01-15 14:54:41


1.了解android things的框架

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

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

  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是控制按键的。



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

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


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

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