Rainbow上面預(yù)留了2.4G無(wú)線通信模塊NRF24L01的插口,將無(wú)線通信模塊插入到指定的接口中,多個(gè)Rainbow之間就可以通過2.4G無(wú)線通信模塊實(shí)現(xiàn)無(wú)線通信了,通過無(wú)線通信模塊可以實(shí)現(xiàn)無(wú)線開關(guān)控制、無(wú)線數(shù)據(jù)采集等功能。無(wú)線通信實(shí)驗(yàn)要求至少兩個(gè)Rainbow,每個(gè)上面都插有NRF24L01模塊,他們一個(gè)作為發(fā)送端、另外一個(gè)作為接收端,接收端接收到指令后,根據(jù)指令的內(nèi)容去執(zhí)行相應(yīng)的操作。
在軟件包的“Projects\NRF24L01-Send”文件夾包含了無(wú)線發(fā)送端的程序、“Projects\NRF24L01-Recv”文件夾包含了無(wú)線接收端的程序,可以直接編譯、燒寫和調(diào)試。我們先來看看無(wú)線發(fā)送端的程序代碼:
#include "WProgram.h"
#include "24l01.h"
void setup()
{
//初始化Rainbow
boardInit();
//初始化默認(rèn)串口
Serial.begin();
//初始化無(wú)線通信模塊
NRF24L01_Init();
//設(shè)置成發(fā)射模式
NRF24L01_TX_Mode();
Serial.println("NRF24L01-Send start...");
}
void loop()
{
//定義NRF24L01發(fā)送的數(shù)據(jù)包,為32個(gè)字節(jié)長(zhǎng)度
uint8_t txData[32] = {0};
//將串口收到的輸入數(shù)據(jù)通過NRF24L01發(fā)射出去
if(Serial.available())
{
txData[0] = Serial.read();
NRF24L01_TxPacket(txData);
}
}
int main()
{
setup();
while(1) loop();
}
這個(gè)發(fā)送端的功能非常簡(jiǎn)單:從串口讀取一個(gè)字節(jié)的數(shù)據(jù),并通過NRF24L01發(fā)射出去。在程序中,我們定義了一個(gè)32個(gè)字節(jié)的數(shù)組,這是因?yàn)槲覀兎庋b的函數(shù)庫(kù),是以32個(gè)字節(jié)為單位將數(shù)據(jù)組織成一個(gè)數(shù)據(jù)包,再通過無(wú)線通信模塊發(fā)送出去。無(wú)線通信模塊的函數(shù)庫(kù)采用C的方式進(jìn)行封裝,要使用無(wú)線通信模塊,需要按照下列步驟進(jìn)行:
1、調(diào)用NRF24L01_Init()對(duì)無(wú)線通信模塊進(jìn)行初始化
2、調(diào)用NRF24L01_TX_Mode()或者NRF24L01_RX_Mode()設(shè)置無(wú)線通信模塊的模式:發(fā)送/接收
3、定義一個(gè)32byte的數(shù)組,準(zhǔn)備好發(fā)送的數(shù)據(jù),調(diào)用NRF24L01_TxPacket(txData)發(fā)送數(shù)據(jù);或者通過NRF24L01_RxPacket(txData)接收數(shù)據(jù)
我們?cè)賮砜纯唇邮斩说某绦虼a:
#include "WProgram.h"
#include "24l01.h"
void setup()
{
//初始化Rainbow
boardInit();
//初始化默認(rèn)串口
Serial.begin();
//初始化無(wú)線通信模塊
NRF24L01_Init();
//設(shè)置成接收模式
NRF24L01_RX_Mode();
//使用LED作為指示,客戶端發(fā)送0x31的時(shí)候LED發(fā)光;發(fā)送0x30的時(shí)候LED熄滅
pinMode(LED1_PIN, GPIO_Mode_Out_PP);
Serial.println("NRF24L01-Recv start...");
}
void loop()
{
//定義NRF24L01接收的數(shù)據(jù)包,為32個(gè)字節(jié)長(zhǎng)度
uint8_t rxData[32] = {0};
//接收數(shù)據(jù),返回0表示成功
if(NRF24L01_RxPacket(rxData) == 0)
{
if(rxData[0] == 0x30)
{
//LED滅
digitalWrite(LED1_PIN, HIGH);
}
else if(rxData[0] == 0x31)
{
//LED亮
digitalWrite(LED1_PIN, LOW);
}
}
}
int main()
{
setup();
while(1) loop();
}
使用無(wú)線通信模塊進(jìn)行通信的步驟前面都已經(jīng)說明了,在發(fā)送的時(shí)候雖然一個(gè)數(shù)據(jù)包是32個(gè)字節(jié),我們實(shí)際上只填充了一個(gè)字節(jié)的數(shù)據(jù),因此在接收端將根據(jù)第一個(gè)字節(jié)的內(nèi)容來執(zhí)行響應(yīng)的動(dòng)作:當(dāng)接收到‘1’就點(diǎn)亮LED;當(dāng)接收到‘0’就關(guān)閉LED。
將無(wú)線發(fā)送端、接收端的程序分別編譯無(wú)誤后,燒寫到不同的Rainbow中,將接收端放到離發(fā)送端有一定距離的地方,然后將發(fā)送端通過USB-TTL模塊接入到PC,在PC上打開串口調(diào)試工具,通過串口調(diào)試工具發(fā)送一個(gè)1,此時(shí)接收端的LED點(diǎn)亮;如果接收端的LED處于點(diǎn)亮狀態(tài),在串口工具中給無(wú)線發(fā)送端輸送一個(gè)0,此時(shí)LED熄滅。