熱門資訊> 正文
2025-06-29 15:24
本文引用地址:
1 簡介
最近想DIY一個四軸飛行器(簡易的十字形遙控飛行器),也從晚上找了很多的視頻和做了相關的簡易研究(如果搞出來了會分享,沒有經驗)。除去電機根據MPU6050的姿態計算PID進行輸出不談。還有一點比較重要的就是通訊功能。飛行器接收或者向遙控器發送指令然后執行對應的數據處理或者動作。因此考慮到多種的數據傳輸方式。如下是一個簡要的對比。通信技術通信速率(最大)通信距離(典型)通信頻段特點説明
由於之前並沒有接觸過飛行器相關的。因此我讓GPT對常見的無人機通訊方案進行了一下分析。下述表格為GPT生成的不同通訊協議對應的無人機應用的方向。
2 場景通信技術選型
所以最后選用的是NRF24L01,根據某寶店家介紹,其在空曠場地下通訊的距離可以達到1000米左右(已經是一個非常大的距離了,再遠人眼可能就不可視了)
當然國內也有很多其他系列的2.4 G模塊,比如説安信可的NF-02-PA或者NF-02-PE(使用的SI24R1 芯片)
,結合對應的庫文件的豐富程度。因此我準備了兩個不同的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)