如何使用MSP从CleanFlight读取陀螺仪信息?

时间:2017-03-18 16:37:44

标签: arduino

使用Arduino,我如何使用MultiWii串行协议从飞行控制器中获取陀螺仪的姿态?

1 个答案:

答案 0 :(得分:2)

以下是基于获取陀螺态度信息,虽然它包含了一般使用MSP的一些信息。引用的示例代码可以找到here。我在其他任何地方都找不到的最重要的部分(朋友已经想出来并让我知道这个秘密)是下面的数据部分。

MultiWii串行协议

首先,让我们看一下MSP的工作原理。我发现this link对理解这一点非常有用,但我会在这里总结一下。 可以发送三种类型的消息。

  1. 命令 - 发送给飞行控制器的消息,其中包含一些要发送的信息。
  2. 请求 - 发送给飞行控制器的消息,要求返回一些信息。
  3. 响应 - 飞行控制器发送的消息,其中包含响应请求的信息。
  4. MSP消息具有特定结构。它们按顺序有标题,大小,类型,数据和校验和。

    我发现here的这个图非常有用: Command structure

    标题

    标题是三个字节,包含消息起始字符“$ M”和一个字符,显示消息的方向。 “<”表示去飞行控制器(命令和请求),“>”表示来自飞行控制器(响应)。

    大小

    第四个字节是数据部分的长度(以字节为单位)。例如,如果数据部分有三个INT 16变量,则大小字节为6。

    类型

    type字节指定消息中发送的信息。您可以找到类型here的列表。一个例子是MSP_ATTITUDE,其类型编号为108。

    数据

    数据是发送所有信息的地方。请求消息中没有数据。命令和响应都有,因为它们包含信息。返回的数据类型可以再次找到here

    数据部分的难点在于字节按顺序颠倒,而且记录极差。因此,例如,如果我按此顺序获得以下两个字节:

    10011010
    01001111
    

    你会认为应该成为10011010 01001111,但事实上并非如此。它实际上会成为01001111 10011010

    在示例代码中,此操作按如下方式完成:

    int16_t roll;
    byte c;                       // The current byte we read in.
    c = mspSerial.read();         // The first sent byte of the number.
    roll = c;                     // Put the first sent byte into the second byte of the int 16.
    c = mspSerial.read();         // The second sent byte of the number.
    roll <<= 8;                   // Move the first sent byte into the first byte of the int16.
    roll += c;                    // Put the second sent byte into the second byte of the int 16.
    roll = (roll & 0xFF00) >> 8 | (roll & 0x00FF) << 8; // Reverse the order of bytes in the int 16.
    

    校验

    MSP消息的最后一个字节是校验和。 “校验和是大小,类型和有效负载字节的异或”。对于请求消息,校验和等于类型。

    实施例

    “MSP_ATTITUDE”请求的示例响应消息如下:

    00100100 -- '$' - Byte 1 of the header.
    01001101 -- 'M' - Byte 2 of the header.
    00111110 -- '>' - Byte 3 of the header.
    00000110 -- '6' - The size byte.
    01101100 -- '108' - The type number corresponding to "MSP_ATTITUDE".
    11100010 -- The first sent byte of the roll INT16.
    11111111 -- The second sent byte of the roll INT16.
    00010010 -- The first sent byte of the pitch INT16.
    00000000 -- The second sent byte of the pitch INT16.
    11000010 -- The first sent byte of the yaw INT16.
    00000000 -- The second sent byte of the yaw INT16.
    10100111 -- The checksum byte.
    

    Roll将成为:11111111 11100010 = -30。 音高将变为:00000000 00010010 = 18。 偏航将成为:11000010 00000000 = 194

    如记载here所述,滚动和俯仰以1/10度为单位。所以最终的价值如下:

    Roll = -3.0
    Pitch = 1.8
    Yaw = 194
    

    设置CleanFlight

    要获取这些值,必须正确配置飞行控制器以使用MSP。我假设您已经运行了CleanFlight Configurator。

    您可能希望在代码运行时使用主串行连接,因此我们将使用Soft Serial 2端口(电路板左侧的引脚7和8)。

    转到“配置”标签,然后向下滚动到“其他功能”。确保“SOFTSERIAL”和“TELEMETRY”开启。保存并重新启动。

    转到“端口”选项卡并将“SOFTSERIAL2”的“数据”列设置为活动状态并设置为9600(如果需要,也可以使用19200,更高的值可能无法在Arduino端运行)。保存并重新启动。

    现在已正确配置飞行控制器。

    设置Arduino

    要设置Arduino,只需将example code上传到Arduino即可。将Arduino上的引脚12连接到Naze板左侧的引脚7,将Arduino上的引脚11连接到Naze板左侧的引脚8上。

    Connection

    打开与Arduino的串行连接现在应该输出Roll,Pitch和Yaw。

    Roll, Pitch and Yaw

    用于其他MSP通信

    尽管代码here是使用MSP_ATTITUDE的示例,但同样的理论适用于任何MSP通信。主要区别在于需要正确设置数据的命令消息(我没有考虑到具有该目的的代码),而readData函数需要根据接收的数据修改switch语句。