Tarea 2-Procesadores 2016-2. Aldair Navarro

Dependencies:   Pulse1 TextLCD mbed

Fork of irda_Sony by Gustavo Ramirez

Files at this revision

API Documentation at this revision

Comitter:
LaVerga_A
Date:
Wed Nov 30 04:02:51 2016 +0000
Parent:
4:150bc6a5f5b4
Commit message:
Tarea 2-Procesadores 2016-2. Aldair Navarro

Changed in this revision

TextLCD.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextLCD.lib	Wed Nov 30 04:02:51 2016 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/avallejopo/code/TextLCD/#aba8ab3dde9d
--- a/main.cpp	Tue Apr 26 04:23:42 2016 +0000
+++ b/main.cpp	Wed Nov 30 04:02:51 2016 +0000
@@ -1,35 +1,59 @@
 #include "mbed.h"
 #include <Pulse1.h>
+#include "TextLCD.h"
 #include "stdio.h" 
 #include "math.h" 
-//control remoto sony disparo camara
-//puede convertir la trama en un entero
-//para cualquier tecla
-PulseInOut irda(PTD5);// en este puerto se pone el sensor infrarrojo
-Serial pc(USBTX, USBRX);
-DigitalOut led(LED1);
-DigitalOut led2(LED2);
-int header =0; //tiempo de cabecera pulso abajo
-const int head_H = 2976; //+10% medida con osciloscopio en microsegundos
-const int head_L = 1984;//-10%  medida con osciloscopio
-int i=0, bin, potencia;
-const int T_alto=1200;//ponga su tiempo de la prueba
-const int T_bajo=639;//ponga su tiempo de la prueba
-const int num_bits = 20;//ponga su numero de bits
-int num[num_bits];//cadena para almacenar todos los tiempos que conforman los bits de datos
-int dato; // tiempo de cada dato que se lee
-int numero;
+
+//===============================================================================CONTROL REMOTO SONY
+
+PulseInOut irda(PTD4);                             //puerto para sensor infrarrojo
+Serial pc(USBTX, USBRX);                           //Para Termite
+DigitalOut led(LED1); DigitalOut led2(LED2);       // Leds
+TextLCD lcd(PTB10, PTB11, PTE2, PTE3, PTE4, PTE5); // LCD
+AnalogIn  y(PTB3);                                 //entrada analoga
+AnalogOut u(PTE30);                                //salida analoga OJO solo se le pueden drenar 1.5mA en circuitos use un Buffer 
+                                                   //si se ignora se daña la FRDMKL25Z
+int header =0;                                   //tiempo de Bit de Inicio (4T)
+int head_H = 2900;                         //20% tiempo de Bit de Inicio
+int head_L= 1900;
+int T_alto=1200;                           //Tiempo maximo de un bit 1
+int T_bajo=600;                            //Tiempo maximo de un bit 0
+int num_bits = 12;                         //Número de bits
+int times[12];                       //almacenador de tiempos de bits
+
+int dato=0;                                      //Tiempo del Bit actual
+int bin[12];                                     //Cadena de Bits                 
+//int Serie[20];                                   //Serie 2^n
+int numero=0;                                    //Numero Decimal del botón
+int boton=0;                                     //boton que se undió
+
+int  Sp=0, Kp=0, Ki=0, Kd=0, pos=1 , i=0 , j=0 , k=0, valPar=0 ;     //Variables
+float pid,ai,ad,ap,med,err,err_v;
+//const int base[]={1,10,100};
+int  C1=0x0F; int C4=0x0C;                           // cursor y cursor bajo
 int binM[20];
-int bin_max[20];
 
 
+//=============================================================================== Prototipo de Funciones 
+void  PID  (int Sp,  int Kp,  int   Ki, int Kd);
+void  LCD1 (int col, int fil, int   val  )     ;
+void  LCD2 (int col, int fil, float val  )     ;
 
