⚠️转载、引用等 请注明出处;
一、硬件介绍
1、产品特点
Beetle RP2350【RP2350A_QFN60】是一款基于RP2350微控制器的高性能迷你开发板,双核双架构设计(支持 Arm Cortex-M33或Hazard3 RISC-V内核)为开发者提供灵活的性能配置。
双核双架构,性能自由切换
- 采用Raspberry Pi RP2350高性能微控制器,支持Arm Cortex-M33或Hazard3 RISC-V内核选择。
- 主频高达150MHz,配备520KB RAM和2MB Flash,可高效处理大量数据,满足高性能计算需求。
高度集成,硬币大小
- 尺寸仅为25mm x 20.5mm,相当于一枚硬币大小,适合空间受限的应用场景。
- 提供 11个IO接口、BAT接口和3.3V电源接口,满足多样化连接需求。
锂电池管理与监测 集成 锂电池充电管理 和 电池电压监测 功能,支持实时电量监控,确保设备在低电量时及时采取措施,确保持续运行。
易于编程与集成
- 支持 C/C++ 和 MicroPython 编程

2、功能引脚示意图 / 原理图
板载LED灯
IO25引脚控制
充电指示灯
指示充电状态的绿色LED灯通过三种方式指示充电状态:1、充满电或未接入电源时熄灭;2、充电时常亮;3、USB供电,未连接锂电池时高频闪烁;
用户按键
使用QSPI_SS引脚控制该按钮

| 引脚号 | 数字口 | 模拟口 | UART | I2C | SPI | 其它 |
|---|---|---|---|---|---|---|
| 0 | D0 | TX1 | ||||
| 1 | D1 | RX1 | ||||
| 4 | D4 | SDA | ||||
| 5 | D5 | SCL | ||||
| 8 | D8 | TX2 | ||||
| 9 | D9 | RX2 | ||||
| 16 | D16 | SPI0/MISO | ||||
| 18 | D18 | SPI0/SCK | ||||
| 19 | D19 | SPI0/MOSI | ||||
| 26 | D26 | A0 | ||||
| 27 | D27 | A1 | ||||
| BAT | 锂电池输入接口,IO29为电池电压检测引脚 | |||||
| GND | 接地引脚 | |||||
| VCC | 该引脚接在USB电源引脚,作为输出时电压为USB电压,通常为5V | |||||
| 3V3 | 3.3V稳压电源输出 |
主要原理图:

3、外部硬件
1、雷达模块【CEM5861G-M11】
CEM5816G-M11 是一款高灵敏度 24GHz 毫米波 FMCW 人体存在检测雷达模块; 本模块主要特点是在传统人体感应雷达的功能基础上,同时具备检测人体呼吸等微小幅度的运动,来判断人体存在的功能; 模块采用 FMCW 调制,可以同时输出目标的距离。 模块可选带光敏,用户可根据环境光大小,对光敏门限进行设置; 在光照充足时关闭雷达,光照黑暗时开启雷达,实现照明感应的应用;

系统框架

特性:
| 参数 | 典型值 |
|---|---|
| 频率 | 24G-24.25GHz |
| 调制方式 | FMCW |
| 范围 | 挂高安装:挂高 3m,静止人体检测半径 3m (可调), 移动检测半径 6m max(可调) 水平安装:直线 7 米运动检测,4 米存在检测 |
| 供电 | 3.6 - 5.5V |
| 电流 | 22mA(平均值),80mA(峰值) |
| 输出串口电平 | TTL(3.3V) |
| 检测周期 | 实时 |
| 数据格式 | UART |
引脚定义

