domingo, 11 de noviembre de 2007

Controlar leds desde el puerto paralelo con Java

Esta es una pequeña guía de como enviar información a algún dispositivo a través del puerto paralelo.
Primero que todo tenemos que instalar la javacomm API
El gran dispositivo al que le quiero mandar información es un protoboard con 8 leds para que se enciendan cuando mande un 1 y se apaguen cuando mande un 0.
La construcción en el protoboard es muy sencilla:
Los pines 2-9 que son los del registro de 8 bits, los conectamos al lado positivo del los leds con una resistencia de 470 ohms el pin 25 a todas las patitas negativas de los leds, los pines 10-11 a tierra de una fuente externa y los pines 12, 13, 15 los conectamos a +5v de una fuente externa, estos son pines de estado, y lo que indican es que todo esta normal, para poder enviar los datos. Si no conectamos estos pines así, la API asumirá que hay algún problema y no se enviaran los datos, se quedara la aplicación congelada, en espera que cambie a estado normal. El programa para controlar los leds es este:
import java.io.*;
import java.util.*;
import javax.comm.*;

/**
*
* @author juls
*/
public class PruebaLeds {

static CommPortIdentifier idPort;
static ParallelPort pPort;
static OutputStream salida;

private static void iniciarPuerto(String nombrePuerto) throws Exception {
try {
idPort = CommPortIdentifier.getPortIdentifier(nombrePuerto);
pPort = (ParallelPort) idPort.open("Control de Puertos en Java", 0x378);
salida = pPort.getOutputStream();
} catch (Exception e) {
throw new Exception(e.getMessage() + "\n\nLa aplicación se cerrará.");
}
}

public static void main(String args[]) {
try {
iniciarPuerto("/dev/parport0");
System.out.println("Puerto iniciado ...");
System.out.println("Preparandose para escribir en el puerto ...");
salida.write(255);
salida.close();
System.out.println("Escritura sobre el puerto exitosa.");
} catch (Exception e) {
System.out.println(e.getMessage());
System.exit(1);
}


}
}
Lo iomprtante en este programa es la linea:
salida.write(255);
porque aqui es donde ponemos el numero que queremos escribir, 255 es en mayor numero que podemos enviarle ya que solo puede escribir 8 bits, con 255 encenderian los 8 leds.

Actualización: Este es el diagrama del circuito, solo puse 3 leds, en realidad pueden ser 8 del pin 2 al 9.

37 comentarios:

Javihm77 dijo...

Sigo con la duda de por que no funciono en sabayon en mi compu... hicimos lo mismo va Julian y no sirvio, gracias a eso tuve que usar al "enemigo" jaja

Juls dijo...

Si hicimos lo mismo y varias veces, saber que le habías hecho vos antes.... jajaja de todas maneras si preferiste usar winbugs fue porque quisiste porque hubiéramos seguido intentando en Linux.

raktung dijo...

mmmmm bueno lo raro es q al final terminaste usando otra aplicacion o por lo menos pediste ayuda del "enemigo", q paso??? pa mi q esos tus posts no son del todo confiables!! jajaj

Juls dijo...

No hay ningún "enemigo" vos! menos en sistemas operativos, soy linuxero pero no detesto tanto a Windows, ahí aprendí un montón de cosas y fue el único SO que conocí por años.

Javihm77 dijo...

No hay enemigo??? tal vez no es enemigo pero tampoco es muy amigo jaja mira este articulo y vas a ver como es Microsoft y como actua, vas a ver que sus politicas son bastante sucias.
http://elqui.dcsc.utfsm.cl/otros/microsoft.html

Juls dijo...

Microsoft si es un monopolio "sucio" como vos decís, eso no se puede negar de ninguna manera, yo solo digo que no hay que traicionar a Windows después de todo lo que nos enseño, o cuando vos decidiste estudiar Ing en Sistemas ya conocías Linux? Para que me no me entiendan mal, de ninguna manera estoy defendiendo las políticas de Microsoft, mucho menos dándole la espalda la la Filosofía del Software Libre, simplemente no me gusta hablar mal de Windows, lo use por mucho tiempo y lo sigo usando, aunque me parece un asco que Microsoft pretenda hacer sus comunidades "Open source" cuando ellos mismos no liberan su código.

