1 介绍

大家从标题中来看呢,大家可能会有些困惑,MPU6050只输出加速度、陀螺仪。没有角度。这个也是我今天想和大家说的。最近我做了一个倾角项目。老板基于成本考虑希望我能用MPU6050去算出来角度。说实话自己没接触这个东西,去搞的时候才知道挺难的,很地方看不懂。然后我去看过了正电原子的MPU6050的解算。但是那个角度的结果和我想要精度有点差别。无意中呢在淘宝上搜到了一个维特智能的JY61模块。这个模块的内置的就是MPU6050模块。这个商家说它的静态角度的精度为0.05度、动态0.1度。这个精度是很符合我的需求。给大家看下这个模块

这个模块体积很小巧就15×15×2mm大小。串口通讯用单片机去获取数据很简单,相比起直接去获取MPU6050简单不知道多少倍了。下面和大家说说我是怎么去用arduino uno读取JY61陀螺仪、加速度、角度的数据。

2 开发准备

讲程序之前呢,和大家简单的说说一些硬件、软件准备和JY61怎么和arduino uno接线的。

2.1硬件、软件准备

硬件:JY61模块、USB-TTL、arduino uno开发板、杜邦线。给大家上个图:

软件 :https://pan.baidu.com/s/1SEWmixu4jtUL2HH_3Hcn2g 提取码:zryo

这个是我的写的一个 示例代码大家有兴趣的可以看下:https://pan.baidu.com/s/1sXnlT89FTTs5tONLiaPihw

2.2 接线方式
JY61与arduino uno使用杜邦线连接。具体接线如下图所示:

3 程序讲解

3.1程序思路讲解
好了到大家最关心的地方了。在这里呢。我先和大家说下。我的整体思路是什么。以一个整体框架给大家做一个说明

3.2串口启动函数
作用就是开启串口。并且可以设置你想要的波特率

void setup()
{Serial.begin(9600);
}

3.3 loop函数
loop函数就是一直把处理好的数据通过Serial.print()函数输出到串口监听器

void loop()
{//print received data. Data was received in serialEvent;Serial.print("Time:20");Serial.print(JY901.stcTime.ucYear);Serial.print("-");Serial.print(JY901.stcTime.ucMonth);Serial.print("-");Serial.print(JY901.stcTime.ucDay);Serial.print(" ");Serial.print(JY901.stcTime.ucHour);Serial.print(":");Serial.print(JY901.stcTime.ucMinute);Serial.print(":");Serial.println((float)JY901.stcTime.ucSecond+(float)JY901.stcTime.usMiliSecond/1000);Serial.print("Acc:");Serial.print((float)JY901.stcAcc.a[0]/32768*16);Serial.print(" ");Serial.print((float)JY901.stcAcc.a[1]/32768*16);Serial.print(" ");Serial.println((float)JY901.stcAcc.a[2]/32768*16);Serial.print("Gyro:");Serial.print((float)JY901.stcGyro.w[0]/32768*2000);Serial.print(" ");Serial.print((float)JY901.stcGyro.w[1]/32768*2000);Serial.print(" ");Serial.println((float)JY901.stcGyro.w[2]/32768*2000);Serial.print("Angle:");Serial.print((float)JY901.stcAngle.Angle[0]/32768*180);Serial.print(" ");Serial.print((float)JY901.stcAngle.Angle[1]/32768*180);Serial.print(" ");Serial.println((float)JY901.stcAngle.Angle[2]/32768*180);Serial.print("Mag:");Serial.print(JY901.stcMag.h[0]);Serial.print(" ");Serial.print(JY901.stcMag.h[1]);Serial.print(" ");Serial.println(JY901.stcMag.h[2]);Serial.print("Pressure:");Serial.print(JY901.stcPress.lPressure);Serial.print(" ");Serial.println((float)JY901.stcPress.lAltitude/100);Serial.print("DStatus:");Serial.print(JY901.stcDStatus.sDStatus[0]);Serial.print(" ");Serial.print(JY901.stcDStatus.sDStatus[1]);Serial.print(" ");Serial.print(JY901.stcDStatus.sDStatus[2]);Serial.print(" ");Serial.println(JY901.stcDStatus.sDStatus[3]);Serial.print("Longitude:");Serial.print(JY901.stcLonLat.lLon/10000000);Serial.print("Deg");Serial.print((double)(JY901.stcLonLat.lLon % 10000000)/1e5);Serial.print("m Lattitude:");Serial.print(JY901.stcLonLat.lLat/10000000);Serial.print("Deg");Serial.print((double)(JY901.stcLonLat.lLat % 10000000)/1e5);Serial.println("m");Serial.print("GPSHeight:");Serial.print((float)JY901.stcGPSV.sGPSHeight/10);Serial.print("m GPSYaw:");Serial.print((float)JY901.stcGPSV.sGPSYaw/10);Serial.print("Deg GPSV:");Serial.print((float)JY901.stcGPSV.lGPSVelocity/1000);Serial.println("km/h");Serial.println("");delay(500);
}

