在Arduino上使用433MHz发送和接收模块

您所在的位置:网站首页 远程遥控怎么和模块配对手机 在Arduino上使用433MHz发送和接收模块

在Arduino上使用433MHz发送和接收模块

2024-06-02 09:28| 来源: 网络整理| 查看: 265

原文地址:https://dronebotworkshop.com/433mhz-rf-modules-arduino/

在Arduino上使用433MHz发送和接收模块 介绍

毫无疑问,这是无线时代。从鼠标到门铃,从摄像头到计算机,一切似乎都可以连接,而无须连接电缆或绊倒电线的麻烦。

今天,我们将研究一种低成本的方法,用于在两个Arduino之间发送无线数据而无需使用wifi或蓝牙。了解廉价的433MHz模块可能是您在下一个Arduino设计上切断电线所需要的全部。

无线世界

设计师可以采用多种方法为自己的作品添加无线功能。它们中的每一个都有其优点和缺点,因为添加无线通信会增加产品的成本,因此您在实施任何操作之前都需要仔细考虑。

蓝牙通常是想到的第一选择。它很流行,它将允许您借助手机,平板电脑或计算机来控制Arduino项目。您可以创建一个自定义应用程序,使您的项目具有真正的专业外观,等同于您可以从商业上购买的任何东西。

但是,如果您只想从传感器或键盘发送一点数据,蓝牙也可能是一个过大的杀伤力。它还需要您构建一个应用程序,它可能比您想承担的要多。您也需要将其与设备配对,尽管并不是特别困难。

WiFi是另一个不错的选择,使用WiFi将使您的项目与现有网络上的所有设备进行交互。对于物联网(IoT)设备,它是理想的选择。

但是,如果您仅具有基本要求,WiFi可能是一个过大的杀伤力,它可能会花费一些钱,还需要正确地在网络上进行身份验证,否则可能会带来安全风险。当然,只有在您实际拥有现有的WiFi网络的情况下,它才起作用。

nRF24L01模块是受欢迎的选择,它们价格不高,并且可以在两个Arduino之间提供可靠的2路通信。在许多方面,它们是解决许多无线设计问题的理想解决方案。他们可以与正确的天线在相当长的距离内进行通信。

但是nRF24L01的实现可能有些棘手,如果您不需要2通通信,则它们可能有点多余。如果您不小心,它们也会对路由器和无绳电话造成干扰。仍然是一个不错的选择,我们确实会访问此选项-但这是另一篇文章。

我们将在此处讨论的解决方案涉及使用超便宜(即便宜)的无线模块,这些模块可以在合理的距离内提供单向通信功能。它们易于使用,不会超出预算。

433 MHz模块

这些模块可在eBay,亚马逊和许多其他地方使用。通常可以以不到两美元的价格获得它们,这使它们成为您可以获得的最便宜的数据通信选择之一。 在这里插入图片描述

它们低成本的原因之一是这些模块被用于许多电子玩具,游戏以及汽车的智能钥匙中。它们由成千上万的制造商,因此将其成本保持在绝对最低的水平。

这些模块非常易于使用,每个模块只有三个连接(接收器有4个引脚,但两个内部连接在一起),其中两个连接用于供电。其余的连接用于发送器上的数据输入和接收器上的数据输出。

这些模块也非常小巧,几乎可以将无线接口集成到任何项目中。

这两个模块都具有用于外部天线的连接。我们将在稍后讨论天线,但是在进行此操作之前,至关重要的是,我们谈论在项目中使用这些(和其他)无线电模块的合法性。

保持合法

因为我们正在试验发射无线电波的设备,所以我们需要了解有关无执照无线电发射器的规定。这些规定会根据您所居住的地区而有所不同。

您必须了解在您的国家/地区使用这些模块的法律!不遵守这些规则会给您带来很多麻烦。

每个国家都有一个负责无线电通信的监管机构。

在美国联邦通信佣金或FCC是在美国及其属地管理机构。

CRTC或加拿大广播电视委员会在加拿大制定法律。

在英国,通信办公室或OFCOM负责无线电带宽的分配。

您可以查看此Wikipedia列表,以找到您所在国家/地区的监管机构。

