Você está na página 1de 34

Domotica con matlab

Esta entrada tiene como fin presentar un programa realizado en la materia de


programación numérica el cual constaba del control de las luces de una casa. 

Hay que recalcar que no solamente pueden ser las luces pueden ser infinidad de cosas
y los programas que subiré pueden ser modificados para que al igual que mandar señal
y prender luces puedan revivir información de sensores mediante el puerto paralelo y
tomar decisiones como el encendido de sistemas de riego, refrigeración, abanicos, o
cualquier cosa que nuestra imaginación pueda crear o el cliente necesite. 

La interfaz que se usará para el proyecto de domótica es la interfaz de puerto paralelo


la cual pueden construir fácilmente aquí les muestro un esquema. 

Interfaces bsicos de E/S con el puerto paralelo

Ahora hablemos de lo que es la domótica, la domótica es el control del hogar (casa)


mediante cualquier sistema, este sistema puede ser inteligente o no, esto quiere decir
que el sistema puede controlarse automáticamente o que nosotros podemos controlar
el sistema manualmente y también puede haber una combinación de ambas. 

Pero ¿La domótica es necesaria?.... Quizá para muchas personas no lo sea


analizandolo rápidamente tal vez dirán quien necesitara un sistema automático en casa
cuando la mayor parte del tiempo estamos en ella, o quien ocupará un sistema manual
controlado mediante un panel o una computadora cuando podemos hacerlo
manualmente con un switch al foco, a sistemas de riego o lo que queramos controlar,
la respuesta es que quien lo necesita es la comodidad de hacer menos de realizar el
mínimo esfuerzo o invertir el mínimo tiempo en hacer cosas que no nos son agradables
y tener mas tiempo y energías para realizar actividades que si nos gustan, un buen
ejemplo de ello es el control remoto nadie se imagina levantándose a cambiar de canal
el televisor cada ves que quiere sintonizar una cosa diferente, es por eso que digo que
la comodidad se vende y se vende bien, una vez que una persona pruebe lo cómodo
que resulta tener domotica en su casa les asegura que tendrá una sensación como de
tener un control remoto para su televisor. 

Aparte de la comodidad esta el uso para personas discapacitadas o personas que


pueden solo estar acostadas en una cama o que pueden mover solo partes de su
cuerpo, la domotica los auxiliaría en múltiples tareas y los aria mas independientes de
otras personas. 

La verdadera aplicacion de la domotica es libre se puede usar para lo que tu te


imagines, se pueden cubrir mil necesidades con ella. 

a continuación los programas: 

Domotica .fig: http://dl.dropbox.com/u/424705/pruebsn.fig 
Domotica .m http://dl.dropbox.com/u/424705/pruebsn.m 

Este programa funciona como simples interruptores para prender los diferentes sitios
de la casa que vienen escritas en el programa, también cuenta con un temporizador
para prender tres lugares estratégicos de la casa se le especifica el tiempo y después
se le da en encender en, y para apagarlos se le da en apagar en, también cuenta con
un encender todo y apagar todo para hacer encendido y apagado completo de la casa.

Espero les sea de su agrado... 

NOTA: recuerden que tanto el archivo .fig y .m tienen que estar en la misma dirección
para que pueda funcionar el programa.

INSTITUTO TECNOLÓGICO DE HERMOSILLO (ITH) 


POR: IVAN ORLANDO SALAZAR MONTAÑO 
ESTUDIANTE DE: ING. MECATRÓNICA 
www.ith.mx

Esta entrada tiene como fin presentar un programa realizado en la materia de programación
numérica el cual constaba del control de las luces de una casa. 

Hay que recalcar que no solamente pueden ser las luces pueden ser infinidad de cosas y los
programas que subiré pueden ser modificados para que al igual que mandar señal y prender luces
puedan revivir información de sensores mediante el puerto paralelo y tomar decisiones como el
encendido de sistemas de riego, refrigeración, abanicos, o cualquier cosa que nuestra imaginación
pueda crear o el cliente necesite. 

La interfaz que se usará para el proyecto de domótica es la misma que use para el control de
motores paso a paso de la entrada pasada se encuentra en la siguiente dirección: 

http://notipory.blogspot.com/2010/11/control-motores-pasos-matlab.html 

Ahora hablemos de lo que es la domótica, la domótica es el control del hogar (casa) mediante
cualquier sistema, este sistema puede ser inteligente o no, esto quiere decir que el sistema puede
controlarse automáticamente o que nosotros podemos controlar el sistema manualmente y también
puede haber una combinación de ambas. 

Pero ¿La domótica es necesaria?.... Quizá para muchas personas no lo sea analizandolo
rápidamente tal vez dirán quien necesitara un sistema automático en casa cuando la mayor parte
del tiempo estamos en ella, o quien ocupará un sistema manual controlado mediante un panel o
una computadora cuando podemos hacerlo manualmente con un switch al foco, a sistemas de
riego o lo que queramos controlar, la respuesta es que quien lo necesita es la comodidad de hacer
menos de realizar el mínimo esfuerzo o invertir el mínimo tiempo en hacer cosas que no nos son
agradables y tener mas tiempo y energías para realizar actividades que si nos gustan, un buen
ejemplo de ello es el control remoto nadie se imagina levantándose a cambiar de canal el televisor
cada ves que quiere sintonizar una cosa diferente, es por eso que digo que la comodidad se vende
y se vende bien, una vez que una persona pruebe lo cómodo que resulta tener domotica en su casa
les asegura que tendrá una sensación como de tener un control remoto para su televisor. 
Aparte de la comodidad esta el uso para personas discapacitadas o personas que pueden solo estar
acostadas en una cama o que pueden mover solo partes de su cuerpo, la domotica los auxiliaría en
múltiples tareas y los aria mas independientes de otras personas. 

La verdadera aplicacion de la domotica es libre se puede usar para lo que tu te imagines, se


pueden cubrir mil necesidades con ella. 

a continuación los programas: 

Domotica .fig: http://dl.dropbox.com/u/424705/pruebsn.fig 


Domotica .m http://dl.dropbox.com/u/424705/pruebsn.m 

