我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

用STM32和UWB自制无感解锁系统:测距原理与状态机实战

用STM32和UWB自制无感解锁系统:测距原理与状态机实战 用 UWB 做无感解锁目标很具体人走到自己家门口不用掏钥匙、不用按指纹、不用腾出手刷脸门锁在确认“本人真的已经到了门前”之后自动打开。这里的难点不是“能不能自动开门”而是怎么知道“人确实已经靠近并且没有被误判”。蓝牙靠信号强度估算距离墙壁、口袋、手机天线姿态都会让结果剧烈抖动UWB 靠电磁波飞行时间测距能输出稳定到厘米级的空间信息所以更适合当无感解锁的底层测距手段。这篇文章是一条完整的自制硬件实践路线。你会先理解 UWB 无感解锁的原理再把 STM32 和 UWB 模块通过 SPI 接起来跑通“钥匙端 Tag 与门锁端 Anchor 双向测距”的最小系统随后加身份校验、距离状态机和锁体驱动最后讨论测不准、打不开、误开、功耗这类真实项目里必踩的坑。文章代码不是某一款 SDK 的完整驱动而是把时序和逻辑说清楚的工程示意落地前需要对照你实际的 UWB 模块手册和官方驱动库补齐接口。1. UWB 无感解锁的核心矛盾先确认人已到门口再开锁1.1 为什么人脸、指纹、蓝牙都不能真正做到“无感”开门体验的排序大致是拿钥匙开门最麻烦按密码次之刷脸和指纹已经方便很多但仍然不是“无感”。指纹和人脸的问题在于“主动配合”。你必须把手放在指纹区或者把脸对准摄像头区域光线、角度、指纹湿度都会影响识别速度。很多智能锁所谓的无感其实是“走近后亮灯、识别、验证、开锁”的快速流程人还是要站定一下。蓝牙的方案表面上可以接近自动开锁但蓝牙 RSSI 非常不稳定。手机在左侧口袋和右侧口袋信号可能相差数米门边有金属框、鞋柜、弱电箱都会造成反射和衰减。实际调试时经常出现三种局面走到三楼就解锁站在门前却因为手机被身体挡住而一会儿断连一会儿连接。UWB 的出现改变了判断依据。UWB 测量的是电磁波从钥匙端到锁具端的飞行时间再乘以光速得到距离。它不依赖“信号强不强”而是直接给出“距离多远”这个物理量对无感开门要友好得多。1.2 UWB 测距为什么比 RSSI 值得信赖UWB 信号使用极窄脉冲在时间轴上非常容易分辨。接收端可以找到第一条到达的多径分量进而估算出直射路径的飞行时间。蓝牙的 RSSI 只能得到综合后的信号强度无法区分直射信号和反射信号所以误差会被环境放大。一颗典型 UWB 模块在空旷环境下可以做到厘米级测距精度。放在门锁场景里这代表你可以设置一个“合理的解锁半径”比如 1 米内允许解锁2 米外绝不动作。这个判断是可解释、可复现的。UWB 还有另一个工程价值它天然具备抵抗多径的能力。门周边通常布满金属、瓷砖、人体这些环境对蓝牙来说是灾难对 UWB 来说只要第一路径仍然存在测距结果就不会被反射路径带偏。如果物体完全遮挡直射路径测距则可能不稳定或偏大这时的失败方向是“不误开”比“乱开”要安全。1.3 自制方案到底做哪一端商业 UWB 无感解锁通常依赖手机里的 UWB 芯片例如手机与门锁之间完成“安全测距”和“安全会话”。这套链路离不开手机厂商的私有接口普通开发者很难绕过权限直接使用。自制硬件思路可以绕开这条限制自己做一个“钥匙端 Tag”再做一个“门锁端 Anchor”。Tag 可以是一个很小的 STM32 UWB 模块挂在钥匙串或装进随身物件Anchor 固定在门内侧负责判断距离阈值、校验 Tag 身份并控制锁体。这样一来测距协议、阈值策略、安全绑定、开锁动作全部握在自己手里便于学习也便于后续替换成手机端方案。注意自制项目只能在自己拥有授权、正在调试的门或实验设备上验证。用测距模块去尝试打开没有进入权限的门、柜子或车辆属于越权行为不在技术讨论范围内。2. 测距时序、角色划分与硬件选型2.1 无感解锁的完整链路从用户靠近到门打开不是“一发一收”就结束的。完整的无感链路至少包含四个阶段第一唤醒。门锁端不可能以高频率持续发射 UWB 信号否则功耗会很高。通常用 PIR 人体感应、UWB 雷达存在检测或低频轮询来唤醒系统。第二测距。门锁端 Anchor 发起测距请求钥匙端 Tag 应答并交换时间戳Anchor 计算出两者距离。这里需要连续测几次而不是一次命中就开锁。第三身份确认。距离低于阈值还不够还要确认对方是已经绑定的 Tag。最简单的绑定方式是写入 Tag 的 EUI64 地址要求严格时还需要做密钥握手。第四动作与复位。身份和距离都满足后驱动舵机、电磁锁或电插锁开锁开门后经过超时时间回到锁定状态。这里能看到UWB 解决的是第二、第三阶段中的“距离”和“设备标识”问题它不是一个完整的智能锁方案但它是无感体验里最关键的一层。2.2 Tag 与 Anchor 的职责划分角色位置主要职责典型功耗要求Tag 钥匙端随人携带响应测距请求、上报身份标识、执行密钥交换尽量低小电池长续航Anchor 门锁端固定在门或门框发起/管理测距、校验距离、校验身份、控制锁体可接市电或大容量电池自制学习原型中两端的硬件可以完全相同只是烧录的固件不同。测量时由 Tag 主动发请求Anchor 被动应答或者反过来都可以。关键是要约定好帧类型、PAN ID、短地址和测距时序。2.3 UWB 模块选型与主控搭配选择主控时STM32 是很好的起点。它 SPI 外设成熟、中断管理清晰、生态资料多适合处理 UWB 模块的时间戳和中断。UWB 模块方面常见的 DWM1000 系列模块已经封装了天线和射频电路开发者只要通过 SPI 操作寄存器即可实现收发。也可以选择 DWM3000 等更新方案它们可能提供更低功耗和更丰富的测距能力。不同模块的信道、速率、天线延时不都一样购买前要确认模块是否提供完整 SDK、示例工程和官方电路参考。ST 侧建议选择具备足够 SPI 速度、Flash 和 RAM 的型号。最小学习项目用 STM32F103C8T6 这类低成本芯片足够但如果后续要跑 FreeRTOS、卡尔曼滤波、LCD 调试界面建议换成 STM32F401 或更高规格的型号。2.4 元器件清单与项目目录部件数量用途STM32 开发板2分别作为 Tag 和 Anchor 的主控UWB 模块DWM1000 等2完成双向测距收发舵机 SG90 / MG9951演示锁舌或锁扣动作继电器驱动模块1驱动 12V 电插锁等更强负载PIR 人体感应模块1有人靠近时唤醒测距LED、蜂鸣器、按键若干调试状态提示3.3V 稳压模块、5V/12V 电源若干分离供电避免锁体电流拉垮主控USB 转 TTL1观察测距日志实际项目的模块引脚和开发板丝印可能不同千万不要照抄网上的接线表。一定要先核对模块 datasheet 里的信号名再连接对应引脚。工程目录建议按驱动、应用和配置分层uwb-door/ ├── Core/ │ ├── Inc/ │ └── Src/ ├── Drivers/ │ ├── stm32_hal_lib/ │ └── uwb_radio_lib/ ├── App/ │ ├── uwb_tag.c │ ├── uwb_anchor.c │ ├── range_filter.c │ ├── unlock_state.c │ └── app_main.c驱动层只负责 SPI 收发和寄存器读写应用层只处理测距结果、状态机和开锁动作。不要把协议逻辑混在中断里否则后面加滤波、加调试会非常痛苦。3. STM32 与 UWB 模块的接口连接3.1 DWM1000 引脚信号划分UWB 模块和 STM32 之间最核心的是 SPI 接口。四个 SPI 信号分别是 SCLK、MOSI、MISO、CSN。除此之外模块一般还会引出 IRQ、RESET 和 WAKEUP。IRQ 是 UWB 模块向主控报告事件的中断引脚比如“收到报文”“发送完成”。RESET 用于复位模块。WAKEUP 用于从睡眠状态唤醒。在接线时IRQ 必须连接到 STM32 支持外部中断的 GPIOCSN 可以接到普通 GPIO但主控初始化时要把对应引脚配置为推挽输出。SPI 速率不宜一开始就调到最高先用 1 MHz 左右验证通信稳定后再提高频率。3.2 供电设计是第一次翻车高发区UWB 模块的峰值电流并不低尤其发送报文瞬间电流会明显抬升。如果直接用 STM32 开发板上的 3.3V LDO 给 UWB 模块供电发送时电压跌落会导致模块复位或者接收失败。推荐做法是外部单独提供一个 3.3V 稳压源STM32 和 UWB 模块分别供电但电源地必须共地。驱动舵机或电磁锁时执行机构还要单独供电不能在 3.3V 这一路上取电。一套较稳的学习环境电源分配如下供电对象电压说明STM323.3V 或 5V按开发板要求UWB 模块3.3V独立 LDO与 STM32 共地舵机5V单独电源避免开锁瞬间拉低主控电压电插锁12V必须通过继电器隔离控制3.3 接线完成后先做最小通信测试接线完成后不要急着写业务逻辑。先确认 SPI 能正确读取 UWB 模块的 DEV_ID 寄存器这是判断“主控和模块有没有真正连上”的最快方法。uint32_t dev_id 0; // 调用厂商驱动函数读取设备ID寄存器 dev_id dwt_getdevid(); printf(DEV_ID 0x%08X\n, dev_id); if (dev_id 0xDECA0130) { printf(DWM1000 detected\n); } else { printf(check SPI wiring or power\n); }如果输出不是预期值优先检查接线、电源地和 SPI 的 CS 引脚配置。4. 最小测距闭环先让两个模块把距离打印出来4.1 初始化 UWB 的固定步骤两块模块在开始测距前都要完成同样的初始化流程复位模块、读取设备 ID、配置信道和 PAN ID、设置短地址、配置发送功率与天线延迟。天线延迟是最容易被忽略的配置。UWB 时间戳中包含射频电路、PCB 走线和天线引入的固定延迟不校准会导致测距结果系统性偏大或偏小几十厘米。自研模块的校准方式通常由厂商 SDK 提供你可以在空旷场地实测距离再微调天线延迟参数。一个示意性初始化代码如下具体函数名取自不同 SDK 会有差异void uwb_init(void) { // 1. 复位 dwt_reset(); // 2. 配置物理层信道、速率等 dwt_configure(local_config); // 3. 设置网络标识和设备地址 dwt_setpanid(0x0001); dwt_setaddress(0x0002); // 4. 配置天线延迟这个值需要校准 dwt_settxantennadelay(ANT_DLY); // 5. 打开自动应答或中断 dwt_setinterrupt(ENABLE_INT); }把 Tag 的短地址设置成0x0002Anchor 的短地址设置成0x0001逻辑上更清晰。PAN ID 必须一致否则模块不会交换报文。4.2 双向测距的时序逻辑最基础的测距可以设计成单边双向测距。时序大致如下Tag 在本地时间 T1 发送测距请求。Anchor 在 T2 收到请求。Anchor 经过固定处理时延后在 T3 发送应答帧并在帧载荷里带上T_reply T3 - T2。Tag 在 T4 收到应答帧。Tag 计算飞行时间ToF ((T4 - T1) - (T3 - T2)) / 2。门锁端得到distance ToF * c。单边测距实现简单但收发两端晶振偏差会影响结果。若测距结果抖动明显可以升级成双面双向测距多交换一轮时间戳抵消大部分时钟偏差。4.3 Tag 请求端代码框架// Tag 作为测距发起方的示意代码 uint32_t tag_request_range(void) { uint64_t t1; uint64_t t4; uint64_t t_reply; uint64_t tof; double distance_m; // 1. 发出请求帧 dwt_writetxdata(REQ_FRAME_LEN, req_frame, 0); dwt_writetxfctrl(REQ_FRAME_LEN, 0, 1); dwt_starttx(DWT_START_TX_IMMEDIATE); // 等待发送完成中断并在发送中断中读取 t1 t1 dwt_readsystimestamptx(); // 2. 打开接收等待 Anchor 应答 dwt_rxenable(DWT_START_RX_IMMEDIATE); // 等待接收完成中断读取 t4 t4 dwt_readsystimestamprx(); // 3. 从应答帧载荷中解析 T_reply t_reply parse_reply_timestamp(rx_buffer); // 4. 计算飞行时间并转距离 tof (t4 - t1 - t_reply) / 2; distance_m sys_time_to_meters(tof); return distance_m; }注意t1不要写成“进入发送函数前的时间”而是发送完成时间。UWB 测距的精度来自硬件时间戳不能用软件打点代替。4.4 Anchor 应答端代码框架// Anchor 作为应答方的示意代码 void anchor_slave_loop(void) { dwt_rxenable(DWT_START_RX_IMMEDIATE); while (1) { // 等待接收中断 if (rx_flag) { anchor_rx_time dwt_readsystimestamprx(); if (rx_frame_is_range_request) { // 记下当前接收时间作为 T2 // 经过固定短时延后构造应答帧 build_response_frame(anchor_rx_time); dwt_writetxdata(...); dwt_writetxfctrl(...); dwt_starttx(DWT_START_TX_IMMEDIATE); // 在发送应答完成中断中读取 T3 } // 重新打开接收 dwt_rxenable(DWT_START_RX_IMMEDIATE); } } }应答帧里并不会直接发送 T2 和 T3 两个时间戳只需要发送它们的差值也就是处理耗时。这样应答帧载荷更小也方便 Tag 做数学计算。4.5 近距离阈值验证两个模块都烧录完代码后先用串口连接 Anchor以每秒一次的频率打印测距结果。把 Tag 放在距离 Anchor 约 1 米处预期串口输出类似range: 0.97 m range: 1.02 m range: 0.99 m输出稳定在 1 米附近说明 UWB 测距闭环已经通。接下来加入阈值判断uint32_t threshold_mm 1200; if (distance_mm threshold_mm) { led_on(); printf(door action: unlock signal\n); } else { led_off(); printf(door action: lock\n); }学习阶段先用 LED 代替锁体。这样可以先专注调通测距链路不用过早处理机械锁的电流和时序问题。5. 把单次测距升级成“防抖解锁状态机”5.1 只看一次距离就开门一定会误动作如果只用一次测距结果驱动开锁人从门旁边路过、UWB 信号发生跳变、或者模块偶发错误都可能造成门突然打开。更合理的方式是连续多次判定。一个通用状态机需要三个状态状态含义进入条件离开条件LOCKED锁定中上电复位或超时连续 N 次测量距离低于阈值RANGE_PENDING人可能靠近第一次距离低于阈值出现一次无效或远距离结果UNLOCKED已解锁N 次距离都低于阈值且身份合法开锁后的超时时间到达状态机的好处是让“解锁”成为一个有记忆的决策过程。短暂抖动不会立刻误开真正站在门口的人也不会因为某一次测距失败而失去解锁机会只要后续几次测量仍然低于阈值即可。typedef enum { LOCKED 0, RANGE_PENDING, UNLOCKED } door_state_t; static door_state_t lock_state LOCKED; static int pending_hits 0; void door_state_run(uint32_t distance_mm, int tag_approved) { int distance_ok (distance_mm UNLOCK_THRESHOLD_MM) tag_approved; switch (lock_state) { case LOCKED: if (distance_ok) { pending_hits 1; lock_state RANGE_PENDING; } break; case RANGE_PENDING: if (distance_ok) { pending_hits; if (pending_hits REQUIRED_HITS) { drive_unlock(); lock_state UNLOCKED; } } else { pending_hits 0; lock_state LOCKED; } break; case UNLOCKED: if (time_after_unlock UNLOCK_HOLD_MS) { drive_lock(); lock_state LOCKED; } break; } }REQUIRED_HITS建议先设成 3也就是连续三帧有效才开锁。如果实测发现人走到门前需要等待太久可以降到 2如果误开频繁就提高到 4 或 5。5.2 身份校验必须和距离判断同时进行距离可信只解决了“真的在门口”的问题没有回答“来的是不是自己的 Tag”。任何没有身份校验的距离阈值判断都会被另一个 UWB 模块“近身冒充”。最小方案是在收到测距请求时先检查发送方地址if (rx_source_addr ALLOWED_TAG_ADDR) { tag_approved 1; } else { tag_approved 0; }绑定一对设备时这个判断就能覆盖大多数误开场景。但注意短地址是明文暴露的可以被伪造。如果项目要面对真实安全需求必须在应用层增加加密握手、随机数和时效性校验。商业级 UWB 无感门锁还会使用安全测距机制防止中继攻击自制 DWM1000 裸方案很难达到同样安全级别。5.3 锁体驱动与开锁姿势舵机驱动适合原型演示周期控制舵机角度需要在开锁前停止占空比变化过程。不要直接把 GPIO 拉到高电平去驱动舵机舵机需要 50Hz 左右的 PWM 信号。如果控制的是电插锁或电磁锁要用继电器或 MOSFET 隔离主控和锁体电源。锁体感性负载较大继电器线圈侧还需要并联续流二极管否则关断瞬间会产生反向电压可能打坏 MCU 引脚。开锁动作完成后尽量在日志里打印状态切换[STATE] LOCKED - RANGE_PENDING, distance0.84m [STATE] RANGE_PENDING - UNLOCKED, hits3 [STATE] UNLOCKED - LOCKED, reasontimeout这些日志在输出时不够直观但进入现场排错时能节省大量时间。5.4 低功耗与异常兜底门锁安装后不可能频繁换电池功耗是必须考虑的问题。Anchor 可以由门锁侧供电Tag 则要尽可能省电。低频测距轮询可以这样设计没有人体信号时Tag 和 Anchor 都进入睡眠状态UWB 模块关闭接收。Anchor 上电后以 10 秒一次的周期短唤醒发送低功耗探测帧。PIR 检测到有人接近时Anchor 立刻切到每秒 3 到 5 次的高频测距。Tag 被探测帧唤醒并应答完成身份校验后回到低功耗状态。异常兜底更重要。任何电子锁都必须保留机械钥匙或者物理断电开锁方式防止单片机死循环、舵机卡死、电池耗尽时把人锁在门外。6. UWB 参数调优距离阈值、刷新频率和滤波6.1 距离阈值选择距离阈值不能拍脑袋写死它由门的物理位置和门外缓冲区决定。家用门外通常有 1 米左右的缓冲区阈值建议从1.0m开始测试。如果门在电梯口人从电梯出来就进入解锁范围那么阈值要缩小到0.6m左右。测试方法很直接让 Tag 停留在门外 0.8 米、1.0 米、1.2 米三个位置观察串口输出是否稳定覆盖真实距离然后选取一个“不会把外部走道划进来”的阈值。场景推荐阈值连续命中次数独立住宅门口1.2m3办公室工位门禁1.0m2电梯口/走廊旁0.6m4演示原型1.0m36.2 测距刷新频率刷新频率越低越省电但解锁响应越慢。门锁无感解锁不宜让人在门口等待超过 1 秒。如果一次测距需要 10ms那么 10Hz 刷新率看起来足够。实际上由于射频调度、滤波窗口和状态机连续命中次数用户感受到的延迟会高于单帧时间。学习阶段建议用 5Hz 到 10Hz 刷新率。在低频休眠唤醒状态先把 PIR 触发后的刷新率提高到 10Hz等稳定后再降低测距次数和功耗。6.3 距离滤波怎么做即使 UWB 精度较好也可能出现零星跳变。中值滤波是简单有效的方案保存最近 5 个测距结果排序后取中间值。它比平均值更抗离群点。#define FILTER_N 5 uint32_t range_median_filter(uint32_t new_value) { static uint32_t history[FILTER_N]; static uint8_t index 0; uint32_t tmp[FILTER_N]; history[index] new_value; index (index 1) % FILTER_N; memcpy(tmp, history, sizeof(history)); // 简单排序取中位数 selection_sort(tmp, FILTER_N); return tmp[FILTER_N / 2]; }滤波会引入少量延迟。5 帧中值滤波配上 10Hz 刷新率延迟约 500ms在状态机连续命中场景下可以接受。滤波之后再做阈值判断不要直接把原始距离送到状态机。6.4 参数速查表调试参数初始值调小后果调大后果距离阈值1000mm更不容易误开但可能打不开容易提前开锁或误开连续命中次数3响应变快抗抖变弱响应变慢可靠性提高刷新频率5Hz功耗降低延迟变大解锁更快功耗增加中值滤波窗口5跳变抑制变弱延迟明显变大开锁保持时间5000ms门锁频繁回锁长时间停留可能被误开后尾随调参数时要一次只改一个变量修改后观察至少 100 次靠近动作不要刚看到一次正常就宣布完成。7. 常见问题与排查路径7.1 测距结果跳动大或距离漂移现象Tag 静止在 1 米处串口输出在 0.3 米到 3 米之间反复跳。排查方向要先从电源开始。UWB 模块发送瞬间电流抬升时如果 3.3V 电压跌落接收端就会丢帧或时间戳异常。用示波器看模块供电引脚在发送期间的电压。然后检查天线周围环境。模块天线边有金属板、大面积铜皮或人体紧贴时第一路径可能被遮挡或衰减模块会锁定到反射路径测出偏大的距离。把模块抬高或远离金属面再测一次。如果电源和环境正常接下来检查天线延迟校准值。模块的天线延迟不准会造成系统性偏差不是随机跳动先做一组固定距离测试确认误差曲线。最后考虑升级双面双向测距。单边测距的晶振偏差在高温或低温下会更明显DS-TWR 能抵消大部分时钟偏移。现象可能原因检查方式处理建议距离随机跳变电源跌落示波器看3.3V波形独立供电加大电容距离整体偏大天线延时未校准多个固定距离实测校准天线延迟参数被遮挡后跳远第一路径被遮蔽改变天线位置调整模块安装位置温度变化后漂移时钟偏差影响单边/双边测距对比使用DS-TWR7.2 人已经在门口门却打不开距离明明显示很近状态机却不开锁要先区分是“测距低于阈值失败”还是“状态机没进入解锁”。在串口日志中打印每一帧的原始距离、滤波距离和 Tag 地址。如果滤波距离低于阈值但状态机未解锁说明连续命中次数没有满足。查看日志中是否存在“RANGE_PENDING 被打断”。如果 Tag 放在口袋、手包等贴身位置UWB 信号经过人体衰减后可能出现时通时断。这时可以增加 PIR 唤醒提醒PIR 判定有人后让测距连续运行 2 秒期间不因失败帧立刻回到 LOCKED而是允许漏掉少数帧。7.3 SPI 通信正常却收不到任何 UWB 帧IRQ 引脚配置错误是最容易踩的坑。UWB 模块收到报文后通过 IRQ 通知主控如果 IRQ 没有正确映射到 STM32 的外部中断线主控就永远不知道“帧已经到达”。检查顺序用逻辑分析仪或示波器看 SPI 的 SCLK、MOSI、MISO 是否有信号。在中断回调里设置断点确认 IRQ 是否触发。检查 PAN ID、短地址、信道配置是否一致。检查发帧长度是否超过模块配置的帧长度载荷过长会导致发送失败。检查应答帧发送完成后是否重新打开了 RX 接收。7.4 误开锁和“尾随”风险怎么控制误开锁通常是阈值太大或连续命中次数太少造成的。先缩小阈值再提高连续命中次数基本能解决大部分误开。尾随是更难的问题。如果合法 Tag 主人开门后站在门厅内而门外的人趁门未关进入UWB 距离判断无法辨别“人是从外侧进入还是从内侧通过”。商业方案会结合多锚点、角度测量或门磁判断开门方向。自制阶段不建议硬扛尾随场景。更稳妥的做法是在门磁传感器检测到门关好之前不让门锁重新进入“可开锁判定”同时在回锁状态下即使合法 Tag 在门内侧只要门已经是关闭状态就不要输出第二次开门指令。8. 从实验台走向真实门锁的工程化建议8.1 明确学习环境和生产环境的差距实验台场景和安装在门上的真实场景差别明显。实验台上模块可以用短杜邦线连接天线周围开阔真实门上会有一圈金属门框模块与金属的距离可能很近测距结果会明显变差。学习阶段建议先把整套系统放在一块移动木板上测试模拟门的体积和金属遮挡。这时可以手工拿着 Tag 在门外走动记录解锁距离和误触情况。真实安装时Anchor 的天线要尽量避开金属门框正面朝门外。不要把模块贴在门板内部金属面上。若门体金属部件过多需要把天线通过延长线引出确保门前区域形成较清晰的无线视距。8.2 断电恢复和故障兜底电子锁必须具备“死机后能恢复”的设计。程序中需要加看门狗UWB 模块长时间没有测距结果时应自动软复位而不是一直卡死。开锁保持时间过后无论门是否被打开都要回到锁定状态。后备电源也是必要项。电路设计至少要支持断电后继续工作一段时间让用户能用机械钥匙或者应急供电完成开锁。电池电压低时系统应提前报警而不是等到临出门才彻底没电。8.3 从一对一无感门锁扩展到 UWB 定位当门口不再只有一个 Tag、一扇门时依赖单一 Anchor 的距离阈值会不够灵活。例如车库入口、走廊门禁或办公门禁需要知道“合法用户现在到底在哪个区域”这就要引入多 Anchor 的 UWB 定位。多锚点定位需要至少三个位置已知的 AnchorTag 与多个 Anchor 测距后通过三点定位或到达时间差求出坐标。形成室内定位系统后门的解锁可以结合“人的位置轨迹”来判定用户从走廊走向房间门当位置进入房间外的置信区域且门识别到对应权限时门锁自动打开。这套架构比一对一门锁更复杂但思路仍然一致UWB 提供可信的物理空间信息业务层再根据权限策略决定动作。8.4 UWB 雷达在无感场景中的补充角色无感解锁的理想状态是人手不离开购物袋也不一定需要携带特殊 Tag。UWB 雷达可以在不依赖随身标签的前提下检测门前一定范围内是否存在人员并能识别微动和存在特征。这样系统可以先
返回列表