原文地址: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 Objectrf_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 Objectrf_driver.init();// Setup Serial MonitorSerial.begin(9600);
}void loop()
{// Set buffer to size of expected messageuint8_t buf[11];uint8_t buflen = sizeof(buf);// Check if received packet is correct sizeif (rf_driver.recv(buf, &buflen)){// Message received with valid checksumSerial.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配合使用和接口相关推荐

  1. 功率放大芯片采用RFX2411 分集开关的2.4 GHz TX / RX增强器

    描述 RFX2411 具有分集开关的2.4 GHz TX / RX增强器,用于IoT / BLE / ZigBee RFX2411N是一款完全集成的单芯片单芯片RFeIC(RF前端集成电路)包含所有无 ...

  2. android蓝牙串口 hc06,Android手机通过蓝牙模块HC-06连接Arduino串口输出

    通过手机进行通信是可以实现很多遥控功能,虽然距离是比较短,一般是10米,但对于我这种新手做测试,比起买一个几百块的多通道遥控器成本要低很多. 实验目的:用Android实现蓝牙连接通过Arduino串 ...

  3. 如何测试W5300的内部TX/RX存储器?

    W5300是一款全硬件TCP/IP协议嵌入式以太网控制芯片,用于要求高速的嵌入式系统. W5300的目标是在高性能的嵌入式领域,如多媒体数据流服务.与WIZnet现有的芯片方案相比较, W5300在内 ...

  4. 【继电器模块教程基于Arduino】

    继电器模块教程基于Arduino 前言 介绍继电器模块 继电器引出线 示例:使用继电器模块和 PIR 运动传感器控制灯![在这里插入图片描述](https://img-blog.csdnimg.cn/ ...

  5. orangepi——uart串口开发(TX,RX)

    基于wiringPi的串口开发 1.简介 串口是嵌入式常用的一种通信方式,串口协议涉及到波特率.奇偶校验位.数据位.停止位等.如何配置寄存器. 串行接口的简称,按照一位一位的顺序传输. wiringP ...

  6. MCU的CAN TX RX无数据问题

    MCU的CAN TX RX无数据问题 /*superyangMCU-qq群:450803186*/ MCU的CAN TX无数据问题是由于TJA1050的5V供电没有接,我一直量的是TJA1050的脚是 ...

  7. COMSOL仿真进阶RF及波动光学模块

    1.COMSOL中RF.波动光学模块仿真基础 1.1 COMSOL中求解电磁场的步骤 1.2RF.波动光学模块的应用领域 2.RF.波动光学模块内置方程解析推导 2.1亥姆霍兹方程在COMSOL中的求 ...

  8. 无线路由器wifi TX/RX率和实际吞吐量的区别

    无意中发现无线路由器中 wifi  TX/RX率都超过100M bit/s,但是电脑实际上10M bit/s都没有.网上查到两个解释: "The TX/RX rate is the rate ...

  9. MCU的CAN TX RX无数据问题 MCU的CAN TX无数据问题是由于TJA1050的5V供电没有接,我一直量的是TJA1050的脚是3V,这个电压不是外部供进去的,这是由于MCU和RX TX平时

    MCU的CAN TX RX无数据问题 MCU的CAN TX无数据问题是由于TJA1050的5V供电没有接,我一直量的是TJA1050的脚是3V,这个电压不是外部供进去的,这是由于MCU和RX TX平时 ...

  10. COMSOL中RF、波动光学模块仿真基础

    1.COMSOL中RF.波动光学模块仿真基础 1.1 COMSOL中求解电磁场的步骤 1.2 RF.波动光学模块的应用领域 2.RF.波动光学模块内置方程解析推导 2.1亥姆霍兹方程在COMSOL中的 ...

最新文章

  1. Cadence入门笔记(2):分裂元件的制作方法
  2. 【CTF大赛】陇剑杯-机密内存-解题过程分析
  3. 使用cloudera manager搭建HUE后的使用,包括Oozie
  4. 我国三大坐标系的区别(西安80、北京54、WGS-84)
  5. js 调用微信浏览器内置方法,启动支付
  6. WSS 3.0与MOSS 2007重要更新
  7. nc系统java不能用_用友NC管理系统使用过程中常见问题和解决方法!
  8. Warshall算法 (解决传递闭包问题)
  9. 硅芯片拆解:早期 555 定时器芯片内部一览
  10. 国美易卡借助云平台,国美易卡提升了用户体验
  11. 周迅 明星烟熏妆更妖艳?
  12. 小白一键重装linux系统重装,小白一键重装系统官网
  13. 如何通俗易懂地解释卷积?
  14. AntV G6设置连线箭头
  15. 计算机的工作原理是二进制原理吗,计算机是怎么通过二进制原理来工作的?
  16. C语言函数大全--h开头的函数
  17. AutoCAD2016安装破解教程
  18. 云上城之歌和你好呀勇士同一个服务器吗,云上城之歌你好呀勇士
  19. 微信小程序页面间的数据传递和数据共享
  20. 进出口贸易管理系统丨汇信

热门文章

  1. 双因素方差分析 matlab,[转载]MATLAB的双因素有交互效应的方差分析
  2. 基本共射放大电路的动态分析
  3. CCD传感器成像、尺寸、曝光时间
  4. css 子元素选择器
  5. 安装bzz1.0教程
  6. 数学不好是原罪——高等数学笔记(汇总版)
  7. 关于工业相机的基本知识
  8. Spring学习笔记10 - Spring配置文件参数划分析
  9. 用计算机美化演讲稿过程,计算机应用基础第10章--PowerPoint应用—制作论文答辩演讲稿.ppt...
  10. sinc函数原型滤波器窗口matlab,sinc函数