Arduino解析DSM2总线-Arduino中文社区 - Powered by Discuz! Archiver

gangguo 发表于 2021-6-28 15:47

Arduino解析DSM2总线

本帖最后由 gangguo 于 2021-6-28 15:51 编辑

DSM2是另一大航模遥控器品牌:JR PROPO及SPEKTRUM使用的一种遥控器通道串行数据总线,它的作用与FUTABA S.BUS一样。同样的,很多航模电子设备都支持DSM2数据的输入:如V-BAR陀螺仪、PIXHAWK开源飞控。
SPEKTRUM的接收机可以和JR遥控器对频使用,因此,在本次试验中,使用了JR DSX9发射机和SPEKTRUM DX6i发射机,接收机使用SPEKTRUM的AR6200携带的“卫星天线”模块,信号解析使用了Arduino mega2560板。下面进入正题。通过查阅网络资料,DSM2总线是标准的3.3V的TTL(串口)信号,波特率为115200,但对于DSM2的帧协议,小编未找到准确的资料,因此,只能自己破解了。我的思路是:先将DSM2帧尽可能完整地从mega2560板的串口1读取进来,然后从串口0输出到串口监视器进行数据记录,寻找规律。具体的方法就是,设置一个“足够长”的数组来存放这些原始数据。Mega2560串口1的缓冲区大小是64个字节,那就先设定一个长度为“64”的“char”型数组吧。试验中先接入的是SPEKTRUM的DSM2数据,数据采集过程中,不停的拨动遥控器的摇杆,串口0以“十进制”的形式向电脑发送数据,通过串口监视器观察到,在第一个有变化的字节前面有两个连在一起的字节是固定的“3”,从“3”第一次出现到下一次出现,中间间隔53个字节,由此可以推断:SPEKTRUM DSM2帧的长度应该为54,并且“帧头”为两个连续的“3”,转换为十六进制为“0x03”。接下来接入JR DSM2,和上面一样,数据采集过程中不停地拨动遥控器摇杆,通过串口监视器观察到:数据开始有变化的字节前面,始终不变的仍为两个字节,但这里变成了“3”和“18”(十进制),“3”两次出现的间隔变为了59,因此可以判断:JR DSM2帧的长度为60字节,帧头为“3”和“18”,转化为十六进制为“0x03”和“0x12”。
接下来,我们回到SPEKTRUM DSM2的原始数据,先进行SPEKTRUM DSM2的通道解析。为了观察并判断数据变化与通道的关系,我们采取的办法是,按顺序拨动通道摇杆,然后观察数据的变化。先从1通道:油门通道开始,其他通道的摇杆保持中立位置,上下拉动油门摇杆。此时可以看到,数据有变化的是帧头后面两个字节的数据,其余字节保持不变。接下来,油门摇杆保持中立,左右拨动2通道“副翼”摇杆,此时可以看到,有变化的两个字节为油门通道字节的后面两个字节。用这种方法进行6个通道的测试,可以得到数据帧的通道对应规则,如下表:用同样的方法可以测出JR DSM2的帧定义,JR DSM2与SPEKTRUM DSM2在帧定义上是有很大区别的,看下表:注意:这里的通道编号是从0开始的,即0通道实际上就是我们使用的1通道;帧字节的排序也是从“0”开始,因此最后一个字节的编号为“53”和“59”,总共54和60个字节。接下来我们先对SPEKTRUM DSM2进行通道数据解码。这里采取的方法是分别分析通道摇杆在三个特殊位置的数据格式,比如,油门摇杆在最高位置、中间位置、最低位置时,分析SPEKTRUM DSM2帧的第2、3字节数据的变化,为便于观察,我们将通道字节数据转换为二进制分析,下面给出4个通道的分析图表:
1-4通道摇杆处于“中立位置”时1-4通道摇杆处于“一侧极限位置”时:1-4通道摇杆处于“另一侧极限位置”时:现在来分析一下油门通道在三个位置的数据。通过观察我们发现:高字节的前6位(最高位第7位—第2位)始终不变,后两位(第1位及第0位)随油门杆的变化而变化;低字节始终跟随油门杆的变化而变化。我们再看看副翼通道的情况:副翼通道也具备与油门通道一样的特性,不同的是:副翼通道高字节数据的第3位和第4位为“01”,始终保持不变。其余通道也具有相同的性质,但俯仰通道的高字节的第3位和第4位为“10”,方向通道高字节的第3位和第4位为“11”,下一通道则第5位至第3位为“100”。通过进制转换(转换为十进制),我们发现这正好是通道的编号,例如油门通道:“00”—0,副翼通道:“01”—1,俯仰通道:“10”—2,方向通道:“11”—3,第4通道:“100”—4,以此类推。现在来看看剩下的数据位,以油门通道为例来分析。油门杆在中立位时,我们将高字节的最后两位与低字节数据合并,将高字节的最后两位放在前,将低字节放在后,组成一个十位的二进制数据:0111111111,将它转换为十进制得:512;再将油门杆在上和下极限位置时的数据进行组合换算可得:1101011011—859;0010111010—186。其余通道通过这样的这样的组合换算,也能得到近似的结果,但中立位时都是512。因此,可以得出结论:DSM2的通道输出为:0—1024,中点位置为512。对于JR DSM2数据,也有相同的特性,它相对于SPEKTRUM只是通道数据的位置不同。至此,DSM2总线协议“破解”完成。对比他们的帧定义,我们可以利用帧头的区别来设计程序,自动识别当前接入的DSM2总线是JR的还是SPEKTRUM的。下面给出DSM2总线解析的关键代码:uint8_t DSM2_date;
uint16_t channels;
char DSM2_flag=0;


