Arduino串口获取陀螺仪(角度传感器)ATK-IMU901M6轴数据

该文章已生成可运行项目,

产品介绍

ATK IMU 901是新西兰威森公司(Hemisphere)生产的一款先进的惯导组合导航系统(strapdown INS)硬件平台。它集成了三轴陀螺仪、三轴加速度计和三轴磁力计,可以提供精密的角速度、加速度和磁场测量结果。该惯导组件广泛应用于各类导航定位和稳定控制系统中。

产品图片

背面引脚图正面图

Arduino

由于该模块不同数据,串口主动上传的长度不一致,姿态上传11位(双字节十六进制)、四元数上传13位、加速度和角速度上传17位,SSCOM程序直接读取串口内容,如下:

55 55 01 06 91 22 20 FF 0A 4C D9
55 55 02 08 FC 44 5F 20 95 29 0F 5E 9E
55 55 03 0C 7D 01 EB 2F 25 2A 94 00 D7 00 99 FF A3
55 55 06 08 56 03 5B 03 59 03 5C 03 2A
55 55 01 06 92 22 20 FF 0A 4C DA
55 55 02 08 FC 44 5F 20 96 29 0F 5E 9F
55 55 03 0C 68 01 2D 30 16 2A 39 00 07 01 E5 FF E4
55 55 06 08 72 03 6D 03 58 03 6F 03 6A
55 55 01 06 91 22 20 FF 0A 4C D9
55 55 02 08 FC 44 5E 20 95 29 10 5E 9E
55 55 03 0C 4B 01 5A 30 66 2A B6 FF 1B 01 07 00 F7

所以不能直接用mpu6050的例程,要修改一下。传感器手册同样也描述了传感器模块的帧格式的差异。

上传姿态角数据
姿态角为11个十六进制数据
四元数为13个十六进制数据

加速度和角速度为17个十六进制数据
因此程序书写时,需要将不同长度数据区分开。

话不多说,直接上代码

/*
  This code is used for connecting arduino to serial ATK-IMU901 module, and test in arduino uno R3 board.
  connect map:
  arduino   ATK901 module
  VCC    5v/3.3v
  TX     RX<-0
  TX     TX->1
  GND    GND
*/
unsigned char Re_buf[16], counter = 0;
unsigned char sign = 0;
float acc[3], Roll, Pitch, Yaw, Q[4], w[3];
void setup() {
  Serial.begin(115200);
}

void loop() {
  if (sign)
  {
    sign = 0;
    if (Re_buf[0] == 0x55)   //检查帧头
    {
      switch (Re_buf [2])
      {
        case 0x01:
          Roll  = (short(Re_buf [5] << 8 | Re_buf [4])) / 32768.0 * 180;
          Pitch = (float(Re_buf [7] << 8 | Re_buf [6])) / 32768.0 * 180;
          Yaw   = (float(Re_buf [9] << 8 | Re_buf [8])) / 32768.0 * 180;
          //          Serial.print("Angle:");
          Serial.print(Roll); Serial.print(" ");
          Serial.print(Pitch); Serial.print(" ");
          Serial.print(Yaw); Serial.println(" ");
          break;
        case 0x02:
          Q[0]  = (float(Re_buf [5] << 8 | Re_buf [4])) / 32768.0;
          Q[1]  = (float(Re_buf [7] << 8 | Re_buf [6])) / 32768.0;
          Q[2]  = (float(Re_buf [9] << 8 | Re_buf [8])) / 32768.0;
          Q[3]  = (float(Re_buf [11] << 8 | Re_buf [10])) / 32768.0;
          //          Serial.print("Quarternion:");
          Serial.print(Q[0]); Serial.print(" ");
          Serial.print(Q[1]); Serial.print(" ");
          Serial.print(Q[2]); Serial.print(" ");
          Serial.print(Q[3]); Serial.println(" ");
          break;
        case 0x03:
          acc[0] = (float(Re_buf [5] << 8 | Re_buf [4])) / 32768.0 * 2 * 9.8;  // 2 为设置的1G单位刻度
          acc[1] = (float(Re_buf [7] << 8 | Re_buf [6])) / 32768.0 * 2 * 9.8;
          acc[2] = (float(Re_buf [9] << 8 | Re_buf [8])) / 32768.0 * 2 * 9.8;
          w[0]   = (float(Re_buf [11] << 8 | Re_buf [10])) / 32768.0 * 90;
          w[1]   = (float(Re_buf [13] << 8 | Re_buf [12])) / 32768.0 * 90;
          w[2]   = (float(Re_buf [15] << 8 | Re_buf [14])) / 32768.0 * 90;
          //          Serial.print("Accelerate:");
          Serial.print(acc[0]); Serial.print(" ");
          Serial.print(acc[1]); Serial.print(" ");
          Serial.print(acc[2]); Serial.println(" ");
          //          Serial.print("Gravity:");
          Serial.print(w[0]); Serial.print(" ");
          Serial.print(w[1]); Serial.print(" ");
          Serial.print(w[2]); Serial.println(" ");
          break;
      }
    }
  }
}

