Académique Documents
Professionnel Documents
Culture Documents
T E S I S
Presenta:
Director de Tesis:
M. I. A. Leticia Cuéllar Hernández
Co-Director de Tesis:
M. en I.B. Luis Julián Varela Lara
INTRODUCCIÓN ............................................................................................................................................... 1
CAPÍTULO I ANTECEDENTES....................................................................... 3
En esta tesis se explicará el uso de redes neuronales artificiales para obtener la función de
calibración de un sensor no lineal en su rango de medida, se adquirirán datos de la salida
del sensor no lineal con relación a entradas conocidas de la variable medida, como ejemplo
se utilizará un termistor, ya que tiene un comportamiento no lineal, la adquisición de datos
se realizará con un sistema de adquisición de señal utilizando un microcontrolador que se
encargará de la conversión analógico a digital y también de enviar los datos adquiridos
haciendo uso de la comunicación serial, se utilizará una computadora para guardar los datos
recopilados del sensor y utilizar un programa que sirva para establecer la comunicación,
estos datos serán la base para poder generar y entrenar una red neuronal artificial y obtener
la función de calibración del sensor.
La red neuronal artificial servirá para interpolar valores entre datos definidos por puntos en
la curva de calibración del sensor, es decir, se puede aproximar la salida de una red
neuronal artificial a la curva característica del sensor y precisamente es lo que se busca para
poder calibrar un sensor. Para generar y probar la red neuronal artificial se utilizará un
programa que permita buscar la arquitectura adecuada de la red y cuando se obtenga la red
entrenada se pueda probar con valores desconocidos, es decir, para valores diferentes con
los que fue entrenada la red y observar por medio de una gráfica la aproximación de la red
a la curva de calibración.
1
En el capítulo tres se mostrará la forma de comunicar la señal del sensor con una
computadora, el puerto que se ocupa y como almacenar la información en un archivo de
texto, para mostrar los resultados se utilizará un programa diseñado en la interfaz gráfica de
usuario de Matlab, que permite ejecutar la adquisición de datos y mostrar los resultados en
gráficas.
Durante el capítulo cinco se expondrán los resultados de las pruebas que se llevaran a cabo,
desde la adquisición de datos del sensor hasta encontrar la función de calibración con las
redes neuronales artificiales, también se explicará cómo implementar en un
microcontrolador la red neuronal artificial entrenada.
2
I
ANTECEDENTES
1.1 SENSORES
En la mayoría de los sistemas de instrumentación la variable de entrada es no eléctrica. Con
el fin de utilizar métodos eléctricos y técnicas de medición, manipulación o control, las
cantidades no eléctricas se convierten en una señal eléctrica por medio de un dispositivo
que es llamado con el término de sensor. Un sensor es un dispositivo capaz de detectar
magnitudes físicas o químicas, llamadas variables de instrumentación, y transformarlas en
variables eléctricas. Las variables de instrumentación pueden ser por ejemplo: temperatura,
intensidad lumínica, distancia, aceleración, inclinación, desplazamiento, presión, fuerza,
torsión, humedad, por mencionar algunas y el sensor está siempre en contacto con la
variable medida.
Los sensores son los elementos de un sistema que lo conectan con su entorno físico, La
función de los sensores es obtener señales eléctricas en respuesta a magnitudes de entrada
no eléctricas. En un sistema de adquisición de señal el sensor es el dispositivo de entrada
que recibe la cantidad por medir y envía una señal eléctrica proporcional al dispositivo
acondicionador de señal.
Como la finalidad de un sensor es dar una salida eléctrica que se corresponda con una
determinada magnitud aplicada a su entrada, un primer grupo de características se refiere a
la descripción de dicha correspondencia. Dado que en las condiciones normales de
utilización la magnitud de entrada varía lentamente, se distingue entre el comportamiento
del sensor frente a entradas de valor constante como características estáticas, y su
comportamiento frente a entradas variables como características dinámicas.
3
1.1.2 Características estáticas
Las características estáticas esenciales son: exactitud, precisión y sensibilidad. Otras
características como linealidad, resolución, histéresis. etc., son secundarias.
4
- Error de cero y error de sensibilidad. Para los sensores lineales es común descomponer el
error en dos términos: error de cero y error de ganancia (o de sensibilidad). El error de cero
(figura 1.1 a)) es el valor de la salida del sensor en el punto en que supuestamente debía ser
nula. El error de ganancia indica la discrepancia entre la sensibilidad prevista y la
observada. Ambos errores varían con los factores ambientales, en particular la temperatura,
y a menudo también con la tensión de alimentación y con el tiempo. Dichas variaciones se
denominan derivas [3].
a) b)
Figura 1.1 a) Gráfica de error cero b) Gráfica de una respuesta no lineal.
En muchos de los casos las respuestas de los sensores no presentan una linealidad con la
variable física que están observando, y aun más, en ocasiones resulta complejo intentar
representar estas respuestas mediante ecuaciones matemáticas que permitan un modelo
formal de los sensores.
5
En un sensor que tiene como inconveniente una respuesta no lineal, pero que tiene otras
características que lo hacen apropiado para alguna aplicación en algún sistema de medida o
de control, se tiene que buscar la forma de que a la misma entrada le corresponda una
misma salida. Esto se pude lograr con técnicas de inteligencia Artificial específicamente
con redes neuronales artificiales. Por medio de una red neuronal artificial se encuentra una
función, que se pueda aproximar con un error muy bajo, a la curva de calibración del
sensor.
Dado que hay diversos criterios para definir los instantes inicial y final de la respuesta, hay
también diversas definiciones para el retardo. Cuando el sensor es de primer orden y tipo
paso bajo, es común tomar como retardo, o tiempo de respuesta, el tiempo que tarda la
salida en alcanzar el 63 % de su valor final cuando se aplica una entrada en forma de
escalón, y que coincide con la denominada constante de tiempo (t) del sistema. Otra
alternativa es tomar el intervalo de tiempo que tarda la salida en pasar del 10 % al 90 % de
su valor final, también frente a una entrada en escalón. Dicho intervalo se denomina tiempo
de subida de la respuesta [3].
6
Las redes neuronales imitan la estructura hardware del sistema nervioso, con la intención de
construir sistemas de procesamiento de la información paralelos, distribuidos y adaptativos,
que pueden presentar un cierto comportamiento “inteligente”.
Por lo tanto, la idea que subyace en los sistemas neuronales artificiales es que, para abordar
el tipo de problemas que el cerebro resuelve con eficiencia puede resultar conveniente
construir sistemas que “copien” en cierto modo la estructura de las redes neuronales
biológicas con el fin de alcanzar una funcionalidad similar[5].
Las RNA no ejecutan instrucciones, responden en paralelo a las entradas que se les
presenta. El resultado no se almacena en una posición de memoria, este es el estado de la
7
red para el cual se logra equilibrio. El conocimiento de una red neuronal no se almacena en
instrucciones, el poder de la red está en su topología y en los valores de las conexiones
(pesos) entre neuronas.
Existen varias formas de nombrar una neurona artificial, es conocida como nodo, celda,
unidad o elemento de procesamiento; En la figura 1.3 se observa la representación de una
neurona artificial en forma general y su similitud con una neurona biológica.
De la observación detallada del proceso biológico se han hallado los siguientes análogos
con el sistema artificial:
• Las entradas 𝑋𝑖 representan las señales que provienen de otras neuronas y que son
capturadas por las dendritas.
• Los pesos 𝑊𝑖 son la intensidad de la sinapsis que conecta dos neuronas; tanto 𝑋𝑖 como
𝑊𝑖 son valores reales.
8
• θ es la función umbral que la neurona debe sobrepasar para activarse; este proceso
ocurre biológicamente en el cuerpo de la célula.
Las señales de entrada a una neurona artificial 𝑋1 , X2,…, Xn son variables continuas en lugar
de pulsos discretos, como se presentan en una neurona biológica. Cada señal de entrada
pasa a través de un peso, llamado peso sináptico o fortaleza de la conexión cuya función es
análoga a la de la función sináptica de la neurona biológica. Los pesos pueden ser positivos
(excitatorios), o negativos (inhibitorios), el nodo sumatorio acumula todas las señales de
entradas multiplicadas por los pesos o ponderadas y las pasa a la salida a través de una
función umbral o función de transferencia. La entrada a cada unidad de la red neuronal
puede escribirse como la ecuación 1.1:
𝑛
𝑛𝑒𝑡𝑖 = � 𝑊𝑖 𝑋𝑖 = 𝑋⃗𝑌
�⃗ 𝑒𝑐𝑢𝑎𝑐𝑖ó𝑛 1.1
𝑖=1
Una idea clara de este proceso se muestra en la figura 1.4 en donde puede observarse el
recorrido de un conjunto de señales que entran a la red.
Una vez que se ha calculado la activación del nodo, el valor de salida equivale a la ecuación
1.2.
𝑥𝑖 = 𝑓𝑖 (𝑛𝑒𝑡𝑖 ) 𝑒𝑐𝑢𝑎𝑐𝑖ó𝑛 1.2
Existen varios modelos de redes neuronales como lo son: el perceptrón simple, adalina y
perceptrón multicapa, este último es el utilizado como aproximador de funciones y es el
que se usará para encontrar una función que caracterice a un sensor no lineal.
El proceso mediante el cual la red va modificando sus pesos y ganancias de tal manera que
al final del proceso se tiene el comportamiento deseado se conoce como aprendizaje. Las
9
redes neuronales artificiales son capaces de aprender a partir de señales o datos
provenientes del exterior, estas señales son obtenidas por los sensores en respuesta a una
variable física.
Son muchas las aplicaciones que tienen la RNAs con sensores, se resaltan algunas que
buscan imitar nuestros sentidos, como la visión, el olfato, etc. Otra disciplina que
actualmente está aprovechando las bondades de esta tecnología es la robótica. Por ejemplo
un robot móvil que procesa información proveniente de una serie de sensores que
conforman a su vez una red neuronal artificial que le permite esquivar obstáculos de
manera autónoma e inteligente.
Otra de las aplicaciones de las redes neuronales con sensores es usarlas para calibrar un
sensor no lineal, que es el tema de esta tesis, se usa una red neuronal artificial multicapa
como aproximador de funciones para ajustarse a la curva de calibración del sensor, para
esto se necesita conocer una muestra de datos para poder entrenar la red neuronal y a
partir de un conjunto de entradas proporcionar la salida deseada.
Cabe aclarar que la intención de este trabajo no es verificar si las RNAs resultan más
eficientes que los métodos convencionales como el de mínimos cuadrados, la finalidad es
establecer la metodología a seguir para poder obtener la función de calibración de un
sensor mediante el uso de una RNA, Así como también el poder implementar la red
entrenada en un microcontrolador para generar un sistema embebido. Para obtener los
datos necesitamos un sistema de adquisición de señal, que es el tema del próximo capítulo.
10
II
ADQUISICIÓN DE SEÑAL
11
En este trabajo se utilizará un sistema de adquisición de señal para registrar datos que se
originan a partir de un sensor no lineal, los datos se obtienen de la salida del sensor y se
relaciona con el valor de la variable medida en base a un patrón de referencia, con estos
valores, se genera un archivo de datos que contenga las mediciones de la salidas del sensor
en todo su rango de medida, estos valores son necesarios para entrenar una red neuronal
artificial; los tres elementos del sistema de adquisición que se utilizan es: un sensor que
recibe la variable física (por ejemplo un termistor para medir la temperatura), el circuito
acondicionador del sensor, y el convertidor analógico digital, este último se basa en el uso
de un microcontrolador, el diagrama a bloques se muestra en la figura 2.1.
El sensor a utilizar para fines de esta tesis debe tener como características la no linealidad
para poder demostrar como una red neuronal artificial, permite encontrar una función que
pueda describir la respuesta del sensor en todo su rango de medida, el sensor que se
utilizará como ejemplo para obtener su curva de calibración, es un termistor, por ser un
sensor con una respuesta no lineal.
2.3.1 Termistor
El término termistor es una castellanización del inglés thermistor, formado a partir de los
vocablos thermally sensitive resistor. Son resistores variables con la temperatura, pero no
están basados en conductores, sino en semiconductores. Los termistores tienen un
coeficiente de temperatura de resistencia negativo de valor elevado, por lo que presentan
unas variaciones rápidas y extremadamente grandes para los cambios relativamente
pequeños en la temperatura. Si su coeficiente de temperatura es negativo se denominan
NTC (Negative Temperature Coefficient), mientras que si es positivo se denominan PTC
12
(Positive Temperature Coefficient). Los símbolos respectivos son los de la figura 2.2, donde
el trazo horizontal en el extremo de la línea inclinada indica que se trata de una variación
no lineal [2].
Figura 2.2 Símbolo para una resistencia con dependencia intrínseca de la temperatura y
variación no lineal, con sensibilidad positiva o negativa.
Los termistores se fabrican con óxidos de níquel, manganeso, hierro, cobalto, cobre,
magnesio, titanio y otros metales, y están encapsulados. La relación entre la resistencia del
termistor y la temperatura viene dada por la ecuación 2.1. En la figura 2.3 pueden verse la
curva características de un termistor NTC. [7].
Por su alta sensibilidad permiten obtener alta resolución en la medida de temperatura. Dada
su alta resistividad, lo que les confiere una velocidad de respuesta rápida y permite emplear
hilos largos para su conexión, aunque éstos vayan a estar sometidos a cambios de
temperatura, porque ellos tienen mayor resistencia y coeficiente de temperatura. Permiten
también una gran variedad de aplicaciones a base de autocalentamiento y todo ello a un
bajo costo [2].
13
2.4 ACONDICIONAMIENTO DE SEÑAL
Para aprovechar el margen dinámico de salida del convertidor analógico digital (2𝑛 valores
correspondientes a un margen de tensiones de entrada M), el margen de amplitudes de la
señal debe coincidir con el de entrada del convertidor (M). Para ello hay que amplificar la
salida del sensor pero evitando la saturación del amplificador. Al mismo tiempo, hay que
hacer compatible la salida del sensor con la entrada del convertidor analógico digital
(CAD). Esta última suele ser unipolar y con impedancia de 1 a 10 k, mientras que la salida
del sensor puede ser diferencial o de alta impedancia. Además, según el teorema del
muestreo, el ancho de banda de la señal a convertir (incluidas las componentes no deseadas
ruido. interferencias, si las hay) debe ser inferior a la mitad de la frecuencia con que se
tomen las muestras en el proceso de cuantificación [3].
Dado que manejan sólo señales eléctricas sin convertirlas en otras formas físicas, los
acondicionadores de señal constituyen lo que se denomina una interfaz. Otras interfaces del
sistema son las necesarias para enviar la información a través de los canales o líneas de
comunicación. Su función y estructura dependen tanto del medio de comunicación como
del código empleado para el mensaje [3].
𝑉 = 𝐼𝑅 𝑒𝑐𝑢𝑎𝑐𝑖ó𝑛 2.2
De esta manera si la corriente (I) es conocida, la única variable es la resistencia (R), que es
lo que varía en el termistor cuando cambia la temperatura (variable física).
En el circuito utilizado en este trabajo hay dos bloques: el bloque de alimentación del
sensor y el de acondicionamiento de la caída de tensión en el. La alimentación del sensor
se realiza a partir de una tensión de referencia que fuerza una corriente constante hacia el
14
sensor a través de la resistencia de polarización R2. El transistor permite obtener una
corriente mayor que la que ofrece el amplificador operacional. A la salida se utiliza un
seguidor para que sea la entrada al convertidor analógico digital. El diagrama se muestra en
la figura 2.4.
Para este caso se utilizo un voltaje de referencia a través del diodo zener de 3.3v y una
resistencia de polarización de 47k (R2), de esta manera se obtiene una corriente constante
de 68.93 µA.
• Rango de entrada.
• Número de bits.
• Resolución.
• Tensión de fondo de escala.
• Tiempo de conversión.
• Error de conversión.
El módulo que utilizan los PIC de gama media tiene un número de bits de 10, por lo que su
resolución se muestra en la ecuación 2.3:
𝑉𝐼𝑁
𝑟𝑒𝑠𝑜𝑙𝑢𝑐𝑖ó𝑛 = 𝑒𝑐𝑢𝑎𝑐𝑖ó𝑛 2.3
2𝑁 −1
Siendo 𝑉𝐼𝑁 la tensión de entrada y N el número de bits del convertidor. Es decir, para la
tensión máxima de entrada (5V) la resolución es de 0.0048 V. [8].
16
La resolución vendrá dada por la siguiente ecuación:
(𝑉𝑅𝐸𝐹+ − 𝑉𝑅𝐸𝐹− )
1LSB=𝑉𝑅𝐸𝐹− + 𝑒𝑐𝑢𝑎𝑐𝑖ó𝑛 2.4
1024
Las funciones que se utilizan del compilador C para manejar el convertidor AD son las
siguientes:
setup_adc (modo);
Modo: para la configuración del módulo conversor A/D correspondientes a los bits
7:6 del registro ADCON0.
Setup_adc(modo); ADC0N0(1Fh)
ADC_OFF 00000000
00h
ADC_CLOCK_INTERNAL 11000000
C0h
ADC_CLOCK_DIV_2 00000000
00h
ADC_CLOCK_DIV_8 01000000
40h
ADC_CLOCK_DIV_32 10000000
80h
17
setup_adc_ports (valor);
Valor: definición de las entradas analógicas correspondiente a los bits 3-0 del
ADCON1
set_adc channel (canal);
Canal: selección del canal analógico correspondiente a los bits 5:3 de ADCON0.
Con fines didácticos, en este trabajo se escriben los códigos fuente, los cuales pueden variar
de acuerdo a las características del microcontrolador.
Con estas funciones podemos hacer el programa para utilizar el convertidor analógico
digital del microcontrolador y mostrar los resultados en una LCD, el código es el siguiente:
#include <16F877a.h>
#device adc=10
#fuses HS, NOWDT
#use delay(clock=20000000)
#include <LCD.C>
void main() {
int16 q;
float p;
while (true) {
set_adc_channel(0); //Habilitación canal0
delay_us(20);
q = read_adc(); //Lectura canal0
p = 5.0 * q / 1024.0; //Conversión a tensión
18
de la conversión en voltaje. El programa completo es el siguiente:
#include <16F877a.h>
#device adc=10
#fuses HS, NOWDT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
#include <LCD.C>
int16 dig;
float vol;
void sensor(){
set_adc_channel(0); //Habilitación canal0
delay_us(20);
dig = read_adc(); //Lectura canal0
vol = 5.0 * dig / 1024.0; //Conversión a tensión
}
void main() {
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
lcd_init();
while (true) {
sensor ();
printf(lcd_putc, "\fADC = %4ld", dig);
printf(lcd_putc, "\nVoltage = %01.2fV", vol);
printf("%8ld", dig);
delay_ms(100);
}
}
19
momento, el cristal que se utiliza es es de 20MHz y el diagrama se muestra en la
siguiente figura 2.6.
20
III
INTERFAZ CON UNA
COMPUTADORA
El protocolo RS232 es una norma o estándar mundial que rige los parámetros de uno de los
modos de comunicación serial. Por medio de este protocolo se estandarizan las velocidades
de transferencia de datos, la forma de control que utiliza dicha transferencia, los niveles de
21
voltajes utilizados, el tipo de cable permitido, las distancias entre equipos, los conectores,
por mencionar algunas.
Los puertos serie son accesibles mediante conectores. La norma RS232 establece dos tipos
de conectores llamados DB 25 (de 25 pines) y DB 9 (de 9 pines), machos y hembras como
se ve en la figura 3.1, la norma RS232 se estableció para conectar una computadora con un
modem, por lo que aparecen muchas terminales en los conectores DB 25 que en otro tipo
de aplicaciones no se utilizan y en las que es más común utilizar el conector tipo DB-9 [9].
Cada una de las terminales del conector RS232 tiene una función especificada por la
norma. Hay unas terminales por los que se transmiten y reciben datos y otros que controlan
el establecimiento, flujo y cierre de la comunicación. Para comunicación con un
microcontrolador es suficiente con tres líneas:
PIN SEÑAL
1 Data Carrier Detecl (DCD)
2 Received Data (RxD)
3 Transmtted Data (TxD)
4 Data Terminal Readv (DTR)
5 Signal Ground (SG)
6 Data Set Readv ( DSR)
7 Request to Send (RTS)
8 Crear to Send (CTS)
9 Ring indicator (RI)
22
Figura 3.2 Cable serie-USB
La principal función del USART es la de transmitir o recibir datos en serie. Esta operación
puede dividirse en dos categorías: síncrona o asíncrona. La transmisión síncrona utiliza una
señal de reloj y una línea de datos, mientras que en la transmisión asíncrona no se envía la
señal de reloj, por lo que el emisor y el receptor deben tener relojes con la misma
frecuencia y fase. Cuando la distancia entre el emisor y el receptor es pequeña, se suele
utilizar la transmisión síncrona, mientras que para distancias mayores se utiliza la
transmisión asíncrona [8].
El USART puede transmitir o recibir datos serie. Puede transferir tramas de datos de 8 o 9
bits por transmisión y detectar errores de transmisión. También puede generar
interrupciones cuando se produce una recepción de datos o cuando la transmisión ha sido
completada.
Básicamente, la transmisión serie consiste en enviar los datos bit a bit a través de una línea
común en periodos de tiempo fijos, dando lugar a la llamada velocidad de transmisión o
número de bits enviados por segundo (baudios). Tanto el emisor como el receptor poseen
registros de desplazamiento para realizar la comunicación. [8].
23
una transmisora -TX- y otra receptora -RX-, transfiriendo información en ambos sentidos;
se puede transmitir y recibir información de forma simultánea) [8].
El modo más habitual de transmisión por el USART es el modo asíncrono, puesto que
permite comunicaciones en largas distancias. Para una comunicación desde el UART del
PIC, se debe conectar un mínimo número de señales, TXD y RXD así como la tierra
(GND). Los niveles de tensión empleados en la norma RS232 es diferentes al empleado
por el PIC. Por ello, suele ser necesaria la utilización de circuitos externos de adaptación,
pues utilizan señal TTL en el módulo USART por lo que se debe utilizar un conversor de
nivel RS232, como el MAX232.
3.1.3 Max232
El Max232 (figura 3.4 a) convierte los niveles RS232 (cerca de + 12 Y -12 V) a voltajes
TTL (O a +5 V) Y viceversa sin requerir nada más que una fuente de +5 V. El chip
contiene dos drivers TTL a RS232 y dos RS232 a TTL. Necesita cuatro condensadores
externos (figura 3.4 c) de 1µf microfaradios para generar el voltaje RS232 internamente.
El capacitor 5 es de 10µf y los demás son de 1µf para el circuito mostrado en la figura 3.4
c). Este circuito se va a sumar al sistema de adquisición que se muestra en la figura 2.5 del
capítulo dos para formar un sistema que pueda enviar datos a una computadora, el diagrama
completo se muestra en la figura 3.5.
24
Figura 3.4 a) Muestra el circuito integrado, b) El nombre de cada pin, c) Conexión típica
del max232.
25
3.3 SOFTWARE PARA EL CONTROL DE LA COMUNICACIÓN.
Para el control de la comunicación de la computadora con el microcontrolador es necesario
programar el siguiente software:
- Programa del microcontrolador con las funciones necesarias para envío de datos
utilizando el puerto UART.
Esta directiva permite configurar varios parámetros del UART: velocidad de transmisión,
pines utilizados, etc. Se puede modificar en cualquier parte del programa pero siempre
después de haber definido la directiva #USE DELAY. Esta directiva habilita el uso de
funciones tales como getch (), putchar () y printf (). [8]
putc (cdata)
putchar (cdata)
cdata es un carácter de 8 bits. Esta función envía un carácter mediante la patilla XMIT. La
directiva #USE RS232 debe situarse siempre antes de utilizar ésta función.
puts (string)
string: cadena de caracteres constante o matriz de caracteres terminada con un 0.
La función puts() manda los caracteres de la cadena, uno a uno, a través del bus RS-232
26
utilizando la función putc(); detrás de la cadena envía un return (13) y un retorno de carro
(10).
t puede indicar:
C Carácter.
S Cadena o carácter.
U Entero sin signo.
D Entero con signo.
Lu Entero largo sin signo.
Ld Entero largo con signo.
X Entero hexadecimal (minúsculas).
X Entero hexadecimal (mayúsculas).
Lx Entero largo hexadecimal (minúsculas).
LX Entero largo hexadecimal (mayúsculas).
F Flotante con truncado.
G Flotante con redondeo.
E Flotante en formato exponencial.
W Entero sin signo con decimales insertados. La primera
cifra indica el total, la segunda el número de decimales.
27
s = instrfind;
if~isempty( s )
fclose( s );
delete( s );
clear s
end
SerPIC = serial('COM1');
set(SerPIC,'BaudRate',9600);
set(SerPIC,'DataBits',8);
set(SerPIC,'Parity','none');
set(SerPIC,'StopBits',1);
set(SerPIC,'FlowControl','none');
set(SerPIC,'InputBufferSize' ,20);
fopen(SerPIC);
La función serial crea un objeto que contiene todos los parámetros correspondientes al
puerto serial como baudios, bits de datos, bit de parada, etc. Estos parámetros son
modificados con la función set.
Una vez establecidos los parámetros de la comunicación, se procede a abrir el puerto con la
función fopen:
fopen(SerPIC);
A=fscanf(SerPIC,'%d',1)
Una vez terminada la comunicación, se procede a cerrar el puerto con la siguiente línea de
código:
fclose(SerPIC);
Una vez que los controles están en posición se editan las funciones de llamada (Callback)
28
de cada uno de ellos, escribiendo el código de Matlab que se ejecutará cuando el control sea
utilizado.
Una aplicación GUIDE consta de dos archivos: .m y .fig. El archivo .m es el que contiene
el código con las correspondencias de los botones de control de la interfaz y el archivo .fig
contiene los elementos gráficos. Cada vez que se adicione un nuevo elemento en la interfaz
gráfica, se genera automáticamente código en el archivo .m.
• Adquirir datos del sensor a través del puerto serial RS232 y guardar la información
un archivo de texto.
• Graficar la curva de calibración y mostrar los valores usados.
• Crear una red neuronal multicapa
• Entrenar la red neuronal artificial
• Evaluar el funcionamiento de la red para valores deferentes al entrenamiento y
mostrar los resultados en una gráfica.
• Mostrar el valor de los pesos obtenidos al final del entrenamiento.
• Hacer pasar por la RNA entrenada, datos leídos del puerto serial y mostrar los
resultados.
Para facilitar la explicación de lo que se hace en esta interfaz, por cada punto se genera un
panel en el cual se encuentran los controles necesarios para que al activarlos ejecuten las
instrucciones que realizan cierta tarea.
29
Figura 3.6 Interfaz gráfica usuario para calibrar un sensor no lineal.
Para el primer punto (adquisición de datos) requiere de varios controles para realizar su
función, por eso se diseña en otra ventana, que se puede abrir desde un menú que se
encuentra en la interfaz gráfica de usuario principal como se muestra en la figura 3.7 a),
haciendo clic en “ADQUISICION DE DATOS” y luego en “INTERFAZ GRÁFICA”.
a) b)
Figura 3.7 a) Menú acceso a la interfaz gráfica de adquisición de datos. b) Menú de
acceso al archivo de texto.
Esta nueva ventana sirve para guardar los datos en un archivo de texto. También desde el
menú se puede abrir precisamente el archivo de texto que contiene los datos guardados de
la adquisición, como se muestra en la figura 3.7 b), La demás funciones se podrán ejecutar
a través de controles que tiene la interfaz gráfica de usuario principal y mostrar los
resultados en una gráfica.
3.5.2 Adquisición datos del sensor a través del puerto serial para
guardar la Información un archivo de texto.
Esta interfaz nos permite generar un archivo de texto, en el cual se guarden los datos que se
obtienen del sensor a calibrar. Este archivo será utilizado posteriormente en el capítulo
30
cuatro en el uso de una red neuronal artificial. El diseño de la interfaz gráfica para adquirir
y guardar datos leídos desde el puerto serie RS232 es como se muestra en la figura 3.8.
En el primer panel de control se tiene un botón y un espacio para mostrar valores, como se
muestra en la figura 3.9, la función que realiza, al activar el botón con el nombre de “LEER
DATO” va a leer el puerto serial RS232 y mostrar los resultados en el cada vez que el
microcontrolador envíe un dato.
Figura 3.9 Panel para mostrar datos que llegan al puerto serial.
31
Figura 3.10 Panel llamado control para adquisición de datos.
Para guardar los datos leídos del puerto serial en un archivo de texto, se utiliza el boton con
el nombre de “guarda en archivo”.
32
Para guardar los datos, es en base a las lecturas de un patrón de referencia, es decir, cuando
el patrón de referencia indique que existe cierta temperatura en este caso de -10ºC entonces
se presiona el botón para guardar los datos mostrados, al mismo tiempo el numero del
rectángulo blanco se irá incrementando, es decir, pasar a “-5”, este es el siguiente valor que
se espera que marque el patrón de referencia para que se vuelve a presionar el botón
“guarda dato”, de esta forma se adquieren datos cada 5 ºC.
33
IV
USO DE REDES NEURONALES
ARTIFICIALES
La neurona tiene una ganancia b, la cual llega al mismo sumador al que llegan las entradas
multiplicadas por los pesos, para formar la salida n.
𝑛 = 𝑾𝒑 + 𝑏 𝑒𝑐𝑢𝑎𝑐𝑖ó𝑛 4.2
35
este peso es la conexión de la segunda entrada a la primera neurona. La salida total está
determinada por la función de transferencia f, la cual puede ser una función lineal o no
lineal de n, y que es elegida dependiendo de las especificaciones del problema que la
neurona tenga que resolver. [10].
36
4.4.4 Función de transferencia tangente sigmoidal hiperbólica (tansig)
Esta función toma los valores de entrada, los cuales pueden oscilar entre más y menos
infinito, y restringe la salida a valores entre menos uno y uno (figura 4.5). Esta función es
comúnmente usada en redes multicapa, como la Backpropagation.
La tabla 4.1 Hace una relación de las principales funciones de transferencia empleadas en
el entrenamiento de redes neuronales.
Relación
Nombre Icono Función
Entrada /Salida
𝑎=0 𝑛<0
Limitador Fuerte 𝑎=1 𝑛≥0 Hardlim
𝑎 = −1 𝑛 < −1
Lineal Saturado 𝑎=𝑛 −1≤𝑛 ≤1
Satlins
Simétrico 𝑎=1 𝑛>1
Sigmoidal 1
𝑎= Logsig
Logarítmico 1 + 𝑒 −𝑛
Tangente
𝑒 𝑛 − 𝑒 −𝑛
Sigmoidal 𝑎= Tansig
Hiperbólica 𝑒 𝑛 + 𝑒 −𝑛
37
𝑎 = 1 𝑛𝑒𝑢𝑟𝑜𝑛𝑎 𝑐𝑜𝑛 𝑛 𝑚𝑎𝑥
Competitiva 𝑎 = 0 𝑒𝑙 𝑟𝑒𝑠𝑡𝑜 𝑑𝑒 𝑛𝑒𝑢𝑟𝑜𝑛𝑎𝑠 Compet
Capas ocultas: Estas capas son aquellas que no tienen contacto con el medio exterior, sus
elementos pueden tener diferentes conexiones y son éstas las que determinan las diferentes
topologías de la red.
Una red de una sola capa con un número S de neuronas, se observa en la figura 4.6 en la
cual, cada una de las P entradas es conectada a cada una de las neuronas, la matriz de pesos
tiene ahora S filas.
Ahora, si se considera una red con varias capas, o red multicapa, cada capa tendrá su propia
matriz de pesos W, su propio vector de ganancias b, un vector de entradas n, y un vector de
salida a. La versión completa de una red de tres capas, puede ser visualizada en la figura
4.7.
38
Figura 4.7 Red de tres capas.
En el contexto de las redes neuronales se define al aprendizaje como el proceso por el que
se produce el ajuste de los parámetros libres de la red a partir de un proceso de estimulación
por el entorno que rodea la red. El tipo de aprendizaje se determina por la forma en la que
dichos parámetros se adaptan a sus valores.
Para que la red resulte operativa es necesario entrenarla, lo que constituye la fase
aprendizaje.
39
El más convencional es el modelado de sinapsis, que consiste en modificar los pesos
sinápticos siguiendo una regla de aprendizaje, se construye a partir de la optimización de
una función de error, que mide la eficacia actual de la operación en red.
Generalmente, una vez que el sistema ha sido entrenado, el aprendizaje “se desconecta”,
por lo que los pesos y la estructura quedan fijos, estando la red neuronal ya dispuesta para
procesar datos. Este modo de operación se denomina fase recuerdo o de ejecución. [5].
El perceptrón simple es una red de alimentación directa, esto es la información fluye desde
la capa de entrada hacia la capa de salida. Fue desarrollado por F. Rosenblatt hacia final de
la década de los cincuenta basándose en la regla de aprendizaje de Hebb y de los modelos
de neuronas biológicas de McCulloch y Pitts.[11]. La operacion en un perceptrón simple
que consta de n neuronas de entrada y m neuronas de salida se puede expresar como la
ecuación 4.1:
El perceptrón multicapa consta de una capa de entrada y una capa de salida y una o más
capas ocultas. Dichas capas se unen de forma total hacia delante, esto es, la capa entrada se
une con la primera capa oculta y esta con la siguiente y la última capa oculta se une con la
capa de salida. Los valores que el perceptrón multicapa acepta son reales. [11].
Denotamos por 𝑥𝑖 a las entradas de la red, 𝑦𝑖 a las salidas de la capa oculta y 𝑧𝑘 a las de la
capa final (y globales de la red); 𝑡𝑘 serán las salidas objetivo (target). Por otro lado, 𝑤𝑖𝑗 son
los pesos de la capa oculta y 𝜃𝑗 sus umbrales, 𝑤′𝑘𝑗 los pesos de la capa de salida y 𝜃′𝑘 sus
umbrales (ganancia). La operación de un perceptrón multicapa (MLP) con una oculta y
neuronas de salida lineal (estructura que constituye un aproximador universal de funciones)
se expresa como la ecuación 4.2.
Esta comprobado que una red multicapa puede aproximar hasta el nivel deseado cualquier
función continua en un intervalo por lo tanto son aproximadores universales de funciones
[5].
40
Para su entrenamiento ocupan un algoritmo de aprendizaje denominado algoritmo de
retropropagación, conocido también por su denominación en inglés, backpropagation, este
algoritmo es de uso muy extendido en las aplicaciones de redes neurales. Se le identifica
como parte de los procesos de aprendizaje supervisados, pues requiere que la red disponga
parte de la información, usualmente en las entradas y salidas. El algoritmo es iterativo
alrededor de los pesos, pues la intención es ajustarlos en cada unidad de tal manera que se
reduzca el error entre la salida deseada y la real. De ahí que la variable principal sea
conocida como error derivado de los pesos.
Para generar y entrenar la red neuronal multicapa se utilizara Matlab, este programa nos
permitirá también poder simular la red entrenada ante valores desconocidos para la red, es
decir, valores distintos con los que fue entrenada. Y de esta manera probar su
funcionamiento.
Lo primero que se tiene que hacer es ingresar los datos en forma de un vector, asignados a
una variable, estos datos son los adquiridos del sensor (termistor) y son los datos de entrada
a la red, también se proporcionan las salidas esperadas conocidas como target. Si se
grafican estos valores se observara la curva de calibración del sensor, es decir que a cada
punto de entrada le corresponde un valor de salida. Como ejemplo usamos los siguientes
datos:
X= [329.5 247.7 188.5 144.1 111.3 86.43 67.77 53.41 42.47 33.90 27.28 22.05 17.96 14.69
12.09 10.00 8.313 6.940 5.827 4.911 4.160 3.536 3.020 2.588 2.228 1.924 1.668 1.451
1.266 1.108 0.9731 0.8572 0.7576];
Donde X es la resistencia y Y, los valores de las temperaturas. Si se Grafica con plot (X,Y)
obtenemos la gráfica de la figura 4.7 y se observa su curva de calibración o curva
característica del sensor.
41
Figura 4.8 Curva de calibración del Termistor.
Una red neuronal no necesita una función de inicio a la que se tiene que aproximar la curva,
es decir, no es necesaria la suposición inicial de una determinada forma funcional para el
ajuste, solo se necesita los datos con los que graficamos la curva de calibración y sirven
para entrenar la red. La red entrenada nos devolverá valores que le corresponde a entradas
para las cuales no fue entrenada (interpolación).
Después de graficar la curva de calibración del sensor se puede generar la red neuronal
artificial, para esto se escribe nntool en el “Command Window” de Matlab y se presiona
enter y aparece la siguiente ventana.
Aquí nos pide datos necesarios para generar la red, se utilizan los vectores X,Y que se uso
42
para graficar la curva. Solo hay que importarlas dando clic en “import" y aparece la
siguiente ventana.
En esta ventana, para este caso se selecciona una la red multicapa, con el tipo de Feed
forward backprop, se selecciona también el rango de entrada y especificar el número de
capas y cuantas neuronas tendrá cada una con su función de transferencia (este proceso es
a prueba y error, comenzando por una red pequeña e ir aumentando el número de neuronas
hasta encontrar la arquitectura que mejor se ajusta) y presionando el botón “Create” para
generar la red. Si se desea se puede cambiar el nombre en este caso se utiliza network1,
como se observa en la siguiente ventana en donde aparece el nombre de la red y las
variables importadas.
43
Se selecciona el botón “Train” (entrenar) y se ajusta el número de epochs (iteraciones), que
en este caso es 10000. Se presiona el botón Train Network para empezar el entrenamiento y
se observara lo siguiente.
44
La red aparecerá en workspace con el nombre que se le asigno. Existe una función en
Matlab que sirve para simular el funcionamiento de la red, esta función es:
A = sim (net, P)
De esta forma se puede ver el funcionamiento de una red ante valores desconocidos. Con
estos pasos podemos entrenar una RNA para que se ajuste a la curva característica del
sensor.
La versión 6.5 de Matlab no funciona sobre el sistema operativo Windows 7 y los pasos
descritos son para usar la herramienta nntool en esta versión, ya que las versiones más
recientes ya no incluyen esta herramienta de la misma forma, por lo que se tuvo que hacer
la interfaz gráfica usuario, y utilizar de manera directa las funciones de redes neuronales.
La interfaz gráfica que se diseño en el capítulo tres ya tiene incluido estas funciones para
generara y entrenar una RNA multicapa y funciona en el Matlab de versiones más
recientes. Su uso se explica en el siguiente tema.
45
Partimos de que ya se tiene un archivo de texto (generado con la interfaz gráfica en el
capitulo tres) que contenga los datos adquiridos del sensor (entradas, salidas) y guardado
en la misma carpeta donde está el programa principal de la interfaz gráfica.
En el panel llamado “DATOS” se pueden leer los datos del archivo de texto, se presionan
los botones llamados “SENSOR” y “P. REFERENCIA” para observar los datos de entrada
y salida que se están utilizando, también se puede graficar los datos al hacer clic en el
botón llamado “CURVA DE CALIBRACION” como se muestra en la figura 4.9.
Luego se pasa al panel de “CREAR RNA” para poner los parámetros que necesita la capa
1 y 2 , es decir, especificar cuantas neuronas lleva en cada capa y la función de
transferencia a utilizar. En este caso se eligió 10 neuronas en la capa 1 y 5 en la capa 2,
todas con la función de transferencia tansig y presionamos el botón “CREAR”, cabe
mencionar que la interfaz solo usa dos funciones de transferencia la “tansig y logsig” , esto
nos muestra una gráfica con los puntos sin entrenamiento (figura 4.10).
46
Figura 4.10 Creación de una RNA y su grafica sin entrenamiento.
a) b)
47
Esta gráfica muestra el ajuste a los valores de entrenamiento, ahora falta evaluar la red con
datos diferentes, es decir, ante valores desconocidos, para esto tenemos el panel llamado
“EVALUAR RNA” de donde podemos generar un vector de datos para evaluar el
funcionamiento de la red. En el ejemplo hacemos un vector desde 1 hasta 329 cada 0.001
y estamos generando 328001 valores distintos para evaluar la red en todos ellos y se
presiona el botón “EVALUR RNA”, mostrara el resultado en una gráfica sobre la curva de
calibración para ver su convergencia, como se muestra en la figura 4.11. Si la red está bien
se exporta al workspace de Matlab para ser guardada dando clic en el botón “exportar
RED”, también se puede borrar todo con el botón “BORRAR”.
Para observar los pesos y ganancias (bias) se encuentra el panel llamado “PESOS” donde
solo con seleccionar una opción se muestran los valores de los pesos en forma de matriz
correspondiente a cada capa. Como se muestra en la figura 4.12.
48
El utilizar una RNA mediante una interfaz gráfica de usuario resulta más fácil, solo hay
que dar clic en los botones de control y observar los resultados en una gráfica para verificar
su funcionamiento, de esta manera también obtenemos la RNA que se ajuste a la curva de
calibración del sensor.
49
V
PRUEBAS
Y RESULTADOS
La temperatura fría se obtuvo de un refrigerador y la temperatura más alta por medio de una
caja de unicel donde se introduce un foco para generar calor.
Se hace uso del un sensor de temperatura LM35, este se usa como referencia para
determinar el valor de la variable medida y establecer la relación con los valores de salida
del termistor, de tal manera que el termistor debe funcionar muy parecido a como la hace el
LM35 utilizado, es decir, el sensor calibrado se debe parecer al funcionamiento del patrón
de referencia. Cabe mencionar que si el patrón de referencia es de poca calidad, también lo
será el sensor calibrado y si es de buena calidad la calibración será mejor.
50
Los cambios de temperatura tienen que ser lentos para que los sensores puedan dar una
buena lectura, los dos sensores se colocaron juntos para que los dos reciban la misma
temperatura.
Los datos que se obtuvieron del termistor, con el sistema de adquisición se muestran en la
tabla 5.1.
ENTRADAS(ºC) SALIDAS(V)
-10 2.9275
-5 2.3367
0 1.8804
5 1.5199
10 1.2380
15 1.0126
20 0.8334
25 0.6893
30 0.5730
35 0.4784
40 0.4017
45 0.3385
50 0.2867
55 0.2437
60 0.2082
65 0.1784
70 0.1536
75 0.1326
80 0.1150
85 0.1000
51
5.2 ELECCIÓN DE LA ARQUITECTURA DE LA RNA.
Lograr que una red neural artificial pueda aproximarse a una curva, depende de una buena
elección de su arquitectura. En general si el problema es sencillo, bastaran pocos
parámetros para su ajuste: deberá utilizarse una red pequeña. Si el programa es complejo, se
necesitarán más parámetros de ajuste: se necesitará una red de mayor tamaño. Por lo tanto,
deberá ajustarse el tamaño de la red a la complejidad del problema que se está tratando.
Para aproximarse a la curva de calibración con una RNA multicapa, se probaron varias
arquitecturas, primero se probó con una red de pocas neuronas en la capa uno y se observó
que su error es muy grande para el caso de la curva del termistor, por eso se empieza con
una red pequeña y si no converge se aumenta el número de neuronas en cada capa hasta
encontrar la adecuada para el problema, otro parámetro es cambiar la función de
transferencia de cada capa y volver a entrenar la red.
Como resultado se encontró que una red con la arquitectura de 5 neuronas de entrada, 5
neuronas en la capa oculta con la función de tranferencia “tansig” y en la salida una
neurona con función de transferencia Purelin, si converge a la curva de calibración del
termistor con un error muy pequeño.
Al graficar los datos obtenidos del sensor (ver tabla 5.1) observamos la curva de calibración
del sensor. Esta curva se ajusta con una red neuronal artificial, primero se elige una
arquitectura y se empieza a entrenar, en la figura 5.2 se observa como los puntos se
ajustaron a la curva con una red neuronal artificial a finalizar el entrenamiento.
x=[ 0 0.5000 1.0000 1.5000 2.0000 2.5000 3.0000 3.5000 4.0000 4.5000
5.0000 5.5000 6.0000 6.5000 7.0000 7.5000 8.0000 8.5000 9.0000 9.5000
10.0000]
52
y=[ 0 0.9794 1.8415 2.4975 2.9093 3.0985 3.1411 3.1492 3.2432 3.5225
4.0411 4.7945 5.7206 6.7151 7.6570 8.4380 8.9894 9.2985 9.4121 9.4248
9.4560]
Figura 5.4 Ajuste de la curva con RNA para los datos de entrenamiento
Si evaluamos la red para valores diferentes, para ver como realiza la interpolación,
obtenemos la gráfica de la figura 5.5 donde se observa como los valores diferentes a los
que su usaron para el entrenamiento se ajustaron a la curva.
53
Figura 5.5 Resultado final de RNA.
La función recibe como parámetro un valor de entrada para ser procesado por la red, y
devolverá el resultado evaluado, para hacer el código, se tiene como base el funcionamiento
de la RNA descrito en el capítulo cuatro, se utiliza una arquitectura de 10 neuronas de
entrada 5 en la capa oculta y una en la salida, todas con la función de transferencia tansig
(tangente sigmoidal hiperbólica) excepto la ultima, que tiene una función Purelin
(identidad) como se observa en la figura 5.6.
54
Si tenemos la matriz de pesos y ganancias de cada capa de la red se puede encontrar la
salida de cada neurona de la capa una mediante la ecuación 5.1.
Donde W son las matrices de pesos, p es la entrada, b son las ganancias y f son las
funciones de transferencia que utilizan.
Para obtener los pesos y ganancias podemos escribir en el workspace de Matlab el siguiente
código.
W1=net1.iw{1,1};
W2=net1.lw{2,1};
W3=net1.lw{3,2};
B1= net1.b{1};
B2= net1.b{2};
B3= net1.b{3};
También se pueden observar y copiar los pesos desde la interfaz gráfica de usuario en el
panel llamado “PESOS” como se muestra en la figura 5.7.
55
Figura 5.7 Pesos en la interfaz grafica.
Con estos pesos y ganancias se puede programar una función, que realice la simulación de
la red entrenada pero programada en lenguaje c, lo que se debe de hacer es programar las
operaciones que se realizan en la ecuación 5.4, el código de la función es:
int i,r,c,j;
float W1[10]={ //matriz de pesos w1};
float B1[10]={// matriz de pesos b1};
float A[10];
float A2[10];
float W2[5][10]={ //matriz de pesos w2};
for(i=0;i<10;i++)
{
total=0;
total=total+(W1[i]*z)+B1[i];
A[i]=tanh(total);
}
for(r=0;r<5;r++)
{
total2=0;
for(c=0;c<10;c++)
{
total2=total2+(W2[r][c])*A[c];
}
total2=(total2+B2[r]);
56
A2[r]=tanh(total2);
}
total3=0;
for(j=0;j<5;j++)
{
total3=total3+(W3[j]*A2[j]);
}
resultado=total3+B3;
return resultado;
}
#include <18F4550.h>
#device adc=10
#fuses HS, NOWDT
#use delay(clock=20000000)
#include <LCD.C>
#include <math.h>
int16 q;
float p;
void sensor(){
set_adc_channel(0); //Habilitación canal0
delay_us(20);
q = read_adc(); //Lectura canal0
p = 5.0 * q / 1024.0; //Conversión a tensión
}
double evaluared(float z){
float resultado;
float total,total2,total3;
int i,r,c,j;
float W1[10]={0.084848484848485,0.084848484848485,-0.084848484848485,0.084848531939940,
0.084887945732628,-0.022725404512510,-0.148715194370628,1.822234104242093,
3.829536845420923,60.605816808595037};
float B1[10]={-28.000000000000000,-24.888888888888889,21.777777777777779,-18.666666664872306,-
15.555554248039442,-1.155676457118663,-
1.679606988118666,1.059215226802647,1.184455904618671,5.049550833770251};
float A[10];
float A2[10];
57
34.877833771677835 , -4.130127518668901,-2.714752961187275 , -2.199468029822385 ,
3.419029881400046, -2.429087776011986 , -3.452341135366929, 4.684977219557919,
5.181433281984928, -4.866436514946287, -0.987984857651154, -1.173138875515957,
1.953145099423785, 2.191678588195891 , -1.235477471314459, 1.010628364389577,
0.899678310736375, -2.200760025409681, -1.972390775077493, 1.883937828641537,
0.527028845761892, -10.416679215405980};
float B2[5]={6.203743353488834,0.312603009101445,-
3.748755816035981,1.867959955516108,0.141205644277071};
for(i=0;i<10;i++)
{
float total=0;
total=total+(W1[i]*z)+B1[i];
if(total>14)
{
total=14;
}
if(total<(-14))
{
total=-14;
}
A[i]=tanh(total);
}
for(r=0;r<5;r++)
{
total2=0;
for(c=0;c<10;c++)
{
total2=total2+(W2[r][c])*A[c];
}
total2=(total2+B2[r]);
if(total2>14)
{
total2=14;
}
if(total2<(-14))
{
total2=-14;
}
A2[r]=tanh(total2);
}
for(j=0;j<5;j++)
{
total3=total3+(W3[j]*A2[j]);
}
resultado=total3+B3;
return resultado;
}
58
void main() {
double n;
setup_adc_ports(AN0); //Canal 0 analógico
setup_adc(ADC_CLOCK_INTERNAL); //Fuente de reloj RC
lcd_init();
while (true) {
sensor();
n=evaluared(p);
printf(lcd_putc, "\fTEMP= %3.4f C\n", n);
printf(lcd_putc, "VOL=%4.4f",p);
delay_ms(100);
}
}
59
Conclusiones
La finalidad de esta tesis era utilizar una red neural artificial (RNA) para encontrar la
función de calibracion de un sensor, partiendo de que una red neural artificial multicapa se
puede utilizar como aproximador de funciones. Lo que se aproxima con una red es la
curva de calibracion de un sensor, lo cual permite establecer la relación entre la variable
medida y la señal de salida del sensor mediante una función.
Se utiliza una RNA aunque no es la única forma de encontrar la función, también se puede
hacer con regresión por mínimos cuadrados la diferencia es que en la RNA no es necesaria
la suposición de una determinada forma funcional para el ajuste, además es simple la
implementación en un microcontrolador por que no implica ecuaciones muy complejas
para su desarrollo.
Se realizarón todas las pruebas en esta tesis sobre un termistor NTC, por ser un sensor que
tiene como característica la no linealidad en su curva de calibración. Se necesitaba obtener
datos del sensor, por eso se empezó con el diseño del sistema de adquisición de señal y los
datos obtenidos con este sistema se utilizaron en Matlab para generar y entrenar la red
obteniendo como resultado la función de calibracion del sensor.
Para obtener los datos del sensor se uso el sistema de adquisición de señal, se puede decir
que es de gran ayuda, pues de lo contrario se tendría que tomar lectura del sensor anotando
uno a uno los datos de salida para temperaturas diferentes, este proceso es un poco difícil
en el sentido de que se debe de estar cambiando el valor de la variable física que se está
midiendo para poder variar la lectura del sensor.
Al terminar este trabajo en base a las pruebas realizadas, se puedo constatar que es factible
calibrar un sensor no lineal con una red neuronal artificial y que se podría hacer con
cualquier otro que presente no linealidad, pues la red se puede ajustar para aproximar otra
forma de curva, solo hay que modificar su arquitectura si fuera necesario.
Finalmente basados en los resultados obtenidos, se puede asegurar que mediante RNA es
posible encontrar la función de calibracion de un sensor. Sin embargo con la finalidad de
ser evaluado en su totalidad sería necesario el empleo de otros métodos de aproximación de
funciones y comparar resultados con una red neuronal artificial. Este estudio no está
dentro de las metas de esta tesis y formaría parte de un trabajo de investigación a futuro.
60
APÉNDICE A
Ícono GUIDE.
61
c) GUI with Axes and Menu
Esta opción es otro ejemplo el cual contiene el menú File con las opciones Open,
Print y Close. En el formulario tiene un Popup menu, un push button y un objeto
Axes, podemos ejecutar el programa eligiendo alguna de las seis opciones que se
encuentran en el menú despegable y haciendo click en el botón de comando.
d) Modal Question Dialog
Con esta opción se muestra en la pantalla un cuadro de diálogo común, el cual
consta de una pequeña imagen, una etiqueta y dos botones Yes y No,
dependiendo del botón que se presione, el GUI retorna el texto seleccionado (la
cadena de caracteres ‘Yes’ o ‘No’).
Elegimos la primera opción, Blank GUI, y tenemos:
Elegimos la primera opción, Blank GUI, y tenemos:
62
Entorno de diseño: componentes etiquetados.
Cada uno de los elementos de GUI, tiene un conjunto de opciones que podemos acceder
con clic derecho.
63
Opciones del componente.
Al hacer click derecho en el elemento ubicado en el área de diseño, una de las opciones más
importantes es View Callbacks, la cual, al ejecutarla, abre el archivo .m asociado a nuestro
diseño y nos posiciona en la parte del programa que corresponde a la subrutina que se
ejecutará cuando se realice una determinada acción sobre el elemento que estamos
editando.
Por ejemplo, al ejecutar View Callbacks>>Callbacks en el Push Button, nos ubicaremos en
la parte del programa:
64
FUNCIONAMIENTO DE UNA APLICACIÓN GUI
Una aplicación GUIDE consta de dos archivos: .m y .fig. El archivo .m es el que contiene el
código con las correspondencias de los botones de control de la interfaz y el archivo .fig
contiene los elementos gráficos. Cada vez que se adicione un nuevo elemento en la interfaz
gráfica, se genera automáticamente código en el archivo .m.
Para ejecutar una Interfaz Gráfica, si la hemos etiquetado con el nombre curso.fig,
simplemente ejecutamos en la ventana de comandos >> curso. O haciendo clic derecho en
el m-file y seleccionando la opción RUN.
Todos los valores de las propiedades de los elementos (color, valor, posición, string…) y los
valores de las variables transitorias del programa se almacenan en una estructura, los cuales
son accedidos mediante un único y mismo identificador para todos éstos. Tomando el
programa listado anteriormente, el identificador se asigna en:
Aviso: guidata es la función que guarda las variables y propiedades de los elementos en la
estructura de datos de la aplicación, por lo tanto, como regla general, en cada subrutina se
debe escribir en la última línea lo siguiente:
guidata(hObject,handles);
Esta sentencia nos garantiza que cualquier cambio o asignación de propiedades o variables
quede almacenado. Por ejemplo, si dentro de una subrutina una operación dio como
resultado una variable x para poder utilizarla desde el programa u otra subrutina debemos
salvarla de la siguiente manera:
handles. x=x;
guidata(hObject,handles);
La primera línea crea la variable diego a la estructura de datos de la aplicación apuntada por
handles y la segunda graba el valor.
utpl= get(handles.slider1,'Value');
65
Notar que siempre se obtienen los datos a través de los identificadores handles. Para
asignar el valor a la variable utpl al statictext etiquetada como text1 escribimos:
set(handles.text1,'String',utpl) [12]..
Ejemplo:
Editar componente.
66
Podemos cambiar el nombre con el que aparecerá la función del pushbutton en el m-file,
simplemente editando el campo Tag. Continuamos editando los demás componentes, hasta
llegar a tener una presentación semejante a la siguiente:
Con un click derecho en cada control nos ubicamos en View Callbacks→Callback. Esto nos
ubica en la parte del M-file correspondiente a cada control. El código general queda de la
siguiente manera:
67
function i_grafica_Callback(hObject, eventdata, handles)
TERMO
function pushbutton1_Callback(hObject, eventdata, handles)
op=fopen('datos.txt','rt') %Abre el archivo de datos
x=fscanf(op,'%f') %guarda los datos en x
fclose(op) %cierra el archivo
d2=x(2:2:length(x)) %selecciona cada 2 datos
set(handles.entrada,'String',d2); %muestra los valores en un List Box
op=fopen('datos.txt','rt')
x=fscanf(op,'%f')
fclose(op)
d1=x(1:2:length(x));
set(handles.target,'String',d1);
68
s = instrfind;
if~isempty( s )
fclose( s );
delete( s );
clear s
end
SerPIC = serial('COM1');
set(SerPIC,'BaudRate',9600);
set(SerPIC,'DataBits',8);
set(SerPIC,'Parity','none');
set(SerPIC,'StopBits',1);
set(SerPIC,'FlowControl','none');
set(SerPIC,'InputBufferSize' ,16); % ”n” es el número de bytes a recibir
fopen(SerPIC);
global net1
global A
for k=1:100
A=fscanf(SerPIC,'%d',1) % 0-1024
p = (5.0 * A )/ 1024; % voltaje
temperatura=sim(net1,p);
set(handles.salida,'String',temperatura);
pause(0.5);
end
fclose(SerPIC);
function pushbutton7_Callback(hObject, eventdata, handles)
valor_pum = get(handles.capas,'value');
switch valor_pum;
case 2
handles.funcion='tansig';
case 3
handles.funcion='logsig'
end
guidata(hObject, handles);
69
global T
global c1
global c2
op=fopen('datos.txt','rt');
b=fscanf(op,'%f');
fclose(op);
p=b(2:2:length(b));
P = [p']; %transpuesta del vector
op=fopen('datos.txt','rt');
b=fscanf(op,'%f');
fclose(op);
t=b(1:2:length(b));
T = [t']
a=[0 330] % falta generalizar
c1=str2num(get(handles.neuronas1,'String')); %mostrar resultados
c2=str2num(get(handles.neuronas2,'String'));
b=[c1 c2 1]
net1 = newff(a,b,{handles.funcion,handles.funcion2 , 'purelin'}); %funcion para
%generar
%la red
Y = sim(net1,P); %simulacion sin entrenar
plot(P,T,P,Y,'*')
xlabel('entradas')
ylabel('target')
zoom on
guidata(hObject, handles); %sirve para que pueda ser utilisada en otros controles.
% --- Executes on button press in pushbutton10.
function pushbutton10_Callback(hObject, eventdata, handles)
global net1
global P
global T
c=str2num(get(handles.iteracion,'String'));
net1.trainParam.epochs = c;
net.trainParam.show =100;
net.trainParam.goal =1e-5;
net.trainParam.lr=0.075;
net.trainParam.mem_reduc =1;
net.trainParam.min_grad =1e-12;
net1 = train(net1,P,T);
Y = sim(net1,P);
plot(P,T,P,Y,'.')
guidata(hObject, handles);
function radiobutton3_Callback(hObject, eventdata, handles)
global net1
set(handles.uitable1,'data',net1.iw{1,1});
70
function neuronas2_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
switch valor2_pum;
case 2
handles.funcion2='tansig';
case 3
handles.funcion2='logsig';
end
guidata(hObject, handles);
function popupmenu2_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
71
REFERENCIAS BIBLIOGRÁFICAS
[5]. Martín del Brío, B. y Driscoll, F. (2006). redes neuronales y sistemas borrosos.
México: Ra-Ma.
Páginas de internet
72