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