3.4 串口读取函数
serialEvent就是相当于串口服务函数。Serial.available()这个函数是指:判断串口缓冲器的状态函数,用以判断数据是否送达串口。注意使用时通常用delay(100)以保证串口字符接收完毕,即保证Serial.available()返回的是缓冲区准确的可读字节数。Serial.read()是指:读取串口数据,一次读一个字符,读完后删除已读数据。。然后把读取的数据传给CopeSerialData()数据缓存函数。

void serialEvent()
{while (Serial.available()) {delay(100);JY901.CopeSerialData(Serial.read()); //Call JY901 data cope function}
}

3.5数据缓存函数

void CJY901 ::CopeSerialData(unsigned char ucData)
{static unsigned char ucRxBuffer[250];static unsigned char ucRxCnt = 0;    ucRxBuffer[ucRxCnt++]=ucData;if (ucRxBuffer[0]!=0x55) {ucRxCnt=0;return;}if (ucRxCnt<11) {return;}else{switch(ucRxBuffer[1]){case 0x50: memcpy(&stcTime,&ucRxBuffer[2],8);break;case 0x51:  memcpy(&stcAcc,&ucRxBuffer[2],8);break;case 0x52:   memcpy(&stcGyro,&ucRxBuffer[2],8);break;case 0x53:  memcpy(&stcAngle,&ucRxBuffer[2],8);break;case 0x54: memcpy(&stcMag,&ucRxBuffer[2],8);break;case 0x55:   memcpy(&stcDStatus,&ucRxBuffer[2],8);break;case 0x56:   memcpy(&stcPress,&ucRxBuffer[2],8);break;case 0x57: memcpy(&stcLonLat,&ucRxBuffer[2],8);break;case 0x58:    memcpy(&stcGPSV,&ucRxBuffer[2],8);break;}ucRxCnt=0;}
}

3.6 数据解析
从数据缓存区过来的数据,根据商家的协议都是16进制的数据。因此,我还需要进一步的把数据进行处理把16进制的数据处理成10进制的数据方便阅读。怎么处理呢?还是根据商家的协议去处理的。我们就以角度为例。商家协议在下图:

从上图看呢。角度输出的格式呢是55 53 RollL RollH PitchL PitchH YawL YawH VL VH SUM。这个格式就是放在数据缓存区的格式。怎么把数据缓存区的16进制转换成10进制呢?这个还要根据商家给的公式(如下图所示)。

写成程序就是下面这样的。

(float)stcAngle.Angle[0]/32768*180,(float)stcAngle.Angle[1]/32768*180,(float)stcAngle

3.7 数据输出函数
还是以角度为例子数据输出相比较前面的就比较简单了。它的原理就是把上面解析好的数据直接通过一个函数就发出来了。

Serial.print("Angle:");Serial.print((float)JY901.stcAngle.Angle[0]/32768*180);Serial.print(" ");Serial.print((float)JY901.stcAngle.Angle[1]/32768*180);Serial.print(" ");Serial.println((float)JY901.stcAngle.Angle[2]/32768*180);

4 结果展示

打开串口监听器就可以看见数据了。波特率记得是9600哦。

用arduino uno的串口读取JY61角度传感器的角速度、加速度、角度数据MPU6050相关推荐

  1. 用arduino uno的IIC读取JY901角度传感器的数据

    1 介绍 大家从标题中来看呢,大家可能会有些困惑,MPU9250只输出加速度.陀螺仪.没有角度.这个也是我今天想和大家说的.最近我做了一个倾角项目.老板基于成本考虑希望我能用MPU9250去算出来角度 ...

  2. Arduino UNO + Proteus串口通讯仿真实验

    Arduino UNO + Proteus串口通讯仿真实验 准备工作 需要借助虚拟串口软件(Virtual Serial Port Driver),创建2个虚拟串口 具体软件下载和教程:http:// ...

  3. 用STM32读取6轴角度传感器JY61的陀螺仪、加速度、角度数据MPU6050

    文章目录 1 介绍 2 开发准备 2.1硬件.软件准备 2.2 接线方式 3 程序讲解 3.1程序思路讲解 3.2 main函数 3.3 串口1初始化 3.4 串口2初始化 3.5 串口2中断服务函数 ...

  4. SoftwareSerial库的使用——Arduino软件模拟串口通信

    除HardwareSerial外,Arduino还提供了SoftwareSerial类库,它可以将你的其他数字引脚通过程序模拟成串口通信引脚. 通常我们将Arduino UNO上自带的串口称为硬件串口 ...

  5. Arduino + RFID 读取 IC 卡 Arduino uno中获得RFID的UID 并通过串口转发RFID卡号

    RFID简介:射频识别即RFID(Radio Frequency IDentification)技术,又称无线射频识别,是一种通信技术,可通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定 ...

  6. arduino 串口读取字符串_乐创物联物联网架构之硬件层中间件Arduino模拟量

    0 前言 大家好!我叫乐创物联,我主要是做工业自动化方面和物联网方面的.了解熟悉工业自动化领域的,也开发过物联网相关的产品.我的初衷是做工业物联网的,但这个系统太过于庞大,后续也会自主去学习一下.所以 ...

  7. Arduino uno esp01s 硬串口通信

    参考资料: esp 烧录固件 和 烧录程序 esp 通信测试程序 ili9341 tft显示屏使用 零件: Arduino uno ili9341 tft esp01s usb 烧录器 最初的想法是, ...

  8. 自学Arduino UNO串口(制造光控灯)

    一.Arduino串口介绍 串口用于不同设备间互相传输数据.比如,可以在电脑上实时输入指令,Arduino 板做出相应的反应,Arduino 板正在执行的工作也能实时反应在电脑上. 二.Arduino ...

  9. Arduino Uno 搭配 RFID-RC522上手:读取卡号,写入数据、读取数据

    简介 单片机:Arduino Uno 额外库:MFRC522(可直接在库管理器下载) S50 IC卡 采用NXP MF1 IC S50制作的非接触智能卡,通常简称S50卡或Mifare 1K,符合IS ...

最新文章

  1. JavaScript——易班优课YOOC课群在线测试自动答题解决方案(一)答案获取
  2. java.lang.reflect.Method.getGenericParameterTypes()方法示例
  3. 如何在官网中下载历史版本的火狐浏览器
  4. c语言单元测验,C语言程序设计单元测验一.PDF
  5. 一台服务器装两个sql server 如何访问吗_服务器多网卡多路由策略
  6. 【SSH三框架】Hibernate基金会七:许多附属业务
  7. ERR! sharp EACCES: permission denied, mkdir ‘/root/.npm/_libvips‘......
  8. 企业网站 源码 e-mail_临汾网站制作,B2B软件哪家好
  9. 你应该知道的数仓安全
  10. 95-36-020-ChannelHandler-ChannelHandler
  11. NFS==network file system
  12. 问题四十六:怎么用ray tracing画superellipsoid
  13. 为什么有那么多人选择Python,真的有那么好吗?
  14. reconnecting-websocket.min.js
  15. InSAR数据处理软件简介
  16. TF卡文件系统变RAW怎样解决
  17. 短信跳转到微信关注公众号的方案
  18. deepin 作为日常办公系统
  19. Python: queue.Queue
  20. 定时器中断实验和PWM输出实验(寄存器)

热门文章

  1. 零基础学 Python 之前,你该了解这些。
  2. 【经典游戏系列】回忆杀?扒一扒那些年我们玩过的打地鼠小游戏。
  3. 群体智能算法:细菌觅食算法
  4. 微信小程序关键字搜索
  5. 什么是 make 和 makefile
  6. win10+Ubuntu16.04双系统安装及卸载
  7. 有没有java自编歌曲_简易音乐播放器制作
  8. Multisim基础 电流控制的电流源 简单示例
  9. 微信公众号网页授权域名和JS接口安全域名配置攻略
  10. python判断是否为中文、中文符号、英文、英文符号