风筝
发表于: 2022-6-21 17:59:31 | 显示全部楼层

想要以低于一杯咖啡的价格为您的下一个Arduino项目添加无线功能?那么,433MHz射频发射器和接收器模块就是为您准备的!它们通常可以以不到两美元的价格获得,这使它们成为您可以获得的最便宜的数据通信选择之一。最重要的是,这些模块非常小巧,允许您将无线接口集成到几乎任何项目中。


硬件概述

让我们仔细看看433MHz射频发射器和接收器模块。

433MHz-RF-Transmitter-Working-Block-Diagram.jpg


这个小模块是一个发射器。看起来真的很简单。该模块的核心是针对433MHz操作进行调谐的SAW谐振器。有一个开关晶体管和一些无源元件,大概就是这样子。


当高电平施加到DATA输入时,振荡器运行以产 433.xx MHz 的恒定射频输出载波,当DATA输入变为逻辑低电平时,振荡器停止。这种技术称为幅移键控,我们将在稍后详细讨论。

433MHz-RF-Receiver-Working-Block-Diagram.jpg


这是一个接收器模块。虽然看起来很复杂,但它就像发射器模块一样简单。它由一个射频调谐电路和一对运算放大器组成,用于放大从发射器接收到的载波。放大后的信号进一步馈送到PLL(锁相环),使解码器能够锁定到数字比特流上,从而提供更好的解码输出和抗噪性。


ASK幅移键控

如上所述,为了通过无线电发送数字数据,这些模块使用称为幅移键控或ASK(Amplitude Shift Keying) 的技术。在幅移键控中,载波(在我们的例子中是 433MHz 信号)的幅度(即电平)会随着输入的数据信号而改变。


这非常类似于调幅的模拟技术,如果您熟悉 AM 收音机,您可能会熟悉这种技术。它有时被称为二进制幅移键控,因为我们只关心两个电平。您可以将其视为 ON/OFF 开关。

●    数字 1 – 这会全力驱动载波信号。

●    数字 0 – 这会完全切断载波信号。


这是幅度调制的样子:

433MHz-RF-Transmitter-Amplitude-Shift-Keying-ASK-Waveform.png


幅移键控的优点是实现起来非常简单。设计解码器电路非常简单。此外,与 FSK(频移键控)等其他调制技术相比,ASK需要更少的带宽。这也是物美价廉的原因之一。


然而,缺点是ASK容易受到其他无线电设备和背景噪声的干扰。但是只要您将数据传输保持在相对较慢的速度,它就可以在大多数环境中可靠地工作。


433MHz射频发射器和接收器的引脚排列

让我们看一下433MHz射频发射器和接收器模块的引脚排列。

433MHz-RF-Wireless-Transmitter-Pinout.jpg


DATA 引脚接收要传输的数字数据。

VCC 为发送器供电。这可以是 3.5V 至 12V 之间的任何电压。请注意,RF输出与电源电压成正比,即电压越高,范围越大。

GND 是接地引脚。

Antenna 是外接天线的焊盘引脚。如前所述,您需要将一根17.3 cm的实心线焊接到该引脚上以提高范围。


433MHz-RF-Wireless-Receiver-Pinout.jpg


VCC 为接收器供电。与发送器不同,接收器的电源电压需要为5V。

DATA 引脚输出接收到的数字数据。中间两个引脚在内部连接在一起,因此您可以使用其中任何一个进行数据输出。

GND 是接地引脚。

Antenna 是外部天线的引脚,通常没有标记。它是模块左下角的焊盘,紧挨着小线圈。同样,您需要将一根 17.3 cm 的实心线焊接到该引脚上以提高通信范围。


433MHz射频发射器和接收器与Arduino UNO的接线

现在我们了解了有关模块的所有信息,是时候使用它们了!


由于我们将在两个Arduino开发板之间发送数据,我们当然需要两个Arduino开发板、两个面包板和几根跳线。


发射器的接线相当简单。它只有三个连接。将VCC引脚连接到5V引脚,并将GND连接到Arduino的GND。DATA引脚连接到Arduino的数字引脚#12。您应该尝试使用引脚12,因为默认情况下,我们将在草图中使用的库使用此引脚进行数据输入。


下图显示了接线。

Arduino-Wiring-Fritzing-Connections-with-433MHz-RF-Wireless-Transmitter-Module.jpg


连接好发射器后,您就可以继续连接接收器了。接收器的接线与发射器一样简单。


