利用MPU6050来控制舵机
在本文中,我们将探讨如何使用MPU6050(加速计和陀螺仪)传感器来控制舵机。大致的物理结构是将舵机和MPU6050传感器与Arduino控制器连接起来,当移动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
测试电路的连接
首先,需要将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传感器获取当前输出值,并将输出值映射到舵机的角度值上去,以此来控制舵机的运动。