Arduino - 无线通信
Arduino - 基本 RF 无线通信
Section titled “Arduino - 基本 RF 无线通信”简单的 433MHz 或 315MHz ASK(幅度键控)RF 模块是一种低成本的方式,可以在两个 Arduino 之间创建无线数据链路。尽管它们有局限性,但它们非常适合学习无线通信的基础知识。
重要提示:这些模块非常基础。它们容易受到干扰,范围短,且不提供安全性。对于更健壮的项目,请考虑使用现代替代方案,如 nRF24L01、LoRa 或基于 ESP32 的 Wi-Fi/蓝牙解决方案。
- 2 × Arduino UNO(或类似板)
- 1 × 433MHz RF 发射模块(例如 FS1000A)
- 1 × 433MHz RF 接收模块(例如 XY-MK-5V)
- 面包板和跳线
- 2 × 天线(一根简单的约 17.3 厘米 433MHz 实心导线效果良好)
现代库:RadioHead
Section titled “现代库:RadioHead”旧的 VirtualWire 库已被弃用且不再维护。这些模块当前的标准是 RadioHead 库。它功能更强大、更可靠,并支持多种无线硬件。
安装 RadioHead
Section titled “安装 RadioHead”- 打开 Arduino IDE。
- 转到**“项目”>“加载库”>“管理库…”**。
- 在搜索框中输入
RadioHead。 - 找到 Mike McCauley 的库并点击**“安装”**。
天线对性能至关重要。将一根 17.3 厘米的导线焊接到两个模块上的“ANT”焊盘。
发射器接线(Arduino Uno)
Section titled “发射器接线(Arduino Uno)”- 发射器
GND→ ArduinoGND - 发射器
VCC→ Arduino5V - 发射器
DATA(或ATAD)→ Arduino 引脚12
接收器接线(Arduino Uno)
Section titled “接收器接线(Arduino Uno)”- 接收器
GND→ ArduinoGND - 接收器
VCC→ Arduino5V - 接收器
DATA→ Arduino 引脚11
示例项目:无线 LED 控制
Section titled “示例项目:无线 LED 控制”本项目使用一个 Arduino 发送开/关命令,另一个 Arduino 接收命令并控制其内置 LED。
#include <RH_ASK.h>#include <SPI.h> // Not used by ASK but required by RadioHead
// 创建驱动器实例。默认引脚为 TX 12,RX 11。RH_ASK driver;
void setup() { Serial.begin(9600); if (!driver.init()) { Serial.println("RadioHead driver init failed"); while (1); // 失败时停止 } Serial.println("RF Transmitter Initialized");}
void loop() { const char *msgOn = "LED:ON"; driver.send((uint8_t *)msgOn, strlen(msgOn)); driver.waitPacketSent(); // 等待消息发送完成 Serial.println("Sent: LED:ON"); delay(2000);
const char *msgOff = "LED:OFF"; driver.send((uint8_t *)msgOff, strlen(msgOff)); driver.waitPacketSent(); Serial.println("Sent: LED:OFF"); delay(2000);}#include <RH_ASK.h>#include <SPI.h> // Not used by ASK but required by RadioHead
// 创建驱动器实例。我们将使用非默认的 RX 引脚。RH_ASK driver(2000, 11, 12, 0); // (速度, RX 引脚, TX 引脚, PTT 引脚)
void setup() { Serial.begin(9600); if (!driver.init()) { Serial.println("RadioHead driver init failed"); while (1); // 失败时停止 } pinMode(LED_BUILTIN, OUTPUT); Serial.println("RF Receiver Initialized");}
void loop() { uint8_t buf[RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof(buf);
// 检查是否收到消息 if (driver.recv(buf, &buflen)) { // 收到消息,将其打印到串口监视器 Serial.print("Received: "); Serial.println((char*)buf);
// 根据消息控制 LED if (strcmp((char*)buf, "LED:ON") == 0) { digitalWrite(LED_BUILTIN, HIGH); } else if (strcmp((char*)buf, "LED:OFF") == 0) { digitalWrite(LED_BUILTIN, LOW); } }}故障排除和最佳实践
Section titled “故障排除和最佳实践”- 天线是必需的:如果没有合适尺寸的天线,您的通信范围充其量只有几厘米。
- 电源:干净的电源至关重要。来自其他组件的噪声会干扰接收器。在接收器的 VCC 和 GND 之间添加一个小型电容(例如 100uF)会有所帮助。
- 数据速率:默认的 2000 bps 是可靠的。将速度推得太高会增加错误。
- 协议:
RadioHead包含前导码、报头、长度和校验和,使其比发送原始数据更可靠。对于自定义数据,请考虑将其封装在struct中以更好地组织。