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);
}
}