关于Arduino的MPU6050 6轴加速度和陀螺仪传感器的3旋转自由度舵机控制

一、项目说明    

为了机械手臂手腕3自由度旋转,我研究了MPU6050加速度陀螺仪温度传感器,我用传感器3个旋转自由度数据来控制3个舵机角度旋转,以此来模拟手腕关节3个自由度的旋转。

    这里记录下简单的代码,给有需要的朋友做个参考。

    如果想了解MPU6050加速度陀螺仪温度传感器的朋友可以查看这篇前置文章,有MPU6050陀螺仪教程和简单案例。

MPU6050 6轴加速度和陀螺仪传感器的数据读取。-CSDN博客

     如果想了解舵机库如何使用,或者了解弯曲传感器控制舵机,可以参考我的这篇文章,有舵机控制和弯曲传感器控制舵机的教程,有需要可以找出自行查阅。基于弯曲传感器的舵机控制,及LCD和串口监视器数据显示_舵机监视器-CSDN博客

二、项目原理

代码控制原理:

舵机新角度=舵机原角度+传感器读数。然后把新角度写入舵机对象。

如果角度大于舵机最大角度,则舵机新角度等于舵机最大角度。

如果角度小于舵机最小角度,则舵机新角度等于舵机最小角度。

//创建变量
static float x;

//改变角度
x=x+g.gyro.x;
if(x>180)x=180;
else if(x<0)x=0;


//角度写入舵机
myservo.write(x);

具体的陀螺仪使用和舵机使用本文就不给出了,有需要可以查看上文给出的两篇文章,里面写有陀螺仪和舵机的具体使用教程。本文就主要给出陀螺仪数据与舵机对接部分的代码。

电路图接线:

为了方便识别,控制线为(黄线),正极为(红线),负极为(黑线)。

电路图接线:

附上控制部分完整代码:(逗比写的逗比代码,但能用ヽ(゚∀゚)メ(゚∀゚)ノ (ノ≧∀≦)ノ)

static float x,y,z;
x=x+g.gyro.x;
if(x>180)x=180;
else if(x<0)x=0;

y=y+g.gyro.y;
if(y>180)y=180;
else if(y<0)y=0;

z=z+g.gyro.z;
if(z>180)z=180;
else if(z<0)z=0;

//角度写入舵机
myservo.write(x);
myservo1.write(y);
myservo2.write(z);

最后是给出整个程序的完整代码,如果有看不懂的地方可以参考上文给出的两篇文章,里面写有详细的使用教程。

附上项目完整代码:

//添加库
#include <Servo.h>
#include <Adafruit_MPU6050.h> 
#include <Adafruit_Sensor.h> 
#include <Wire.h>  

//创建三个舵机对象和一个陀螺仪对象
 Servo myservo;
 Servo myservo1;
 Servo myservo2;
 Adafruit_MPU6050 mpu;

void setup() {
  //初始化串口监视器
  Serial.begin(115200);
  //确认是否成功接入陀螺仪
  if(!mpu.begin())
  {
    Serial.println("未能找到MPU6050芯片");
    while(1)delay(10);
  }
  Serial.println("找到 MPU6050!");
 //舵机引脚设置
myservo.attach(6);
myservo1.attach(9);
myservo2.attach(10);

//加速度计设置
mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
mpu.setGyroRange(MPU6050_RANGE_2000_DEG);
mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
Serial.println();
delay(100);


}

void loop() {
  // put your main code here, to run repeatedly:
  sensors_event_t a,g,temp;
  mpu.getEvent(&a,&g,&temp);
  Serial.print("旋转 X:");Serial.print(g.gyro.x);
   Serial.print("旋转 Y:");Serial.print(g.gyro.y);
    Serial.print("旋转 Z:");Serial.print(g.gyro.z);
    Serial.println("rad/s");

//简单的角速度改变角度
static float x,y,z;
x=x+g.gyro.x;
if(x>180)x=180;
else if(x<0)x=0;

y=y+g.gyro.y;
if(y>180)y=180;
else if(y<0)y=0;

z=z+g.gyro.z;
if(z>180)z=180;
else if(z<0)z=0;

//角度写入舵机
myservo.write(x);
myservo1.write(y);
myservo2.write(z);


}

感谢大家看到这里,祝各位朋友好运。(๑╹◡╹)ノ"""

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MPU6050是一种常用的六陀螺仪和加速度计模块,可以用于测量物体的姿态和运动。在Arduino控制舵机使用MPU6050可以实现自动平衡、姿态控制等功能。 要使用MPU6050控制舵机,首先需要连接硬件。将MPU6050模块的SDA引脚连接到Arduino的SDA引脚,SCL引脚连接到Arduino的SCL引脚,VCC引脚连接到Arduino的5V引脚,GND引脚连接到Arduino的GND引脚。然后将舵机的信号线连接到Arduino的一个数字引脚。 接下来,在Arduino中编写代码。首先需要包含Wire库和Servo库,然后初始化MPU6050和舵机对象。在主循环中,读取MPU6050角度数据,并根据需要控制舵机的位置。 以下是一个简单的示例代码: ``` #include <Wire.h> #include <Servo.h> Servo servo; int servoPin = 9; const int MPU_addr=0x68; // I2C地址 int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ; void setup(){ Wire.begin(); Wire.beginTransmission(MPU_addr); Wire.write(0x6B); // PWR_MGMT_1寄存器 Wire.write(0); // 唤醒MPU-6050 Wire.endTransmission(true); servo.attach(servoPin); } void loop(){ Wire.beginTransmission(MPU_addr); Wire.write(0x3B); // 从0x3B寄存器开始读取14个字节的数据 Wire.endTransmission(false); Wire.requestFrom(MPU_addr,14,true); // 请求14个字节的数据 AcX=Wire.read()<<8|Wire.read(); // 加速度计X数据 AcY=Wire.read()<<8|Wire.read(); // 加速度计Y数据 AcZ=Wire.read()<<8|Wire.read(); // 加速度计Z数据 Tmp=Wire.read()<<8|Wire.read(); // 温度数据 GyX=Wire.read()<<8|Wire.read(); // 陀螺仪X数据 GyY=Wire.read()<<8|Wire.read(); // 陀螺仪Y数据 GyZ=Wire.read()<<8|Wire.read(); // 陀螺仪Z数据 // 根据需要控制舵机的位置 int servoPos = map(GyX, -32768, 32767, 0, 180); servo.write(servoPos); delay(20); } ``` 这段代码通过读取MPU6050的陀螺仪数据,将陀螺仪X的值映射到舵机的角度范围,然后控制舵机的位置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值