ARDUINO控制云台舵机,基于MPU6050+PID算法保持位姿

目录

工具

介绍

主要流程如下图

代码如下 

工具

arduino nano

MPU6050三轴陀螺仪

sg90舵机两个

二自由度云台

介绍

《模拟鸡头》

转动云台,让头部保持在一个位置不转动,通过舵机自我调节。

基于arduino nano单片机,陀螺仪解算出姿态角度,利用PID算法算出角度差值赋给舵机。

需要了解一定的PID算法,并且学会调参(主要是调参比较难),还要学会MPU6050(或其他陀螺仪,能解算出姿态就行)的应用。

PID 实指“比例”、“积分”、“微分”,这三项构 成 PID 基本要素。数字 PID 控制算法通常分为位置式 PID 控制算法和增量式 PID 控制算法。

比例P : e_n                                               目标值 - 当前值

积分I :   e_n+e_{n-1}+...+e_{0}              误差的累加

微分D :  e_n-e_{n-1}                                这次误差-上次误差

P(比例)作用:对当前时刻的偏差进行比例放大。

I(积分)环节:对过去所有时间的偏差进行积分。

D(微分)环节:通过偏差的偏差,对控制系统的输出走向进行预判,起超前调节的作用。

常用的位置式PID:

PID公式

可以加一个积分限幅,因为误差达到饱和时为防止一直积累,可以增加限幅来停止积分作用

所以我感觉可以只用单一的P控制器或者PD来结算误差,毕竟现在不要求太高精度,如果要达到好的效果就要用到积分。

这里提供PID模拟器,可以帮助你理解PID的作用

链接:https://pan.baidu.com/s/1MiCkuNO5Izwt-dLrM5QnBg 
提取码:HHHH

主要流程如下图

 

代码如下 

PID部分

int pid1(int a,int b){
  float kp=0.68,ki=0.002,kd=0.3;
  float pwm;
  a= map(a,-45,45,0,180);
  curren_err = a-b;
  
  leijia+=curren_err;
  if(leijia>5)leijia=5;
  if(leijia<-5)leijia=-5;
  pwm = kp*curren_err+ki*leijia+kd*(curren_err-last_err);
  last_err = curren_err;
  return pwm;
}

 在循环中应用此函数算出误差即可

全部代码如下

#include <MPU6050_tockn.h>
#include <Servo.h>
Servo duo1;
Servo duo2;
float y,x;
MPU6050 mpu6050(Wire);
float tar=0,curren_err,last_err,pre_err,leijia;

int pid1(int a,int b){
  float kp=0.68,ki=0.002,kd=0.3;
  float pwm;
  a= map(a,-45,45,0,180);
  curren_err = a-b;
  
  leijia+=curren_err;
  if(leijia>5)leijia=5;
  if(leijia<-5)leijia=-5;
  pwm = kp*curren_err+ki*leijia+kd*(curren_err-last_err);
  last_err = curren_err;
  return pwm;
}

void setup() {
  // put your setup code here, to run once:
duo1.attach(3);
duo2.attach(5);
  Serial.begin(9600);
  Wire.begin();
  mpu6050.begin();
  mpu6050.calcGyroOffsets(true);

}

void loop() {
  // put your main code here, to run repeatedly:
  mpu6050.update();
  //Serial.print(mpu6050.getAngleY());
  Serial.print(" ");
  //Serial.println(mpu6050.getAngleX());
  y=mpu6050.getAngleY();
  x=mpu6050.getAngleX();
duo1.write(pid1(y,tar));
duo2.write(pid1(x,tar));
 Serial.print(pid1(y,tar));
 Serial.print(" ");
 Serial.println(pid1(x,tar));
}

  • 5
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
你可以使用Arduino控制MPU6050传感器。MPU6050是一个六轴陀螺仪和加速度计模块,可以测量物体的倾斜和加速度。 首先,确保你已经连接好了ArduinoMPU6050。使用四根导线将它们连接在一起:将MPU6050的VCC引脚连接到Arduino的5V引脚,将GND引脚连接到Arduino的GND引脚,将SCL引脚连接到Arduino的A5引脚(或者SCL引脚),将SDA引脚连接到Arduino的A4引脚(或者SDA引脚)。 然后,你需要下载并安装MPU6050库。打开Arduino IDE,点击"工具"->"管理库",搜索MPU6050并安装它。 接下来,你可以使用以下代码来控制MPU6050: ```cpp #include <Wire.h> #include <MPU6050.h> MPU6050 mpu; void setup() { Wire.begin(); Serial.begin(9600); mpu.initialize(); mpu.setAccelerometerRange(MPU6050_ACCEL_FS_2); mpu.setGyroRange(MPU6050_GYRO_FS_250); } void loop() { int16_t ax, ay, az; int16_t gx, gy, gz; mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); Serial.print("加速度计:"); Serial.print("X轴:"); Serial.print(ax); Serial.print(" Y轴:"); Serial.print(ay); Serial.print(" Z轴:"); Serial.println(az); Serial.print("陀螺仪:"); Serial.print("X轴:"); Serial.print(gx); Serial.print(" Y轴:"); Serial.print(gy); Serial.print(" Z轴:"); Serial.println(gz); delay(1000); } ``` 这段代码将从MPU6050读取加速度计和陀螺仪的数据,并通过串口输出。你可以使用串口监视器来查看这些数据。 希望这能帮助到你!如果还有其他问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值