Este programa funciona como simples interruptores para prender los diferentes sitios de la casa
que vienen escritas en el programa, también cuenta con un temporizador para prender tres lugares
estratégicos de la casa se le especifica el tiempo y después se le da en encender en, y para
apagarlos se le da en apagar en, también cuenta con un encender todo y apagar todo para hacer
encendido y apagado completo de la casa. 

Espero les sea de su agrado... 

Actividad 2:
Interfaces básicos de E/S con el p. paralelo:
salidas-entradas digitales
 Circuito sin alimentación externa
 Circuito con alimentación externa
 Circuito con alimentación externa y etapa separadora
 Circuito bidireccional con alimentación externa
 Display de 7 segmentos
 Actividades

  

 
Circuito sin alimentación externa

Se trata de un circuito muy sencillo que usa un mínimo de componentes y


proporciona un test funcional de 8 bits. Cada bit de la entrada puede ser
individualmente controlado y visualizado en los LED de salida. Los diodos LED
que actúan de display se alimentan únicamente con la corriente proporcionada
por las propias salidas del puerto. Sería preferible alimentar los LED y utilizar la
corriente absorbida para iluminarlos, pero el conector no proporciona una señal
de alimentación (Vcc), de modo que se necesitaría una fuente externa.
Eléctricamente, el puerto paralelo entrega señales TTL y como tal, teóricamente,
se le puede conectar cualquier dispositivo que cumpla con los niveles de voltaje
específicos de la lógica TTL, sin embargo el hardware del puerto paralelo está
muy limitado en cuanto a su capacidad de manejo de corriente, por ésta razón se
debe ser muy cuidadoso con el manejo de las señales del puerto: un cortocircuito
puede dañar permanentemente la tarjeta madre del PC. Sin embargo,
experimentalmente se comprueba que en la mayoría de los PC el puerto
proporciona corriente suficiente para una clara indicación visual de los LED.    

Las líneas de datos (D0-D7, pines 2-9) se utilizan como líneas de salida, e


iluminan los LED cuando en ellas se fija por software un 1 lógico (+5 V).
Cuando se fija un 0 lógico, los LED se apagan. Como entradas se utilizan,
como nibble (semibyte) bajo, las cuatro líneas asociados al registro de
control (C0,C1,C2 y C3, pines 1, 14, 16 y 17) y, como nibble alto, cuatro de las
líneas asociadas al registro de estado (S4,S5,S6 y S7, pines 13, 12, 10 y 11).

Obsérvese que las líneas de control se utilizan normalmente como salidas. Sin
embargo, aquí deben ser configuradas como entradas. Obsérvese, asimismo, que
cuatro de las líneas de entrada se corresponden con bits que utilizan lógica
negativa (C0,C1,C3 y S7). Esto habrá de tenerse en cuenta cuando se realice
el programa de control de esta interfaz.

Los detalles sobre el montaje de éste y los posteriores circuitos se pueden


consultar en Actividades.

Circuito con alimentación externa

Fijémonos ahora solamente en una de las líneas de entrada y en una de las líneas
de salida. Un circuito como el siguiente utiliza una fuente externa de +5 V para
alimentar los diodos LED y las señales de entrada.

Un 1 lógico en D7 (bit 7 del puerto de DATOS) produce que el LED se apague.


Un 0 lógico produce la iluminación del LED. El interruptor normalmente abierto
S produce que aparezca un 1 lógico (+5 V) en la entrada Busy (registro
de ESTADO, S7). Cuando se cierra S un 0 lógico (GND) se aplica a la
entrada Busy.

Un circuito como el precedente para las 8 líneas de entrada y salida es un


alternativa al propuesto en la sección anterior.
 

Circuito con alimentación externa y etapa separadora

Para disminuir lo más posible el riesgo de daños al puerto se puede utilizar un


circuito integrado 74LS244 como etapa separadora en las líneas de salida. Al
mismo tiempo se mejora la capacidad de manejo de corriente, de forma que se
pueden conectar sin riesgo la serie de diodos LED que indican la actividad en las
líneas de datos del puerto paralelo. El circuito se detalla en el siguiente diagrama:

Por cada línea de entrada que tomamos directamente del puerto paralelo existe
una etapa amplificadora-separadora dentro del circuito integrado 74LS244 que
nos permite trabajar con una tasa de entrega de corriente suficiente para
desplegar en los diodos emisores de luz la información escrita en las líneas de
datos del puerto. Además es posible habilitar ó deshabilitar el despliegue
del nibble de orden inferior ó superior del byte escrito en el puerto. Colocando en
un nivel lógico alto el pin 1 del CI 74LS244 inhabilitamos el despliegue
del nibble de orden bajo y un nivel lógico alto en la patita 19 evita el despliegue
delnibble de orden alto. Por comodidad, se conectan las patitas 1 y 19
permanentemente a tierra de tal manera que sea posible visualizar la actividad en
los diodos LED.

Este circuito, al igual que el anterior y el siguiente, necesita de alimentación


externa. Se puede alimentar directamente mediante una fuente de +5 V, o
construir ésta usando una pila de 9 V o un adaptador universal, y un regulador de
voltaje 7805. El 7805 puede regular cualquier voltaje  de entre 7 y 25 V c.c. hasta
los 5 V que precisa el circuito

Circuito bidireccional con alimentación externa

El siguiente circuito aprovecha la capacidad bidireccional del puerto paralelo de


la práctica totalidad de los PCs actuales. Así, las 8 líneas de datos del puerto (D0-
D8) se pueden utilizar a modo de un bus de datos que, en ocasiones contiene los
valores que serán leídos por la computadora y, otras veces, transporta los datos
que ésta envía a la salida digital. No es preciso ahora utilizar las líneas de estado
y de control del puerto a modo de entradas, como se hacía en el circuito sin
alimentación externa. El esquema se observa en la siguiente figura:
 

Este circuito utiliza los siguientes CI:

 74LS573: un registro octal latch D transparente usado como puerto de


salida para iluminar los diodos LED, o cualquier dispositivo al que se le
quieran enviar señales digitales.

 74LS245: un transceptor octal bidireccional que proporciona un puerto de


