APM 學習8 --- RC 輸入輸出

英文原文地址:https://ardupilot.org/dev/docs/learning-ardupilot-rc-input-output.html

1, RC 輸入輸出概述

     對於任何種類的自動駕駛儀,RC 的輸入與輸出都是一個重要組成部分。根據板子硬件的不同,ArduPilot支持幾種不同類型的 RC 輸入:

  •  - PPMSum - on PX4, Pixhawk, Linux and APM2
  •  - SBUS - on PX4, Pixhawk and Linux
  •  - Spektrum/DSM - on PX4, Pixhawk and Linux
  •  - PWM - on APM1 and APM2
  •  - RC Override (MAVLink) - all boards

     可用的通道數取決於特定板的硬件。請注意,SBUS 和 Spektrum / DSM 是串行協議, SBUS是 波特率爲 100k 的反向 UART 協議,而 Spektrum / DSM 是 115200 波特 UART 協議。一些主板使用硬件 UART(例如在PX4上)實現這些功能,而另一些則通過軟件按位來實現。
     RC 輸出是 ArduPilot 一般用來控制電調或者電動機。可用輸出通道的數量取決於電路板的類型,甚至可能取決於車輛的類型和配置參數。 RC 輸出默認爲 50Hz PWM值,但可以配置爲多種更新速率。例如,直升機代碼設置其電機輸出以更高的速率(通常超過400Hz)驅動電調。

1.1, AP_HAL rc 輸入對象

       首先要了解的是 AP_HAL RCInput 對象,可以作爲 hal.rcin 使用。這提供了對當前在板上接收的通道值的低級別訪問。返回值是微秒內的 PWM 值。

       查找庫 /AP_HAL/examples/RCInput/RCInput.cpp 示例,然後在板上嘗試一下。嘗試移動發射器上的搖桿,並檢查輸出中的值是否正確更改。

void read_channels(void);
void read_channels(void)
{
    uint8_t nchannels = hal.rcin->num_channels();  // Get the numbers channels detected by RC_INPUT.
    if (nchannels == 0) {
        hal.console->printf("No channels detected\n");
        return;
    }
    if (max_channels_display == 0) {
        hal.console->printf("Channels detected: %2u\n", nchannels);
        hal.console->printf("Set max_channels_display > 0 to display channels values\n");
        return;
    }

    if (nchannels > MAX_CHANNELS) {
        nchannels = MAX_CHANNELS;
    }

    bool changed = false;
    for (uint8_t i = 0; i < nchannels; i++) {
        uint16_t v = hal.rcin->read(i);
        if (last_value[i] != v) {
            changed = true;
            last_value[i] = v;
        }
    }
    if (max_channels_display > nchannels) {
        max_channels_display = nchannels;
    }

    if (changed) {
        for (uint8_t i = 0; i < max_channels_display; i++) {
            hal.console->printf("%2u:%04u ", (unsigned)i+1, (unsigned)last_value[i]);
        }
        hal.console->printf("\n");
    }
}

1.2, AP_HAL rc 輸出對象

       AP_HAL RCOutput 對象(可作爲 hal.rcout 使用)對所有輸出通道進行低電平控制。實現的方式具體取決於電路板,並且可能涉及片上定時器或 I2C 外設的編程,或通過協處理器(例如PX4IO微控制器)的輸出。

       查看庫 /AP_HAL/examples/RCOutput/RCOutput.cpp 示例會發現, 它只是設置了所有通道,以便在幾秒鐘內將伺服從最小值到最大值, 可以將舵機連接到輸出通道,測試輸出是否有效 

1.3, The RC_Channel 對象

       上面討論的 hal.rcin 和 hal.rcout 對象是底層函數。在 ArduPilot 中處理 RC 輸入和輸出的常用方法是通過一個稱爲RC_Channel 的高級對象。該對象具有用戶可配置的每個通道的最小/最大/修剪參數,並支持輔助通道功能,輸入和輸出的縮放比例以及許多其他功能。

       查看庫/ RC_Channel /示例 /RC_Channel/RC_Channel.cpp。該示例顯示瞭如何設置 RC 通道,讀取輸入以及將輸入複製到輸出值。在您的電路板上運行該代碼,並檢查變送器輸入是否已傳遞到伺服系統。嘗試將其更改爲反向頻道,並更改頻道的最小/最大/微調, 瀏覽 RC_Channel.h 以查看可用的API函數。

2, RC_Channel 特殊輸入 / 輸出設置

       如果仔細查看 RC_Channel,會發現一些奇怪的地方。輸入端和輸出端都有很多變量。例如,rc1-> radio_trim 應用於通道1作爲輸入(指定用於計算輸入比例的修整點),以及作爲輸出,指定連接到該通道的伺服器的中點。

       這實際上是將輸入通道號與輸出通道號聯繫在一起的概念,  您可能希望將通道 1 輸入用作 “側傾輸入”,但實際上無人機將通道1 輸出用於操縱飛機的前輪。使用 RC_Channel,用戶實際上無法做到這一點,或者至少如果這樣做,最終將得到一些非常奇怪的代碼。這是 RC_Channel 最初如何開發的產物,其中在手動模式下固定翼飛機從輸入通道到輸出通道的直通是正常的。總有一天,我們可能會對其進行更改,以更合乎邏輯的方式將這兩個概念分開,但現在請注意,這很奇怪,因此當您看到奇怪的代碼來解決這個問題時,就會知道其中的緣由

3, RC_Channel 輔助對象

        與 RC_Channel 一起,庫/ RC_Channel 中還有另一個重要的類。它是 RC_Channel_aux 類,它是 RC_Channel 的子類。

        RC_Channel_aux 對象是 RC_Channel 的一種類型,但具有允許用戶指定其用途的其他屬性。例如,假設用戶希望通道 6 設置成爲攝像機支架的側傾穩定器。他們會將參數 RC6_FUNCTION 設置爲 21,這表示“方向舵”,然後另一個庫中如下所描述:

RC_Channel_aux::set_servo_out(RC_Channel_aux::k_rudder, 4500);

       並且將其 FUNCTION 參數設置爲 21 的任何通道都將移至全撓度(因爲 k_rudder 設置爲以度爲單位的角度,最大比例爲 4500)。請注意,這是一對多的安排。用戶可以根據需要將多個通道設置爲具有 FUNCTION 21,所有這些通道都將聯動,每個通道都使用自己的最小 / 最大 / 微調值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章