專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> STM32 >> 瀏覽文章

2.4G無(wú)線通信:通過NRF24L01遙控LED

作者:白櫟旸   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年04月30日   【字體:

    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熄滅。
 
關(guān)閉窗口

相關(guān)文章