entrada de 8 líneas; toma datos de entrada de 8 interruptores o de cualquier
dispositivo desde el cual se quiera leer información digital.

Ambos integrados se controlan mediante el bit C0 del registro de control. Cuando


el pin 1 se halla en alto, los datos escritos por el puerto se transfieren a los LED
mediante el 74573, mientras que el 74245 está aislado del bus de datos. Cuando
el pin 1 está bajando, los datos a su entrada se conservan en la salida. Cuando el
pin 1 está bajo el 74245 se habilita y los datos presentes en su entrada se
transfieren a su salida y pueden ser leídos por el programa.

El bit C5 se utiliza como control de las operaciones de lectura/escritura del


puerto bidireccional. El programa debe fijar tanto C0 como C5 a 0 para realizar
una escritura (es decir, debe escribir un valor decimal 0 el el registro de control).
Para llevar a cabo una lectura ambos bits deben ser establecidos a 1 (es decir,
debe escribir un valor hexadecimal 0x21, o decimal 33, en el registro de control).

Display de 7 segmentos

Una posibilidad es sustituir en los montajes anteriores el sistema de visualización


mediante 8 diodos LED por un display numérico de 7 segmentos más un punto
decimal. El circuito resulta así más compacto.

Si se trata de un display de ánodo común hay que alimentar con Vcc= +5 V las
dos líneas señaladas como comunes en la figura, y es preciso poner a tierra la
línea correspondiente al segmento que se quiere iluminar. Si se trata de
un display de cátodo común, hay que alimentar con +5 V el segmento que se
desea iluminar y poner a tierra las dos líneas comunes.
Así, en un display de cátodo común, las líneas 1-8 se pueden conectar
directamente a las líneas de datos del puerto (pines 2-9 del conector DB25), y las
dos líneas comunes se pueden conectar a cualquiera de las patillas de tierra del
conector, por ejemplo, la 25.

Actividades

Montaje de los circuitos anteriores

Los circuitos se pueden montar sobre una placa tipo "protoboard" y utilizar cable
rígido para realizar las conexiones necesarias entre los componentes.

Placa "protoboard" simple

Las entradas/salidas del circuito hacia el PC se pueden reunir en un conector


DB25 macho unido a la placa por líneas de cable rígido o de cable plano. A su
vez, el conector macho se puede unir directamente al conector hembra del PC
mediante un cable de extensión paralelo, lo que normalmente resulta más
cómodo para acceder a la parte trasera del PC donde se sitúa el conector hembra.
Conector DB25 macho con líneas de cable rígido.
Cable de extensión paralelo.
Otra posibilidad, utilizar cable plano.

Para simplificar los circuitos que utilizan interruptores a modo de entradas


digitales, éstos se pueden reunir en un único DIP switch de ocho posiciones.
También, por una cuestión de orden, las líneas que proviene del conector macho
pueden introducirse en la placa mediante regletas apilables como las mostradas
en la figura.

 
DIP switch (izquierda) y regletas (derecha).
Conector DB25 macho con líneas de salida, entrada y
Ejemplo de circuito terminado, conectado al PC.
tierra finalizadas en regletas.

Naturalmente, una vez finalizado el circuito, lo más recomendable es probar el


correcto funcionamiento del mismo antes de conectarlo al puerto paralelo del PC.
Una vez ensamblado, se puede alimentar con una fuente regulada de +5 V y
conectar temporalmente los pines del conector DB25 macho a tierra o a + 5 V,
según se necesite (un adaptador universal estabilizado, que da normalmente
tensiones entre 1.5 V y 12 V, es una solución válida y barata, y sirve también
para los circuitos que requieren alimentación externa, los que utilizan motores de
distintas clases, etc). Una vez que se ha verificado el correcto funcionamiento del
circuito, está listo para conectarlo al puerto paralelo del PC.

Para conectar el circuito al puerto apáguese en primer lugar la computadora.


Conéctese el cable al puerto paralelo asegurándose que el conector esté firme en
su lugar. Aliméntese el circuito (si procede) y por último enciéndase la
computadora. Por regla general, el circuito de restablecimiento de la
computadora coloca inicialmente en las líneas de datos del puerto paralelo un
valor igual a 0x0h. Por tanto, todos los diodos deben estar apagados una vez que
la computadora ha terminado su proceso de arranque. Sin embargo, si algún
diodo permanece encendido esto no indica necesariamente un fallo, y es
responsabilidad del software de control que se escriba inicializarlo con un valor
adecuado antes de realizar cualquier otra operación.
Ejemplo de montaje del circuito sin alimentación externa, al que también se le ha añadido el display de 7
segmentos.

Programas de control del interfaz básico de E/S

 Una vez montada la parte de salidas del circuito sin alimentación


externa, realícese un programa en QBasic que complete las siguientes
operaciones:

 Iluminar secuencialmente los LED, desde el LSB hasta el MSB,


con una temporización de 1 s.

 Realícese el mismo programa en TurboC.

 Una vez montado completamente el circuito sin alimentación externa o


con alimentación y etapa separadora, realícese un programa en QBasic
que complete las siguientes operaciones:
 control de sólo salidas: mostrar en los LED la codificación binaria
de un byte (entero entre 0-255) introducido desde teclado.
 control de sólo entradas: detectar continuamente el estado de las
entradas digitales y mostrar en pantalla el valor entero del byte
correspondiente.
 interacción de entradas-salidas: detectar continuamente el estado
de las entradas y actuar sobre las salidas de la siguiente manera:
- si el valor de la entrada es menor que 16, mostrar en las salidas el
valor de la entrada.
- si la entrada está entre 16 y 32 realizar un destello en las salidas
impares.
- si la entrada está entre 32 y 64 realizar un destello en las salidas
pares.
- si la entrada está entre 64 y 128 producir una intermitencia en
todas las salidas durante 5 s.
- si la entrada es < 256 realizar un destello que se desplace
alternativamente de derecha a izquierda.

        Soluciones:

 QBasic
