【雕爷学编程】Arduino动手做(142)---GY-25串口倾斜度模块

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

 

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百四十二:GY-25 串口直接输出角度数据 倾斜度角度传感器模块 MPU-6050

 

知识点:MPU-6050(6000)芯片

为全球首例整合性6轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速器时间轴之差的问题,减少了大量的封装空间。当连接到三轴磁强计时,MPU-60X0提供完整的9轴运动融合输出到其主I2C或SPI端口(SPI仅在MPU-6000上可用)。MPU-6050(6000)的角速度全格感测范围为±250、±500、±1000与±2000°/sec (dps),可准确追踪快速与慢速动作,并且,用户可程式控制的加速器全格感测范围为±2g、±4g±8g与±16g。产品传输可透过最高至400kHz的IIC或最高达20MHz的SPI(MPU-6050没有SPI)。MPU-6000可在不同电压下工作,VDD供电电压介为2.5V±5%、3.0V±5%或3.3V±5%,逻辑接口VDDIO供电为1.8V± 5%(MPU6000仅用VDD)。MPU-6000的包装尺寸4x4x0.9mm(QFN),在业界是革命性的尺寸。其他的特征包含内建的温度感测器、包含在运作环境中仅有±1%变动的振荡器。

陀螺仪传感器
是一个简单易用的基于自由空间移动和手势的定位和控制系统,它原本是运用到直升机模型上,现已被广泛运用于手机等移动便携设备。对于不熟悉这类产品的人来说,陀螺仪传感器是一个简单易用的基于自由空间移动和手势的定位和控制系统。在假想的平面上挥动鼠标,屏幕上的光标就会跟着移动,并可以绕着链接画圈和点击按键。当你正在演讲或离开桌子时,这些操作都能够很方便地实现。 陀螺仪传感器原本是运用到直升机模型上的,已经被广泛运用于手机这类移动便携设备上(IPHONE的三轴陀螺仪技术)。陀螺仪的原理就是,一个旋转物体的旋转轴所指的方向在不受外力影响时,是不会改变的。人们根据这个道理,用它来保持方向。然后用多种方法读取轴所指示的方向,并自动将数据信号传给控制系统。我们骑自行车其实也是利用了这个原理。轮子转得越快越不容易倒,因为车轴有一股保持水平的力量。现代陀螺仪可以精确地确定运动物体的方位的仪器,它在现代航空,航海,航天和国防工业中广泛使用的一种惯性导航仪器。传统的惯性陀螺仪主要部分有机械式的陀螺仪,而机械式的陀螺仪对工艺结构的要求很高。70年代提出了现代光纤陀螺仪的基本设想,到八十年代以后,光纤陀螺仪就得到了非常迅速的发展,激光谐振陀螺仪也有了很大的发展。光纤陀螺仪具有结构紧凑,灵敏度高,工作可靠。光纤陀螺仪在很多的领域已经完全取代了机械式的传统的陀螺仪,成为现代导航仪器中的关键部件。光纤陀螺仪同时发展的除了环式激光陀螺仪外。

陀螺仪
是用高速回转体的动量矩敏感壳体相对惯性空间绕正交于自转轴的一个或二个轴的角运动检测装置。利用其他原理制成的角运动检测装置起同样功能的也称陀螺仪。绕一个支点高速转动的刚体称为陀螺(top)。通常所说的陀螺是特指对称陀螺,它是一个质量均匀分布的、具有轴对称形状的刚体,其几何对称轴就是它的自转轴。 与苍蝇退化的后翅(平衡棒)原理类似。在一定的初始条件和一定的外在力矩作用下,陀螺会在不停自转的同时,环绕着另一个固定的转轴不停地旋转,这就是陀螺的旋进(precession),又称为回转效应(gyroscopic effect)。陀螺旋进是日常生活中常见的现象,许多人小时候都玩过的陀螺就是一例。人们利用陀螺的力学性质所制成的各种功能的陀螺装置称为陀螺仪(gyroscope),它在科学、技术、军事等各个领域有着广泛的应用。比如:回转罗盘、定向指示仪、炮弹的翻转、陀螺的章动等。陀螺仪的种类很多,按用途来分,它可以分为传感陀螺仪和指示陀螺仪。传感陀螺仪用于飞行体运动的自动控制系统中,作为水平、垂直、俯仰、航向和角速度传感器。指示陀螺仪主要用于飞行状态的指示,作为驾驶和领航仪表使用。陀螺仪分为,压电陀螺仪,微机械陀螺仪,光纤陀螺仪和激光陀螺仪,它们都是电子式的,并且它们可以和加速度计,磁阻芯片,GPS,做成惯性导航控制系统。

