CONTROL DE PUERTO PARALELO UTILIZANDO VISUAL BASIC 6.0 Henry A. Condori Portillo www.henrycondori.cjb.net hcondorip@gmail.com Puno - Perú Control de puerto paralelo utilizando Visual Basic 6.0 Versión preliminar © Control de puerto paralelo utilizando Visual Basic 6.0 © Henry Amiel Condori Portillo +51 951 677461 - +51 951 898138 hcondorip@gmail.com hamielcp@hotmail.com www.henrycondori.cjb.net Con cariño para las escuelas profesionales de Ingeniería de Sistemas y Electrónica de la Universidad Nacional del Altiplano. La primera versión preliminar se publicó en el año 2008 en el mes de marzo. Puno – Perú 2009 Henry A. Condori Portillo 2 www.henrycondori.cjb.net Control de puerto paralelo utilizando Visual Basic 6.0 ¡¡¡ PRECAUCION !!! Realizar diversas conexiones de dispositivos al puerto paralelo implica el riesgo de daños permanentes a la placa madre de la PC, tenga siempre presente que aún los expertos cometen errores, por ello no está de más recomendarle que tenga mucho cuidado al trabajar en el puerto paralelo. Lea el contenido total de éste artículo y asegúrese de comprenderlo cabalmente. Se recomiendan conocimientos intermedios o avanzados en electrónica y programación (si trabaja mediante un software) para manipular el puerto paralelo. Éste artículo tiene carácter informativo, si bien el material presentado refleja fielmente las prácticas y resultados obtenidos en mi computadora, Yo, Henry A. Condori Portillo no asumo responsabilidad alguna por el uso ó mal uso que se le dé a lo descrito en éste artículo. Pero tampoco se desespere, tan sólo tiene que leerlo y comprenderlo el contenido del material, que fue redactado con mucha sencillez y con el mayor detalle posible. Henry A. Condori Portillo 3 www.henrycondori.cjb.net Control de puerto paralelo utilizando Visual Basic 6.0 El presente material denominado “Control de puerto paralelo utilizando Visual Basic 6.0” fue desarrollado por Henry A. Condori Portillo, con fines de uso educativo y publicado en la internet a nivel mundial y otros medios; cualquier modificación y/o alteración, o daños que atenten contra la propiedad intelectual del presente, serán sancionados mediante las normas que protegen los derechos de autor. Henry A. Condori Portillo 4 www.henrycondori.cjb.net Control de puerto paralelo utilizando Visual Basic 6.0 PUERTO PARALELO ¿Qué es el puerto paralelo?, Tal vez esta pregunta no sea muy difícil de responder para cualquiera que haya usado una computadora alguna vez. Es el conector que usualmente se sitúa en la parte trasera del gabinete (mal llamado “CPU”) de la PC, y en donde se conecta la impresora u otros dispositivos, como escáneres y demás. Sin embargo, y en especial en aplicaciones electrónicas, se le puede extraer mucho provecho a este medio de comunicación entre la PC y el exterior, aprovechando con esto las grandes prestaciones de la misma. El puerto paralelo de una PC es ideal para ser usado como herramienta de control de motores, relés, LED's, etc. El mismo posee un bus de datos de 8 bits (Pin 2 a 9) y muchas señales de control, algunas de salida y otras de entrada que también pueden ser usadas fácilmente. El puerto paralelo de un PC posee un conector de salida del tipo DB25 hembra el cual se muestra en la figura. CONECTORES DB25 – PUERTO PARALELO Existen dos tipos de conectores de puerto paralelo; la primera el DB25 Hembra el que posee agujeros y el DB25 Macho, el que posee pines, estos pines tienen un orden definido al momento de utilizarlos, es por ello que primero se muestran los gráficos con el orden lógico tanto para el DB25 hembra y macho, luego se muestran las apariencias y/o imágenes reales de estos tipos de conectores. Conectores DB25 hembra y macho y su orden de numeración De cada uno de los pines DB25 Hembra DB25 Macho (Agujeros) (Pines) Henry A. Condori Portillo 5 www.henrycondori.cjb.net Control de puerto paralelo utilizando Visual Basic 6.0 Conectores DB25 hembra y macho en su forma física DB25 Hembra DB25 Macho DIAGRAMA Y SEÑALES DE UN PUERTO PARALELO El diagrama y las señales que se utilizan (para un DB25 hembra) se aprecian en la siguiente figura. Como podemos observar la estructura de este puerto consta de tres registros, las cuales son: El registro de control (Puerto de control - Pin 1, 14, 16 y 17) Es el correspondiente al PORT 890 su dirección en el LPT1 es 0x37A, y es de lectura/escritura, es decir, podremos enviar o recibir señales eléctricas, según nuestras necesidades. De los 8 bits de este registro solo se utilizan los cuatro de menor peso o sea el 0, 1, 2 y 3, con un pequeño detalle, los bits 0, 1, y 3 están invertidos. Henry A. Condori Portillo 6 www.henrycondori.cjb.net Control de puerto paralelo utilizando Visual Basic 6.0 El registro de estado (Puerto de estado - Pin 10, 11, 12, 13 y 15) Es el PORT 889 y es de solo lectura, se trata de un registro de entrada de información de 8 bits, su dirección en el LPT1 es 0x379. por aquí enviaremos señales eléctricas al ordenador, de este registro solo se utilizan los cinco bits de más peso, que son el bit 3, 4, 5, 6 y 7 teniendo en cuenta que el bit 7 funciona en modo invertido. El registro de datos (puerto de datos - Pin 2 al 9) Es el PORT 888 se trata de un registro de tan sólo de salida (escritura) de 8 bits, su dirección en el LPT1 es 0x378, por este registro enviaremos los datos al exterior de la PC, cuidado...!!!, no envíes señales eléctricas a la PC por estos pines. CONFIGURACIÓN DEL PUERTO PARALELO Conector DB 25 pine A continuación de muestra un cuadro en el cual se describe la función, estado y polaridad activa de cada pin o patita del puerto paralelo. Patita E/S Polaridad activa 1 Salida 0 2-9 Salida - 10 Entrada 0 11 Entrada 0 12 Entrada 1 13 Entrada 1 14 Salida 0 15 Entrada 0 16 Salida 0 17 Salida 0 18 - 25 - - Henry A. Condori Portillo Descripción Strobe Líneas de datos (bit 0/patilla 2, bit 7/patilla 9) Línea acknowledge (activa cuando el sistema remoto toma datos) Línea busy (si está activa, el sistema remoto no acepta datos) Línea Falta de papel (si está activa, falta papel en la impresora) Línea Select (si está activa, la impresora se ha seleccionado) Línea Autofeed (si está activa, la impresora inserta una nueva línea por cada retorno de carro) Línea Error (si está activa, hay un error en la impresora) Línea Init (Si se mantiene activa por al menos 50 micro-segundos, ésta señal autoinicializa la impresora) Línea Select input (Cuando está inactiva, obliga a la impresora a salir de línea) Tierra – Ground 7 www.henrycondori.cjb.net Control de puerto paralelo utilizando Visual Basic 6.0 CARACTERISTICAS ELECTRICAS Posee las siguientes características: Tensión de nivel alto: 3.3 o 5 V. Tensión de nivel bajo: 0 V. Intensidad de salida máxima: 2.6 mA. Intensidad de entrada máxima: 24 mA. DISEÑO E IMPLEMENTACION DEL CIRCUITO ELECTRONICO El circuito electrónico a implementar es el que se muestra en la siguiente figura: Nota: Tanto GND (tierra) del puerto paralelo (18 - 25) como GND de la fuente de 5V deben estar unidos en el circuito a un solo GND, caso contrario no funcionará adecuadamente. Henry A. Condori Portillo 8 www.henrycondori.cjb.net Control de puerto paralelo utilizando Visual Basic 6.0 LISTA DE COMPONENTES 1 Cable y/o conector para el puerto paralelo 1 Circuito integrado TTL 74LS244 8 Resistencias de 220 ohms (potencia : ½ watt) 8 Diodos Emisores de Luz – LED 1 Protoboard 1 Fuente de 5 V. Cables para protoboard Los componentes en su forma física se muestran en la siguiente figura: Henry A. Condori Portillo 9 www.henrycondori.cjb.net Control de puerto paralelo utilizando Visual Basic 6.0 BREVE DESCRIPCION DE LOS COMPONENTES CI 74LS244 Este circuito integrado 74LS244 en este caso servirá para mejorar la entrega de corriente a los componentes utilizados en el circuito, puesto que a pesar de que la PC cumple con los niveles de voltaje específicos de la lógica TTL (5V), no es suficiente para el correcto funcionamiento del circuito. El funcionamiento de este integrado es similar a las compuertas AND, OR, NOR, etc, con la diferencia que éste dispositivo tiene su propia y diferente regla o tabla de entradas y salidas. Para tener claro la tabla de funcionamiento del CI 74LS244, nos fijaremos en una compuerta AND (la más conocida), que al realizar su tabla de verdad tendríamos el siguiente: A 1 1 0 0 B 1 0 1 0 A and B 1 0 0 0 A H H L L B H L H L A and B H L L L En la segunda tabla lo único que se hizo es cambiar su presentación, en vez de 1 se reemplazó por H, que significa High o nivel alto y a 0 por L que significa Low o nivel bajo, con este razonamiento seguro que entenderemos al 74LS244. Entonces primero mostramos el diagrama interno de este CI (74LS244). Henry A. Condori Portillo 10 www.henrycondori.cjb.net Control de puerto paralelo utilizando Visual Basic 6.0 Tabla de funciones 74LS244 ENTRADAS 1G y 2G D (señal de PC) L L H L H X SALIDAS L H (Z) Donde: H = Nivel lógico alto (HIGH) L = Nivel lógico bajo (LOW) X = Nivel lógico bajo o alto Z = Alta impedancia Además: 1G y 2G = Entradas del CI, alta o baja (L – H), por criterio se recomienda que ambos tengan la misma entrada, bien L ó H (para nuestro ejemplo estamos obligados a usar el nivel bajo L, es decir se debe conectar a tierra) y no 1G alta y 2G baja o de forma inversa para evitar confusiones, de lo contrario los resultados o salidas de las cuatro primeras salidas serán distintos o inversos a las cuatro salidas restantes (para mayor análisis entiéndalo el diagrama interno de este CI mostrado anteriormente). D = Entrada de señal (Alto o bajo), de la PC, el cual controlaremos con el programa. Para reforzar este aspecto y aclarar dudas se tiene el siguiente cuadro con las respectivas entradas y salidas con sus respectivas patillas del CI, que es en si la descripción de la estructura interna del CI. 1G y 2G D : Entradas PC Controla la salida 1G (patilla 1) Patilla Patilla Patilla Patilla 2 4 6 8 Patilla Patilla Patilla Patilla 18 16 14 12 2G (patilla 19) Patilla Patilla Patilla Patilla 11 13 15 17 Patilla Patilla Patilla Patilla 9 7 5 3 11 www.henrycondori.cjb.net Henry A. Condori Portillo Control de puerto paralelo utilizando Visual Basic 6.0 RESISTENCIA Es un componente electrónico que cumple la función de resistirse u oponerse al paso de la corriente, este dispositivo no tiene polaridad, puesto que puede conectarse en cualquier sentido. La oposición se origina como consecuencia de los choques entre los electrones libres de la corriente y los iones positivos del metal. La causa de estos choques es el calentamiento del conductor, el que, a su vez, lo transmite al medio ambiente. La resistencia se mide en OHM, llamado así por el físico alemán que lo descubrió. La resistencia eléctrica del material dependerá de tres factores: la longitud, la sección transversal y la resistividad del material. Veamos cómo es la fórmula matemática: R= r (l ) S Código de colores de las resistencias COLOR 1º banda 2º banda Negro Marrón Rojo Naranja Amarillo Verde Azul Violeta Gris Blanco Plata Oro (dorado) Sin Color 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 3º banda 4º banda multiplicador Tolerancia 1 10^1 1% 10^2 2% 10^3 10^4 10^5 0.5% 10^6 10^7 10^8 10^9 0.01 10% 0.1 5% 20% Para nuestro circuito necesitamos una resistencia de 220 ohms, entonces la combinación de colores será: 220 ohms. Henry A. Condori Portillo 12 www.henrycondori.cjb.net Control de puerto paralelo utilizando Visual Basic 6.0 La potencia de un resistor no viene impresa en el resistor, pero se reconoce por su tamaño. Esa potencia tiene un significado de la máxima cantidad de calor que puede dar el resistor por el paso de corriente y, si ésta excede, se quemará por la alta temperatura obtenida. Se mide en watt (W). Los resistores de carbón se fabrican de 1/8W; 1/4W; 1/2W; 1W y 2W, y el tamaño aumenta gradualmente con la potencia. Para mayores potencias se utilizan resistores de alambre; los de película metálica pueden disipar hasta 1W. Los resistores de composición de carbón se fabrican con valores nominales de resistencia ya normalizados y el número dependerá del valor de la tolerancia. DIODOS EMISORES DE LUZ - LED Su funcionamiento es similar a la de cualquier otro diodo común, con la diferencia que en este caso este diodo se enciende o emite luz. Este dispositivo conduce corriente en un solo sentido y se enciende sólo cuando está polarizado directamente, es decir una de sus patitas (ánodo) debe ser conectado al lado positivo y el otro (cátodo), al lado negativo; en caso contrario no conducirá corriente y por su puesto no se encenderá. Una forma de reconocer el ánodo y cátodo de un diodo LED es la siguiente: La patita mas larga o grande es el ánodo, el que debe conectarse al lado positivo. La patita corta es el cátodo, el cual debe conectarse al lado negativo. Para las aplicaciones que deseemos realizar se debe tener en cuenta la caída de tensión de cada uno de ellos, así como el valor de la resistencia que debe tener cada led, claro si queremos que nuestro LED continúe con vida. Esto se puede calcular mediante la formula: R= V fuente I Que simplemente es la ley de Ohm; en la siguiente tabla tenemos algunos datos de cada uno de los leds para facilitar este cálculo. Henry A. Condori Portillo 13 www.henrycondori.cjb.net Control de puerto paralelo utilizando Visual Basic 6.0 Color Rojo Verde, amarillo naranja Consumo 20 20 20 20 mA mA mA mA Caída de tensión 1.6 V 2.4 V 2.4 V 1.7 V La resistencia a utilizar se puede calcular en base a estos valores. Luego de haber descrito algunas ideas generales sobre estos dispositivos pasamos a mostrar el circuito implementado en un protoboard. Para mayor comodidad le recomiendo que primero “suelde” los cables a un “conector DB25 macho” que se muestra en la siguiente figura (sólo para facilitar el trabajo), y luego sólo tendrá que conectar al DB25 hembra. Esto le recomiendo porque en mi caso tuve que mover dichos cables conectados al DB25 hembra a cada momento, porque no tenía un buen ajuste y esto es muy molestoso. Henry A. Condori Portillo 14 www.henrycondori.cjb.net Control de puerto paralelo utilizando Visual Basic 6.0 También puede usted hacer la conexión mediante este conector DB25 macho (que se muestra en las siguientes figuras) directamente conectando al puerto paralelo hembra del CASE o “CPU” y los “cablecitos” al protoboard, ahorrándose comprar un cable conector completo, pero esta operación requiere de mucho cuidado. Henry A. Condori Portillo 15 www.henrycondori.cjb.net Control de puerto paralelo utilizando Visual Basic 6.0 DESARROLLO DEL PROGRAMA EN VISUAL BASIC 6.0 Luego de haber desarrollado e implementado nuestro circuito (Hardware), el siguiente paso es implementar el programa en Visual Basic 6.0 (Software). Para muchos será familiar usar este programa, puesto que pasaremos ligeramente de la parte del diseño a lo que nos interesa principalmente, la programación. Creamos la interfaz tal como se muestra en la siguiente figura. Herramientas utilizadas Herramienta CommandButton Henry A. Condori Portillo Propiedades Nombre Caption Prenderpin2 Pin 2 … … prenderpin9 Pin 9 apagarpin2 Pin 2 … … apagarpin9 Pin 9 encendertodos Encender todos apagartodos Apagar todos btnsalir Salir 16 www.henrycondori.cjb.net Control de puerto paralelo utilizando Visual Basic 6.0 La interfaz diseñada debe lucir de la siguiente forma: Interfaz del programa de control de puerto paralelo Declaramos variables y creamos funciones tanto para la conexión con la librería io.dll, la que nos ayudará a conectarnos con el hardware, así como para el uso de muestra lógica de programación. Funciones y variables globales del programa Dim estadopin As bolean Private Declare Sub PortOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Byte) Private Declare Sub PortWordOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Integer) Private Declare Sub PortDWordOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Long) Private Declare Function PortIn Lib "IO.DLL" (ByVal Port As Integer) As Byte Private Declare Function PortWordIn Lib "IO.DLL" (ByVal Port As Integer) As Integer Private Declare Function PortDWordIn Lib "IO.DLL" (ByVal Port As Integer) As Long Private Declare Sub SetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal bit As Byte) Private Declare Sub ClrPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal bit As Byte) Private Declare Sub NotPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal bit As Byte) Private Declare Function GetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal bit As Byte) As Boolean Private Declare Function RightPortShift Lib "IO.DLL" (ByVal Port As Integer, ByVal Val As Boolean) As Boolean Private Declare Function LeftPortShift Lib "IO.DLL" (ByVal Port As Integer, ByVal Val As Boolean) As Boolean Private Declare Function IsDriverInstalled Lib "IO.DLL" () As Bolean Nota: Se debe descargar la librería io.dll del internet, luego pegar en la carpeta SYSTEM32 de WINDOWS. Henry A. Condori Portillo 17 www.henrycondori.cjb.net Control de puerto paralelo utilizando Visual Basic 6.0 Cada una de estas funciones tiene su respectivo uso o “función”, las cuales se describen a continuación: ============================================================== PortOut: Salida de un byte por el puerto especificado PortWordOut: Salida de un tipo de dato word (16 bits) por el puerto especificado PortDWordOut: Salida de un tipo de dato double word (32 bits) por el puerto especificado PortIn: Lee un byte de un puerto especificado PortWordIn: Lee un tipo de dato word (16 bits) de el puerto especificado PortDWordIn: Lee un un tipo de dato double word (32 bits) de el puerto especificado SetPortBit: Activa el bit de el puerto especificado ClrPortBit: Borra el bit de el puerto especificado NotPortBit: Invierte el bit del puerto especificado GetPortBit: Retorna el estado del puerto especificado RightPortShift: Especifica el puerto de la derecha. LeftPortShift: Especifica el puerto de la izquierda IsDriverInstalled: Retorna cero si no existe o no funciona la librería io.dll ============================================================== Para las siguientes líneas de código debe usted recordar que en la primera línea se declaró una variable de tipo boleano con el nombre estadopin, que utilizaremos para reconocer el estado de cada pin, si está activo o no, este nombre puede ser distinta, el que mejor le parezca, lo único que debe tener en cuenta es al momento de programar. Dim estadopin As bolean En las siguientes líneas de código (para el caso de un botón) primero se lee el estado del puerto en estadopin, esto almacenará true o false; segundo, se pregunta si este valor es true o false (verdad o falso), esto porque no puede enviarse una señal a un bit que ya esta encendido o esté en alta, o apagarse si ya estuviese apagado (bueno este es mi criterio) y como paso final bien envía una señal alta o baja, según sea el botón. Henry A. Condori Portillo 18 www.henrycondori.cjb.net Control de puerto paralelo utilizando Visual Basic 6.0 Programando las acciones de cada botón (para el encendido): Private Sub prenderpin2_Click() estadopin = GetPortBit(&H378, 0) If (estadopin = False) Then outpuerto = &H378 SetPortBit outpuerto, 0 End If End Sub Private Sub prenderpin3_Click() estadopin = GetPortBit(&H378, 1) If (estadopin = False) Then outpuerto = &H378 SetPortBit outpuerto, 1 End If End Sub Así sucesivamente hasta completar con el Pin 9 Private Sub prenderpin9_Click() estadopin = GetPortBit(&H378, 7) If (estadopin = False) Then outpuerto = &H378 SetPortBit outpuerto, 7 End If End Sub Henry A. Condori Portillo 19 www.henrycondori.cjb.net Control de puerto paralelo utilizando Visual Basic 6.0 Programando las acciones de cada botón (para el apagado): Private Sub apagarpin2_Click() estadopin = GetPortBit(&H378, 0) If (estadopin = True) Then outpuerto = &H378 ClrPortBit outpuerto, 0 End If End Sub Private Sub apagarpin3_Click() estadopin = GetPortBit(&H378, 1) If (estadopin = True) Then outpuerto = &H378 ClrPortBit outpuerto, 1 End If End Sub Así sucesivamente hasta completar con el Pin 9 Private Sub apagarpin9_Click() estadopin = GetPortBit(&H378, 7) If (estadopin = True) Then outpuerto = &H378 ClrPortBit outpuerto, 7 End If End Sub Henry A. Condori Portillo 20 www.henrycondori.cjb.net Control de puerto paralelo utilizando Visual Basic 6.0 Encender y Apagar todos a la vez Private Sub encendertodos_Click() outpuerto = &H378 PortOut outpuerto, 255 End Sub El número 255 (valor máximo) representa el número decimal “cuando todos son 1” de cada uno de los bits “binarios” tal como se muestra en la siguiente tabla. Bits Decimal 1 27 128 1 26 64 1 25 32 1 24 16 1 23 8 1 22 4 1 21 2 1 20 1 Si en la salida indicamos 5, se activarán dos leds, el tercero y el primero (4+1), y si fuese 19 se activarán los leds quinto, segundo y primero (16+2+1); y si fuese 32, sólo se activará el sexto led y así sucesivamente se pueden realizar diferentes combinaciones (para entender mas le recomiendo que revise sistemas de numeración). Private Sub apagartodos_Click() outpuerto = &H378 PortOut outpuerto, 0 End Sub Siguiendo la lógica anterior al indicar el “0” no se activa ninguno de los bits. Private Sub btnsalir_Click() End End Sub Henry A. Condori Portillo 21 www.henrycondori.cjb.net Control de puerto paralelo utilizando Visual Basic 6.0 Ventana con la codificación de los botones y funciones globales Henry A. Condori Portillo 22 www.henrycondori.cjb.net Control de puerto paralelo utilizando Visual Basic 6.0 PARMON (Monitor de puerto paralelo) Es un programa que te permite visualizar el estado de los pines del puerto paralelo en el monitor sin necesidad de tener un circuito electrónico preparado y/o conectado al puerto paralelo (parmon se descarga de la internet). Con este programa podemos simular el funcionamiento de cualquier aplicación desarrollada para interactuar con el puerto paralelo. Ejecutando nuestro programa desarrollado en Visual Basic 6.0 realizamos el encendido y apagado de distintos pines, el cual funciona correctamente. Se encendió los pines 4, 6 y 7 del puerto paralelo, el resultado el es siguiente: Henry A. Condori Portillo 23 www.henrycondori.cjb.net Control de puerto paralelo utilizando Visual Basic 6.0 Comprobando con nuestro circuito electrónico preparado tenemos el siguiente resultado. Henry A. Condori Portillo 24 www.henrycondori.cjb.net Control de puerto paralelo utilizando Visual Basic 6.0 Espero que el presente material sea el inicio para realizar distintos programas y/o aplicaciones controlando el puerto paralelo; dependerá de su creatividad, imaginación y habilidad para programar y armar circuitos electrónicos para desarrollar proyectos de mayor complejidad; he aquí unos ejemplitos para seguir jugando y aprendiendo el truco del puerto paralelo: La simulación de un semáforo Luces corredizas Pequeños mensajes con LEDs Vueltas circulares, Vehículo controlado por PC, y … Panel electrónico digital, etc. Cada una de estas controladas por el tiempo, usando el control Timer de Visual Basic. En mis siguientes publicaciones usted encontrará diversos ejemplos desarrollados y propuestos, implementados en diversos lenguajes de programación como Delphi, Borland C, Visual Basic, etc. Además aplicados con mayor profundidad en el mundo de la electrónica como es la robótica, sistemas digitales, etc. ¡ Hasta la vista… ! Henry A. Condori Portillo 25 www.henrycondori.cjb.net