在大多数国家/地区,只要满足以下条件,这些模块就可以合法使用:

它们以低功率运行。它们不会连续传输(数字数据是间歇性的,因此可以满足此要求)。它们不传输语音(数字化语音或声音可以)。

同样,在进行这些实验之前,您应该向当地政府确认是否有任何疑问。

ASK –幅移键控

有多种通过无线电发送数字数据的方法:

频移键控或FSK。在这种方法中,数字信号修改载波的频率。这类似于调频或FM收音机。相移键控或PSK。通过响应于输入信号修改载波的相位,可以实现此目的。许多调制解调器都以这种方式工作。幅移键控或ASK。这是一种更简单的方法,类似于调幅或AM无线电。

因为这些模块非常简单,所以我们将使用ASK。

在幅度偏移调制中,响应于输入数据信号来改变载波的幅度(即,电平)。有时将其称为二进制幅度偏移调制,因为实际上只有两个级别需要关注:

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

如下图所示: 在这里插入图片描述 幅移键控的优点是非常简单,因此所得电路简单且便宜。

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

天线也不错。

天线设计

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

一些用户报告说,使用适当的天线设计,可以在50米的距离上进行通信。当然,这是在户外的开放空间中。在室内,特别是通过墙壁,您的射程将大大减少。

天线不必花哨。简单的22或24规格实心线可以为发射器和接收器制造出色的天线。

但是,电线的长度确实很重要,就像所有无线电设备一样。与其使用随机长度的导线,不应该使用所发送信号波长的偶数分数(即一半或四分之一)的导线。

我们在模块中使用的是433MHz的频率。433MHz处的一个波长为69.24 cm。由于这是一个相当长的天线(大约27.25英寸),因此使用半波或四分之一波天线更为实用。

大多数实验人员使用四分之一波长天线,其工作距离约为17.3厘米或6.8英寸。

如果您正在尝试使用其他频率的其他无线电发射机,则需要使用其波长来计算所需的天线长度。这个在线波长计算器将帮助您确定制作天线的时间。

在您的小型Arduino项目中,即使是17.3厘米的天线也显得有些笨拙。通常将导线缠绕在一个或两个天线上以减小尺寸,这有时会带来增加效率的额外好处。您可以通过将电线缠绕在铅笔或钢笔上来试验天线线圈。

演示1 –发送数据

现在,我们已经讨论了模块,现在是时候使用它们了!

在我们的第一个实验中,我们仅将固定消息从发送器发送到接收器。尽管这不是非常有用,但确实可以说明如何使用这些模块,并且可以作为更实际的实验和项目的基础。这也是查看我们的天线设计是否健全的好方法。

因为我们将在两个Arduino之间发送数据,所以(当然)我们将需要两个Arduino。我已经使用Arduino Uno展示了这些实验,但是任何Arduino都可以使用。

连接变送器

变送器的连接非常简单,如下图所示: 在这里插入图片描述 模块只有三个连接,如下所示:

VCC –可以是3到12伏之间的任何正DC电压。在本实验中,我们将从Arduino获得5伏电压。GND –接地连接,连接到Arduino接地端子之一。数据输入-连接到Arduino的引脚12。您应该尝试使用引脚12,因为默认情况下,我们将在草图中使用的库使用该引脚进行数据输出。

您还需要将一条17.3厘米的实心连接线焊接到模块上的天线端子上。

发射机连接好后,就可以继续使用接收机了。

连接接收器

接收器与发送器一样容易连接。 在这里插入图片描述 再一次只有三个连接。尽管接收器模块有四个针脚,但两个中心针脚已绑在一起,因此您可以使用其中任何一个进行数据输出。

连接如下:

VCC –与发射器不同,此电压需要为5伏。我们将使用Arduino的5伏输出。GND –同样是连接到任何Arduino接地引脚的接地。数据输出–这需要连接到Arduino上的数字引脚11。

接收器上的天线连接通常没有标记。它是模块左下角的焊盘,紧邻小线圈。

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

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

RadioHead库

Radiohead是一支成立于1985年的英国摇滚乐队。这是每位Arduino实验人员必不可少的知识,因为他们将自己最流行的专辑之一选为OK Computer,所以您一定会喜欢的。这与RF模块无关,但我想我会提一下!

