Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PUEBLA
FACULTAD DE CIENCIAS DE LA ELECTRNICA
Alumnos:
Salazar Snchez Marco Antonio 200836235
Mendoza Hernndez Felipe 201014611
Contreras De La Llave Yair 200819392
ASIGNATURA:
INTELIGENCIA ARTIFICIAL
PROFESOR:
Dra. Leticia Gmez Esparza
Objetivo:
El problema definido para la elaboracin del proyecto consiste en el desarrollo de un
controlador difuso para un sistema levitador.
Este consta de dada una distancia especfica, automticamente mantener un objeto a
dicha distancia, sin importar las perturbaciones a las que se someta el sistema.
Metodologa:
Para la elaboracin del levitador se utiliz el siguiente material:
1 bola de unicell
1 tubo de acrlico de 70 cm
1 ventilador de 12v a 0.4A
2 Abrazaderas
4 tornillos
8 tuercas
1 caja de bocina para montar el tubo y el ventilador
Desarrollo:
Etapa de Control
PIC18F4550
Los PIC son una familia de microcontroladores tipo RISC fabricados por Microchip
Technology Inc. y derivados del PIC1650, originalmente desarrollado por la divisin de
microelectrnica de General Instrument.
El nombre actual no es un acrnimo. En realidad, el nombre completo es PICmicro,
aunque generalmente se utiliza como Peripheral Interface Controller (controlador de
interfaz perifrico).
El PIC original se dise para ser usado con la nueva CPU de 16 bits CP16000. Siendo en
general una buena CPU, sta tena malas prestaciones de entrada y salida, y el PIC de 8
bits se desarroll en 1975 para mejorar el rendimiento del sistema quitando peso de E/S a
la CPU. El PIC utilizaba microcdigo simple almacenado en ROM para realizar estas
HC-SR04
El HC-SR04 es un sensor ultrasnico de bajo costo que no slo puede detectar si un
objeto se presenta, como un sensor PIR (Passive Infrared Sensor), sino que tambin
puede sentir y transmitir la distancia al objeto.
Tienen dos transductores, bsicamente, un altavoz y un micrfono. Ofrece una excelente
deteccin sin contacto (remoto) con elevada precisin y lecturas estables en un formato fcil
de usar. El funcionamiento no se ve afectado por la luz solar o el material negro como
telmetros pticos (aunque acsticamente materiales suaves como telas pueden ser
difciles de detectar). La velocidad del sonido en el aire (a una temperatura de 20C) es de
343 m/s. (por cada grado centgrado que sube la temperatura, la velocidad del sonido
aumenta en 0,6 m/s.
Caractersticas tcnicas:
Los mdulos incluyen transmisores ultrasnicos, el receptor y el circuito de control.
Nmero de pines:
VCC: Alimentacin +5V (4.5V min 5.5V mx.)
TRIG: Trigger entrada (input) del sensor (TTL)
ECHO: Echo salida (output) del Sensor (TTL)
GND
Corriente de reposo: < 2mA
Corriente de trabajo:15mA
ngulo de medicin: 30
Sistema Difuso
El diseo de un controlador difuso implica la definicin de cada uno de los cuatro mdulos,
se asume que en algn sentido, antes de comenzar la especificacin de cada uno de ellos
en detalle, ya se conoce (o se ha definido) aproximadamente la forma que tendr. Esto es
debido a que existe una estrecha interdependencia entre todos ellos; por un lado, a medida
que se van definiendo los parmetros de un mdulo y se avanza hacia la especificacin de
los otros, un proceso de iteracin es requerido; por otro lado, el proceso puede empezar a
partir de establecer cualquiera de ellos y avanzar en el diseo, ya sea hacia delante o
hacia atrs, en la determinacin de los dems. Por ejemplo, no es posible establecer la
forma en la que la informacin medida ser convertida en difusa sin conocer previamente
la forma en la que se obtendran las reglas de control. Por ejemplo, si las reglas son
obtenidas a partir del conocimiento heurstico de un operador experto, es muy posible que
el ingeniero de control decida la seleccin del nmero de clases o valores lingsticos de
cada variable difusa en funcin del conocimiento expresado por el experto. Por el contrario,
cuando no se cuenta con informacin heurstica para describir los criterios de operacin de
la planta, se fijara un nmero aproximado de clases y la definicin de las reglas debera de
limitarse al nmero predefinido. Si el comportamiento del controlador no es el adecuado, es
posible que un aumento en el nmero de clases permita aumentar tambin la resolucin
del controlador. Las ideas de interdependencia y de un proceso de prueba y error deben
ser mantenidas en mente durante la descripcin de la arquitectura general de los
controladores difusos que se da a continuacin. El orden de exposicin no es el orden de
diseo; ms bien, es el orden que sigue el flujo de informacin a medida que las seales
de entrada son procesadas para encontrar una seal de control como respuesta.
Tabla de reglas
E
NG
Np
Z
Pp
PG
dE
NG
PG
PG
PG
Pp
Z
Np
PG
Pp
Pp
Z
Np
Z
PG
Pp
Z
Np
NG
Pp
Pp
Z
Np
Np
Np
PG
Z
Np
NG
Np
NG
Base de reglas.
Simulacin
Resultados
Se hicieron varias pruebas y se tuvieron dificultades con el sensor, el cual se corrigi
cambiando el arduino por un pic, con el cual funciono bien el sensor, pero por la corriente
de salida del pic se tuvo que implementar una etapa de potencia.
Al final se logr que la planta funcionara de manera ptima despus de varios ajustes en el
estado inicial del programa.
Conclusiones
Programa
#include <18f4550.h>
#fuses
XTPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,NOVR
EGEN,NOPBADEN,NOBROWNOUT
#device adc=10
#use delay(clock=4000000)
#byte
#byte
#byte
#byte
#byte
porta = 0xf80
portb = 0xf81
portc = 0xf82
portd = 0xf83
porte = 0xf84
#include <math.h>
#include <lcd.c>
#include <string.h>
float n;
int16 pulsos;
int16 interrupcion;
int16 valor=0;
int16 valor1=0.0;
int16 comple=0.0;
float x=0.0;
//float x1=0.0;
//float x2=0.0;
float A=0.0;
float A1=0.0;
float A2=0.0;
float A3=0.0;
float A4=0.0;
float y=0.0;
float B=0.0;
float B1=0.0;
float B2=0.0;
float B3=0.0;
float B4=0.0;
float R1=0.0;
float R2=0.0;
float R3=0.0;
float R4=0.0;
float R5=0.0;
float R6=0.0;
float R7=0.0;
float R8=0.0;
float R9=0.0;
float R10=0.0;
float R11=0.0;
float s=0.0;
float s1=0.0;
float Z=0.0;
void fuzzy (void)
{ //////////////////////////////////////////////////////////
//fuzificacion
///Distancia real
//Bajo
if(x<0.4){
A=0.0;
}
if((x>=0.4)&&(x<=0.75)){
A=(0.75-x)/(0.75-0.4);
}
if(x>0.75){
A=0.0;
}
//MedioBajo
if((x<0.7)||(x>0.85)){
A1=0.0;
}
if((x>=0.7)&&(x<=0.8)){
A1=(x-0.7)/(0.8-0.7);
}
if((x>0.8)&&(x<=0.85)){
A1=(0.85-x)/(0.85-0.8);
}
//Medio
if((x<0.8)||(x>0.9)){
A2=0.0;
}
if((x>=0.8)&&(x<=0.85)){
A2=(x-0.8)/(0.85-0.8);
}
if((x>0.85)&&(x<=0.9)){
A2=(0.9-x)/(0.9-0.85);
}
//MedioAlto
if((x<0.85)||(x>1.05)){
A3=0.0;
}
if((x>=0.85)&&(x<=0.95)){
A3=(x-0.85)/(0.95-0.85);
}
if((x>0.95)&&(x<=1.05)){
A3=(1.05-x)/(1.05-0.95);
}
//Alto
if((x<0.95)||(x>2.25)){
A4=0.0;
}
if((x>=0.95)&&(x<=2.25)){
A4=(x-0.95)/(2.25-0.95);
}
/////Distancia Anterior
y=x;
//Bajo
if(y<0.4){
B=0.0;
}
if((y>=0.4)&&(y<=0.75)){
10
B=(0.75-y)/(0.75-0.4);
}
if(y>0.75){
B=0.0;
}
//MedioBajo
if((y<0.7)||(y>0.85)){
B1=0.0;
}
if((y>=0.7)&&(y<=0.8)){
B1=(y-0.7)/(0.8-0.7);
}
if((y>0.8)&&(y<=0.85)){
B1=(0.85-y)/(0.85-0.8);
}
//MMedio
if((y<0.8)||(y>0.9)){
B2=0.0;
}
if((y>=0.8)&&(y<=0.85)){
B2=(y-0.8)/(0.85-0.8);
}
if((y>0.85)&&(y<=0.9)){
B2=(0.9-y)/(0.9-0.85);
}
//MedioAlto
if((y<0.85)||(y>1.05)){
B3=0.0;
}
if((y>=0.85)&&(y<=0.95)){
B3=(y-0.85)/(0.95-0.85);
}
if((y>0.95)&&(y<=1.05)){
B3=(1.05-y)/(1.05-0.95);
}
//Alto
if((y<0.95)||(y>2.25)){
B4=0.0;
}
if((y>=0.95)&&(y<=2.25)){
B4=(y-0.95)/(2.25-0.95);
}
// delay_ms(1000);
}
void base_de_reglas (void)
{
///////////////////////////////////////////////Base de reglas
//SI Dis anterior es bajo y dis real es bajo entonces motor va hacia derecha//R1=
min(A,B)
if(A<=B){
R1=A;}
else{
R1=B;}
//SI Dis anterior es bajo y dis real es medio entonces motor es igual//R2= min(A,B1)
if(A1<=B1){
R2=A1;}
11
else{
R2=B1;}
//SI Dis anterior es bajo y dis real es alto entonces motor va hacia izquierda//R3=
min(A,B3)
if(A1<=B2){
R3=A1;}
else{
R3=B2;}
//SI Dis anterior es bajo y dis real es alto entonces motor va hacia izquierda//R3=
min(A,B3)
if(A1<=B){
R4=A1;}
else{
R4=B;}
//SI Dis anterior es bajo y dis real es alto entonces motor va hacia izquierda//R3=
min(A,B3)
if(A2<=B3){
R5=A2;}
else{
R5=B3;}
//SI Dis anterior es medio y dis real es bajo entonces motor va hacia derecha //R4=
min(A1,B)
if(A2<=B2){
R6=B2;}
else{
R6=A2;}
//SI Dis anterior es medio y dis real es medio entonces motor es igual//R5= min(A1,B1)
if(A2<=B1){
R7=A2;}
else{
R7=B1;}
//SI Dis anterior es medio y dis real es alto entonces motor va hacia izquierda //R6=
min(A1,B2)
if(A3<=B4){
R8=A3;}
else{
R8=B4;}
//SI Dis anterior es medio y dis real es alto entonces motor va hacia izquierda //R6=
min(A1,B2)
if(A3<=B2){
R9=A3;}
else{
R9=B2;}
//SI Dis anterior es alto y dis real es bajo entonces motor va hacia derecha//R7=
min(A2,B)
if(A3<=B3){
R10=A3;}
else{
R10=B3;}
//SI Dis anterior es alto y dis real es medio entonces motor es igual//R8= min(A2,B1)
if(A4<=B4){
R11=A4;}
else{
R11=B4;}
// delay_ms(500);
}
12
13
set_tris_c(0x00);
set_tris_b(0x00);
output_c(0x00); // Set CCP2 output low
output_b(0x00);//Entrada de pulsos por RC0
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);
setup_timer_2(T2_DIV_BY_4, 255, 1);
enable_interrupts(GLOBAL);
enable_interrupts(int_RTCC);
lcd_init();
delay_ms(10);
// lcd_gotoxy(1,1);
//printf(lcd_putc, "Control Difuso!!");
//delay_ms(10);
do
{
set_adc_channel(0);
valor=read_adc();
delay_ms(10);
x=(5.0*(valor))/1023.0;
///////////fuzificacion//////////////
fuzzy();
delay_ms(10);
///////////base de reglas////
base_de_reglas();
delay_ms(10);
//////////////desfuzzy/////////////////////////
desfuzzy();
delay_ms(10);
//////////valor en motor//////////////////////
motor();
delay_ms(10);
//////////Mensaje LCD///////////////////
// lcd();
// delay_ms(10);
////////////////////////
pulsos=get_timer1();
//Se entra en la interrupcin cada 10ms
interrupcion++;
if(interrupcion==100)
//10ms 500 = 5s
{
n=pulsos;
interrupcion=0;
set_pwm1_duty(valor1);
set_pwm2_duty(comple);
set_timer1(0);
set_rtcc(217);
}
else
14
{
set_pwm1_duty(valor1);
set_pwm2_duty(comple);
set_rtcc(217);
//Inicializa el TMR0
set_timer1(n);
//Recupera los pulsos
}
// delay_ms(200);
// setup_timer_2(T2_DIV_BY_16,255,1);
//enable_interrupts(global);
// delay_ms(500);
}while(1);
}
15