使用Arduino,我如何使用MultiWii串行协议从飞行控制器中获取陀螺仪的姿态?
答案 0 :(得分:2)
以下是基于获取陀螺态度信息,虽然它包含了一般使用MSP的一些信息。引用的示例代码可以找到here。我在其他任何地方都找不到的最重要的部分(朋友已经想出来并让我知道这个秘密)是下面的数据部分。
首先,让我们看一下MSP的工作原理。我发现this link对理解这一点非常有用,但我会在这里总结一下。 可以发送三种类型的消息。
MSP消息具有特定结构。它们按顺序有标题,大小,类型,数据和校验和。
我发现here的这个图非常有用:
标题是三个字节,包含消息起始字符“$ 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
要获取这些值,必须正确配置飞行控制器以使用MSP。我假设您已经运行了CleanFlight Configurator。
您可能希望在代码运行时使用主串行连接,因此我们将使用Soft Serial 2端口(电路板左侧的引脚7和8)。
转到“配置”标签,然后向下滚动到“其他功能”。确保“SOFTSERIAL”和“TELEMETRY”开启。保存并重新启动。
转到“端口”选项卡并将“SOFTSERIAL2”的“数据”列设置为活动状态并设置为9600(如果需要,也可以使用19200,更高的值可能无法在Arduino端运行)。保存并重新启动。
现在已正确配置飞行控制器。
要设置Arduino,只需将example code上传到Arduino即可。将Arduino上的引脚12连接到Naze板左侧的引脚7,将Arduino上的引脚11连接到Naze板左侧的引脚8上。
打开与Arduino的串行连接现在应该输出Roll,Pitch和Yaw。
尽管代码here是使用MSP_ATTITUDE的示例,但同样的理论适用于任何MSP通信。主要区别在于需要正确设置数据的命令消息(我没有考虑到具有该目的的代码),而readData函数需要根据接收的数据修改switch语句。