我们将要讨论的RadioHead是一个代码库,可用于驱动各种无线电通信设备,包括我们的433MHz模块。它是由Mike McCauley为Airspayce撰写的,属于公共领域。

这是一个非常复杂的库,我们将仅使用其中的幅移键控代码。

您需要从Airspayce网站下载该库。

在页面顶部查找到库的链接,然后将ZIP文件下载到计算机上您会记得的位置–您的downloads文件夹可能和其他地方一样好。

现在打开您的Arduino IDE。转到“*草图”*下拉菜单,然后打开“*包含库”*子菜单。选择添加ZIP库

将打开一个对话框,允许您导航到放置RadioHead ZIP文件的位置。查找文件并选择它。

该库将安装到您的Arduino IDE中。完成此操作后,您可能需要重新启动IDE。

现在,RadioHead已成为Arduino IDE的一部分,您就可以开始编写代码了。

演示1发射器代码

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

/* 433 MHz RF Module Transmitter Demonstration 1 RF-Xmit-Demo-1.ino Demonstrates 433 MHz RF Transmitter Module Use with Receiver Demonstration 1 DroneBot Workshop 2018 https://dronebotworkshop.com */ // Include RadioHead Amplitude Shift Keying Library #include // Include dependant SPI Library #include // Create Amplitude Shift Keying Object RH_ASK rf_driver; void setup() { // Initialize ASK Object rf_driver.init(); } void loop() { const char *msg = "Welcome to the Workshop!"; rf_driver.send((uint8_t *)msg, strlen(msg)); rf_driver.waitPacketSent(); delay(1000); }

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

我们首先加载RadioHead ASK库。我们还包括Arduino SPI库,因为ASK库依赖于它。如果您考虑一下,这对我们处理串行数据很有用。

接下来,我们创建一个要使用的ASK对象,我将其称为“ rf_driver”。

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

现在循环。我们从编码消息开始。这必须是char数据类型。这存储在名为“ msg”的变量中。

消息本身是一个文本字符串。您可以使用任何字符串,但要使其简短一些,并确保计算其中的字符数–接收器代码需要该计数。在我的情况下,我的消息有24个字符。

然后,我们发送消息并等待发送。之后,我们施加了一定的延迟,使接收器有时间来消化所有内容–我花了一秒钟,但回想起来,我希望由于消息的长度而使它更长一些。您可以尝试获得最佳值。

之后,循环重复,我们的消息一遍又一遍地发送。

现在,将您的计算机与Arduino断开连接,为Arduino找到另一个电源,然后重新上电。当我们对接收器进行编码时,它将连续发送。

演示1接收方代码

将计算机连接到接收器Arduino并加载以下代码(请记住,所有代码均在本文结尾处的便捷ZIP文件中)。

/* 433 MHz RF Module Receiver Demonstration 1 RF-Rcv-Demo-1.ino Demonstrates 433 MHz RF Receiver Module Use with Transmitter Demonstration 1 DroneBot Workshop 2018 https://dronebotworkshop.com */ // Include RadioHead Amplitude Shift Keying Library #include // Include dependant SPI Library #include // 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[24]; 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对象。

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

在循环中,我们设置了一个缓冲区以匹配所传输消息的大小。因为我的消息(“ Welcome to the Workshop”)为24个字符,所以我使用的值为24。您需要对其进行调整以匹配您的消息长度。确保包括所有空格和标点符号,因为它们都算作字符。

然后,我们检查是否收到了有效的数据包。如果这样做,我们将其打印到串行监视器。然后,我们回到循环的起点,并重新进行一次。

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

尽管此演示不是特别有用,但可用于调整天线长度以及发送和接收天线的方向。如果您使用电池作为发射器,则可以尝试将其移动到其他位置,以查看可获得的距离范围。

演示2 –发送传感器数据

我们的第一个演示展示了如何使用我们的小模块发送和接收数据。现在,让我们做一些更实际的事情。

在第二个演示中,我们将在变送器上使用温度和湿度传感器。我们将从传感器获取读数,并将其传输到接收器,在接收器中将其显示在串行监视器上。

