1. 程式人生 > >Arduino 2.4G通訊實驗 nRF24L01模組的簡單例子

Arduino 2.4G通訊實驗 nRF24L01模組的簡單例子

nRF24L01是底價的2.4G無線傳輸實現,可以用來做遙控哦。

輸出功率頻道選擇和協議的設定可以通過SPI 介面進行設定。

幾乎可以連線到各種微控制器晶片,並完成無線資料傳送工作。

極低的電流消耗:當工作在發射模式下發射功率為0dBm 時電流消耗為11.3mA ,

接收模式時為12.3mA,掉電模式和待機模式下電流消耗更低。

效能引數編輯
◆ 小體積,QFN20 4x4mm封裝
◆ 寬電壓工作範圍,1.9V~3.6V,輸入引腳可承受5V電壓輸入
◆ 工作溫度範圍,-40℃~+80℃
◆ 工作頻率範圍,2.400GHz~2.525GHz
◆ 發射功率可選擇為0dBm、-6dBm、-12dBm和-18dBm
◆ 資料傳輸速率支援1Mbps、2Mbps[1] 
◆ 低功耗設計,接收時工作電流12.3mA,0dBm功率發射時11.3mA,掉電模式時僅為900nA
◆ 126個通訊通道,6個數據通道,滿足多點通訊和調頻需要
◆ 增強型“ShockBurst”工作模式,硬體的CRC校驗和點對多點的地址控制
◆ 資料包每次可傳輸1~32Byte的資料
◆ 4線SPI通訊埠,通訊速率最高可達8Mbps,適合與各種MCU連線,程式設計簡單
◆ 可通過軟體設定工作頻率、通訊地址、傳輸速率和資料包長度
◆ MCU可通過IRQ引腳快判斷是否完成資料接收和資料傳送

問題反饋

解決方法一:

有不少網友反饋接受端只顯示0和1

由於我自己沒有試過出現這問題,也不知道怎麼回事,但總結了一下其中一網友的解決辦法,供大家參考

解決方法二:

有網友再提供了一個解決方法,就是再

setup()函式裡新增

Mirf.cePin = 9;

Mirf.csnPin = 10;

解決方法三:

由無名網友,折騰三週,心力交瘁下解決得出得方法,感謝網友提供

主要是庫的衝突,可能mirf庫不穩定,使用nf24庫

或者在Arduino IDE 的庫管理器中搜索nrf24,作者為TMRh20

安裝庫後,有例程可參考。

再次實驗,重新使用本章的程式碼,測試通過,沒有問題。

但也會因由接線問題,硬體假貨問題,庫問題,故提供三個解決問題的方法,希望能對你有幫助,

再次感謝提供這些方法的網友。多多交流

實驗效果

BOM表

Arduino Uno *2

nRF24L01 * 2

跳線若干

針腳說明

接線方式

Arduino uno     ---     nRF24L01

3.3V                   ---       VCC

GND                  ---       GND

7                         ---      CSN

8                         ---        CE

11                       ---       MOSI 

13                       ---        SCK

12                       ---        MISO

*IRQ示例沒有用上,則不用接線了

程式開原始碼

首先下載庫檔案

把下載的檔案 Mirf資料夾 解壓到Arduino 安裝資料夾裡的 “libraries”

然後就可以使用以下程式碼:

傳送端程式 sender.ino

//發射端程式

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

int value;

void setup()
{
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
  Mirf.setRADDR((byte *)"ABCDE"); //設定自己的地址(傳送端地址),使用5個字元
  Mirf.payload = sizeof(value);
  Mirf.channel = 90;              //設定所用通道
  Mirf.config();
}

void loop()
{
  Mirf.setTADDR((byte *)"FGHIJ");           //設定接收端地址
  value = random(255);                      //0-255的隨機數
  Mirf.send((byte *)&value);                //傳送指令,傳送隨機數value
  while(Mirf.isSending()) delay(1);         //直到傳送成功,退出迴圈
  delay(1000);
}

接收端程式 Receiver.ino

//接收端程式

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

int value;

void setup()
{
  Serial.begin(9600);
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
 
  Mirf.setRADDR((byte *)"FGHIJ"); //設定自己的地址(接收端地址),使用5個字元
  Mirf.payload = sizeof(value);   
  Mirf.channel = 90;   //設定使用的通道
  Mirf.config(); 
  Serial.println("Listening...");  //開始監聽接收到的資料
}

void loop()
{
  if(Mirf.dataReady()) {  //當接收到程式,便從串列埠輸出接收到的資料
    Mirf.getData((byte *) &value);
    Serial.print("Got data: ");
    Serial.println(value);
  }
}