' ENT_SAL.BAS
'
' CONTROL DE ACTUADORES Y SENSORES MEDIANTE PUERTO PARALELO
'
' Programaci¢n de la interface b sica de 8 LED y 8
microinterruptores
' Actuadores - LED en las 8 l¡neas de DATOS:
' 7 6 5 4 3
2 1 0
' D7 D6 D5 D4 D3
D2 D1 D0
'
' Sensores - DIP switch de 8 pos. en 4 l¡neas de CONTROL y 4
de ESTADO:
' 7 6 5 4 3
2 1 0
' S7# S6 S5 S4 C3#
C2 C1# C0#
'
' 2002 Víctor R. González

DECLARE SUB Espera (segundos AS SINGLE)

' Direcciones del puerto paralelo


CONST LPTBASE = &H378
CONST DATOS = LPTBASE
CONST ESTADO = LPTBASE + 1
CONST CONTROL = LPTBASE + 2
DIM byte AS INTEGER
DIM i AS INTEGER, j AS INTEGER

' Control de actuadores digitales (8 diodos LED en el puerto


de DATOS)
PRINT "Control de salidas digitales (valor > 255 para fin):"
byte = 0 ' La primera vez apaga los diodos (envía 0)
DO WHILE byte < 256
OUT DATOS, byte

INPUT " Introduce el byte que se enviará al puerto:


", byte
LOOP

' Control de sensores digitales (8 microinterruptores -DIP


switch-
' 4 en líneas de CONTROL y 4 en líneas de ESTADO)
PRINT "Control de entradas digitales (f<intro> para fin):"
OUT CONTROL, &H4 ' Pone CONTROL en modo entrada (si
posible)
DO
byte = ((INP(CONTROL) AND &HF) OR (INP(ESTADO) AND
&HF0)) XOR &H8B

PRINT " Byte leído del puerto: "; byte

LOOP UNTIL INKEY$ = "f"

' Interacción de actuadores y sensores


PRINT "Realimentaci¢n de las salidas con las entradas
digitales (f<intro> para fin):"
PRINT " entrada < 16 = dirige la entrada a la salida"
PRINT " entrada < 32 = destello impares"
PRINT " entrada < 64 = destello pares"
PRINT " entrada < 128 = intermitencia 5 s"
PRINT " entrada < 256 = destello progresivo"
DO
' Toma nibble bajo de CONTROl y alto de ESTADO
' e invierte bits 0, 1, 3 y 7
byte = ((INP(CONTROL) AND &HF) OR (INP(ESTADO) AND
&HF0)) XOR &H8B
PRINT " Byte le¡do: "; byte

SELECT CASE byte


CASE IS < 16 ' Envía el valor de la entrada
a la salida
OUT DATOS, byte

CASE IS < 32 ' Realiza un destello en las


salidas impares
OUT DATOS, 85 ' Enciende
Espera .5
OUT DATOS, 0 ' Apaga
CASE IS < 64 ' Realiza un destello en las
salidas pares
OUT DATOS, 170 ' Enciende
Espera .5
OUT DATOS, 0 ' Apaga

CASE IS < 128 ' Intermitencia durante 5


segundos
FOR i = 1 TO 10
OUT DATOS, 0: Espera .25
' Apaga
OUT DATOS, 255: Espera .25
' Enciende todos
NEXT i

CASE ELSE ' Destello progresivo


FOR i = 1 TO 10
j = 7
DO
OUT DATOS, j
Espera .05
j = j * 2
LOOP WHILE j <= 224
j = 224
DO
OUT DATOS, j
Espera .05
j = j / 2
LOOP WHILE j >= 7
NEXT i
END SELECT

LOOP UNTIL INKEY$ = "f"

END

' Rutina de espera


SUB Espera (segundos AS SINGLE)

tIni! = TIMER
DO WHILE TIMER - tIni! < segundos: LOOP

END SUB

En la parte de control de sólo las entradas digitales existen dos sentencias,


indicadas con negrita en el cuadro siguiente:
OUT CONTROL, &H4 ' Pone CONTROL en modo entrada (si posible)
DO
byte = ( (INP(CONTROL) AND &HF) OR (INP(ESTADO) AND &HF0) ) XOR &H8B

PRINT " Byte leído del puerto: "; byte

LOOP UNTIL INKEY$ = "f"


y que merecen una explicación detallada.

La primera de ellas: OUT CONTROL, &H4 permite utilizar las cuatro líneas de control


como líneas de entrada. Recuérdese que, estrictamente, son de salida. Sin
embargo, al poner las líneas en alto escribiendo0100, es decir, 0x04,
en LPT_BASE+2, la dirección del registro de control (bits C3-C2-C1-C0), se hace que
las salidas "floten" y que un dispositivo externo pueda forzar a bajo alguna de las
salidas. Esto podría no ser posible en todos los puertos. Sin embargo, en algún
puerto que en principio aparentemente no es posible, se consigue si lo
configuramos en modo SPP o en la emulación SPP del modo ECP. 

La segunda: byte = ( (INP(CONTROL) AND &HF) OR (INP(ESTADO) AND &HF0) )


XOR &H8B , lee un byte de las entradas del interface de la siguiente manera: extrae
los cuatro bits bajos del registro de control (bits C3-C2-C1-C0), los cuatro bits
altos del registro de estado (bits S7-S6-S5-S4), los concatena e invierte todos los
bits que sea necesario (dado que los bits C3,C1,C0 y S7 se utilizan en lógica
negativa). Para ello, se utilizan los operadores de manipulación de bits AND, OR
y XOR que proporciona Qbasic. La operación se explica paso a paso y
gráficamente en lo que sigue. En las tablas que figuran a continuación una X o
una Y indican bits que se necesitan finalmente mientras que ? indica bits
prescindibles. Asimismo, el color azul indica bits en lógica positiva mientras que
el color rojo y el suprarrayado indican bits en lógica negativa (estos últimos
necesitarán ser invertidos).

 Extracción del semi-byte bajo del registro de control:


INP(CONTROL) AND &HF

INP(CONTROL)

? ? ? ? X X X X

&HF

0 0 0 0 1 1 1 1

AND
0 0 0 0 X X X X

 Extracción del semi-byte alto del registro de estado:


INP(ESTADO) AND &HF0

INP(ESTADO)

