首页 > 其他分享 >AndroidThings学习笔记--gpio控制Led和Button

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

时间:2023-01-15 15:01:29浏览次数:39  
标签:Led Log -- Button PeripheralManagerService TAG Gpio android com


1.了解android things的框架

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

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

  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_android_02

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


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

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


标签:Led,Log,--,Button,PeripheralManagerService,TAG,Gpio,android,com
From: https://blog.51cto.com/u_15940062/6008717

相关文章

  • AndroidThings学习笔记--熟悉RPI3硬件
      在学习写代码前,还是先了解下硬件,也就是所谓的树莓派,相信很多人即使没有玩过,也是听过的,世界上最小的电脑。毕竟是玩物联网,玩硬件,不需要太多的硬件知识,但是基础的还是需要......
  • 独立主格
    Becausehewasinvitedbythewolf,therabbitdecidedtogototheparty因为兔子被狼邀请了,所以兔子决定参加聚会通过非谓语动词改写Invitedbythewolf,therab......
  • 30 案例:实施人脸检测
    30案例:实施人脸检测opencv知识点:创建和操作综合人工神经网络-dnn::Net类读取以TensorFlow框架格式存储的网络模型-readNetFromTensorflow从图像创建4维blob-b......
  • 路漫漫其修远兮
      从嵌入式转行到了Android开发已经一年有余了,不幸的是公司散伙了,也就离开了Android开发的岗位。学习工作了那么多年,感觉自己最有核心价值的还在于Linux了,之前一直想写的L......
  • Android开发学习之路--Drawable mutations
      时间过得很快,明天终于可以拿到房子了,交完这次房租,也可以成为房东了,看看博客也好久没有更新了,最近一直在整机器人,也没有太多时间整理博客。  今天下午和同事一起遇到......
  • 常见算法的拓展
    \(\large\text{Floyed--最小环}\)题目链接思路:枚举环上一条路径\(i\)至\(j\),那么该环一定由是一条\(k\)至\(i\)的边和该路径再加\(j\)至\(k\)的边。在取最......
  • hyper-v 尝试检索虚拟交换机列表时出错
    百度了一下找不到答案,经过一通折腾好了,具体如何好的不清楚。1卸载desktopdocker如果还不行再执行下面的2在启动/关闭windows功能中卸载hyper-v卸载适用于Linux的w......
  • Android开发学习之路--基于vitamio的视频播放器(二)
      终于把该忙的事情都忙得差不多了,接下来又可以开始goodgoodstudy,daydayup了。在​​Android开发学习之路–基于vitamio的视频播放器(一)​​中,主要讲了播放器的界面的......
  • 第8章 使用标记帮助工具构建表单(ASP.NET Core in Action, 2nd Edition)
    本章包括使用TagHelpers轻松构建表单使用锚标记帮助程序生成URL使用TagHelpers为Razor添加功能在第7章中,您了解了Razor模板以及如何使用它们为应用程序生成视图。......
  • 服务调用OpenFeign
    1、介绍①什么是OpenFeignOpenFeign是在Feign的基础上进行了加强使用在Client-Consuemr(消费者客户端)Fiegn是一个声明式的Web服务客户端,让编写Web服务客户端非常容易,只......