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的库来实现,这里就不展开了,下次用到了再来讲解吧。
- AndroidThings学习笔记--gpio控制Led和Button
- AndroidThings学习笔记--pwm控制Led闪烁
- STM8 GPIO 学习(驱动LED、Button)
- AndroidThings学习笔记--初体验
- GPIO控制led亮暗
- 用C#控制TQ2440开发板上的LED小灯(C# GPIO学习笔记)
- 用C#控制TQ2440开发板上的LED小灯(C# GPIO学习笔记)
- STM32学习笔记——控制GPIO输出点亮LED灯(直接操作存储器)
- [转载]STM32学习笔记——控制GPIO输出点亮LED灯(直接操作存储器)
- AndroidThings学习笔记--熟悉RPI3硬件
- [RK3288][Android6.0] 调试笔记 --- 通用GPIO驱动控制LED
- (17/06/25)STM32学习->GPIO输出控制LED
- openwrt 之GPIO之 led 和IO控制
- GPIO配合移位寄存器控制LED
- mx53 linux gpio控制led
- (one) GPIO和LED
- CC2530学习笔记のGPIO配置——点亮LED
- ARM学习笔记6-裸机之GPIO-LED
- C++动态规划之求最长不下降序列(openjudge)
- CountDownLatch源码分析
- 服务器端客户端跳转
- 关于KMP算法
- UCB算法
- AndroidThings学习笔记--gpio控制Led和Button
- java中与数学相关的类
- AngularJs 与Jquery的对比分析,超详细!
- LightOJ
- Apache系列—虚拟主机配置的三种方式(一)
- 在IAR 中出现the stack plug-in failed to set a breakpoint on "main"
- Valid Parentheses
- 初学HTML(二)
- HDU1560 DNA sequence(IDA星) (E)