依据imu姿态角计算z轴倾角_基于C#实现与JY61姿态角度传感器通信

c0ca93c8-87ff-ea11-8da9-e4434bdf6706.gif

产品介绍:

此六轴模块采用高精度的陀螺加速度计MPU6050,通过处理器读取MPU6050的测量数据 然后通过串口输出,免去了用户自己去开发 MPU6050 复杂的 IIC 协议,同时精心的 PCB 布局和工艺保证了 MPU6050 收到外接的干扰最小,测量的精度最高。
 模块内部自带电压稳定电路,可以兼容 3.3V/5V 的嵌入式系统,连接方便。
 采用先进的数字滤波技术,能有效降低测量噪声,提高测量精度。
 模块保留了 MPU6050 的 IIC 接口,以满足用户访问底层测量数据(加速度、角速度)的需求。
 模块内部集成了姿态解算器,配合动态卡尔曼滤波算法,能够在动态环境下准确输出 模块的当前姿态,姿态测量精度 0.05 度,稳定性极高,性能甚至优于某些专业的倾角仪!
 采用邮票孔镀金工艺,品质保证,可嵌入用户的 PCB 板中。【来自JY61中文说明书】

通信协议:

电平:TTL电平(非RS232 电平,若将模块错接到 RS232 电平可能造成模块损坏) 波特率:115200/9600,停止位 1,校验位 0。
1、 上位机至模块
指令内容 功能 备注 0xFF0xAA0x52 角度初始化 使 Z 轴角度归零 0xFF0xAA0x67 加速度计校准 校准加速度零偏 0xFF0xAA0x60 休眠及解休眠 待机模式和工作模式 0xFF0xAA0x61 使用串口,禁用 IIC 设置为串口输出 0xFF0xAA0x62 禁用串口,使用 IIC 接口 设置为 IIC 接口输出 0xFF0xAA0x63 波特率 115200,回传速率 100HZ 设置波特率为 115200 0xFF0xAA0x64 波特率 9600,回传速率 20HZ 设置波特率为 9600 0xFF0xAA0x65 水平安装 模块水平放置 0xFF0xAA0x66 垂直安装 模块垂直放置 说明:1.模块上电以后需先保持静止,模块内部的MCU会在模块静止的时候进行自动校准(消 除陀螺零漂),校准以后 Z 轴的角度会重新初始化为 0,Z 轴角度输出为 0 时,可视为自动 校准完成的信号。2.出厂默认设置使用串口时,波特率 115200,帧率 100Hz(100HZ 指的是 1 秒回传 100 个加速度、角速度、角度数据包)。配置可通过上位机软件配置,因为所有配置都是掉电 保存的,所以只需配置一次就行。
2、 模块至上位机:
模块发送至上位机每帧数据分为 3 个数据包,分别为加速度包,角速度包和角度包,3 个数据包顺序输出。波特率 115200 时每隔 10ms 输出 1 帧数据。
2.1 加速度输出:
0 0x55 包头

1 0x51 标识这个包是加速度包

2 AxL X 轴加速度低字节

3 AxH X 轴加速度高字节

4 AyL Y 轴加速度低字节

5 AyH Y 轴加速度高字节

6 AzL Z 轴加速度低字节

7 AzH Z 轴加速度高字节

8 TL 温度低字节

9 TH 温度高字节

10 Sum 校验和

加速度计算公式:ax=((AxH<<8)|AxL)/32768*16g(g为重力加速度,可取9.8m/s2) ay=((AyH<<8)|AyL)/32768*16g(g 为重力加速度,可取 9.8m/s2) az=((AzH<<8)|AzL)/32768*16g(g 为重力加速度,可取9.8m/s2)温度计算公式:T=((TH<<8)|TL)/340+36.53℃校验和: Sum=0x55+0x51+AxH+AxL+AyH+AyL+AzH+AzL+TH+TL
2.2 角速度输出:
0 0x55 包头

1 0x52 标识这个包是角速度包

2 wxL X 轴角速度低字节

3 wxH X 轴加速度高字节

4 wyL Y 轴加速度低字节

5 wyH Y 轴加速度高字节

6 wzL Z 轴加速度低字节

7 wzH Z 轴加速度高字节

8 TL 温度低字节

9 TH 温度高字节

10 Sum 校验和 角速度

计算公式:wx=((wxH<<8)|wxL)/32768*2000(°/s)wy=((wyH<<8)|wyL)/32768*2000(°/s) wz=((wzH<<8)|wzL)/32768*2000(°/s)