同样接收器也只有三个连接。将VCC引脚连接到5V引脚,并将GND连接到Arduino的GND。中间两个数据输出引脚中的任何一个都连接到Arduino上的数字引脚#11。


以下是接收器接线完成后的样子。

Arduino-Wiring-Fritzing-Connections-with-433MHz-RF-Wireless-Receiver-Module.jpg


现在发送器和接收器都已连接好,我们需要编写一些代码并将其发送到Arduino开发板。由于您可能只有一台计算机,我们将从发射器开始。一旦代码被加载完成后,我们将编程接收器。然后可以使用电源适配器或电池为Arduino供电。

跳转到指定楼层
风筝
发表于: 2022-6-22 09:34:45 | 显示全部楼层

RadioHead库 - 用于无线模块的利器

在我们开始编码之前,我们需要将一个名为RadioHead的库安装到Arduino IDE中,这将使编写代码变得更加简单。


RadioHead是一个允许在Arduino开发板之间进行简单数据传输的库。它用途广泛,可用于驱动各种无线电通信设备,包括我们的433MHz模块。


RadioHead库所做的是获取我们的数据,将其封装成一个包含CRC(循环冗余校验)的数据包,然后将其与必要的前导码和数据头一起发送到另一个Arduino。如果数据被正确接收,接收的Arduino 会被告知有可用的数据,并继续对其进行解码和操作。


RadioHead数据包的组成如下:在每次传输开始时发送一个由“1”和“0”位对组成的36位流,称为“训练前导码”。这些位对于接收器在获取实际数据之前调整其增益是必要的。随后,添加一个12位起始符号,然后添加实际数据(有效负载)。


在接收端的RadioHead重新计算的数据包末尾添加一个帧校验序列或CRC,如果CRC校验正确,则向接收设备发出警报。如果CRC校验失败,则丢弃该数据包。


整个数据包看起来像这样:

433MHz-RF-Wireless-Transmitter-Receiver-RadioHead-Library-Data-Packet-Working-Bl.jpg


您可以通过访问 airspayce.com 下载该库:http://www.airspayce.com/mikem/arduino/RadioHead/


要安装该库文件,请打开 Arduino IDE,转到 Sketch > Include Library > Add .ZIP Library,然后选择刚刚下载的 RadioHead 文件。如果您需要有关安装库的更多详细信息,请访问安装Arduino库教程

回复

使用道具 举报

风筝
发表于: 2022-6-22 10:00:24 | 显示全部楼层

433MHz射频发射器的Arduino代码

在示例中,我们只从发射器向接收器发送一条简单的文本消息。这将有助于了解如何使用这些模块,并可以作为更多实际实验和项目的基础。


这是我们将用于发射器的草图代码:

  1. // Include RadioHead Amplitude Shift Keying Library
  2. #include <RH_ASK.h>
  3. // Include dependant SPI Library
  4. #include <SPI.h>

  5. // Create Amplitude Shift Keying Object
  6. RH_ASK rf_driver;

  7. void setup()
  8. {
  9.     // Initialize ASK Object
  10.     rf_driver.init();
  11. }

  12. void loop()
  13. {
  14.     const char *msg = "Hello World";
  15.     rf_driver.send((uint8_t *)msg, strlen(msg));
  16.     rf_driver.waitPacketSent();
  17.     delay(1000);
  18. }
复制代码

这是一个非常简短的草图,但它包含传输信号所需的全部内容。


在代码中首先包含RadioHead ASK库。我们还需要包含Arduino SPI库,因为RadioHead库依赖于它。

  1. #include <RH_ASK.h>
  2. #include <SPI.h>
复制代码

接下来,我们需要创建一个ASK对象访问与RadioHead ASK库相关的特殊函数。

  1. // Create Amplitude Shift Keying Object
  2. RH_ASK rf_driver;
复制代码

在setup()函数中,我们需要初始化ASK对象。

  1. // Initialize ASK Object
  2. rf_driver.init();
复制代码

在loop()函数中,我们首先准备一条消息。它是一个简单的文本字符串,存储在一个名为msg的字符串指针中。请记住,您的消息可以是任何内容,但不应超过27个字符。并确保计算其中的字符数,因为您需要在接收器代码中进行计数。在我们的例子中,我们有11个字符。

  1. // Preparing a message
  2. const char *msg = "Hello World";
复制代码

