2020年1月27日 星期一

[RF] nRF24L01 2.4GHz 無線通訊(一) -- 基本發射與接收

一般市售 nRF24L01 2.4G 無線通訊模組常見的有這兩款,其中一種板載天線,另一種外接天線,外接天線這款製造商號稱在無障礙情況下水平通訊距離可達 1100M。

本文僅在說明此模組的基本應用---基本發射與接收,後續將會說明如何製作一個可供麥克納姆輪遙控車使用的無線遙控發射、接收器,詳 https://pizgchen.blogspot.com/2020/01/rf-nrf24l01-24ghz.html




準備材料

請準備 Arduino Uno(或 Nano) 開發板和 nRF24L01 模組各 2 組。
其中一組作為發射端,另一組作為接收端。


電路接線

在電路接線前請務必先認識模組的腳位,如下圖



腳位說明如下 :

 腳位 說明
 VCC 3.3V
 GND Ground
 CE Chip Enable Tx/Rx
 CSN Chip Select Node
 SCK SPI ClocK
 MISO  Master In Slave Out (Send)
 MOSI Master Out Slave In (Receive)
 IRQ Interrupt ReQuest


接線:

Arduino            nRF24L01
3.3V(註1)        VCC
GND                GND
D8                    CSN
D7(註2)           CE
D11                  MOSI
D12                  MISO
D13                  SCK
(不接)              IRQ

註1:提醒您,此模組的電壓是 3.3V,切記不可接到5V。

註2:經實驗,如果依照下圖把 nRF24L01 的 CE 脚位接到 Arduino 的 D9 腳位,將無法運作。因此將腳位改接到 D7。




安裝程式庫

Step1 點擊 Arduino IDE 裡的下拉功能表 Sketch > Include Library > Manage Libraries...

Step2 在右上角落欄位裡輸入 nRF24L01


Step3 將滑桿往下拉找到「RF24」,並點擊「Install」鈕安裝它。


程式

發射端程式和接收端程式需要分別上傳到兩組 Arduino。如果您是使用同一部電腦連接兩組 Arduino,請注意在上傳程式前要切換 COM Port。

(以下程式碼摘自小狐狸事務所)


發射端程式:

//nRF24L01_Sender.ino
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(7, 8); //指定 Arduino Nano 腳位對應 nRF24L01 之 (CE, CSN)
const byte address[6] = "00001";  //節點位址為 5 bytes + \0=6 bytes

int counter = 0; //Hello 計數器

void setup() {
  Serial.begin(9600);
  radio.begin();  //初始化 nRF24L01 模組
  radio.openWritingPipe(address);  //開啟寫入管線
  radio.setPALevel(RF24_PA_MIN);   //設為低功率, 預設為 RF24_PA_MAX
  radio.stopListening();  //傳送端不需接收, 停止傾聽
}

void loop() {
  const char text[32];  //宣告用來儲存欲傳送之字串
  sprintf(text, "Hello World %d", counter);  //將整數嵌入字串中
  Serial.println(text);
  radio.write(&text, sizeof(text));   //將字串寫入傳送緩衝器
  ++counter;
  delay(1000);
}


接收端程式:

//nRF24L01_Receiver.ino
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <printf.h>

RF24 radio(7, 8); //指定 Arduino Nano 腳位對應 nRF24L01 之 (CE, CSN)
const byte address[6] = "00001";  //節點位址為 5 bytes + \0=6 bytes

void setup() {
  Serial.begin(9600);
  radio.begin();  //初始化 nRF24L01 模組
  printf_begin();  //初始化 RF24 的列印輸出功能
  radio.openReadingPipe(0, address);  //開啟 pipe 0 之讀取管線
  radio.setPALevel(RF24_PA_MIN);  //設為低功率, 預設為 RF24_PA_MAX
  radio.startListening();  //接收端開始接收
  radio.printDetails();  //印出 nRF24L01 詳細狀態
  Serial.println("NRF24L01 receiver");
  Serial.println("waiting...");
}

void loop() {
  if (radio.available()) {  //偵測接收緩衝器是否有資料
    char text[32] = "";   //用來儲存接收字元之陣列
    radio.read(&text, sizeof(text));  //讀取接收字元
    Serial.println(text);
  }
}


發射端和接收端程式都上傳後,請開啟接收端的 Serial Monoitor (記得要切換到正確的 COM Port),將 Baud 調到 9600,如此您就可以看到如下圖,表示成功收發資料。



相關網頁

小狐狸事務所 http://yhhuang1966.blogspot.com/2017/10/arduino-nrf24l01.html
Wireless & IoT https://lastminuteengineers.com/nrf24l01-arduino-wireless-communication/


採購資訊

1100M nRF24L01+PA+LNA  無線通訊模組 https://goods.ruten.com.tw/item/show?21934545524992





沒有留言:

張貼留言