微波运动传感器是利用多普勒雷达原理设计的微波移动物体探测器。不同于一般的红外探测器,微波传感器通过通过检测物体反射的微波来探测物体的运动状况,检测对象将并不会局限于人体,还有很多其他的事物。微波传感器不受环境温度的影响,探测距离远,灵敏度高,被广泛应用于工业、交通及民用装置中,如车辆测速、自动门、感应灯、倒车雷达等。
由于微波传感器检测对象存在普遍性,在实际的生活应用中,会搭配另一个传感器来做针对性的检测。如微波传感器+红外热释电传感器,能够有效的判断是否有人经过,不会被阳光,被衣物颜色所干扰,也不会对其他物体产生反应。
模块来源
规格参数
工作电压:5V±0.25V
工作电流:30~50mA
探测距离:2-16m 连续可调
尺寸: R=30.6mm
输出方式: GPIO
管脚数量:3 Pin
以上信息见厂家资料文件
移植过程
我们的目标是将例程移植至开发板上【能够判断测量一定距离内是否物体运动】。首先要获取资料,查看数据手册应如何实现读取数据,再移植至我们的工程。
查看资料
由于微波传感器检测对象存在普遍性,即只要有物体动作,都能够检测到,因此只需要检测OUT引脚的高低电平变化即可。
引脚选择
这里选择的引脚见引脚接线表
代码移植
下载为大家准备的驱动代码文件夹,复制到自己工程中\luban-lite\application\rt-thread\helloworld\user-bsp
文件夹下
提示
如果未找到 user-bsp
这个文件夹,说明你未进行模块移植的前置操作。请转移到手册使用必要操作(点击跳转)中进行必要的配置操作!!!
接下来打开自己的工程,开始修改Kconfig文件。
1、在 VSCode 中打开 application\rt-thread\helloworld\Kconfig 文件
2、在该文件的 #endif
前面添加该模块的 Kconfig路径语句
# 微波多普勒无线雷达传感器
source "application/rt-thread/helloworld/user-bsp/microwave-doppler-sensor/Kconfig"
2
menuconfig操作
1、我们 双击 luban-lite
文件夹下的 win_env.bat
脚本打开env工具:
2、输入以下命令列出所有可用的默认配置:
scons --list-def
3、选择 d13x_JLC_rt-thread_helloworld
这个配置!这个是我们衡山派开发板的默认配置!输入以下命令即可:
scons --apply-def=7
或者
scons --apply-def=d13x_JLC_rt-thread_helloworld_defconfig
这两个命令作用是一样的,一个是 文件名 ,一个是 编号 !!!
4、输入以下命令进入menuconfig菜单
scons --menuconfig
进入以下界面:
5、选中 Porting code using the LCKFB module
按
Y
选中按
N
取消选中方向键
左右
调整 最下面菜单的选项方向键
上下
调整 列表的选项
回车
执行最下面菜单的选项
6、回车进入 Porting code using the LCKFB module
菜单
7、按方向键 上下
选中 Using Microwave Doppler wireless radar sensor
后按 Y
键,看到前面括号中出现一个 *
号,就可以下一步了。
8、按方向键 左右
选中 <Save>
然后一路回车
,然后 退出
即可
编译
我们 保存并退出menuconfig菜单 之后,输入以下命令进行编译:
scons
或
scons -j16
-j 用来选择参与编译的核心数: 我这里是选择16
大家可以根据自己的电脑来选择
核心越多编译越快
如果写的数量高于电脑本身,那么就自动按照最高可用的来运行!
镜像烧录
编译完成之后会在 \luban-lite\output\d13x_JLC_rt-thread_helloworld\images
文件夹下生成一个 d13x_JLC_v1.0.0.img
镜像文件!
然后我们烧录镜像,具体的教程请查看:镜像烧录(点击跳转🚀)
到这里完成了,请移步到 最后一节 进行移植验证。
工程代码解析
bsp_mh100x.c
/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 文档网站:wiki.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 嘉立创社区问答:https://www.jlc-bbs.com/lckfb
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
*/
#include <stdlib.h>
#include <string.h>
#include <getopt.h>
#include <sys/time.h>
#include <rtthread.h>
#include <inttypes.h>
#include <finsh.h>
#include "hal_adcim.h"
#include "rtdevice.h"
#include "aic_core.h"
#include "aic_log.h"
#include "hal_gpai.h"
#include "aic_hal_gpio.h"
#include "hal_i2c.h"
#include "bsp_mh100x.h"
#define MH100X_PIN_NAME "PE.14"
static rt_base_t MH100X_PIN;
//获取引脚的电平变化
#define MH100X_PIN_GET() rt_pin_read(MH100X_PIN)
/**********************************************************
* 函 数 名 称:MH100X_State_Read
* 函 数 功 能:返回引脚电平状态
* 传 入 参 数:无
* 函 数 返 回:0:检测到物体移动 1:未检测到物体移动
* 作 者:LCKFB
* 备 注:
**********************************************************/
int MH100X_State_Read(void)
{
return MH100X_PIN_GET();
}
/**********************************************************
* 函 数 名 称:MH100X_Init
* 函 数 功 能:初始化MH100X
* 传 入 参 数:无
* 函 数 返 回:RT_OK:完成 -RT_ERROR:错误
* 作 者:LC
* 备 注:LP
**********************************************************/
int MH100X_Init(void)
{
MH100X_PIN = rt_pin_get(MH100X_PIN_NAME);
rt_pin_mode(MH100X_PIN, PIN_MODE_INPUT_PULLUP);
return RT_EOK;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
bsp_mh100x.h
/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 文档网站:wiki.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 嘉立创社区问答:https://www.jlc-bbs.com/lckfb
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
*/
#ifndef __BSP_MH100X_H__
#define __BSP_MH100X_H__
#include "stdio.h"
int MH100X_Init(void);
int MH100X_State_Read(void);
#endif
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Kconfig
这个是一个menuconfig中的选项,如果在菜单中选中该选项,就会在rtconfig.h
中定义一个语句,用来if判断条件编译之类的。
config LCKFB_MICROWAVE_DOPPLER_SENSOR
bool "Using Microwave Doppler wireless radar sensor"
default n
help
More information is available at: https://wiki.lckfb.com/
2
3
4
5
6
SConscript
自动化构建文件,如果定义了 LCKFB_MICROWAVE_DOPPLER_SENSOR
和 USING_LCKFB_TRANSPLANT_CODE
就自动编译当前目录下的文件!!
Import('RTT_ROOT')
Import('rtconfig')
import rtconfig
from building import *
cwd = GetCurrentDir()
CPPPATH = [cwd]
src = []
if GetDepend('LCKFB_MICROWAVE_DOPPLER_SENSOR') and GetDepend('USING_LCKFB_TRANSPLANT_CODE'):
src = Glob(os.path.join(cwd, '*.c'))
group = DefineGroup('lckfb-microwave-doppler-sensor', src, depend = [''], CPPPATH = CPPPATH)
Return('group')
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
test_microwave_doppler_sensor.c
这个文件定义了一个用于处理MH100X微波多普勒传感器的线程,初始化了MH100X传感器,并设置了线程的优先级、栈大小和时间片。
线程的主要任务是周期性地读取MH100X传感器的状态,并根据状态打印相应的信息到控制台。线程在读取数据时会进行错误检查,并在一定次数的读取后提示用户可以通过命令退出读取循环。通过命令行接口,用户可以启动这个线程来测试MH100X传感器的功能,并且可以输入命令来退出读取循环。
线程入口函数逻辑
- 使用整型变量
loop_counter
来控制循环次数。 - 调用
MH100X_Init
函数初始化MH100X传感器,并检查初始化是否成功。 - 在一个无限循环中,首先调用
MH100X_State_Read
函数读取传感器的状态。 - 如果状态为0(开启),打印"Open"并延时2秒。
- 如果状态非0(关闭),打印"Close"并延时500毫秒。
- 当循环次数达到10次时,打印提示信息,告诉用户如何退出读取循环,并延时2秒。
- 循环继续,直到用户输入退出命令。
MH100X启动函数逻辑
创建名为"mh100x_thread"的线程,入口函数为mh100x_thread_entry
,无参数,设置栈大小、优先级和时间片。 如果线程创建成功,启动线程。
提示
MSH_CMD_EXPORT
宏将test_microwave_doppler_sensor
函数导出为RT-Thread命令行接口的命令,这样用户可以在RT-Thread的命令行中直接运行microwave doppler sensor
命令来启动MH100X传感器的读取。另外,test_exit_microwave_doppler_sensor
函数也被导出为命令,允许用户通过运行quit MH100X
命令来退出MH100X传感器的读取循环。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <getopt.h>
#include <sys/time.h>
#include <rtthread.h>
#include "rtdevice.h"
#include "aic_core.h"
#include "aic_hal_gpio.h"
#include "bsp_mh100x.h"
#define THREAD_PRIORITY 25 // 线程优先级
#define THREAD_STACK_SIZE 1024 // 线程大小
#define THREAD_TIMESLICE 10 // 时间片
static rt_thread_t mh100x_thread = RT_NULL; // 线程控制块
// 线程入口函数
static void mh100x_thread_entry(void *param)
{
int loop_counter = 1;
int ret = 0;
/* MH100X 初始化 */
if ((ret = MH100X_Init()) != RT_EOK)
{
LOG_E("MH100X initialization failed!");
return;
}
rt_kprintf("MH100X initialized successfully!\n");
/* 主循环 */
while (1)
{
int mh100x_state = MH100X_State_Read();
if(!mh100x_state)
{
rt_kprintf("\nOpen !!\n");
rt_thread_mdelay(2000); // 延时 2 秒
}
else
{
rt_kprintf("\nClose !!\n");
rt_thread_mdelay(500); // 延时 500ms
}
/* 控制循环次数和用户提示 */
if (loop_counter++ >= 10)
{
loop_counter = 1;
rt_kprintf("Type 'test_exit_microwave_doppler_sensor' to exit MH100X read loop.\n");
rt_kprintf("Note: Press [TAB] for auto-completion of the command.\n");
rt_thread_mdelay(2000); // 延时 2 秒
}
}
}
/* MH100X启动函数 */
static void test_microwave_doppler_sensor(int argc, char **argv)
{
/* 创建线程,名称是 mh100x_thread,入口是 mh100x_thread_entry */
mh100x_thread = rt_thread_create("mh100x_thread",
mh100x_thread_entry, RT_NULL,
THREAD_STACK_SIZE,
THREAD_PRIORITY, THREAD_TIMESLICE);
/* 如果获得线程控制块,启动这个线程 */
if (mh100x_thread != RT_NULL)
rt_thread_startup(mh100x_thread);
}
// 导出函数为命令
MSH_CMD_EXPORT(test_microwave_doppler_sensor, run microwave doppler sensor);
/* MH100X退出函数 */
static void test_exit_microwave_doppler_sensor(void)
{
int ret = rt_thread_delete(mh100x_thread);
if(ret != RT_EOK)
{
LOG_E("failed to test_exit_microwave_doppler_sensor !!");
}
else
{
rt_kprintf("\n========MH100X exit successful !!========\n");
}
}
// 导出函数为命令
MSH_CMD_EXPORT(test_exit_microwave_doppler_sensor, quit MH100X);
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
移植验证
我们使用串口调试,将 USB转TTL模块 连接到衡山派开发板上面!!
具体的教程查看:串口调试(点击跳转🚀)
串口波特率默认为
115200
我们在输入下面的命令运行该模块的线程:
输入的时候按下
TAB键
会进行命令补全!!
test_microwave_doppler_sensor