nRF24L01+ RF模組教學

nRF24L01+

之前我們製作了一個關於ESP8266-01的說明教材(ESP8266安裝指南),該模組是一種小尺寸WiFi模組,可以讓使用者在專案中輕鬆添加WiFi功能。今天我們將討論 nRF24L01+RF模組,該模組是ESP8266 ESP-01的姐妹模組,能夠讓使用者在專案中添加無線射頻通信功能。nRF24L01+和ESP8266 ESP-01具有類似的外形和引腳佈局(從遠處看完全一樣),但是受控方式和功能完全不同。在本教材中,我們將會介紹此RF模組的使用基礎,還會說明該模組如何與其他RF模組和微控制器通信。為此,我們將展示該模組如何與Arduino Uno微控制器相連接。

nRF24L01+模組是以北歐半導體公司的nRF24L01+“2.4GHz ISM(工業、科學和醫療)頻段RF收發IC”為基礎。

技術規格:

2.4GHz ISM頻段工作

3.額定Vcc為3.3V(可承受5V輸入)

片上穩壓

無線傳輸速率為250kbps, 1 Mbps, 2Mbps

超低功耗工作

低電流消耗(900nA – 26μA)

6條資料管道

首先,我們會介紹使用該模組的硬體部分。與ESP-01類似,該RF模組配備4×2公頭介面。然而,其實際引腳排列與ESP-01模組不同,因為該模組通過不同的通信協定(SPI)與其他設備進行通信。如果您想瞭解有關SPI協定的更多資訊,請查看我們的 Arduino通信協議教材!!

該RF模組的引腳佈局如下圖所示(來自 Addicore網站)。

nRF24L01+

1.nRF24L01+ RF模組的引腳佈局/ ©Addicore

該RF模組作為SPI的從動裝置來進行使用,因此只能與具有專用SPI通信線路的元件一起工作。這意味著圖中的SPI MOSI、MISO和SCK(時鐘)引腳必須連至微控制器的相應引腳。Arduino上的對應引腳如下:

  • MOSI: Arduino D11
  • MISO: Arduino D12
  • SCK: Arduino D13

CE和CSN引腳可以連接Arduino上的任何輸出GPIO引腳。進行SPI通信初始化時,軟體應適當指定這些引腳。

RF模組和Arduino之間的連接示例如下所示:

nRF24L01+

圖2.CE和CSN引腳(圖中的黃線和綠線)可以連至任意兩個未使用的數位引腳。在軟體中,您應該在構建RF模組物件時指定這些引腳。

為了讓Arduino與該模組對接,我們將使用 TMRh20的RF24程式,該程式將RF模組和MCU之間的低層通信封裝成了易於使用的C++類。

深入研究該模組的使用之前,我們首先來介紹一些相關的基礎知識。在美國,射頻設備僅能使用FCC分配的頻率範圍。ISM頻段是FCC為科學和醫療儀器預留的通信頻段,我們的RF模組將通過ISM頻段內的頻率進行通信。該RF模組的使用並不需要知道這些頻率的細節或者這些頻率的通信究竟如何發生。我們將專注於可以控制的無線RF通信的不同方面。

如果您流覽RF24程式檔案,您就會發現很多參數可以做設置。一些關鍵參數列舉如下:

  • 通道: 進行通信的特定頻道(頻率被映射為0至125之間的整數)
  • 讀取管道: 讀取管道是指模組讀取資料的唯一的24位元、32位或者40位地址
  • 寫入管道: 寫入管道是指模組寫入資料的唯一位址
  • 功率放大(PA)等級: 設定晶片功耗,從而設置發送功率。為了符合本入門教材(與Arduino一起使用)之目的,我們將其設定為最小功率。

F24程式檔案提供了許多非常好的範例代碼,以便於我們一窺其門徑。範例專案的連結位址如下: http://tmrh20.github.io/RF24/examples.html

在下文中,我們將會看到上述參數被初始化成為“入門”Arduino代碼。代碼連結如下:

http://tmrh20.github.io/RF24/GettingStarted_8ino-example.html

GettingStarted.ino

 

檔案頂部的前兩行是二個C++ #include指令:第一指令包含Arduino SPI程式(如前所述,RF模組使用SPI與Arduino進行通信);第二條包含RF24程式。

#include <SPI.h>
#include “RF24.h”

接下來的這行指令構建了RF24對象行:RF24 radio(7,8); 傳遞給構造函數的這兩個參數是連至射頻模組的CE和CSN數位引腳。MOSI、MISO和SCK引腳必須分別是引腳11、12和13,而CE和CSN可以是任意兩個數位引腳!

