AYUDA CON CONTROLADOR PD!!
hola todos! estoy haciendo un proyecto denominado "ball , plate" y bueno el problema es el controlador...
no se si lo que estoy haciendo esta correcto, ya que aun soy un novato en esto, pero les subo el sketch para ver si lo pueden chekear y dejar algun comentario o ayuda! se los agradecería mucho.
el problema es que el servo motor se mueve, pero no controla como es debido... no se cual es el problema.
de ante mano muchas gracias!
por el momento estoy utilizando solo un servo, ya que el otro no esta disponible.
saludos!
no se si lo que estoy haciendo esta correcto, ya que aun soy un novato en esto, pero les subo el sketch para ver si lo pueden chekear y dejar algun comentario o ayuda! se los agradecería mucho.
el problema es que el servo motor se mueve, pero no controla como es debido... no se cual es el problema.
de ante mano muchas gracias!
code: [select]
#include <pid_v1.h>
#include <servo.h>
#define cte_kpx -1.048
#define cte_kpy 1.048 /*verificar bien si es punto o coma*/
#define cte_kdx 0.5626
#define cte_kdy -0.5626
/*comunicaciÓn*/
byte byteread;
double num1, num2;
int ballx,bally;
int setpointx,setpointy;
double complnum,counter,complnum1;
int numofdec;
boolean myswitch=false;
/*servo*/
servo servox;
servo servoy;
int posx;
int posy;
/*output*/
float finalx;
float finaly;
float dutycyclex;
float dutycycley;
/*pd*/
float errorx;
float errory;
float prev_errorx;
float prev_errory;
float proporcionalx;
float proporcionaly;
float derivativox;
float derivativoy;
float kpx;
float kpy;
float kdx;
float kdy;
long lasttime;
long sampletime;
long timeout;
/*------------------------------------------------------------*/
void setup() {
//inicia la comunicación
serial.begin(57600);
num1=0;
num2=0;
complnum=0;
complnum1=0;
counter=1;
numofdec=0;
/*pin 9 y 10 salida*/
pinmode(9,output);
pinmode(10,output);
/* pd */
lasttime= millis();
kpx=cte_kpx;
kpy=cte_kpy;
kdx=cte_kdx;
kdy=cte_kdy;
/*servomotor*/
posx=95;
posy=90;
servox.attach(9);
servoy.attach(10);
servox.write(posx);
servoy.write(posy);
}//void setup
/*---------------------------------------------------------------------*/
void loop() {
// siempre que el buffer tenga información será leida.
while(serial.available()){
/*----------------comunicaciÓn-----------------------------------------*/
byteread = serial.read();
if(byteread>47 && byteread<58){
//encontró el número.
/*si myswitch es cierto, entonces llenara la variable
num1 de lo contrario llenará la variable num2*/
if(!myswitch){
num1=(num1*10)+(byteread-48);
}else{
num2=(num2*10)+(byteread-48);
counter=counter*10;
numofdec++;
}
}
/* si la información termina con el signo igual
entonces imprimir num1 y num2*/
if(byteread==61){
ballx=num1;
bally=num2;
complnum=ballx+(bally/(counter));
serial.print(complnum,numofdec);
//resetea todas las variables
num1=0;
num2=0;
complnum=0;
complnum1=0;
counter=1;
numofdec=0;
myswitch=false;
/*si la información termina con el signo punto y coma
guarda num1 y num2 en x e y respectivamente*/
}else if (byteread==59){
setpointx=num1;
setpointy=num2;
complnum1=setpointx+(setpointy/(counter));
serial.print(complnum1,numofdec);
//resetea las variables
num1=0;
num2=0;
complnum=0;
complnum1=0;
counter=1;
numofdec=0;
myswitch=false;
}else if (byteread==44){
myswitch=true;
}
/* -------------controlador pd-------------------------------------*/
/*se hacen los cálculos de forma periódica*/
sampletime=(millis()-lasttime);
if(sampletime>=100){
lasttime=millis();
/*proporcional kp*/
prev_errorx=(float)errorx;
errorx=(int)ballx-(int)setpointx;
proporcionalx=(float)kpx*(float)errorx;
prev_errory=(float)errory;
errory=(int)bally-(int)setpointy;
proporcionaly=(float)kpy*(float)errory;
/*derivativa kd*/
derivativox=(float)kdx*((float)errorx-(float)prev_errorx);
derivativoy=(float)kdy*((float)errory-(float)prev_errory);
/*------------output----------------------------------------------*/
dutycyclex=(int)proporcionalx+(int)derivativox;
dutycycley=(int)proporcionaly+(int)derivativoy;
/*-----------servo motores----------------------------------------*/
finalx=95-dutycyclex;
finaly=90-dutycycley;
servox.write(finalx);
delay(30);
}/*if sample time*/
}//while
}//void loop
por el momento estoy utilizando solo un servo, ya que el otro no esta disponible.
saludos!
esquema de conexión, foto, descripción del proyecto...
Arduino Forum > International > Español (Moderators: surbyte, Hector_A) > AYUDA CON CONTROLADOR PD!!
arduino
Comments
Post a Comment