1 简述
最近在学习人体姿态设别的算法。想着买个角度传感器去尝试下。这个传感器最好是无线的带电池的,这样对我来说是比较方便使用的。我就在淘宝上找到一个一款BWT901CL,这个角度传感器。这个模块挺好用的,有加速度、角速度、角度。而且都是三个轴的。精度的话呢加速度0.01g、角速度0.63°/s、角度静态是0.05、动态是0.1。精度是满足我的需求的。给大家看下模块。
2 程序设计
2.1数据处理
根据商家给的通讯协议(如下图)。写了一个接收程序。 根据这个协议就很好理解我写的数据处理程序。这个BWT901CL蓝牙输出的角度的一共是11位数据。所以,我先判断数据 的长度是不是11位,然后再判断包头是不是55。如果不是55在判断下一位是不是55。直到我找到了55这个包头,然后才进行11位数据的第二位的数据的判断,是不是50、51、52、53、54这种商家定义的代表时间、加速度、角速度、角度、磁场的数。
void CJY901
::CopeSerialData(char ucData
[],unsigned short usLength
)
{
static unsigned char chrTemp
[2000];
static unsigned char ucRxCnt
= 0;
static unsigned short usRxLength
= 0;
memcpy(chrTemp
,ucData
,usLength
);
usRxLength
+= usLength
;
while (usRxLength
>= 11)
{
if (chrTemp
[0] != 0x55)
{
usRxLength
--;
memcpy(&chrTemp
[0],&chrTemp
[1],usRxLength
);
continue;
}
switch(chrTemp
[1])
{
case 0x50: memcpy(&stcTime
,&chrTemp
[2],8);break;
case 0x51: memcpy(&stcAcc
,&chrTemp
[2],8);break;
case 0x52: memcpy(&stcGyro
,&chrTemp
[2],8);break;
case 0x53: memcpy(&stcAngle
,&chrTemp
[2],8);break;
case 0x54: memcpy(&stcH
,&chrTemp
[2],8);break;
}
usRxLength
-= 11;
memcpy(&chrTemp
[0],&chrTemp
[11],usRxLength
);
}
}
2.2 UART打印程序
int _tmain(int argc
, _TCHAR
* argv
[])
{
char chrBuffer
[2000];
unsigned short usLength
=0,usCnt
=0;
unsigned long ulBaund
=9600,ulComNo
=3;
signed char cResult
= 1;
printf("请输入串口号:\r\nCom = ");
scanf("%ld",&ulComNo
);
printf("请输入波特率:(9600、115200或其他)\r\nBaud = ");
scanf("%ld",&ulBaund
);
printf("等待打开串口%d...\r\n",ucComNo
);
while(cResult
!=0)
{
cResult
= OpenCOMDevice(ulComNo
,ulBaund
);
}
while(1)
{
usLength
= CollectUARTData(ulComNo
,chrBuffer
);
if (usLength
>0)
{
JY61
.CopeSerialData(chrBuffer
,usLength
);
}
Sleep(100);
if (usCnt
++>=0)
{
usCnt
=0;
printf("Time:20%d-%d-%d %d:%d:%.3f\r\n",(short)JY901
.stcTime
.ucYear
,(short)JY901
.stcTime
.ucMonth
,
(short)JY61
.stcTime
.ucDay
,(short)JY901
.stcTime
.ucHour
,(short)JY901
.stcTime
.ucMinute
,(float)JY901
.stcTime
.ucSecond
+(float)JY901
.stcTime
.usMiliSecond
/1000);
printf("Acc:%.3f %.3f %.3f\r\n",(float)JY901
.stcAcc
.a
[0]/32768*16,(float)JY901
.stcAcc
.a
[1]/32768*16,(float)JY901
.stcAcc
.a
[2]/32768*16);
printf("Gyro:%.3f %.3f %.3f\r\n",(float)JY901
.stcGyro
.w
[0]/32768*2000,(float)JY901
.stcGyro
.w
[1]/32768*2000,(float)JY901
.stcGyro
.w
[2]/32768*2000);
printf("Angle:%.3f %.3f %.3f\r\n",(float)JY901
.stcAngle
.Angle
[0]/32768*180,(float)JY901
.stcAngle
.Angle
[1]/32768*180,(float)JY901
.stcAngle
.Angle
[2]/32768*180);
}
}
return 0;
}
3 结果展示 链接:https://pan.baidu.com/s/1CMRtfp-c0YPSKOqC_aAFPA