Penerapan Fuzzy Logic Untuk Pengontrol Kecepatan Motor Servo Pada Aplikasi Simple Color Tracking

Diagram block.

Pada post sebelumnya, telah dibahas tentang aplikasi Simple Color Tracking. Pada kesempatan kali ini saya coba mengembangkan controller untuk servo dengan menggunakan Fuzzy Control System. Berikut rancangannya.

Fuzzy Control Design

System terdiri dari dua input yaitu error dan del_error_prev. error adalah nilai koordinat warna yang di-tracking yang diolah di PC dan dikirim ke mikrokontroler. Sedangkan del_error_prev adalah nilai error dikurangi error sebelumnya. Dan terdiri dari satu output berupa nilai kecepatan respon servo.

Fungsi keanggotaan untuk error.

TKI : Terlalu Kiri

AKI : Agak Kiri

P : Pas

AKA : Agak Kanan

TKA : Terlalu Kanan

Fungsi keanggotaan untuk del_error_prev.

PTKI : Previous Terlalu Kiri

PAKI : Previous Agak Kiri

PP : Previous Pas

PAKA : Previous Agak Kanan

PTKA : Previous Terlalu Kanan

Fuzzy Rule.

 

Fungsi keanggotaan untuk Output Kecepatan Servo.

SI : Sangat Kiri (di bagian lain disebut KIC : Kiri Cepat)

KI : Kiri

D : Diam

KA : Kanan

SA : Sangat Kanan (di bagian lain disebut KAC : Kanan Cepat)

Electronics Design

Pada post sebelumnya mikrokontroler yang digunakan adalah attiny2313. Akan tetapi karena keterbatasan memori maka untuk versi kali ini digunakanlah ATmega8.

C code function

