SR501人体红外模块

这篇具有很好参考价值的文章主要介绍了SR501人体红外模块。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

人体红外模块 是一种能够检测人或动物发射的红外线而输出电信号的传感器。广泛应用于各种自动化控制装置中。比如常见的楼道自动开关、防盗报警等。


一、SR501模块介绍

引脚 : VCC,OUT, GND

功能 :一种常见的人体红外传感器模块,用于检测人体的活动。

红外感应原理 :SR501 模块内部包含一个红外传感器探测单元,该单元可以检测环境中的红外辐射变化。即使在黑暗中,人体也会通过辐射红外能量来体现温度差异。

  • 静止状态(无人靠近)时,OUT 引脚通常为电平。
  • 有人体靠近时,OUT 引脚通常会从低电平变为电平。

2 个电位器 : 可以通过电位器实现封锁时间和检测距离的调节 ( 延时控制,距离调节 )。

SR501人体红外模块,linux 驱动实战,sr501,人体红外模块,linux,驱动开发SR501人体红外模块,linux 驱动实战,sr501,人体红外模块,linux,驱动开发

二、设备树添加节点

配置设备树需要对 GPIO 引脚 以及相关的 pincontrol 配置。由于本实验是使用 SR501 模块,所以不需要配置 pincontrol 。

通过 SR501人体红外模块 的原理图得到 该模块 高电平有效。我将其接到开发板的 gpio4-19 引脚。
compatible :用于 和 驱动程序进行匹配。
使用 gpio4 组的 19 号引脚。(每一组有 32 个引脚)

SR501人体红外模块,linux 驱动实战,sr501,人体红外模块,linux,驱动开发

三、驱动程序

  1. 定义字符设备结构体。
    由于 使用 模块 SR501,只需要读出引脚电平即可。
static struct file_operations sr501_ops={
	.owner = THIS_MODULE,
    .read  = sr501_read,
};
  1. 实现 read 函数。

wait_event_interruptible(sr501_wq, sr501_data); : 这是一个等待队列的函数调用。当前执行的线程(或进程)进入睡眠状态,直到满足指定的条件。

sr501_wq :等待队列头对象。

sr501_data 是条件。如果 sr501_data 为真(非零),表示数据已经准备好,线程可以继续执行。否则,线程将进入睡眠状态,并被放入等待队列。
copy_to_user 函数的作用是将内核空间中的数据复制到用户空间的缓冲区(buf)中。

static wait_queue_head_t sr501_wq;		// 定义队列头

static ssize_t sr501_read (struct file *file, char __user *buf, size_t size, loff_t *oddset)
{
	int err;
	int len = (size < 4) ? size : 4;
	wait_event_interruptible(sr501_wq, sr501_data);		/* 无数据休眠,有数据唤醒 */
	err = copy_to_user(buf, &sr501_data, len);
	sr501_data = 0;
	return len;
}
  1. 定义一个platform_driver
    sr501_table 数组 用于和设备树里的 信息进行匹配。
    匹配成功后 直接调用 sr501_probe 函数。
static const struct of_device_id sr501_table[] = {
	{ .compatible = "my,sr501"},
	{},
};

static struct platform_driver sr501_driver = {
	.driver = {
		.name		= "sr501",
		.of_match_table = sr501_table,
	},
	.probe			= sr501_probe,
	.remove			= sr501_remove,
};
  1. 注册一个 file_operations 结构体,platform_driver。
    在 入口函数里进行注册,在出口函数里进行 卸载。

init_waitqueue_head:这是一个内核函数,用于初始化一个等待队列头对象。等待队列头用于管理等待队列。
&sr501_wq:这是等待队列头对象的地址

