• 專注電子技術學習與研究
    當前位置:單片機教程網 >> STM32 >> 瀏覽文章

    2.4G無線通信:通過NRF24L01遙控LED

    作者:白櫟旸   來源:本站原創   點擊數:  更新時間:2014年04月30日   【字體:

        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熄滅。
     
    關閉窗口

    相關文章

    亚洲一区二区制服在线|在绩专区欧美自拍日韩|青春娱乐网97超碰人人射|在线观看国产网址你懂的