Goloerel dijo...

que tal, oye muchas gracias por esta entrada el codigo es muy interesante e ilustrativo, aun asi me quede con la duda del protoboard, no entendi muy bien como realizarla, te agradeceria mucho si publicaras alguna imagen del circuito o algo parecido.
Gracias nuevamente

Juls dijo...

Ya publique un pequeño diagrama Goloerel espero que te sirva.

Goloerel dijo...

Si muchas gracias, me sirvio mucho el diagrama, aunque me sigue mandando el mensaje de que no puede escribir en el puerto, si le puse la corriente de 5v y todomas bien lo que intente fue adaptarlo a serial,y al parecer si funciono, si inicia el puerto y todo, pero el problema es que no puedo mandar ningun dato, tengo entendido que el pin2 del serial es para enviar datos vdd?

Bueno si tienes alguna idea de por que ocurre eso en el de paralelo te lo agradeceria

Juls dijo...

En el diagrama hacía falta el pin 25 pero ya lo corregí. Éxitos!!!

Anónimo dijo...

pero manda toda la carpeta DEL PROYECTO PARA QUE EN REALIDAD SIRVA y partes por partes gracias...........

Anónimo dijo...

espero me puedas ayudar con lo de el diagrama es qu no me qeuda claro como conectar el protoboard mi correo es marcoska_89@hotmail.com espero me puedas ayudar con lo de la imagen

Robinson Palacios dijo...

Buen día Juls.

Muy interesante tu artículo, próximamente voy a probar este proyecto, sin embargo, me gustaría saber como puedo capturar datos desde el mismo puerto. Espero que me puedas ayudar y de ante mano gracias.
Rael.

Unknown dijo...

Para eso se utiliza el registro de estado, pero no es muy bueno, solo tiene 5 bits 15, 13, 12, 10 y 11 y de esos el 10 y el 11 no los podes usar en esta API porque son los que le indican que no hay problemas con la impresora.

Christian Mejias Rodriguez dijo...
Este comentario ha sido eliminado por el autor.
Juls dijo...

Este código yo lo probé el GNU/Linux pero debería funcionar para Windows con mínimas o ninguna modificación.

Yomy dijo...

Hola, disculpa las resistencias que usaste de cuantos watts son?
y q voltaje máximo soportan??, los pines 10-11 a una fuente externa de cuanto voltaje??

Juls dijo...

las resistencias son de 1/4 y la fuente es de 5v

Yomy dijo...

Ok gracias, lo probare en cuanto acabe la parte de programación!!

Yomy dijo...

Hola nuevamente, oye crees que si al circuito le agrego un CI 74LS244 o un 74HCT573 es lo mismo para aislar dicho circuito y no dañar la tarjeta madre en caso de un error funcione igual usando las mismas resistencias?? lo que pasa es que ya que funcione con dicho circuito integrado quiero sustituir los leds por reles para controlar por ejemplo una lampara casera o algun aparato electrodomestico como vez.
Espero me puedas ayudar, gracias!!

Ing. Ricardo N. dijo...

disculpa, tengo una duda,
cuanto voltaje es el que mand de la computadora al circuito??

osea, cuanto voltaje llega por el puerto paralelo al circuito??

Ing. Ricardo N. dijo...

y otra cosa... la seÑal, por cual de los 25 salidas del cable paralelo se envia?... no puedes seleccionar la salida por la que quieres transmitir... o transmitir por 2 o mas salidas simultaneamente?

GRACAS... ayuda por fa.. =)

p.d. al proposito, muy bueno tu programita.. gracias por el aporte..

Yomy dijo...

el voltaje es de 5volts y en google puedes encontrar un diagrama de los pines de transmision del puerto

Pablo dijo...