static int sr501_init(void)  
{
	int err;
	major = register_chrdev(0, "sr501", &sr501_ops);
	class = class_create(THIS_MODULE, "sr501_class");
	err = PTR_ERR(class);   
	if (IS_ERR(class)) {
		printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);
		unregister_chrdev(major, "sr501");
		return -1;
	}
	
	platform_driver_register(&sr501_driver);
	
	init_waitqueue_head(&sr501_wq);						// 初始化等待队列头
	return 0;
}
static void sr501_exit(void)  
{
	platform_driver_unregister(&sr501_driver);
	class_destroy(class);
	unregister_chrdev(major, "sr501");
}
  1. 实现 probe 函数。
    当设备树 和 驱动和程序匹配成功后调用 probe 函数。

gpiod_get :从设备树里获取 GPIO 引脚信息。
==gpiod_direction_input ==: 设置引脚方向。()输入
gpiod_to_irq :获得中断号。
request_irq : 申请中断。第二个参数是 中断处理函数。

static int sr501_probe(struct platform_device *pdev)
{
	sr501_gpio = gpiod_get(&pdev->dev, NULL, 0);		//获取引脚信息
	gpiod_direction_input(sr501_gpio);		// 设置为 输入引脚

	irq = gpiod_to_irq(sr501_gpio);			// 获取中断号
	request_irq(irq, sr501_isr, IRQF_TRIGGER_RISING|IRQF_TRIGGER_FALLING, "sr501", NULL);		//请求中断

    device_create(class, NULL, MKDEV(major, 0), NULL, "sr501"); 		//创建设备节点
	return 0;
}
  1. 在 probe 里申请了,就需要在 remove 函数里进行卸载.
	device_destroy(class,MKDEV(major, 0));
	free_irq(irq, NULL);
	gpiod_put(sr501_gpio);
  1. 中断处理函数。
    wake_up 唤醒 在 read 函数里休眠的队列。将 sr501_data 赋值为 1 ,则 read 函数里条件为真,执行程序。
static irqreturn_t sr501_isr(int irq, void *dev_id)
{
	sr501_data = 1;
	wake_up(&sr501_wq);			/* 唤醒队列 */
	return IRQ_HANDLED;
}

四、测试程序

首先判断参数 argc 是否正确。
O_RDWR 可读可写的方式打开设备节点,获取设备句柄 fd
while 循环里读引脚电平,当 引脚为高电平 并且 正确读出时,打印有人靠近。文章来源地址https://www.toymoban.com/news/detail-601215.html

	if(argc != 2)
	{
		printf("Usage: %s <dev>\n",argv[0]);
		return -1;
	}

	//打开文件
	fd = open(argv[1], O_RDWR);
	if(-1 == fd)
	{
		printf("open %s error!\n",argv[1]);
		return -1;
	}

	while (1)
	{
		ret = read(fd, &val, 4);
		if((1 == val) && (ret == 4))
			printf("有人靠近!\n");
	}
	close(fd);

五、上机测试及效果

  1. 将 .ko 文件加载到内核。
    使用 insmod 命令可以将 KO 文件加载到内核中,使模块生效。而使用rmmod 命令可以卸载已加载的模块,lsmod 命令 可以观察已加载到内核的文件。
    SR501人体红外模块,linux 驱动实战,sr501,人体红外模块,linux,驱动开发
  2. 执行测试程序。 /dev/sr501 是在驱动程序中创建的设备节点 ( device_create )。
    当有人靠近时,通过读出引脚电平的变化判断是否有人靠近。
    SR501人体红外模块,linux 驱动实战,sr501,人体红外模块,linux,驱动开发

总结

