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

本文介绍了如何利用arduinonano单片机配合MPU6050陀螺仪和舵机,通过PID算法实现模拟鸡头的头部保持功能。重点讲解了PID算法的工作原理和在代码中的应用,包括PID控制器的编写和参数调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

工具

介绍

主要流程如下图

代码如下 

工具

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));
}

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值