我是靠谱客的博主 正直羊,最近开发中收集的这篇文章主要介绍433MHz RF Tx-Rx模块如何与Arduino配合使用和接口433MHz RF Tx-Rx模块如何与Arduino配合使用和接口,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

原文地址:https://lastminuteengineers.com/433mhz-rf-wireless-arduino-tutorial/

433MHz RF Tx-Rx模块如何与Arduino配合使用和接口

在这里插入图片描述

是否想以低于一杯咖啡的价格为您的下一个Arduino项目添加无线功能?好吧,那么433MHz RF发射器和接收器模块正是为您服务的!通常可以在网上以不到两美元的价格买到它们,这使它们成为您可以获得的最便宜的数据通信选择之一。最重要的是,这些模块非常小巧,可让您将无线接口整合到几乎所有项目中。

硬件总览

让我们仔细看一下433MHz射频发送器和接收器模块。
在这里插入图片描述

这个小模块是两个发射器。它看起来很简单。该模块的核心是SAW谐振器,该谐振器针对433.xx MHz工作频率进行了调整。有一个开关晶体管和一些无源元件。

当将逻辑高电平施加到数据输入时,振荡器将运行,以产生恒定的433.xx MHz的RF输出载波,而当数据输入变为逻辑低电平时,振荡器将停止。这项技术被称为幅度偏移键控 (Amplitude shift keying),稍后将对其进行详细讨论。
在这里插入图片描述

这是一个接收器模块。尽管看起来很复杂,但它与发送器模块一样简单。它由一个射频调谐电路和几个运算放大器组成,以放大从发射机接收的载波。放大后的信号进一步馈入PLL(锁相环),该锁相环使解码器可以“锁定”到数字位流上,从而提供更好的解码输出和抗噪能力。

ASK –幅度偏移键控 (Amplitude shift keying)

如上所述,为了通过无线电发送数字数据,这些模块使用了一种称为幅度偏移键控 (Amplitude shift keying)或ASK的技术。在幅度移位键控中,响应于输入数据信号,改变载波的振幅(即,电平)(在我们的情况下为433MHz信号)。

这与幅度调制的模拟技术非常相似,如果您熟悉AM无线电,则可能会熟悉。有时称为二进制幅度偏移键控,因为我们只关注两个级别。您可以将其视为ON / OFF开关。

  • 对于数字1 –这将充分发挥载体的作用。
  • 对于数字0 –这将完全切断载波。

这是振幅调制的样子:
在这里插入图片描述

幅度偏移键控 (Amplitude shift keying)的优点是实现起来非常简单。设计解码器电路非常简单。此外,与其他调制技术(如FSK(频移键控))相比,ASK所需的带宽更少。这是便宜的原因之一。

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

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

让我们看一下433MHz RF发射器和接收器模块的引脚排列。
在这里插入图片描述
数据 引脚接受要传输的数字数据。

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

GND 是接地针。

天线是外部天线的引脚。如前所述,您将需要在该引脚上焊接一条17.3厘米的实心线,以扩大范围。
在这里插入图片描述

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

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

GND 是接地针。

天线是外部天线的引脚,通常没有标记。它是模块左下角的焊盘,紧邻小线圈。同样,您将需要在该引脚上焊接一条17.3厘米的实心线,以扩大接收范围。

接线–将433MHz射频发射器和接收器连接到Arduino UNO

既然我们了解了有关模块的所有知识,就该使用它们了!

由于我们将在两个Arduino板之间发送数据,因此我们当然需要两个Arduino板,两个面包板和一对跳线。

变送器的接线非常简单。它只有三个连接。在Arduino上将VCC引脚连接到5V引脚,并将GND接地。Data-In引脚应连接到Arduino的数字引脚#12。您应该尝试使用引脚12,因为默认情况下,RadioHead库使用该引脚进行数据输入。

下图显示了接线。
在这里插入图片描述

发射机连接好后,就可以继续使用接收机了。接收器的接线和发送器一样容易。

再一次只有三个连接。在Arduino上将VCC引脚连接到5V引脚,并将GND接地。中间的两个数据输出引脚中的任何一个都应连接至Arduino上的数字引脚11。

这就是接收器接线的样子。
在这里插入图片描述

现在,发送器和接收器都已连接好,我们将需要编写一些代码并将其发送到相应的Arduino板。由于您可能只有一台PC,因此我们将从发射机开始。将代码加载到此处后,我们将继续进行接收。然后可以使用电源或电池为与发射器相连的Arduino供电。

RadioHead库–用于无线模块的瑞士军刀

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

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

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

所述无线电头分组由如下:“1”和“0”位对A 36的比特流,称为“训练前同步码”,在每次发送开始时发送。这些位是接收器在获取实际数据之前调整其增益所必需的。随后,先添加一个12位的“起始符号”,然后再添加实际数据(有效载荷)。

帧检查序列或CRC添加到数据包的末尾,由RadioHead在接收器端重新计算,如果CRC检查正确,则会向接收设备发出警报。如果CRC检查失败,则将数据包丢弃。

整个数据包看起来像这样:
在这里插入图片描述