到了这里,关于SR501人体红外模块的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HC-SR501人体感应模块介绍

    HC-SR501人体感应模块简介       HC-SR501是基于红外线技术的自动控制模块,采用德国原装进口 LHI778 探头设计,灵敏度高,可靠性强,超低电压工作模式,广泛应用于各类自动感应电器设备,尤其是干电池供电的自动控制产品。 HC-SR501人体感应模块实物 HC-SR501人体感应模块电气

    2024年02月01日
    浏览(56)
  • 热释电人体探测模块HC-SR501

          热释电红外传感器是一种能检测人或动物发射的红外线而输出电信号的传感器。早在1938年,有人提出过利用热释电效应探测红外辐射,但并未受到重视,直到六十年代,随着激光、红外技术的迅速发展,才又推动了对热释电效应的研究和对热释电晶体的应用。它正在被

    2024年02月08日
    浏览(35)
  • 基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距

    一、基于STM32F103C8T6最小系统板和STM32CubeMX实现LED灯循环闪烁 二、基于STM32F103C8T6和STM32CubeMX实现UART串口通信数据收发 三、实战小例程 基于STM32F103C8T6最小系统板和STM32CubeMX驱动WS2812B光立方 四、基于STM32F103C8T6最小系统板HAL库CubeMX驱动HC-SR501红外人体传感模块 五、基于STM32F103C8

    2023年04月17日
    浏览(101)
  • 红外人体感应传感器SR602模块使用说明

    ​一.HC-SR602模块         红外人体感应传感器HC-SR602是基于红外线技术的自动控制模块,专用于感应周围人体的存在。该模块相较于HC-SR501,灵敏度较高,抗干扰能力大,且简单易用。 二.HC-SR602模块主要参数 工作电压:3.3V-15V; 静态电流:20uA; 感应距离:最大5M;建议0-

    2024年02月06日
    浏览(41)
  • Linux驱动基础(HC-SR04超声波模块)

    本篇文章将讲解HC-SR04超声波模块的驱动程序编写,有了上篇SR501模块驱动程序编写的基础后这篇文章大家将会学的非常轻松。 HC-SR04超声波模块是一种常用于距离测量和障碍物检测的模块。它通过发射超声波信号并接收回波来计算所测量物体与传感器之间的距离。 HC-SR04超声波

    2024年02月05日
    浏览(47)
  • 基于STM32的超声波HC-SR04和红外测距模块测量距离的实验对比(HAL库)

            前言: 本文主要是为了 日常普通场合 下测距做的 对比实验 ,本实验主要包含 2种模块 : 超声波测距模块 (HC-SR04)和 红外测距模块 (SHARP GP2Y0A21YK0F)。两种模块不管是测距原理和编程实验方式都是不相同的,其测距效果也存在很大差异。感兴趣的读者朋友,

    2023年04月27日
    浏览(63)
  • STM32驱动HC-SR04超声波模块

    本篇文章将带大家使用HAL库驱动HC-SR04超声波模块。超声波模块作为智能小车必备的模块,要学习智能小车的同学是必须掌握好这个模块的使用的。 HC-SR04是一种常用的超声波传感器模块,也被称为超声波测距模块,广泛应用于各种自动化控制和测距系统中。它通常由超声波发

    2024年02月09日
    浏览(44)
  • 【STM32篇】驱动HC_SR04超声波测距模块

    CH_SR04 HC_SR04超声波测距模块可提供 2cm-400cm 的非接触式测距感测功能,测距精度高达3mm;模块包括超声波发射器,接收器与控制电路。 基本工作原理: (1)采用IO口TRIG触发测距,需要给最少10us的高电平。 (2)模块自动发送8个40kHz的方波,自动检测是否有信号返回。 (3)有

    2024年02月17日
    浏览(50)
  • 【arduino】HC-SR04超声波测距模块的驱动与使用

    超声波是振动频率高于20KHZ的机械波。它具有频率高、波长短、绕射现象小、方向性好、能够成为射线而定向传播等特点应用广泛,适合大学生、工程师、技术人员以及电子爱好者等操作。 首先超声波测距模块长这个样 硬件名称:HC-SR04超声波传感器 工作电压:直流(DC):

    2024年02月09日
    浏览(52)
  • 【CubeMX配置STM32驱动超声波模块(HC-SR04)】

    一、CubeMX配置STM32 1、选择定时器 选择 输入捕获模式 预分频设置为71,向上计数,自动重装值65535 然后将名字改为 ECHO 2、配置TRIG口 这里的端口使用其它空闲的IO口是可以的,设置为输出模式,其它配置不需要改变,最主要的是 User Label 那儿,需要设置为 TRIG ,因为驱动函数里

    2024年02月02日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包