此演示有两个很棒的事情:

这是一个实际应用。您可以使用它来测量远程位置(例如地下室或阁楼)的温度。使用正确的外壳,您甚至可以在户外使用它。它向您展示了一种通过无线电链路发送多条信息的方法。在此演示中,我们同时发送了温度和湿度值。

为了使用我们的温度和湿度传感器,我们需要在我们的Arduino IDE中安装更多的库。

安装Adafruit库

我们的温度传感器需要Adafruit提供的两个库。

该Adafruit的AM2315库。该Adafruit的统一传感器库。

如果您按照将HC-SR04超声波距离传感器与Arduino一起使用进行了实验,则您已经安装了这些库,因为我们在这些实验中使用了相同的温度和湿度传感器。

如果尚未安装这些库,则可以使用Arduino Library Manager安装它们。只需打开库管理器并搜索每个库。两者都需要,因为AM2315库取决于Unified Sensor库。

一旦安装了库,就可以连接变送器。

变送器接线

变送器的接线非常简单,因为大多数与第一个演示完全相同。唯一的增加是DHT22温度和湿度传感器。这是接线图: 在这里插入图片描述 DHT22有四个引脚,其中一个未使用。它的连接方式如下:

VCC –这是一个5伏直流输入,取自与发送器电源相同的5伏Arduino输出。GND –接地,连接到任何Arduino接地引脚。数据输出–这是输出引脚,可以连接到任何未使用的Arduino数字I / O引脚。我使用了引脚7。

一旦连接好DHT22,就完成了接线。接收器的接线没有变化,它与第一个演示中的接线完全相同。

演示2发射器代码

当我们将发送两个数据值(温度和湿度)时,我们需要找出一种将所有数据放入一个字符串中的方法。有许多方法可以完成此任务。

我选择将两个数据值都放在逗号分隔的字符串中。这是发送一行数据的常用方法。尽管此示例仅使用两个数据值,但实际上您可以使用相同的技术添加更多数据。请记住,您最终将耗尽我们正在发送的数据包中的空间。

这是我想出的草图来完成此任务:

/* 433 MHz RF Module Transmitter Demonstration 2 RF-Xmit-Demo-2.ino Demonstrates 433 MHz RF Transmitter Module with DHT-22 Sensor Use with Receiver Demonstration 2 DroneBot Workshop 2018 https://dronebotworkshop.com */ // Include RadioHead Amplitude Shift Keying Library #include // Include dependant SPI Library #include // Include DHT Libraries from Adafruit // Dependant upon Adafruit_Sensors Library #include "DHT.h"; // Define Constants #define DHTPIN 7 // DHT-22 Output Pin connection #define DHTTYPE DHT22 // DHT Type is DHT 22 (AM2302) // Define Variables float hum; // Stores humidity value in percent float temp; // Stores temperature value in Celcius // Define output strings String str_humid; String str_temp; String str_out; // Create Amplitude Shift Keying Object RH_ASK rf_driver; // Initialize DHT sensor for normal 16mhz Arduino DHT dht(DHTPIN, DHTTYPE); void setup() { // Initialize ASK Object rf_driver.init(); // Start DHT Sensor dht.begin(); } void loop() { delay(2000); // Delay so DHT-22 sensor can stabalize hum = dht.readHumidity(); // Get Humidity value temp= dht.readTemperature(); // Get Temperature value // Convert Humidity to string str_humid = String(hum); // Convert Temperature to string str_temp = String(temp); // Combine Humidity and Temperature str_out = str_humid + "," + str_temp; // Compose output character static char *msg = str_out.c_str(); rf_driver.send((uint8_t *)msg, strlen(msg)); rf_driver.waitPacketSent(); }

草图以与第一个演示相同的方式开始,包括RadioHead库和Arduino SPI库。我们还包括用于DHT22传感器的DHT库。

之后,我们为DHT传感器定义一些常数,特别是我们连接到它的引脚和传感器类型(Adafruit库支持多个传感器,包括精度较低的DHT11)。

接下来,我们定义一些变量。为温度和湿度数据定义了两个浮子。同样,我们定义了一些字符串,我们需要将温度和湿度浮点转换为字符串,然后将它们组装成逗号分隔的字符串,以便我们可以发送它。