然后使用 send() 函数传输消息。它有两个参数:第一个是数据数组,第二个是要发送的字节数(数据长度)。 send() 函数之后通常是 waitPacketSent() 函数,它一直等待直到任何先前的传输数据包完成传输。之后,草图等待一秒钟,让我们的接收器有时间接收所有内容。

  1. rf_driver.send((uint8_t *)msg, strlen(msg));
  2. rf_driver.waitPacketSent();
  3. delay(1000);
复制代码

433MHz射频接收器的Arduino代码

将接收器的Arduino连接到计算机并加载以下代码:

  1. // Include RadioHead Amplitude Shift Keying Library
  2. #include <RH_ASK.h>
  3. // Include dependant SPI Library
  4. #include <SPI.h>

  5. // Create Amplitude Shift Keying Object
  6. RH_ASK rf_driver;

  7. void setup()
  8. {
  9.     // Initialize ASK Object
  10.     rf_driver.init();
  11.     // Setup Serial Monitor
  12.     Serial.begin(9600);
  13. }

  14. void loop()
  15. {
  16.     // Set buffer to size of expected message
  17.     uint8_t buf[11];
  18.     uint8_t buflen = sizeof(buf);
  19.     // Check if received packet is correct size
  20.     if (rf_driver.recv(buf, &buflen))
  21.     {
  22.       
  23.       // Message received with valid checksum
  24.       Serial.print("Message Received: ");
  25.       Serial.println((char*)buf);         
  26.     }
  27. }
复制代码

和发射器的代码一样,接收器代码首先包含RadioHead和SPI库并创建一个ASK对象。

  1. #include <RH_ASK.h>
  2. #include <SPI.h>
  3. RH_ASK rf_driver;
复制代码

在setup函数中:我们初始化ASK对象并设置串口监视器,因为这是我们查看接收到的消息的方式。

  1. rf_driver.init();
  2. Serial.begin(9600);
复制代码

在loop()函数中:我们创建一个大小与传输消息相同的缓冲区。在我们的例子中,它是11,记得吗?您需要调整它以匹配您的消息长度。请务必包含任何空格和标点符号,因为它们都算作字符。

  1. uint8_t buf[11];
  2. uint8_t buflen = sizeof(buf);
复制代码

接下来,我们调用 recv() 函数。如果接收器尚未打开,这将打开接收器。如果有可用的有效消息,它将消息复制到其第一个参数缓冲区并返回 true,否则返回 false。如果函数返回 true,则草图进入if语句并在串口监视器上打印接收到的消息。

  1. if (rf_driver.recv(buf, &buflen))
  2. {
  3.   Serial.print("Message Received: ");
  4.   Serial.println((char*)buf);         
  5. }
复制代码

然后我们回到循环的开始,重新做一遍。


加载草图后打开串口监视器。如果一切正常,您应该会看到您的消息。

433MHz-RF-Module-RadioHead-Library-Sketch-Output-on-Serial-Monitor.png


提高433MHz射频模块的通信范围

您用于发射器和接收器的天线确实会影响您使用这些射频模块可以获得的范围。事实上,如果没有天线,你会很幸运能够在一米多的距离内进行通信。


通过适当的天线设计,您将能够在50米的距离内进行通信。当然,那是在户外的空旷地方。您在室内的范围,尤其是穿过墙壁的范围会略微减弱。


天线不需要复杂。一根简单的单芯线可以为发射器和接收器制作出色的天线。只要保持天线的长度,天线直径几乎没有任何重要性。最有效的天线具有与其所使用的波的长度相同的长度。出于实际目的,该长度的一半或四分之一就足够了。


频率的波长计算如下:

频率波长 = 传输速度 (v) / 传输频率 (f)


在空气中,传输速度等于光速,准确地说是 299,792,458 m/s。因此,对于433 MHz波段,波长为:

频率波长 = 299,792,458 m/s / 433,000,000 赫兹 = 0.6924 米 = 69.24 厘米


由于全波 69.24 厘米天线是一根相当长的天线,使用起来不太实用。这就是为什么我们会选择四分之一波长天线,即17.3厘米或6.8英寸。


以防万一,如果您正在试验使用不同频率的其他无线电发射器,您可以使用相同的公式来计算所需的天线长度。很容易,对吧?

回复

使用道具 举报

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

本版积分规则

主题 714 | 回复: 1501



手机版|

GMT+8, 2024-12-22 15:54 , Processed in 0.079667 second(s), 10 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表