本帖最后由 逃出生天 于 2016-5-20 08:29 编辑
NanoPI M2的GPIO控制使用普通的配置寄存器的方法太麻烦了,需要查看寄存器表,写很多驱动函数!但是使用python的第三方库gpio控制GPIO却很简单,只需要通过简单的几行代码就可以控制GPIO的输入输出。下面以一个人体红外感应模块检测的问题介绍gpio库的使用。 一.所需材料面包板x1 杜邦线Xn LED灯x1 电阻1kΩx1 人体红外感应模块x1
人体红外感应模块是一个人体红外线检测传感器,当检测到人体红外线时,输出端便会输出一个高电平,引脚定义如下所示: 二.环境搭建打开终端执行
- sudo apt-get update
- sudo apt-get install python3-pip
- sudo pip3 install gpio
复制代码
三.gpio库介绍项目地址:https://github.com/vi tiral/gpio
gpio库是一个第三方库,支持Python2和Python3,使用标准的 linux sysfs接口控制 GPIO 的库。也就是说,只要明确 GPIO 的存器就可以控制 gpio,其他工作库替你完成了细节。
支持的主要功能函数:
- input(pin) or read(pin) #读取引脚的电平状态
- set(pin, value) #设置引脚电平
- mode(pin) #获取引脚模式
- setup(pin, mode) #设置引脚模式,输入='in',输出='out'
- cleanup(pin) #清除引脚电平
复制代码
更多的函数使用help(gpio)查看,注意程序退出时要调用cleanup(pin)函数清除引脚电平,否则下次使用时电平任然为上次使用时的状态。
要使用gpio库控制NanoPI M2的GPIO,得知道寄存器对应的引脚编号,参考前面的nanopi2的帖子,知道了计算的方法为: 引脚编号 = 控制引脚的寄存器基数 + 控制引脚寄存器位数;
比如下面将使用的62号[GPIOB30 ]和63号[GPIOB31 ]引脚
引脚编号 = 控制引脚的寄存器基数 + 控制引脚寄存器位数 62 = 32x1 + 30
63 = 32x1 + 31
依次类推,其中引脚图上的A,B,C,D分别与0,1,2,3对应,比如GPIOC28在gpio库中的编号就是 经过上面的计算我自己整理了如下所示的GPIO对应图【大家可收藏方便查看】:
本次使用3.3v供电,小灯要接一个1kΩ的电阻,62号[GPIOB30 ]作为输出控制小灯,63号[GPIOB31 ]做为输入,接人体红外感应模块的OUT引脚,当检测到一个信号时,63号[GPIOB31 ]便会读到一个高电平,于是触发小灯亮。这就实现了一个输入输出的控制。
四.具体代码实现
- #!/usr/bin/env python3
- # -*- coding:UTF-8 -*-
- import gpio
- import time
- #设置62为输出,63为输入
- gpio.setup(62,'out')
- gpio.setup(63,'in')
- gpio.setwarnings(False)#去除警告信息
- print("NanoPi M2 Module Test!(Ctrl+C to exit)")
- Current_State = 0 #当前状态
- Previous_State = 0 #上一次的状态
- try:
- print("Waiting for NanoPi M2 to settle....")
- while gpio.input(63) == 1:
- Current_State = 0
- print("Read")
- while True:
- Current_State = gpio.input(63)#检测状态
- if Current_State==1 and Previous_State==0:
- gpio.set(62,1)#小灯亮
- print("Motion detected!")
- time.sleep(3)
- gpio.set(62,0)#小灯灭
- Previous_State = 1
- elif Current_State==0 and Previous_State==1:
- print("Read!")
- Previous_State = 0
- time.sleep(0.1)
-
- except KeyboardInterrupt:
- print("Quit!")
- gpio.cleanup(62)
- gpio.cleanup(63)
复制代码
五.测试效果如下所示
到此结束,欢迎拍砖……….
|