| 序号 | 功能 | 备注 |
|---|---|---|
| 1 | OUT | 有人输出高电平 3.3V,无人输出低电平 0V |
| 2 | UART_TX | 串口发送 |
| 3 | UART_RX | 串口接收 |
| 4 | GND | 地 |
| 5 | VCC | 供电 3.6 ~ 5.5V |
数据格式说明
所有多字节参数,均采用大端格式传输
| 数据格式 | 说明 |
|---|---|
| 帧头(2 字节) | 上位机发送,雷达接收: 0x55 0x5A 雷达发送,上位机接收: 0x55 0xA5 |
| 数据长度(2 字节,高字节在前,低字节在后) | 长度 = 功能码 + 命令码 + 数据 + 校验和 |
| 功能码(1 字节) | 读:0x0、写:0x1 被动上报:0x2、主动上报:0x3 读 / 写命令为上位机向雷达发送指令 上报命令为雷达向上位机发送信息 |
| 命令码(2 字节) | 命令码1:为功能分类 命令码2:表示具体功能 |
| 数据 | N字节 |
| 校验和(1 字节) | 为校验和之前所有数据按 uint8_t 格式相加之和的 低8位。 |
1、上位机接收到雷达发送的数据
例:55 A5 00 0E 03 81 00 00 01 00 5E 00 00 00 00 01 78 64
55 A5 00 0E 03 CMD[1] CMD[2] Data[0] ~ Data[9] SUM
帧头(55 A5):上位机接收到雷达发送的数据;
数据长度(0x0E / 14):功能码(1) + 命令码(2) + 数据(10) + 校验和(1);
功能码(0x03):主动上报;
命令码(81 00)
数据:检测到运动目标,目标距离为 0.94 米,信号强度为 376
目标 ID:0x00运动状态:0x01(检测到运动目标)
目标距离:0x00 0x5E(转换成十进制为:94cm)
速度 / 方位角度 / 俯仰角度:0
目标信号强度:0x01 0x78(转换成十进制为:376)
校验和:0x64(转换成十进制为:100)
2、Data 数据说明
| Data[0] | 说明 |
|---|---|
| Data[0] | 目标ID号:8位无符号整型 |
| Data[1] | 目标状态:8位无符号整型; 0:无目标; 1:表示移动; 2:表示存在 |
| Data[2]、Data[3] | 距离:16位无符号整型(cm) |
| Data[4]、Data[5] | 速度:16位有符号整型(cm/s) |
| Data[6] | 方位角度:8位有符号整型(°度) |
| Data[7] | 俯仰角度:8位有符号整型(°度) |
| Data[8]、Data[9] | 信号强度:16位无符号整型 |
雷达功能参数配置
16 进制收发,支持在线修改和保存参数:
波特率:115200、字宽: 8、停止位: 1、奇偶校验: none
使用串口工具(USB-TTL)连接至模块,并打开串口调试工具,可进行以下功能的配置;
| 参数功能 | 读取指令 |
|---|---|
| OTA 在线升级 | 发送:55 5A 00 04 01 20 01 D5 接收:55 A5 00 04 02 20 01 21 |
| 恢复到默认参数 | 发送:55 5A 00 04 01 20 02 D6 接收:55 A5 00 04 02 20 02 22 |
| 将所有参数保存到 flash 中 | 发送:55 5A 00 04 01 20 04 D8 接收:55 A5 00 04 02 20 04 24 |
| 获取软件版本号 | 发送:55 5A 00 04 00 00 01 B4 接收:55 A5 00 11 02 00 01 DATA1~DATA13 SUM |
| 1米内运动检测阈值(默认值:200) | 读取:55 5A 00 04 00 80 03 36 设置:55 5A 00 06 01 80 03 DATA1 DATA2 SUM 接收:55 A5 00 06 02 80 03 DATA1 DATA2 SUM |
| 1米外运动检测阈值(默认值:120) | 读取:55 5A 00 04 00 80 04 37 设置:55 5A 00 06 01 80 04 DATA1 DATA2 SUM 接收:55 A5 00 06 02 80 04 DATA1 DATA2 SUM |
| 1米内存在检测阈值(默认值:300) | 读取:55 5A 00 04 00 80 09 3C 设置:55 5A 00 06 01 80 09 DATA1 DATA2 SUM 接收:55 A5 00 06 02 80 09 DATA1 DATA2 SUM |
| 1米外存在检测阈值(默认值:300) | 读取:55 5A 00 04 00 80 0A 3D 设置:55 5A 00 06 01 80 0A DATA1 DATA2 SUM 接收:55 A5 00 06 02 80 0A DATA1 DATA2 SUM |
| 最小检测距离(默认值 10cm) | 读取:55 5A 00 04 00 80 0C 3F 设置:55 5A 00 06 01 80 0C DATA1 DATA2 SUM 接收:55 A5 00 06 02 80 0C DATA1 DATA2 SUM |
| 运动最大检测距离(默认值 :600cm) | 读取:55 5A 00 04 00 80 0D 40 设置:55 5A 00 06 01 80 0D DATA1 DATA2 SUM 接收:55 A5 00 06 02 80 0D DATA1 DATA2 SUM |
| 存在最大检测距离(默认值: 450cm) | 读取:55 5A 00 04 00 80 0E 41 设置:55 5A 00 06 01 80 0E DATA1 DATA2 SUM 接收:55 A5 00 06 02 80 0E DATA1 DATA2 SUM |
| VO输出电平维持时间(默认值: 20000ms) | 读取:55 5A 00 04 00 80 14 47 设置:55 5A 00 06 01 80 14 DATA1 DATA2 SUM 接收:55 A5 00 06 02 80 14 DATA1 DATA2 SUM |
| VO指示模式(0x00:高电平指示有人;0x01:低电平指示无人) | 读取:55 5A 00 04 00 80 15 48 设置:55 5A 00 05 01 80 15 DATA1 SUM 接收:55 A5 00 05 02 80 15 DATA1 SUM |
| 停止串口发送数据 | 设置:55 5A 00 05 01 80 11 00 46 接收:55 A5 00 05 02 80 11 00 01 |
| 开启串口发送数据 | 设置:55 5A 00 05 01 80 11 01 47 接收:55 A5 00 05 02 80 11 01 01 |
| 串口数据间隔时间(10ms / 以10倍率设置) | 读取:55 5A 00 04 00 20 06 D9 设置:55 5A 00 06 01 20 06 DATA1 DATA2 SUM 接收:55 A5 00 06 02 20 06 DATA1 DATA2 00 |
设置雷达参数
例: 雷达的移动感应距离设置为 5 米,存在距离 4 米,感应后输出高电平延时时间 5 秒
设置完成后,发送指令 55 5A 00 04 01 20 04 D8 进行保存,否则掉电会失效。
1、运动最大检测距离
串口发送:55 5A 00 06 01 80 0D 01 F4 38
串口返回信息:55 A5 00 06 02 80 0D 01 F4 84,表示移动检测距离已设置为 5 米
2、存在最大检测距离
串口发送:55 5A 00 06 01 80 0E 01 90 D5。
串口返回信息:55 A5 00 06 02 80 0E 01 90 21,表示存在检测距离已设置为 4 米
3、VO输出电平维持时间
串口发送:55 5A 00 06 01 80 14 13 88 E5。
串口返回信息:55 A5 00 06 02 80 14 13 88 31,表示感应输出高电平维持时间设置为 5 秒
上位机使用
上位机软件下载
1、连接好模块后,点击串口检测—串口选择—打开串口,此时显示界面会显示距离值及状态。