您可以通过访问airspayce.com来下载该库,或者单击此按钮以下载zip:

RadioHead.zip

要安装它,请打开Arduino IDE,转到“草图”>“包含库”>“添加.ZIP库”,然后选择刚下载的RadioHead文件。如果您需要有关安装库的更多详细信息,请访问此“安装Arduino库”教程。

Arduino代码–用于433MHz射频发射器

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

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

// Include RadioHead Amplitude Shift Keying Library
#include <RH_ASK.h>
// Include dependant SPI Library 
#include <SPI.h> 
 
// Create Amplitude Shift Keying Object
RH_ASK rf_driver;
 
void setup()
{
    // Initialize ASK Object
    rf_driver.init();
}
 
void loop()
{
    const char *msg = "Hello World";
    rf_driver.send((uint8_t *)msg, strlen(msg));
    rf_driver.waitPacketSent();
    delay(1000);
}

这是一个很短的草图,但是这是传输信号所需的全部。

草图首先包括RadioHead ASK库。我们还需要包括Arduino SPI库,因为RadioHead库依赖于它。

#include <RH_ASK.h>
#include <SPI.h>

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

// Create Amplitude Shift Keying Object
RH_ASK rf_driver;

在设置功能中,我们需要初始化ASK对象。

// Initialize ASK Object
rf_driver.init();

在循环功能中,我们首先准备一条消息。这是一个简单的文本字符串,存储在名为msg的字符指针中。请记住,您的消息可以是任何字符,但不能超过27个字符,以提高性能。并确保计算其中的字符数,因为您将需要在接收器代码中计算该数字。在我们的例子中,我们有11个字符。

// Preparing a message
const char *msg = "Hello World";

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

rf_driver.send((uint8_t *)msg, strlen(msg));
rf_driver.waitPacketSent();
delay(1000);

Arduino代码–用于433MHz RF接收器

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

// Include RadioHead Amplitude Shift Keying Library
#include <RH_ASK.h>
// Include dependant SPI Library 
#include <SPI.h> 
 
// Create Amplitude Shift Keying Object
RH_ASK rf_driver;
 
void setup()
{
    // Initialize ASK Object
    rf_driver.init();
    // Setup Serial Monitor
    Serial.begin(9600);
}
 
void loop()
{
    // Set buffer to size of expected message
    uint8_t buf[11];
    uint8_t buflen = sizeof(buf);
    // Check if received packet is correct size
    if (rf_driver.recv(buf, &buflen))
    {
      
      // Message received with valid checksum
      Serial.print("Message Received: ");
      Serial.println((char*)buf);         
    }
}

就像发送器进程一样,接收器代码从加载RadioHead和SPI库并创建ASK对象开始。

#include <RH_ASK.h>
#include <SPI.h> 
RH_ASK rf_driver;

在设置功能中:我们初始化ASK对象,并设置串行监视器,因为这是我们将如何查看收到的消息的方法。

rf_driver.init();
Serial.begin(9600);

循环功能:我们创建一个与发送的消息大小相同的缓冲区。在我们的例子中是11岁,还记得吗?您将需要调整它以匹配您的消息长度。确保包括所有空格和标点符号,因为它们都算作字符。

uint8_t buf[11];
uint8_t buflen = sizeof(buf);

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

if (rf_driver.recv(buf, &buflen))
{
  Serial.print("Message Received: ");
  Serial.println((char*)buf);         
}

然后,我们回到循环的起点,并重新进行一次。

加载草图后,打开串行监视器。如果一切正常,您应该会看到您的消息。
在这里插入图片描述串行监视器上的433MHz无线射频模块输出–接收器

扩大433MHz射频模块的范围

您用于发射器和接收器的天线会真正影响您可以通过这些RF模块获得的范围。实际上,如果没有天线,您将很幸运能在超过一米的距离内进行通信。

通过适当的天线设计,您将能够在50米的距离内进行通信。当然,这是在户外的开放空间中。您在室内的范围(尤其是穿过墙壁的范围)将略微减弱。

天线不必很复杂。简单的单芯线可以为发射器和接收器制造出色的天线。只要保持天线的长度,天线直径几乎没有任何重要性。

最有效的天线的长度与其所使用的波的长度相同。出于实际目的,该长度的一半或四分之一就足够了。

频率的波长计算如下:

在这里插入图片描述

由于全波69.24厘米天线是一个相当长的天线,因此使用起来不是很实用。这就是为什么我们选择四分之一波长天线的原因,该天线的长度约为17.3厘米或6.8英寸。

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

在您的小型Arduino项目中,即使是17.3厘米的天线似乎也不方便。但是不要试图绕圈天线以使其更紧凑,因为这会严重影响范围。直天线永远是最好的!

最后

以上就是正直羊为你收集整理的433MHz RF Tx-Rx模块如何与Arduino配合使用和接口433MHz RF Tx-Rx模块如何与Arduino配合使用和接口的全部内容,希望文章能够帮你解决433MHz RF Tx-Rx模块如何与Arduino配合使用和接口433MHz RF Tx-Rx模块如何与Arduino配合使用和接口所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部