繁體
  • 简体中文
  • 繁體中文

熱門資訊> 正文

[ESP-IDF系列]使用ESP32驅動NRF24L01實現單點通訊

2025-06-29 15:24

本文引用地址:

1   簡介

最近想DIY一個四軸飛行器(簡易的十字形遙控飛行器),也從晚上找了很多的視頻和做了相關的簡易研究(如果搞出來了會分享,沒有經驗)。除去電機根據MPU6050的姿態計算PID進行輸出不談。還有一點比較重要的就是通訊功能。飛行器接收或者向遙控器發送指令然后執行對應的數據處理或者動作。因此考慮到多種的數據傳輸方式。如下是一個簡要的對比。通信技術通信速率(最大)通信距離(典型)通信頻段特點説明

由於之前並沒有接觸過飛行器相關的。因此我讓GPT對常見的無人機通訊方案進行了一下分析。下述表格為GPT生成的不同通訊協議對應的無人機應用的方向。

2   場景通信技術選型

所以最后選用的是NRF24L01,根據某寶店家介紹,其在空曠場地下通訊的距離可以達到1000米左右(已經是一個非常大的距離了,再遠人眼可能就不可視了)

上圖為經典的NRF24L01 上圖為經典的NRF24L01

當然國內也有很多其他系列的2.4 G模塊,比如説安信可的NF-02-PA或者NF-02-PE(使用的SI24R1 芯片)

ESP32 但是考慮到本次使用的是

,結合對應的庫文件的豐富程度。因此我準備了兩個不同的NRF24L01和ESP32來進行這次通訊實驗。

3   驅動步驟

主要介紹如何在IDF框架下結合組件管理器來快速實現通過組件nopnop2002/mirf來快速驅動2.4G模塊:

1.首先新建一個IDF的項目,基於HelloWorld 的項目

2.新建idf_component.yml,然后輸入下面的內容view plaincopy to clipboardprint?

1.dependencies:

2.protocol_examples_common:

3.path: ${IDF_PATH}/examples/common_components/protocol_examples_common

4.nopnop2002/mirf:

5.path: components/mirf/

6.git:https://github.com/nopnop2002/esp-idfmirf.git

3.編譯一次當前的項目,然后組件管理器會自動下載組件:

4.訪問https://github.com/nopnop2002/esp-idfmirf.git來查找對應的example

可以使用Clone到本地,或者是直接拷貝文件內容。

5.使用Menuconfi g配置2.4G模塊PIN的連接情況。

6.配置項目目錄的KConfi g,在menuconfi g中進行搜索Application Confi gurationview plaincopy to clipboardprint?

1.menu 「Application Confi guration」

2.

3.endmenu DIRECTION

4.prompt 「Communication polarity」

5.default SENDER

6.help

7.Select Communication polarity.

8.confi g SENDER

9.bool 「As the sender」

10.help

11.As the sender.

12.confi g RECEIVER

13.bool 「As the receiver」

14.help

15.As the receiver.

16.endchoice

17.

18.endmenu

將兩個ESP32分別以Sender和receiver的方式進行燒錄。

這樣的話,sender task 便會根據地址FGHIJ 進行數據發送,

view plaincopy to clipboardprint?

1.void sender(void *pvParameters)

2.{

3.ESP_LOGI(pcTaskGetName(NULL), 「Start」);

4.NRF24_t dev;

5.Nrf24_init(&dev);

6.uint8_t payload = 32;

7.uint8_t channel = CONFIG_RADIO_CHANNEL;

8.Nrf24_confi g(&dev, channel, payload);

9.

10.//Set destination address using 5 characters

11.esp_err_t ret = Nrf24_setTADDR(&dev,(uint8_t *)」FGHIJ」);

12.if (ret != ESP_OK)

13.{

14.ESP_LOGE(pcTaskGetName(NULL), 「nrf24l01 not installed」);

15.while (1)

16.{

17.vTaskDelay(1);

18.}

19.}

20.

21.#if CONFIG_ADVANCED

22.AdvancedSettings(&dev);

23.#endif // CONFIG_ADVANCED

24.

25.// Print settings

26.Nrf24_printDetails(&dev);

27.

28.uint8_t buf[32];

29.while (1)

30.{

31.TickType_t nowTick = xTaskGetTickCount();

32.sprintf((char *)buf, 「Hello World %」 PRIu32, nowTick);

33.Nrf24_send(&dev, buf);

34.// vTaskDelay(1);

35.ESP_LOGI(pcTaskGetName(NULL), 「Wait for sending.....」);

36.if (Nrf24_isSend(&dev, 1000))

37.{

38.ESP_LOGI(pcTaskGetName(NULL), 「Send success:%s」, buf);

39.}

40.else

41.{

42.ESP_LOGW(pcTaskGetName(NULL), 「Send fail:」);

43.}

44.vTaskDelay(1000 / portTICK_PERIOD_MS);

45.}

46.}

另一個receiver的task便會進行接收.

view plaincopy to clipboardprint?

1.void receiver(void *pvParameters)

2.{

3.ESP_LOGI(pcTaskGetName(NULL), 「Start」);

4.NRF24_t dev;

5.Nrf24_init(&dev);

6.uint8_t payload = 32;

7.uint8_t channel = CONFIG_RADIO_CHANNEL;

8.Nrf24_confi g(&dev, channel, payload);

9.

10.// Set my own address using 5 characters

11.esp_err_t ret = Nrf24_setRADDR(&dev,(uint8_t *)」FGHIJ」);

12.if (ret != ESP_OK)

13. {

14.ESP_LOGE(pcTaskGetName(NULL), 「nrf24l01 not installed」);

15.while (1)

16. {

17.vTaskDelay(1);

18. }

19. }

20.

21.#if CONFIG_ADVANCED

22.AdvancedSettings(&dev);

23.#endif // CONFIG_ADVANCED

24.

25.//Print settings

26.Nrf24_printDetails(&dev);

27.ESP_LOGI(pcTaskGetName(NULL), 「Listening...」);

28.

29.uint8_t buf[32];

30.

31.//Clear RX FiFo

32.while (1)

33.{

34.if (Nrf24_dataReady(&dev) == false)

35.break;

36.Nrf24_getData(&dev, buf);

37.}

38.

39.while (1)

40.{

41.//Wait for received data

42.if (Nrf24_dataReady(&dev))

43.{

44.Nrf24_getData(&dev, buf);

45.ESP_LOGI(pcTaskGetName(NULL), 「Got data:%s」, buf);

46.// ESP_LOG_BUFFER_HEXDUMP(pcTaskGetName(NULL), buf, payload, ESP_LOG_INFO);

47. }

48.vTaskDelay(1); // AvoidWatchDog alerts

49.}

50.}

4   實驗現象

5   總結

在上文中,我們主要是用nopnop2002/mirf庫快速實現和調試了2.G模塊的通訊和調試,目前來看效果還是非常不錯的,符合預期。但是對於通訊的距離和穩定性還需要進一步進行拉鋸測試。

(本文來源於《EEPW》202506

風險及免責提示:以上內容僅代表作者的個人立場和觀點,不代表華盛的任何立場,華盛亦無法證實上述內容的真實性、準確性和原創性。投資者在做出任何投資決定前,應結合自身情況,考慮投資產品的風險。必要時,請諮詢專業投資顧問的意見。華盛不提供任何投資建議,對此亦不做任何承諾和保證。