-int main(){
-while(1){
-ini1: fflush( stdin );
-      header=0;
-      led2=1;
-      led=1;
+
+//================================================================================ Main - Configuración de Parámetros
+  int main(){
+     lcd.locate(0,1);  lcd.printf("**PID Control**");
+     wait(2); lcd.cls(); lcd.writeCommand(C1);
+    
+     lcd.locate(0,0);    lcd.printf("Sp=%d",Sp);
+     lcd.locate(8,0);    lcd.printf("Kp=%d",Kp);
+     lcd.locate(0,1);    lcd.printf("Ki=%d",Ki);
+     lcd.locate(8,1);    lcd.printf("Kd=%d",Kd);
+
+    while(1){
+      ini1: fflush( stdin );
+         header=0;
+         led2=0;       led=1;
       header = irda.read_low_us();    //funcion para leer un pulso de caida o bajo en header
       if (header > head_L && header < head_H) goto seguir;//verificar que este en la tolerancia +-20%
       else goto ini1;
@@ -40,48 +64,155 @@
       led2=1;
       for(i=0;i<(num_bits-1);++i){ // POR OSCILOSCOPIO se determina que llegan (num_bits),datos
       dato = irda.read_low_us(); //leer un bit de datos que es pulso arriba en este control
-      num[i]=dato;
-      wait_us(400);   
-      }
+      times[i]=dato;
+      wait_us(400);        }
+      
       wait(0.5); //espero un poquito luego de leer todo el arreglo y ponerlo en pantalla 
-      //pc.printf(",%d",header);
-      for(i=0;i<(num_bits-1);++i){  
-      //pc.printf(",%d",num[i]);
-      }
-      wait(0.1);  //espero e imprimo en binario 
-      //pc.printf("\n\n");
+      
+      pc.printf("heder= ,%d\n",header);
+      
+      for(i=0;i<(num_bits-1);++i){pc.printf("%d,",times[i]); }
+      
+      wait(0.1);         pc.printf("\n");
+  
       for(i=0;i<(num_bits-1);++i){  
-       if(num[i] > ((T_alto+T_bajo)/2)){
-        bin_max[i]=1;
-        }
-       else{
-        bin_max[i]=0;
-          }
        
-      }   
-      binM[0]=1;
-      for(i=1;i<(num_bits-1);++i){   
-       binM[i]=binM[i-1]*2;
+       if(times[i] > ((T_alto+T_bajo)/2)){ bin[i]=1;      }
+       else{                             bin[i]=0;      }
        
-       }
+            pc.printf("%d ",bin[i]);      }   
+        
+         pc.printf("\n");
+      
+      
+     binM[0]=1;
+     for(i=1;i<(num_bits-1);++i){   binM[i]=binM[i-1]*2; }
+     
      numero=0;   
-     for(i=0;i<(num_bits-1);++i){  
+     for(i=0;i<(num_bits-1);++i){     numero=numero+(binM[i]*bin[i]);}
+      
+      
+      pc.printf("numero=%d\n",numero);
      
-     numero=numero+(binM[i]*bin_max[i]);
-             
-      }
-      pc.printf("numero=%d",numero);
-      if (numero==466221){
-          led2=0;
-          wait(4);
-          led2=1;
-          goto ini1;
-          }
-      if (numero==466231){
-          led=0;
-          wait(4);
-          led=1;
-          goto ini1;
-          }    
-      }
-      }
\ No newline at end of file
+     if (numero==128){ boton=1 ;} else if (numero==129){ boton=2 ;}                    //boton 1 a 0 normales
+else if (numero==130){ boton=3 ;} else if (numero==131){ boton=4 ;}                    //boton 11 subir,    chan+
+else if (numero==132){ boton=5 ;} else if (numero==133){ boton=6 ;}                    //boton 12 bajar,    chan-
+else if (numero==134){ boton=7 ;} else if (numero==135){ boton=8 ;}                    //boton 13 derecha,  vol+
+else if (numero==136){ boton=9 ;} else if (numero==137){ boton=0 ;}                    //boton 14 derecha,  vol+
+else if (numero==144){ boton=11;} else if (numero==145){ boton=12;}                    //boton 15 ir a PID, MUTE
+else if (numero==146){ boton=13;} else if (numero==147){ boton=14;}
+else if (numero==148){ boton=15;}    else               { boton=16;}
+    
+     //pc.printf("boton= %d\n",boton);
+    wait(0.2);
+ //=================================================================USAR FLECHAS    
+ 
+ switch  (boton)  {                       //Toca bajar al Parámetro //Llegó chan-
+   case 11:                           
+          if (pos==1) {                  
+              if (Sp!=999){ Sp++;  LCD1(3,0,Sp) ; pc.printf("Sp=%d",Sp);}}
+          if (pos==2) {
+              if (Kp!=999){ Kp++;  LCD1(11,0,Kp);pc.printf("Kp=%d",Kp);}}  
+          if (pos==3) {
+              if (Ki!=999){ Ki++;  LCD1(3,1,Ki)  ;pc.printf("Ki=%d",Ki);}}
+          if (pos==4 ){
+              if (Kd!=999){ Kd++;  LCD1(3,11,Kd);pc.printf("Kd=%d",Kd);}}
+                                                        break;
+   
+   case 12:                              //Toca bajar al Parámetro //Llegó chan-
+          
+          if( pos==1 ){               
+              if (Sp!=0) { Sp--;  LCD1(3,0,Sp) ; pc.printf("Sp=%d",Sp);}}
+          if (pos==2) {
+              if (Kp!=0) { Kp--;  LCD1(11,0,Kp); pc.printf("Kp=%d",Kp);}}   
+          if (pos==3) {
+              if (Ki!=0) { Ki--;  LCD1(3,1,Ki) ; pc.printf("Ki=%d",Ki);}}
+          if (pos==4) {
+              if (Kd!=0) { Kd--;  LCD1(3,11,Kd); pc.printf("Kd=%d",Kd);}}
+                                                        break;
+
+   case 13:                                   //Mover hacia derecha, llegó vol+
+      j=0; valPar=0;     
+               if(pos==4){  pos=1; LCD1(3,0,Sp)  ; pc.printf("Sp=%d",Sp);}
+          else if(pos==1){  pos++; LCD1(11,0,Kp) ;pc.printf("Kp=%d",Kp); }     
+          else if(pos==2){  pos++; LCD1(3,1,Ki)  ;pc.printf("Ki=%d",Ki); }  
+          else if(pos==3){  pos++; LCD1(11,1,Kd) ; pc.printf("Kd=%d",Kd); }
+                                                       break;
+   
+   case 14:                                   //Mover hacia derecha, llegó vol-
+      j=0; valPar=0; 
+               if(pos==1){  pos=4; LCD1(11,1,Kd) ; pc.printf("Sp=%d",Sp);}
+          else if(pos==4){  pos--; LCD1(3,1, Ki) ; pc.printf("Kp=%d",Kp);}
+          else if(pos==3){  pos--; LCD1(11,0,Kp) ; pc.printf("Ki=%d",Ki);}
+          else if(pos==2){  pos--; LCD1(3,0, Sp) ; pc.printf("Kd=%d",Kd);}
+                                                      break;
+ 
+   case 15:                                  //ir al PID, llegó Mute          
+          PID(Sp,Kp,Ki,Kd) ;                  break;
+   default:  {};     }                        // cierra Switch
+         
+         
+//=======================================================================Botones
+ if ((boton==0)||(boton==1)||(boton==2)||(boton==3)||(boton==4)||(boton==5)||(boton==6)||(boton==7)||(boton==8)||(boton==9)){
+    if(j<3){  
+       valPar = 10*valPar + boton; 
+       j++;
+    
+      if(pos==1){ Sp=valPar; LCD1(3,0, Sp) ; }
+ else if(pos==2){ Kp=valPar; LCD1(11,0,Kp) ; }
+ else if(pos==3){ Ki=valPar; LCD1(3,1, Ki) ; }
+ else if(pos==4){ Kd=valPar; LCD1(11,1, Kd) ; }   
+      }}
+    
+    } // cierra while 
+}     // cierran Main               
+
+  
+//=================================================================================CICLO PID INFINITO
+void  PID (int Sp, int Kp, int Ki, int Kd) {
+                                            //======================================= Parches del control  
+    lcd.writeCommand(C4);                                     //quita cursor bajo
+    lcd.cls();   lcd.printf("   GUARDADOS!") ; wait(1);       //borra la pantalla
+    lcd.cls();   lcd.printf(" INICIA EL PID"); wait(1);
+    lcd.cls();
+
+    lcd.printf("Er=%3.0f",err);    
+    lcd.locate(8,0);   lcd.printf("Me=%3.0f",med); 
+    lcd.locate(0,1);   lcd.printf("Sp=%3.0f",Sp);     
+    lcd.locate(8,1);   lcd.printf("Co=%3.0f",pid);
+    wait(1);
+
+while(1){      //=============================================================== CICLO PRINCIPAL CONTROLADOR PID
+        med = y.read()*999  ;
+        err = Sp-med        ;                         //se calcula el error
+        ap  = Kp*err*0.01f  ;                        //se calcula la accion proporcinal
+        ai  = (Ki*err*0.01f)+ai    ;                //calculo de la integral del error
+        ad  = Kd*(err-err_v)*0.01f ;                //calculo de la accion derivativa
+        pid = ap+ai+ad             ;                             
+        
+        if(pid<=0)   {pid=0  ;}                      // se verifica que pid sea positivo
+        if(pid > 999){pid=999;}                      // se verifica que pid sea menor a 1000
+     
+        LCD2(3,0,err) ;           // pc.putc(sprintf (mm,"ER%3.0f",err));  wait_ms(30);   
+        LCD2(11,0,med);           // pc.putc(sprintf(mm,"ME%3.0f",med)); wait_ms(30); 
+        LCD2(3,1,Sp)  ; 
+        LCD2(11,1,med);           // pc.putc(sprintf(mm,"ID%3.0f",pid));  wait_ms(30); 
+            
+        err_v = err;                          //  guarda error
+        u.write(pid/999);                     //  se envia el valor pid (normalizado) a puerto analogico de salida (D/A)
+     
+  /*    pc.printf("%3.0f\t",ER);  pc.printf("%3.0f\t",ME);
+        pc.printf("%3.0f\t",SP);  pc.printf("%3.0f\n",ID);*/
+        wait_ms(300);                
+    
+    } //  cierra while
+ }    // funtion
+  
+//==============================================================================Funciones Mostrar en LCD
+void LCD1 (int col, int fil, int val ){  
+     lcd.locate(col,fil);  lcd.printf(" ");                 
+     lcd.locate(col,fil);  lcd.printf("%d", val);  }       
+     
+void LCD2 (int col, int fil, float val ){
+     lcd.locate(col,fil);  lcd.printf("    ");
+     lcd.locate(col,fil);  lcd.printf("%3.0f", val); }  
\ No newline at end of file