接下來我們看一下讀寫的管道地址。您可能已經猜到,對於相互通信的兩個無線設備來說,寫入管道位址和讀取管道位址正好互換,因為其中一個無線設備的寫入管道是另一個設備的讀取管道。無線設備的位址可以是24位、32位或40位。在範例代碼中,這些位址由C++字串轉換而來,但是,您也可以用二進位或十六進位格式指定。比如,一個40位的位址如果指定為十六進位,那麼可能為0xF0F0F0F0F0。作為良好的程式設計實踐,存儲寫入管道位址和讀取管道位址時,應在一個陣列中放置兩個值。在示例代碼中,寫入管道位址和讀取管道位址存儲在名為“位址”的位元組陣列中。

void setup()方法中,我們需要提供初始化無線設備的位址管道參數以及其他參數的指令。

首先,我們要調用方法RF24::begin()。針對radio物件調用其它RF24程式方法之前,我們必須調用begin()方法,因為該方法初始化RF晶片。

N接下來,調用RF24::setPALevel()方法,初始化功放(PA)等級。RF24程式提供多個不同常數值,用來指定功放等級。較高的PA等級意味著模組的通信距離更長,但是在運行過程中消耗的電流更大。對於入門使用來說,我們將RF_24_LOW常數作為一個參數傳遞給setPALevel()方法,因為兩個通信模組之間的距離不會很大。一般來說,當Arduino板與RF模組相配合時,應保持PA等級盡可能地低,以減小Arduino穩壓電源的電流。

接下來,我們看一下如何初始化讀寫管道。我們已經將寫入管道和讀取管道定義為位元組值。現在,我們必須將這些定義傳遞給radio物件,從而讓它瞭解寫入管道位址和讀取管道位址。寫入管道通過openWritingPipe()方法設置,而讀取管道則通過openReadingPipe()方法設置。打開寫入管道和讀取管道的範例如下:

radio.openWritingPipe(addresses[1]);

radio.openReadingPipe(1, addresses[0]);

請注意,必須為openReadingPipe()方法傳遞一個額外的整數,以指明初始化哪個讀取管道。這是因為該RF模組在給定時間內可以打開多達6個讀取管道!

範例代碼通過一個 role布林值適當分配讀取管道和寫入管道值。根據 role的值,程式會確定RF模組是ping設備還是 pong設備。您的項目也可以使用類似代碼。必須確保兩個設備上的讀寫位址互換,否則系統不會傳輸或讀取資料!

調用 RF24::startListening() 方法之後,無線模組開始進行偵聽。重要須知:指示射頻模組開始偵聽資料之前,必須初始化讀取管道(即調用 openReadingPipe()方法之前必須調用startListening() 方法!)

類似地,RF24類還提供stopListening()方法,無線模組開始寫入之前必須調用該方法

在範例代碼中,您可能會注意到,系統指示無線模組使用RF24::available()方法檢查是否存在傳入資料。這類似於我們之前見過的Serial::available()SoftwareSerial::available() 方法,如果RF連接存在可用資料,那麼available()方法會返回真(true),表示可以讀取資料。

最後,RF24類提供了真正寫入和讀取資料的方法。用於RF24::write()RF24::read()方法的參數如下:(1)一個指標,指向與所發送資料類型相同的變數;以及(2)被發送資料的長度。在 read() 方法中,指標指向的變數接收正在讀取的資料。在write()方法中,指標指向的變數會保存正在寫入的資料。在這兩個方法中,絕對有必要確保指標指向與要發送資料類型相同的變數,並且傳遞給方法的長度實際上反映了資料大小。向read()write()方法傳遞不正確的類型或長度可能導致非期望的資料截斷,從而導致傳輸資料無效。在“入門”代碼中,需要傳輸的資料是 無符號長整數

無符號長整數(unsigned long)。因此,作為參數傳遞給read()和write()方法的指標指向一個類型為無符號長整型的變數。還有一點必須清楚,傳輸資料的長度始終是無符號長整數的長度。在這種情況下,長度不需要明確作為一個整數傳遞,該長度參數可以簡單地寫為sizeof(unsigned long)。

“入門”代碼唯一沒有涉及的參數就是通信通道。如果需要特定通道(比如您擁有多個RF網路,但是您不希望它們相互干擾),那麼可以向RF24::setChannel()方法傳遞一個8位元整數參數,從而設定通道。示例代碼如下:
radio.setChannel(10);

嘗試將二個RF模組連至二個獨立的Arduino板,並分別載入“入門”代碼(對於其中一個板,您必須將role 的布林值改為1)。您現在應該可以通過相應的ping時間發送資訊並接收返回資訊!下圖是兩張並排的“ping”和“pong”序列監視器(serial monitors)截圖:

nRF24L01+

圖3.左邊:“ping”監控語句(設備1);右邊:“pong”監控語句(設備0)

恭喜您完成了nRF24L01+教材的學習!您現在具備了使用這些優秀射頻模組打造自己專案的技能和知識!您還可以查看Device Plus部落格,來瞭解更多使用這些RF模組的專案!