一、硬件介绍
1、开发板
STM32F103C8T6蓝色开发板, 搭载Cortex-M3内核,Flash 64KB,RAM 20KB,最高72MHz主频;
引脚图

2、雷达模块
CEM5831E-M12 是一款一发两收24GHz毫米波人体存在检测雷达模块。除了检测人体有无及距离外,还可以输出人体相对于雷达的角度,实现人体的位置检测,实现分区域联动控制,可同时检测三个运动目标。
本系统具有一个发射通道,两个接收通道,采用调频连续波(FMCW)工作模式,可对目标的距离和角度进行检测,通过检测积累人体呼吸等微小幅度的运动,来判断人体的存在情况。通过串口向主机输出目标所在的位置;

系统框图
主控MCU:N32G452CCL7(ARM Cortex-M4F内核,主频144MHz)
雷达芯片:SRK1201L

| 参数 | 典型值 |
|---|---|
| 频率 | 24GHz ISM |
| 调制方式 | FMCW |
| 检测距离 | 裸板1米平挂:运动直线距离7米,存在直线距离5米 |
| 供电 | 5V |
| 电流 | 120mA(平均电流) |
| 输出串口电平 | 3.3V |
| 检测周期 | 50ms |
| 数据格式 | 串口 16进制输出 |
| 距离精度 | +/-0.3m |
| 角度误差 | +/-10° |
| 检测目标数 | 3个 |
接口定义
触点为2mm间距;
连接器为0.4mm间距20引脚(DF40C-20DP-0.4V(51))
需要单独飞线引出VCC / GND / RX / TX 使用;


覆盖范围

二、雷达使用
串口波特率:115200、字宽:8bit、停止位:1、奇偶校验:None
1、输出目标信息格式
头码(0xCF)+ 命令码(0x66)+ 字长(1字节:目标个数 * 8 + 3)+
目标个数(1字节)+ 目标信息(字节数=目标个数 * 8)+ 校验和(1 字节)+ 尾码(0xEF)
目标信息8字节含义
目标ID:无符号8位;
目标距离(单位cm):无符号16位,前8位是高8位,后8位是低8位;
目标速度(单位cm/s):有符号16位,前8位是高8位,后8位是低8位,速度为正表示靠近,速度为负表示远离,存在时目标速度默认为 2cm/s;
目标角度(°):有符号8位;
目标幅值:无符号16位,前8位是高8位,后8位是低8位;
例如:CF 66 0B 01 01 00 39 00 0C D3 00 10 6A EF
CF 66 0B 01:分别是头码、命令码、字长【1 * 8 + 3 = 11 = 0x0B(hex)】和 目标个数;
目标信息:【01 00 39 00 0C D3 00 10】
6A EF:分别是校验和、尾码;

2、雷达功能设置指令
命令发送与接收格式:
主机发送(定长):
帧头(0xDF) + 命令码(1字节)+ 数据位(2字节) + 尾码(0xEF)
模块返回(变长):
帧头(0xCF) + 命令码(1字节)+ 字长(1字节:数据位+校验位+尾码)+ 数据位 + 校验位(1字节) + 尾码(0xEF)
1、雷达关闭启用指令
命令:DF 0F 00 00 EF(00:为关闭雷达信号)
返回:CF 0F 00 00 DE EF
命令:DF 0F 00 01 EF(01:为打开雷达信号)
返回:CF 0F 00 01 DF EF
当发送雷达关闭命令后,主动输出目标命令码(0x66)的输出目标个数就会改为 0xFF;
当接收到 0xFF 信息后就不要处理目标个数了;
2、角度范围指令
设置角度范围:
命令:DF 52 XX 00 EF(XX:为角度最大值的绝对值)
例如: DF 52 3C 00 EF
返回: CF 52 03 3C 60 EF
读取角度范围:
命令:DF 53 00 00 EF
返回:CF 53 03 3C 61 EF (3C:为设置的角度范围值)
3、运动最大检测距离指令
设置最大检测距离:
命令:DF 54 XX XX EF (XX XX 为最远运动检测距离,单位:cm)
例如: DF 54 02 EE EF (02 EE 表示750cm)
返回: CF 54 04 02 EE 17 EF
读取最大检测距离:
命令:DF 55 00 00 EF
返回:CF 55 04 02 EE 18 EF
4、存在最大检测距离范围指令
设置存在最大检测距离范围:
命令:DF 56 XX XX EF (XX XX 为最远存在检测距离,单位:cm)
例如: DF 56 02 8A EF (02 8A 表示650cm)
返回: CF 56 04 02 8A B5 EF
读取最大检测距离范围:
命令:DF 57 00 00 EF
返回:CF 57 04 02 8A B6 EF
5、最小检测距离范围指令
设置最小检测距离范围:
命令:DF 58 XX XX EF (XX XX 为最小检测距离,单位:cm)
例如: DF 58 00 14 EF (00 14 表示20cm)
返回: CF 58 04 00 14 3F EF
读取最小检测距离范围:
命令:DF 59 00 00 EF
返回:CF 59 04 00 14 40 EF
6、角度翻转指令
设置角度翻转:
命令:DF 5A XX 00 EF (XX 为角度翻转指令 默认为0:不翻转)
例如: DF 5A 00 00 EF
返回: CF 5A 03 00 2C EF
读取角度翻转:
命令:DF 5B 00 00 EF
返回:CF 5B 03 00 2D EF
7、其他指令
保存设置指令:
命令:DF 14 00 00 EF
查询版本号信息指令:
命令:DF 41 00 00 EF
3、上位机软件使用
1、使用USB转TTL工具,连接雷达模块;

