神奇多普勒——基于毫米波雷达的感应灯

分享作者:yangjiaxu
作者昵称:yangjiaxu
评测品牌:萤火工场
评测型号:CEM5826-M11
发布时间:2024-11-28 11:39:21
0
概要
首先,感谢能够参加iceasy的评测活动,本次活动参与的评测是CEM5826-M11,这是一款萤火工场出品的一款24GHz毫米波雷达模块。简单来说就是利用24GHz 毫米波的反射(多普勒效应)进行人体的检测,从而来识别人体微动或者存在。
开源口碑分享内容

第一次玩这种传感器,虽然接口很简单,采用的是串口的通讯机制,但是还是不由得激动不已,先来看看这款模块的电路吧。

图1 CEM5826-M11电路正面

图2 CEM5826-M11电路背面

通过图1和图2来看,CEM5826-M11模块的电路设计比较复杂,具有四颗较小的芯片,估计分别是MCU,雷达信号收发芯片和电源芯片吧,毕竟太小不容易看清丝印,接下来从背面可以看出该引出的引脚均采用邮票孔和过孔的方式引出,非常适合集成在已有产品的板上,该模块采用的是TTL通讯,利用5V供电,TTL为3.3V电平,同时还有DIO和CLK的烧录接口等等,应该是给模块的芯片进行固件烧录的。从数据手册和电路布局来看,该模块还是较为容易上手的,接下来看看数据手册吧。

通过数据手册来看,可以了解其工作模式。具体是利用MCU来获取SRK1101A芯片采集到的多普勒信号,并且进行处理,从而通过TTL进行将处理好的数据进行返回,返回的数据为ascii格式,采用波特率为115200,8 位数据位,1 位停止位,校验位和流控为 None。返回的数据格式为:v=** ,str=**  。(V  代表目标速度大小,str  代表信号强度)当雷达检测不到目标时,串口停止输出。Eg:v=0.9 km/h str=10442,速度代表0.9km/h,信号强度为10442。

图3 CEM5826-M11结构框架

利用串口也可以对雷达模块进行配置,配置命令如下:

th=**: 检测阈值,默认值为 200。

vmin=**:设置最小检测速度,单位为 km/h,默认值为 0。

vmax=**:设置最大检测速度,单位为 km/h,默认值为 100。

led_on_100ms=**: 设置 led 电平维持时间,时间为 xx*0.1s,默认值为 10。

led_iflag=xx: 设置 led 指示模式,led_iflag 默认值为 0。当 led_iflag=0 时,高电平指示检测到目标,低电

平指示未检测到目标。当 led_iflag=1 时,高电平指示未检测到目标,低电平指示检测到目标。

save:将当前参数存储到 flash 中,确保参数掉电不丢失。

get_all: 获取当前参数值。

VER:获取软件版本号。

图4 CEM5826-M11获取配置信息


图5 CEM5826-M11配置阈值信息


图6 CEM5826-M11串口工具下进行调试以及得出的结果


既然已经知道如何获取数据与数据格式,并且了解如何配置,那接下来就可以用MCU与该模块进行结合,做些有趣的东西啦。本次利用STM32单片机作为主控,通过对CEM5826-M11采集到的数据进行判断,信号强度大于1000,则控制LED打开,信号强度小于1000则关闭LED。

程序代码如下:


         if(Radar_Flag)
        {
            Radar_Flag = 0;
            memcpy(Radar_buf, USART2_RX_BUF, 50);
            memset(USART2_RX_BUF, 0, 50);

            for(i = 0; i < 50; i++)
            {
                if(memcmp(Radar_Distance, &Radar_buf[i], 4) == 0)
                {		
										for(j = 0; j < 5; j ++)
										{
											if(0x0d == Radar_buf[i + 4 + j])
											{
												switch(j)
												{
													case 1:
														Radar = (Radar_buf[i + 4] - 0x30);
														break;
													case 2:
														Radar = (Radar_buf[i + 4] - 0x30) * 10 + (Radar_buf[i + 5] - 0x30);
														break;													
													case 3:
														Radar = (Radar_buf[i + 4] - 0x30) * 100 + (Radar_buf[i + 5] - 0x30) * 10 + (Radar_buf[i + 6] - 0x30);
														break;
													case 4:
														Radar = (Radar_buf[i + 4] - 0x30) * 1000 + (Radar_buf[i + 5] - 0x30) * 100 + (Radar_buf[i + 6] - 0x30) * 10 + (Radar_buf[i + 7] - 0x30);
														break;
													case 5:
														Radar = (Radar_buf[i + 4] - 0x30) * 10000 + (Radar_buf[i + 5] - 0x30) * 1000 + (Radar_buf[i + 6] - 0x30) * 100 + (Radar_buf[i + 8] - 0x30) * 10 + (Radar_buf[i + 9] - 0x30);
														break;													
												}											
											}
										}
                    

                    if (Radar > 1000)
                    {
                        LED1 = LED_ON;
                        LED2 = LED_ON;
                        LED3 = LED_ON;
                    }
                    else
                    {
                        LED1 = LED_OFF;
                        LED2 = LED_OFF;
                        LED3 = LED_OFF;
                    }
                }
            }
        }


图7 单片机仿真界面,获取信号强度完全正确

最终的效果如下:

图8 感应到人体并LED亮起

总结:本次调试非常顺利,感觉获取到的数据与数据处理非常顺利,但是可以看出,该模块的返回数据协议并不是很适合做产品,没有数据长度,不容易进行对数据进行处理,不过也可以套用对关键字节的判断进行长度的获取,但是该方式较为麻烦,建议后续如果可以修改协议内容则可以增加数据长度,则可以判断信号强度或者速度等等。但对该模块进行评测发现该模块确实适合做人体检测,十分灵敏,微动情况下也可以感应到人体的存在,较人体红外检测来说,十分灵敏且准确,十分值得推荐。最后,再次感谢iceasy的评测活动,感谢萤火工厂提供的雷达模块~





全部评论
暂无评论
0/144