查看: 2229|回复: 0

[经验] 如何利用加速度传感器识别物体运动姿态的方法

[复制链接]

该用户从未签到

发表于 2019-8-21 09:54:23 | 显示全部楼层 |阅读模式
分享到:

因为准备DIY一个载人平衡车,其中最核心的传感器就是车身的姿态角度传感器(MPU6050),用于对车身倾斜角度、倾斜趋势等做测量,所以准备先用简单的电路连接MPU6050,并写代码来获取传感器数据。

MPU6050芯片被广泛的应用到各类工业产品中,现在通过Arduino可以很方便的连接6050,并制作如平衡车、无人机等产品。

我用了一款JY-61P的模块,核心芯片还是MPU6050,模块除了能读取原始数据外,还可以通过积分算法获取当前的角位置,并且角位置经过卡尔曼滤波,可以很平稳的输出,先来看下传感器的各项参数。



JY-61P模块参数
  • 电压: 3.3V – 5V

  • 电流:< 40mA

  • 尺寸:51.3mm × 36mm × 15mm

  • 焊盘间距:上下10mil(2.54mm),左右600mil(15.24mm)

  • 测量维度:加速度3维,角速度3维,角度3维

  • 量程:加速度±16g,角速度±2000°/s,角度±180°

  • 分辨率:加速度6.1e-5g,角速度7.6e-3°/s

  • 稳定性:加速度0.01g,角速度0.05°/s

  • 测量误差:0.01°

  • 输出内容:时间、加速度、角速度、角度、端口状态,数据输出频率0.1Hz-200Hz

  • 数据接口:串口(TTL电平,波特率支持2400、4800、9600、19200、38400、57600、115200、230400、460800、921600)、IIC(最大支持高速率400K)

  • 扩展口功能:模拟输入(0~VCC)、数字输入、数字输出、PWM输出(周期1us~65535us,分辨率1us)


JY-61P模块

最后我选用了带外壳的模块-型号WT61PC,如下图:

1.jpg

其内部就是这样的一个芯片:

2.jpg

之所以选用带外壳的WT61PC,是因为一方面接线更容易,另外还具备一定的防尘作用,功能上是完全一样的。

WT61P的接口有4个引脚,分别是VCC、GND、TX、RX,如果希望使用IIC来读取数据,可以直接使用无外壳版本,因为IIC模式可以读取底层数据,但无法读取通过积分算法得到的角度值,所以这里就以串口通信的方式来说明如何连接和使用WT61P姿态传感器。

轴向说明

3.jpg

如上图所示,模块的轴向外壳上标示出来,蓝色轴为X轴,红色轴为Y轴,垂直与 模块向外为Z轴。旋转的方向按右手法则定义,即右手大拇指指向轴向,四指弯曲的方向即为绕该轴旋转的方向。X 轴角度即为绕 X 轴旋转方向的角度,Y轴角度即为绕Y轴旋转方向的角度,Z轴角度即为绕Z轴旋转方向的角度。

硬件连接

连线非常简单,VCC接Arduino的3.3V电源口,GND接GND,TX口接Arduino的RX口,JY61的RX口空置,这里的Arduino可以是UNO、NANO或其他兼容的板子,连接后,JY61就可以通过串口向Arduino传送数据了。下面通过代码来实现位置状态数据的打印。

Arduino代码

#include <Wire.h>
#include <JY901.h>

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

void loop()
{
  //加速度
  Serial.print("Acc:");Serial.print((float)JY901.stcAcc.a[0]/32768*16);Serial.print(" ");Serial.print((float)JY901.stcAcc.a[1]/32768*16);Serial.print(" ");Serial.println((float)JY901.stcAcc.a[2]/32768*16);

//角加速度
  Serial.print("Gyro:");Serial.print((float)JY901.stcGyro.w[0]/32768*2000);Serial.print(" ");Serial.print((float)JY901.stcGyro.w[1]/32768*2000);Serial.print(" ");Serial.println((float)JY901.stcGyro.w[2]/32768*2000);

//角度
  Serial.print("Angle:");Serial.print((float)JY901.stcAngle.Angle[0]/32768*180);Serial.print(" ");Serial.print((float)JY901.stcAngle.Angle[1]/32768*180);Serial.print(" ");Serial.println((float)JY901.stcAngle.Angle[2]/32768*180);

  Serial.println("");
  delay(500);
}


void serialEvent()
{
  while (Serial.available())
  {
    JY901.CopeSerialData(Serial.read()); //Call JY901 data cope function
  }
}

上述代码会打印出芯片当前的三轴方向的加速度、三轴的角加速度及三轴的角度,JY61P已经对角度做了卡尔曼滤波,所以能平稳的输出,如果你的芯片没有内置滤波,则需要通过代码实现。​

WT61P资料链接:

http://wiki.wit-motion.com/doku.php?id=%E6%95%B0%E5%AD%97%E5%80%BE%E8%A7%92%E4%BB%AA


内容来源网络,侵权联系删除


回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /5 下一条

手机版|小黑屋|与非网

GMT+8, 2024-12-19 20:45 , Processed in 0.120880 second(s), 16 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.