void serialEvent2(void)
{
if(Serial2.available()>60)
{
    while(DSM2_flag==0)
    {
    DSM2_date=Serial2.read();
    if(DSM2_date==0x03)
    {DSM2_flag=1;}
    }
   
    if(DSM2_flag==1)
    {
      DSM2_date=Serial2.read();
      if(DSM2_date==0x03||DSM2_date==0x12)
         {
          DSM2_flag=2;
         
         }
   
      else
         {
          DSM2_flag=0;
         
          }
      }
      if(DSM2_flag==2)
      {
      if(DSM2_date==0x03)
      {
      for(int i=2;i<54;i++)
      {
          DSM2_date=Serial2.read();
          }
      }
      if( DSM2_date==0x12)
         {
      for(int i=2;i<60;i++)
      {
          DSM2_date=Serial2.read();
          }
      }
      
      }
    DSM2_flag=0;   
    }
   
}
void channels_update()
{
if( DSM2_date==0x03)
{
channels=((DSM2_date&0x03)<<8)|DSM2_date;
channels=((DSM2_date&0x03)<<8)|DSM2_date;
channels=((DSM2_date&0x03)<<8)|DSM2_date;
channels=((DSM2_date&0x03)<<8)|DSM2_date;
channels=((DSM2_date&0x03)<<8)|DSM2_date;
channels=((DSM2_date&0x03)<<8)|DSM2_date;
channels=((DSM2_date&0x03)<<8)|DSM2_date;
   }
if( DSM2_date==0x12)
{
channels=((DSM2_date&0x03)<<8)|DSM2_date;
channels=((DSM2_date&0x03)<<8)|DSM2_date;
channels=((DSM2_date&0x03)<<8)|DSM2_date;
channels=((DSM2_date&0x03)<<8)|DSM2_date;
channels=((DSM2_date&0x03)<<8)|DSM2_date;
channels=((DSM2_date&0x03)<<8)|DSM2_date;
channels=((DSM2_date&0x03)<<8)|DSM2_date;
}

}

void channels_display()
{
    Serial.print(channels);
   Serial.print("");
   Serial.print(channels);
   Serial.print("");
   Serial.print(channels);
   Serial.print("");
   Serial.print(channels);
   Serial.print("");
   Serial.print(channels);
   Serial.print("");
   Serial.print(channels);
   Serial.print("");
   Serial.println(channels);

}

void setup() {
   Serial.begin(115200);
Serial2.begin(115200);

}

void loop() {
channels_update();
channels_display();

}

g1ydrk 发表于 2021-10-29 15:44

