1 介绍

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

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

2 开发准备

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

2.1硬件、软件准备

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

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

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

2.2 接线方式
JY901与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的IIC读取JY901角度传感器的数据相关推荐

  1. 用arduino uno的串口读取JY61角度传感器的角速度、加速度、角度数据MPU6050

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

  2. ESP32用Arduino硬件IIC读取SHT30温湿度计的数据

    网上有不少ESP32用硬件IIC读取SHT30温湿度计的数据的文章,大多缺少解释,不太看得明白,我通过波形查看标注了一下说明,有不对的地方望帮助指出,谢谢 直接上代码吧: #include <W ...

  3. Arduino笔记-Arduino UNO与WeMos D1串口通信(数据交互)

    原理图是这样的: 设备A代表Arduino UNO设备B代表WeMos D1. 实际连接图如下: 程序运行截图如下: 这个是Arduino上的串口打印,前面那个S表示Arduino发送字符S,当接收到 ...

  4. 模拟IIC读取SHT30温湿度传感器数据

    文章目录 1 i2c.c 2 i2c.h 3 crc.c 4 crc.h 1 i2c.c /*** @brief SHT30温湿度传感器相关,使用模拟IIC进行数据的读取*/#include < ...

  5. stm32读取目标芯片_STM32通过IIC读取MPU6050陀螺仪芯片数据核心程序

    1  简 介 最近,想学角度融合算法在网上买一个JY61的模块.他们家的模块用起来还不错.模块分为串口通讯和IIC通讯的.串口读取数据他们家有例程,我就不说了.想分享给大家这个模块的IIC是怎么去读取 ...

  6. Mixly第三方用户库开发Arduino UNO使用EMW3080连接阿里云

    文章目录 前言 一.实验准备 1.硬件准备 2.软件准备 二.实验过程 1.Mixly库说明 2.文件编写 2.1.编写xxx.xml文件 2.2.编写block/xxx.js文件 2.3.编写zh- ...

  7. arduino uno传输信号到服务器,使用ESP8266 / Arduino Uno从服务器接收数据

    我有一个Raspberry Pi作为WiFi热点和Arduino Uno尝试使用ESP8266模块从中获取数据. 这是我的Arduino接收器代码: #include #include #define ...

  8. 如何用Arduino UNO和DS18B20防水传感器制作一个温度计

    使用Arduino UNO和DS18B20防水温度传感器自制温度计! 在本篇文章中,我们将使用Arduino UNO开发板和DS18B20温度传感器来制作温度计.当高精度应用需要良好的响应能力时,DS ...

  9. Arduino读取JY901+GPS/北斗双模定位模块信息(提高定位精度)串口和I2C通信

    Arduino读取JY901+GPS/北斗双模定位模块信息 上一篇JY901模块连接ATK-1218-BD,GPS/北斗通过JY901上位机显示数据 采用JY901的上位机查看信息后,确定JY901, ...

最新文章

  1. usaco Prime Cryptarithm
  2. SubLime Text 3 配置SublimeREPL来交互式调试程序
  3. PM2中无法开启ES6的解决方案
  4. JVM 史上最最最完整知识总结!
  5. HNOI2019fish
  6. 直播丨Oracle 12cR2 ADG LGWR Library Cache案例分享
  7. PHP正则表达式学习(一) 模式修正符
  8. java微信昵称处理_Java微信开发昵称表情符过滤
  9. python文件打包成exe是 upx不可用、找不到py文件_简单使用Pyinstaller将Python文件打包为可执行性exe-文件夹变成exe...
  10. unity Debug.DrawLine画线
  11. 酒店管理系统数据库设计
  12. docker tomcat 的起动与访问
  13. 爬取凤凰网站财经类的新闻,函数时编程,可全部实现,由于内容量大,需要时间太长,服务器会禁止,为了防止,可以将time.sleep()设置的时间长点...
  14. perl q qq qr qw qx 区别与使用方法
  15. 获取京东 Cookie/浏览器获取 Cookie
  16. 33幅精美的拿铁图案摄影作品欣赏
  17. Key Fact as Pivot: A Two-Stage Model for Low Resource Table-to-Text Generation 论文翻译
  18. JS高级程序设计(14)
  19. logAB = logA + logB; A,B0
  20. vue生成二维码带图标

热门文章

  1. FL studio20.8最新中文版本安装下载图文教程
  2. 面向对象软件工程-学习笔记
  3. 巨准拓客CRM【工商财税】行业获客解决方案
  4. R语言之主成分回归与偏最小二乘xt8.3xt8.4
  5. Fluter基础巩固之Dart语言详解一
  6. 这没啥挑的,全新java前后端开发需掌握的框架及技术
  7. linux 搭建免费企业邮箱
  8. 连接器是什么?连接器有什么作用?
  9. git 删除远端分支
  10. 两个有序表的合并(三种方法)