CSN是一個“片選擇引腳”,即Chip Select N(N代表低電平有效),假如你想通過1個NRF24L01同多個NRF24L01進行通信的話,就需這個引腳了。一旦將想要通信的那個NRF24L01模塊的CSN引腳置0,就代表你之後所有的信息傳輸對象針對的是這個NRF24L01模塊。這就好比你是一個管理員,然後你要管理一羣聾子,咋辦呢?你喊他們名字肯定是不行的,於是你想出一個好辦法,給每一個聾子身上掛一個雙色牌,一面紅色一面綠色,假如某個聾子身上的牌子翻成紅色代表他處於被通信狀態,假如是綠色就是不通信狀態,那麼好,這一羣聾子中你只需要把任意一個人的牌子翻成紅色,其他人翻成綠色,然後這羣聾子就可以知道你到底想指揮的是哪一個人了,CSN就相當於NRF24L01的雙色牌。
CE是“模式選擇引腳”,NRF24L01作爲無線傳輸模塊,必然有“接收”和“發送”兩種狀態,那麼在決定這塊NRF24L01模塊是“接收”還是“發送”時,就是通過CE引腳來定義的。
MOSI和MISO這兩個引腳在前一篇講過了,MOSI和MISO是串口通信中信息傳輸的通道,前者用於發送端傳送信息給接收端的線,後者用於接收端反饋信息給接收端的線;通常在控制過程中MOSI用的多,但是有時候我們需要接收端反饋是否接收到信息的話也會需要MISO來傳送反饋信息。
SCK是“時鐘引腳”,這個東西存在的意思是什麼呢?我們知道NRF24L01傳送數據的時候是一幀一幀的是傳輸的,那麼好,在傳輸的時候我們總得有個節奏吧,發送端不能一會兒快一會兒慢的,否則接收端怎麼接收呢?所以我們需要設定一個打節奏的裝置,就是這個SCK時鐘。SCK會打一個固定的節奏,然後傳送端和接收端就可以按照這個固定的節奏有條不紊地收發信息了,否則接收端和發送端的節奏沒有一個統一步調的話很容易出現信息丟失或者乾脆接收不到。
發送模塊
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
void setup()
{
Serial.begin(9600);
Mirf.cePin = 9; //設置CE引腳爲D9
Mirf.csnPin = 10; //設置CE引腳爲D10
Mirf.spi = &MirfHardwareSpi;
Mirf.init(); //初始化nRF24L01
//設置接收標識符"Sen01"
Mirf.setRADDR((byte *)"Sen01");
//設置一次收發的字節數,這裏發一個整數,寫sizeof(unsigned int),實際等於2字節
Mirf.payload = sizeof(unsigned int);
//發送通道,可以填0~128,收發必須一致。
Mirf.channel = 3;
Mirf.config();
//注意一個Arduino寫Sender.ino,另一個寫Receiver.ino。
//這裏標識寫入了Sender.ino
Serial.println("I'm Sender...");
}
unsigned int adata = 0;
void loop()
{
//讀取A0值到adata
adata = analogRead(A0);
//由於nRF24L01只能以byte單字節數組形式發送Mirf.payload個數據,
//所以必須將所有需要傳輸的數據拆成byte。
//下面定義byte數組,存放待發數據,因爲Mirf.payload = sizeof(unsigned int);
//實際下面等於byte data[2];
byte data[Mirf.payload];
//adata是unsigned int雙字節數據,必須拆開。
//將adata高低八位拆分:
data[0] = adata & 0xFF; //低八位給data[0],
data[1] = adata >> 8; //高八位給data[1]。
Serial.println(adata);
//設置向"serv1"發送數據
Mirf.setTADDR((byte *)"Rec01");
Mirf.send(data);
//while死循環等待發送完畢,才能進行下一步操作。
while(Mirf.isSending()) {}
delay(20);
}
接受模塊
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
int left1 = 7;
int left2 = 6;
int right1 = 5;
int right2 = 4;
void qian()
{
digitalWrite(left1,HIGH);
digitalWrite(left2,LOW);
digitalWrite(right1,HIGH);
digitalWrite(right2,LOW);
}
//定義一個變量adata存儲最終結果,oldadata存儲舊結果,防止相同結果刷屏。
unsigned int adata = 0, oldadata = 0;
void setup()
{
Serial.begin(9600);
//---------初始化部分,不可隨時修改---------
Mirf.cePin = 9; //設置CE引腳爲D9
Mirf.csnPin = 10; //設置CE引腳爲D10
Mirf.spi = &MirfHardwareSpi;
Mirf.init(); //初始化nRF24L01
//---------配置部分,可以隨時修改---------
//設置接收標識符"Rev01"
Mirf.setRADDR((byte *)"Rec01");
//設置一次收發的字節數,這裏發一個整數,
//寫sizeof(unsigned int),實際等於2字節
Mirf.payload = sizeof(unsigned int);
//發送通道,可以填0~128,收發必須一致。
Mirf.channel = 3;
Mirf.config();
//注意一個Arduino寫Sender.ino,另一個寫Receiver.ino。
//這裏用來辨別寫入了Receiver.ino程序
Serial.println("I'm Receiver...");
}
void loop()
{
//定義一個暫存數組,大小爲Mirf.payload。
byte data[Mirf.payload];
if(Mirf.dataReady()) //等待接收數據準備好
{
Mirf.getData(data); //接收數據到data數組
//data[1]<左移8位與data[0]並,重組數據。
adata = (unsigned int)((data[1] << 8) | data[0]);
if (data <30)
{
qian();
}
//與上一次結果比較,避免相同結果刷屏,降低串口流量
if(adata != oldadata)
{
oldadata = adata; //本次結果作爲歷史結果。
//Serial.print輸出數據
Serial.print("A0=");
Serial.println(adata);
//也可以輸出雙字節數據
//Serial.write(data[1]);
//Serial.write(data[0]);
}
}
}