Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Profesor
Alumno
Matrcula
Materia
Fecha de entrega
:
:
:
:
:
1.
Introduccin
2.
2.1.
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 variacin de la luz del entorno que las
rodea, y que por medio de un divisor de voltaje envan seales analgicas
al Arduino. La salida es el ngulo del eje de rotacin 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 esquemtico del sistema implementado:
Las siguientes figuras muestran el sistema implementado de una manera ms ilustrativa, con el propsito de dar un mayor entendimiento del
funcionamiento del sistema.
2.2.
Esta parte del sistema es la que nos concierne, ya que aqu es donde se
emplean los conceptos de lgica difusa. A continuacin se enumeran y
explican de manera concisa las funciones creadas para el Sistema Difuso
implementado.
3
Funciones de Calibracin:
Calibracin mnima: Funcin que se encarga de girar el mecanismo 180 grados en sentido anti-horario para detectar el
valor de entrada de luz mnimo.
Calibracin mxima: Funcin que se encarga de girar el mecanismo 180 grados en sentido horario para detectar el valor
de entrada de luz mximo.
Funciones de Base de Datos:
Normalizacin: Toma como argumento de entrada el valor mnimo y mximo de un rango de valores y los mapea en un rango
de 0 a 1.
Desnormalizacin: Mapea un rango de valores de 0 a 1 a el
rango de valores de x a y, donde x es el valor mnimo original
y y el valor mximo original.
Funciones del Sistema Difuso (Tipo I):
Funcin general: Funcin que acta como un sistema difuso en
general, llevando a cabo los procesos de fusificacin, inferencia
y desfusificacin haciendo uso de las reglas propuestas.
Subfuncin trapezoidal: Se utiliza en la fusificacin para
calcular los grados de membresa de los valores lingsticos
de los extremos (muy bajo y muy alto).
Subfuncin triangular: Se utiliza en la fusificacin para
calcular los grados de membresa de los valores lingsticos
intermedios (bajo, medio y alto).
2.3.
Experimentacin
Intensidad
de luz
(Entrada 1)
Intensidad
de luz
(Entrada 2)
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
Diferencia
en la intensidad de
luz
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
Posicin angular
(Salida)
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
3.
Conclusiones
4.
4.1.
Anexos
Reglas del Sistema Difuso
Intensidad
de luz
(Entrada 1)
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
Intensidad
de luz
(Entrada 2)
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
Posicin angular
(Salida)
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
4.2.
1
#i n c l u d e <Servo . h>
Servo myServo ; // i n i t i a l i z e Servo : myServo
// C o n s t a n t s
c o n s t i n t num_inputs =2; // number o f i n p u t s
c o n s t i n t num_outputs =1; // number o f o u t p u t s
c o n s t i n t num_rules =25; // number o f r u l e s
11
13
15
17
19
21
23
25
27
29
// G l o b a l v a r i a b l e s
i n t c a l i b m i n _ r e a d y =0; // c a l i b r a t i o n min i s not ready
i n t calibmax_ready =0; // c a l i b r a t i o n max i s not ready
i n t v_min=0; // s a v e s t h e min v a l u e o f l i g h t
i n t v_max=0; // s a v e s t h e max v a l u e o f l i g h t
i n t input_1 =0; // o b t a i n s t h e 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 h e l i g h t l e v e l o f LDR2 ( Range :
0 -1023)
d o u b l e norm_in1 =0; // s a v e s t h e input_1 c o n v e r t e d i n a
n o r m a l i z e d v a l u e ( Range : 0 - 1 )
d o u b l e norm_in2 =0; // s a v e s t h e input_2 c o n v e r t e d i n a
n o r m a l i z e d v a l u e ( Range : 0 - 1 )
d o u b l e l i g h t _ l e v e l [ 2 ] ; // s a v e s norm_in1 and norm_in2 i n an
input vector
d o u b l e output =0; // s a v e s t h e output o f t h e Fuzzy System Type
I ( Range : 0 - 1 )
i n t s e r v o _ a n g l e =0; // s a v e s t h e output c o n v e r t e d i n a
d e n o r m a l i z e d v a l u e ( Range : 0 - 1 8 0 )
// Rules
i n t DataBase [ num_rules ] [ num_inputs+num_outputs ]={
{ 1 , 1 , 3 } , // 1
{ 2 , 2 , 3 } , // 2
{ 3 , 3 , 3 } , // 3
{ 4 , 4 , 3 } , // 4
{ 5 , 5 , 3 } , // 5
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
55
void setup ( ) {
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 Port COM
myServo . a t t a c h ( 9 ) ; // Servo c o n n e c t e d i n p i n 9
}
57
void loop ( ) {
53
59
61
63
65
67
69
71
73
75
// f o r v a l u e s l e s s than z e r o a f t e r n o r m a l i z i n g , t a k e them a s
zero .
i f ( l i g h t _ l e v e l [0] <0) {
light_level [0]=0;
}
i f ( l i g h t _ l e v e l [1] <0) {
light_level [1]=0;
}
77
79
81
83
85
87
89
91
95
97
myServo . w r i t e ( s e r v o _ a n g l e ) ;
93
Serial
Serial
Serial
Serial
Serial
Serial
Serial
Serial
Serial
Serial
Serial
99
101
103
105
107
109
111
. p r i n t ( input_1 ) ;
. print ( " & " ) ;
. p r i n t ( input_2 ) ;
. print ( " & " ) ;
. print ( servo_angle ) ;
. print ( " " ) ;
. write (92) ;
. write (92) ;
. print ( " " ) ;
. write (92) ;
. println ( " hline " ) ;
// d e l a y ( 2 0 0 ) ;
113
115
117
119
i n t calib_min ( ) {
myServo . w r i t e ( 0 ) ;
i n t lim_min1=analogRead (A0) ; // s u p p o s e t h e f i r s t v a l u e o f
i n 1 i s t h e min v a l u e
i n t lim_min2=analogRead (A1) ; // s u p p o s e t h e f i r s t v a l u e o f
i n 2 i s t h e min v a l u e
f o r ( i n t i =1; i <=180; i ++){
myServo . w r i t e ( i ) ;
i n t sensor_1=analogRead (A0) ;
i n t sensor_2=analogRead (A1) ;
121
123
i f ( sensor_1<lim_min1 ) {
lim_min1=sensor_1 ;
}
125
127
i f ( sensor_2<lim_min2 ) {
lim_min2=sensor_2 ;
}
delay (50) ;
129
131
133
135
137
139
}
i n t lim_min=min ( lim_min1 , lim_min2 ) ; // o b t a i n i n g t h e min
v a l u e between both s e n s o r s
r e t u r n lim_min ;
i n t calib_max ( ) {
myServo . w r i t e ( 1 8 0 ) ;
i n t lim_max1=analogRead (A0) ; // su p p o s e t h e f i r s t v a l u e o f
i n 1 i s t h e max v a l u e
i n t lim_max2=analogRead (A1) ; // su p p o s e t h e f i r s t v a l u e o f
i n 2 i s t h e max v a l u e
141
143
145
i f ( sensor_1>lim_max1 ) {
lim_max1=sensor_1 ;
}
147
149
i f ( sensor_2>lim_max2 ) {
lim_max2=sensor_2 ;
}
delay (50) ;
151
153
155
157
}
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 between both s e n s o r s
r e t u r n lim_max ;
159
161
163
10
165
167
169
171
173
175
177
179
181
d o u b l e f u z z i f i c a t i o n ( d o u b l e x , i n t n , d o u b l e V [ ] ) { // Obtains
membresy v a l u e f o r a l i n g u i s t i c v a l u e ; x : Normalized i n p u t
; n : L i n g u i s t i c v a l u e t o be e v a l u a t e d ; V [ ] : Parameters f o r
t r i a n g l e s and t r a 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=t r a p e z o i d m f ( x , a - 0 . 1 6 6 6 , a , b , c ) ;
r e t u r n mf ;
}
193
195
197
199
201
i f ( n==2){
mf=t r i a n g l e m f ( x , a , b , c ) ;
r e t u r n mf ;
}
i f ( n==3){
mf=t r i a n g l e m f ( x , a , b , c ) ;
r e t u r n mf ;
}
203
205
207
i f ( n==4){
mf=t r i a n g l e m f ( x , a , b , c ) ;
r e t u r n mf ;
}
11
i f ( n==5){
mf=t r a p e z o i d m f ( x , a , b , c , c +0.1666) ;
r e t u r n mf ;
}
209
211
213
215
217
i f ( n==0){
mf=1;
r e t u r n mf ;
}
219
d o u b l e FuzzySysT1 ( d o u b l e X [ ] , i n t DB [ ] [ 3 ] , i n t i n p u t s , i n t
rules ){
221
223
225
227
d o u b l e PARAM[ 5 ] [ 3 ] = {
{0 ,0.1666 ,0.3333} ,
{0.1666 ,0.3333 ,0.5} ,
{0.3333 ,0.5 ,0.6666} ,
{0.5 ,0.6666 ,0.8333} ,
{0.6666 ,0.8333 ,1}
};
229
double V [ 3 ] ;
231
d o u b l e Fo [ 2 5 ] ;
235
237
239
241
243
245
247
249
251
253
// h e i g h t d e f u z z i f i e r
d o u b l e sum1=0;
12
255
257
259
261
d o u b l e sum2 = 0 . 0 0 0 0 0 0 0 1 ;
f o r ( i n t r =0; r <=(r u l e s - 1 ) ; r++){ // changed r u l e s f o r r u l e s - 1
sum1=(sum1+(Fo [ r ] AC[DB[ r ] [ 2 ] - 1 ] ) ) ;
sum2=(sum2+Fo [ r ] ) ;
}
d o u b l e y=sum1/sum2 ;
return y ;
Referencias
[1] Mendel, Jerry M. Fuzzy Logic Systems for Engineering: A Tutorial, Fellow, IEEE, 1995.
13