基于C#实现与JY61姿态角度传感器通信
产品介绍:
此六轴模块采用高精度的陀螺加速度计 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#实现通信
代码
- using DAL;
- using Modules;
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.IO.Ports;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- namespace MCUProject
- {
- public partial class FrmMain : Form
- {
- public FrmMain()
- {
- InitializeComponent();
- this.Load += FrmMain_Load;
- }
- private void FrmMain_Load(object sender, EventArgs e)
- {
- string[] portList = SerialPort.GetPortNames();
- if (portList.Length > )
- {
- this.cmb_Port.Items.AddRange(portList);
- this.cmb_Port.SelectedIndex = ;
- }
- this.cmb_Paud.Items.AddRange(new string[] { "自定义", "", "", "", "" });
- this.cmb_Paud.SelectedIndex = ;
- }
- //创建通信对象
- JY61 objJY = new JY61();
- CommParam objParam = new CommParam();
- bool IsConnected = false;
- private const float AccelerateScale = 16.0f / 32768.0f;
- private const float AngularSpeedScale =2000.0f / 32768.0f;
- private const float AngularScale = 180.0f / 32768.0f;
- private const float TempScale = 1.0f / 340.0f;
- private const float TempOffset = 36.53f;
- private void btn_Connect_Click(object sender, EventArgs e)
- {
- try
- {
- objJY.OpenMyCom(int.Parse(this.cmb_Paud.Text.Trim()), this.cmb_Port.Text.Trim(), , Parity.None, StopBits.One);
- }
- catch (Exception ex)
- {
- IsConnected = false;
- MessageBox.Show("连接失败:" + ex.Message);
- return;
- }
- IsConnected = true;
- objJY.myShowMsg = this.ShowMsg;
- this.timer1.Enabled = true;
- }
- private void btn_DisConn_Click(object sender, EventArgs e)
- {
- objJY.CloseMyCom();
- }
- /// <summary>
- /// 数据解析
- /// </summary>
- /// <param name="b"></param>
- private void ShowMsg(byte[] b)
- {
- //数据解析过程
- if (b.Length==)
- {
- //报文的筛选和判断
- if (b[] == 0x55 && b[] == 0x51 && b[] == 0x55 && b[] == 0x52 && b[] == 0x55 && b[] == 0x53)
- {
- //正式根据协议进行解析
- //加速度解析
- objParam.AccelerateSpeedX = GetActualValue(GetByteArray(b,,), AccelerateScale, 0.0f);
- objParam.AccelerateSpeedY = GetActualValue(GetByteArray(b, , ), AccelerateScale, 0.0f);
- objParam.AccelerateSpeedZ= GetActualValue(GetByteArray(b, , ), AccelerateScale, 0.0f);
- objParam.AngularSpeedX = GetActualValue(GetByteArray(b, , ), AngularScale, 0.0f);
- objParam.AngularSpeedY = GetActualValue(GetByteArray(b, , ), AngularScale, 0.0f);
- objParam.AngularSpeedZ = GetActualValue(GetByteArray(b, , ), AngularScale, 0.0f);
- objParam.AngularX = GetActualValue(GetByteArray(b, , ), AngularScale, 0.0f);
- objParam.AngularY = GetActualValue(GetByteArray(b, , ), AngularScale, 0.0f);
- objParam.AngularZ = GetActualValue(GetByteArray(b, , ), AngularScale, 0.0f);
- objParam.Temp= GetActualValue(GetByteArray(b, , ), TempScale, TempOffset);
- }
- }
- }
- private float GetActualValue(byte[] val, float scale, float offset)
- {
- //y=kx+b
- int x = BitConverter.ToInt16(val, );
- return scale * x + offset;
- }
- /// <summary>
- /// 自定义截取字节数组
- /// </summary>
- /// <param name="byteArr"></param>
- /// <param name="start"></param>
- /// <param name="length"></param>
- /// <returns></returns>
- private byte[] GetByteArray(byte[] byteArr, int start, int length)
- {
- byte[] Res = new byte[length];
- if (byteArr != null && byteArr.Length >=start+ length)
- {
- for (int i = ; i < length; i++)
- {
- Res[i] = byteArr[i + start];
- }
- }
- return Res;
- }
- private void timer1_Tick(object sender, EventArgs e)
- {
- this.lbl_AngularSpeedX.Text = objParam.AngularSpeedX.ToString("f2") ;
- this.lbl_AngularSpeedY.Text = objParam.AngularSpeedY.ToString("f2") ;
- this.lbl_AngularSpeedZ.Text = objParam.AngularSpeedZ.ToString("f2") ;
- this.lbl_AngularX.Text = objParam.AngularX.ToString("f2") ;
- this.lbl_AngularY.Text = objParam.AngularY.ToString("f2") ;
- this.lbl_AngularZ.Text = objParam.AngularZ.ToString("f2") ;
- this.lbl_SpeedX.Text = objParam.AccelerateSpeedX.ToString("f2");
- this.lbl_SpeedY.Text = objParam.AccelerateSpeedY.ToString("f2");
- this.lbl_SpeedZ.Text = objParam.AccelerateSpeedZ.ToString("f2");
- }
- /*
- 上位机免费公开课链接:https://ke.qq.com/course/301616?taid=3872982464502320
- */
- }
- }
- using System;
- using System.Collections.Generic;
- using System.IO.Ports;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace DAL
- {
- public delegate void ShowMsgDelegate(byte[] Msg);
- public class JY61
- {
- //添加串口对象
- private SerialPort MyCom = new SerialPort();
- public ShowMsgDelegate myShowMsg;
- #region 串口的打开与关闭
- public void OpenMyCom(int iBaudRate, string iPortName, int iDataBits, Parity iParity, StopBits iStopBits)
- {
- //如果打开,先关闭
- if (MyCom.IsOpen)
- {
- MyCom.Close();
- }
- //串口对象初始化
- MyCom.BaudRate = iBaudRate;
- MyCom.PortName = iPortName;
- MyCom.DataBits = iDataBits;
- MyCom.Parity = iParity;
- MyCom.StopBits = iStopBits;
- MyCom.ReceivedBytesThreshold = ;
- MyCom.DataReceived += MyCom_DataReceived;
- MyCom.Open();
- }
- public void CloseMyCom()
- {
- if (MyCom.IsOpen)
- {
- MyCom.Close();
- }
- }
- #endregion
- #region 事件接收
- private void MyCom_DataReceived(object sender, SerialDataReceivedEventArgs e)
- {
- int byteToRead = MyCom.BytesToRead;
- if (byteToRead > )
- {
- byte[] array = new byte[byteToRead];
- MyCom.Read(array, , byteToRead);
- //数据就在Array里面
- myShowMsg(array);
- }
- }
- #endregion
- }
- }
基于C#实现与JY61姿态角度传感器通信的更多相关文章
- 【6集iCore3_ADP触摸屏驱动讲解视频】6-2 基于FSMC总线的ARM与FPGA通信
视频简介: 该视频介绍基于FSMC总线的ARM与FPGA通信 源视频包下载地址: 链接:http://pan.baidu.com/s/1slJDoQD 密码:tmw7 银杏科技优酷视频发布区: ...
- Netty学习——通过websocket编程实现基于长连接的双攻的通信
Netty学习(一)基于长连接的双攻的通信,通过websocket编程实现 效果图,客户端和服务器端建立起长连接,客户端发送请求,服务器端响应 但是目前缺少心跳,如果两个建立起来的连接,一个断网之后, ...
- python 之 网络编程(基于TCP协议的套接字通信操作)
第八章网络编程 8.1 基于TCP协议的套接字通信 服务端套接字函数 s.bind() 绑定(主机,端口号)到套接字 s.listen() 开始TCP监听 s.accept() 被动接受TCP客户的连 ...
- 什么是 socket?简述基于 tcp 协议的套接字通信流程?
Socket的英文原义是"孔"或"插座".通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄, 可以用来实现不同虚拟机或不同计 ...
- python 之 网络编程(基于UDP协议的套接字通信)
8.5 基于UDP协议的套接字通信 UDP协议:数据报协议 特点:无连接,一发对应一收,先启动哪一端都不会报错 优点:发送效率高,但有效传输的数据量最多为500bytes 缺点:不可靠:发送数据,无需 ...
- 基于KepServer实现与S7-1200PLC之间的通信
对于学习上位机开发,有一种通信方式是必须要了解的,那就是OPC是OLE for Process Control的简称,然而随着技术的不断发展,人们开始对它有了新的定义,比如Open Platform ...
- 基于TCP与UDP协议的socket通信
基于TCP与UDP协议的socket通信 C/S架构与初识socket 在开始socket介绍之前,得先知道一个Client端/服务端架构,也就是 C/S 架构,互联网中处处充满了 C/S 架构(Cl ...
- VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程
首先,在 vs2008 环境下创建 MFC 运用程序 设置项目名称为 ComTest(这个地方随意命名,根据个人习惯),点击确定后,点击下一步 出现如下界面 选择"基于对话框"模式 ...
- 基于HTML5的Web跨设备超声波通信方案
前言:Chirp在iPhone上掀起了有声传输文件的序幕,我们再也不需要彩信.蓝牙配对.IM来传送数据.它通过“叽叽喳喳”的小鸟叫声来分享数据,简单有趣,而且可以快速的实现一对多的分享. 此外支付宝曾 ...
随机推荐
- FreeMarker学习(内建函数参考)
内容参考:http://freemarker.foofun.cn/dgui_quickstart_basics.html 一.字符串内建函数 boolean: 字符串转为布尔值.字符串必须是 true ...
- 使用vagrant一键部署本地php开发环境(二)制作自己的vagrant box
在上篇的基础上 ,我们已经安装好了virtualbox和vagrant,没有安装的话,参照上篇 使用vagrant一键部署本地php开发环境(一) 1.从网易镜像或阿里等等镜像下载Centos7 ht ...
- SpringCloud(六)之 网关概念、Zuul项目搭建-(利用Zuul 实现鉴权和限流实战)
一.网关概念 1.什么是路由网关 网关是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能 提供路由请求.鉴权.监控.缓存.限流等功能.它将"1对N"问题转换成 ...
- 在Ubuntu 16.04 LTS下编译安装OpenCV 4.1.1
目录 一 安装前的准备 二 编译并安装OpenCV 4.1.1 注:原创不易,转载请务必注明原作者和出处,感谢支持! OpenCV目前(2019-8-1)的最新版本为4.1.1.本文将介绍如何在Ubu ...
- Laravel中Session的使用
以file为示例 1.Http request session方法$request->session()->put('key1','value1');echo $request->s ...
- 机器学习 - 案例 - 样本不均衡数据分析 - 信用卡诈骗 ( 标准化处理, 数据不均处理, 交叉验证, 评估, Recall值, 混淆矩阵, 阈值 )
案例背景 银行评判用户的信用考量规避信用卡诈骗 ▒ 数据 数据共有 31 个特征, 为了安全起见数据已经向了模糊化处理无法读出真实信息目标 其中数据中的 class 特征标识为是否正常用户 (0 代表 ...
- NFS PersistentVolume(8)
一.部署nfs服务端: k8s-master 节点上搭建了 NFS 服务器 (1)安装nfs服务: yum install -y nfs-utils rpcbind vim /etc/exports ...
- java.lang.RuntimeException: org.dom4j.DocumentException: 1 字节的 UTF-8 序列的字节 1 无效。
向一个XML文件写入出现异常 解决办法:使用记事本打开该XML文件,另存为,编码选择UTF-8 java.lang.RuntimeException: org.dom4j.DocumentExcept ...
- eclipse JavaEE spring,spring mvc,mybits-SSM老年人搭建记录
老求了,好多东西记不住了,再不记以后怕是记不住了. eclipse JAVAEE for web Version: Mars.2 Release (4.5.2) tomcat 7.0.29 sprin ...
- gitbook组织管理书写
1.git 强大的版本管理工作,也适合对书写内容的更新管理. 2.markdown git管理文本,所以书写要从docx格式转变成markdown. 而typora是一个比较好用markdown书写工 ...