九轴陀螺仪 JY901
1.陀螺仪的轴是啥意思
三轴陀螺仪指的是可以感应Roll(翻滚角,左右倾斜)、Pitch(俯仰角,前后倾斜)和Yaw(偏航角、前行角度)的传感器。六轴陀螺仪指的是将三轴加速度传感器和三轴陀螺仪结合起来的传感器,可以额外感应空间上三个方向的加速度。而九轴传感器可以再额外测量空间三个方向的磁场强度。此外还有十轴传感器,能再测量气压高度。
为了看得更清晰,这里画出一个表格。
陀螺仪种类 | 角度 | 加速度 | 磁场 | 气压高度 |
---|---|---|---|---|
三轴 | ⚪ | |||
六轴 | ⚪ | ⚪ | ||
九轴 | ⚪ | ⚪ | ⚪ | |
十轴 | ⚪ | ⚪ | ⚪ | ⚪ |
2.市面上主要陀螺仪产品
- GY521
GY521模块用的是MPU-6050芯片。MPU-6050是一种六轴陀螺仪,可以测量角度和加速度。优点是成本较低,缺点是编程复杂,库代码量很大,对单片机Flash要求比较高,有一定的误差,总之就是不推荐。
- ATK-MPU6050
ATK-MPU6050模块和GY521模块用的芯片都是MPU6050,但是不知道为什么ATK的价格比GY521的贵了好几倍
- JY系列
除了蓝色底的MPU6050模块,我们能用到的陀螺仪基本上就是维特智能家的产品了。维特智能的模块有一个特点,就是绿色底,一看就能认出来。
价格很贵,但是精度高,编程简单(串口通讯)物有所值。
这里简单对比一下常用的几个模块
建议有钱直接上JY901S
3. JY901的使用
我们做车的主要是要用Z轴方向的偏航角,JY901能够解决偏航角的积分误差累积问题,所以JY901就比较适合我们。
3.1 上位机配置
每个项目开始前,建议先在上位机中进行加速度和磁场校准,具体看官方使用手册
为了数据的高效稳定传输,我们在上位机中配置值通讯速率(波特率)9600,回传速率20Hz,回传内容只要欧拉角。
如果只使用偏航角,最好将算法从九轴改成六轴,这会使偏航角更稳定。
配置完成后就可以写STM32代码了。(比6050方便好多)
3.2 STM32 代码编写
对于这种固定频率的数据高速传输,最好使用串口DMA,不要使用串口中断(会有莫名卡死的问题)。
在使用手册中我们可以找到角度回传的数据内容
也就是说,每次回传内容都是11位。其中,第7位和第8位是我们需要的偏航角信息。
在写STM32接收角度信息的代码时,我们首先要判断第一第二位是不是0x55和0x53因为有时候STM32会读取到错误数据,如全是0等,所以我们要过滤掉这些错误信息。然后我们直接取第七第八位进行计算即可,具体代码如下
//DMA每接收到一次数据就运行下面代码一次
if(rx_buffer[0] == 85 && rx_buffer[1] == 83)
{
angle_z = (float)((rx_buffer[7]<<8)|rx_buffer[6])/32768.0*180.0;
}
注意要写成32768.0和180.0而不是32768和180,否则计算会出大错。
好了,到现在我们就能读取到实时的偏航角信息了。但这个时候还有一个大问题,就是数据溢出。就是说,当转角增大到360时,下一个角度将会是0度。这会给我们带来很大麻烦,我们可以使用类似处理电机编码器溢出的方法来解决它。
我们定义一个总的角度变量和一个溢出计数变量,当发生向上溢出时,溢出计数变量加一,反之减一,总的角度值等于当前角度值加上溢出计数值乘以360。我们之后不要使用当前角度值,直接使用总角度值即可。
//DMA每接收到一次数据就运行下面代码一次
if(rx_buffer[0] == 85 && rx_buffer[1] == 83)
{
angle_z = (float)((rx_buffer[7]<<8)|rx_buffer[6])/32768.0*180.0;
}
if(angle_z > 300 && angle_z_last < 50) jy901_of_count--;
else if(angle_z < 50 && angle_z_last > 300) jy901_of_count++;
angle_z_all = angle_z + jy901_of_count * 360;
angle_z_last = angle_z;//保存上一次的值
好了,现在所有代码都写完了,开心使用偏航角来完成作品就好了。