陀螺仪原理

是指陀螺仪工作的原理,螺旋仪是一种用来传感与维持方向的装置,基于角动量守恒的理论设计出来的。陀螺仪主要是由一个位于轴心且可旋转的转子构成。 陀螺仪一旦开始旋转,由于转子的角动量,陀螺仪有抗拒方向改变的趋向。陀螺仪多用于导航、定位等系统常用实例如手机GPS定位导航、卫星三轴陀螺仪定位。陀螺仪基本上就是运用物体高速旋转时,角动量很大,旋转轴会一直稳定指向一个方向的性质,所制造出来的定向仪器。不过它必需转得够快,或者惯量够大(也可以说是角动量要够大)。不然,只要一个很小的力矩,就会严重影响到它的稳定性。高速旋转的物体的旋转轴,对于改变其方向的外力作用有趋向于垂直方向的倾向。而且,旋转物体在横向倾斜时,重力会向增加倾斜的方向作用,而轴则向垂直方向运动,就产生了摇头的运动(岁差运动)。当陀螺经纬仪的陀螺旋转轴以水平轴旋转时,由于地球的旋转而受到铅直方向旋转力,陀螺的旋转体向水平面内的子午线方向产生岁差运动。当轴平行于子午线而静止时可加以应用。陀螺仪基本上就是运用物体高速旋转时,角动量很大,旋转轴会一直稳定指向一个方向的性质,所制造出来的定向仪器。不过它必需转得够快,或者惯量够大(也可以说是角动量要够大)。不然,只要一个很小的力矩,就会严重影响到它的稳定性。

 

加速度(Acceleration)
是速度变化量与发生这一变化所用时间的比值Δv/Δt,是描述物体速度变化快慢的物理量,通常用a表示,单位是m/s2。加速度是矢量,它的方向是物体速度变化(量)的方向,与合外力的方向相同。表示质点速度变化的快慢的物理量。举例:假如两辆汽车开始静止,均匀地加速后,达到10m/s的速度,A车花了10s,而B车只用了5s。它们的速度都从0变为10m/s,速度改变了10m/s。所以它们的速度变化量是一样的。但是很明显,B车变化得更快一些。我们用加速度来描述这个现象:B车的加速度(a=Δv/Δt,其中的Δv是速度变化量)>A车的加速度。显然,当速度变化量一样的时候,花时间较少的B车,加速度更大。也就是说B车的启动性能相对A车好一些。因此,加速度是表示物体速度变化快慢的物理量。加速度 (acceleration) 表征单位时间内速度改变程度的矢量。一般情况下,加速度是个瞬时概念,它的常用单位是米/秒²、m/s2等。