Y Y Y Y ? ? ? ?

&HF0

1 1 1 1 0 0 0 0

AND 

Y Y Y Y 0 0 0 0

 Combinación del semi-byte bajo con el semi-byte alto:


(INP(CONTROL) AND &HF) OR (INP(ESTADO) & &HF0)

INP(CONTROL) AND &HF

Y Y Y Y 0 0 0 0

INP(ESTADO) AND &HF0

0 0 0 0 X X X X

OR
Y Y Y Y X X X X

 Inversión de los bits 0, 1, 3, y 7:


byte = ( (INP(CONTROL) AND &HF) OR (INP(ESTADO) AND &HF0) ) XOR &H8B

(INP(CONTROL) AND &HF) OR (INP(ESTADO) AND &HF0)

Y Y Y Y X X X X

&H8B

1 0 0 0 1 0 1 1

XOR

Y Y Y Y X X X X

 TurboC
/* ENT_SAL.C
CONTROL DE ACTUADORES Y SENSORES MEDIANTE PUERTO PARALELO

Programación de la interface básica de 8 LED y 8


microinterruptores
Actuadores - LED en las 8 líneas de DATOS:
7 6 5 4 3 2
1 0
D7 D6 D5 D4 D3 D2
D1 D0

Sensores - DIP switch de 8 pos. en 4 líneas de CONTROL y 4


de ESTADO:
7 6 5 4 3 2
1 0
S7# S6 S5 S4 C3# C2
C1# C0#

2002 Víctor R. González


*/

#include <stdio.h>
#include <dos.h>

/* Direcciones del puerto paralelo */


#define LPT_BASE 0x378
#define DATOS LPT_BASE
#define ESTADO LPT_BASE+1
#define CONTROL LPT_BASE+2

