STorM32 BGC 三軸雲臺學習(一) 通信協議分析

在淘寶買了個三軸雲臺,基於STorM32 BGC的,用調試軟件控制沒有問題,但是自動飛行時候也得通過程序自動控制,所以研究下官網協議,並對其進行了翻譯說明。

參考鏈接Serial Communication

Storm32板可通過串口USB、UART和藍牙進行通信。三組命令可用於串口通信:

  • 簡單指令:這個集合有一個非常簡單的命令結構,用於GUI的主要任務。
  • RC指令:這套設備的目標是遠程控制Storm32萬向節。
  • mavlink指令:這個集合是“real”mavlink。

簡單指令和RC指令有許多相似之處,都是由固件中相同代碼處理的。它們往往比mavlink命令更有效。任何一組命令都可以通過任何串口(USB、UART和藍牙)進行處理。然而,當mavlink心跳被激活時,UART只接受mavlink命令,並且藍牙可能不再使用(USB仍然接受所有命令)。

這三個命令集的每個命令都可以互換使用。命令所屬的命令集由第一個字符決定。這意味着在通信錯誤的情況下,消息解析器可能會誤解錯誤後面的字符。消息分析器在超時後重置。

爲了理解通信的所有細節,通常最好查看GUI的源代碼(包含在任何固件包中)。它是用Perl編寫的,Perl足夠原始,可以輕鬆理解代碼。

1 串口通信——簡單指令

通過串口進行通信的協議遵循以下規則:

  • 控制板根據接收到的命令發送一個或多個字符的對應數據流進行相應。
  • 控制板不會主動發送數據,它只會根據接收到的指令來進行響應而發數據。
  • 控制板會一直響應任何傳入的命令,無論是否有效。

控制板返回的任何數據流以以下字符之一結尾:

  • “o”:表示一切正常,即已識別接收的命令
  • “e”:表示發生錯誤,即接收到無效命令
  • “T”:表示已發生超時,即由多個字符組成的命令未在某個時間窗口內完成。
  • “C”:表示發生校驗和錯誤

每當傳輸數據時都會調用校驗和,例如對於“p”、“g”和“d”命令。

下面列出最重要的簡單命令。與GUI交互還需要更多的命令,可以通過查看GUI源代碼來獲得。

  • 命令t:此命令只返回字符“o”。主機可以使用它來檢查板是否仍然連接。
  • 命令v:此命令返回有關已安裝固件版本、板名和板類型的信息。數據流有校驗位並以字符“o”結束。
  • 命令g:此命令返回包含所有參數值的數據流。數據流有校驗位並以字符“o”結束。
  • 命令p:此命令設置所有參數值。命令字符“p”後面需要跟一個包含所有參數值的數據流,數據流有校驗位。它返回字符“o”。
  • 命令 d :收到命令“d”後,控制板傳輸當前的實時數據流,最後附加一個2字節的校驗位,並以一個字符’o’結束。協議完整信息可以參考鏈接獲得。
  • 命令s:這個功能基本與命令d相同,但是隻傳輸前5個數據值。

2 串口通信——RC 指令

除了上一節中描述的簡單串口指令外,Storm32控制器還能處理一些針對萬向節遠程控制的消息。這些消息具有更嚴格的數據格式,並可能提供更高級別的傳輸可靠性。傳輸的規則與前面一樣。

數據幀的一般結構是:

  • 包頭:0xFA用於信息輸入,0xFB用於信息輸出
  • 長度:有效數據包長度,即數據包的字節數,不包括起始符號、長度字節、命令字節和CRC字
  • 命令:命令字節
  • 有效數據:數據和長度根據需求確定
  • 校驗位:x25 16-bit 校驗位,不包括起始字節。

