martes, 20 de enero de 2009

Controlar Máquinas y Aparatos con La PC

El Medio Real y el Medio Virtual

La PC nos trae un mundo lleno de posibilidades, en los que podemos ser héroes de combate y salir victoriosos de encuentros con una docena de pandilleros peligrosos, pilotear aviones jet, conducir un Formula 1, y aún viajar a planetas lejanos.

¿Qué tiene eso que ver con la realidad?

¡Mucho! Un 11 de Septiembre nos enteramos que unos terroristas habían demolido dos torres, casi inexpugnables, en el país más seguro del mundo.... y se habían entrenado con un simulador de vuelo de una PC...

Fig. 1 DTR está Desactivado

Pero mas allá de discutir las implicaciones filosóficas de los efectos reales de un entrenamiento virtual informatizado, en este artículo propongo que realicemos un ejercicio concreto que nos permita operar sobre la realidad con nuestra PC, por ejemplo, encender un velador u otro aparato electrodoméstico. En este artículo les voy a mostrar un método muy FÁCIL de utilizar el Puerto Serie de la PC para encender y apagar un aparato.

Fig. 2 DTR está Activado

En otro artículo, les presenté el programa ServHTTP.exe que desarrollé para controlar “aparatos” a través de Internet (ver Control Remoto por Internet). El objetivo de ese artículo es precisamente demostrar prácticamente cómo se puede controlar un dispositivo por medio de la web con costo cero (pueden bajar una copia del programa aqui: Programa Servhttp.zip). Muchos lectores consultaron sobre los posibles usos del programa y algunos estaban muy interesados en ir un paso más adelante y conectar un dispositivo y controlarlo desde la PC.

Una de las dificultades con el Servidor HTTP es que, para controlar un aparato, es necesario agregar un microcontrolador u otro dispositivo que “interprete” la señal RS232 y active, desactive o controle el aparato. Por esta razón, me parece oportuno desarrollar una serie de artículos que conduzcan, paso a paso, en esa dirección, ahora si, con aparatos reales conectados en nuestra computadora. En el ejemplo que aquí les presento, eliminamos todas esas dificultades y trabajamos directamente con una señal de control del propio puerto.

El Hardware

Con unos pocos componentes podremos realizar nuestro primer ejercicio en el uso del puerto serie para controlar un aparato externo:

Componentes

El circuito es muy simple y su costo total es inferior a 1Dólar.

1 Conector DB9 (o DB25) Hembra
1 LED Rojo
1 LED Verde
2 Resistencias de 1K

El Circuito

Los LEDs son diodos, es decir que solamente se encienden cuando están "polarizados" en forma correcta. La rayita del LED corresponde al CÁTODO y va hacia el negativo o 0V y la base del triángulo es el ÁNODO y va hacia el positivo.

Advertencia: Si quieren probar el led, pongan una resistencia, tal como se ve en la Fig. 3 o conéctenlo con UNA SOLA pila AA o AAA (1.2V - 1.5V), o lo quemarán.

Fig. 3 Circuito del Ejercicio 1

Si observan detenidamente la forma en que está configurado el circuito de la Fig. 3, notarán que SG que es la tierra o 0V está en el centro y los LEDS están polarizados en ambas direcciones, es decir, uno de los leds se encenderá cuando el SG (cero volts) sea Positivo y en el otro caso cuando SG sea Negativo. Esto tiene que ver con las señales típicas de RS232 que son +12 y -12 (obviamente 0V es positivo con respecto a -12V). En el caso de la señal DTR, cuando hay un 1 (está activada) hay +12V y cuando hay un 0 (está desactivada) hay -12V. La mayoría de los circuitos electrónicos, incluída la PC, tabajan solamente con valores positivos (la PC, entre 0V y +5V), por ejemplo, una radio, un CD player, un MP3, etcétera.

Fig. 4 Implementación con "Breadboard"

Recibí numerosas consultas con respecto al armado de circuitos y los conocimientos de electrónica que se requieren para realizarlos. La mayoría de los circuitos que publico en estos artículos son básicos y en mi experiencia los pueden realizar sin mayores dificultades. Sin embargo, voy a publicar algunos artículos sobre los fundamentos de la electrónica para facilitar el paso a la práctica que es lo mas importante.

Por ahora, para los interesados, puse un Manual Introductorio de Radio y Electrónica en Inglés desarrollado por Phillips en formato PDF que pueden bajar aquí: Fundamentals of Radio y otro de Electrónica orientada a los sistemas digitales, de McGraw-Hill, también en inglés aquí: Introduction to Electronics.

Conectores DB9 - DB25

La siguiente tabla muestra las señales RS232 presentes en los conectores DB9 y DB25 que son los más frecuentes.

Fig. 5 Tabla de Señales RS232 y sus Pines

Tal como vimos en el caso del Puerto Paralelo, las direcciones del Puerto Serie también las encontramos en el BIOS:

COM1 en 0x0040:0000 es 03F8
COM2 en 0x0040:0002 es 02F8
COM3 en 0x0040:0004 es 03E8
COM4 en 0x0040:0006 es 02E8


