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熄灭。