与其他草图一样,定义了一个ASK对象。我们还初始化了DHT22传感器。

在设置例程中,我们初始化ASK对象并启动DHT传感器。然后,我们进入循环。

我们以延迟开始循环,这为DHT22传感器提供了一些稳定时间。稳定后,我们从传感器读取温度和湿度值,并将它们分配给各自的浮子。

然后,我们将这两个浮点数都转换为字符串,然后将其用于构造以逗号分隔的字符串。

该字符串将转换为一个名为“ msg”的字符,与前面的发送器草图中的操作相同。草图的其余部分与第一个发送器草图相同,我们发送char并等待直到其发送完毕。然后,我们再次从循环的顶部开始。

我们再次将草图加载到我们的发射器Arduino中,然后将其与计算机断开连接。我们将使用电池或电源为其供电,并将计算机连接至接收器Arduino以便进行处理。

演示2接收方代码

如果仍然在接收器Arduino上加载了第一个演示中的代码,则可以运行它并在串行监视器上观察输出。您应该看到以逗号分隔的字符串显示的温度和湿度数据,以及后面的一些“垃圾”。该“垃圾”实际上是一个空字符。

实际上,我们用于此演示的接收器代码与第一个演示的接收器代码非常相似,我们所需要做的就是更改预期数据包的大小,并从逗号分隔的字符串中提取值。

这是我们将用来完成此操作的草图:

/* 433 MHz RF Module Receiver Demonstration 2 RF-Rcv-Demo-2.ino Demonstrates 433 MHz RF Receiver Module with DHT-22 Sensor Use with Transmitter Demonstration 2 DroneBot Workshop 2018 https://dronebotworkshop.com */ // Include RadioHead Amplitude Shift Keying Library #include // Include dependant SPI Library #include // Define output strings String str_humid; String str_temp; String str_out; // 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 // Get values from string // Convert received data into string str_out = String((char*)buf); // Split string into two values for (int i = 0; i < str_out.length(); i++) { if (str_out.substring(i, i+1) == ",") { str_humid = str_out.substring(0, i); str_temp = str_out.substring(i+1); break; } } // Print values to Serial Monitor Serial.print("Humidity: "); Serial.print(str_humid); Serial.print(" - Temperature: "); Serial.println(str_temp); } }

草图以现在非常熟悉的方式开始,加载了RadioHead ASK和Arduino SPI库。然后,我们定义与发射器草图中使用的相同的字符串,一个分别用于温度和湿度,另一个用于将要接收的逗号分隔的字符串。

同样,我们创建一个名为“ rf_driver”的ASK对象。

在设置中,我们完全按照原始接收器草图中的操作进行操作,初始化ASK对象,并设置串行监控器参数。

循环也从最后一个接收器草图开始,唯一的区别是我们的数据包大小为11个字符。

如果接收到有效的数据包,我们会将接收到的数据转换为字符串。这将是我们用逗号分隔的文本。

Arduino没有像其他高级编程语言一样从定界字符串中提取元素的命令。因此,我们运行了一个小例程来为我们做到这一点。它测量字符串的长度和逗号的位置,然后使用该信息将字符串分为两个子字符串。我们将每个这些子字符串分配给我们创建的用于保持湿度和温度的字符串变量。

最后,我们格式化输出文本并将其显示在串行监视器上。然后,我们结束循环并重新开始。

将草图加载到Arduino中,然后启动串行监视器。如果一切正常,您将在串行监视器上看到温度和湿度显示。

通过将变送器移动到不同的位置进行实验,以了解家中的温度和湿度如何变化。

结论

如您所见,向您的Arduino项目添加无线链接无需太复杂或昂贵。如果您需要做的就是以一种方式发送少量数据,这些小型RF模块非常适合工作,而且价格不菲。

您可以使用该技术为其他应用程序和传感器传输多个数据块。请记住,您也可以使用此技术来传输模拟输入的值,因此,如果您要构建无线操纵杆,则不难修改草图以准确地做到这一点。

那么,您将使用无线链接构建什么?您是否发现(合法地)增加射程的任何方法,也许是“超级天线”?让我们在评论中知道。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3