La PC puede utilizar 2 o más direcciones alternativas para sus Puertos Serie: 3F8, 2F8, 3E8 y 2E8 (COM1 a COM4) entre otros. Para averiguar el puerto que utiliza la PC, podemos buscar en el Administrador de Sistema de Windows (que se encuentra en el panel de control) o podemos ejecutar el programa de diagnostico MSD (parte de DOS) y seleccionamos COM. También podemos observar los puertos por medio de Debug con el comando D (dump) a partir del segmento 40 entre 0 y 7 (en la línea de comando de Debug –D 40:0,7)

En nuestro caso, vamos a utilizar dos pines del conector del puerto serie: SG (Signal Ground o Tierra) y DTR (Data Terminal Ready). En otro artículo, analizo algunas particularidades del protocolo RS232, pero pueden encontrar mucha información en Internet sobre el tema.

La dirección de control del Puerto Serie, que nos permitirá activar y desactivar la señal DTR, está en la dirección de base + 4. Esto quiere decir que si nosotros vamos a utilizar el puerto COM1, la dirección de base será 03F8 y la dirección de control será 03FC.

Para activar nuestra línea DTR, debemos poner en 1 el último bit, es decir, enviamos un 1, para activar y un 0 para desactivar.

Ejercicio 1

Con este ejercicio vamos a dejar planteado en forma concreta el “Control Externo” del puerto y además, vamos a verificar alguna de las particularidades del puerto serie de la PC.

El primer paso consiste en realizar el "circuito" (en realidad un par de LEDs y un par de Resistencias) que observamos en la Fig. 3 que pueden realizar por medio de soldar los componentes o por medio de un breadboard (ver Fig. 4).

El Software

Les presento dos modalidades, una implementada en Visual Basic que perfectamente pueden realizarla en VBA para Access, Excel, Word, etcétera (en Herramientas/Macro/Editor de Visual Basic o ALT-F11) y otra en Assembler que la pueden implementar con Debug. En mi caso, tenía disponible el COM3, de manera que utilicé las direcciones 3E8 (Base) y 3EC (Control).

Visual Basic

El primer paso, es verificar si disponen del Control de comunicaciones de Microsoft “MsComm”, en caso de que no esté presente, deben agregarlo en la opción Proyecto/Componentes y en el caso de Word, por ejemplo, insertan un Formulario, abren el cuadro de herramientas y hacen clic con el botón derecho y agregan controles adicionales. El nombre del control es Microsoft Communications Control.

Fig. 6 Agregar el Componente MsComm

Agregan dos Botones

Private Sub Command1_Click()
MSComm1.DTREnable = True
Picture1.Picture = LoadPicture("on.gif")
End Sub

Private Sub Command2_Click()
MSComm1.DTREnable = False
Picture1.Picture = LoadPicture("off.gif")
End Sub

Agregan el código de apertura y cierre del puerto en Load() y Unload()

Private Sub Form_Load()
MSComm1.CommPort = 3
If Not MSComm1.PortOpen Then
MSComm1.PortOpen = True
End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
If MSComm1.PortOpen Then
MSComm1.PortOpen = False
End If
End Sub

Assembler

En el caso del assembler, probé generar dos archivos COM que permiten desde Windows activar y desactivar el DTR, se denominan alternativamente 232on.com y 232off.com. También se puede realizar la acción desde Debug y oprimir P (paso a paso). En el caso de utilizar assembler, es importante primero enviar algo a la dirección de base del puerto para activarlo y luego enviar el valor al puerto de control.

N232on.com
A
MOV DX,03E8
MOV AL,1
OUT DX,AL
MOV DX,03EC
OUT DX,AL
MOV AX,4C
INT 21

RCX
12
W
Q

N232off.com
A
MOV DX,03E8
MOV AL,0
OUT DX,AL
MOV DX,03EC
OUT DX,AL
MOV AX,4C
INT 21

RCX
12
W
Q

En la próxima entrega veremos como encender una linterna, una radio, mas adelante un velador y finalmente un motor de Corriente Alterna.

Que tengan un gran día,

Sergio Otaño

6 comentarios:

ce3soc dijo...

bastante interesante
ami me gustaria contar con mas interruptores para poder hacer un cambiador de antena remoto seria posible lograr algo asi ..saludos
Raul ca3soc

Sergio Otaño dijo...

Raul, para lograr eso hay dos formas, pero la mas simple es usar el puerto paralelo que dispone de 8salidas y 5 entradas. En una nota futura voy publicar una interfase de este tipo. Exitos!

Villicaña dijo...

Me parece muy buneo tu blog sigue adelante

Villicaña dijo...

Me parece muy buneo tu blog sigue adelante

Anónimo dijo...

oie disculpa
no soy experto
ni nada por el estilo
en visual basic
pero ya hice trate de hacer el programa y no manda la señal al circuito :s
te agradeceria mucho que puedieras ayudar con una guia de como hacer esos pasos en visual basic mas detalladamente.

guialtsen@hotmail.com dijo...

Windows XP mantiene un control estricto de los puertos de comunicación. Por esta razón hay que emplear un archivo de sistema de manejo de puertos. Por ejemplo el UserPort que está disponible para bajarlo en numerosos sitios de Internet.