利用MPU6050来控制舵机

  • 内容
  • ....
  • 相关

在本文中,我们将探讨如何使用MPU6050(加速计和陀螺仪)传感器来控制舵机。大致的物理结构是将舵机和MPU6050传感器与Arduino控制器连接起来,当移动MPU6050时,舵机会根据MPU6050的姿态变化做相应运动。

工作原理

通过MPU6050来控制舵机运动

加速度计采用压电效应的工作原理,类似于在一个立方体的盒子里面有一个小球,盒子的四壁是用压电晶体材料,由于重力的作用,当小球碰到墙壁就会产生压电电流。盒子中有上下、左右、前后三对相对的墙壁,每一对墙对应于三维空间中的一个轴:X轴、Y轴、Z轴。根据压电壁产生的电流,我们就可以确定倾角的方向和大小。详见:Arduino如何使用MPU6050

基于此,当传感器向上或向下移动时,我们将从传感器获得-17000到17000的值,将这些值不断映射出来,然后就可以依据映射值来控制舵机在0到180度的范围来移动。例如,当我们把传感器向上移动时,舵机的输出将是180度,当我们向下移动传感器时,舵机的输出将回到0度。

测试硬件清单

https://item.taobao.com/item.htm?spm=a230r.1.14.18.12ac768bRr5qaU&id=533871686531&ns=1&abbucket=5#detail
https://detail.tmall.com/item.htm?spm=a230r.1.14.4.1c495b65yxKsdN&id=41248626148&ns=1&abbucket=5
https://detail.tmall.com/item.htm?spm=a230r.1.14.4.4328340dkxgO68&id=41337720621&ns=1&abbucket=5

测试电路的连接

通过MPU6050来控制舵机的电路连接图

首先,需要将MPU 6050传感器连接到Arduino上。MPU6050和Arduino的连接如下:

  •  MPU6050 VCC  ——>  Arduino 5V 针脚
  •  MPU6050 GND ——>  Arduino GND 针脚
  •  MPU6050 SCL  ——>   Arduino A5 针脚
  •  MPU6050 SDA ——>   Arduino A4 针脚

这里我们将MPU6050的SCL和SDA针连接到Arduino控制器上A5和A4针,目的是A4和A5针脚将用来完成SPI通信功能。完成了MPU6050和Arduino控制器的连接后,下面将舵机连接到Arduino控制器上。连接如下:

  • 舵机的黄线 ——> Arduino 2号数字针脚
  • 舵机的红线 ——> Arduino 5V针脚
  • 舵机的黑线 ——> Arduino GND针脚

代码及释义

#include <Wire.h>
#include <MPU6050.h>
#include <Servo.h> 

首先,我们引入了MPU6050传感器和舵机的库文件。该库文件负责Arduino和MPU6050传感器之间的SPI通信功能。

Servo sg90; 
int servo_pin = 2;

然后创建了一个名为sg90的变量,这个变量使得我们可以使用舵机库的功能,然后设置Arduino的2号数字针为舵机控制针脚。

MPU6050 sensor ;
int16_t ax, ay, az ;
int16_t gx, gy, gz ;

创建一个传感器的名称和类型的变量:MPU6050,这个变量也是帮助能使用库文件的功能。然后我们对一些变量进行了初始化,我们将用它来测量MPU6050传感器的输出。

void setup ( )
{
sg90.attach ( servo_pin );
Wire.begin ( );
Serial.begin (9600);

在setup function中,我们将舵机连接到Arduino上的2号针,Arduino将通过这个针向舵机发送控制信号。然后通信建立了,设置串口波特率为9600。

Serial.println (sensor.testConnection ( ) ? "Successfully Connected" : "Connection failed");
delay (1000);
Serial.println ( "Taking Values from the sensor" );
delay (1000);
}

检查MPU6050传感器是否正常工作,如果它正常则会在串口监视器上显示“Taking Values from the sensor”,反之则显示“Connection failed”。

void loop ( ) 
{
sensor.getMotion6 (&ax, &ay, &az, &gx, &gy, &gz);
ax = map (ax, -17000, 17000, 0, 180) ;
Serial.println (ax);
sg90.write (ax);
delay (200);
}

在 loop function中,我们不断从MPU6050传感器获取当前输出值,并将输出值映射到舵机的角度值上去,以此来控制舵机的运动。