void serialEvent() {
  while (Serial.available()) {
    Re_buf[counter] = (unsigned char)Serial.read();
    if (sizeof(Re_buf) < 11)  // 判断接收缓冲区数据量是否充足
      return;
    if (counter == 0 && Re_buf[0] != 0x55)  // 第0号数据不是帧头
      return;
    counter++;
    switch (Re_buf [2])      // 根据数据帧类型判断
    {
      case 0x01:
        if (counter == 10) {
          counter = 0;      // 重新赋值,准备下一帧数据的接收
          sign = 1;
        }
        break;
      case 0x02:
        if (counter == 12) {
          counter = 0;
          sign = 1;
        }
        break;
      case 0x03:
        if (counter == 16) {
          counter = 0;
          sign = 1;
        }
        break;
      default:      // 增加其他类型数据帧的判断
        break;
    }
    if (counter > 16 && sign == 0)
    {
      counter = 0;   // 清除计数器,重新开始接收新的数据帧
    }
  }
}

输出的数据可以和ATK-IMU的上位机数据作对比。
上位机测试程序

查看陀螺仪所有数据
由于该陀螺仪为6轴信号,所以只显示加速度、角速度、角度和四元数(端口数据我未读取)。磁场、气压需9轴版本方可支持。

链接: 角度传感器模块ATK-IMU901

本文章已经生成可运行项目
<think>好的,我需要帮助用户测试ATK-MS901M模块通过Arduino串口监视器。首先,我得回顾一下用户提供的引用内容,看看有没有相关的代码示例或步骤。引用3提到了使用SoftwareSerial库与GPS模块通信,这可能适用,因为ATK-MS901M可能也是通过串口通信的。用户需要的是连接模块并查看数据,所以硬件连接和软件配置是关键。 首先,硬件连接部分。用户需要确定模块的TX和RX引脚,通常模块的TX接Arduino的RX(例如引脚18),RX接Arduino的TX(例如引脚17),如引用3中的例子。同时,供电部分需要正确,可能使用3.3V或5V,要看模块的规格。不过用户没有提到模块的具体电压要求,可能需要假设是5V,但需要提醒用户确认,避免损坏模块。 软件方面,用户需要使用SoftwareSerial库来创建软串口,避免占用主串口,这样主串口可以用于监视器输出。参考引用3中的代码,初始化软串口,设置正确的波特率。例如,如果模块的波特率是9600或38400,用户需要根据模块手册调整。然后,在loop函数中读取软串口数据并发送到主串口显示。 用户可能需要检查ATK-MS901M的通信协议和数据格式,是否发送NMEA语句或其他格式的数据。引用1和引用3提到处理GPVTG等语句,可能需要类似的解析,但用户目前只需要在串口监视器显示原始数据,所以直接转发即可。 可能的问题包括波特率不匹配、接线错误、或软串口引脚选择不当。需要提醒用户确保波特率一致,接线正确,并且软串口的引脚支持。例如,Arduino的某些引脚可能不支持软串口,需要参考对应开发板的文档。 另外,引用4中的代码展示了如何通过串口发送指令控制LED,这可能对用户测试有帮助,比如发送指令给模块,但用户的问题主要是接收数据。不过如果有双向通信的需求,可能需要扩展代码,但根据问题描述,目前只需接收数据。 总结步骤:连接硬件,编写代码初始化软串口,读取数据并打印到主串口,打开串口监视器查看数据。同时,提醒用户常见问题排查,如检查波特率、接线、供电等。</think>### 使用Arduino串口监视器测试ATK-MS901M模块的步骤 #### **1. 硬件连接** - **模块与Arduino接线** - ATK-MS901M的`TX`引脚 → Arduino的**软串口RX引脚**(例如D2) - ATK-MS901M的`RX`引脚 → Arduino的**软串口TX引脚**(例如D3) - `VCC`和`GND`分别接Arduino的**5V(或3.3V)**和**GND**(需根据模块电压要求选择) - *注意:若使用硬串口(如Arduino Uno的D0/D1),需避免与USB通信冲突,建议优先选择软串口[^3]。* #### **2. 编写Arduino代码** 使用`SoftwareSerial`库创建软串口,实现数据转发至主串口: ```cpp #include <SoftwareSerial.h> // 定义软串口引脚:RX=D2, TX=D3 SoftwareSerial mySerial(2, 3); void setup() { Serial.begin(9600); // 主串口波特率(与串口监视器一致) mySerial.begin(9600); // 模块默认波特率(需根据ATK-MS901M手册调整) } void loop() { if (mySerial.available()) { // 读取模块数据 char data = mySerial.read(); Serial.write(data); // 转发至串口监视器 } } ``` #### **3. 上传代码并测试** - 将代码上传至Arduino开发板。 - 打开Arduino IDE的**串口监视器**(右上角按钮)。 - 设置右下角波特率为**9600**(与代码中`Serial.begin(9600)`一致)。 - 若模块正常工作,监视器将显示原始数据(如NMEA格式的定位信息)[^1][^3]。 --- #### **常见问题排查** 1. **无数据显示** - 检查接线是否正确(TX/RX交叉连接)。 - 确认模块供电正常(用万用表测量VCC-GND电压)。 - 尝试调整波特率(如38400、115200),需与代码中`mySerial.begin()`一致。 2. **数据乱码** - 波特率不匹配:确保代码、模块、串口监视器的波特率完全相同。 - 检查软串口引脚是否支持(部分Arduino型号的特定引脚可能不支持)。 3. **优化显示格式** 如需解析特定数据(如经纬度),可参考NMEA协议提取字段(例如`$GPGGA`语句)[^1][^2]。 ---
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值