查看: 2396|回复: 5

Arduino mega2560+MPU6050利用加速度值控制舵机

[复制链接]
  • TA的每日心情
    奋斗
    2018-9-7 13:17
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2018-9-7 13:06 | 显示全部楼层 |阅读模式
    本帖最后由 晨曦的雨露222 于 2018-9-7 13:26 编辑

    学习了几天时间,慢慢了解MPU6050这个6轴的姿态模块,现在整理一下这个模块与Arduino的结合使用方法!(如有错误麻烦请指出,谢谢!)
    摘要:随着Arduino开发板的普及,许多朋友希望能够自己制作基于MPU6050的控制系统,但由于缺乏专业知识而难以上手。此外,MPU6050的数据是有较大噪音的,若不进行滤波会对整个控制系统的精准确带来严重影响。
    MPU6050芯片内自带了一个数据处理子模块DMP,已经内置了滤波算法,在许多应用中使用DMP输出的数据已经能够很好的满足要求。关于如何获取DMP的输出数据,我将在以后的文章中介绍。本文将直接面对原始测量数据,从连线、芯片通信开始一步一步教你如何利用Arduino获取MPU6050的数据并进行卡尔曼滤波,最终获得稳定的系统运动状态。一、应用:
    运动感测游戏
    现实增强、电子稳像、光学稳像、行人导航器
    “零触控”手势用户接口姿势快捷方式

    下面可以看一下以下几个图片,这样你也许会了解一些!

    第一张是MPU6000与MPU6050芯片的比较!





    第二张是MPU6000与MPU6050芯片的最小驱动电路的连接!

    二、Arduino与MPU-6050的通信
    MPU6050的数据接口用的是I2C总线协议,因此我们需要Wire程序库的帮助来实现Arduino与MPU6050之间的通信。请先确定是否安装Wire库,Wire库的官方文档(http://www.arduino.cc/en/Reference/Wire)
    这是Arduino uno与mpu6050接线图(紫色线为中断线,可不接SDA接口对应的是A4引脚,SCL对应的是A5引脚。
    MEGA 2560开发板上20(SDA)引脚21(SCL)与mpu6050相对应的引脚对接即可
    MPU6050需要5V的电源,可由UNO板直接供电。
    111813itbp99cwbfyzjspy.jpg
    二、我采用的是数字舵机DS3115 DS3109 数码舵机 反应灵敏,行程大,零盲区。绝非模拟 , 我们已经用4PL数码模式亲自使用测试过。
    型号S3115MG 提供给机器人使用
    重量:60g
    尺寸:40*20*40.5mm
    速度:15KG 0.16sec/60° 4.8-7.2V (工作电压)
    堵转扭矩: 15kg/cm 4.8-7.2V
    工作电压:4.8-7.2V
    工作电流:>600mA
    线长:32cm
    与Futaba,JR,SANWA,Hitec 等遥控系统兼容.
    控制特性
    控制方式:改变脉冲宽度
    工作频率:50-330Hz
    可控角度:180°(脉宽在500-2500us可满范围变化时)
    中立位置:1500us
    脉宽范围:500-2500us
    死区宽度:3us
    数字(数码)舵机和模拟舵机的区别


    字舵机(Digital Servo)和模拟舵机(Analog
    Servo)在基本的机械结构方面是完全一样的,主要由马达、减速齿轮、控制电路等组成,而数字舵机和模拟舵机的最大区别则体现在控制电路上,数字舵机
    控制电路比模拟舵机的多了微处理器和晶振。不要小看这一点改变,它对提高舵机的性能有着决定性的影响。
    wKhQxFhh_VSEec1EAAAAAMDV2Ec791.jpg..400x400.jpg

    三、实现代码
    以下代码在Arduino软件1.6.9版本中编译、烧写以及测试通过[code]
    #include<Servo.h>
    Servo analogservo;

    #include "Wire.h"
    #include "I2Cdev.h"
    #include "MPU6050.h"

    MPU6050 accelgyro;
    int16_t ax, ay, az;
    int16_t gx, gy, gz;
    //int value;//定义一个整形变量用于存放读取到的信号值
    int16_t value;//定义一个整形变量用于存放读取到的信号值

    bool blinkState = false;
    void setup() {
          Wire.begin();
          Serial.begin(38400);
          Serial.println("Initializing I2C devices...");
          accelgyro.initialize();
          Serial.println("Testing device connections...");
          Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
          analogservo.attach(7);//舵机连接在7号脚
    }
    void loop() {
          accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
          Serial.print("a/g:\t");
          Serial.print(gx/131);   
          Serial.print("\t");   

          value=91+gx/131;  
          Serial.println(value);  

          analogservo.write(value);
          blinkState = !blinkState;
    }试验结果:只是利用一个x轴的加速度值

    串口可以查看到的试验结果

    串口可以查看到的试验结果


    mpu6050控制舵机——X轴升级(加速度) - 副本.zip (42.35 KB, 下载次数: 56)
  • TA的每日心情
    开心
    2018-9-21 15:12
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 2018-9-18 08:55 | 显示全部楼层
    有滤波算法吗

    点评

    有的  发表于 2018-9-18 13:47
    PY让世界更美好~
  • TA的每日心情
    奋斗
    2018-9-7 13:17
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2018-9-18 13:45 | 显示全部楼层

    有点的
  • TA的每日心情
    开心
    2019-1-31 12:08
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2019-2-9 13:13 | 显示全部楼层
    兄弟 你好我在做个小东西和你用的模块一样 可否帮助一下我的微信号13657419330谢谢
  • TA的每日心情
    慵懒
    2019-2-15 15:01
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2019-2-15 09:16 | 显示全部楼层
    顶一下,之前用这个模块的时候得到的加速度变化实在太大,学到了。
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    学习记录2,Blinker读取温湿度
    学习记录2,Blinker读取温
    开关现在是使用得很6了,准备进行下一步,读取数据。 找了下官方的例程,发现用的是w
    学生智能打卡系统(接入blinker)
    学生智能打卡系统(接入bl
    【项目名称】学生智能打卡系统(接入blinker) 一.感谢各位大佬 首先感谢社区的管理员
    关于红外控制空调的模块选型
    关于红外控制空调的模块选
    想问问这中模块能支持arduino吗
    LCD1602只亮 不显示
    LCD1602只亮 不显示
    #include // initialize the library by associating any needed LCD interface pin
    18脚的8x8LED点阵如何使用??
    18脚的8x8LED点阵如何使用
    本帖最后由 Creeper666 于 2018-8-14 12:24 编辑 这个点阵模块上面一排有12个脚,
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表