Universidad Autónoma de Nuevo León Facultad de Ingeniería Mecánica y Eléctrica
Reporte #2: Sistema Lógico Difuso (Tipo I)
Profesor Alumno Matrícula Materia Fecha de entrega
: Dr. Luis Martín Torres Treviño : Víctor de Jesús Medrano Medrano Zarazúa Zarazúa : 1442635 : Sistemas Inteligentes : 23/10/2015 23/10/2015
San Nicolás de los Garza, Nuevo León / 22 de octubre de 2015.
1.
Introducción
Un sistema difuso, grosso modo, es un mapeo no lineal de un vector de datos de entrada a una salida escalar. Este sistema es único en su capacidad de trabajar simultáneamente con datos númericos y valores lingüísticos [1].
Figura 1: Estructura General de un Sistema de Lógica Difusa A continuación, se enumera y hace una descripción breve de los bloques principales que forman parte de la estructura de un Sistema Difuso (ver Figura 1): Fusificador: Bloque en el que a cada variable de entrada se le
asigna un valor de membresía a cada uno de los conjuntos difusos que se han considerado, mediante las funciones características asociadas a estos conjuntos difusos. Las entradas a este bloque son valores concretos de las variables de entrada y las salidas son grados de pertenencia o valores de membresía a los conjuntos difusos considerados. Reglas: Los sistemas difusos emplean reglas, las cuales combinan
uno o más conjuntos difusos de entrada (antecedentes o premisas) y le asocian un conjunto difuso de salida (consecuente o consecuencia). Las reglas son afirmaciones del tipo SI-ENTONCES. Los conjuntos difusos del antecedente se asocian mediante operadores difusos (AND,OR,NOT,etc.). Inferencia: En este bloque se utilizan mecanismos de inferencia
para relacionar conjuntos difusos de entrada y salida mediante las reglas que rigen al sistema. Las entradas de este bloque son conjuntos difusos a los que les corresponde un valor de membresía, y las salidas son de igual forma conjuntos difusos, asociados a la variable de salida. 1
Desfusificador: Bloque en el cual a partir del conjunto difuso
obtenido en el mecanismo de inferencia y mediante los métodos matemáticos de desfusificación se obtiene un valor concreto de la variable de salida.
2. 2.1.
Implementación del Sistema Difuso en Arduino Hardware del Sistema Difuso
Se diseñó un sistema difuso que se compone de dos entradas y una salida. Las entradas consisten en dos fotorresistencias, las cuales poseen una resistencia variable debido a la variación de la luz del entorno que las rodea, y que por medio de un divisor de voltaje envían señales analógicas al Arduino. La salida es el ángulo del eje de rotación de un servomotor (de 0 a 180 grados), que actuará de acuerdo a las reglas que se hayan establecido. La salida se maneja por uno de los puertos de Arduino del tipo PWM. Se presenta el diagrama esquemático del sistema implementado:
Figura 2: Diagrama esquemático
2
Las siguientes figuras muestran el sistema implementado de una manera más ilustrativa, con el propósito de dar un mayor entendimiento del funcionamiento del sistema.
Figura 3: Diagrama ilustrativo de conexiones
Figura 4: Implementación física del sistema
2.2.
Software del Sistema Difuso
Esta parte del sistema es la que nos concierne, ya que aquí es donde se emplean los conceptos de lógica difusa. A continuación se enumeran y explican de manera concisa las funciones creadas para el Sistema Difuso implementado. 3
Funciones de Calibración: •
•
Calibración mínima: Función que se encarga de girar el me-
canismo 180 grados en sentido anti-horario para detectar el valor de entrada de luz mínimo. Calibración máxima: Función que se encarga de girar el mecanismo 180 grados en sentido horario para detectar el valor de entrada de luz máximo.
Funciones de Base de Datos: •
•
Normalización: Toma como argumento de entrada el valor mí-
nimo y máximo de un rango de valores y los mapea en un rango de 0 a 1. Desnormalización: Mapea un rango de valores de 0 a 1 a el rango de valores de x a y, donde x es el valor mínimo original y y el valor máximo original.
Funciones del Sistema Difuso (Tipo I): •
Función general: Función que actúa como un sistema difuso en
general, llevando a cabo los procesos de fusificación, inferencia y desfusificación haciendo uso de las reglas propuestas. Subfunción trapezoidal: Se utiliza en la fusificación para calcular los grados de membresía de los valores lingüísticos de los extremos (muy bajo y muy alto). Subfunción triangular: Se utiliza en la fusificación para calcular los grados de membresía de los valores lingüísticos intermedios (bajo, medio y alto). ◦
◦
2.3.
Experimentación
Se presentan los datos numéricos obtenidos desde el monitor serial de la interfaz de Arduino.
4
Intensidad de luz (Entrada 1)
Intensidad de luz (Entrada 2)
Diferencia Posición anen la in- gular tensidad de (Salida) luz
186 153 123 303 55 84 113 263 339 305 229 153 128 65 50 76 105 134 323 330 294 226 357 163 145 118 297 51 68 78 115 247 125 197 133
92 153 415 43 308 239 192 168 60 46 62 102 262 386 329 251 192 192 99 42 39 51 33 91 135 374 56 306 228 213 186 70 27 25 161
94 0 -292 260 -253 -155 -79 95 279 259 167 51 -134 -321 -279 -175 -87 -58 224 288 255 175 324 72 10 -256 241 -255 -160 -135 -71 177 98 172 -28
45 90 171 3 149 135 126 51 16 33 45 69 129 180 159 135 130 117 26 21 38 45 0 56 87 168 6 148 135 135 124 45 75 45 107
Cuadro 1: Datos de experimentación
3.
Conclusiones
A partir de los datos anteriores se puede concluir lo siguiente acerca del sistema difuso y las reglas implementadas: Entre más pequeño sea el valor absoluto de la diferencia en la in5
tensidad de luz entre ambas entradas, el ángulo del servomotor se aproxima a los 90 grados. Entre más grande sea la diferencia en las entradas y está diferencia sea positiva, el ángulo del servomotor se aproxima a los 0 grados. Entre más grande sea la diferencia en las entradas y está diferencia sea negativa, el ángulo del servomotor se aproxima a los 180 grados.
4. 4.1.
Anexos Reglas del Sistema Difuso Intensidad de luz (Entrada 1)
Intensidad de luz (Entrada 2)
Posición angular (Salida)
1 2 3 4 5 1 2 2 3 3 4 4 5 1 3 2 4 3 5 1 4 2 5 1 5
1 2 3 4 5 2 1 3 2 4 3 5 4 3 1 4 2 5 3 4 1 5 2 5 1
3 3 3 3 3 4 2 4 2 4 2 4 2 4 2 4 2 4 2 5 1 5 1 5 1
Cuadro 2: Datos de experimentación donde los números del 1 al 5 representan los siguientes valores lingüísticos: 1: Luz muy baja (entradas) / Ángulo del eje de rotación muy bajo
(salida) 6
2: Luz baja (entradas) / Ángulo del eje de rotación bajo (salida) 3: Luz media (entradas) / Ángulo del eje de rotación medio (salida) 4: Luz alta (entradas) / Ángulo del eje de rotación alto (salida) 5: Luz muy alta (entradas) / Ángulo del eje de rotación muy alto
(salida)
4.2.
Código implementado en Arduino
1
#inclu de
3
Se rvo myServo ; // i n i t i a l i z e Se rv o : myServo
//Constants c o ns t i n t num_inputs=2; / /n umb er o f i n p u t s 7 co n st i n t num_outputs=1; / / numb er o f o u t p u t s c o ns t i n t num_rules=25; / /number o f r u l e s 5
9
// G l ob a l v a r i a b l e s i n t calibmin_ready=0; / / c a l i b r a t i o n min i s n ot r ea dy i n t calibmax_ready=0; / / c a l i b r a t i o n max i s n ot r ea dy 13 i n t v_min=0; // s a v es t he min v al ue o f l i g h t i n t v_max=0; // s a v es t he max v a l ue o f l i g h t 15 i n t input_1=0; / / o b t a i n s t he l i g h t l e v e l o f LDR1 ( Range : 0 -1023) i n t input_2=0; / / o b t a i n s t he l i g h t l e v e l o f LDR2 ( Range : 0 -1023) 17 double norm_in1=0; // s a v e s t he i np ut _1 c o n ve r te d i n a n o r m a l i z e d v a l u e ( R an ge : 0 - 1 ) double norm_in2=0; // s a v e s t he i np ut _2 c o n ve r te d i n a n o r m a l i z e d v a l u e ( R an ge : 0 - 1 ) 19 double l i g h t _ l e v e l [ 2 ] ; // sav es norm_in1 and norm_in2 in an i n pu t v e c t o r double output=0; // s a v e s t h e o u tp u t o f t h e F uz zy S ys te m Type I ( R an ge : 0 - 1 ) 21 i n t servo_angle=0; // s a v es t he o ut pu t c on v er te d i n a d e n o r m a l i z e d v a l u e ( R an ge : 0 - 1 8 0 ) 11
//Rules i n t Data Base [ num_r ules ] [ num_inputs+num_outputs ]={ 25 {1 ,1 ,3} , // 1 {2 ,2 ,3} , // 2 27 {3 ,3 ,3} , // 3 {4 ,4 ,3} , // 4 29 {5 ,5 ,3} , // 5 23
7
31
33
35
37
39
41
43
45
47
49
{1 ,2 ,4} , // 6 {2 ,1 ,2} , // 7 {2 ,3 ,4} , // 8 {3 ,2 ,2} , // 9 {3 ,4 ,4} , //10 {4 ,3 ,2} , //11 {4 ,5 ,4} , //12 {5 ,4 ,2} , //13 {1 ,3 ,4} , //14 {3 ,1 ,2} , //15 {2 ,4 ,4} , //16 {4 ,2 ,2} , //17 {3 ,5 ,4} , //18 {5 ,3 ,2} , //19 {1 ,4 ,5} , //20 {4 ,1 ,1} , //21 {2 ,5 ,5} , //22 {5 ,2 ,1} , //23 {1 ,5 ,5} , //24 {5 ,1 ,1} //25 };
51
53
55
57
59
61
63
65
67
69
71
73
75
void s e t u p ( ) { S e r i a l . b e g i n ( 4 8 0 0 ) ; / / I n i t i a l i z e S e r i a l P or t COM myServo . att ac h (9) ; // S e rv o c o n n ec t ed i n p in 9 } void l o op ( ) { / / C a l i b r a t i o n ( o b t a i n i n g min and max v a l u e s ) i f ( cali bmi n_re ady==0){ v_min=cal ib _m in ( ) ; } calibmin_ready=1; i f (calibmax_ready==0){ v_max=cali b_ ma x () ; myServo . wr it e (9 0) ; } calibmax_ready=1; //Normalization input_1=analogRe ad (A0) ; // read ing LDR1 v alue input_2=analogRe ad (A1) ; // read ing LDR2 v alue li gh t_ le v el [0]= norm ali ze ( input_1 ,v_min ,v_max) ; //input_1 normalized li gh t_ le v el [1]= nor mal ize ( input_2 , v_min ,v_max) ; //input_2 normalized
8
// f o r v a lu e s l e s s th an z e ro a f t e r n or ma li zi ng , t ak e them a s zero . i f ( l i g h t _ l e v e l [ 0 ] < 0 ) { light_l evel [0]=0; } i f ( l i g h t _ l e v e l [ 1 ] < 0 ) { l i g h t _ l e v e l [ 1 ] =0 ; }
77
79
81
83
// f o r v a l u e s g r e a t e r t ha n o ne a f t e r n o r ma l iz i ng , t a ke them as one . i f ( l i g h t _ l e v e l [ 0 ] > 1 ) { light_l evel [0]=1; } i f ( l i g h t _ l e v e l [ 1 ] > 1 ) { l i g h t _ l e v e l [ 1 ] =1 ; }
85
87
89
91
//Fuzzy System ( Type 1) outp ut=FuzzySysT1 ( li g ht _l ev el , DataBase , num_inputs , num_rules ); servo_an gle=denor malize ( output ,0 ,18 0) ;
93
95
myServo . wr it e ( ser vo _an gl e ) ;
97
Se ri al Se ria l Se ri al Se ria l Se ri al Se ria l Se ri al Se ri al Se ria l Se ri al Ser ial
99
101
103
105
107
109
. p r i n t ( i n p u t_ 1 ) ; . p r i n t ( " & " ) ; . p r i n t ( i n p u t_ 2 ) ; . p r i n t ( " & " ) ; . pri nt ( servo_ang le ) ; . p r i n t ( " " ) ; . write (92) ; . write (92) ; . p r i n t ( " " ) ; . write (92) ; . p r i n t l n ( " h l i n e " ) ;
//de lay (200 ) ;
111
} 113
115
117
119
i n t calib_min () { myServo . wr it e (0 ) ; i n t lim_min1=analog Read (A0) ; / / s u pp o s e t h e f i r s t v a l u e o f i n 1 i s t he m in v al u e i n t lim_min2=analog Read (A1) ; / / s u pp o s e t h e f i r s t v a l u e o f i n 2 i s t he m in v al u e f o r ( i n t i =1; i <=180; i++){ myServo . wr it e ( i ) ;
9
i n t sen sor _1=analogRe ad (A0) ; i n t sen sor _2=analogRe ad (A1) ;
121
123
i f ( sensor_1
125
127
129
131
} i n t lim_min=min( lim_min1 , lim_min2 ) ; / / o b t a i n i n g t he min v a l u e b et we en b ot h s e n s o r s r e t u r n lim_min ;
133
135
137
139
i f ( sensor_2
} i n t calib_max () { myServo . wr it e (1 80 ) ; i n t lim_max1=analog Read (A0) ; / / s u pp o s e t h e f i r s t v a l u e o f i n 1 i s t he max v al u e i n t lim_max2=analog Read (A1) ; / / s u pp o s e t h e f i r s t v a l u e o f i n 2 i s t he max v al u e
141
143
145
147
149
151
153
155
157
f o r ( i n t i =1; i <=180; i++){ myServo . wr it e (18 0 - i ) ; i n t sen sor _1=analogRe ad (A0) ; i n t sen sor _2=analogRe ad (A1) ; i f ( senso r_1>lim_max1) { lim_max1=sensor_1 ; } i f ( senso r_2>lim_max2) { lim_max2=sensor_2 ; } d e l a y (50) ; } i n t lim_max=max( lim_max1 , lim_max2 ) ; / / o b t a i n i n g t h e max v a l u e b et we en b ot h s e n s o r s r e t u r n lim_max ; }
159
161
163
double norma lize ( i n t val , i n t l_min , i n t l_max){ double norm_val ; norm_val = ( double ( val ) - double ( l_min) ) /( double (l_max) double ( l_min) +0.00000 1) ; r e t u r n norm_val ; }
10
165
167
169
i n t denorm alize ( double norm_val , i n t l_min , i n t l_max){ i n t val ; val = round(norm_val ∗ (l_max - l_min+0 .000 001 )+l_min) ; r e t u r n val ; }
171
173
175
double trape zoidm f ( double x , double a , double b , double c , double d){ double mf=max(min(min(( x - a) /(b- a+0.000001) ,1) ,(d -x ) /(d - c +0.000000 1) ) ,0 ) ; r e t u r n mf ; }
double double ,0) 179 r e t u r n } 177
t r i a n g l e m f ( double x , double a , double b , double c ) { mf=max(min( ( x - a) /(b - a+0. 000001) , ( c - x) /( c -b +0.00000 1) ) ; mf ;
181
double f u z z i f i c a t i o n ( double x , i n t n , double V [ ] ) { / / O b t ai n s membresy v a lu e f o r a l i n g u i s t i c v a lu e ; x : N or ma li ze d i n pu t ; n : L i n g u i s t i c v a lu e t o be e v al u at e d ; V [ ] : P ar am et er s f o r t r i a n g l e s and t ra p . 183
185
187
189
191
double double double double
a=V [ 0 ] ; b=V [ 1 ] ; c=V [ 2 ] ; mf ;
i f (n==1){ mf=trape zoidm f (x ,a -0 .1 66 6 ,a ,b , c) ; r e t u r n mf ; }
193
195
197
199
201
i f (n==2){ mf=tria ngl emf (x , a ,b , c ) ; r e t u r n mf ; } i f (n==3){ mf=tria ngl emf (x ,a ,b , c) ; r e t u r n mf ; }
203
205
207
i f (n==4){ mf=tria ngl emf (x , a ,b , c ) ; r e t u r n mf ; }
11
i f (n==5){ mf=trape zoi dmf (x ,a ,b , c , c +0.1666) ; r e t u r n mf ; }
209
211
213
i f (n==0){ mf=1; r e t u r n mf ; }
215
217
} 219
double FuzzySysT1( double X [ ] , i n t DB [ ] [ 3 ] , i n t i n p u t s , i n t rules ){ 221
double PARAM[5][3]={ {0 ,0.16 66 ,0.33 33} , {0.1666 ,0.333 3 ,0.5} , {0.3333 ,0.5 ,0.6666} , {0.5 ,0.6666 ,0.8333} , {0.66 66 ,0.83 33 ,1} };
223
225
227
229
double V [ 3 ] ; 231
double AC [ 5 ] = { 0 , 0 . 2 5 , 0 . 5 , 0 . 7 5 , 1 } ; //Output Height Fuzzy Set 233
double Fo [ 2 5 ] ; 235
237
239
241
243
245
247
249
f o r ( i n t r =0;r<=(r ul es -1 ) ; r++){ / / f o r e ac h r u l e ( r ow ) double sumin=1; / / v a r i a b l e t h a t s a v e s t h e minimum v a l u e f o r e ac h r u l e . int n ; f o r ( i n t i =0;i <=(inp uts -1 ) ; i++){ / / f o r e a c h i n p u t ( c o lu mn ) n=DB[ r ] [ i ] - 1 ; // - 1 b e ca u se i n Ar du ino , p o s i t i o n z e r o e x i s t s i n A r ra ys i f (n>-1){ V[ 0 ] =PARAM[ n ] [ 0 ] ; V[ 1 ] =PARAM[ n ] [ 1 ] ; V[ 2 ] =PARAM[ n ] [ 2 ] ; } double mf=fu zz i f ic a t io n (X[ i ] ,( n+1) ,V) ; sumin=min( sumin , mf) ; } Fo[ r ] = sumin ; }
251
253
// h e ig ht d e f u z z i f i e r double sum1=0;
12
255
257
259
261
double sum2=0.00000001; f o r ( i n t r =0;r<=(r ul es -1 ) ; r++){ / / ch an ged r u l e s f o r r u l es - 1 sum1=(sum1+(Fo [ r ] ∗ AC[DB[ r ][ 2 ] - 1 ] ) ) ; sum2=(sum2+Fo [ r ] ) ; } double y=sum1/sum2 ; return y ; }
Referencias [1] Mendel, Jerry M. Fuzzy Logic Systems for Engineering: A Tutorial , Fellow, IEEE, 1995.
13