Arduino射频传感器解码器的制作

电子说

1.3w人已加入

描述

步骤1:传感器模块

如上图所示,变送器包括开门传感器,运动检测器,布防遥控器以及用于对报警箱进行编程的无线键盘。事实证明,这些设备中没有两个使用相同的同步长度或位持续时间。除了消息长度以外,唯一的共同点是位的基本格式。每个位占用一个固定的时间段,零和一之间的差是高/低部分的占空比。

上面显示的漂亮波形并不是我第一次收到的。由于433 MHz频段中的流量很大,因此我必须确保在将示波器设置为执行一次触发之前就激活传感器。幸运的是,只要激活按键,传感器就会激活数据消息的多个副本,并且遥控器和小键盘会继续输出消息。通过使用示波器,我能够确定每个项目的同步长度和数据位持续时间。如前所述,同步时间不同,比特时间也不同,但是消息格式均具有低级同步,后跟24个数据位和一个停止位。这足以让我能够在软件中构建通用解码器,而不必对每个设备的所有不同细节进行硬编码。

步骤2:硬件

Arduino

我最初使用PIC微控制器和汇编语言构建了传感器解码器。我最近一直在玩Arduino变体,所以我想看看是否可以复制它。上面显示了简单的示意图,并且还有我的原型的图片。我所做的就是使用三根普通的跳线将Arduino Nano连接至RF接收器板。仅需电源和一条数据线即可。

如果您在“三合一时间和天气显示”上阅读了我的Instructable,您会发现我使用的是433MHz的通用RXB6接收器。您也许可以让真正便宜的接收器在该项目所需的短距离内工作,但是我仍然建议使用超级外差接收器。

步骤3:软件

软件将接收到的位转换为可显示的ASCII字符。它输出同步长度的值以及1位和0位的长度。因为我已经知道同步长度和位格式,所以我可以专门为它们编写软件。取而代之的是,我决定看看是否可以编写它来整理同步长度并自动找出数据位。万一我想尝试检测其他格式,那应该可以更轻松地进行修改。重要的是要注意,该软件不知道消息的第一位是1还是0。它假定它是1,但是,如果确定应该是零,它将求反。

通过使用INT0外部中断输入触发中断处理程序来确定同步脉冲和数据位的时间。 INT0可以在上升沿,下降沿,或在两个边沿或在稳定的低电平上触发。该软件在两个边沿都被中断,并测量脉冲保持低电平的时间。这简化了事情,因为消息开始/同步是一个低电平脉冲,并且可以根据它们的低电平时间来确定这些位。

中断处理程序首先确定捕获的计数是否足够长以至于不能被捕获。启动/同步脉冲。我使用的各种设备的同步脉冲分别为4、9、10和14毫秒。允许的最小/最大同步值的define语句位于软件的最前面,当前设置为3毫秒和16毫秒。传感器之间的位时间也有所不同,因此解码位的算法需要考虑到这一点。将第一位的位时间保存为与第一位有显着差异的后续位的时间。无法直接比较后续位时间,因此使用了“软键因子”定义(“变量”)。假设始终将第一个数据位记录为逻辑1,则开始进行位解码。将保存该值,然后将其用于测试后续位。如果后续数据位计数在已保存值的方差窗口内,则也将其记录为逻辑1。如果它在已保存值的方差窗口之外,则将其记录为逻辑0。如果逻辑0位时间比第一个位时间短,则设置一个标志来告诉软件在显示之前需要反转字节。该算法失败的唯一情况是消息中的位全为0。我们可以接受这种限制,因为这种消息是毫无意义的。

我感兴趣的所有传感器的消息长度均为24个数据位,但是软件不限于该长度。有一个最多七个字节的缓冲区(可以添加更多字节),并定义了最小和最大消息长度(以字节为单位)。该软件设置为收集位,将它们转换为字节,暂时存储它们,然后通过串行端口以ASCII格式输出。触发消息输出的事件是收到新的启动/同步脉冲。

步骤4:数据记录

该软件已设置为通过Arduino的串行(TX)输出以ASCII字符输出转换后的数据。制作PIC版本时,我需要连接PC上的终端程序以显示数据。 Arduino IDE的一个优点是它具有内置的串行监视器功能。我将串行端口速率设置为115.2k,然后将“串行监视器”窗口设置为相同的速率。这里的屏幕截图显示了一个典型的显示,其中包含我拥有的各种传感器的输出。如您所见,数据有时并不完美,但您可以轻松确定每个传感器的真实值。

步骤5:Sample Receiver Software

Arduino

我提供了一个示例软件清单,该清单显示了如何使用收集的信息为您的应用程序接收一组特定的代码。设置此示例以模拟我的Etekcity远程插座之一。一个命令打开内置在Nano(D13)中的LED,另一个命令关闭LED。如果您的Arduino中没有内置LED,请添加电阻和LED,如图所示。在实际应用中,此功能将打开/关闭电源插座的电源(使用继电器或三端双向可控硅开关)。同步时间,位时间和预期的数据字节均已预先定义好,以便于修改。您可以使用其余的任何数据线来打开/关闭特定应用程序的功能,等等。只需添加适用的命令代码定义并在“回路”中替换LED开/关逻辑即可满足您的需求。
      责任编辑:wv

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分