2、点击设置界面窗口,进入参数设置界面。可对模块的灵敏度,检测距离,串口延时,IO 延时等做配 置,在指令框中直接输入数值并点击写,即可修改模块参数。 灵敏度设置栏中,近距离运动/存在灵 敏度对应 1 米内设置,中距离运动 / 存在灵敏度对应 1 米外设置,修改完参数后点击保存按钮进行保存。
3、点击距离统计窗口,会实时显示距离及信号强度曲线。距离统计窗口上方曲线是实时距离曲线,红 色曲线代表静止目标的距离,绿色曲线代表运动目标的距离。
下方窗口显示的是实时信号强度曲线,红色曲线代表静止目标的能量值,绿色曲线代表运动目标的能量值

2、喇叭模块【GSPK2307P-8R1W】

| 项目 | 规格 | 条件 |
|---|---|---|
| 额定阻抗 | 8 Ohm±15% | 1kHz 1.0 V |
| 额定输入功率 | 0.5W | 2.0 V |
| 最大输入功率 | 1.0W | 2.0V |
| 最低共振频率 | 1700±20% Hz | 1.0 V Input |
| 灵敏度 | 88±3dB | 0.1m 0.1W |
| 有效频率范围 | F0~20KHz | - |
| 谐波失真 | ≤5% at 1kHz | - |
二、硬件连接
模块与开发板引脚之间的连接方式如下:
| RP2350开发板 | VCC | GND | TX2 | RX2 | A1 | A0 |
|---|---|---|---|---|---|---|
| 雷达模块 | VCC | GND | RX | TX | - | - |
| 喇叭模块 | - | GND | - | - | VCC | - |
| LED模块 | - | GND | - | - | - | VCC |
实物效果搭建如下:

三、项目功能实现思想
【人体运动感应警报系统】
实现效果:
实时检测判断人体运动 / 静止状态等相关信息;
处于运动时,输出此时的距离相关信息,并在不同距离范围内时,触发不同的警报效果;
处于静止时,绿色LED亮起,直到重新处于运动状态时才熄灭;
上位机串口输出相关数据信息;
四、功能实现主要步骤
主要相关代码
1、LED控制部分
#define LED_Pin A0
bool ledState = false;
void Led_Control(){
ledState = true;
Count = 0;
}
...
if(ledState)
digitalWrite(LED_Pin, HIGH);
else
digitalWrite(LED_Pin, LOW);
2、警报声音控制部分
#define Sound_Pin A1
bool soundState = false;
static unsigned long Stop = 0;
// 在不同范围内 触发不同警报声音 1s
void Sound_Control(){
if(soundState){
if(dis <=200){ // 2米内
tone(Sound_Pin, 1500); // 1.5 kHz
}else if(dis > 200 && dis <=400){ // 2~4m
tone(Sound_Pin, 1000);
}else if(dis >400){ //4米外
noTone(Sound_Pin);
}
}else{
noTone(Sound_Pin);
}
if(millis() - Stop > 1000){
Stop = millis();
soundState = !soundState;
}
}
3、雷达控制部分
#define COUNT 10
static byte buffer[18]; //存储数据
static byte Count = 0;
static uint16_t dis; //距离
//雷达数据处理函数
void Radar_Control(){
//数据处理
if(Serial2.available()){
int header = Serial2.read();
// 数据 18byte
if(header == 0x55){
int len = Serial2.readBytes(buffer,17);
// 逐个字节 打印十六进制格式数据
//A5 00 0E 03 81 00 00 02 00 67 00 00 00 00 25 B0 32 (17byte)
for (int i = 0; i < len; i++) {
if (buffer[i] < 0x10) Serial.print("0");
Serial.print(buffer[i], HEX);
Serial.print(" ");
}
Serial.println();
//打印运动状态
if(buffer[7] == 0x01){
Serial.print("处于运动状态 ");
if(Count>0){
Count = 0;
ledState = false;
}
}else{
Serial.print("处于静止状态 ");
Count++;
//超过统计次数时 点亮LED
if(Count >= COUNT) Led_Control();
}
//打印当前距离 cm
dis = (buffer[8] << 8) | (buffer[9] & 0XFF);
Serial.printf("当前距离为: %dcm\r\n",dis);
Serial.println();
Sound_Control();
}
}
}
完整代码
#define LED_Pin A0
#define Sound_Pin A1
#define COUNT 10
bool ledState = false;
bool soundState = false;
static unsigned long Stop = 0;
static byte buffer[18]; //存储数据
static byte Count = 0;
static uint16_t dis; //距离
void Led_Control(){
ledState = true;
Count = 0;
}
// 在不同范围内 触发不同警报声音 1s
void Sound_Control(){
if(soundState){
if(dis <=200){ // 2米内
tone(Sound_Pin, 1500); // 1.5 kHz
}else if(dis > 200 && dis <=400){ // 2~4m
tone(Sound_Pin, 1000);
}else if(dis >400){ //4米外
noTone(Sound_Pin);
}
}else{
noTone(Sound_Pin);
}
if(millis() - Stop > 1000){
Stop = millis();
soundState = !soundState;
}
}
//雷达数据处理函数
void Radar_Control(){
//数据处理
if(Serial2.available()){
int header = Serial2.read();
// 数据 18byte
if(header == 0x55){
int len = Serial2.readBytes(buffer,17);
// 逐个字节 打印十六进制格式数据
//A5 00 0E 03 81 00 00 02 00 67 00 00 00 00 25 B0 32 (17byte)
for (int i = 0; i < len; i++) {
if (buffer[i] < 0x10) Serial.print("0");
Serial.print(buffer[i], HEX);
Serial.print(" ");
}
Serial.println();
//打印运动状态
if(buffer[7] == 0x01){
Serial.print("处于运动状态 ");
if(Count>0){
Count = 0;
ledState = false;
}
}else{
Serial.print("处于静止状态 ");
Count++;
//超过统计次数时 点亮LED
if(Count >= COUNT) Led_Control();
}
//打印当前距离 cm
dis = (buffer[8] << 8) | (buffer[9] & 0XFF);
Serial.printf("当前距离为: %dcm\r\n",dis);
Serial.println();
Sound_Control();
}
}
}
void setup() {
//串口初始化
Serial.begin(115200);
Serial2.begin(115200);
while (!Serial);
pinMode(Sound_Pin, OUTPUT);
pinMode(LED_Pin, OUTPUT);
analogWrite(Sound_Pin,0);
analogWrite(LED_Pin,0);
}
void loop() {
Radar_Control();
if(ledState)
digitalWrite(LED_Pin, HIGH);
else
digitalWrite(LED_Pin, LOW);
}
五、实现现象
上位机串口打印距离、运动状态等相关信息,并处于不同距离范围内时,触发不同的警报声音效果;
处于静止时,LED点亮,重新处于运动时,LED熄灭;
六、优化建议
1、模块的2.00mm间距可改为2.54mm,更加便利适配普遍开发板间距,以及配合面包板使用;
2、实测误差大概在20~40cm左右?(可能和安装、环境等相关因数等有关?)
3、该模块无法输出速度 / 方位角度 / 俯仰角度等信息,可优化去除;