温度计算公式:T=((TH<<8)|TL)/340+36.53℃校验和: Sum=0x55+0x52+wxH+wxL+wyH+wyL+wzH+wzL+TH+TL
2.3 角度输出:
0 0x55 包头

1 0x53 标识这个包是角度包

2 RollL X 轴角度低字节

3 RollH X 轴角度高字节

4 PitchL Y 轴角度低字节

5 PitchH Y 轴角度高字节

6 YawL Z 轴角度低字节

7 YawH Z 轴角度高字节

8 TL 温度低字节

9 TH 温度高字节

10 Sum 校验和 角速度

计算公式:滚转角(x轴)Roll=((RollH<<8)|RollL)/32768*180(°)俯仰角(y轴)

Pitch=((PitchH<<8)|PitchL)/32768*180(°) 偏航角(z 轴)Yaw=((YawH<<8)|YawL)/32768*180(°) 温度计算公式:T=((TH<<8)|TL)/340+36.53℃校验和: Sum=0x55+0x53+RollH+RollL+PitchH+PitchL+YawH+YawL+TH+TL

基于C#实现通信

c2ca93c8-87ff-ea11-8da9-e4434bdf6706.png

代码

  1 using DAL;  2 using Modules;  3 using System;  4 using System.Collections.Generic;  5 using System.ComponentModel;  6 using System.Data;  7 using System.Drawing;  8 using System.IO.Ports;  9 using System.Linq; 10 using System.Text; 11 using System.Threading.Tasks; 12 using System.Windows.Forms; 13  14 namespace MCUProject 15 { 16     public partial class FrmMain : Form 17     { 18         public FrmMain() 19         { 20             InitializeComponent(); 21             this.Load += FrmMain_Load; 22         } 23  24         private void FrmMain_Load(object sender, EventArgs e) 25         { 26             string[] portList = SerialPort.GetPortNames(); 27             if (portList.Length > 0) 28             { 29                 this.cmb_Port.Items.AddRange(portList); 30                 this.cmb_Port.SelectedIndex = 1; 31             } 32  33             this.cmb_Paud.Items.AddRange(new string[] { "自定义", "2400", "9600", "115200", "1382400" }); 34  35             this.cmb_Paud.SelectedIndex = 3; 36         } 37  38         //创建通信对象 39         JY61 objJY = new JY61(); 40  41         CommParam objParam = new CommParam(); 42  43         bool IsConnected = false; 44  45         private  const float AccelerateScale = 16.0f / 32768.0f; 46  47         private const float AngularSpeedScale =2000.0f / 32768.0f; 48  49         private const float AngularScale = 180.0f / 32768.0f; 50  51         private const float TempScale = 1.0f / 340.0f; 52  53         private const float TempOffset = 36.53f; 54  55         private void btn_Connect_Click(object sender, EventArgs e) 56         { 57             try 58             { 59                 objJY.OpenMyCom(int.Parse(this.cmb_Paud.Text.Trim()), this.cmb_Port.Text.Trim(), 8, Parity.None, StopBits.One); 60             } 61             catch (Exception ex) 62             { 63                 IsConnected = false; 64                 MessageBox.Show("连接失败:" + ex.Message); 65                 return; 66             } 67             IsConnected = true; 68             objJY.myShowMsg = this.ShowMsg; 69             this.timer1.Enabled = true; 70         } 71  72         private void btn_DisConn_Click(object sender, EventArgs e) 73         { 74             objJY.CloseMyCom(); 75         } 76  77         ///  78         /// 数据解析 79         ///  80         ///  81         private void ShowMsg(byte[] b) 82         { 83             //数据解析过程 84             if (b.Length==32) 85             { 86                 //报文的筛选和判断 87                 if (b[0] == 0x55 && b[1] == 0x51 && b[11] == 0x55 && b[12] == 0x52 && b[22] == 0x55 && b[23] == 0x53) 88                 { 89                     //正式根据协议进行解析 90  91                     //加速度解析 92                     objParam.AccelerateSpeedX = GetActualValue(GetByteArray(b,2,2), AccelerateScale, 0.0f); 93                     objParam.AccelerateSpeedY = GetActualValue(GetByteArray(b, 4, 2), AccelerateScale, 0.0f); 94                     objParam.AccelerateSpeedZ= GetActualValue(GetByteArray(b, 6, 2), AccelerateScale, 0.0f); 95  96                     objParam.AngularSpeedX = GetActualValue(GetByteArray(b, 13, 2), AngularScale, 0.0f); 97                     objParam.AngularSpeedY = GetActualValue(GetByteArray(b, 15, 2), AngularScale, 0.0f); 98                     objParam.AngularSpeedZ = GetActualValue(GetByteArray(b, 17, 2), AngularScale, 0.0f); 99 100                     objParam.AngularX = GetActualValue(GetByteArray(b, 24, 2), AngularScale, 0.0f);101                     objParam.AngularY = GetActualValue(GetByteArray(b, 26, 2), AngularScale, 0.0f);102                     objParam.AngularZ = GetActualValue(GetByteArray(b, 28, 2), AngularScale, 0.0f);103 104                     objParam.Temp= GetActualValue(GetByteArray(b, 8, 2), TempScale, TempOffset);105 106                 }107             }108         }109 110 111         private float GetActualValue(byte[] val, float scale, float offset)112         {113             //y=kx+b114             int x = BitConverter.ToInt16(val, 0);115             return scale * x + offset;116         }117 118         /// 119         /// 自定义截取字节数组120         /// 121         /// 122         /// 123         /// 124         /// 125         private byte[] GetByteArray(byte[] byteArr, int start, int length)126         {127             byte[] Res = new byte[length];128             if (byteArr != null && byteArr.Length >=start+ length)129             {130                 for (int i = 0; i < length; i++)131                 {132                     Res[i] = byteArr[i + start];133                 }134 135             }136             return Res;137         }138 139         private void timer1_Tick(object sender, EventArgs e)140         {141             this.lbl_AngularSpeedX.Text = objParam.AngularSpeedX.ToString("f2") ;142             this.lbl_AngularSpeedY.Text = objParam.AngularSpeedY.ToString("f2") ;143             this.lbl_AngularSpeedZ.Text = objParam.AngularSpeedZ.ToString("f2") ;144 145 146             this.lbl_AngularX.Text = objParam.AngularX.ToString("f2") ;147             this.lbl_AngularY.Text = objParam.AngularY.ToString("f2") ;148             this.lbl_AngularZ.Text = objParam.AngularZ.ToString("f2") ;149 150             this.lbl_SpeedX.Text = objParam.AccelerateSpeedX.ToString("f2");151             this.lbl_SpeedY.Text = objParam.AccelerateSpeedY.ToString("f2");152             this.lbl_SpeedZ.Text = objParam.AccelerateSpeedZ.ToString("f2");153         }154 155         /*156          上位机免费公开课链接:https://ke.qq.com/course/301616?taid=3872982464502320157         158          */159     }160 }

c3ca93c8-87ff-ea11-8da9-e4434bdf6706.gif

 1 using System; 2 using System.Collections.Generic; 3 using System.IO.Ports; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7  8 namespace DAL 9 {10     public delegate void ShowMsgDelegate(byte[] Msg);11     public class JY6112     {13         //添加串口对象14         private SerialPort MyCom = new SerialPort();15 16         public ShowMsgDelegate myShowMsg;17 18         #region 串口的打开与关闭19 20         public void OpenMyCom(int iBaudRate, string iPortName, int iDataBits, Parity iParity, StopBits iStopBits)21         {22             //如果打开,先关闭23             if (MyCom.IsOpen)24             {25                 MyCom.Close();26             }27 28             //串口对象初始化29             MyCom.BaudRate = iBaudRate;30             MyCom.PortName = iPortName;31             MyCom.DataBits = iDataBits;32             MyCom.Parity = iParity;33             MyCom.StopBits = iStopBits;34 35             MyCom.ReceivedBytesThreshold = 1;36             MyCom.DataReceived += MyCom_DataReceived;37 38             MyCom.Open();39 40         }41 42 43         public void CloseMyCom()44         {45             if (MyCom.IsOpen)46             {47                 MyCom.Close();48             }49         }50 51         #endregion52 53         #region 事件接收54         private void MyCom_DataReceived(object sender, SerialDataReceivedEventArgs e)55         {56             int byteToRead = MyCom.BytesToRead;57             if (byteToRead > 0)58             {59                 byte[] array = new byte[byteToRead];60                 MyCom.Read(array, 0, byteToRead);61                 //数据就在Array里面62                 myShowMsg(array);63             }64         }65 66         #endregion67 68 69 70     }71 }
c5ca93c8-87ff-ea11-8da9-e4434bdf6706.png

欢迎关注“新阁上位机编程”抖音号

不定期发布上位机实用小技巧哦

快来学习互粉呀~c8ca93c8-87ff-ea11-8da9-e4434bdf6706.png

(长按下方图片?保存到手机相册,打开抖音扫码关注哦!相信你肯定会cdca93c8-87ff-ea11-8da9-e4434bdf6706.png)

cfca93c8-87ff-ea11-8da9-e4434bdf6706.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值