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

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

第一张是MPU6000与MPU6050芯片的比较!
Arduino mega2560+MPU6050利用加速度值控制舵机_第1张图片


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

Arduino mega2560+MPU6050利用加速度值控制舵机_第2张图片

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板直接供电。

Arduino mega2560+MPU6050利用加速度值控制舵机_第3张图片

二、我采用的是数字舵机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)在基本的机械结构方面是完全一样的,主要由马达、减速齿轮、控制电路等组成,而数字舵机和模拟舵机的最大区别则体现在控制电路上,数字舵机的
控制电路比模拟舵机的多了微处理器和晶振。不要小看这一点改变,它对提高舵机的性能有着决定性的影响。
Arduino mega2560+MPU6050利用加速度值控制舵机_第4张图片

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

Arduino mega2560+MPU6050利用加速度值控制舵机_第5张图片

你可能感兴趣的:(arduino单片机,编程语言)