加速度传感器(acceleration transducer)
是一种能够测量加速度的传感器。通常由质量块、阻尼器、弹性元件、敏感元件和适调电路等部分组成。传感器在加速过程中,通过对质量块所受惯性力的测量,利用牛顿第二定律获得加速度值。根据传感器敏感元件的不同,常见的加速度传感器包括电容式、电感式、应变式、压阻式、压电式等。线加速度计的原理是惯性原理,也就是力的平衡,A(加速度)=F(惯性力)/M(质量) 我们只需要测量F就可以了。怎么测量F?用电磁力去平衡这个力就可以了。就可以得到 F对应于电流的关系。只需要用实验去标定这个比例系数就行了。当然中间的信号传输、放大、滤波就是电路的事了。多数加速度传感器是根据压电效应的原理来工作的。所谓的压电效应就是 "对于不存在对称中心的异极晶体加在晶体上的外力除了使晶体发生形变以外,还将改变晶体的极化状态,在晶体内部建立电场,这种由于机械力作用使介质发生极化的现象称为正压电效应 "。一般加速度传感器就是利用了其内部的由于加速度造成的晶体变形这个特性。由于这个变形会产生电压,只要计算出产生电压和所施加的加速度之间的关系,就可以将加速度转化成电压输出。当然,还有很多其它方法来制作加速度传感器,比如压阻技术,电容效应,热气泡效应,光效应,但是其最基本的原理都是由于加速度产生某个介质产生变形,通过测量其变形量并用相关电路转化成电压输出。每种技术都有各自的机会和问题。使用加速度传感器有时会碰到低频场合测量时输出信号出现失真的情况,用多种测量判断方法一时找不出故障出现的原因,经过分析总结,导致测量结果失真的因素主要是:系统低频响应差,系统低频信噪比差,外界环境对测量信号的影响。 所以,只要出现加速度传感器低频测量信号失真情况,对比以上三点看看是哪个因素造成的,有针对性的进行解决。

 

MPU 6050属于IMU传感器系列,通常被用于自平衡机器人、无人机、智能手机等领域。IMU传感器可以帮助我们在三维空间中获取物体当前三维位置的值,这些值可以用来帮助我们确定物体的精确位置,通过MPU6050可以检测智能手机的水平或倾斜状态或是使用IMU传感器来追踪运动状态等。MU传感器通常包含两个或多个功能,按优先级分别是加速计、陀螺仪、磁力计和测高仪。MPU 6050是6自由度或6轴的IMU传感器,这意味着它提供了6个值作为输出:包含加速度计的3个值和陀螺仪的3个值。MPU 6050是一种基于MEMS(微机电系统)技术的传感器,它将加速度计和陀螺仪嵌入到一块芯片中,芯片使用的I2C通信协议。

MPU 6050芯片的主要特征
以数字输出6轴或9轴的旋转矩阵、四元数(quaternion)、欧拉角格式(Euler Angle forma)的融合演算数据。 具有131 LSBs/°/sec 敏感度与全格感测范围为±250、±500、±1000与±2000°/sec 的3轴角速度感测器(陀螺仪)。 可程式控制,且程式控制范围为±2g、±4g、±8g和±16g的3轴加速器。 移除加速器与陀螺仪轴间敏感度,降低设定给予的影响与感测器的飘移。 数字运动处理(DMP: Digital Motion Processing)引擎可减少复杂的融合演算数据、感测器同步化、姿势感应等的负荷。 运动处理数据库支持Android、Linux与Windows 内建之运作时间偏差与磁力感测器校正演算技术,免除了客户须另外进行校正的需求。 以数位输出的温度传感器 以数位输入的同步引脚(Sync pin)支援视频电子影相稳定技术与GPS 可程式控制的中断(interrupt)支援姿势识别、摇摄、画面放大缩小、滚动、快速下降中断、high-G中断、零动作感应、触击感应、摇动感应功能。 VDD供电电压为2.5V±5%、3.0V±5%、3.3V±5%;VDDIO为1.8V± 5% 陀螺仪运作电流:5mA,陀螺仪待命电流:5µA;加速器运作电流:350µA,加速器省电模式电流: 20µA@10Hz 高达400kHz快速模式的I2C,或最高至20MHz的SPI串行主机接口(serial host interface) 内建频率产生器在所有温度范围(full temperature range)仅有±1%频率变化。 使用者亲自测试 10,000 g 碰撞容忍度 为可携式产品量身订作的最小最薄包装 (4x4x0.9mm QFN) 符合RoHS及环境标准。

