利用NRF24L01收發(fā)模塊實現(xiàn)Arduino與NodeMCU的無線通信
射頻通信是物聯(lián)網(wǎng)應用中最常用的通信技術之一,我們之前在兩臺Arduino之間的通信中使用了433 MHz的射頻模塊。在本教程中,我們將使用NRF24L01收發(fā)模塊在Arduino板和NodeMCU之間進行無線通信。在這里,我們將使用NodeMCU ESP8266從互聯(lián)網(wǎng)服務器獲取實時時間戳,并通過NRF24L01收發(fā)器無線傳輸?shù)紸rduino uno,并將其打印在連接到Arduino uno的16x2 LCD顯示屏上。
因此,nRF24L01模塊將在發(fā)送端與ESP8266接口,在接收端與Arduino Uno接口。
材料
?Arduino UNO R3
?NodeMCU
?NRF24L01收發(fā)模塊
?16*2字母數(shù)字液晶顯示
?連接電線
?電路試驗板
?電力供應
NRF24L01收發(fā)模塊
nRF24L01收發(fā)模塊用于兩個微控制器之間的無線通信。它在2.4 GHz全球ISM頻段運行,并使用GFSK調(diào)制進行數(shù)據(jù)傳輸。數(shù)據(jù)傳輸速率支持250kbps、1Mbps和2Mbps。如果在沒有障礙物的開放空間中使用,以較低的波特率運行,其范圍可達100米。
nRF24L01收發(fā)模塊通過SPI接口通信,最大數(shù)據(jù)速率為10Mbps。SPI總線使用主從總線的概念。這里Arduino/NodeMCU的SPI總線引腳可以連接到NRF24L01收發(fā)模塊的SPI總線引腳上。
nRF24L01收發(fā)模塊在一定頻帶內(nèi)收發(fā)數(shù)據(jù),稱為信道。如果需要多個NRF24L01收發(fā)模塊相互通信,必須將它們配置為相同的信道。該信道可以在2.4 GHz ISM頻段的任何頻率。每個通道占用的帶寬不超過1MHz。這為我們提供了125個信道,帶寬間隔為1MHz。因此,NRF24L01模塊可以使用125個可能的通信信道,它可以在2.400到2.525 GHz之間。
什么是2.4 GHz ISM頻段?
2.4 GHz頻段是國際上為使用未經(jīng)許可的低功率設備保留的工業(yè)、科學和醫(yī)療(ISM)頻段之一。例如使用ISM頻率的NFC設備、無繩電話和藍牙設備。
技術規(guī)格:
?2.4Ghz免license ISM頻段。
?最高數(shù)據(jù)傳輸速度2Mbps,高效GFSK調(diào)制,抗干擾性強,特別適合工業(yè)控制。
?125信道,可達到不同點或跳頻通信需要。
?低功耗1.9 - 3.6V,待機狀態(tài)下僅需1uA。
?發(fā)送和接收中斷信號,每次最多發(fā)送28字節(jié)。
?集成專用穩(wěn)壓器,使用包括DC/DC電源在內(nèi)的任何電源都能有更好的通信效果。
?雙通道數(shù)據(jù)接收,內(nèi)置圓形天線,在開放無干擾環(huán)境下通信距離可達100米。
?尺寸:39mm * 17mm * 1mm(PCB嵌入式天線)
nRF24L01輸出:
nRF24L01引腳說明:
GND:這是接地參考引腳。
VCC:這是模塊的電源引腳,可以從1.9伏到3.9伏供電??蛇B接Arduino和NodeMCU模塊的3.3V引腳。
CE:它是芯片使能引腳,是一個有效的高引腳。該引腳模式?jīng)Q定模塊是在發(fā)送還是在接收。
CSN:它代表芯片選擇不,它是一個活動的低引腳,通常保持高。當此引腳變低時,nRF24L01開始在其SPI端口上偵聽任何傳入數(shù)據(jù)。
SCK:它是串行時鐘引腳,接受來自SPI主設備的傳入時鐘脈沖。
莫西:它代表主出從入。負責NRF24L01收發(fā)模塊的輸入。
MISO:它代表主入從出。它負責NRF24L01收發(fā)模塊的輸出。
IRQ:這是一個中斷引腳,當任何新的傳入數(shù)據(jù)可用時,它可以通知主設備。
線路圖
nRF24L01發(fā)送端帶NodeMCU ESP8266
在發(fā)送端,NodeMCU is模塊與NRF24L01模塊連接,NRF24L01模塊作為發(fā)送端。如圖所示,NodeMCU的SPI引腳連接到NRF24L01模塊的SPI引腳上。除此之外,CE和CSN引腳連接到NodeMCU的數(shù)字輸出引腳。
nRF24L01與NodeMCU的連接關系如下表所示:
在發(fā)送端,我們使用“pool.ntp.org”服務器從ESP8266的內(nèi)置時間庫中獲得當前的時間戳和日期。然后我們可以對這些數(shù)據(jù)進行處理,通過NRF24L01模塊無線發(fā)送到接收端。
接收器端與Arduino Uno:
如圖所示,我們將NRF24L01連接到Arduino Uno上,這里NRF24L01模塊的SPI引腳連接到Arduino Uno板上。LCD的數(shù)據(jù)引腳和控制引腳也連接到Arduino板的數(shù)字引腳上。一個電位器連接到LCD上,以改變LCD顯示的對比度。
LCD與Arduino Uno的連接如下表所示:
nrf24l01與Arduino Uno的連接:
編程的解釋
在本教程的最后給出了NRF24L01 ESP8266接收器側和NRF24L01 Arduino Uno發(fā)射器側的完整程序。
NRF24L01發(fā)射機側:
第一步是安裝并包含我們將在這個項目中使用的所有依賴庫。
這里,我們?yōu)闊o線NRF24L01模塊使用了RF_NRF24.h頭文件??梢詮倪@里下載。同樣,在ESP8266模塊中使用WiFi功能,我們必須包含ESP8266WiFi庫。在這里,我們將找到當前的時間和日期,因此我們還需要在程序中包含時間庫。
下一步是定義NodeMCU將連接到的網(wǎng)絡的憑據(jù)。所以用write_your_ssid和write_your_pass替換你的網(wǎng)絡ssid和密碼。
程序的下一步是定義一個名為nrf24的對象,該對象定義NodeMCU的兩個連接引腳。這意味著我們已經(jīng)將NRF24L01的CE和CSN分別連接到NodeMCU的D4, D2引腳上。
在這一步中,我們配置了無線模塊初始化命令,如信道選擇,傳輸功率,數(shù)據(jù)速率,并檢查它們是否初始化完美,沒有任何錯誤。否則,它將在串行終端中解析錯誤。
然后通過調(diào)用WiFi.mode()函數(shù)將NodeMCU設置為站模式。之后我們稱之為WiFi。Begin函數(shù)使用給定的網(wǎng)絡憑據(jù)連接到網(wǎng)絡。
在時間庫中,configTime函數(shù)支持以秒為單位定義時區(qū)。以時區(qū)和夏令時值為參數(shù)。我們還將傳遞服務器名稱作為參數(shù),從中我們可以獲得當前時間,即“pool.ntp.org”和“time.nist.gov”。在印度,時區(qū)是UTC +5:30,因此我們可以把它寫成5.30*3600,也可以寫成11*1800。這里不考慮日光節(jié)約,所以取0。
在無限循環(huán)中,我們調(diào)用了time()函數(shù)來獲取當前時間,然后將其轉換為字符串變量。然后將該字符串變量轉換為二進制數(shù)組,因為NRF24L01收發(fā)器只以二進制格式傳輸數(shù)據(jù)。最后使用nrf24.send()函數(shù),我們可以將這個二進制時間數(shù)組發(fā)送到接收端。
Arduino Uno接收端:
在接收端,第一步是包含必要的庫文件,并定義Arduino板的引腳,該引腳將連接到LCD顯示器。
接下來,我們創(chuàng)建了一個新的二進制數(shù)組,其中包含該庫支持的RadioHead用戶消息的最大長度,并使用sizeof()庫計算了它的長度。
最后一步是將接收到的數(shù)據(jù)打印成16x2的LCD。但在此之前,我們已經(jīng)將其轉換為字符串,因為我們必須將完整的數(shù)據(jù)子字符串化,以明確地獲得時間和日期。為此,調(diào)用函數(shù)data.substring()。substring()方法從字符串中提取兩個指定索引之間的字符,并返回新的子字符串。
注意:不要忘記打開你的熱點和移動數(shù)據(jù)與打開電源的發(fā)射機和接收機電路。
這就是Arduino和NodeMCU使用NRF24L01模塊進行無線通信的方式。在這里,互聯(lián)網(wǎng)時間通過nRF24L01從NodeMCU發(fā)送到Arduino Uno,并顯示在接收器側的LCD上。
本文編譯自iotdesignpro