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!
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

Popular posts from this blog

Convierte tu Raspberry en un NAS. Firmware fvdw-sl 15.3 - Raspberry Pi Forums

How to format a Get Request

avrdude: verification error, first mismatch at byte 0x0000 0x0c != 0x62