2、打开上位机软件
上位机以极坐标形式显示被测目标的坐标信息,并在坐标图上显示目标点;
(绿色代表处于静止状态,红色代表处于运动状态)
输出的坐标点正负角度是按目标相对雷达中心轴左右一一对应;
(目标处于雷达左方时,输出坐标点是负角度;处于雷达右方时,输出坐标点是正角度)
在上位机右侧输入参数,可用于设置雷达的各项参数;
参数设置后,需在下方点击设置配置即可生效;
(如不点击保存配置则断电后配置会失效,恢复最后一次保存的状态)


三、硬件连接
模块与开发板之间的引脚连接方式如下
| 开发板 | 5V | GND | RX(PA10) |
|---|---|---|---|
| 雷达模块 | 5V | GND | TX |
实物效果搭建如下

四、代码编写(Arduino IDE)
功能效果:通过串口输出雷达模块检测到的相关信息等;
主要相关代码
#define HEAD 0xCF
#define TAIL 0xEF
#define BUF_SIZE 64
byte buf[BUF_SIZE];
byte bufLen = 0;
// 目标信息
struct Target {
uint8_t id;
uint16_t distance;
int16_t speed;
int8_t angle;
uint16_t amp;
};
Target target;
void setup() {
Serial.begin(115200);
while(!Serial);
}
void loop() {
while (Serial.available() > 0) {
byte rxB = Serial.read();
if (rxB == HEAD) {
bufLen = 0;
}
if (bufLen < BUF_SIZE) {
buf[bufLen++] = rxB;
}
// 收到帧尾开始解析
if (rxB == TAIL && bufLen > 8) {
if (buf[0] != HEAD) {
bufLen = 0;
continue;
}
byte targetNum = buf[3];
// 打印原始帧
Serial.print("源格式: ");
for (int i = 0; i < bufLen; i++) {
if (buf[i] < 0x10) Serial.print("0");
Serial.print(buf[i], HEX);
Serial.print(" ");
}
Serial.println();
// 解析目标
Serial.print("目标个数:");
Serial.println(targetNum);
for (int i = 0; i < targetNum; i++) {
int pos = 4 + i * 8;
target.id = buf[pos];
target.distance = (buf[pos+1] << 8) | buf[pos+2];
target.speed = (buf[pos+3] << 8) | buf[pos+4];
target.angle = buf[pos+5];
target.amp = (buf[pos+6] << 8) | buf[pos+7];
// 对齐输出
Serial.print("ID:"); Serial.print(target.id);
Serial.print("\t距离:"); Serial.print(target.distance); Serial.print("cm");
Serial.print("\t速度:"); Serial.print(target.speed); Serial.print("cm/s");
Serial.print("\t角度:"); Serial.print(target.angle); Serial.print("°");
Serial.print("\t幅值:"); Serial.println(target.amp);
}
Serial.println("-------------------------\n");
bufLen = 0;
}
if (bufLen >= BUF_SIZE) bufLen = 0;
}
delay(300);
}

五、效果演示
串口输出雷达模块检测到的相关信息等;
六、雷达模块对比
CEM5861G-M11 和 CEM5831E-M12 采用FMCW调制方式,通过发射和接收信号的频率差计算目标距离,能够检测静止人体的呼吸等微小运动;
CEM5831E-M12 具备角度检测能力和多目标检测能力,可以同时跟踪多个目标,并输出每个目标的距离、速度和角度信息等;
CEM5881-M11采用CW多普勒调制方式,只能检测运动目标,无法检测完全静止的人体,但对运动目标的检测距离更远,响应速度更快;
| 参数 | CEM5861G-M11 | CEM5881-M11 | CEM5831E-M12 |
|---|---|---|---|
| 调制方式 | FMCW (调频连续波) | CW (连续波 / 多普勒) | FMCW (调频连续波) |
| 天线架构 | 一发一收 | 一发一收 | 一发两收 |
| 核心检测能力 | 存在检测 + 运动检测 + 距离输出 | 运动检测 + 微动检测 + 速度输出 + 方向识别 | 存在检测 + 运动检测 + 距离输出 + 角度输出 + 多目标检测 |
| 典型检测距离 | 挂高3m: 静止 3m / 移动 6m 水平安装:运动 7m / 存在 4m | 运动检测直线 > 8m | 1m平挂:运动 7m / 存在 5m |
| 角度检测 | 不支持 | 不支持 | 支持 (±10°误差) |
| 多目标检测 | 不支持 | 不支持 | 支持 (最多3个) |
| 平均工作电流 | 22mA@5V | 70mA@5V | 120mA@5V |
| 供电电压 | 3.6-5.5V DC | 3.6-5V DC | 4-6V DC |
| 输出接口 | UART 串口 (16进制) GPIO 高低电平 | UART 串口 (ASCII) GPIO 高低电平 | UART 串口 (16进制) GPIO 高低电平 |
| 波特率 | 115200 | 115200 | 115200 |
| 尺寸 | 20×20mm | 42×5×1.2mm (窄条) | 32×30mm |
| 发射功率 | 5dBm | - | 11dBm |
| 波束角 | 110° 水平 / 110° 垂直 | - | 106° 水平 / 106° 垂直 (发射) 94° 水平 / 48° 垂直 (接收) |
CEM5861G-M11 和 CEM5881-M11都是一发一收架构,只能检测目标的有无和距离或速度,无法判断目标的方位(角度);
CEM5831E-M12相对的检测功能更多,但需要单独飞线引出引脚使用,模块没有单独预留排针接口;

开源社区