Buenas, estoy tratando de mandar un comando de cut-paper a la impresora epson tm-t88iii, la misma se conecta por puerto serial (com1), por lo que intentaría adaptar este proyecto. Lo que no estoy entendiendo es esta linea: pPort = (ParallelPort) idPort.open("Control de Puertos en Java", 0x378);
Es un comando para "abrir" el puerto?, o para hacerlo de cierta manera?: que es lo que hace y como debería ser para el serial, son mis dudas. También me gustaría saber como mandar cadenas hexadecimales (por ahora solo es eso). Desde ya muchas gracias y si alguien ha hecho algo similar agradeceria me desburre. Saludos!

serch2708 dijo...

oie disculpa mi ignorancia pero kiero saber ke programa usas para hacer esto ya ke yo descargue el eclipse IDE for java developers Build id: 20090920-1017 y no se cual uses tu o si estoy totalmente mal o dime ke programa bajar o si me puedes dar instrucciones para este programa ya tengo el javax.comm solo ke aun no se bien como hacerle te agradeceria mucho tu ayuda

Juls dijo...

Yo utilizo NetBeans pero podes usar Eclipse igual o cualquier otro, eso no afecta en nada.

serch2708 dijo...

hola ke tal??? pues como dije estoy usando el eclipse y no se usarlo entonces kisiera ver si alguien me podria ayudar a controlar los leds con el puerto paralelo pero con los botones del teclado, este es mi msn campbelltitan@hotmail.com para ke me agreguen les agradeceria mucho su ayuda, si alguien no me puede agregar aki dare la informacion kiero ke al presionar las 4 flechas y 4 teclas de las letras, las ke sean, para controlar los 8 pines disponibles del puerto, se los agradeceria mucho.

Checha dijo...

Que tal, Necesito conectarme a la Tarjeta PCI 8255 con java para hacer un pequeño juego y controlarlo desde la tarjeta y quisiera saber que libreria debo utilizar para este fin. Por sus comentarios muy agradecido

Anónimo dijo...

Me manda esto:

run:
null

La aplicación se cerrará.
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)

me puedes explicar q pasó?

Anónimo dijo...

dejense de mamadas si no pueden en windows superrarse mucho menos lo haran en linux bola de loosers.

Tiras LED dijo...

controlar led con java?? núnca lo habia escuchado, pues se harian cosas muy originales con los leds y las tiras de leds si esto funciona bien.

Anónimo dijo...

me sale tambien esto... que puedo hacer? porfavor si alguien me ayuda.. gracias!

run:
null

La aplicación se cerrará.
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)

Kuroganne dijo...

Exception in thread "main" java.lang.UnsatisfiedLinkError: libreria.ioPort.Out32(SS)V
at libreria.ioPort.Out32(Native Method)
at libreria.pPort.setAllDataBits(pPort.java:53)
at libreria.pPort.(pPort.java:19)
at paralelo.prueba.main(prueba.java:23)
Java Result: 1

Ayuda con este error, ya no se que hacer, ya copie la dll y demas en las respectivas carpetas pero aun asi me sigue saliendo ese error.

AJJ dijo...
Este comentario ha sido eliminado por el autor.
AJJ dijo...

TENGO QUE USAR TODOS LOS PINES 2-9? SI NO LO HAGO, PASARÁ UN ERROR?

Anónimo dijo...

SERA QUE ME PUEDEN AYUDAR AUN CON ESTO? ME DA UN ERROR ME DICE QUE NO SE PUDO ESCRIBIR EN EL PUERTO LO ESTOY HACIENDO CON UBUNTU, YA REPARE ERRORES COMO EL ACCESO AL PUERTO ME QUEDA ESTE OTRO Y YA NO SE QUE HACER, ME PUEDEN AYUDAR?

Anónimo dijo...

Hola amigos, estoy haciendo mi tesis y me hace falta comunicarme por el puerto paralelo, mas bien lo que necesito leer del puerto paralelo una frecuencia que me da un dispocitovo externo, o sea tengo un dispicitivo que se conecta al puerto paralelo y cada un tiempo me brinda una frecuencia electrica, la cual tengo q capturar, si alguien me puede ayudar con el tema de leer datos del puerto paralelo se los voy agradecer, estoy trabajando con QTcreator,C++.
Gracias de ante manos.

me pueden escribir al correo: rpblanco@estudiantes.uci.cu