敲门事件和开门动作的检测
<div class='showpostmsg'><p> 日常生活中的敲门动作,是敲击门板使门板发生振动而发声的。我设计使用加速度传感器(也称加速度计)贴合在门板背面来检测门的振动,从而检测敲门事件。</p><p> 与使用麦克风拾音,然后识别“咚咚”的敲门声相比,直接检测门的振动排除了声音的干扰,并且识别算法复杂度大大降低,因此不需要CPU作复杂计算,节省功耗。加速度计测量固体振动比麦克风测量空气压强变化各自的工作带宽不同,前者带宽低,自身功耗也更低。</p>
<p> 我使用的 KX023 三轴加速度计的工作电流是随着数据率增加而增大的。因为<span style="color:#8e44ad;"><strong>这个检测功能需要一直开启</strong></span>,所以在满足设计需要的前提下应当尽量减小工作电流。</p>
<p> 还有一个跟数据输出率(采样率)相关的因素是 I2C 接口传输时间和 RSL10 被唤醒的频率,这也跟整机耗电有关。好在 KX023 有内部的缓存,不需采样一次就要把数据读出。但关系仍然是采样率越高,需要读取的频次越高。最理想的状态当然是加速度计自己处理数据,然后在检测到事件的时候输出中断信号——这样大部分时候都不用传递采样数据了。</p>
<p> KX023 其实就带有几个检测功能,其中的 "directional tap detection" 功能我认为是可以用于敲门检测的。“tap" 和 "knock" 表达的意思有所不同,"knock" 力度重,但对于门板这个大家伙,引发的振动也不是很大。经过一些实验测试,和关门的撞击振动相比,敲门的又小多了。KX203 "tap"检测敲门的灵敏度可以用,只要不是敲得很轻。但是我发现并非每次敲击都能检测到。问题可能出在采样频率上。</p>
<p> KX023 "tap" 检测功能默认采样频率是 400Hz. 但是我为了降低功耗,把数据率减到了 50Hz,也就是每20ms采样一个点。实际上敲门敲得快了,两次敲击的间隔可以小于 150ms (我通过录音,观察波形确认的)。因此估算在小于 100ms 时间内,敲击引起的振动能量已经快速衰减。</p>
<p> 50Hz采样率捕捉到的垂直于门板方向上的加速度是这样的(横轴单位是秒,纵轴是加速度计输出数)</p>
<p> 上图是两次”三击“敲门,确实有振动现象被捕捉到了,然而不能认为门的振动是这个形态。</p>
<p> </p>
<p> 用 400Hz 采样率再做实验,又有了这样的数据:</p>
<p> 的确,用50Hz采样已经丢失太多细节了。我觉得400Hz采样数据也不够反映门板的振动形态,不然不应该存在测得加速度只在一个方向上的情形(正负方向应是交替的)。</p>
<p> </p>
<p> 但是我只需要判断门被敲击了而已,如果 50Hz 能判定得差不多,那也就不需要再提升。</p>
<p> 敲门行为有点特殊,因为绝大多数人是连敲两次或者三次,也就是”双击“或者”三击“。门因其它原因引起的振动信号,在段时间若不存在这样的特征,就不用判断为敲门了。KX023 的 "double tap" 检测可以通过参数设定来配合敲门检测,检测到短时间内两次动作,就当作是有人敲门了。因为一次敲击就反应在大约5个采样数据以内,没多少线索可以用来识别的,我自己写算法也做不出更好的花样,我就例用 KX023 帮忙了。</p>
<p> </p>
<p> 由于还要做开门检测的原因,还不能认为数据可以不传给 RSL10. </p>
<p> 开门,门其实是转动。但门从静止到转起来,垂直于门板方向上的加速度是有的,这比测转动的角速度要容易。可以预先采集开门时的数据进行分析:</p>
<p> 上图是一次开门-关门动作,在关门的时候有明显的碰撞引起的冲击。注意到门的运动对应的加速度变化缓慢,50Hz采样率已经可以捕捉到变化情况了。由于开门只有一个方向(要么门朝外开,要么朝里开),可以用加速度方向作为一个判据。</p>
<p> KX023 有 "motion detect" 功能用于检测运动,我试将它用于检测开门。但是,除非很猛力地开,靠这个功能检测的灵敏度不够,阈值已无法再降了。那么就自己写算法咯,也不复杂。</p>
<p> 先得排除掉”零位误差“,也就是静止时候 z 轴方向上加速度理应是0, 但实际安装,z轴并不完全水平。我先用一阶低通滤波来处理数据,得到一个参考 z 轴加速度平均值。当测量瞬时值比这个值持续地小一定数的时候,也就是门往外加速运动了,判断出开门动作。设阈值是为了排除噪声的影响,设时间门限是排除振动的影响。</p>
<p> 在 RSL10 程序中,每次定时唤醒之后,读取 KX023 缓存的加速度采样数据,然后进行数据处理,判断是否存在开门动作。再读去 KX023 的中断状态寄存器,查看是否有 "tap" 事件,也就是是否检测到敲门,以及异常的振动了。</p>
</div><script> var loginstr = '<div class="locked">查看精华帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
}
</script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>不错</p>
<p>楼主的这个敲门监测不错</p>
<p>50Hz采样率应该可以</p>
<p> </p>
<p> </p>
<p> </p>
<p>有点疑问,不是太明白加速度传感器的使用</p>
<p>这个加速度传感器和压力传感器有区别</p>
<p>感觉,敲门检测是不是用压力传感器好一些</p>
qwqwqw2088 发表于 2021-7-3 18:55
有点疑问,不是太明白加速度传感器的使用
这个加速度传感器和压力传感器有区别
感觉,敲门检测是不是 ...
<p>加速度传感器属于惯性器件,测的是自身运动(内部质量块的位移)。压力传感器测的是压力引起的形变。</p>
<p>敲门检测,可能用压电陶瓷片就很灵敏了,但还要自己做信号调理电路。</p>
cruelfox 发表于 2021-7-3 22:24
加速度传感器属于惯性器件,测的是自身运动(内部质量块的位移)。压力传感器测的是压力引起的形变。
...
<p>明白了</p>
<p>牛,期待后续!</p>
页:
[1]