极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: eagler8

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

[复制链接]
 楼主| 发表于 2019-9-9 09:36:13 | 显示全部楼层
loong668 发表于 2019-9-9 09:03
楼主您好!
能否将资料集中一下能下载,或者出本书呢?

谢谢鼓励!可以考虑啊,目前还在赶时间,争取先把这个系列的实验都做完,大概还有三十种前后......
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-9 09:37:24 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-9 09:43:13 | 显示全部楼层

技术特征
以数字输出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及环境标准。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-9 11:12:06 | 显示全部楼层


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-9 11:17:18 | 显示全部楼层


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-9 11:26:29 | 显示全部楼层

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-9 11:36:20 | 显示全部楼层
加速度(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等。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-9 11:46:21 | 显示全部楼层


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-9 12:09:05 | 显示全部楼层
本帖最后由 eagler8 于 2019-9-9 15:12 编辑



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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-9 14:59:42 | 显示全部楼层

名称:电子陀螺仪6DOF GY-521传感器
使用芯片:MPU-6050
供电电源:3-5v(内部低压差稳压)
通信方式:标准IIC通信协议
芯片内置16bit AD转换器,16位数据输出
陀螺仪范围:±250 500 1000 2000  °/s
加速度范围:±2±4±8±16g   
采用沉金PCB,机器焊接工艺保证质量
引脚间距2.54mm

应用
运动感测游戏
现实增强
电子稳像 (EIS: Electronic Image Stabilization)
光学稳像(OIS: Optical Image Stabilization)
行人导航器
“零触控”手势用户接口
姿势快捷方式
认证

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-9 15:06:10 | 显示全部楼层
模块电原理图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-9 15:11:22 | 显示全部楼层


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-9 15:18:19 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-9 15:20:22 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-9 16:29:09 | 显示全部楼层
  1. /*
  2. 【Arduino】108种传感器模块系列实验(资料+代码+图形+仿真)
  3. 实验一百一十二: MPU-6050模块 三轴加速度 电子陀螺仪6DOF GY-521传感器
  4. 项目:测试MPU6050示例
  5. Arduino------MPU 6050
  6. 5V-------------VCC
  7. GND-----------GND
  8. A4-----------SDA IIC 数据线
  9. A5-----------SCL  IIC 时钟线
  10. D2-----------INT 中断脚
  11. */

  12. #include "I2Cdev.h"

  13. #include "MPU6050_6Axis_MotionApps20.h"
  14. //#include "MPU6050.h"

  15. #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
  16.     #include "Wire.h"
  17.     #endif

  18. MPU6050 mpu;

  19. #define OUTPUT_READABLE_YAWPITCHROLL

  20. #define LED_PIN 13
  21. bool blinkState = false;

  22. // MPU control/status vars
  23. bool dmpReady = false;  
  24. uint8_t mpuIntStatus;  
  25. uint8_t devStatus;      
  26. uint16_t packetSize;   
  27. uint16_t fifoCount;     
  28. uint8_t fifoBuffer[64];

  29. Quaternion q;           
  30. VectorInt16 aa;        
  31. VectorInt16 aaReal;   
  32. VectorInt16 aaWorld;   
  33. VectorFloat gravity;   
  34. float euler[3];        
  35. float ypr[3];           

  36. uint8_t teapotPacket[14] = { ', 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, '\r', '\n' };

  37. volatile bool mpuInterrupt = false;     
  38. void dmpDataReady() {
  39.     mpuInterrupt = true;
  40. }

  41. void setup() {
  42.     #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
  43.         Wire.begin();
  44.         TWBR = 24; // 400kHz I2C clock (200kHz if CPU is 8MHz)
  45.     #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
  46.         Fastwire::setup(400, true);
  47.     #endif

  48.     Serial.begin(115200);
  49.     while (!Serial);

  50.     Serial.println(F("Initializing I2C devices..."));
  51.     mpu.initialize();

  52.     Serial.println(F("Testing device connections..."));
  53.     Serial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed"));

  54.     Serial.println(F("\nSend any character to begin DMP programming and demo: "));
  55.     while (Serial.available() && Serial.read());
  56.     while (!Serial.available());                 
  57.     while (Serial.available() && Serial.read());

  58.     Serial.println(F("Initializing DMP..."));
  59.     devStatus = mpu.dmpInitialize();

  60.     mpu.setXGyroOffset(220);
  61.     mpu.setYGyroOffset(76);
  62.     mpu.setZGyroOffset(-85);
  63.     mpu.setZAccelOffset(1788);

  64.     if (devStatus == 0) {
  65.   
  66.         Serial.println(F("Enabling DMP..."));
  67.         mpu.setDMPEnabled(true);

  68.         Serial.println(F("Enabling interrupt detection (Arduino external interrupt 0)..."));
  69.         attachInterrupt(0, dmpDataReady, RISING);
  70.         mpuIntStatus = mpu.getIntStatus();

  71.         Serial.println(F("DMP ready! Waiting for first interrupt..."));
  72.         dmpReady = true;

  73.         packetSize = mpu.dmpGetFIFOPacketSize();
  74.     }
  75.     else {
  76.         
  77.         Serial.print(F("DMP Initialization failed (code "));
  78.         Serial.print(devStatus);
  79.         Serial.println(F(")"));
  80.     }

  81.     // configure LED for output
  82.     pinMode(LED_PIN, OUTPUT);
  83. }

  84. void loop() {
  85.     if (!dmpReady) return;

  86.     while (!mpuInterrupt && fifoCount < packetSize) {
  87.     }

  88.     mpuInterrupt = false;
  89.     mpuIntStatus = mpu.getIntStatus();

  90.     fifoCount = mpu.getFIFOCount();

  91.     if ((mpuIntStatus & 0x10) || fifoCount == 1024) {
  92.         
  93.         mpu.resetFIFO();
  94.         Serial.println(F("FIFO overflow!"));

  95.     } else if (mpuIntStatus & 0x02) {
  96.         while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();

  97.         mpu.getFIFOBytes(fifoBuffer, packetSize);
  98.         
  99.         fifoCount -= packetSize;

  100.         #ifdef OUTPUT_READABLE_QUATERNION
  101.            
  102.             mpu.dmpGetQuaternion(&q, fifoBuffer);
  103.             Serial.print("quat\t");
  104.             Serial.print(q.w);
  105.             Serial.print("\t");
  106.             Serial.print(q.x);
  107.             Serial.print("\t");
  108.             Serial.print(q.y);
  109.             Serial.print("\t");
  110.             Serial.println(q.z);
  111.         #endif

  112.         #ifdef OUTPUT_READABLE_EULER
  113.          
  114.             mpu.dmpGetQuaternion(&q, fifoBuffer);
  115.             mpu.dmpGetEuler(euler, &q);
  116.             Serial.print("euler\t");
  117.             Serial.print(euler[0] * 180/M_PI);
  118.             Serial.print("\t");
  119.             Serial.print(euler[1] * 180/M_PI);
  120.             Serial.print("\t");
  121.             Serial.println(euler[2] * 180/M_PI);
  122.         #endif

  123.         #ifdef OUTPUT_READABLE_YAWPITCHROLL
  124.          
  125.             mpu.dmpGetQuaternion(&q, fifoBuffer);
  126.             mpu.dmpGetGravity(&gravity, &q);
  127.             mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
  128.             Serial.print("ypr\t");
  129.             Serial.print(ypr[0] * 180/M_PI);
  130.             Serial.print("\t");
  131.             Serial.print(ypr[1] * 180/M_PI);
  132.             Serial.print("\t");
  133.             Serial.println(ypr[2] * 180/M_PI);
  134.         #endif

  135.         #ifdef OUTPUT_READABLE_REALACCEL
  136.             
  137.             mpu.dmpGetQuaternion(&q, fifoBuffer);
  138.             mpu.dmpGetAccel(&aa, fifoBuffer);
  139.             mpu.dmpGetGravity(&gravity, &q);
  140.             mpu.dmpGetLinearAccel(&aaReal, &aa, &gravity);
  141.             Serial.print("areal\t");
  142.             Serial.print(aaReal.x);
  143.             Serial.print("\t");
  144.             Serial.print(aaReal.y);
  145.             Serial.print("\t");
  146.             Serial.println(aaReal.z);
  147.         #endif

  148.         #ifdef OUTPUT_READABLE_WORLDACCEL
  149.            
  150.             mpu.dmpGetQuaternion(&q, fifoBuffer);
  151.             mpu.dmpGetAccel(&aa, fifoBuffer);
  152.             mpu.dmpGetGravity(&gravity, &q);
  153.             mpu.dmpGetLinearAccel(&aaReal, &aa, &gravity);
  154.             mpu.dmpGetLinearAccelInWorld(&aaWorld, &aaReal, &q);
  155.             Serial.print("aworld\t");
  156.             Serial.print(aaWorld.x);
  157.             Serial.print("\t");
  158.             Serial.print(aaWorld.y);
  159.             Serial.print("\t");
  160.             Serial.println(aaWorld.z);
  161.         #endif
  162.    
  163.         #ifdef OUTPUT_TEAPOT
  164.             
  165.             teapotPacket[2] = fifoBuffer[0];
  166.             teapotPacket[3] = fifoBuffer[1];
  167.             teapotPacket[4] = fifoBuffer[4];
  168.             teapotPacket[5] = fifoBuffer[5];
  169.             teapotPacket[6] = fifoBuffer[8];
  170.             teapotPacket[7] = fifoBuffer[9];
  171.             teapotPacket[8] = fifoBuffer[12];
  172.             teapotPacket[9] = fifoBuffer[13];
  173.             Serial.write(teapotPacket, 14);
  174.             teapotPacket[11]++;
  175.         #endif

  176.         blinkState = !blinkState;
  177.         digitalWrite(LED_PIN, blinkState);
  178.         delay(1000);
  179.     }
  180. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-25 20:03 , Processed in 0.060361 second(s), 15 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表