//==========================================================
// FUZZY CONTROL SYSTEM
//==========================================================
unsigned char equ_aktif_0,equ_aktif_1,equ_aktif_2,equ_aktif_3; 
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5
//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10
//equ_aktif[0-1] kondisi error
//equ_aktif[2-3] kondisi del_error_prev 
float TKI_value,AKI_value,P_value,AKA_value,TKA_value; 
float PTKI_value,PAKI_value,PP_value,PAKA_value,PTKA_value;  
float KIC_value,KI_value,D_value,KA_value,KAC_value;
// Declare your global variables here
void fuzzification(float error, float error_prev)
{   
float del_error_prev;                 
        del_error_prev = error - error_prev; 
TKI_value = 0;
AKI_value = 0;
P_value = 0;
AKA_value = 0;
TKA_value = 0;
PTKI_value = 0;
PAKI_value = 0;
PP_value = 0;
PAKA_value = 0;
PTKA_value = 0;
        //==========================================
        //error
        //==========================================        
        if((error<=-9)&&(error>=-10))//=========1
        {            
                //PORTB = 1;
                TKI_value = 1;    
                equ_aktif_0 = 1;//TKI;  
                equ_aktif_1 = 1;//TKI;   
        }
        else if((error<=-6)&&(error>=-9))//=2
        {                                         
                //PORTB = 2;
                TKI_value = ((-0.333)*error)-2;  
                AKI_value = ((0.333)*error)+3;
                equ_aktif_0 = 1;//TKI;  
                equ_aktif_1 = 2;//AKI;    
        }    
        else if((error<=0)&&(error>=-6))//======3
        {                                
                //PORTB = 3;
                AKI_value = (-0.167)*error;
                P_value = ((0.167)*error)+1;
                equ_aktif_0 = 2;//AKI;  
                equ_aktif_1 = 3;//P;   
        }   
        else if((error<=6)&&(error>=0))//=======4
        {                              
                //PORTB = 4;
                P_value = ((-0.167)*error)+1;  
                AKA_value = (0.167)*error;
                equ_aktif_0 = 3;//P;  
                equ_aktif_1 = 4;//AKA;  
        }
        else if((error<=9)&&(error>=6))//===5
        {                           
                //PORTB = 5;      
                AKA_value = ((-0.333)*error)+3; 
                TKA_value = ((0.333)*error)-2;
                equ_aktif_0 = 4;//AKA;  
                equ_aktif_1 = 5;//TKA;     
        } 
        else if((error<=10)&&(error>=9))//======6
        {                  
                //PORTB = 6;               
                TKA_value = 1;
                equ_aktif_0 = 5;//TKA;  
                equ_aktif_1 = 5;//TKA;     
        }
        //==========================================
        //del_error_prev
        //==========================================          
        if((del_error_prev<=-9)&&(del_error_prev>=-10))//=========1
        {                    
                //PORTB = 7;
                PTKI_value = 1;
                equ_aktif_2 = 6;//PTKI;  
                equ_aktif_3 = 6;//PTKI;   
        }
        else if((del_error_prev<=-6)&&(del_error_prev>=-9))//=2
        {               
                //PORTB = 8;
                PTKI_value = ((-0.333)*del_error_prev)-2;  
                PAKI_value = ((0.333)*del_error_prev)+3;
                equ_aktif_2 = 6;//PTKI;  
                equ_aktif_3 = 7;//PAKI;   
        }    
        else if((del_error_prev<=0)&&(del_error_prev>=-6))//======3
        {               
                //PORTB = 9;
                PAKI_value = (-0.167)*del_error_prev;
                PP_value = ((0.167)*del_error_prev)+1;
                equ_aktif_2 = 7;//PAKI;  
                equ_aktif_3 = 8;//PP;   
        }   
        else if((del_error_prev<=6)&&(del_error_prev>=0))//=======4
        {               
                //PORTB = 10;
                PP_value = ((-0.167)*del_error_prev)+1;  
                PAKA_value = (0.167)*del_error_prev;
                equ_aktif_2 = 8;//PP;  
                equ_aktif_3 = 9;//PAKA; 
        }
        else if((del_error_prev<=9)&&(del_error_prev>=6))//===5
        {              
                //PORTB = 11;                   
                PAKA_value = ((-0.333)*del_error_prev)+3; 
                PTKA_value = ((0.333)*del_error_prev)-2;
                equ_aktif_2 = 9;//PAKA;  
                equ_aktif_3 = 10;//PTKA;      
        } 
        else if((del_error_prev<=10)&&(del_error_prev>=9))//======6
        {             
                //PORTB = 12;                    
                PTKA_value = 1;
                equ_aktif_2 = 10;//PTKA;  
                equ_aktif_3 = 10;//PTKA;    
        }        
}
void inferensi_mamdani_or_sugeno_model()
{    
KIC_value = KI_value = D_value = KA_value = KAC_value = 0;  
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5
//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10                                 
        if( ((equ_aktif_0==1)||(equ_aktif_1==1)) && ((equ_aktif_2==6)||(equ_aktif_3==6))) //=======1   KIC
        {                         
                //CONJUCTION
                if(TKI_value < PTKI_value)
                {
                        KIC_value = TKI_value;        
                }
                else
                {
                        KIC_value = PTKI_value;
                }    
        }   
         if( ((equ_aktif_0==1)||(equ_aktif_1==1)) && ((equ_aktif_2==10)||(equ_aktif_3==10))) //=======2  KI
        {                              
                //CONJUCTION                
                if(TKI_value < PTKA_value)
                {           
                        //DISJUNCTION
                        if(TKI_value > KI_value)
                        {
                                KI_value = TKI_value;      
                        }  
                }
                else
                {       
                        //DISJUNCTION       
                        if(PTKA_value > KI_value)
                        {
                                KI_value = PTKA_value; 
                        }
                }   
        }         
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5
//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10 
        if( ((equ_aktif_0==1)||(equ_aktif_1==1)) && ((equ_aktif_2==9)||(equ_aktif_3==9))) //=======3   KI
        {                              
                //CONJUCTION
                if(TKI_value < PAKA_value)
                {                    
                        //DISJUNCTION
                        if(TKI_value > KI_value)
                        {
                                KI_value = TKI_value;
                        }               
                }
                else
                {                    
                        //DISJUNCTION
                        if(PAKA_value > KI_value)
                        {
                                 KI_value = PAKA_value;
                        }
                }   
        }  
        if( ((equ_aktif_0==2)||(equ_aktif_1==2)) && ((equ_aktif_2==8)||(equ_aktif_3==8))) //=======4    KI
        {                            
                //CONJUCTION
                if(AKI_value < PP_value)
                {                    
                        //DISJUNCTION
                        if(AKI_value > KI_value)
                        {
                                KI_value = AKI_value; 
                        }       
                }
                else
                {                    
                        //DISJUNCTION
                        if(PP_value > KI_value)
                        {
                                KI_value = PP_value;
                        }
                }   
        }                  
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5
//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10 
         if( ((equ_aktif_0==1)||(equ_aktif_1==1)) && ((equ_aktif_2==8)||(equ_aktif_3==8))) //=======5   KI
        {                             
                //CONJUCTION
                if(TKI_value < PP_value)
                {                    
                        //DISJUNCTION
                        if(TKI_value > KI_value)
                        {
                                KI_value = TKI_value;    
                        }    
                }
                else
                {                    
                        //DISJUNCTION
                        if(PP_value > KI_value)
                        {
                                KI_value = PP_value;  
                        }
                }   
        } 
         if( ((equ_aktif_0==2)||(equ_aktif_1==2)) && ((equ_aktif_2==7)||(equ_aktif_3==7))) //=======6   KI
        {                              
                //CONJUCTION
                if(AKI_value < PAKI_value)
                {                    
                        //DISJUNCTION 
                        if(AKI_value > KI_value)
                        {
                                KI_value = AKI_value;
                        }        
                }
                else
                {                    
                        //DISJUNCTION
                        if(PAKI_value > KI_value)
                        {
                                KI_value = PAKI_value;
                        }
                }   
        }                      
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5
//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10 
        if( ((equ_aktif_0==1)||(equ_aktif_1==1)) && ((equ_aktif_2==7)||(equ_aktif_3==7))) //=======7  KI 
        {                              
                //CONJUCTION
                if(TKI_value < PAKI_value)
                {                    
                        //DISJUNCTION
                        if(TKI_value > KI_value)
                        {
                                KI_value = TKI_value;
                        }        
                }
                else
                {                    
                        //DISJUNCTION
                        if(PAKI_value > KI_value)
                        {
                                KI_value = PAKI_value;
                        }
                }   
        }    
        if( ((equ_aktif_0==2)||(equ_aktif_1==2)) && ((equ_aktif_2==6)||(equ_aktif_3==6))) //=======8    KI
        {                  
                //CONJUCTION     
                if(AKI_value < PTKI_value)
                {                    
                        //DISJUNCTION
                        if(AKI_value > KI_value)
                        {
                                KI_value = AKI_value;
                        }        
                }
                else
                {                    
                        //DISJUNCTION
                        if(PTKI_value > KI_value)
                        {
                                KI_value = PTKI_value;
                        }
                }           
        }                                                              
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5
//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10 
        if( ((equ_aktif_0==3)||(equ_aktif_1==3)) && ((equ_aktif_2==6)||(equ_aktif_3==6)))     //=======9    D
        {                               
                //CONJUCTION
                if(P_value < PTKI_value)
                {                    
                        //DISJUNCTION
                        if(P_value > D_value)
                        {
                                D_value = P_value;
                        }        
                }
                else
                {                    
                        //DISJUNCTION
                        if(PTKI_value > D_value)
                        {
                                D_value = PTKI_value;
                        }
                }     
        }
        if( ((equ_aktif_0==4)||(equ_aktif_1==4)) && ((equ_aktif_2==6)||(equ_aktif_3==6))) //=======10   D
        {                               
                //CONJUCTION
                if(AKA_value < PTKI_value)
                {                    
                        //DISJUNCTION
                        if(AKA_value > D_value)
                        {
                                D_value = AKA_value; 
                        }       
                }
                else
                {                    
                        //DISJUNCTION
                        if(PTKI_value > D_value)
                        {
                                D_value = PTKI_value; 
                        }
                }    
        }                                                               
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5
//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10 
        if( ((equ_aktif_0==3)||(equ_aktif_1==3)) && ((equ_aktif_2==7)||(equ_aktif_3==7)))     //=======11  D 
        {                              
                //CONJUCTION
                if(P_value < PAKI_value)
                {                    
                        //DISJUNCTION
                        if(P_value > D_value)
                        {
                                D_value = P_value;  
                        }      
                }
                else
                {                    
                        //DISJUNCTION
                        if(PAKI_value > D_value)
                        {
                                D_value = PAKI_value;
                        }
                }   
        }  
         if( ((equ_aktif_0==4)||(equ_aktif_1==4)) && ((equ_aktif_2==7)||(equ_aktif_3==7))) //=======12   D
        {                             
                //CONJUCTION
                if(AKA_value < PAKI_value)
                {                    
                        //DISJUNCTION
                        if(AKA_value > D_value)
                        {
                                D_value = AKA_value; 
                        }       
                }
                else
                {                    
                        //DISJUNCTION
                        if(PAKI_value > D_value)
                        {
                                D_value = PAKI_value;  
                        }
                }   
        }                                                           
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5
//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10 
        if( ((equ_aktif_0==3)||(equ_aktif_1==3)) && ((equ_aktif_2==8)||(equ_aktif_3==8)))     //=======13     D
        {                              
                //CONJUCTION
                if(P_value < PP_value)
                {                    
                        //DISJUNCTION
                        if(P_value > D_value)
                        {
                                D_value = P_value;
                        }        
                }
                else
                {                    
                        //DISJUNCTION
                        if(PP_value > D_value)
                        {
                                D_value = PP_value; 
                        }
                }   
        }   
        if( ((equ_aktif_0==2)||(equ_aktif_1==2)) && ((equ_aktif_2==9)||(equ_aktif_3==9))) //=======14   D
        {                              
                //CONJUCTION
                if(AKI_value < PAKA_value)
                {                    
                        //DISJUNCTION
                        if(AKI_value > D_value)
                        {
                                D_value = AKI_value;
                        }        
                }
                else
                {                    
                        //DISJUNCTION
                        if(PAKA_value > D_value)
                        {
                                D_value = PAKA_value;
                        }
                }   
        }                                                             
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5
//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10 
        if( ((equ_aktif_0==3)||(equ_aktif_1==3)) && ((equ_aktif_2==9)||(equ_aktif_3==9)))     //=======15 D  
        {                              
                //CONJUCTION     
                if(P_value < PAKA_value)
                {                    
                        //DISJUNCTION
                        if(P_value > D_value)
                        {
                                D_value = P_value;
                        }        
                }
                else
                {                    
                        //DISJUNCTION
                        if(PAKA_value > D_value)
                        {
                                D_value = PAKA_value;
                        }
                }   
        }  
        if( ((equ_aktif_0==3)||(equ_aktif_1==3)) && ((equ_aktif_2==10)||(equ_aktif_3==10)))     //=======16 D  
        {                              
                //CONJUCTION 
                if(P_value < PTKA_value)
                {                    
                        //DISJUNCTION
                        if(P_value > D_value)
                        {
                                D_value = P_value;   
                        }     
                }
                else
                {                    
                        //DISJUNCTION 
                        if(PTKA_value > D_value)
                        {
                                D_value = PTKA_value;
                        }
                }   
        }                                                                    
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5
//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10 
        if( ((equ_aktif_0==2)||(equ_aktif_1==2)) && ((equ_aktif_2==10)||(equ_aktif_3==10))) //=======17  D 
        {                              
                //CONJUCTION        
                if(AKI_value < PTKA_value)
                {                    
                        //DISJUNCTION
                        if(AKI_value > D_value)
                        {
                                D_value = AKI_value; 
                        }       
                }
                else
                {                    
                        //DISJUNCTION
                        if(PTKA_value > D_value)
                        {
                                D_value = PTKA_value;
                        }
                }   
        }
        if( ((equ_aktif_0==5)||(equ_aktif_1==5)) && ((equ_aktif_2==6)||(equ_aktif_3==6))) //=======18  KA 
        {                              
                //CONJUCTION
                if(TKA_value < PTKI_value)
                {                    
                        //DISJUNCTION
                        if(TKA_value > KA_value)
                        {
                                KA_value = TKA_value;    
                        }    
                }
                else
                {                    
                        //DISJUNCTION
                        if(PTKI_value > KA_value)
                        {
                                KA_value = PTKI_value;  
                        }
                }   
        }                  
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5
//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10
        if( ((equ_aktif_0==5)||(equ_aktif_1==5)) && ((equ_aktif_2==7)||(equ_aktif_3==7))) //=======19  KA 
        {                             
                //CONJUCTION
                if(TKA_value < PAKI_value)
                {                    
                        //DISJUNCTION
                        if(TKA_value > KA_value)
                        {
                                KA_value = TKA_value;   
                        }     
                }
                else
                {                    
                        //DISJUNCTION
                        if(PAKI_value > KA_value)
                        {
                                KA_value = PAKI_value;  
                        }
                }          
        }
        if( ((equ_aktif_0==4)||(equ_aktif_1==4)) && ((equ_aktif_2==8)||(equ_aktif_3==8))) //=======20    KA
        {                              
                //CONJUCTION 
                if(AKA_value < PP_value)
                {                    
                        //DISJUNCTION   
                        if(AKA_value > KA_value)
                        {
                                KA_value = AKA_value; 
                        }       
                }
                else
                {                    
                        //DISJUNCTION
                        if(PP_value > KA_value)
                        {
                                KA_value = PP_value;
                        }   
                }
        }                                   
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5
//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10 
        if( ((equ_aktif_0==5)||(equ_aktif_1==5)) && ((equ_aktif_2==8)||(equ_aktif_3==8))) //=======21   KA
        {                              
                //CONJUCTION 
                if(TKA_value < PP_value)
                {                    
                        //DISJUNCTION
                        if(TKA_value > KA_value)
                        {
                                KA_value = TKA_value; 
                        }       
                }
                else
                {                    
                        //DISJUNCTION
                        if(PP_value > KA_value)
                        {
                                KA_value = PP_value;   
                        }
                }  
        }
        if( ((equ_aktif_0==4)||(equ_aktif_1==4)) && ((equ_aktif_2==9)||(equ_aktif_3==9))) //=======22  KA 
        {                              
                //CONJUCTION  
                if(AKA_value < PAKA_value)
                {                    
                        //DISJUNCTION
                        if(AKA_value > KA_value)
                        {
                                KA_value = AKA_value;
                        }        
                }
                else
                {                    
                        //DISJUNCTION
                        if(PAKA_value > KA_value)
                        {
                                KA_value = PAKA_value;
                        }
                }   
        }                                    
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5
//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10 
        if( ((equ_aktif_0==5)||(equ_aktif_1==5)) && ((equ_aktif_2==10)||(equ_aktif_3==10))) //=======23  KA 
        {                              
                //CONJUCTION                
                if(TKA_value < PAKA_value)
                {                    
                        //DISJUNCTION
                        if(TKA_value > KA_value)
                        {
                                KA_value = TKA_value;  
                        }      
                }
                else
                {                    
                        //DISJUNCTION
                        if(PAKA_value > KA_value)
                        {
                                KA_value = PAKA_value;    
                        }
                }   
        }
        if( ((equ_aktif_0==4)||(equ_aktif_1==4)) && ((equ_aktif_2==10)||(equ_aktif_3==10))) //=======24   KA
        {                             
                //CONJUCTION
                if(AKA_value < PTKA_value)
                {                    
                        //DISJUNCTION   
                        if(AKA_value > KA_value)
                        {
                                KA_value = AKA_value;   
                        }     
                }
                else
                {                    
                        //DISJUNCTION    
                        if(PTKA_value > KA_value)
                        {
                                KA_value = PTKA_value; 
                        }
                }      
        }                   
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5
//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10 
        if( ((equ_aktif_0==5)||(equ_aktif_1==5)) && ((equ_aktif_2==10)||(equ_aktif_3==10))) //=======25  KAC 
        {                             
                //CONJUCTION      
                if(TKA_value < PTKA_value)
                {
                        KAC_value = TKA_value;        
                }
                else
                {
                        KAC_value = PTKA_value;
                }     
        }           
}
/==========================================================
// DEFUZZYFICATION SB X
//==========================================================
int defuzzyfication_sugeno()//Height method
{     
int out_pwm;
        out_pwm = (int)(((KIC_value*(-10))+(KI_value*(-3.73))+(D_value*(0))+(KA_value*(3.73))+(KAC_value*(10)))/(KIC_value + KI_value + D_value + KA_value + KAC_value));  
        return(out_pwm);
}
//=================================================================
//==========================================================
// DEFUZZYFICATION SB Y
//==========================================================
int defuzzyfication_sugeno_y()//Height method
{     
int out_pwm_y;
        out_pwm_y = (int)(((KIC_value*(-10))+(KI_value*(-2.95))+(D_value*(0))+(KA_value*(2.95))+(KAC_value*(10)))/(KIC_value + KI_value + D_value + KA_value + KAC_value));  
        return(out_pwm_y);
}
Berikut kode lengkapnya.
/*****************************************************
Chip type           : ATmega8
Program type        : Application
Clock frequency     : 12.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/

#include <mega8.h> 
#include <math.h>

#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif

// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer[rx_wr_index]=data;
   if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
   if (++rx_counter == RX_BUFFER_SIZE)
      {
      rx_counter=0;
      rx_buffer_overflow=1;
      };
   };
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif

// Standard Input/Output functions
#include <stdio.h>
#include <delay.h>
// Declare your global variables here
//==========================================================
// FUZZY X
//==========================================================
unsigned char equ_aktif_0,equ_aktif_1,equ_aktif_2,equ_aktif_3; 
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5

//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10
//equ_aktif[0-1] kondisi error
//equ_aktif[2-3] kondisi del_error_prev 
float TKI_value,AKI_value,P_value,AKA_value,TKA_value; 
float PTKI_value,PAKI_value,PP_value,PAKA_value,PTKA_value;  
float KIC_value,KI_value,D_value,KA_value,KAC_value;
// Declare your global variables here  
   
void fuzzification(float error, float error_prev)
{   
float del_error_prev;                 
        del_error_prev = error - error_prev; 
TKI_value = 0;
AKI_value = 0;
P_value = 0;
AKA_value = 0;
TKA_value = 0;
PTKI_value = 0;
PAKI_value = 0;
PP_value = 0;
PAKA_value = 0;
PTKA_value = 0;
        //==========================================
        //error
        //==========================================        
        if((error<=-9)&&(error>=-10))//=========1
        {            
                //PORTB = 1;
                TKI_value = 1;    
                equ_aktif_0 = 1;//TKI;  
                equ_aktif_1 = 1;//TKI;   
        }
        else if((error<=-6)&&(error>=-9))//=2
        {                                         
                //PORTB = 2;
                TKI_value = ((-0.333)*error)-2;  
                AKI_value = ((0.333)*error)+3;  
                
                equ_aktif_0 = 1;//TKI;  
                equ_aktif_1 = 2;//AKI;    
        }    
        else if((error<=0)&&(error>=-6))//======3
        {                                
                //PORTB = 3;
                AKI_value = (-0.167)*error;
                P_value = ((0.167)*error)+1;  
                
                equ_aktif_0 = 2;//AKI;  
                equ_aktif_1 = 3;//P;   
        }   
        else if((error<=6)&&(error>=0))//=======4
        {                              
                //PORTB = 4;
                P_value = ((-0.167)*error)+1;  
                AKA_value = (0.167)*error; 
                
                equ_aktif_0 = 3;//P;  
                equ_aktif_1 = 4;//AKA;  
        }
        else if((error<=9)&&(error>=6))//===5
        {                           
                //PORTB = 5;      
                AKA_value = ((-0.333)*error)+3; 
                TKA_value = ((0.333)*error)-2; 
                
                equ_aktif_0 = 4;//AKA;  
                equ_aktif_1 = 5;//TKA;     
        } 
        else if((error<=10)&&(error>=9))//======6
        {                  
                //PORTB = 6;               
                TKA_value = 1;
                
                equ_aktif_0 = 5;//TKA;  
                equ_aktif_1 = 5;//TKA;     
        } 
           
        //==========================================
        //del_error_prev
        //==========================================          
        if((del_error_prev<=-9)&&(del_error_prev>=-10))//=========1
        {                    
                //PORTB = 7;
                PTKI_value = 1;    
                
                equ_aktif_2 = 6;//PTKI;  
                equ_aktif_3 = 6;//PTKI;   
        }
        else if((del_error_prev<=-6)&&(del_error_prev>=-9))//=2
        {               
                //PORTB = 8;
                PTKI_value = ((-0.333)*del_error_prev)-2;  
                PAKI_value = ((0.333)*del_error_prev)+3;  
                
                equ_aktif_2 = 6;//PTKI;  
                equ_aktif_3 = 7;//PAKI;   
        }    
        else if((del_error_prev<=0)&&(del_error_prev>=-6))//======3
        {               
                //PORTB = 9;
                PAKI_value = (-0.167)*del_error_prev;
                PP_value = ((0.167)*del_error_prev)+1;  
                
                equ_aktif_2 = 7;//PAKI;  
                equ_aktif_3 = 8;//PP;   
        }   
        else if((del_error_prev<=6)&&(del_error_prev>=0))//=======4
        {               
                //PORTB = 10;
                PP_value = ((-0.167)*del_error_prev)+1;  
                PAKA_value = (0.167)*del_error_prev;  
                
                equ_aktif_2 = 8;//PP;  
                equ_aktif_3 = 9;//PAKA; 
        }
        else if((del_error_prev<=9)&&(del_error_prev>=6))//===5
        {              
                //PORTB = 11;                   
                PAKA_value = ((-0.333)*del_error_prev)+3; 
                PTKA_value = ((0.333)*del_error_prev)-2;
                
                equ_aktif_2 = 9;//PAKA;  
                equ_aktif_3 = 10;//PTKA;      
        } 
        else if((del_error_prev<=10)&&(del_error_prev>=9))//======6
        {             
                //PORTB = 12;                    
                PTKA_value = 1; 
                
                equ_aktif_2 = 10;//PTKA;  
                equ_aktif_3 = 10;//PTKA;    
        }        
} 

void inferensi_mamdani_or_sugeno_model()
{    
KIC_value = KI_value = D_value = KA_value = KAC_value = 0;  
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5

//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10                                 
        if( ((equ_aktif_0==1)||(equ_aktif_1==1)) && ((equ_aktif_2==6)||(equ_aktif_3==6))) //=======1   KIC
        {                         
                //CONJUCTION
                if(TKI_value < PTKI_value)
                {
                        KIC_value = TKI_value;        
                }
                else
                {
                        KIC_value = PTKI_value;
                }    
        }   
         if( ((equ_aktif_0==1)||(equ_aktif_1==1)) && ((equ_aktif_2==10)||(equ_aktif_3==10))) //=======2  KI
        {                              
                //CONJUCTION                
                if(TKI_value < PTKA_value)
                {           
                        //DISJUNCTION
                        if(TKI_value > KI_value)
                        {
                                KI_value = TKI_value;      
                        }  
                }
                else
                {       
                        //DISJUNCTION       
                        if(PTKA_value > KI_value)
                        {
                                KI_value = PTKA_value; 
                        }
                }   
        }         
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5

//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10 
        if( ((equ_aktif_0==1)||(equ_aktif_1==1)) && ((equ_aktif_2==9)||(equ_aktif_3==9))) //=======3   KI
        {                              
                //CONJUCTION
                if(TKI_value < PAKA_value)
                {                    
                        //DISJUNCTION
                        if(TKI_value > KI_value)
                        {
                                KI_value = TKI_value;
                        }               
                }
                else
                {                    
                        //DISJUNCTION
                        if(PAKA_value > KI_value)
                        {
                                 KI_value = PAKA_value;
                        }
                }   
        }  
        if( ((equ_aktif_0==2)||(equ_aktif_1==2)) && ((equ_aktif_2==8)||(equ_aktif_3==8))) //=======4    KI
        {                            
                //CONJUCTION
                if(AKI_value < PP_value)
                {                    
                        //DISJUNCTION
                        if(AKI_value > KI_value)
                        {
                                KI_value = AKI_value; 
                        }       
                }
                else
                {                    
                        //DISJUNCTION
                        if(PP_value > KI_value)
                        {
                                KI_value = PP_value;
                        }
                }   
        }                  
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5

//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10 
         if( ((equ_aktif_0==1)||(equ_aktif_1==1)) && ((equ_aktif_2==8)||(equ_aktif_3==8))) //=======5   KI
        {                             
                //CONJUCTION
                if(TKI_value < PP_value)
                {                    
                        //DISJUNCTION
                        if(TKI_value > KI_value)
                        {
                                KI_value = TKI_value;    
                        }    
                }
                else
                {                    
                        //DISJUNCTION
                        if(PP_value > KI_value)
                        {
                                KI_value = PP_value;  
                        }
                }   
        } 
         if( ((equ_aktif_0==2)||(equ_aktif_1==2)) && ((equ_aktif_2==7)||(equ_aktif_3==7))) //=======6   KI
        {                              
                //CONJUCTION
                if(AKI_value < PAKI_value)
                {                    
                        //DISJUNCTION 
                        if(AKI_value > KI_value)
                        {
                                KI_value = AKI_value;
                        }        
                }
                else
                {                    
                        //DISJUNCTION
                        if(PAKI_value > KI_value)
                        {
                                KI_value = PAKI_value;
                        }
                }   
        }                      
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5

//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10 
        if( ((equ_aktif_0==1)||(equ_aktif_1==1)) && ((equ_aktif_2==7)||(equ_aktif_3==7))) //=======7  KI 
        {                              
                //CONJUCTION
                if(TKI_value < PAKI_value)
                {                    
                        //DISJUNCTION
                        if(TKI_value > KI_value)
                        {
                                KI_value = TKI_value;
                        }        
                }
                else
                {                    
                        //DISJUNCTION
                        if(PAKI_value > KI_value)
                        {
                                KI_value = PAKI_value;
                        }
                }   
        }    
        if( ((equ_aktif_0==2)||(equ_aktif_1==2)) && ((equ_aktif_2==6)||(equ_aktif_3==6))) //=======8    KI
        {                  
                //CONJUCTION     
                if(AKI_value < PTKI_value)
                {                    
                        //DISJUNCTION
                        if(AKI_value > KI_value)
                        {
                                KI_value = AKI_value;
                        }        
                }
                else
                {                    
                        //DISJUNCTION
                        if(PTKI_value > KI_value)
                        {
                                KI_value = PTKI_value;
                        }
                }           
        }                                                              
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5

//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10 
        if( ((equ_aktif_0==3)||(equ_aktif_1==3)) && ((equ_aktif_2==6)||(equ_aktif_3==6)))     //=======9    D
        {                               
                //CONJUCTION
                if(P_value < PTKI_value)
                {                    
                        //DISJUNCTION
                        if(P_value > D_value)
                        {
                                D_value = P_value;
                        }        
                }
                else
                {                    
                        //DISJUNCTION
                        if(PTKI_value > D_value)
                        {
                                D_value = PTKI_value;
                        }
                }     
        }
        if( ((equ_aktif_0==4)||(equ_aktif_1==4)) && ((equ_aktif_2==6)||(equ_aktif_3==6))) //=======10   D
        {                               
                //CONJUCTION
                if(AKA_value < PTKI_value)
                {                    
                        //DISJUNCTION
                        if(AKA_value > D_value)
                        {
                                D_value = AKA_value; 
                        }       
                }
                else
                {                    
                        //DISJUNCTION
                        if(PTKI_value > D_value)
                        {
                                D_value = PTKI_value; 
                        }
                }    
        }                                                               
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5

//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10 
        if( ((equ_aktif_0==3)||(equ_aktif_1==3)) && ((equ_aktif_2==7)||(equ_aktif_3==7)))     //=======11  D 
        {                              
                //CONJUCTION
                if(P_value < PAKI_value)
                {                    
                        //DISJUNCTION
                        if(P_value > D_value)
                        {
                                D_value = P_value;  
                        }      
                }
                else
                {                    
                        //DISJUNCTION
                        if(PAKI_value > D_value)
                        {
                                D_value = PAKI_value;
                        }
                }   
        }  
         if( ((equ_aktif_0==4)||(equ_aktif_1==4)) && ((equ_aktif_2==7)||(equ_aktif_3==7))) //=======12   D
        {                             
                //CONJUCTION
                if(AKA_value < PAKI_value)
                {                    
                        //DISJUNCTION
                        if(AKA_value > D_value)
                        {
                                D_value = AKA_value; 
                        }       
                }
                else
                {                    
                        //DISJUNCTION
                        if(PAKI_value > D_value)
                        {
                                D_value = PAKI_value;  
                        }
                }   
        }                                                           
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5

//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10 
        if( ((equ_aktif_0==3)||(equ_aktif_1==3)) && ((equ_aktif_2==8)||(equ_aktif_3==8)))     //=======13     D
        {                              
                //CONJUCTION
                if(P_value < PP_value)
                {                    
                        //DISJUNCTION
                        if(P_value > D_value)
                        {
                                D_value = P_value;
                        }        
                }
                else
                {                    
                        //DISJUNCTION
                        if(PP_value > D_value)
                        {
                                D_value = PP_value; 
                        }
                }   
        }   
        if( ((equ_aktif_0==2)||(equ_aktif_1==2)) && ((equ_aktif_2==9)||(equ_aktif_3==9))) //=======14   D
        {                              
                //CONJUCTION
                if(AKI_value < PAKA_value)
                {                    
                        //DISJUNCTION
                        if(AKI_value > D_value)
                        {
                                D_value = AKI_value;
                        }        
                }
                else
                {                    
                        //DISJUNCTION
                        if(PAKA_value > D_value)
                        {
                                D_value = PAKA_value;
                        }
                }   
        }                                                             
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5

//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10 
        if( ((equ_aktif_0==3)||(equ_aktif_1==3)) && ((equ_aktif_2==9)||(equ_aktif_3==9)))     //=======15 D  
        {                              
                //CONJUCTION     
                if(P_value < PAKA_value)
                {                    
                        //DISJUNCTION
                        if(P_value > D_value)
                        {
                                D_value = P_value;
                        }        
                }
                else
                {                    
                        //DISJUNCTION
                        if(PAKA_value > D_value)
                        {
                                D_value = PAKA_value;
                        }
                }   
        }  
        if( ((equ_aktif_0==3)||(equ_aktif_1==3)) && ((equ_aktif_2==10)||(equ_aktif_3==10)))     //=======16 D  
        {                              
                //CONJUCTION 
                if(P_value < PTKA_value)
                {                    
                        //DISJUNCTION
                        if(P_value > D_value)
                        {
                                D_value = P_value;   
                        }     
                }
                else
                {                    
                        //DISJUNCTION 
                        if(PTKA_value > D_value)
                        {
                                D_value = PTKA_value;
                        }
                }   
        }                                                                    
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5

//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10 
        if( ((equ_aktif_0==2)||(equ_aktif_1==2)) && ((equ_aktif_2==10)||(equ_aktif_3==10))) //=======17  D 
        {                              
                //CONJUCTION        
                if(AKI_value < PTKA_value)
                {                    
                        //DISJUNCTION
                        if(AKI_value > D_value)
                        {
                                D_value = AKI_value; 
                        }       
                }
                else
                {                    
                        //DISJUNCTION
                        if(PTKA_value > D_value)
                        {
                                D_value = PTKA_value;
                        }
                }   
        }
        if( ((equ_aktif_0==5)||(equ_aktif_1==5)) && ((equ_aktif_2==6)||(equ_aktif_3==6))) //=======18  KA 
        {                              
                //CONJUCTION
                if(TKA_value < PTKI_value)
                {                    
                        //DISJUNCTION
                        if(TKA_value > KA_value)
                        {
                                KA_value = TKA_value;    
                        }    
                }
                else
                {                    
                        //DISJUNCTION
                        if(PTKI_value > KA_value)
                        {
                                KA_value = PTKI_value;  
                        }
                }   
        }                  
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5

//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10 
       
        if( ((equ_aktif_0==5)||(equ_aktif_1==5)) && ((equ_aktif_2==7)||(equ_aktif_3==7))) //=======19  KA 
        {                             
                //CONJUCTION
                if(TKA_value < PAKI_value)
                {                    
                        //DISJUNCTION
                        if(TKA_value > KA_value)
                        {
                                KA_value = TKA_value;   
                        }     
                }
                else
                {                    
                        //DISJUNCTION
                        if(PAKI_value > KA_value)
                        {
                                KA_value = PAKI_value;  
                        }
                }          
        }  
         
        if( ((equ_aktif_0==4)||(equ_aktif_1==4)) && ((equ_aktif_2==8)||(equ_aktif_3==8))) //=======20    KA
        {                              
                //CONJUCTION 
                if(AKA_value < PP_value)
                {                    
                        //DISJUNCTION   
                        if(AKA_value > KA_value)
                        {
                                KA_value = AKA_value; 
                        }       
                }
                else
                {                    
                        //DISJUNCTION
                        if(PP_value > KA_value)
                        {
                                KA_value = PP_value;
                        }   
                }
        }                                   
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5

//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10 
        if( ((equ_aktif_0==5)||(equ_aktif_1==5)) && ((equ_aktif_2==8)||(equ_aktif_3==8))) //=======21   KA
        {                              
                //CONJUCTION 
                if(TKA_value < PP_value)
                {                    
                        //DISJUNCTION
                        if(TKA_value > KA_value)
                        {
                                KA_value = TKA_value; 
                        }       
                }
                else
                {                    
                        //DISJUNCTION
                        if(PP_value > KA_value)
                        {
                                KA_value = PP_value;   
                        }
                }  
        }   
         
        if( ((equ_aktif_0==4)||(equ_aktif_1==4)) && ((equ_aktif_2==9)||(equ_aktif_3==9))) //=======22  KA 
        {                              
                //CONJUCTION  
                if(AKA_value < PAKA_value)
                {                    
                        //DISJUNCTION
                        if(AKA_value > KA_value)
                        {
                                KA_value = AKA_value;
                        }        
                }
                else
                {                    
                        //DISJUNCTION
                        if(PAKA_value > KA_value)
                        {
                                KA_value = PAKA_value;
                        }
                }   
        }                                    
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5

//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10 
        if( ((equ_aktif_0==5)||(equ_aktif_1==5)) && ((equ_aktif_2==10)||(equ_aktif_3==10))) //=======23  KA 
        {                              
                //CONJUCTION                
                if(TKA_value < PAKA_value)
                {                    
                        //DISJUNCTION
                        if(TKA_value > KA_value)
                        {
                                KA_value = TKA_value;  
                        }      
                }
                else
                {                    
                        //DISJUNCTION
                        if(PAKA_value > KA_value)
                        {
                                KA_value = PAKA_value;    
                        }
                }   
        }   
         
        if( ((equ_aktif_0==4)||(equ_aktif_1==4)) && ((equ_aktif_2==10)||(equ_aktif_3==10))) //=======24   KA
        {                             
                //CONJUCTION
                if(AKA_value < PTKA_value)
                {                    
                        //DISJUNCTION   
                        if(AKA_value > KA_value)
                        {
                                KA_value = AKA_value;   
                        }     
                }
                else
                {                    
                        //DISJUNCTION    
                        if(PTKA_value > KA_value)
                        {
                                KA_value = PTKA_value; 
                        }
                }      
        }                   
//TKI   1
//AKI   2
//P     3
//AKA   4
//TKA   5

//PTKI  6
//PAKI  7
//PP    8
//PAKA  9
//PTKA  10 
        if( ((equ_aktif_0==5)||(equ_aktif_1==5)) && ((equ_aktif_2==10)||(equ_aktif_3==10))) //=======25  KAC 
        {                             
                //CONJUCTION      
                if(TKA_value < PTKA_value)
                {
                        KAC_value = TKA_value;        
                }
                else
                {
                        KAC_value = PTKA_value;
                }     
        }           
}
        
int defuzzyfication_sugeno()//Height method
{     
int out_pwm;
        out_pwm = (int)(((KIC_value*(-10))+(KI_value*(-3.73))+(D_value*(0))+(KA_value*(3.73))+(KAC_value*(10)))/(KIC_value + KI_value + D_value + KA_value + KAC_value));  
        return(out_pwm);
} 

//=================================================================
//==========================================================
// FUZZY Y
//==========================================================
        
int defuzzyfication_sugeno_y()//Height method
{     
int out_pwm_y;
        out_pwm_y = (int)(((KIC_value*(-10))+(KI_value*(-2.95))+(D_value*(0))+(KA_value*(2.95))+(KAC_value*(10)))/(KIC_value + KI_value + D_value + KA_value + KAC_value));  
        return(out_pwm_y);
}         



//=================================================================

// Declare your global variables here

void my_delay_us(int n)
{
  while (n--) {
    delay_us(1);
  }
}      

int i1,j1;                           
void reset_servo()
{       
int i;       
i1 = 700;
j1 = 400;
      for(i=0;i<50;i++)
      {
                PORTB.0 = 1;
                my_delay_us(700);
                PORTB.0 = 0;
                delay_ms(20);
      }

       for(i=0;i<50;i++)
      {
                PORTB.1 = 1;
                my_delay_us(400);
                PORTB.1 = 0;
                delay_ms(20);
      }
}         

// Declare your global variables here

void main(void)
{
// Declare your local variables here
unsigned char var1,var2,var12,var22;
int error_act_x,error_act_prev_x;
int error_act_y,error_act_prev_y; 
int out_fuzzy_x,out_fuzzy_y;

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTB=0x00;
DDRB=0x03;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: Off
// USART Mode: Asynchronous
// USART Baud rate: 57600
UCSRA=0x00;
UCSRB=0x90;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x0C;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// Global enable interrupts
#asm("sei")

reset_servo();

error_act_x = 0;
error_act_prev_x = 0;
error_act_y = 0;
error_act_prev_y = 0;

awal:
while (1)
      {
      // Place your code here   
      //============================
      // SUMBU X
      //============================
      var1 = getchar();
      if(var1 == 82)reset_servo();
      if(var1 == 69)goto awal;
      if((var1-48)==1)
      {
        var12 = getchar();
        if(var1 == 82)reset_servo();
        if(var12 == 69)goto awal;  
        error_act_x = (int)var12-48;
      }
      else if((var1-48)==2)
      {
        var12 = getchar();
        if(var1 == 82)reset_servo();
        if(var12 == 69)goto awal;
        error_act_x = 48 - (int)var12; 
      }
      else {}
      
      //============================
      // SUMBU \Y
      //============================
      var2 = getchar();
      if(var1 == 82)reset_servo();
      if(var2 == 69)goto awal;
      if((var2-48)==1)
      {
        var22 = getchar();
        if(var1 == 82)reset_servo();
        if(var22 == 69)goto awal;  
        error_act_y = (int)var22-48;
      }
      else if((var2-48)==2)
      {
        var22 = getchar();
        if(var1 == 82)reset_servo();
        if(var22 == 69)goto awal;
        error_act_y = 48 - (int)var22;  
      }else {}   
                   
      //===================================
      //EXE SB X
      //===================================
      fuzzification((float)error_act_x,(float)error_act_prev_x); 
      inferensi_mamdani_or_sugeno_model();  
      out_fuzzy_x = defuzzyfication_sugeno();
      // EXECUTION  
      if(out_fuzzy_x > 0)
      {   
        PORTB.0 = 1;
        my_delay_us(i1);
        PORTB.0 = 0;
        if(i1 < 1100) i1 = i1 + (out_fuzzy_x);
      }
      else if(out_fuzzy_x < 0)
      {
        PORTB.0 = 1;
        my_delay_us(i1);
        PORTB.0 = 0;
        if(i1 > 400) i1 = i1 + (out_fuzzy_x);
      }
      error_act_prev_x = error_act_x; 
      
      //===================================
      //EXE SB Y
      //===================================
      fuzzification((float)error_act_y,(float)error_act_prev_y); 
      inferensi_mamdani_or_sugeno_model();  
      out_fuzzy_y = defuzzyfication_sugeno_y();
      // EXECUTION  
      if(out_fuzzy_y > 0)
      {   
        PORTB.1 = 1;
        my_delay_us(j1);
        PORTB.1 = 0;
        if(j1 < 700) j1 = j1 + (out_fuzzy_y);
      }
      else if(out_fuzzy_y < 0)
      {
        PORTB.1 = 1;
        my_delay_us(j1);
        PORTB.1 = 0;
        if(j1 > 340) j1 = j1 + (out_fuzzy_y);
      }
      error_act_prev_y = error_act_y;
       
      while(getchar() != 69){};
      goto awal;      
      };
}

_________________________________________________________

Berikut file yang bisa didownload.

http://www.mediafire.com/file/rrzk2rrffkcvkdg/Fuzzy-update_simple_color_tracking_servo_controller.rar

http://www.mediafire.com/file/zc7z1l566l7x8w4/1012_–_Penerapan_Fuzzy_Logic_Untuk_Pengontrol_Kecepatan_Motor_Servo_Pada_Aplikasi_Simple_Color_Tracking.rar


48 Responses to Penerapan Fuzzy Logic Untuk Pengontrol Kecepatan Motor Servo Pada Aplikasi Simple Color Tracking

  1. tri says:

    bisakah menjelaskan perbedaan defuzzyficaton sb x dan y. sedangkan file yang disertakan berupa hex, apa ada yg file teks atau sejenisnya mas wang.

    terimakasih sebelumnya

    • wangready says:

      disain fuzzy yg diatas adalah berdasarkan post aplikasi sebelumnya https://wangready.wordpress.com/2011/02/05/simple-color-tracking-menggunakan-webcam-dengan-library-aforge-net/ yang mana kode tersebut ditanam di mikrokontroler. defuzyfication x dan y adalah fungsi untuk mengolah error dari koordinat pengolahan citra yang dikirim dari PC melaui serial port.
      berikut coding fullnya menggunakan codevisionavr.

      /*****************************************************
      Chip type : ATmega8
      Program type : Application
      Clock frequency : 12.000000 MHz
      Memory model : Small
      External SRAM size : 0
      Data Stack size : 256
      *****************************************************/

      #include mega8.h>
      #include math.h>

      #define RXB8 1
      #define TXB8 0
      #define UPE 2
      #define OVR 3
      #define FE 4
      #define UDRE 5
      #define RXC 7

      #define FRAMING_ERROR (1<<FE)
      #define PARITY_ERROR (1<<UPE)
      #define DATA_OVERRUN (1<<OVR)
      #define DATA_REGISTER_EMPTY (1<<UDRE)
      #define RX_COMPLETE (1<<RXC)

      // USART Receiver buffer
      #define RX_BUFFER_SIZE 8
      char rx_buffer[RX_BUFFER_SIZE];

      #if RX_BUFFER_SIZE<256
      unsigned char rx_wr_index,rx_rd_index,rx_counter;
      #else
      unsigned int rx_wr_index,rx_rd_index,rx_counter;
      #endif

      // This flag is set on USART Receiver buffer overflow
      bit rx_buffer_overflow;

      // USART Receiver interrupt service routine
      interrupt [USART_RXC] void usart_rx_isr(void)
      {
      char status,data;
      status=UCSRA;
      data=UDR;
      if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
      {
      rx_buffer[rx_wr_index]=data;
      if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
      if (++rx_counter == RX_BUFFER_SIZE)
      {
      rx_counter=0;
      rx_buffer_overflow=1;
      };
      };
      }

      #ifndef _DEBUG_TERMINAL_IO_
      // Get a character from the USART Receiver buffer
      #define _ALTERNATE_GETCHAR_
      #pragma used+
      char getchar(void)
      {
      char data;
      while (rx_counter==0);
      data=rx_buffer[rx_rd_index];
      if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
      #asm("cli")
      –rx_counter;
      #asm("sei")
      return data;
      }
      #pragma used-
      #endif

      // Standard Input/Output functions
      #include
      #include
      // Declare your global variables here
      //==========================================================
      // FUZZY X
      //==========================================================
      unsigned char equ_aktif_0,equ_aktif_1,equ_aktif_2,equ_aktif_3;
      //TKI 1
      //AKI 2
      //P 3
      //AKA 4
      //TKA 5

      //PTKI 6
      //PAKI 7
      //PP 8
      //PAKA 9
      //PTKA 10
      //equ_aktif[0-1] kondisi error
      //equ_aktif[2-3] kondisi del_error_prev
      float TKI_value,AKI_value,P_value,AKA_value,TKA_value;
      float PTKI_value,PAKI_value,PP_value,PAKA_value,PTKA_value;
      float KIC_value,KI_value,D_value,KA_value,KAC_value;
      // Declare your global variables here

      void fuzzification(float error, float error_prev)
      {
      float del_error_prev;
      del_error_prev = error – error_prev;
      TKI_value = 0;
      AKI_value = 0;
      P_value = 0;
      AKA_value = 0;
      TKA_value = 0;
      PTKI_value = 0;
      PAKI_value = 0;
      PP_value = 0;
      PAKA_value = 0;
      PTKA_value = 0;
      //==========================================
      //error
      //==========================================
      if((error=-10))//=========1
      {
      //PORTB = 1;
      TKI_value = 1;
      equ_aktif_0 = 1;//TKI;
      equ_aktif_1 = 1;//TKI;
      }
      else if((error=-9))//=2
      {
      //PORTB = 2;
      TKI_value = ((-0.333)*error)-2;
      AKI_value = ((0.333)*error)+3;

      equ_aktif_0 = 1;//TKI;
      equ_aktif_1 = 2;//AKI;
      }
      else if((error=-6))//======3
      {
      //PORTB = 3;
      AKI_value = (-0.167)*error;
      P_value = ((0.167)*error)+1;

      equ_aktif_0 = 2;//AKI;
      equ_aktif_1 = 3;//P;
      }
      else if((error=0))//=======4
      {
      //PORTB = 4;
      P_value = ((-0.167)*error)+1;
      AKA_value = (0.167)*error;

      equ_aktif_0 = 3;//P;
      equ_aktif_1 = 4;//AKA;
      }
      else if((error=6))//===5
      {
      //PORTB = 5;
      AKA_value = ((-0.333)*error)+3;
      TKA_value = ((0.333)*error)-2;

      equ_aktif_0 = 4;//AKA;
      equ_aktif_1 = 5;//TKA;
      }
      else if((error=9))//======6
      {
      //PORTB = 6;
      TKA_value = 1;

      equ_aktif_0 = 5;//TKA;
      equ_aktif_1 = 5;//TKA;
      }

      //==========================================
      //del_error_prev
      //==========================================
      if((del_error_prev=-10))//=========1
      {
      //PORTB = 7;
      PTKI_value = 1;

      equ_aktif_2 = 6;//PTKI;
      equ_aktif_3 = 6;//PTKI;
      }
      else if((del_error_prev=-9))//=2
      {
      //PORTB = 8;
      PTKI_value = ((-0.333)*del_error_prev)-2;
      PAKI_value = ((0.333)*del_error_prev)+3;

      equ_aktif_2 = 6;//PTKI;
      equ_aktif_3 = 7;//PAKI;
      }
      else if((del_error_prev=-6))//======3
      {
      //PORTB = 9;
      PAKI_value = (-0.167)*del_error_prev;
      PP_value = ((0.167)*del_error_prev)+1;

      equ_aktif_2 = 7;//PAKI;
      equ_aktif_3 = 8;//PP;
      }
      else if((del_error_prev=0))//=======4
      {
      //PORTB = 10;
      PP_value = ((-0.167)*del_error_prev)+1;
      PAKA_value = (0.167)*del_error_prev;

      equ_aktif_2 = 8;//PP;
      equ_aktif_3 = 9;//PAKA;
      }
      else if((del_error_prev=6))//===5
      {
      //PORTB = 11;
      PAKA_value = ((-0.333)*del_error_prev)+3;
      PTKA_value = ((0.333)*del_error_prev)-2;

      equ_aktif_2 = 9;//PAKA;
      equ_aktif_3 = 10;//PTKA;
      }
      else if((del_error_prev=9))//======6
      {
      //PORTB = 12;
      PTKA_value = 1;

      equ_aktif_2 = 10;//PTKA;
      equ_aktif_3 = 10;//PTKA;
      }
      }

      void inferensi_mamdani_or_sugeno_model()
      {
      KIC_value = KI_value = D_value = KA_value = KAC_value = 0;
      //TKI 1
      //AKI 2
      //P 3
      //AKA 4
      //TKA 5

      //PTKI 6
      //PAKI 7
      //PP 8
      //PAKA 9
      //PTKA 10
      if( ((equ_aktif_0==1)||(equ_aktif_1==1)) && ((equ_aktif_2==6)||(equ_aktif_3==6))) //=======1 KIC
      {
      //CONJUCTION
      if(TKI_value < PTKI_value)
      {
      KIC_value = TKI_value;
      }
      else
      {
      KIC_value = PTKI_value;
      }
      }
      if( ((equ_aktif_0==1)||(equ_aktif_1==1)) && ((equ_aktif_2==10)||(equ_aktif_3==10))) //=======2 KI
      {
      //CONJUCTION
      if(TKI_value KI_value)
      {
      KI_value = TKI_value;
      }
      }
      else
      {
      //DISJUNCTION
      if(PTKA_value > KI_value)
      {
      KI_value = PTKA_value;
      }
      }
      }
      //TKI 1
      //AKI 2
      //P 3
      //AKA 4
      //TKA 5

      //PTKI 6
      //PAKI 7
      //PP 8
      //PAKA 9
      //PTKA 10
      if( ((equ_aktif_0==1)||(equ_aktif_1==1)) && ((equ_aktif_2==9)||(equ_aktif_3==9))) //=======3 KI
      {
      //CONJUCTION
      if(TKI_value KI_value)
      {
      KI_value = TKI_value;
      }
      }
      else
      {
      //DISJUNCTION
      if(PAKA_value > KI_value)
      {
      KI_value = PAKA_value;
      }
      }
      }
      if( ((equ_aktif_0==2)||(equ_aktif_1==2)) && ((equ_aktif_2==8)||(equ_aktif_3==8))) //=======4 KI
      {
      //CONJUCTION
      if(AKI_value KI_value)
      {
      KI_value = AKI_value;
      }
      }
      else
      {
      //DISJUNCTION
      if(PP_value > KI_value)
      {
      KI_value = PP_value;
      }
      }
      }
      //TKI 1
      //AKI 2
      //P 3
      //AKA 4
      //TKA 5

      //PTKI 6
      //PAKI 7
      //PP 8
      //PAKA 9
      //PTKA 10
      if( ((equ_aktif_0==1)||(equ_aktif_1==1)) && ((equ_aktif_2==8)||(equ_aktif_3==8))) //=======5 KI
      {
      //CONJUCTION
      if(TKI_value KI_value)
      {
      KI_value = TKI_value;
      }
      }
      else
      {
      //DISJUNCTION
      if(PP_value > KI_value)
      {
      KI_value = PP_value;
      }
      }
      }
      if( ((equ_aktif_0==2)||(equ_aktif_1==2)) && ((equ_aktif_2==7)||(equ_aktif_3==7))) //=======6 KI
      {
      //CONJUCTION
      if(AKI_value KI_value)
      {
      KI_value = AKI_value;
      }
      }
      else
      {
      //DISJUNCTION
      if(PAKI_value > KI_value)
      {
      KI_value = PAKI_value;
      }
      }
      }
      //TKI 1
      //AKI 2
      //P 3
      //AKA 4
      //TKA 5

      //PTKI 6
      //PAKI 7
      //PP 8
      //PAKA 9
      //PTKA 10
      if( ((equ_aktif_0==1)||(equ_aktif_1==1)) && ((equ_aktif_2==7)||(equ_aktif_3==7))) //=======7 KI
      {
      //CONJUCTION
      if(TKI_value KI_value)
      {
      KI_value = TKI_value;
      }
      }
      else
      {
      //DISJUNCTION
      if(PAKI_value > KI_value)
      {
      KI_value = PAKI_value;
      }
      }
      }
      if( ((equ_aktif_0==2)||(equ_aktif_1==2)) && ((equ_aktif_2==6)||(equ_aktif_3==6))) //=======8 KI
      {
      //CONJUCTION
      if(AKI_value KI_value)
      {
      KI_value = AKI_value;
      }
      }
      else
      {
      //DISJUNCTION
      if(PTKI_value > KI_value)
      {
      KI_value = PTKI_value;
      }
      }
      }
      //TKI 1
      //AKI 2
      //P 3
      //AKA 4
      //TKA 5

      //PTKI 6
      //PAKI 7
      //PP 8
      //PAKA 9
      //PTKA 10
      if( ((equ_aktif_0==3)||(equ_aktif_1==3)) && ((equ_aktif_2==6)||(equ_aktif_3==6))) //=======9 D
      {
      //CONJUCTION
      if(P_value D_value)
      {
      D_value = P_value;
      }
      }
      else
      {
      //DISJUNCTION
      if(PTKI_value > D_value)
      {
      D_value = PTKI_value;
      }
      }
      }
      if( ((equ_aktif_0==4)||(equ_aktif_1==4)) && ((equ_aktif_2==6)||(equ_aktif_3==6))) //=======10 D
      {
      //CONJUCTION
      if(AKA_value D_value)
      {
      D_value = AKA_value;
      }
      }
      else
      {
      //DISJUNCTION
      if(PTKI_value > D_value)
      {
      D_value = PTKI_value;
      }
      }
      }
      //TKI 1
      //AKI 2
      //P 3
      //AKA 4
      //TKA 5

      //PTKI 6
      //PAKI 7
      //PP 8
      //PAKA 9
      //PTKA 10
      if( ((equ_aktif_0==3)||(equ_aktif_1==3)) && ((equ_aktif_2==7)||(equ_aktif_3==7))) //=======11 D
      {
      //CONJUCTION
      if(P_value D_value)
      {
      D_value = P_value;
      }
      }
      else
      {
      //DISJUNCTION
      if(PAKI_value > D_value)
      {
      D_value = PAKI_value;
      }
      }
      }
      if( ((equ_aktif_0==4)||(equ_aktif_1==4)) && ((equ_aktif_2==7)||(equ_aktif_3==7))) //=======12 D
      {
      //CONJUCTION
      if(AKA_value D_value)
      {
      D_value = AKA_value;
      }
      }
      else
      {
      //DISJUNCTION
      if(PAKI_value > D_value)
      {
      D_value = PAKI_value;
      }
      }
      }
      //TKI 1
      //AKI 2
      //P 3
      //AKA 4
      //TKA 5

      //PTKI 6
      //PAKI 7
      //PP 8
      //PAKA 9
      //PTKA 10
      if( ((equ_aktif_0==3)||(equ_aktif_1==3)) && ((equ_aktif_2==8)||(equ_aktif_3==8))) //=======13 D
      {
      //CONJUCTION
      if(P_value D_value)
      {
      D_value = P_value;
      }
      }
      else
      {
      //DISJUNCTION
      if(PP_value > D_value)
      {
      D_value = PP_value;
      }
      }
      }
      if( ((equ_aktif_0==2)||(equ_aktif_1==2)) && ((equ_aktif_2==9)||(equ_aktif_3==9))) //=======14 D
      {
      //CONJUCTION
      if(AKI_value D_value)
      {
      D_value = AKI_value;
      }
      }
      else
      {
      //DISJUNCTION
      if(PAKA_value > D_value)
      {
      D_value = PAKA_value;
      }
      }
      }
      //TKI 1
      //AKI 2
      //P 3
      //AKA 4
      //TKA 5

      //PTKI 6
      //PAKI 7
      //PP 8
      //PAKA 9
      //PTKA 10
      if( ((equ_aktif_0==3)||(equ_aktif_1==3)) && ((equ_aktif_2==9)||(equ_aktif_3==9))) //=======15 D
      {
      //CONJUCTION
      if(P_value D_value)
      {
      D_value = P_value;
      }
      }
      else
      {
      //DISJUNCTION
      if(PAKA_value > D_value)
      {
      D_value = PAKA_value;
      }
      }
      }
      if( ((equ_aktif_0==3)||(equ_aktif_1==3)) && ((equ_aktif_2==10)||(equ_aktif_3==10))) //=======16 D
      {
      //CONJUCTION
      if(P_value D_value)
      {
      D_value = P_value;
      }
      }
      else
      {
      //DISJUNCTION
      if(PTKA_value > D_value)
      {
      D_value = PTKA_value;
      }
      }
      }
      //TKI 1
      //AKI 2
      //P 3
      //AKA 4
      //TKA 5

      //PTKI 6
      //PAKI 7
      //PP 8
      //PAKA 9
      //PTKA 10
      if( ((equ_aktif_0==2)||(equ_aktif_1==2)) && ((equ_aktif_2==10)||(equ_aktif_3==10))) //=======17 D
      {
      //CONJUCTION
      if(AKI_value D_value)
      {
      D_value = AKI_value;
      }
      }
      else
      {
      //DISJUNCTION
      if(PTKA_value > D_value)
      {
      D_value = PTKA_value;
      }
      }
      }
      if( ((equ_aktif_0==5)||(equ_aktif_1==5)) && ((equ_aktif_2==6)||(equ_aktif_3==6))) //=======18 KA
      {
      //CONJUCTION
      if(TKA_value KA_value)
      {
      KA_value = TKA_value;
      }
      }
      else
      {
      //DISJUNCTION
      if(PTKI_value > KA_value)
      {
      KA_value = PTKI_value;
      }
      }
      }
      //TKI 1
      //AKI 2
      //P 3
      //AKA 4
      //TKA 5

      //PTKI 6
      //PAKI 7
      //PP 8
      //PAKA 9
      //PTKA 10

      if( ((equ_aktif_0==5)||(equ_aktif_1==5)) && ((equ_aktif_2==7)||(equ_aktif_3==7))) //=======19 KA
      {
      //CONJUCTION
      if(TKA_value KA_value)
      {
      KA_value = TKA_value;
      }
      }
      else
      {
      //DISJUNCTION
      if(PAKI_value > KA_value)
      {
      KA_value = PAKI_value;
      }
      }
      }

      if( ((equ_aktif_0==4)||(equ_aktif_1==4)) && ((equ_aktif_2==8)||(equ_aktif_3==8))) //=======20 KA
      {
      //CONJUCTION
      if(AKA_value KA_value)
      {
      KA_value = AKA_value;
      }
      }
      else
      {
      //DISJUNCTION
      if(PP_value > KA_value)
      {
      KA_value = PP_value;
      }
      }
      }
      //TKI 1
      //AKI 2
      //P 3
      //AKA 4
      //TKA 5

      //PTKI 6
      //PAKI 7
      //PP 8
      //PAKA 9
      //PTKA 10
      if( ((equ_aktif_0==5)||(equ_aktif_1==5)) && ((equ_aktif_2==8)||(equ_aktif_3==8))) //=======21 KA
      {
      //CONJUCTION
      if(TKA_value KA_value)
      {
      KA_value = TKA_value;
      }
      }
      else
      {
      //DISJUNCTION
      if(PP_value > KA_value)
      {
      KA_value = PP_value;
      }
      }
      }

      if( ((equ_aktif_0==4)||(equ_aktif_1==4)) && ((equ_aktif_2==9)||(equ_aktif_3==9))) //=======22 KA
      {
      //CONJUCTION
      if(AKA_value KA_value)
      {
      KA_value = AKA_value;
      }
      }
      else
      {
      //DISJUNCTION
      if(PAKA_value > KA_value)
      {
      KA_value = PAKA_value;
      }
      }
      }
      //TKI 1
      //AKI 2
      //P 3
      //AKA 4
      //TKA 5

      //PTKI 6
      //PAKI 7
      //PP 8
      //PAKA 9
      //PTKA 10
      if( ((equ_aktif_0==5)||(equ_aktif_1==5)) && ((equ_aktif_2==10)||(equ_aktif_3==10))) //=======23 KA
      {
      //CONJUCTION
      if(TKA_value KA_value)
      {
      KA_value = TKA_value;
      }
      }
      else
      {
      //DISJUNCTION
      if(PAKA_value > KA_value)
      {
      KA_value = PAKA_value;
      }
      }
      }

      if( ((equ_aktif_0==4)||(equ_aktif_1==4)) && ((equ_aktif_2==10)||(equ_aktif_3==10))) //=======24 KA
      {
      //CONJUCTION
      if(AKA_value KA_value)
      {
      KA_value = AKA_value;
      }
      }
      else
      {
      //DISJUNCTION
      if(PTKA_value > KA_value)
      {
      KA_value = PTKA_value;
      }
      }
      }
      //TKI 1
      //AKI 2
      //P 3
      //AKA 4
      //TKA 5

      //PTKI 6
      //PAKI 7
      //PP 8
      //PAKA 9
      //PTKA 10
      if( ((equ_aktif_0==5)||(equ_aktif_1==5)) && ((equ_aktif_2==10)||(equ_aktif_3==10))) //=======25 KAC
      {
      //CONJUCTION
      if(TKA_value < PTKA_value)
      {
      KAC_value = TKA_value;
      }
      else
      {
      KAC_value = PTKA_value;
      }
      }
      }

      int defuzzyfication_sugeno()//Height method
      {
      int out_pwm;
      out_pwm = (int)(((KIC_value*(-10))+(KI_value*(-3.73))+(D_value*(0))+(KA_value*(3.73))+(KAC_value*(10)))/(KIC_value + KI_value + D_value + KA_value + KAC_value));
      return(out_pwm);
      }

      //=================================================================
      //==========================================================
      // FUZZY Y
      //==========================================================

      int defuzzyfication_sugeno_y()//Height method
      {
      int out_pwm_y;
      out_pwm_y = (int)(((KIC_value*(-10))+(KI_value*(-2.95))+(D_value*(0))+(KA_value*(2.95))+(KAC_value*(10)))/(KIC_value + KI_value + D_value + KA_value + KAC_value));
      return(out_pwm_y);
      }

      //=================================================================

      // Declare your global variables here

      void my_delay_us(int n)
      {
      while (n–) {
      delay_us(1);
      }
      }

      int i1,j1;
      void reset_servo()
      {
      int i;
      i1 = 700;
      j1 = 400;
      for(i=0;i<50;i++)
      {
      PORTB.0 = 1;
      my_delay_us(700);
      PORTB.0 = 0;
      delay_ms(20);
      }

      for(i=0;i 0)
      {
      PORTB.0 = 1;
      my_delay_us(i1);
      PORTB.0 = 0;
      if(i1 < 1100) i1 = i1 + (out_fuzzy_x);
      }
      else if(out_fuzzy_x 400) i1 = i1 + (out_fuzzy_x);
      }
      error_act_prev_x = error_act_x;

      //===================================
      //EXE SB Y
      //===================================
      fuzzification((float)error_act_y,(float)error_act_prev_y);
      inferensi_mamdani_or_sugeno_model();
      out_fuzzy_y = defuzzyfication_sugeno_y();
      // EXECUTION
      if(out_fuzzy_y > 0)
      {
      PORTB.1 = 1;
      my_delay_us(j1);
      PORTB.1 = 0;
      if(j1 < 700) j1 = j1 + (out_fuzzy_y);
      }
      else if(out_fuzzy_y 340) j1 = j1 + (out_fuzzy_y);
      }
      error_act_prev_y = error_act_y;

      while(getchar() != 69){};
      goto awal;
      };
      }

  2. mantap GAN.. dah lama ane cari2…
    oa, kalo untuk mendapatkan nilai input error dan del_error_prev. itu gmn gan..?

    • wangready says:

      error kan nilai saat sekarang, sedangkan error_prev adalah error sebelumnya terhadap proses. jadi error_prev sama dengan nilai error yang setelah proses sebelum nilai error di update kembali. untuk nilai del_error_prev berarti nilai selisih antara error dan error_prev yang dihitung sebelum proses.
      while(1)
      {
      error = baca_sensor();
      del_error_prev = error – error_prev;
      Proses();
      error_prev = error;
      }

      • maikal says:

        gan, kalau dr codingan di atas adanya cuma ini

        void fuzzification(float error, float error_prev)
        {
        float del_error_prev;
        del_error_prev = error – error_prev;

        terus masuknya error dan delta error dimana??
        cuma jadi float doang belum dimasukkin.,

      • wangready says:

        itu prosedur gan, nilainya dimasukin saat dipanggil di program utama…misal kita ambil data error dari serial berarti
        data1 = (float)getchar();
        data2 = (float)getchar();
        fuzzification(data1, data2);

  3. maikal says:

    gan, program sama simulasi yang diberikan di download kok beda ya??
    codingannya seperti diatas tadi simulasi proteusnya beda.,
    tolong diperbaiki dung.

    • wangready says:

      ane gk pake simulasi proteus gan. itu simulasi fuzzyTech. programnya emang ane update, ada di bagian bawah postingan atau d komen. ane jg udah lupa filenya.

      • maikal says:

        mau nanya lagi gan.,
        kalau mencari nilai TKI value,AKI_value, dll dikali dengan 0,333 ; 0,167 dll, nilai – nilai ini berasal dari mana ya???

      • wangready says:

        itu ane cari dari persamaan linier untuk menghitung derajat keanggotaan. nilai gradien dari y=mx+c berdasarkan kurva fungsi keanggotaan

  4. magicslap says:

    Kak, anak telkom ya? hehe
    mw nanya nih kk, ane masih newbie banget dngan codingan codevisionavr maksud dari :

    TKI_value = 0;
    AKI_value = 0;
    P_value = 0;
    AKA_value = 0;
    knapa nilainya harus 0??

    TKI_value = 1;
    equ_aktif_0 = 1;//TKI;
    equ_aktif_1 = 1;//TKI;

    Equ_aktif itu gunanya buat apa? kenpa nilainy 1 dan 0, terus yang pas di derror nilany 2 dan 3?

    ane anak telkom juga kk..mhon bntuannya ya. hehehe

    • wangready says:

      yg nilainya 0 itu inisialisasi awal perhitungan.
      Equ_aktif adalah variabel untuk membedakan kategori dari variabel linguistik input. menurut saya itu relatif, tergantung dari cara programmernya merepresentasikan logika fuzzy…

  5. budi wibowo says:

    tolong donk di-posting artikel + source code untuk mobil robot keseimbangan dengan fuzzy logic

  6. budi wibowo says:

    thankyu bang wang atas artikelnya sangat membantu sekali, mau nanya nih dari coding diatas struktur untuk main programnya gimana ya?koq gak di tampilkan, jadi:
    void main (void)
    {
    while(1)
    {
    —————-
    —————-
    }
    }

    • wangready says:

      udah ane update gan, silakan liat lg di atas…

      • budi wibowo says:

        maaf bang masih awam tentang FLC, jadi untuk program utamanya misal dibuat struktur:
        while(1)
        {
        data = baca_sensor()
        fuzzifikasi()
        inferensi()
        defuzzifikasi()
        }
        bisa gak ya?
        sama sekalian minta link untuk software Fuzzytech-nya kalo ada. trim

      • wangready says:

        sya jg gtu polanya…fuzzy tech saya cari d forum sonsviri…

      • budi wibowo says:

        di program utama ada instruksi:
        fuzzification((float)error_act_x,(float)error_act_prev_x); kalo gak salah instruksi ini kan untuk memanggil prosedur (yg ada diatas):
        void fuzzification(float error, float error_prev)
        tapi dengan penamaan label yg beda error_act_prev_x dan error_act_x dengan error dan error_prev apa gak masalah?mohon pencerahannya.

      • wangready says:

        iya gan beda, float error, float error_prev adalah variabel lokal buat prosedur fuzzification saja, tdk bisa diakses dialuar prosedur tersebut. sedangkan (float)error_act_x,(float)error_act_prev_x adalah variabel lokal di program utama.

  7. budi wibowo says:

    maaf ni gan nanya lagi, jadi ketika instruksi fuzzification ((float)error_act_x, (float)error_act_prev_x) pada program utama di akses, dia loncat ke prosedur void fuzzification (float error, float error_prev) untuk menjalankan isi coding didalamnya apa tidak?
    jenis motor servo yang digunakan apa ya? (standard atau continous rotation)?

  8. andi says:

    gan, mau nanya, kira2 bentuk program fuzzy logic controller di atas bisa diterapkan gk pada quadcopter baling2 yg jumlahnya 4??
    Jadi program FLCnya digunakan mengatur kestabilan quadcopter pada saat terbang dengan input error sudut pada sumbu x dan y, dari senssor accelerometer dan gyroscope..
    Jika dikasih digangguan quadcopter akan stabil kembali pada sudut 0 thd smbu x dan y.
    Mohon pencerahannya mas..
    Mkasih

    • wangready says:

      saya gk terlalu mengerti kontrol gan. kalo saya pribadi, kalo ngoprek2 lebih puas dengan hasil kontrol PID daripada fuzzy control, soalnya saya gk bisa bikin sistem dengan pemodelan segala macem. kalo PID kan cukup tunning Kp Ki Kd nya…tapi kalo dihitung pemodelannya segala macem, saya kira fuzzy control bisa lebih baik hasilnya…
      dicoba aja dulu gan pake fuzzy control, soalnya disain tiap orang bisa beda2 sesuai pendekatan masing2…

      • andi says:

        Mas, mau nanya lg,
        Pada fungsi keanggotaan error : -9<=error<=-6, pada script di bawah;

        else if((error=-9))//=2
        {
        //PORTB = 2;
        TKI_value = ((-0.333)*error)-2;
        AKI_value = ((0.333)*error)+3;
        equ_aktif_0 = 1;//TKI;
        equ_aktif_1 = 2;//AKI;
        }

        Mau nanya, gmana sih mendapatkan nilai
        TKI_value = ((-0.333)*error)-2;
        AKI_value = ((0.333)*error)+3;
        ???
        Mohon donk penjelasan penurunan nilainya…
        sangat berharap bangat mas…
        Trimkasih banyak

      • wangready says:

        itu persamaan linier gan untuk bentuk fuzzyfikasinya sesuai dengan desain input grafik kurva fuzzy nya…
        tp kode di postingan ini kurang simpel gan…
        biar lebih simpel mendesain fuzzy nya bisa pake .c yang udah saya buat. Contohnya ada di sini https://wangready.wordpress.com/2013/03/05/fuzzy-logic-untuk-kontrol-posisi-motor-dc/

  9. andi says:

    void fuzzifikasi_quad() //fuzzifikasi
    {
    NE=0;
    ME=0;
    PE=0;

    ND=0;
    MD=0;
    PD=0;

    NI=0;
    MI=0;
    PI=0;

    //==========================================
    //Error
    //==========================================
    if((XERROR=-10))
    {

    NE = 1; //=========1
    equ_aktif_0 = 1;//NE;
    equ_aktif_1 = 1;//NE;
    }
    else if((XERROR=-0.2))
    {

    NE = (-5)*XERROR; //=========2
    ME = ((10)*XERROR)+1; //=========3
    equ_aktif_0 = 1;//NE;
    equ_aktif_1 = 2;//ME;
    }
    else if((XERROR=0))
    {

    ME = ((-10)*XERROR)+1;//=========4
    PE = ((5)*XERROR);//=========5
    equ_aktif_0 = 2;//ME;
    equ_aktif_1 = 3;//PE;
    }
    else if((XERROR=0.2))
    {
    PE=1;//=========6
    equ_aktif_0 = 3;//PE;
    equ_aktif_1 = 3;//PE;
    }

    //==========================================
    //DIFERENTIAL
    //==========================================
    if((XDIFFERENTIAL=-20))
    {

    ND = 1; //=========1
    equ_aktif_2 = 4;//ND;
    equ_aktif_3 = 4;//ND;
    }
    else if((XDIFFERENTIAL=-1))
    {

    ND = ((-1.333)*XDIFFERENTIAL)-0.333; //=========2
    MD = XDIFFERENTIAL+1; //=========3
    equ_aktif_2 = 4;//ND;
    equ_aktif_3 = 5;//MD;
    }
    else if((XDIFFERENTIAL=0))
    {

    MD = ((-1)*XDIFFERENTIAL)+1;//=========4
    PD = ((1.333)*XDIFFERENTIAL)-0.333;//=========5
    equ_aktif_2 = 5;//MD;
    equ_aktif_3 = 6;//PD;
    }
    else if((XDIFFERENTIAL=1))
    {
    PD=1;//=========6
    equ_aktif_2 = 6;//PD;
    equ_aktif_3 = 6;//PD;
    }

    //==========================================
    //INTEGRAL
    //==========================================
    if((XINTEGRAL=-20))
    {

    NI = 1; //=========1
    equ_aktif_4 = 7;//NI;
    equ_aktif_5 = 7;//NI;
    }
    else if((XINTEGRAL=-0.8))
    {

    NI = ((-1.666)*XINTEGRAL)-0.333; //=========2
    MI = ((1.538)*XINTEGRAL)+1; //=========3
    equ_aktif_4 = 7;//NI;
    equ_aktif_5 = 8;//MI;
    }
    else if((XINTEGRAL=0))
    {

    MI = ((-1.538)*XINTEGRAL)+1;//=========4
    PI = XINTEGRAL;//=========5
    equ_aktif_4 = 8;//MI;
    equ_aktif_5 = 9;//PI;
    }
    else if((XINTEGRAL=1))
    {
    PI=1;//=========6
    equ_aktif_4 = 9;//PI;
    equ_aktif_5 = 9;//PI;
    }

    void inferensi_mamdani_or_sugeno_model()
    {
    NB=NS=Z=PS=PB=0;

    if( ((equ_aktif_0==1)||(equ_aktif_1 ==1)) && ((equ_aktif_2 ==4)||(equ_aktif_3==4)) && ((equ_aktif_4 ==7)||(equ_aktif_5 ==7))) //=======1 NE-ND-NI => PB
    {
    //CONJUCTION
    if((NE< ND) &&(NE ND) &&(NE>NI))
    {
    PB = ND;
    PB = NI;
    }
    //CONJUCTION
    else if((ND< NE) &&(ND NE) &&(ND>NI))
    {
    PB = NE;
    PB = NI;
    }
    //CONJUCTION
    else if((NI< ND) &&(NIND) &&(NI>NE))
    {
    PB = ND;
    PB = NE;
    }

    }

    if( ((equ_aktif_0==1)||(equ_aktif_1 ==1)) && ((equ_aktif_2 ==4)||(equ_aktif_3==4)) && ((equ_aktif_4 = 8)||(equ_aktif_5 = 8))) //=======2 ND-NE-MI => PB
    {
    //CONJUCTION
    if((ND < NE)&&(ND PB)
    {
    PB = ND;
    }
    }
    else if ((ND > NE)&&(ND>MI))
    {
    //DISJUNCTION
    if((NE > PB) && (MI > PB))
    {
    PB= NE;
    PB= MI;
    }
    }

    //CONJUCTION
    else if((NE < ND)&&(NE PB)
    {
    PB = NE;
    }
    }
    else if ((NE > ND)&&(NE>MI))
    {
    //DISJUNCTION
    if((ND > PB) && (MI > PB))
    {
    PB= ND;
    PB= MI;
    }
    }

    //CONJUCTION
    else if((MI < ND)&&(MI PB)
    {
    PB = MI;
    }
    }
    else if ((MI > ND)&&(MI>NE))
    {
    //DISJUNCTION
    if((ND > PB) && (NE > PB))
    {
    PB= ND;
    PB= NE;
    }
    }

    }

    Mas, saya kan make 3 input satu output untuk fuzzynya. Dari syntaks di atas, saya coba buat contoh rule base sebanyak 2 dulu pada void inferensi_mamdani_or_sugeno_model(). Saya mau nanya mas, benar gak penulisan dari bentuk syntaks rule base di atas klo di tulis di avr dimana inputnya ada 3 dan otputnya ada 1?
    Mohon pencerahannya ya gan.
    Tks banyak..🙂
    catatan: output yg ditulis dari kedua rule base di atas adalah PB.

  10. maikal says:

    gan, mau nanya klo plot data-data dari mikro ke matlab secara real time gmana ya scriptnya di matlab?
    Saya punya 3 buah data dari mikro yakni sudut thdp x, sudut thdp y, dan ketinggian.
    Tapi saya masih bingung buat scriptnya di matlab biar data2nya bisa diplotin secara real time.
    Mohon bantuannya gan.
    Bentuk plotny seperti di link ini gan http://www.mathworks.com/help/releases/R2013b/matlab/creating_plots/plot_tools.png
    Tks banyak

  11. maikal says:

    gan mau nanya lagi,
    di CAVR nya kan : printf(“data %d %f 100 \n\r”,i,sin_wave);

    Tapi koq di matlab scriptnya dipanggil : data_dec = textscan(linedata,’data %d %f %d’); ya?
    padahal di cavrnya cuman ada format %d sama %f satu doank. padahal di matlabnya %d ada dua dan %f-nya ada 1.
    Mohon pencerahannya gan.
    Trimkasih banyak
    Hehehehe🙂

    • wangready says:

      klo itu karena saya pengen menerima data 100 sebagai data konstanta, itu biar saya gampang tracing program aja kalo data yang dikirim udah bener…hilangin aja gan…

  12. maikal says:

    Ok makasih gan..
    Thanx banyak ya atas pencerahannyya..

  13. Satria says:

    mas.. klo d liat dr diagram bloknya itu fuzzy dgn input error dan delta error brati bisa jg dikatakan fuzzy PI tidak? punya referensi ttg diagram bloknya gak mas?
    matur nuwun..😀

  14. maikal says:

    Mas, ada program data logger ke MMC gk untuk CAVR?
    Butuh bangat master.
    Data yang disimpan bebas. Ntah sensor apapun master.
    Asalkan bisa logger ke mmc.
    Tks master.

  15. maikal says:

    Mas, perbedaan dan persamaan dari sistem kendali logika fuzzy dengan pid apa ya?
    Trus kelebihan dan kekuranga dari masing2 sistem kendalai fuzzy dengan pid terhdapa hasil respon sistem apa ya?
    Trimkasih banyak master

    • wangready says:

      klo mnurut sya keduanya berbeda secara pendekatan metodenya, fuzzy menggunakan metode yang meniru pemikiram manusia dan lebih pada kecerdasan buatan, sedangkan PID menggunakan pendekatan matematis….jika saja sistem fuzzy didesain dengan baik saya kira hasilnya akan lebih baik dari PID karena PID cocoknya untuk pengendalian sistem yg linier (setau saya sih gtu). akan tetapi saya pernah coba membandingkan, fuzzy susah settingnya jika masih merancangnya dg metode trial & error hasilnya kurang memuaskan. sedangkan PID hasilnya lebih bagus karena mudah untuk di tunning dg mtode trial & error….klo secara rancangan yg benar2 matematis sya blm coba gan…

  16. andi says:

    Slamat malam master..
    Saya punya program arduino seperti ini :
    float amps = 0;
    float maxAmps = 0;
    float minAmps = 0;
    float lastAmps = 0;
    float noise = 0;

    void setup() {
    Serial.begin(9600);
    }

    void loop() {
    amps = (516 – analogRead(A0)) * 27.03 / 1023;
    amps = (amps + lastAmps) / 2;
    lastAmps = amps;
    maxAmps = max(maxAmps, amps);
    minAmps = min(minAmps, amps);
    noise = maxAmps – minAmps;
    Serial.print(amps);
    Serial.print(” “);
    Serial.println(noise);
    if (Serial.read() != -1) {maxAmps = amps; minAmps = amps;}
    delay(100);
    }

    Tapi saya bingung nerjemahin ke dalam software CAVR.
    Tolong bantuannya donk master buat nerjemahin ke CAVR.
    Penting bangat.
    Makasih banyak master

  17. andi says:

    Gak ngerti caranya master..
    Tolong bantuannya master..
    Makasih

  18. gillete says:

    Masbro, kalo ane gak salah liat di kodingnya proses defuzifikasinya pake sugeno tapi di kurva kecepatan outpnya bentuknya mamdani dan singleton. Bisa kasi bentuk singleton kecepatan outputnya untuk kasus diatas ?
    Makasi.

    • wangready says:

      kalo d gambar nya memang gk pake singleton gan kyak mamdani, maaf belum saya ubah sesuai disain d kodingan, aslinya yg d kodingan pake sugeno model singleton dengan tetap berdasarkan kurva diatas dg mengambil konstanta singleton pada saat nilai keanggotaan = 1
      kalo ada yg kira2 salah, langsung d komen aja gan, ane jg masih belajar, biar gk ada info yg ane salah post…

  19. farid says:

    mas saya kan sedang bikin TA penyiraman otomatis dengan kontrol fuzzy, apa bisa bantu mas ?
    email ya mas muchamadfarid8@gmail.com, terima kasih

  20. budi cahyo wibowo says:

    penyusunan fuzzy rule diatas atas dasar apa?

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s