El puerto serie nos brinda tres entradas y dos salidas que pueden ser manejadas a voluntad por cualquier lenguaje en la PC.
Estas entradas y salidas en realidad fueron pensadas para ser utilizadas en el control de flujo por hardware, pero están ahí y vamos a utilizarlas.
Las entradas son:
CD (Carrier Detect) pin 1
DSR (Data Set Ready) pin 6
CTS (Clear to Send) pin 8
Y las salidas son:
DTR (Data Terminal Ready) pin 4
RTS (Request to Send) pin 7
1º circuito: Circuito de prueba con 3 entradas y dos salidas
El circuito de prueba es de lo mas sencillo, consta de 3 pulsadores, 2 LED, 5 resistencias, una batería de 9V y el conector DB9
Este circuito lo podemos conectar directamente a un com de la PC o a un puerto USB a través de un conversor USB-RS232, como se vé en la imagen:
Dejo un par de fotos del programa de prueba ejecutándose en la PC.
El código en VB6 es el siguiente:
Código: Seleccionar todo
Option Explicit
Private Sub Command2_Click()
If MSComm1.RTSEnable = True Then
MSComm1.RTSEnable = False
Command2.Caption = "Prender LED2"
Else
MSComm1.RTSEnable = True
Command2.Caption = "Apagar LED2"
End If
End Sub
Private Sub Command1_Click()
If MSComm1.DTREnable = True Then
MSComm1.DTREnable = False
Command1.Caption = "Prender LED1"
Else
MSComm1.DTREnable = True
Command1.Caption = "Apagar LED1"
End If
End Sub
Sub leer_entradas()
Do
DoEvents
If MSComm1.CTSHolding = False Then
Shape1.FillColor = QBColor(2)
Else
Shape1.FillColor = QBColor(10)
End If
If MSComm1.DSRHolding = False Then
Shape2.FillColor = QBColor(2)
Else
Shape2.FillColor = QBColor(10)
End If
If MSComm1.CDHolding = False Then
Shape3.FillColor = QBColor(2)
Else
Shape3.FillColor = QBColor(10)
End If
Loop
End Sub
Private Sub Form_Activate()
If App.PrevInstance = True Then
MsgBox " El programa ya está corriendo ", vbCritical + vbSystemModal
End
End If
Form1.Caption = "On/Off Serial"
MSComm1.CommPort = 3
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True
MSComm1.DTREnable = False
MSComm1.RTSEnable = False
Command1.Caption = "Prender LED1"
Command2.Caption = "Prender LED2"
Call leer_entradas
End Sub
Private Sub Form_Unload(Cancel As Integer)
MSComm1.DTREnable = False
MSComm1.RTSEnable = False
MSComm1.PortOpen = False
End
End Sub
Aquellos que deseen utilizar otro COM simplemente deben cambiar la línea:
Código: Seleccionar todo
MSComm1.CommPort = 3
Como pueden observar es muy fácil controlar a través del puerto serie un par de led y leer tres entradas. A partir de aquí se pueden hacer muchas cosas, siempre teniendo cuidado de no sobrecargar el puerto.
2º circuito: Circuito con 2 salidas y tres entradas habilitadas o no por una de las salidas
Otra alternativa es resignar una de las dos salidas, para alimentar los pulsadores desde allí, y así poder eliminar la batería externa.
El circuito modificado sería el siguiente:
Donde hemos eliminado la batería y alimentamos los pulsadores desde el pin 7 (RTS) a través de un diodo 1N4148.
En este caso para que el circuito quede alimentado y las entradas funcionen, se debe prender el LED2 desde el programa en la PC. Lo que significa que tenemos control de cuando nuestro equipo está energizado o nó... y esto da para mucho.
El LED1 sigue siendo una salida del "equipo"
Para hacer pruebas sobre esta versión del circuito se puede utilizar el mismo programa, pero con los significados anteriormente expuestos.
Recuerden, el LED2 debe estar encendido para que las entradas funcionen.
3º circuito: Control de un pequeño motor mediante
La intención es poder controlar vía RS232 o con un adaptador USB-RS232 un pequeño motor de un reproductor de CD.
Se seleccionó este motor ya que era el que presentaba la menor corriente de arranque, 55mA
El circuito utilizado es el siguiente:
Y en esta foto se puede apreciar el montaje en un protoboard:
El programa de la Pc cambió con respecto a los anteriores, como se vé en las siguientes capturas de pantalla.
La interfaz cuenta ahora con un solo botón que nos permite prender y apagar el motor, activando y desactivando las lineas DTR y RTS.
El código en VB6 es el siguiente, solo deben colocar en el formulario un botón y el MSComm.
Código: Seleccionar todo
Option Explicit
Private Sub Command1_Click()
If MSComm1.DTREnable = True Then
MSComm1.DTREnable = False
MSComm1.RTSEnable = False
Command1.Caption = "Prender Motor"
Else
MSComm1.DTREnable = True
MSComm1.RTSEnable = True
Command1.Caption = "Apagar Motor"
End If
End Sub
Private Sub Form_Activate()
If App.PrevInstance = True Then
MsgBox " El programa ya está corriendo ", vbCritical + vbSystemModal
End
End If
Form1.Caption = "On/Off Motor"
MSComm1.CommPort = 3
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True
MSComm1.DTREnable = False
MSComm1.RTSEnable = False
Command1.Caption = "Prender motor"
End Sub
Private Sub Form_Unload(Cancel As Integer)
MSComm1.DTREnable = False
MSComm1.RTSEnable = False
MSComm1.PortOpen = False
End
End Sub
Como mencioné anteriormente, aquellos que deseen utilizar otro COM simplemente deben cambiar la línea:
Código: Seleccionar todo
MSComm1.CommPort = 3
Agrego un par de TIP's para que lo implementen desde un inicio. Los TIP's son sobre el primer programa y a modo de ejemplo
* Deben crear un proyecto nuevo
* Sobre el formulario Form1, agregan dos Marcos (Frame), uno arriba y el otro mas abajo.
* A ambos Marcos le cambian la propiedad Caption. Al de arriba le ponen Entradas y al de Abajo Salidas, les pueden modificar la fuente si lo desean, en mi caso, si mal no recuerdo, los puse en negritas solamente.
* En el Marco de arriba agregan tres Figuras (Shape) llamadas Shape1, Shape2 y Shape3, que son los nombres por defecto. Las deben colocar de modo que Shape1 quede a la izquierda, Shape2 al centro y Shape3 a la derecha.
* A las tres figuras le modifican la Propiedad Shape a Circle
* A las tres figuras le modifican la Propiedad FillStyte a Solid.
* Sobre cada Figura colocan una Label, de izquierda a derecha Label1, Label2 y Label3, A la Label1 le cambian la propiedad Caption por IN1, a la Label1 por IN2 y a la Label3 por IN3. Deberían ampliar el tamaño de la fuente y ponerla en negrita, para que se vea como en el ejemplo.
*En el Marco de abajo colocan dos Botones (CommandButton) con el nombre por defecto Command1 y Command2, de modo que quede el Command1 a la izquierda y el Command2 a la derecha.
* Deben agregar sobre le Formulario Form1, un controlador de puerto serie MSComm, y dejarle el nombre por defecto MSComm1.
* Abren la ventana de Código y agregan el código que les pasé en el primer mensaje, teniendo la precaución de seleccionar el puerto que estén por utilizar.
* Ya pueden ejecutar el programa o compilarlo y generar el .exe.
Nota: El MSComm, no esta entre los componentes que tenemos por defecto en la Barra de Herramientas, por tanto debemos agregarlo, para ello presionan <Ctrl> + T o hacen menú/ Proyectos / Componentes... para abrir la ventana de Componentes.
Seleccionan el Microsoft Comm Control 6.0, verificando la casilla correspondiente y le dan a Aceptar.
Ahora en la barra de tareas se ha agregado el Componente MSComm y ya lo pueden utilizar.
La instrucción Option Explicit se coloca al comiendo del Código de cada formulario, o en cada Módulo, etc. Y te obliga a definir las variables que utilizas en el código, si bien no es necesario, es una buena costumbre de programación el hecho de acostumbrarse a definir todas las variables que utilizaremos en el programa.
Con respecto al código
Código: Seleccionar todo
Private Sub Command1_Click()
If MSComm1.DTREnable = True Then
MSComm1.DTREnable = False
MSComm1.RTSEnable = False
Command1.Caption = "Prender Motor"
Else
MSComm1.DTREnable = True
MSComm1.RTSEnable = True
Command1.Caption = "Apagar Motor"
End If
End Sub
Código: Seleccionar todo
Private Sub Command1_Click()
End Sub