Vous êtes sur la page 1sur 9

DEPARTAMENTO DE ENERGÍA MECÁNICA

AUTOMATIZACIÓN INDUSTRIAL MECATRÓNICA

INGENIERÍA MECATRÓNICA

DEBER NO. 1
FUNCIÓN TRIGONOMÉTRICA CON LÓGICA DIFUSA

MÉNDEZ KATHERINE

03 DE DICIEMBRE DEL 2018


SANGOLQUÍ
FUNCIONES DE MEMBRESÍA

Para determinar los valores de las funciones de membresía se requiere conocer a profundidad la
función a analizar, por lo que se la representa en Excel.

Y=13sen(0.1*(x-pi/2))+13
27.5000
25.0000
22.5000
20.0000
17.5000
AMPLITUD

15.0000
12.5000
Series1
10.0000
7.5000
5.0000
2.5000
0.0000
-20.0000 -10.0000 0.0000 10.0000 20.0000 30.0000 40.0000 50.0000
GRADOS [rad]

Figura 1 Gráfica de la función mediante xcel

Función de membresía para la entrada

Figura 2 Función de membresía para la entrada mediante Matlab


Función de membresía para la salida

Figura 3 Función de membresía para la salida mediante Matlab

Reglas determinadas

Figura 4 Visor de las reglas obtenidas mediante Matlab

PROGRAMACIÓN EN ARDUINO
#include <LiquidCrystal.h>

//Definimos los pines


LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

//VARIABLES
//ang es angulo que se ingresa
double ang=0;
//son alfa 1 y alfa 2
double u1=0;
double u2=0;
double k1=0;
double k2=0;
char in='0';
char ou='0';
double out=0;
double c=0;

//Funciones de las rectas de entrada

//FUNCIÓN PARA DEFINIR LAS FUNCIONES DE ENTRADA


//L1
double L1(double x){
double u=-0.1272*x-1.19847;
//double u=100000;
return u;
}
//L2
double L2(double x){
double u=0.127226*(x)+2.19847;
return u;
}
//L3
double L3(double x){
float u=-0.127389*x-0.2;
return u;
}
//L4
double L4(double x){
double u=0.127389*x+1.2;
return u;
}
//L5
double L5(double x){
double u=-(0.127389)*x+0.8;
return u;
}
double L6(double x){
double u=(0.127389)*x+0.2;
return u;
}

double L7(double x){


double u=-(0.127389)*x+1.8;
return u;
}

