JY61P姿态传感器的调试

1 熟悉JY-61P 模块的基本参数

1、电压: 3.3V~5V
2、电流: <25mA
3、体积: 15.24mm X 15.24mm X 2mm
4、焊盘间距:上下 100mil(2.54mm),左右 600mil(15.24mm)
5、测量维度:加速度: 3 维,角速度: 3 维, 角度: 3 维, 气压:1 维(JY-901B), GPS:
3 维(接 GPS 模块)
6、量程:加速度:±2/4/8/16 g(可选) ,角速度:±250/500/1000/2000 °/s(可选), 角
度±180°。
8、稳定性:加速度: 0.01g,角速度 0.05°/s。
9、姿态测量稳定度: 0.01°。
10、数据输出内容:时间、加速度、角速度、角度、磁场、端口状态、气压( JY-61PB)、
高度(JY-61PB)、经纬度(需连接 GPS)、地速(需连接 GPS)。
10、数据输出频率 0.1Hz~200Hz。
11、数据接口:串口(TTL 电平, 波特率支持 2400、 4800、 9600、 19200、 38400、 57600、
115200、 230400、 460800、 921600), I2C(最大支持高速 IIC 速率 400K)
12、扩展口功能:模拟输入(0~VCC)、数字输入、数字输出、 PWM 输出(周期 1us-65535us,
分辨率 1us)

2引脚说明

在这里插入图片描述

3 轴向说明

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

4 硬件连接方法

4.1 与PC连接

与计算机连接,需要 USB 转 TTL 电平的串口模块。
在这里插入图片描述

4.2 与单片机连接

在这里插入图片描述

5模块校准

注意:模块校准和配置要在上位机配置栏右下角显示在线( online)状态下进行,如下
图所示,离线说明上位机没有控制到模块。
模块使用前, 需要对模块进行校准,包括 Z 轴归 0、加计校准。

5.1 加速度校准

加计校准用于去除加速度计的零偏。传感器在出厂时都会有不同程度的零偏误差,需
要手动进行校准后,测量才会准确。
加计校准方法如下:
1.首先使模块保持水平静止,点击配置栏里的加速度,会弹出一个校准界面。
2.把自动计算选项勾上,上位机会自动计算加速度零偏值,再点击写入参数
在这里插入图片描述
点击上位机左侧“数据”可以看到角度数据如下图所示:
3.1~2 秒后模块加速度三个轴向的值会在 0 0 1 左右, X 和 Y 轴角度在 0°左右。
校准后 X Y 轴角度就跟精确了。
注意: Z 轴水平静止的时候是有 1 个 G 的重力加速度的。
在这里插入图片描述

6 程序

#include "JY901.h"
#include "string.h"

CJY901 ::CJY901 ()
{
	ucDevAddr =0x50;
}
void CJY901::StartIIC()
{
	ucDevAddr = 0x50;
	Wire.begin();
}
void CJY901::StartIIC(unsigned char ucAddr)
{
	ucDevAddr = ucAddr;
	Wire.begin();
}
void CJY901 ::CopeSerialData(unsigned char ucData)
{
	static unsigned char ucRxBuffer[250];
	static unsigned char ucRxCnt = 0;	
	
	ucRxBuffer[ucRxCnt++]=ucData;
	if (ucRxBuffer[0]!=0x55) 
	{
		ucRxCnt=0;
		return;
	}
	if (ucRxCnt<11) {return;}
	else
	{
		switch(ucRxBuffer[1])
		{
			case 0x50:	memcpy(&stcTime,&ucRxBuffer[2],8);break;
			case 0x51:	memcpy(&stcAcc,&ucRxBuffer[2],8);break;
			case 0x52:	memcpy(&stcGyro,&ucRxBuffer[2],8);break;
			case 0x53:	memcpy(&stcAngle,&ucRxBuffer[2],8);break;
			case 0x54:	memcpy(&stcMag,&ucRxBuffer[2],8);break;
			case 0x55:	memcpy(&stcDStatus,&ucRxBuffer[2],8);break;
			case 0x56:	memcpy(&stcPress,&ucRxBuffer[2],8);break;
			case 0x57:	memcpy(&stcLonLat,&ucRxBuffer[2],8);break;
			case 0x58:	memcpy(&stcGPSV,&ucRxBuffer[2],8);break;
			case 0x59:	memcpy(&stcQuater,&ucRxBuffer[2],8);break;
			case 0x5a:	memcpy(&stcSN,&ucRxBuffer[2],8);break;
		}
		ucRxCnt=0;
	}
}
void CJY901::readRegisters(unsigned char deviceAddr,unsigned char addressToRead, unsigned char bytesToRead, char * dest)
{
  Wire.beginTransmission(deviceAddr);
  Wire.write(addressToRead);
  Wire.endTransmission(false); //endTransmission but keep the connection active

  Wire.requestFrom(deviceAddr, bytesToRead); //Ask for bytes, once done, bus is released by default

  while(Wire.available() < bytesToRead); //Hang out until we get the # of bytes we expect

  for(int x = 0 ; x < bytesToRead ; x++)
    dest[x] = Wire.read();    
}
void CJY901::writeRegister(unsigned char deviceAddr,unsigned char addressToWrite,unsigned char bytesToRead, char *dataToWrite)
{
  Wire.beginTransmission(deviceAddr);
  Wire.write(addressToWrite);
  for(int i = 0 ; i < bytesToRead ; i++)
  Wire.write(dataToWrite[i]);
  Wire.endTransmission(); //Stop transmitting
}

short CJY901::ReadWord(unsigned char ucAddr)
{
	short sResult;
	readRegisters(ucDevAddr, ucAddr, 2, (char *)&sResult);
	return sResult;
}
void CJY901::WriteWord(unsigned char ucAddr,short sData)
{	
	writeRegister(ucDevAddr, ucAddr, 2, (char *)&sData);
}
void CJY901::ReadData(unsigned char ucAddr,unsigned char ucLength,char chrData[])
{
	readRegisters(ucDevAddr, ucAddr, ucLength, chrData);
}

void CJY901::GetTime()
{
	readRegisters(ucDevAddr, 0x30, 8, (char*)&stcTime);	
}
void CJY901::GetAcc()
{
	readRegisters(ucDevAddr, AX, 6, (char *)&stcAcc);
}
void CJY901::GetGyro()
{
	readRegisters(ucDevAddr, GX, 6, (char *)&stcGyro);
}

void CJY901::GetAngle()
{
	readRegisters(ucDevAddr, Roll, 6, (char *)&stcAngle);
}
void CJY901::GetMag()
{
	readRegisters(ucDevAddr, HX, 6, (char *)&stcMag);
}
void CJY901::GetPress()
{
	readRegisters(ucDevAddr, PressureL, 8, (char *)&stcPress);
}
void CJY901::GetDStatus()
{
	readRegisters(ucDevAddr, D0Status, 8, (char *)&stcDStatus);
}
void CJY901::GetLonLat()
{
	readRegisters(ucDevAddr, LonL, 8, (char *)&stcLonLat);
}
void CJY901::GetGPSV()
{
	readRegisters(ucDevAddr, GPSHeight, 8, (char *)&stcGPSV);
}
CJY901 JY901 = CJY901();

7 测试数据

点击此链接:几个测试视频加校准视频

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值