如果不需要回應的話,可以將0xfa替換爲0xf9。下面是幾種常用的控制指令

  • CMD_GETVERSION(#1) 指令:0xFA 0x00 0x01 crc-low-byte crc-high-byte
    如果發生錯誤,則接收到一個CMD_ACK消息,否則將返回得到固件版本、安裝佈局版本和此格式的板功能的消息。
    0xFB 0x06 0x00 data1-low data1-high data2-low data2-high data3-low data3-high crc-low-byte crc-high-byte
    其中data1表示固件版本,data2表示安裝佈局版本,data3表示版功能值。

  • CMD_GETVERSIONSTR(#2) 指令:0xFA 0x00 0x02 crc-low-byte crc-high-byte
    如果發生錯誤,將發出CMD_ACK消息。否則,將發出包含此格式的版本字符串,名稱字符串和電路板字符串的消息:
    0xFB 0x30 0x02 data-stream crc-low-byte crc-high-byte
    數據流包含16字節版本字符串,16字節名稱字符串和16字節板字符串。

  • CMD_GETPARAMETER(#3) 指令:0xFA 0x02 0x03 data-low-byte data-high-byte crc-low-byte crc-high-byte
    數據類型爲uint16_t,表示請求的參數編號。如果發生錯誤,將發出CMD_ACK消息。否則,將發出包含此格式的參數值的消息:
    0xFB 0x04 0x03 data1-low-byte data1-high-byte data2-low-byte data2-high-byte crc-low-byte crc-high-byte
    Data1是參數編號,data2是參數值。

  • CMD_SETPARAMETER(#4) 指令:0xFA 0x04 0x04 data1-low-byte data1-high-byte data2-low-byte data2-high-byte crc-low-byte crc-high-byte
    Data1是參數編號,data2是參數值。作爲對該命令的響應,將發出CMD_ACK消息。

  • CMD_GETDATA(#5) 指令:0xFA 0x01 0x05 type-byte crc-low-byte crc-high-byte
    Type指定所請求數據流的類型; 目前只支持類型0。如果發生錯誤,將發出CMD_ACK消息。否則,將發出包含此格式的數據流的消息:
    0xFB 0x4A 0x05 type-byte 0x00 data-stream crc-low-byte crc-high-byte
    數據流包含與’d’命令發送的數據相同的數據。

  • CMD_GETDATAFIELDS(#6) 指令:0xFA 0x02 0x06 data-low-byte data-high-byte crc-low-byte crc-high-byte
    數據類型爲uint16_t,表示一個位掩碼,用於指定應發送哪些數據。如果發生錯誤,將發出CMD_ACK消息。否則,將發出包含位掩碼字和此格式的所有請求數據的消息:
    0xFB LEN 0x06 data1-low-byte data1-high-byte data-stream crc-low-byte crc-high-byte
    Data1是位掩碼字,數據流保存數據。可以觸發以下數據位:

0x0001 = LIVEDATA_STATUS_V1 //已棄用,請勿使用
0x0002 = LIVEDATA_TIMES
0x0004 = LIVEDATA_IMU1GYRO
0x0008 = LIVEDATA_IMU1ACC
0x0010 = LIVEDATA_IMU1R
0x0020 = LIVEDATA_IMU1ANGLES
0x0040 = LIVEDATA_PIDCNTRL
0x0080 = LIVEDATA_INPUTS
0x0100 = LIVEDATA_IMU2ANGLES
0x0200 = LIVEDATA_STATUS_DISPLAY
0x0400 = LIVEDATA_STORM32LINK
0x0800 = LIVEDATA_IMUACCCONFIDENCE
0x1000 = LIVEDATA_ATTITUDE_RELATIVE
0x2000 = LIVEDATA_STATUS_V2
0x4000 = LIVEDATA_ENCODERANGLES
0x8000 = LIVEDATA_IMUACCABS
  • CMD_SETPITCH(#10) 指令:0xFA 0x02 0x0A data-low-byte data-high-byte crc-low-byte crc-high-byte
    數據類型爲uint16_t,可以採用值700 … 2300。它代表音俯仰輸入值。如果發送值0,則將重新調整俯仰軸,忽略任何其他值。作爲對該命令的響應,將發出CMD_ACK消息。

  • CMD_SETROLL(#11) 指令:0xFA 0x02 0x0B data-low-byte data-high-byte crc-low-byte crc-high-byte
    數據類型爲uint16_t,可以採用值700 … 2300。它表示滾轉輸入值。如果發送值0,則將重新定位滾動軸。忽略任何其他值。作爲對該命令的響應,將發出CMD_ACK消息。

  • CMD_SETYAW(#12) 指令:0xFA 0x02 0x0C data-low-byte data-high-byte crc-low-byte crc-high-byte
    數據類型爲uint16_t,可以採用值700 … 2300。它代表偏航輸入值。如果發送值0,則偏移軸將被重新定位。忽略任何其他值。作爲對該命令的響應,將發出CMD_ACK消息。

  • CMD_SETPANMODE(#13) 指令:0xFA 0x01 0x0D data-byte crc-low-byte crc-high-byte
    該數據的類型爲uint8_t,並且可以假設這些值:0 = off,1 = HOLDHOLDPAN,2 = HOLDHOLDHOLD,3 = PANPANPAN,4 = PANHOLDHOLD,5 = PANHOLDPAN,6 = HOLDPANPAN。作爲對該命令的響應,將發出CMD_ACK消息。

  • CMD_SETSTANDBY(#14) 指令:0xFA 0x01 0x0E data-byte crc-low-byte crc-high-byte
    數據類型爲uint8_t,可以採用以下值:0 = off,1 = on。作爲對該命令的響應,將發出CMD_ACK消息。

  • CMD_DOCAMERA(#15) 指令:0xFA 0x06 0x0F dummy-byte data-byte dummy-byte dummy-byte dummy-byte dummy-byte crc-low-byte crc-high-byte
    數據類型爲uint8_t,並且可以採用以下值:0 =關閉,1 = IRSHUTTER,2 = IRSHUTTERDELAYED,3 = IRVIDEOON,4 = IRVIDEOOFF。作爲對該命令的響應,將發出CMD_ACK消息。

  • CMD_SETSCRIPTCONTROL(#16) 指令:0xFA 0x02 0x10 data1-byte data2-byte crc-low-byte crc-high-byte
    data1和data2的類型爲uint8_t。Data1是腳本的編號,data2可以採用以下值:0 = off,1 = CASE#DEFAULT,2 = CASE#1,3 = CASE#2,4 = CASE#3。作爲對該命令的響應,將發出CMD_ACK消息。

  • CMD_SETANGLE(#17) 指令:0xFA 0x0E 0x11 float1 float2 float3 flags-byte type-byte crc-low-byte crc-high-byte
    float1,float2,float3字段各佔4個字節。它們是浮點型,對應於俯仰,滾轉和偏航角度。flags字節允許修改每個軸的角度設置的行爲。它們可以處於無限制或有限模式。在無限制模式下,相應的軸可以無限制地設置爲任何角度,繞過RcMin和RcMax設置,並且可以同時用於“相對”和“絕對”。在限制模式下,角度設置受RcMin和RcMax的影響設置,僅適用於“絕對”。標誌字節的第一位0x01對應於音高,0x02對應於滾動,0x04對應於偏航,並且當設置時,相應的軸處於受限模式。當前未使用類型字節,必須將其設置爲零。作爲對該命令的響應,將發出CMD_ACK消息。

  • CMD_SETPITCHROLLYAW(#18) 指令:0xFA 0x06 0x12 data1-low-byte data1-high-byte data2-low-byte data2-high-byte data3-low-byte data3-high-byte crc-low-byte crc-high-byte
    data1,data2和data3各自爲uint16_t類型,並且可以採用值700 … 2300。它們代表俯仰,滾轉,偏航輸入值。如果發送值0,則將重新定位相應的軸。忽略任何其他值。作爲對該命令的響應,將發出CMD_ACK消息。

  • CMD_SETPWMOUT(#19) 指令:0xFA 0x02 0x13 data-low-byte data-high-byte crc-low-byte crc-high-byte
    數據類型爲uint16_t,可以採用值700 … 2300。它代表pwm傳遞輸入值。作爲對該命令的響應,將發出CMD_ACK消息。

  • CMD_RESTOREPARAMETER(#20) 指令:0xFA 0x02 0x14 data-low-byte data-high-byte crc-low-byte crc-high-byte
    數據類型爲uint16_t並保存參數編號。此命令將參數設置爲EEPROM中的值。作爲對該命令的響應,將發出CMD_ACK消息。

  • CMD_RESTOREALLPARAMETER(#21) 指令:0xFA 0x00 0x15 crc-low-byte crc-high-byte
    該命令將所有參數設置爲存儲在EEPROM中的值。作爲對該命令的響應,將發出CMD_ACK消息。

  • CMD_SETINPUTS(#22) 指令:0xFA 0x17 0x16 data-bytes crc-low-byte crc-high-byte
    如果未配置虛擬輸入,則會覆蓋從虛擬輸入接收的數據。數據字節的格式與sbus類似:16個11位值的通道組合成22個字節,加上一個狀態字節。

  • CMD_SETHOMELOCATION(#23) 指令:0xFA 0x0E 0x17 data-bytes crc-low-byte crc-high-byte
    這將設置STorM32控制器的起始位置。

  • CMD_SETTARGETLOCATION(#24) 指令:0xFA 0x0E 0x18 data-bytes crc-low-byte crc-high-byte
    這將設置STorM32控制器應將攝像機指向的目標位置。

  • CMD_ACTIVEPANMODESETTING(#100) 指令:0xFA 0x01 0x64 data-byte crc-low-byte crc-high-byte
    數據類型爲uint8_t,是與平移模式設置相關的位字段:默認設置= 0x00,設置#1 = 0x01,設置#2 = 0x02,設置#3 = 0x03。作爲對該命令的響應,將發出CMD_ACK消息。

  • CMD_ACK(#150) 指令:0xFB 0x01 0x96 data-byte crc-low-byte crc-high-byte
    該命令由STorM32控制器發送,以確認執行收到的RC命令消息(如果消息本身不導致響應,例如get參數命令)。數據類型爲uint8_t,可以採用以下值:

0 = SERIALRCCMD_ACK_OK
1 = SERIALRCCMD_ACK_ERR_FAIL
2 = SERIALRCCMD_ACK_ERR_ACCESS_DENIED
3 = SERIALRCCMD_ACK_ERR_NOT_SUPPORTED
150 = SERIALRCCMD_ACK_ERR_TIMEOUT
151 = SERIALRCCMD_ACK_ERR_CRC 
152 = SERIALRCCMD_ACK_ERR_PAYLOADLEN
  • CMD_CONNECT(#120) 指令:
    特殊命令:用於處理ArduPilot passthrough。

  • CMD_GETDATADISPLAY(#123) 指令:
    特殊命令:用於將狀態信息發送到例如連接的OLED顯示器。

  • CMD_WIFICONNECTEDPING(#215) 指令:
    特殊命令:由連接的ESP8266 wifi模塊發送,指示wifi連接狀態。

  • CMD_STORM32LINK_V1(#217) 指令:
    特殊命令:用於從飛行控制器發送到STorM32-Link的STorM32。

  • CMD_STORM32LINK_V2(#218) 指令:
    特殊命令:用於從飛行控制器發送到STorM32-Link的STorM32。

3 串口通信——Mavlink指令

目前自己沒有Mavlink的開發經驗,這裏先空着,等需要時候再進行分析。

4 總結

基本上目前需要的功能協議都已經獲得,下一步就是根據這些協議對目標進行控制。剛開始研究三軸雲臺,歡迎討論。

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