传感器介绍
HC-SR505小型人体感应模块是基于红外线技术的自动控制产品,灵敏度高,可靠性强,小体积,低电压工作模式。
全自动感应:人进入其感应范围则输出高电平,人离开感应范围则自动延时(8s左右)关闭高电平,输出低电平。
默认工作电压:DC4.5V-20V
三个引脚:电源正极、电源负极、OUT信号输出
编写驱动思路
通过简单了解HC-SR505传感器之后,我们发现要实现该功能模块并不复杂。因为该传感器只有一个输出引脚,我们只要获取到该引脚电平,就可以根据这个值来判断是否有人(1:有人 0:没人)
DTS设备注册
修改 kernel/arch/arm64/boot/dts/rockchip/rk3308-firefly.dtsi 该文件,增加以下资源描述:
其中 sr505-gpio 即为输出引脚,这里设置该引脚为中断模式,触发方式为双边沿触发
驱动程序编写
笔者在 kernel/drivers/misc 目录下新建了 infrared 目录,在该目录下完成驱动程序的编写,如下:
中断处理函数中,完成获取gpio值的工作,并保存在全局变量val中。
在该函数中,根据全局变量val的值调用 copy_to_user() 函数拷贝不同的字符串到 buf 数组里面。该函数注册在 struct file_operations 结构体中,如下:
而 sr505_fpos 又注册在 struct miscdevice 结构体中,如下:
当驱动编译进内核之后,我们可以在串口中 /dev/ 下面看到名字为 “infrared”的字符设备文件。
温馨提示:完整的驱动文件可见后面附件
测试程序编写
在应用层通过打开字符设备文件“infrared”,并不断轮询读取最新的buf,然后根据buf的内容判断是否有人,达到实时检测的效果。
测试程序编写完成后,将其加入到 Buildroot 编译系统内。
效果测试
将驱动程序、测试程序都烧录进板子以后,我们在 /usr/bin/ 目录下找到测试程序生成的可执行文件(笔者的名为demo),并执行它, 如下:
可以看到,有人在感应范围内活动时会打印信息“someone close to”,当人离开感应范围8s左右后会打印信息“anybody around here”。大功告成!!
原作者:lisd
|