跳至主要内容

ESP32 與 RP2040 使用 NRF24L01 無線通信模組指南

在本文中,我們將詳細介紹如何使用 ESP32 和 RP2040 microcontroller 與 NRF24L01 無線通信模組進行通信。我們將涵蓋硬件連接、軟件配置以及示例代碼,幫助您快速建立起基於這些平台的無線通信系統。

硬件連接

RP2040 和 NRF24L01 引腳對應關係

首先,讓我們看看 RP2040 和 NRF24L01 的引腳連接:

RP2040 引腳功能NRF24L01 引腳
SPI0 SCK (2)SPI 時鐘 (SCK)SCK
SPI0 TX (3)SPI 主出從入 (MOSI)MOSI
SPI0 RX (4)SPI 主入從出 (MISO)MISO
GPIO 7CE(片選使能)CE
GPIO 8CSN(片選信號)CSN

ESP32 和 NRF24L01 引腳對應關係

接下來是 ESP32 和 NRF24L01 的引腳連接:

ESP32 引腳功能NRF24L01 引腳
GPIO 18SPI 時鐘 (SCK)SCK
GPIO 23SPI 主出從入 (MOSI)MOSI
GPIO 19SPI 主入從出 (MISO)MISO
GPIO 4CE(片選使能)CE
GPIO 5CSN(片選信號)CSN
提示

確保正確連接這些引腳,以保證 NRF24L01 模組能夠與 microcontroller 正常通信。

RF 參數設置

為了確保兩個設備能夠成功通信,我們需要配置相同的 RF 參數。以下是 RP2040 和 ESP32 的 RF 參數設置:

RP2040 RF 參數設置:

  • PA Level: RF24_PA_HIGH(可以根據具體情況調整)
  • Channel: 76
  • Data Rate: RF24_250KBPS
  • Auto Acknowledgment: 關閉
  • 數據管道地址:0x30 0x35 0x30 0x31 0x30

ESP32 RF 參數設置:

  • PA Level: RF24_PA_LOW
  • Channel: 76
  • Data Rate: RF24_250KBPS
  • Auto Acknowledgment: 關閉
  • 數據管道地址:0x30 0x35 0x30 0x31 0x30
備註

請注意,兩個設備的 Channel、Data Rate 和數據管道地址必須相同,以確保它們能夠在同一頻道上進行通信。PA Level 可以根據實際需求和環境進行調整。

代碼實現

現在,讓我們來看看如何在代碼中實現這些設置,並進行基本的數據發送和接收。

發送端 (Transmitter) 代碼

#include <Arduino.h>
#include <SPI.h>
#include <RF24.h>

#define CE_PIN 4
#define CSN_PIN 5

RF24 radio(CE_PIN, CSN_PIN);
const uint8_t address[6] = "00001";

void setup() {
Serial.begin(115200);
while (!Serial) {}

if (!radio.begin()) {
Serial.println("無線模組未響應!");
while (1) {}
}

radio.setPALevel(RF24_PA_LOW);
radio.setChannel(76);
radio.setDataRate(RF24_250KBPS);
radio.setAutoAck(false);
radio.openWritingPipe(address);

Serial.println("發送端就緒。開始發送訊息...");
}

void loop() {
char message = random(2) ? 'A' : 'B'; // 隨機發送 'A' 或 'B'

bool report = radio.write(&message, sizeof(message));

if (report) {
Serial.print("發送訊息: ");
Serial.println(message);
} else {
Serial.println("發送失敗");
}

delay(1000); // 每秒發送一次
}

接收端 (Receiver) 代碼

#include <Arduino.h>
#include <SPI.h>
#include <RF24.h>

#define CE_PIN 4
#define CSN_PIN 5

RF24 radio(CE_PIN, CSN_PIN);
const uint8_t address[6] = "00001";

void setup() {
Serial.begin(115200);
while (!Serial) {}

if (!radio.begin()) {
Serial.println("無線模組未響應!");
while (1) {}
}

radio.setPALevel(RF24_PA_LOW);
radio.setChannel(76);
radio.setDataRate(RF24_250KBPS);
radio.setAutoAck(false);
radio.openReadingPipe(1, address);
radio.startListening();

Serial.println("接收端就緒。等待訊息...");
}

void loop() {
if (radio.available()) {
char message;
radio.read(&message, sizeof(message));
Serial.print("收到訊息: ");
Serial.println(message);
}
}

代碼解析

發送端

  1. 我們首先包含必要的庫:Arduino.hSPI.hRF24.h
  2. 定義 CE 和 CSN 引腳。
  3. 創建 RF24 對象並設置地址。
  4. setup() 函數中:
    • 初始化串口通信。
    • 初始化無線模組。
    • 設置 RF 參數(PA Level、Channel、Data Rate 等)。
    • 打開寫入管道。
  5. loop() 函數中:
    • 隨機生成 'A' 或 'B' 作為消息。
    • 發送消息並報告結果。
    • 每秒發送一次。

接收端

  1. 接收端的初始設置與發送端類似。
  2. 主要區別在於:
    • 我們打開的是讀取管道而不是寫入管道。
    • 調用 radio.startListening() 開始監聽incoming訊息。
  3. loop() 函數中:
    • 檢查是否有可用的訊息。
    • 如果有,讀取並打印訊息。

注意事項

  1. 確保兩個設備使用相同的通道和數據管道地址。
  2. PA Level 可能需要根據您的具體應用場景進行調整。
  3. 本例中關閉了自動確認(Auto Acknowledgment)功能,這可能會影響通信的可靠性。在實際應用中,您可能需要根據需求開啟此功能。
  4. 記得在使用前正確連接 NRF24L01 模組的電源和接地引腳。

結論

通過本指南,應該能夠成功地使用 ESP32 或 RP2040 與 NRF24L01 模組進行基本的無線通信。