9浏览
查看: 9|回复: 0

[ESP8266/ESP32] 用 Micropython 驱动 DFRobot C4002 毫米波雷达

[复制链接]
基于ESPHOME的毫米波雷达智能家居实测:https://mc.dfrobot.com.cn/thread-400205-1-1.html
本次尝试使用 Micropython 进行开发。官方提供了 Python 驱动,暂无原生 Micropython 驱动,但二者语法相近,移植难度不大。
1、硬件介绍
C4002 是 DFRobot 推出的 24GHz 毫米波人体存在传感器模块。模块突破了传统PIR传感器只能检测大幅运动的局限,可在10x10m的有效检测范围内,同步侦测运动人体与静止/微动人体,并支持运动速度检测、运动方向识别(靠近/远离)及环境光检测功能。
  • 工作频率为 24GHz~24.25GHz
  • 检测距离:运动最远 11 米、微动 / 静止最远 10 米,支持参数配置
  • 可检测人体运动、静止存在状态,同时识别运动方向与运动速度
  • 探测角度:120°×120°
  • 采用 UART 通信接口,波特率 115200bps
  • 模块内置光照传感器,检测范围 0~50lux
  • 整体尺寸为 22mm × 26mm

2、驱动
目前官方仅提供 C/C++、Python 版本驱动,未适配 Micropython。我借助 AI 工具,将 Python 驱动进行移植改造,成功适配出可用的 Micropython 驱动。
驱动详见附件。
3、快速上手
以 ESP32-C3 为例,硬件接线如下:
[td]
C4002
ESP32
说明
VCC5V电源
GNDGND地线
TXGPIO0串口接收
RXGPIO1串口发送
注意: 一定要接 5V,3.3V 供电可能不稳定。
附上简易测试示例代码:
  1. import time
  2. import machine
  3. from DFRobot_C4002 import DFRobot_C4002, PresenceTarget, MotionTarget
  4. # 初始化 UART,使用 GP0(TX) 和 GP1(RX)
  5. # 默认波特率: 115200
  6. c4002 = DFRobot_C4002(uart_num=1, baud=115200, tx=0, rx=1)
  7. # 初始化 GPIO2 作为雷达输出引脚的输入端
  8. radar_output_pin = machine.Pin(2, machine.Pin.IN, machine.Pin.PULL_DOWN)
  9. c4002.set_out_pin_mode(c4002.OUT_PIN_MODE1)
  10. def setup():
  11.     """初始化传感器"""
  12.     while c4002.begin() != True:
  13.         print("C4002 初始化失败!")
  14.         time.sleep_ms(500)
  15.     print("C4002 初始化成功!")
  16.     time.sleep_ms(50)
  17.     # 关闭指示灯
  18.     if c4002.set_run_led_state(c4002.LED_OFF):
  19.         print("设置运行指示灯成功!")
  20.     else:
  21.         print("设置运行指示灯失败!")
  22.     if c4002.set_out_led_state(c4002.LED_OFF):
  23.         print("设置输出指示灯成功!")
  24.     else:
  25.         print("设置输出指示灯失败!")
  26.     # 设置分辨率模式(80cm 分辨率,支持 15 个距离门限)
  27.     if c4002.set_resolution_mode(c4002.RESOLUTION_80CM):
  28.         print("设置分辨率模式成功!")
  29.     else:
  30.         print("设置分辨率模式失败!")
  31.     # 设置检测范围 0-1100cm
  32.     if c4002.set_detect_range(0, 1100):
  33.         print("设置检测范围成功!")
  34.     else:
  35.         print("设置检测范围失败!")
  36.     # 设置光照阈值(0 = 无论光照条件如何始终检测)
  37.     if c4002.set_light_thresh(0):
  38.         print("设置光照阈值成功!")
  39.     else:
  40.         print("设置光照阈值失败!")
  41.     # 启用所有距离门限
  42.     gate_state = [
  43.         c4002.C4002_ENABLE, c4002.C4002_ENABLE, c4002.C4002_ENABLE,
  44.         c4002.C4002_ENABLE, c4002.C4002_ENABLE, c4002.C4002_ENABLE,
  45.         c4002.C4002_ENABLE, c4002.C4002_ENABLE, c4002.C4002_ENABLE,
  46.         c4002.C4002_ENABLE, c4002.C4002_ENABLE, c4002.C4002_ENABLE,
  47.         c4002.C4002_ENABLE, c4002.C4002_ENABLE, c4002.C4002_ENABLE,
  48.     ]
  49.     if c4002.configure_gate(c4002.MOTION_DISTANCE_GATE, gate_state):
  50.         print("启用运动距离门限成功!")
  51.     if c4002.configure_gate(c4002.PRESENCE_DISTANCE_GATE, gate_state):
  52.         print("启用存在距离门限成功!")
  53.     # 设置上报周期(10 * 0.1s = 1s)
  54.     if c4002.set_report_period(10):
  55.         print("设置上报周期成功!")
  56. def get_gpio2_status():
  57.     """读取 GPIO2 的状态并返回中文描述"""
  58.     pin_value = radar_output_pin.value()
  59.     if pin_value == 1:
  60.         return "HIGH (检测到目标)"
  61.     else:
  62.         return "LOW (未检测到目标)"
  63. def loop():
  64.     """主循环"""
  65.     ret_result = c4002.get_note_info()
  66.     if ret_result.note_type == c4002.RESULT:
  67.         print("------- 获取全部结果 --------")
  68.         # 光照强度(lux)
  69.         light = c4002.get_light_intensity()
  70.         print("光照强度: {:.2f} lux".format(light))
  71.         # 目标状态
  72.         target_state = c4002.get_target_state()
  73.         print("目标状态: ", end="")
  74.         if target_state == c4002.NO_TARGET:
  75.             print("无目标")
  76.         elif target_state == c4002.PRESENCE:
  77.             print("静态存在")
  78.         elif target_state == c4002.MOTION:
  79.             print("运动")
  80.         # 存在倒计时
  81.         presence_count_down = c4002.get_presence_count_down()
  82.         print("存在倒计时: {} s".format(presence_count_down))
  83.         # 存在目标信息
  84.         presence_target = c4002.get_presence_target_info()
  85.         print("存在距离: {:.2f} m".format(presence_target.distance))
  86.         print("存在能量: {}".format(presence_target.energy))
  87.         # 运动目标信息
  88.         motion_target = c4002.get_motion_target_info()
  89.         print("运动距离: {:.2f} m".format(motion_target.distance))
  90.         print("运动能量: {}".format(motion_target.energy))
  91.         print("运动速度: {:.2f} m/s".format(motion_target.speed))
  92.         print("运动方向: ", end="")
  93.         if motion_target.direction == c4002.AWAY:
  94.             print("远离!")
  95.         elif motion_target.direction == c4002.APPROACHING:
  96.             print("靠近!")
  97.         elif motion_target.direction == c4002.NODIRECTION:
  98.             print("无方向!")
  99.         # GPIO2 状态
  100.         print("GPIO2 输出: {}".format(get_gpio2_status()))
  101.         print("--------------------------------")
  102. def main():
  103.     """主函数"""
  104.     setup()
  105.     while True:
  106.         loop()
  107.         time.sleep_ms(10)
  108. if __name__ == "__main__":
  109.     main()
复制代码

运行后,可以在shell看到:
  1. MPY: soft reboot
  2. C4002 初始化成功!
  3. 设置运行指示灯成功!
  4. 设置输出指示灯成功!
  5. 设置分辨率模式成功!
  6. 设置检测范围成功!
  7. 设置光照阈值成功!
  8. 启用运动距离门限成功!
  9. 启用存在距离门限成功!
  10. 设置上报周期成功!
  11. ------- 获取全部结果 --------
  12. 光照强度: 52.60 lux
  13. 目标状态: 静态存在
  14. 存在倒计时: 10 s
  15. 存在距离: 1.51 m
  16. 存在能量: 99
  17. 运动距离: 1.33 m
  18. 运动能量: 99
  19. 运动速度: 0.02 m/s
  20. 运动方向: 无方向!
  21. GPIO2 输出: LOW (未检测到目标)
复制代码


DFRobot_C4002.zip

5.21 KB, 下载次数: 0

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2026 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail