【雕爺學編程】Arduino動手做(112)---2.4G24L01無線模塊

37款傳感器與執行器的提法,在網絡上廣泛流傳,其實Arduino能夠兼容的傳感器模塊肯定是不止這37種的。鑒于本人手頭積累了一些傳感器和執行器模塊,依照實踐出真知(一定要動手做)的理念,以學習和交流為目的,這里準備逐一動手嘗試系列實驗,不管成功(程序走通)與否,都會記錄下來---小小的進步或是搞不掂的問題,希望能夠拋磚引玉。

【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)
實驗一百一十二: NRF24L01+ 無線模塊 功率加強版 2.4G無線收發通信模塊 黑金剛

0.jpg

NRF24L01
是由NORDIC生產的工作在2.4GHz~2.5GHz的ISM 頻段的單片無線收發器芯片。無線收發器包括:頻率發生器、增強型“SchockBurst”模式控制器、功率放大器、晶體振蕩器、調制器和解調器。輸出功率頻道選擇和協議的設置可以通過SPI 接口進行設置。幾乎可以連接到各種單片機芯片,并完成無線數據傳送工作。極低的電流消耗:當工作在發射模式下發射功率為0dBm 時電流消耗為11.3mA ,接收模式時為12.3mA,掉電模式和待機模式下電流消耗更低。

01.jpg
02 (1).jpg
02-.jpg

NRF24L01無線模塊
(1) 2.4Ghz 全球開放 ISM 頻段免許可證使用
(2) 最高工作速率 2Mbps,高效 GFSK 調制,抗干擾能力強,特別適合工業控制場合
(3) 126 頻道,滿足多點通信和跳頻通信需要
(4) 內置硬件 CRC 檢錯和點對多點通信地址控制
(5) 低功耗 1.9 - 3.6V 工作,待機模式下狀態為 22uA;掉電模式下為 900nA
(6) 內置 2.4Ghz 天線,體積種類多樣
(7) 模塊可軟件設地址,只有收到本機地址時才會輸出數據(提供中斷指示),可直接接各種單片機使用,軟件編程非常方便
(8) 內置專門穩壓電路,使用各種電源包括 DC/DC 開關電源均有很好的通信效果
(9) 2.54MM 間距接口,DIP 封裝
(10)工作于 Enhanced ShockBurst 具有 Automatic packethandling, Auto packet transaction handling,具有可選的內置包應答機制,極大的降低丟包率。
(11)與 51 系列單片機 P0 口連接時候,需要加 10K 的上拉電阻,與其余口連接不需要。
(12)其他系列的單片機,如果是 5V 的,請參考該系列單片機 IO 口輸出電流大小,如果超過 10mA,需要串聯電阻分壓,否則容易燒毀模塊! 如果是3.3V的,可以直接和RF24l01模塊的IO口線連接。比如AVR系列單片機如果是5V 的,一般串接2K 的電阻。

09.jpeg

NRF24L01無線模塊接口說明

(1) VCC 腳接電壓范圍為 1.9V~3.6V 之間,不能在這個區間之外,超過 3.6V 將會燒毀模塊。推薦電壓 3.3V 左右。

(2) 除電源 VCC 和接地端,其余腳都可以直接和普通的 5V 單片機 IO口直接相連,無需電平轉換。當然對 3V 左右的單片機更加適用了。

(3) 硬件上面沒有 SPI 的單片機也可以控制本模塊,用普通單片機 IO口模擬 SPI 不需要單片機真正的串口介入,只需要普通的單片機 IO 口就可以了,當然用串口也可以了。

08-.jpg

NRF24L01無線模塊的特點

低應用成本:NRF24L01集成了所有與RF協議相關的高速信號處理部分,比如:自動重發丟失數據包和自動產生應答信號等,NRF24L01的SPI接口可以利用單片機的硬件SPI口連接或用單片機I/O口進行模擬,內部有FIFO可以與各種高低速微處理器接口,便于使用低成本單片機。

便于開發:由于鏈路層完全集成在模塊上,非常便于開發。自動重發功能,自動檢測和重發丟失的數據包,重發時間及重發次數可軟件控制自動存儲未收到應答信號的數據包自動應答功能,在收到有效數據后,模塊自動發送應答信號,無須另行編程載波檢測—固定頻率檢測內置硬件CRC檢錯和點對多點通信地址控制數據包傳輸錯誤計數器及載波檢測功能可用于跳頻設置可同時設置六路接收通道地址,可有選擇性的打開接收通道標準插針Dip2.54MM間距接口,便于嵌入式應用。

05 (1).jpg

實驗一百一十二: NRF24L01+ 無線模塊 功率加強版 2.4G無線收發通信模塊 黑金剛
接線示意圖

10.jpg
10-.jpg

Arduino實驗開源代碼