double L8(double x){


double u=0.127226*(x)-0.798982;
return u;

//L9
double L9(double x){
double u=-0.1274*(x)+2.8013;
return u;
}
//L10
double L10(double x){
double u=0.1274*(x)-1.8013;
return u;
}
//L11
double L11(double x){
float u=-(0.127226)*x+3.79771;
return u;
}
//L12
double L12(double x){
double u=(0.127226)*x-2.79771;
return u;
}
//L13
double L13(double x){
double u=-(0.127389)*x+4.80255;
return u;
}
double L14(double x){
double u=(0.127389)*x-3.80255;
return u;
}
double L15(double x){
double u=-(0.127389)*x+5.80255;
return u;
}

double L16(double x){


double u=0.127389*(x)-4.80255;
return u;

//FUNCIONES DE SALIDA
double K1(double y){
double k=-3.25*y+3.25;
return k;
}
//K2
double K2(double y){
double k=3.25*y;
return k;
}
//K3
double K3(double y){
float k=-3.25*y+6.5;
return k;
}
//K4
double K4(double y){
double k=3.25*y+3.25;
return k;
}

double K5(double y){


double k=-3.25*y+9.75;
return k;
}
//K6
double K6(double y){
double k=3.25*y+6.5;
return k;
}
//K7
double K7(double y){
float k=-3.25*y+13;
return k;
}
//K4
double K8(double y){
double k=3.25*y+9.75;
return k;
}

double K9(double y){


double k=-3.25*y+16.25;
return k;
}
//K10
double K10(double y){
double k=3.25*y+13;
return k;
}
//K11
double K11(double y){
float k=-3.25*y+19.5;
return k;
}
//K12
double K12(double y){
double k=3.25*y+16.25;
return k;
}
double K13(double y){
double k=-3.25*y+22.75;
return k;
}
//K2
double K14(double y){
double k=3.25*y+19.5;
return k;
}
//K3
double K15(double y){
float k=-3.25*y+26;
return k;
}
//K4
double K16(double y){
double k=3.25*y+22.75;
return k;
}

//FUNCIÓN PARA DETERMINAR ALFA 1 Y ALFA 2


// Funcion de Calculo y ordenamiento de u1, u2. u1>u2

void CalcU(double u){

if(u>=-17.28 & u<-1.57)

{
// Serial.print("NEGATIVOS");

if(u>=-17.28 & u<-9.42){


u1=L1(ang);
u2=L2(ang);}

if(u>=-9.42 & u<-1.57){


u1=L3(ang);
u2=L4(ang);
}

if(u>=-1.57 & u<=45.55){

//Serial.print("POSITIVOS");

if(u>=-1.57 & u<6.28){

u1=L5(ang);
u2=L6(ang);
}

if(u>=6.28 & u<14.14){

u1=L7(ang);
u2=L8(ang);

if(u>=14.14 & u<21.99){

u1=L9(ang);
u2=L10(ang);
}

if(u>=21.99 & u<29.85){

u1=L11(ang);
u2=L12(ang);

if(u>=29.85 & u<37.7){

u1=L13(ang);
u2=L14(ang);

if(u>=37.7 & u<=45.55){

u1=L15(ang);
u2=L16(ang);

c=0.00003*ang*ang*ang*ang-0.0018*ang*ang*ang-0.016*ang*ang+1.167*ang+15.037;
if (u1>=u2)
{out=u2;}
if (u2>u1)
{out=u1;}

//CALCULO FUNCION SALIDA


void CalcOut(double k){

if(k>=0 & k<3.25)


{
k1=K1(out);
k2=K2(out);
}

if(k>=3.25 & k<6.5)


{
k1=K3(out);
k2=K4(out);
}

if(k>=6.5 & k<9.75)


{
k1=K5(out);
k2=K6(out);
}

if(k>=9.75 & k<13)


{
k1=K7(out);
k2=K8(out);
}

if(k>=13 & k<16.25)


{
k1=K9(out);
k2=K10(out);
}

if(k>=16.25 & k<19.5)


{
k1=K11(out);
k2=K12(out);
}

if(k>=19.5 & k<22.75)


{
k1=K13(out);
k2=K14(out);
}

if(k>=22.75 & k<26)


{
k1=K15(out);
k2=K16(out);
}

// Funcion de seleccion de salida R,A,B,C


char Salida(char opc){
switch(opc){
case 'T':
ou='R';
break;
case 'S':
ou='A';
break;
case 'M':
ou='B';
break;
case 'L':
ou='C';
break;
}
}
//Funciones de Salida

//COMIENZA SERIAL
void setup() {
Serial.begin(9600);
}

void loop() {
// Serial.print("INGRESE EL ÁNGULO DE ENTRADA ");
if(Serial.available()>0){
String data = Serial.readStringUntil('\n');
//lo transforma a doble
ang=data.toDouble();
//se ingresa a CalcU el angulo doble
Serial.println("ANGULO= ");
Serial.println(ang);
CalcU(ang);
// Serial.print("LOS DATOS SON");
Serial.print("ALFA1= ");
Serial.println(u1);
Serial.print("ALFA2= ");
Serial.println(u2);
Serial.println("ALFA MIN=");
Serial.println(out);
CalcOut(out);

Serial.print("BETA1= ");
Serial.println(k1);
Serial.print("BETA2= ");
Serial.println(k2);
Serial.println("CENTROIDE");
Serial.println(c);
Serial.print("////////////////");

lcd.begin(16, 2); //Inicializamos la pantalla


lcd.print(c);
lcd.setCursor(0, 0); //Situamos el cursor
lcd.print("a1=");
lcd.print(u1);
lcd.print(", a2=");
lcd.print(u2);
}

Vous aimerez peut-être aussi