通过简单的RF连接发送传感器读数的最佳方式

我买了一双简单的315MHz的 TX / RX 模块。我想用它们将电池供电的ATTiny85连接到Arduino基站。 ATTiny需要定期唤醒并向基站发送传感器读数。

理论上,我应该能够简单地将数据写入TX并从RX模块读取数据。但是,如何确保以正确的速率写入/读取?我需要使用什么代码以特定速度(字节/秒)进行传输?进行纠错/检测的最佳方法是什么?

由于我希望变送器由电池供电,我可以使用晶体管在空闲时关闭VCC到TX模块。 TX模块断电时RX模块会接收什么?

5

7 答案

这些模块基本上使接收器引脚摆动以响应驱动发送器引脚的方式。他们对你认为摆动的意思是什么一无所知,并且不包含UART。没有挖掘,更多的细节并不是立竿见影的。那是你的工作,所以我不想再往前走了。您应该提供数据表的链接,而不是产品启动页面。

这些模块适用于AM调制。简短的写作说ASK,但它可能只是开/关键控发送器(技术上是ASK的一个子集)。该方案的问题在于接收器不能固有地知道发射器何时开启的水平。因此,它很可能会查看最近收到的信号强度,并在中间选择一个值来决定开启和关闭。这称为数据切片

如果您没有定期发送和关闭,接收器将无法跟踪打开和关闭的级别,并且无法再正确地进行数据切片。这通常以两种方式处理。首先,发送前导。这包含快速连续的一堆ons和offs,以便接收器可以达到良好的数据限制器阈值。预计接收器不能正确解释这些位中的一些或全部,因此不会真正“接收”。第二种策略是发送数据,以便接收器始终有最近的开启和关闭参考。一些接收器,特别是那些以模拟方式进行数据切片的便宜接收器,只是对低通滤波后的平均接收信号强度进行切片。对于这样的接收器,您不仅需要经常打开和关闭,而且平均需要接近1/2。

这就是为什么曼彻斯特编码对于这种RF链路如此受欢迎的原因。我不会在这里进入曼彻斯特编码,因为这是众所周知的,你可以在那里找到很多信息。曼彻斯特代码的一个很好的特点是每个位平均为1/2。有点分为两半。开 - 关可能意味着1和关闭0.曼彻斯特可能是最容易编码的方案。

你可以使用UART,但你必须小心,你会放弃一些带宽(电池电量)。看看UART将传输什么。如果您紧接着发送字符,那么每个字符将需要10位时间。将有一个起始位,8个数据位和一个停止位。起始位和停止位始终相反极性。您可以安排在剩余的8位中使用具有相同数量的0和1的代码,以使数据限幅器阈值保持在中间。这意味着您只能在每个UART字符中发送4位信息。你还必须仔细考虑序言。

通常,您应该假设任何一个RF传输都有很大的误码率。这意味着某种校验和是一个好主意。您可以以数据包形式发送数据,并在每个数据包中包含类似16或20位CRC校验和的内容。如果没有完整地接收到数据包,那么它就像从未发生过一样被丢弃。

系统还必须处理发射机断电时收到的随机噪声。在这种情况下,接收器阈值将下降,它将开始数据切片,无论它拾取的是什么随机噪声。通过正确设计的前同步码和校验和,您可以使随机噪声看起来像有效数据的机会一样小。

10
额外
@mchr我还没有亲自使用它,所以不能说可靠性,但我看到了 VirtualWire (请注意,这是一个不幸的PDF)图书馆在讨论这种与Arduinos相结合的模块时提到了一点。它似乎是专门为他们编写的。
额外 作者 mattruma,
我一般都发现,当我找到这样的代码时,它有很多问题需要很长时间才能调试,所以我最好自己编写代码。
额外 作者 Binarytales,
我已经多次完成曼彻斯特编码和解码,但每个都有自己的皱纹,因此嵌入客户代码我不打算给出。环视四周。很可能有人这样做并发布了代码。但请记住,那些认为这是一个足以发布代码的交易的人不是你想要的代码。有时你会发现一些好东西。就像我说的,环顾四周。
额外 作者 Olin Lathrop,
@Kellenjb:我同意。我甚至不去寻找别人的代码。充其量并不是很糟糕,而这种情况很少见,但如果不是首先写入我的开发环境,那么将它集成到我的项目中是很困难且容易出错的。我提到环顾四周只是因为似乎其他人不这么想。
额外 作者 Olin Lathrop,
谢谢你的出色答案。是否有任何现有的代码示例可以完成所有这些操作?听起来大多数/所有这些都是使用这些模块的人必须解决的问题 - 当然我不是第一个。
额外 作者 TheBusyTypist,
Virtual Wire将是将RX模块与Arduino配合使用的完美解决方案。然而,大众图书馆似乎没有使用ATTiny85的盒子。我想我会考虑移植/修复代码以在我的ATTiny 85上运行。
额外 作者 TheBusyTypist,
我刚刚被链接到一个声称在ATTiny和ATmega上做我想做的事情的图书馆 - arduino.cc/forum/index.php/topic,63755.0.html
额外 作者 TheBusyTypist,

I have ended up using a Manchester encoding library. The latest version of this library has now been published here: https://github.com/mchr3k/arduino-libs-manchester

Details about my use of this library can be seen here: http://mchr3k-arduino.blogspot.com/

2
额外

我建议查看VirtualWire库,它为具有ASK输出的ISM范围发送器/接收器对实现RF传输。请参见 http://www.open.com.au/mikem/arduino/ 。我已经成功地使用它从我家周围的无线传感器收集数据。

0
额外
不幸的是,VirtualWire库不支持ATTiny85。
额外 作者 TheBusyTypist,

取决于您希望与现有设备的互操作性,但如果您需要很多, http://www.dealextreme.com/p/wireless-bluetooth-rs232-ttl-transceiver-module-80711 可能值得研究。 它只是一个非常便宜的蓝牙串行链接,几乎所有带蓝牙的计算机都可以读取它。即使在具有非常嘈杂的2.4GHz通信的环境中,蓝牙也具有出色的性能(相对)。

0
额外
感谢您的链接 - 这是一个非常便宜的蓝牙模块!
额外 作者 TheBusyTypist,

Though the original poster already found a solution. I will just add some info for people who end up here. There are basically 2 established ways to send wireless data between arduino's/Attiny's: VirtualWire and Manchester. Both have libraries available. Virtualwire I understand only can send characters (though there is a work around), Manchester can send numbers. In using the manchester library, make sure you have the latest one. Both VirtualWire and manchester can be put in an Attiny. With regard to switching the Transmitter on or Off to save battery use, I suggest you put the Attiny to sleep and when it wakes up, have it switch on the powersupply of the transmitter through a transistor (attiny pin to base, make high etc). There is an example (probably more than one) in instructables: http://www.instructables.com/id/Attiny85-RF-Transmitter-to-Arduino-Uno-Receiver-Ma/?comments=all#CWNVMX4I6RT1A1N

0
额外

看看这里:

https://www.sparkfun.com/datasheets/RF/KLP_Walkthrough.pdf

您在文档中寻求的大部分答案。

0
额外
您可以从链接中添加更多详细信息吗?不鼓励仅链接答案,因为如果链接将来死亡,它们将变得无用。
额外 作者 Timo002,