Sistema Difuso en Arduino

Embed Size (px)

DESCRIPTION

LIBRO DE SISTEMA DIFUSO EN ARDUINO EJEMPLOS Y PROGRAMACION

Citation preview

  • Universidad Autnoma de Nuevo Len

    Facultad de Ingeniera Mecnica y Elctrica

    Reporte #2: Sistema Lgico Difuso (Tipo I)

    Profesor : Dr. Luis Martn Torres TrevioAlumno : Vctor de Jess Medrano ZarazaMatrcula : 1442635Materia : Sistemas InteligentesFecha de entrega : 23/10/2015

    San Nicols de los Garza, Nuevo Len / 22 de octubre de 2015.

  • 1. IntroduccinUn sistema difuso, grosso modo, es un mapeo no lineal de un vectorde datos de entrada a una salida escalar. Este sistema es nico en sucapacidad de trabajar simultneamente con datos nmericos y valoreslingsticos [1].

    Figura 1: Estructura General de un Sistema de Lgica Difusa

    A continuacin, se enumera y hace una descripcin breve de los bloquesprincipales que forman parte de la estructura de un Sistema Difuso (verFigura 1):

    Fusificador: Bloque en el que a cada variable de entrada se leasigna un valor de membresa a cada uno de los conjuntos difu-sos que se han considerado, mediante las funciones caractersticasasociadas a estos conjuntos difusos. Las entradas a este bloque sonvalores concretos de las variables de entrada y las salidas son gra-dos de pertenencia o valores de membresa a los conjuntos difusosconsiderados.

    Reglas: Los sistemas difusos emplean reglas, las cuales combinanuno o ms conjuntos difusos de entrada (antecedentes o premisas)y le asocian un conjunto difuso de salida (consecuente o conse-cuencia). Las reglas son afirmaciones del tipo SI-ENTONCES. Losconjuntos difusos del antecedente se asocian mediante operadoresdifusos (AND,OR,NOT,etc.).

    Inferencia: En este bloque se utilizan mecanismos de inferenciapara relacionar conjuntos difusos de entrada y salida mediante lasreglas que rigen al sistema. Las entradas de este bloque son conjun-tos difusos a los que les corresponde un valor de membresa, y lassalidas son de igual forma conjuntos difusos, asociados a la variablede salida.

    1

  • Desfusificador: Bloque en el cual a partir del conjunto difusoobtenido en el mecanismo de inferencia y mediante los mtodosmatemticos de desfusificacin se obtiene un valor concreto de lavariable de salida.

    2. Implementacin del Sistema Difuso enArduino

    2.1. Hardware del Sistema DifusoSe dise un sistema difuso que se compone de dos entradas y una sali-da. Las entradas consisten en dos fotorresistencias, las cuales poseen unaresistencia variable debido a la variacin de la luz del entorno que lasrodea, y que por medio de un divisor de voltaje envan seales analgicasal 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 es-tablecido. La salida se maneja por uno de los puertos de Arduino del tipoPWM. Se presenta el diagrama esquemtico del sistema implementado:

    Figura 2: Diagrama esquemtico

    2

  • Las siguientes figuras muestran el sistema implementado de una mane-ra ms ilustrativa, con el propsito de dar un mayor entendimiento delfuncionamiento del sistema.

    Figura 3: Diagrama ilustrativo de conexiones

    Figura 4: Implementacin fsica del sistema

    2.2. Software del Sistema DifusoEsta parte del sistema es la que nos concierne, ya que aqu es donde seemplean los conceptos de lgica difusa. A continuacin se enumeran yexplican de manera concisa las funciones creadas para el Sistema Difusoimplementado.

    3

  • Funciones de Calibracin:

    Calibracin mnima: Funcin que se encarga de girar el me-canismo 180 grados en sentido anti-horario para detectar elvalor de entrada de luz mnimo.

    Calibracin mxima: Funcin que se encarga de girar el me-canismo 180 grados en sentido horario para detectar el valorde entrada de luz mximo.

    Funciones de Base de Datos:

    Normalizacin: Toma como argumento de entrada el valor m-nimo y mximo de un rango de valores y los mapea en un rangode 0 a 1.

    Desnormalizacin: Mapea un rango de valores de 0 a 1 a elrango de valores de x a y, donde x es el valor mnimo originaly y el valor mximo original.

    Funciones del Sistema Difuso (Tipo I):

    Funcin general: Funcin que acta como un sistema difuso engeneral, llevando a cabo los procesos de fusificacin, inferenciay desfusificacin haciendo uso de las reglas propuestas. Subfuncin trapezoidal: Se utiliza en la fusificacin para

    calcular los grados de membresa de los valores lingsticosde los extremos (muy bajo y muy alto).

    Subfuncin triangular: Se utiliza en la fusificacin paracalcular los grados de membresa de los valores lingsticosintermedios (bajo, medio y alto).

    2.3. ExperimentacinSe presentan los datos numricos obtenidos desde el monitor serial de lainterfaz de Arduino.

    4

  • Intensidadde luz(Entrada 1)

    Intensidadde luz(Entrada 2)

    Diferenciaen la in-tensidad deluz

    Posicin an-gular(Salida)

    186 92 94 45153 153 0 90123 415 -292 171303 43 260 355 308 -253 14984 239 -155 135113 192 -79 126263 168 95 51339 60 279 16305 46 259 33229 62 167 45153 102 51 69128 262 -134 12965 386 -321 18050 329 -279 15976 251 -175 135105 192 -87 130134 192 -58 117323 99 224 26330 42 288 21294 39 255 38226 51 175 45357 33 324 0163 91 72 56145 135 10 87118 374 -256 168297 56 241 651 306 -255 14868 228 -160 13578 213 -135 135115 186 -71 124247 70 177 45125 27 98 75197 25 172 45133 161 -28 107

    Cuadro 1: Datos de experimentacin

    3. ConclusionesA partir de los datos anteriores se puede concluir lo siguiente acerca delsistema difuso y las reglas implementadas:

    Entre ms pequeo sea el valor absoluto de la diferencia en la in-

    5

  • tensidad de luz entre ambas entradas, el ngulo del servomotor seaproxima a los 90 grados.

    Entre ms grande sea la diferencia en las entradas y est diferenciasea positiva, el ngulo del servomotor se aproxima a los 0 grados.

    Entre ms grande sea la diferencia en las entradas y est diferenciasea negativa, el ngulo del servomotor se aproxima a los 180 grados.

    4. Anexos4.1. Reglas del Sistema Difuso

    Intensidadde luz(Entrada 1)

    Intensidadde luz(Entrada 2)

    Posicin an-gular(Salida)

    1 1 32 2 33 3 34 4 35 5 31 2 42 1 22 3 43 2 23 4 44 3 24 5 45 4 21 3 43 1 22 4 44 2 23 5 45 3 21 4 54 1 12 5 55 2 11 5 55 1 1

    Cuadro 2: Datos de experimentacin

    donde los nmeros del 1 al 5 representan los siguientes valores lingsticos:

    1: Luz muy baja (entradas) / ngulo del eje de rotacin muy bajo(salida)

    6

  • 2: Luz baja (entradas) / ngulo del eje de rotacin bajo (salida)

    3: Luz media (entradas) / ngulo del eje de rotacin medio (salida)

    4: Luz alta (entradas) / ngulo del eje de rotacin alto (salida)

    5: Luz muy alta (entradas) / ngulo del eje de rotacin muy alto(salida)

    4.2. Cdigo implementado en Arduino

    1 #inc lude

    3 Servo myServo ; // i n i t i a l i z e Servo : myServo

    5 //Constantsconst i n t num_inputs=2; //number o f inputs

    7 const i n t num_outputs=1; //number o f outputsconst i n t num_rules=25; //number o f r u l e s

    9

    //Global v a r i a b l e s11 i n t cal ibmin_ready=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 ready13 i n t v_min=0; // saves the min value o f l i g h t

    i n t v_max=0; // saves the max value o f l i g h t15 i n t input_1=0; // obta ins the l i g h t l e v e l o f LDR1 (Range :

    0 -1023)i n t input_2=0; // obta ins the l i g h t l e v e l o f LDR2 (Range :

    0 -1023)17 double norm_in1=0; // saves the input_1 converted in a

    normal ized value (Range : 0 -1)double norm_in2=0; // saves the input_2 converted in a

    normal ized value (Range : 0 -1)19 double l i g h t_ l e v e l [ 2 ] ; // saves norm_in1 and norm_in2 in an

    input vec to rdouble output=0; // saves the output o f the Fuzzy System Type

    I (Range : 0 - 1 )21 i n t servo_angle=0; // saves the output converted in a

    denormal ized value (Range : 0 -180 )

    23 //Rulesi n t DataBase [ num_rules ] [ 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

    7

  • {1 ,2 ,4} , //631 {2 ,1 ,2} , //7

    {2 ,3 ,4} , //833 {3 ,2 ,2} , //9

    {3 ,4 ,4} , //1035 {4 ,3 ,2} , //11

    {4 ,5 ,4} , //1237 {5 ,4 ,2} , //13

    {1 ,3 ,4} , //1439 {3 ,1 ,2} , //15

    {2 ,4 ,4} , //1641 {4 ,2 ,2} , //17

    {3 ,5 ,4} , //1843 {5 ,3 ,2} , //19

    {1 ,4 ,5} , //2045 {4 ,1 ,1} , //21

    {2 ,5 ,5} , //2247 {5 ,2 ,1} , //23

    {1 ,5 ,5} , //2449 {5 ,1 ,1} //25

    } ;51

    void setup ( ) {53 S e r i a l . begin (4800) ; // I n i t i a l i z e S e r i a l Port COM

    myServo . attach (9 ) ; // Servo connected in pin955 }

    57 void loop ( ) {

    59 // Ca l i b ra t i on ( obta in ing min and max va lues )i f ( cal ibmin_ready==0){

    61 v_min=calib_min ( ) ;}

    63 cal ibmin_ready=1;

    65 i f ( calibmax_ready==0){v_max=calib_max ( ) ;

    67 myServo . wr i t e (90) ;}

    69 calibmax_ready=1;

    71 //Normal izat ioninput_1=analogRead (A0) ; // read ing LDR1 value

    73 input_2=analogRead (A1) ; // read ing LDR2 valuel i g h t_ l e v e l [0 ]= normal ize ( input_1 , v_min ,v_max) ; // input_1normal ized

    75 l i g h t_ l e v e l [1 ]= normal ize ( input_2 , v_min ,v_max) ; // input_2normal ized

    8

  • 77 // f o r va lue s l e s s than zero a f t e r normal iz ing , take them aszero .

    i f ( l i g h t_ l e v e l [0 ] 1) {

    l i g h t_ l e v e l [ 1 ]=1 ;91 }

    93 //Fuzzy System (Type 1)output=FuzzySysT1 ( l i gh t_ l ev e l , DataBase , num_inputs , num_rules) ;

    95 servo_angle=denormal ize ( output , 0 , 1 80 ) ;

    97 myServo . wr i t e ( servo_angle ) ;

    99 S e r i a l . p r i n t ( input_1 ) ;S e r i a l . p r i n t ( " & " ) ;

    101 S e r i a l . p r i n t ( input_2 ) ;S e r i a l . p r i n t ( " & " ) ;

    103 S e r i a l . p r i n t ( servo_angle ) ;S e r i a l . p r i n t ( " " ) ;

    105 S e r i a l . wr i t e (92) ;S e r i a l . wr i t e (92) ;

    107 S e r i a l . p r i n t ( " " ) ;S e r i a l . wr i t e (92) ;

    109 S e r i a l . p r i n t l n ( " h l i n e " ) ;

    111 // de lay (200) ;}

    113

    i n t calib_min ( ) {115 myServo . wr i t e (0 ) ;

    i n t lim_min1=analogRead (A0) ; // suppose the f i r s t va lue o fin1 i s the min value

    117 i n t lim_min2=analogRead (A1) ; // suppose the f i r s t va lue o fin2 i s the min value

    119 f o r ( i n t i =1; i

  • 121 i n t sensor_1=analogRead (A0) ;i n t sensor_2=analogRead (A1) ;

    123

    i f ( sensor_1

  • 165

    i n t denormal ize ( double norm_val , i n t l_min , i n t l_max) {167 i n t va l ;

    va l = round ( norm_val ( l_max - l_min+0.000001)+l_min ) ;169 re turn va l ;

    }171

    double trapezo idmf ( double x , double a , double b , double c , doubled) {

    173 double mf=max(min (min ( ( x - a ) /(b - a+0.000001) ,1 ) , ( d - x ) /(d - c+0.0000001) ) ,0 ) ;

    r e turn mf ;175 }

    177 double t r i ang l emf ( double x , double a , double b , double c ) {double mf=max(min ( ( x - a ) /(b - a+0.000001) , ( c - x ) /( c - b+0.000001) )

    ,0 ) ;179 re turn mf ;

    }181

    double f u z z i f i c a t i o n ( double x , i n t n , double V [ ] ) { // Obtainsmembresy value f o r a l i n g u i s t i c va lue ; x : Normalized input; n : L i n gu i s t i c va lue to be eva luated ; V [ ] : Parameters f o rt r i a n g l e s and trap .

    183

    double a=V[ 0 ] ;185 double b=V[ 1 ] ;

    double c=V[ 2 ] ;187 double mf ;

    189 i f (n==1){mf=trapezo idmf (x , a - 0 . 1 666 , a , b , c ) ;

    191 re turn mf ;}

    193

    i f (n==2){195 mf=tr i ang l emf (x , a , b , c ) ;

    r e turn mf ;197 }

    199 i f (n==3){mf=t r i ang l emf (x , a , b , c ) ;

    201 re turn mf ;}

    203

    i f (n==4){205 mf=tr i ang l emf (x , a , b , c ) ;

    r e turn mf ;207 }

    11

  • 209 i f (n==5){mf=trapezo idmf (x , a , b , c , c+0.1666) ;

    211 re turn mf ;}

    213

    i f (n==0){215 mf=1;

    re turn mf ;217 }

    }219

    double FuzzySysT1 ( double X[ ] , i n t DB[ ] [ 3 ] , i n t inputs , i n tr u l e s ) {

    221

    double PARAM[5 ] [ 3 ]={223 {0 ,0 . 1666 ,0 . 3333} ,

    {0 . 1666 , 0 . 3333 , 0 . 5} ,225 {0 . 3333 , 0 . 5 , 0 . 6 666} ,

    {0 . 5 , 0 . 6 666 , 0 . 8333} ,227 {0 .6666 ,0 . 8333 ,1}

    } ;229

    double V [ 3 ] ;231

    double AC[ 5 ]={0 , 0 . 2 5 , 0 . 5 , 0 . 7 5 , 1 } ; //Output Height Fuzzy Set233

    double Fo [ 2 5 ] ;235

    f o r ( i n t r=0; r

  • double sum2=0.00000001;255 f o r ( i n t r=0; r