Sensortag 读出的磁场信息不准
最近在做sensortag的测试,需要读tag磁场的信息,但读出的数据明显不准,x轴总是1800+,倒转tag也不见读数倒转。我觉得不应该是我的app程序的问题,磁场强度换算的代码都是官网的,而且就是官方app,磁场信息也不准,为啥按一下calibrate就归零?
大家遇到过这个问题吗?数据还要经过什么换算吗?
请问用的是默认的SensorTag的代码吗?用的是TI的SensorTag的app吗?
我的代码参考了TI的读数据这块:
if (UUID_MAG_DATA.equals(characteristic.getUuid()))
{
// int Magcode=(characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8,0) );
float x = shortSignedAtOffset(characteristic, 0) * (2000f / 65536f) * -1;
float y = shortSignedAtOffset(characteristic, 2) * (2000f / 65536f) * -1;
float z = shortSignedAtOffset(characteristic, 4) * (2000f / 65536f);
}
另外TI的app都是playstore 和Applestore下的,安卓苹果的都试了下,晃tag,读数都是有反应的,但翻转tag读数并不是变相反,那至少说明偏差比较大。另外我按上面那个得到的读数典型的一个就是1800+,40+,60+,当然晃tag会有浮动,是不是我式子代错了?
您说的是手机APP这一侧的数据处理吧?SensorTag端的软件是TI默认的程序吗?
从TI提供的SensorTag iOS的源码看,处理似乎是下面的代码
if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:[self.d.setupData valueForKey:@"Magnetometer data UUID"]]]) {
float x = [self.magSensor calcXValue:characteristic.value];
float y = [self.magSensor calcYValue:characteristic.value];
float z = [self.magSensor calcZValue:characteristic.value];
self.mag.accValueX.text = [NSString stringWithFormat:@"X: % 0.1fuT",x];
self.mag.accValueY.text = [NSString stringWithFormat:@"Y: % 0.1fuT",y];
self.mag.accValueZ.text = [NSString stringWithFormat:@"Z: % 0.1fuT",z];
self.mag.accValueX.textColor = [UIColor blackColor];
self.mag.accValueY.textColor = [UIColor blackColor];
self.mag.accValueZ.textColor = [UIColor blackColor];
self.mag.accGraphX.progress = (x / [sensorMAG3110 getRange]) + 0.5;
self.mag.accGraphY.progress = (y / [sensorMAG3110 getRange]) + 0.5;
self.mag.accGraphZ.progress = (z / [sensorMAG3110 getRange]) + 0.5;
self.currentVal.magX = x;
self.currentVal.magY = y;
self.currentVal.magZ = z;
}
从CC2541的SensorTag的源码来看则是下面的代码
bool HalMagRead(uint8 *pBuf)
{
uint8 tmp[MAG_REG_READ_ALL_LEN];
bool f;
HalMagSelect();
f = HalSensorReadReg(MAG_REG_ADDR_READ_START,tmp,MAG_REG_READ_ALL_LEN);
if (f)
{
// Swap bytes in each value-pair
pBuf[0] = tmp[1];
pBuf[1] = tmp[0];
pBuf[2] = tmp[3];
pBuf[3] = tmp[2];
pBuf[4] = tmp[5];
pBuf[5] = tmp[4];
}
sensorState = MAG3110_IDLE;
return f;
}
Sensortag端没改过,我写的是安卓的,但看ios这段代码,5段除了第一段都是写怎么显示数据的吧。。第一段我也看不出来咋算的。。。
TI的android app程序按一下magnetic数据会calibrate到全零,按说如果显示的绝对磁场强度的话不应该有这么个设置的吧?
这玩意本来就应该是有固有偏差的吧?例如外界有磁场,电路板本身也会引起。不过数值有没有你这么大,忘了
所以好象手机之类的常用什么8字校正法之类的来实现指南针校准
谢谢Fuzhong,这个问题排出了,1800+的偏差应该不是你说的这个问题,最重要的是TI官方android的app还有一个calibrate功能,让所有轴读数以当时为基准(变全零)让我怀疑是不是读数压根不是磁场强度的绝对值?