https://590233ee4fbb3.cdn.sohucs.com/auto/1-autobd85f2a34ca5461f9b5044404dc2ac11
https://590233ee4fbb3.cdn.sohucs.com/auto/1-auto9930c708011347be8f7a4f9527d164e8
https://590233ee4fbb3.cdn.sohucs.com/auto/1-autobf723e08c6754056a9473cbda3f1e1e3
https://590233ee4fbb3.cdn.sohucs.com/auto/1-auto276783b342a3420da3da84f520b7e2d0
https://590233ee4fbb3.cdn.sohucs.com/auto/1-autoe7c28fe2a5154ef88b57debbc56d1399
https://590233ee4fbb3.cdn.sohucs.com/auto/1-auto9ca24e1f2c1244ea91612dd95e3e736c
https://590233ee4fbb3.cdn.sohucs.com/auto/1-auto0c014d453e7a460d8550a21510ebee86
https://590233ee4fbb3.cdn.sohucs.com/auto/1-auto87bbc3ad16384313b4475719f0f2afef
https://590233ee4fbb3.cdn.sohucs.com/auto/1-auto9783edabbb8e4057a6ca83628eab1025
https://590233ee4fbb3.cdn.sohucs.com/auto/1-auto994eb577f10444a3a2dddae5c852c08c
https://590233ee4fbb3.cdn.sohucs.com/auto/1-auto4e38d498e02543ae9cb6d7933410f04c
https://590233ee4fbb3.cdn.sohucs.com/auto/1-auto80a85e6b4c1c47f78083d24f430c84cc
https://590233ee4fbb3.cdn.sohucs.com/auto/1-auto559d6c313f3f424bbc7486febf7b1403
https://590233ee4fbb3.cdn.sohucs.com/auto/1-auto5d9c7e91a454431ca0ab54f046dd7f9c
https://590233ee4fbb3.cdn.sohucs.com/auto/1-auto01b7d5151e02407586476bcea9061308
https://590233ee4fbb3.cdn.sohucs.com/auto/1-auto4f763d2f9afe445885a9d56723bd6cd8
https://590233ee4fbb3.cdn.sohucs.com/auto/1-auto37443b1739cc420a85aa5cda527036a6
https://590233ee4fbb3.cdn.sohucs.com/auto/1-auto71e73d88f2d14f3093dbc78348a44c81
https://590233ee4fbb3.cdn.sohucs.com/auto/1-auto9be8a5e8d53a419f967c2121344e621e
https://590233ee4fbb3.cdn.sohucs.com/auto/1-auto69a907daa9cf4e02a17524d87eb67053
https://590233ee4fbb3.cdn.sohucs.com/auto/1-auto9811d67cda424b1589a5d18e322a9347
https://www.yxkfw.com/data/attachment/forum/202110/23/115654nu1mpp4gg4uznfa0.png
https://www.yxkfw.com/data/attachment/forum/202110/23/115700qz9u0lzztu7ls1l9.png
https://www.yxkfw.com/data/attachment/forum/202110/23/115718d3zi6800606anarz.png
https://www.yxkfw.com/data/attachment/forum/202110/23/115727r9fexf2fet0t59sf.png
https://www.yxkfw.com/data/attachment/forum/202110/23/115732l1yfgap7333gytko.png
https://www.yxkfw.com/data/attachment/forum/202110/23/115743ut3pxttk5ttsltck.png
https://www.yxkfw.com/data/attachment/forum/202110/23/133814sz6m7vaosqo7ppfv.png
https://www.yxkfw.com/data/attachment/forum/202110/23/133823arqwrq0owmartcwm.png
https://www.yxkfw.com/data/attachment/forum/202110/23/133829ldiv5755r76z467d.png
https://www.yxkfw.com/data/attachment/forum/202110/23/133841jjx2cmx95xrcy5xr.png
https://www.yxkfw.com/data/attachment/forum/202110/23/133847a747l7iin582ttfy.png
https://www.yxkfw.com/data/attachment/forum/202110/23/133853i78s8xcsic4a43a1.png
https://www.yxkfw.com/data/attachment/forum/202110/23/133857tohyjkhttykrs4d0.png
https://www.yxkfw.com/data/attachment/forum/202110/23/133858qk4bkbt4m1xnmhvx.png
https://www.yxkfw.com/data/attachment/forum/202110/23/133900tp526i2b1b6sabjm.png
https://www.yxkfw.com/data/attachment/forum/202110/23/133903cmhmwo8j0tf38unh.png
https://www.yxkfw.com/data/attachment/forum/202110/23/133911x99u95m982nf9nlu.png
https://www.yxkfw.com/data/attachment/forum/202110/23/133951r06d4ol35mw3rc3z.png
https://www.yxkfw.com/data/attachment/forum/202110/23/134028z3axp5rxbrxaxbeq.png
https://www.yxkfw.com/data/attachment/forum/202110/23/134034fzkt7tmkztssp78k.png
https://www.yxkfw.com/data/attachment/forum/202110/23/134040wjpex1kqjmeip8qz.png
http://www.nybbs.com/data/attachment/forum/202110/25/225232qk8ac4efka4ecert.png
https://www.henkuai.com/data/attachment/forum/202110/26/144826faeoo6wndineo4ss.png
https://www.ilovematlab.cn/data/attachment/forum/202110/27/104937hozb7wiyom9000pb.png
https://www.ilovematlab.cn/data/attachment/forum/202110/27/104932sfe84zsikacc6g88.png

页: [1]
查看完整版本: Arduino解析DSM2总线