Arduino mega2560+MPU6050利用加速度值控制舵机-Arduino中文社区 - Powered by Discuz! Archiver

晨曦的雨露222 发表于 2018-9-7 13:06

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

本帖最后由 晨曦的雨露222 于 2018-9-7 13:26 编辑

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

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

http://image.geek-workshop.com/forum/201205/24/1153237bgxvvk99gvkvvgx.jpg


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

http://image.geek-workshop.com/forum/201205/24/115322s000zgq4ohcii0cc.jpg二、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板直接供电。

二、我采用的是数字舵机DS3115 DS3109 数码舵机 反应灵敏,行程大,零盲区。绝非模拟 , 我们已经用4PL数码模式亲自使用测试过。
型号:DS3115MG 提供给机器人使用
重量: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)在基本的机械结构方面是完全一样的,主要由马达、减速齿轮、控制电路等组成,而数字舵机和模拟舵机的最大区别则体现在控制电路上,数字舵机的
控制电路比模拟舵机的多了微处理器和晶振。不要小看这一点改变,它对提高舵机的性能有着决定性的影响。


三、实现代码
以下代码在Arduino软件1.6.9版本中编译、烧写以及测试通过
#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轴的加速度值











明娃子 发表于 2018-9-18 08:55

有滤波算法吗

晨曦的雨露222 发表于 2018-9-18 13:45

明娃子 发表于 2018-9-18 08:55
有滤波算法吗

有点的

qinyang2019 发表于 2019-2-9 13:13

兄弟 你好我在做个小东西和你用的模块一样 可否帮助一下我的微信号13657419330谢谢

arduino月色无声 发表于 2019-2-15 09:16

顶一下,之前用这个模块的时候得到的加速度变化实在太大,学到了。

lijing777 发表于 2019-7-12 10:14

这个没有滤波算法吧

jhcdesign 发表于 2019-12-22 05:48

我想问问我要用他们两个控制我的数字舵机工作

jhcdesign 发表于 2019-12-26 06:05

用这种可以吗?第一二张用的是编码器马达第三张用的是PWM信号!那种可以,怎么连,

allen100 发表于 2020-2-16 18:55

楼主最后实现的效果是什么样子的啊?看代码是读取到mpu角度之后,舵机旋转到对应的角度

jhcdesign 发表于 2020-6-2 17:31

楼主还在吗?有技术性请教你
页: [1]
查看完整版本: Arduino mega2560+MPU6050利用加速度值控制舵机