GY25是一款低成本倾斜模块
工作电压3-5v 功耗小,体积小。其工作原理,是通过陀螺仪与加速度传感器经过数据融合算法最后得到直接的角度数据。此倾斜度模块以串口TTL 电平全双工方式与上位机进行通信。该产品精度高,稳定性高。能够在任意位置得到准确的角度,输出的波特率有9600bps 与115200bps有连续输出与询问输出两种方式,可适应不同的工作环境,与各种的单片机及电脑连接。

 

GY25模块参数
1.工作电压:3~5 V(内部低压差稳压)
2.工作电流:15mA
3.测量范围:-180°~ 180°
4.分辨率:0.01°
5.测量精度:1 °(倾斜度)
6.响应频率:100HZ(115200bps)
7.工作温度:-20°~ 85°
8.使用芯片:MCU+MPU6050
9.产品尺寸:15.5×15.5mm,引脚间距2.54mm
10.通信方式:串口通讯(波特率9600,115200), IIC通信(仅读取原始数据)

GY25数据读取
1.YAW/OLL/PITCH直接数据:
航向角(YAW  ) ±180°
横滚角(ROLL ) ±180°
俯仰角(PITCH) ±180°( ±90°+±90°)
角度分辨率0.01°
2.原始数据直接数据:
陀螺仪原始数据
加速度原始数据
温度数据
角度数据

GY25注意事项
(1)模块上电自校正,需保持3秒以上静止状态,建议不要用手拿着模块;
(2)角度欧拉角由于万向锁问题,横滚,俯仰在90度时候会有相互影响;
(3)模块右侧的焊接点短接,重启后模块进入 IIC 模式,客户可自行操作传感器,模块 MCU 不对传感器进行任何操作;
(4)模块I/O是TTL电平,可以直接与单片机串口连接,但不能与电脑九针串口直接连接;
(5)修改波特率指令
A5  56   修改波特率成为115200
A5   57  修改波特率成为9600

Arduino实验开源代码

/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百四十二:GY-25 串口直接输出角度数据 倾斜度角度传感器模块 MPU-6050

 使用步骤:

 1.先下载GY25_uart程序至arduino

 2.再接上GY25模块

 3.按复位按键

 4.打开串口,波特率115200

 5、接线

 GY25        arduino uno

 VCC----------------------VCC

 RX-----------------------TX

 TX-----------------------RX

 GND----------------------GND

 实验之一:串口显示动态角度数值

*/

#include <Wire.h>

int YPR[3];

unsigned char Re_buf[8], counter = 0;

unsigned char sign = 0;

int led = 13;

//-----------------------------------------------------------

void setup()

{

 Serial.begin(115200);

 delay(2000);

 Serial.write(0XA5);

 Serial.write(0X52);  //初始化GY25,连续输出模式

}

//-------------------------------------------------------------

void loop() {

 if (sign)

 {

  sign = 0;

  if (Re_buf[0] == 0xAA && Re_buf[7] == 0x55)  //检查帧头,帧尾

  {

   YPR[0] = (Re_buf[1] << 8 | Re_buf[2]) / 100; //合成数据,去掉小数点后2位

   YPR[1] = (Re_buf[3] << 8 | Re_buf[4]) / 100;

   YPR[2] = (Re_buf[5] << 8 | Re_buf[6]) / 100;

   Serial.print("YPR:\t");

   Serial.print(YPR[0], DEC); Serial.print("\t"); //显示航向

   Serial.print(YPR[1], DEC); Serial.print("\t"); //显示俯仰角

   Serial.println(YPR[2], DEC);          //显示横滚角

   delay(50);

  }

 }

}