/*
【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)
實驗一百一十二: NRF24L01+ 無線模塊 功率加強版 2.4G無線收發通信模塊 黑金剛
1、安裝“Mirf”庫(下載鏈接 https://github.com/aaronds/arduino-nrf24l01)
    安裝“rf24”庫(下載鏈接 https://github.com/nRF24/RF24)
2、項目測試 :NRF24L01最簡單測試之Client 示例代碼
3、模塊接線
Arduino uno  ---  nRF24L01
3.3V            ---  VCC:模塊供電引腳
GND            ---  GND:模塊接地引腳
D7              ---  CSN:接收端選擇引腳
D8              ---  CE:發射/接受狀態選擇引腳
D11            ---  MOSI :控制端輸出,接收端輸入引腳
D13            ---  SCK:時鐘信號
D12            ---  MISO:控制端輸入,接收端輸出引腳
*IRQ引腳在本例中不需要接
*/

#include <SPI.h>

#include <Mirf.h>

#include <nRF24L01.h>

#include <MirfHardwareSpiDriver.h>

void setup(){

  Serial.begin(9600);

  /*

  * Setup pins / SPI.

  */

  /* To change CE / CSN Pins:

  *

  * Mirf.csnPin = 9;

  * Mirf.cePin = 7;

  */

  /*

  Mirf.cePin = 7;

  Mirf.csnPin = 8;

  */

  Mirf.spi = &MirfHardwareSpi;

  Mirf.init();

  /*

  * Configure reciving address.

  */

  Mirf.setRADDR((byte *)"clie1");

  /*

  * Set the payload length to sizeof(unsigned long) the

  * return type of millis().

  *

  * NB: payload on client and server must be the same.

  */

  Mirf.payload = sizeof(unsigned long);

  /*

  * Write channel and payload config then power up reciver.

  */

  /*

  * To change channel:

  *

  * Mirf.channel = 10;

  *

  * NB: Make sure channel is legal in your area.

  */

  Mirf.config();

  Serial.println("Beginning ... ");

}

void loop(){

  unsigned long time = millis();

  Mirf.setTADDR((byte *)"serv1");

  Mirf.send((byte *)&time);

  while(Mirf.isSending()){

  }

  Serial.println("Finished sending");

  delay(10);

  while(!Mirf.dataReady()){

  //Serial.println("Waiting");

  if ( ( millis() - time ) > 1000 ) {

    Serial.println("Timeout on response from server!");

    return;

  }

  }

  Mirf.getData((byte *) &time);

  Serial.print("Ping: ");

  Serial.println((millis() - time));

  delay(1000);

}

實驗串口返回情況


12.jpg

Arduino實驗開源代碼之二

/*

【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)

實驗一百一十二: NRF24L01+ 無線模塊 功率加強版 2.4G無線收發通信模塊 黑金剛

1、安裝“Mirf”庫(下載鏈接 https://github.com/aaronds/arduino-nrf24l01)

    安裝“rf24”庫(下載鏈接 https://github.com/nRF24/RF24)

2、項目測試 :NRF24L01最簡單測試之Server示例代碼

3、模塊接線

Arduino uno  ---  nRF24L01

3.3V            ---  VCC:模塊供電引腳

GND            ---  GND:模塊接地引腳

D7              ---  CSN:接收端選擇引腳

D8              ---  CE:發射/接受狀態選擇引腳

D11            ---  MOSI :控制端輸出,接收端輸入引腳

D13            ---  SCK:時鐘信號

D12            ---  MISO:控制端輸入,接收端輸出引腳

*IRQ引腳在本例中不需要接

*/



#include <SPI.h>

#include <Mirf.h>

#include <nRF24L01.h>

#include <MirfHardwareSpiDriver.h>

void setup(){

  Serial.begin(9600);

  /*

  * Set the SPI Driver.

  */

  Mirf.spi = &MirfHardwareSpi;

  /*

  * Setup pins / SPI.

  */

  Mirf.init();

  /*

  * Configure reciving address.

  */

  Mirf.setRADDR((byte *)"serv1");

  /*

  * Set the payload length to sizeof(unsigned long) the

  * return type of millis().

  *

  * NB: payload on client and server must be the same.

  */

  Mirf.payload = sizeof(unsigned long);

  /*

  * Write channel and payload config then power up reciver.

  */

  Mirf.config();

  Serial.println("Listening...");

}

void loop(){

  /*

  * A buffer to store the data.

  */

  byte data[Mirf.payload];

  /*

  * If a packet has been recived.

  *

  * isSending also restores listening mode when it

  * transitions from true to false.

  */

  if(!Mirf.isSending() && Mirf.dataReady()){

  Serial.println("Got packet");

  /*

    * Get load the packet into the buffer.

    */

  Mirf.getData(data);

  /*

    * Set the send address.

    */

  Mirf.setTADDR((byte *)"clie1");

  /*

    * Send the data back to the client.

    */

  Mirf.send(data);

  /*

    * Wait untill sending has finished

    *

    * NB: isSending returns the chip to receving after returning true.

    */

  Serial.println("Reply sent.");

  }

}


實驗串口返回情況

13.jpg

實驗場景圖

14.jpg

實驗開源仿真編程(Linkboy V4.62)

15.jpg
16.jpg
17.jpg
18.jpg
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容