main ()
{
unsigned byte;
unsigned i, j;

/* Control de actuadores digitales (8 diodos LED en el puerto


de DATOS) */
printf ("Control de salidas digitales (valor > 255 para
fin):\n");
byte = 0; /* La primera vez apaga los diodos (envía 0)
*/
while (byte < 256) {
outportb (DATOS, byte);

printf (" Introduce el byte que se enviará al


puerto: ");
scanf ("%u", &byte); getchar();
}

/* Control de sensores digitales (8 microinterruptores -DIP


switch-
4 en líneas de CONTROL y 4 en líneas de ESTADO) */
printf ("\nControl de entradas digitales (f<intro> para
fin):\n");
outportb (CONTROL, 0x04); /* Pone CONTROL en modo entrada
(si posible) */
do {
byte = ((inportb(CONTROL) & 0x0F) | (inportb(ESTADO) &
0xF0)) ^ 0x8B;

printf (" Byte leído del puerto: %u ", byte);

} while (getchar() == '\n');


getchar();

/* Interacción de actuadores y sensores */


printf ("\nRealimentación de las salidas con las entradas
digitales (f<intro> para fin):");
printf ("\n\t entrada < 16 = dirige la entrada a la salida");
printf ("\n\t entrada < 32 = destello impares");
printf ("\n\t entrada < 64 = destello pares");
printf ("\n\t entrada < 128 = intermitencia 5 s");
printf ("\n\t entrada < 256 = destello progresivo\n");
do {
/* Toma nibble bajo de CONTROl y alto de ESTADO
e invierte bits 0, 1, 3 y 7 */
byte = (inportb(CONTROL) & 0x0F | inportb(ESTADO) &
0xF0) ^ 0x8B;
printf (" Byte leído: %u ", byte);

if (byte < 16) /* Envía el valor de la


entrada a la salida */
outportb (DATOS, byte);

else if (byte < 32) { /* Realiza un destello en las


salidas impares */
outportb (DATOS, 85); /* Enciende */
delay (500);
outportb (DATOS, 0); /* Apaga */
}
else if (byte < 64) { /* Realiza un destello en las
salidas pares */
outportb (DATOS, 170); /* Enciende */
delay (500);
outportb (DATOS, 0); /* Apaga */
}
else if (byte < 128) /* Intermitencia durante 5
segundos */
for (i=1; i<=10; i++ ) {
outportb (DATOS, 0); delay (250);
/* Apaga */
outportb (DATOS, 255); delay (250);
/* Enciende todos */
}

else
RED NEURONAL DE ARQUITECTURA PARAMÉTRICA
EN RECONOCIMIENTO DE ROSTROS
 

Renato Salinas, PhD,


Departamento de Ingeniería Eléctrica, Universidad de Santiago de Chile
rsalinas@lauca.usach.cl
Luis Larraguibel, MSc,

Facultad de Ciencias de la Ingeniería, Universidad Diego Portales

luis.larraguibel@udp.cl

 
Síntesis
 
El presente trabajo aborda el tema de reconocimiento de rostros haciendo uso directo de redes
neuronales de retropropagación, esto es sin preproceso de extracción de características. Este
enfoque es poco usual, hay razones teóricas acerca de la desproporción entre información muestral
y número de ejemplares que indican que en un espacio de tan poca densidad es imposible obtener
resultados satisfactorios. Sin embargo, un razonamiento esencialmente intuitivo lleva a plantear un
diseño novedoso de arquitectura de red que logra excelentes resultados. En efecto, la red
implementada en Matlab en un PC Pentium III, es entrenada con 5 tomas distintas pertenecientes a
40 individuos en aproximadamente 6 minutos. La prueba, con otro set de 5 fotos de los mismos 40
individuos, entrega una precisión de 100% para la identificación.
 

1 Introducción.

El tema de reconocimiento de rostros por medios informáticos ha cobrado renovado interés [1] en
vista de su importancia en el contexto actual de medidas de seguridad. Consecuentemente, hay en
la actualidad una cantidad de líneas de investigación en estas materias que sigue dos vertientes:
métodos estadísticos y métodos coneccionistas, sin perjuicio de que esistan áreas en común (una
propuesta de taxonomía aparece en Valentin et al (1994) [1]). Sistemas de reconocimiento de
rostros tan diferentes como el de Pentland et al (1994) basado en Análisis de Componentes
Principales (PCA) y el de Malsburg et al (1995) basado en pareo gráfico de wavelets de Gabor
operan sin embargo, dentro de un paradigma común que plantea una metodología orientada en
propiedades de imágenes en lugar de representaciones abstractas de rostros [3]. Existe evidencia
empírica que concede fundamentación a dicho enfoque, tal como el hecho de que el
reconocimiento efectuado por humanos es empeorado considerablemente por transformaciones
de imagen que dejan intacta las representaciones abstractas como es el caso de negativos
fotográficos o cambio en la dirección de iluminación. Esto parece indicar que la codificación de
rostros de la visión humana considera relevante información relativa de áreas claras y obscuras
que permiten reconstruir forma. Reconocer rostros se ha asociado tradicionalmente a un aspecto
particular de una actividad más general: reconocimiento de imágenes [2], es el enfoque puramente
perceptual que deja de lado los aspectos cognitivos [2]. En este trabajo se adopta la hipótesis que
esta clasificación es errónea; reconocer rostros es una actividad perceptual particular, bajo
retroalimentación cognitiva, que difiere en aspectos fundamentales con el reconocimiento de
objetos. En efecto, la especie humana muestra a la sociabilidad [3] como característica distintiva
relevante en su éxito evolutivo. En este contexto, el identificar rostros (y expresiones) es
fundamental en la integración del grupo social. Los niños aprenden a distinguir rostros mucho
antes que objetos. Adicionalmente, el ‘talento’ de distinguir rostros no es verbalizable y se
desarrolla en forma no supervisada; nuestra especie lo desarrolló mucho antes de desarrollar el
lenguaje. Estas consideraciones llevan a plantear una metodología de diseño para la arquitectura
de red bajo un enfoque que relega a segundo plano los aspectos tradicionalmente asociados con
este ‘punto obscuro’ del trabajo con redes neuronales. En efecto, para las etapas iniciales de
diseño, cuando corresponde decidir cuántas capas y cuántas neuronas, la literatura entrega sólo
recomendaciones generales que es necesario validar (y a menudo revisar) durante el proceso a
partir de características observadas durante el entrenamiento. En este contexto, la arquitectura de
red utilizada en este estudio se aleja considerablemente de lo considerado ‘buenas prácticas’.
Lawrence et al (1996) [4] discuten dicha praxis establecida en el ámbito de aproximación de
funciones, trasladando directamente la experiencia en el trabajo con polinomios sin considerar el
contexto del problema a resolver, y entregan evidencia empírica para cuestionarla.

La estructura de este trabajo continua con la Sección 2 en donde se presenta el entorno para el
desarrollo empírico de la investigación. La Sección 3 cubre el diseño de red y su correspondiente
imagen de software. La Sección 4 muestra los resultados y su análisis. La Sección 5 entrega las
conclusiones.

2 El problema.

Se plantea implementar una red neuronal de retropropagación para reconocer rostros. En


retrospectiva, se pretendió desarrollar un trabajo empírico para exponer las debilidades de este
tipo de red neuronal y mejorar  progresivamente su desempeño mediante técnicas especializadas
de preproceso y compactación.

Figura 1. Las diez fotos del individuo #19


 

Los datos[4] están dados por un set de 400 fotos, 10 fotos de cada uno de 40 individuos, que
aparecen con archivos individuales 1.pgm, 2.pgm, ,,,10.pgm situados en 40 directorios de nombre
s1, s2, ,,,s40. Cada archivo .pgm (portable grey format) está formado por un encabezado de 14
bytes y la imagen en 256 niveles de gris como una matriz de 92x112 bytes. Como se verá más
adelante, se utilizó la nomenclatura sistemática que presentan los archivos para codificar en forma
sencilla las instrucciones para leerlos.

La base de datos (ORL Face Database) fue elaborada en Olivetti Research Lab, Cambridge entre
1992 y 1994 con imágenes tomadas sobre un fondo homogéneo obscuro (ver Fig 1). La rotación
máxima es de 20º y la variación máxima de escala es de 10%. La diversidad también involucra
tomas con y sin anteojos y cambios en el peinado.

Como datos de entrenamiento se utilizaron las primeras 5 fotos de cada uno de los individuos, la
mitad de las imágenes. La prueba consistió en presentar a la red para identificación la otra mitad,
las 5 fotos restantes de cada uno de los individuos.

Esta tarea, eventualmente ejecutada con nuestra maquinaria biológica, no es trivial. En efecto,
corresponde aproximadamente a observar la audiencia de un curso numeroso durante un tiempo
equivalente al necesario para tener 5 ‘tomas’ y luego reconocer a cada uno de los integrantes,
incorporando algunas variaciones.

Desde el punto de vista del espacio de datos, cada muestra (o grupo de 5 fotos de un individuo)
corresponde a un código con un número desproporcionadamente grande de posibilidades
(5x92x112x256=13189120). En consecuencia, las expectativas para plantear una red de
retropropagación para asociar unívocamente a la muestra con un individuo no son promisorias; es
difícil que la red sobreviva a la etapa de entrenamiento [1]. Alternativamente, se puede dotar a la
red de un número suficientemente grande de pesos de modo que ‘memorice’ el espacio muestral
y logre así completar el entrenamiento. En este caso se llega a una situación conocida como sobre-
entrenamiento; la red entrenada carece de capacidad de generalización, al procesar el espacio de
prueba proporciona respuestas erróneas.

3 El modelo.

El ‘conocer’ un rostro, actividad imprescindible para re-conocer, equivale a asignar una identidad
única a un número relativamente pequeño de imágenes prototípicas de una persona. La identidad
misma es probablemente un agregado complejo de vivencias y evocaciones; en este trabajo se le
asignará sólo la característica de ser única. A su vez, el set de prototipos se almacena de forma tal
que sea claramente separable. Parece ser que los recursos utilizados para almacenamiento son
considerables; la capacidad de reconocer rostros es limitada en cuanto a número. En
consecuencia, reconocer un rostro puede asimilarse a un proceso de búsqueda en el espacio de
almacenamiento que, de ser exitoso, rescata con mayor o menor seguridad la identidad (y
atributos vivenciales) asociada durante el conocer.

Para modelar el proceso hipotético antes enunciado, se postula una característica cuantitativa que
tiene dos parámetros:

        k correspondiente al número de individuos, y,

        m correspondiente al número de fotos de cada uno de ellos.

Llevando estas consideraciones al ámbito de redes neuronales y al contexto del trabajo a


efectuar, se plantea una arquitectura con dos capas ocultas. La capa de input tiene 10304
nodos, la primera capa oculta tiene 2*(k+2) neuronas, la segunda k+m neuronas y la de
output kneuronas. El razonamiento de soporte para esta elección (salvo la condición de que
la capa de output debe ser de dimensión k) es esencialmente intuitivo y se expone a
continuación.
 

Para reconocer una imagen que representa un rostro será necesario mapearla en el ‘espacio de
rostros’, llevar a cada uno de sus elementos a un espacio instrumental para el reconocimiento de
rostros. En efecto, el contexto perceptual de esta actividad se ‘siente’ distinto al que se utiliza para
reconocer objetos en general, una hipótesis derivada de la relevancia evolutiva del
reconocimiento de rostros en la estructura gregaria de nuestra especie. Ahora bien, en este
espacio debe haber lugar para más de una versión del rostro para poder reconocer expresiones y
variaciones; esto explica k+2 que entrega un mínimo de tres prototipos. Adicionalmente, el
número de ejemplares almacenable debe ser superior a k; en realidad una función monótamente
creciente con k, la más sencilla , en concordancia con la navaja de Occam. La segunda capa
oculta debe ser capaz de ‘transmitir’ una síntesis del ‘espacio de rostros’ con una fidelidad
suficiente para una actividad de asociación binaria (en realidad, bastante ‘fuzzy’) de identificación
ejecutada por la capa de output. En consecuencia, se necesita al menos una neurona por individuo
y una por variante; un total de k+m.

Las funciones de activación de las capas ocultas es tanh, concordante con la naturaleza positiva o
negativa de la señal sináptica (reforzamiento o inhibición); la de la capa de output debe llevar a un
conjunto de alternativas sí/no representables en forma compacta por una sigmoide en el intervalo
[0,1]. En efecto, la instrospección de nuestra actividad de ‘identificar rostros’ la hace aparecer
como difusa, existe un continuo de la fidelidad de la identificación que se manifiesta en
expresiones en este contexto tales como ‘se parece...’, ‘no estoy seguro, pero ...’, ‘lo he visto en
alguna parte ...’, ‘ podría jurar que es ...’, etc.

En consecuencia con los principios expuestos, se especificó una red con dos capas ocultas
para trabajar con datos que se presentan como un set de k vectores de 10304 componentes
que deben asociarse con una ficha binaria de identidad de k bits construida de modo que el
AND sea nulo para dos individuos diferentes. Esta forma de asociación permite un
interesante análisis de resultados. En efecto, proporciona una medida del nivel de
‘confusión’ entre los ejemplares, circunstancia análoga a la que se presenta en el proceso de
reconocimiento de rostros para los seres humanos, dado que todos los rostros presentan
características comunes tales como una boca, dos ojos, dos orejas, etc.
 
Para la aplicación misma se procesan   ejemplares, tanto para el input como para probar
la red entrenada. Los datos fueron normalizados, esto es, fueron llevados a una media nula
y varianza unitaria, transformación esencialmente reversible que entrega un mapa biyectivo
más compacto aprovechando la circunstancia de que cada componente de input puede tener
sólo 256 valores distintos. En efecto, se construye una representación analógica en un
intervalo continuo [-4,+4] para estos valores, acercándose así al rango de la
función tanh utilizada para transmitir la señal de input. A continuación se transcribe el
script de Matlab con el cual se hizo el trabajo.
 

k=40;

m=5;

% k individuos, m fotos de cada uno de ellos

for n=1:m;

    for i =1:k;
        the_file=['D:\face\face_files\s' int2str(i) '\' int2str(n) '.pgm'];

        foto=fopen(the_file,'r');

        [B,header]=fread(foto,14,'char=>char');

        % el encabezado no interesa, hay que saltarlo

        [p(:,k*(n-1)+i),pix]=fread(foto,10304,'int8=>double');

        % la imagen se guarda como vector columna de la matriz de datos p

        j=fclose(foto);

    end

end

% listo los datos, m*k fotos como vectores columna de la matriz de datos p

% los normalizamos

[pn,meanp,stdp]=prestd(p);

% ahora el output

t=eye(k);

for n=1:m-1;

    t=[t,eye(k)];

end

% el output 't' se compone de 'm' matrices eye(k)

% lista la ficha binaria de identidad, el AND es nulo

net=newff(minmax(pn),[2*(k+2),k+m,k],{'tansig','tansig','logsig'},'trainrp');

net.trainParam.show=10;

net.trainParam.goal=0.001;

% ahora a entrenar...

[net,tr]=train(net,pn,t);

% ahora se ve como quedamos, probamos el input

for i=1:m*k

a(:,i)=sim(net,pn(:,i));
end

% si esta matriz se parece a [eye(k),eye(k)...] estamos bien

% ahora vamos a probar otro set de 'm' fotos de los mismos individuos...

for n=m+1:m+m;

    for i=1:k;

        the_file=['D:\face\face_files\s' int2str(i) '\' int2str(n) '.pgm'];

        foto=fopen(the_file,'r');

        [B,header]=fread(foto,14,'char=>char');

        [p(:,k*(n-1)+i),pix]=fread(foto,10304,'int8=>double');

        j=fclose(foto);

    end

end

[pn,meanp,stdp]=prestd(p);

% listos los datos de prueba

for i=1:m*k

b(:,i)=sim(net,pn(:,i));

end

b-a

% los vectores columna no nulos de esta matriz 'miden' la fidelidad de la identificacion


 

4 Los resultados.

4.1 Entrenamiento.

Puede observarse que el entrenamiento tomó 70 épocas, lográndose la meta prefijada de


error. El entrenamiento utilizó la variante ‘resilient backpropagation’ [2] en modo batch.
Esta variante observa los cambios de signo en el gradiente, intensificando el descenso en
forma monotónica en la misma dirección si es que el signo no cambió. Si hay cambio, se
vuelve a una tasa de aprendizaje pequeña. El método tiene muy buena convergencia; BP
tradicional, BP con momentum, BP con tasa de aprendizaje variable y BP con tasa y
momentum variables no lograron la meta en 100 épocas, en realidad con evolución plana
del error a partir de la época 40.
 

Log del proceso de entrenamiento

TRAINRP, Epoch 0/100, MSE 0.371922/0.001, Gradient 0.389574/1e-006

TRAINRP, Epoch 10/100, MSE 0.0183699/0.001, Gradient 0.0120647/1e-006

TRAINRP, Epoch 20/100, MSE 0.00686645/0.001, Gradient 0.00241339/1e-006

TRAINRP, Epoch 30/100, MSE 0.00319294/0.001, Gradient 0.00116063/1e-006

TRAINRP, Epoch 40/100, MSE 0.00210703/0.001, Gradient 0.00165312/1e-006

TRAINRP, Epoch 50/100, MSE 0.00152078/0.001, Gradient 6.16599e-005/1e-006

TRAINRP, Epoch 60/100, MSE 0.0012267/0.001, Gradient 0.000784313/1e-006

TRAINRP, Epoch 70/100, MSE 0.000993673/0.001, Gradient 0.000253889/1e-006

TRAINRP, Performance goal met.

Se observa que aún queda gradiente; se podía haber llegado a un error más bajo.

El proceso, hasta la etapa de fin de entrenamiento, tomó algo más de seis minutos. Incluido en
este tiempo, adicionalmente al entrenamiento mismo, está el abrir, leer y cerrar 200 archivos y el
preproceso de normalización.

4.2- Prueba.

Se simuló la red con los datos de entrenamiento, el resultado se almacenó en la matriz a. A


continuación se leyó y normalizó la información correspondiente a las fotos 5 a 10 de cada uno de
los 40 individuos, procediéndose a entregarla a la red para identificación. El resultado se almacenó
en la matriz b. Finalmente se calculó b-a, matriz que mide el grado de confusión en la
identificación. Esta fase del proceso tomó cerca de dos minutos.
 

4.3- Análisis de los resultados.

En la Figura 2 puede verse el despliegue gráfico de la matriz b-a. Se observa que la identificación es


casi perfecta. Los escasos ‘spikes’ que aparecen, con un valor máximo de 0.5, indican algún grado
de confusión. Sin embargo, para todas las fotos el valor de respuesta para el bit asociado a su ficha
de identificación es cercano a 1.  
 

Figura 2.- Resultados de la prueba, despliegue de la matriz b-a.

 
5 Conclusiones.

Los principios de diseño utilizados para especificar la red de retropropagación dieron


excelentes resultados en reconocimiento de rostros, tanto en tiempo de proceso como en
fidelidad de identificación. En efecto, los datos presentados están contenidos en más de 4
MB y la tarea que se entrega a los más de 800,000 pesos de la red es aprender como están
organizados. El sobre-aprendizaje, asimilable a privilegiar la memorización de los valores
de los datos, no se produjo; la evidencia está dada por el procedimiento de prueba que
involucró imágenes distintas a las del entrenamiento. En efecto, los resultados muestran que
no sólo se capturó la configuración particular de cada rostro sino que con la presentación de
otro ejemplar se asimiló características generales que permitieron asociar la identidad
correcta durante la prueba.
 

La normalización de los datos probó ser un método muy eficiente de compactación sin el cual la
identificación no funciona. En efecto, sin este procedimiento la convergencia no se alcanza en
menos de 100 épocas como puede notarse en la gráfica de entrenamiento en la Figura 3.

Figura 3.- Entrenamiento con datos no normalizados.

 
 

Este resultado muestra que es imprescindible preprocesar los datos a la vez que el tipo de
preproceso no necesita ser muy complicado. En efecto, la extracción de características relevantes
es efectuada por la red de retropropagación en forma satisfactoria sin necesidad de tener que
incorporar hipótesis acerca de la jerarquización de las mismas. Se reencuentra así una hipótesis de
trabajo referente a un mecanismo plausible de percepción conducente al reconocimiento de
rostros en una escala de tiempo que sugiere un proceso muy eficiente de compresión de datos. En
efecto, considerando el ancho de banda del ‘hardware’ biológico involucrado, el flujo neto de
señales debe ser bastante reducido. Adicionalmente, el algoritmo de compresión nos es
transparente; debe ser relativamente simple, probablemente subordinado al proceso de
identificación de modo de modular la captura y compresión de acuerdo al avance de la
identificación, en forma similar a la retropropagación del error. Se concluye que el canal de
comunicación entre la parte cognoscitiva y la parte perceptual debe ser bidireccional; la
percepción no puede ser pasiva.

Agradecimientos
 

El primer autor (RS) agradece el apoyo del proyecto Dicyt-USACH 069913SS.

El segundo autor (LL) agradece el apoyo prestado por la Facultad de Ciencias de la Ingeniería,
Universidad Diego Portales.

Referencias bibliográficas
 

1)      Valentin, D., Abdi, H., O'Toole, A.J., and Cottrell, G.W. (1994). Connectionist Models of Face
Processing: A Survey. Pattern Recognition, 27(9):1209-1230.

2)      Hancock, P.J.B., Bruce, V., and Burton, A.M. (1999). A comparison of two computer-based
face recognition systems with human perceptions of faces. Vision Research

3)      Burton, A.M., Bruce, V., and Hancock, P.J.B. (January 1999). From pixels to people: A model of
familiar face recognition. Cognitive Science, 23(1).

4)      Lawrence, Giles, Tsoi, Back 1996 citeseer.nj.nec.com/lawrence96what.html What Size Neural


Network Gives Optimal Generalization? Convergence Properties of
Backpropagation (UMIACS-TR-96-22)

5)      Lawrence, Giles, Tsoi, Back (1997) Face Recognition: A Convolutional Neural Network


Approach - http://citeseer.nj.nec.com/update/25947 citeseer.

http://www.buenastareas.com/temas/matlab-reconocimiento-de-imagenes/0

Você também pode gostar