//---------------------------------------------------------------

void serialEvent() {

 while (Serial.available()) {

  Re_buf[counter] = (unsigned char)Serial.read();

  if (counter == 0 && Re_buf[0] != 0xAA) return; // 检查帧头

  counter++;

  if (counter == 8)       //接收到数据

  {

   counter = 0;        //重新赋值,准备下一帧数据的接收

   sign = 1;

  }

 }

}

  

实验串口返回情况

 

 

GY-25串口倾斜度模块实验场景图

 

Arduino实验开源代码之二

/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百四十二:GY-25 串口直接输出角度数据 倾斜度角度传感器模块 MPU-6050

 使用步骤:

 1.先下载GY25_uart程序至arduino

 2.再接上GY25模块

 3.按复位按键

 4.打开串口,波特率115200

 5、接线

 GY25        arduino uno

 VCC----------------------VCC

 RX-----------------------TX

 TX-----------------------RX

 GND----------------------GND

 ---------------------------------------

 IICLCD2004      arduino uno

 VCC----------------------VCC

 SCL----------------------A5

 SDA----------------------A4

 GND----------------------GND

 实验之二:IICLCD2004显示动态角度数值

*/

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

int YPR[3];

unsigned char Re_buf[8], counter = 0;

unsigned char sign = 0;

int led = 13;

LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x20 for a 20 chars and 4 line display

//-----------------------------------------------------------

void setup()

{

 lcd.init();           // initialize the lcd

 // Print a message to the LCD.

 Serial.begin(115200);

 delay(2000);

 Serial.write(0XA5);

 Serial.write(0X52);  //初始化GY25,连续输出模式

 lcd.backlight();

 lcd.setCursor(0, 0);  //I2C接口LCD2004显示初始值

 lcd.print("Yaw:");

 lcd.setCursor(0, 1);

 lcd.print("Pitch:");

 lcd.setCursor(0, 2);

 lcd.print("Roll:");

}

//-------------------------------------------------------------

void loop() {

 if (sign)

 {

  sign = 0;

  if (Re_buf[0] == 0xAA && Re_buf[7] == 0x55)  //检查帧头,帧尾

  {

   YPR[0] = (Re_buf[1] << 8 | Re_buf[2]) / 100; //合成数据,去掉小数点后2位

   YPR[1] = (Re_buf[3] << 8 | Re_buf[4]) / 100;

   YPR[2] = (Re_buf[5] << 8 | Re_buf[6]) / 100;

   lcd.setCursor(4, 0);

   lcd.print("  ");

   lcd.setCursor(4, 0);

   lcd.print(YPR[0]);   //显示航向

   lcd.setCursor(6, 1);

   lcd.print("  ");

   lcd.setCursor(6, 1);  //显示俯仰角

   lcd.print(YPR[1]);

   lcd.setCursor(5, 2);

   lcd.print("  ");

   lcd.setCursor(5, 2);  //显示横滚角

   lcd.print(YPR[2]);

   delay(100);

  }

 }

}

//----------------------------------------------------------

void serialEvent() {

 while (Serial.available()) {

  Re_buf[counter] = (unsigned char)Serial.read();

  if (counter == 0 && Re_buf[0] != 0xAA) return; // 检查帧头

  counter++;

  if (counter == 8)       //接收到数据

  {

   counter = 0;        //重新赋值,准备下一帧数据的接收

   sign = 1;

  }

 }

}

  GY-25串口倾斜度模块实验场景图二,未输出角度数据,不知哪里出问题了

经过调试,LCD2004A可以显示动态角度数据了

 

经过调试,LCD2004A可以显示动态角度数据了,实验视频40秒

https://v.youku.com/v_show/id_XNTAyNTI1MDY0MA==.html?spm=a2hzp.8253869.0.0

 

posted @ 2023-06-30 13:24  行者花雕  阅读(355)  评论(0编辑  收藏  举报