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
有滤波算法吗
有点的
兄弟 你好我在做个小东西和你用的模块一样 可否帮助一下我的微信号13657419330谢谢 顶一下,之前用这个模块的时候得到的加速度变化实在太大,学到了。 这个没有滤波算法吧 我想问问我要用他们两个控制我的数字舵机工作 用这种可以吗?第一二张用的是编码器马达第三张用的是PWM信号!那种可以,怎么连, 楼主最后实现的效果是什么样子的啊?看代码是读取到mpu角度之后,舵机旋转到对应的角度 楼主还在吗?有技术性请教你
页:
[1]