Manejo del puerto paralelo en Linux con gcc


Hace unos años me armé la plaqueta de interfaz para controlar el puerto paralelo de la PC.
Hoy en día he retomado el proyecto y trataré de armar un pequeño robot comandado por esta placa desde linux, utilizando una notebook o netbook.

Asi que una de las cosas fundamentales que necesito para este trabajo es conocer el manejo de los puertos con el lenguaje C desde Linux y como compilarlo.
Este es el código básico para el manejo del puerto paralelo en Linux con gcc:

#include
#include
#include
#define puerto 0x378     /* LPT1 */

int main (void)
{

unsigned int p; // en esta variable le decimos, en hexa, cuantos cuantos leds prenderan

//apertura del puerto
if(ioperm(puerto,1,1))
{
perror(“Se ha encontrado el siguiente error: “); //manejo de errores
exit(1); //salida con error
}

p = 0x01; //puerto 1
outb(p,puerto); //envia el valor en binario al puerto
usleep(1000000); //delay

p = 0x00; //puerto 0. Apaga todos los bits
outb(p,puerto);

if(ioperm(puerto,1,0)) //cerramos los permisos del uso al puerto
{
perror(“Se ha encontrado el siguiente error: “); //volvemos a manejar un eror en caso de…
exit(1); // salimos mostrando mensaje de error
}
exit(0); //terminamos el programa

Ahora, como compilamos este programa ?
Supongamos que lo guardamos con el nombre test.c

$ gcc -o test test.c

Para ejecutarlo bastará con la orden:

$ sudo ./test

Para saber los valores de encendido y apagado de los 8 puertos de salida, revisar el post de Control de Potencia con PC

Control de Potencia con PC


Siempre quise poder controlar cualquier dispositivo a través de una PC.
La manera mas sencilla es a través del puerto paralelo:Puerto Paralelo:

Los pines 2 al 9 son de salida.
los pines 10 al 13 son de entrada.

También denominado puerto de impresora ó LPT éste puerto dispone de tres
canales de comunicaciones cuyos pines envían señales desde y hacia la
computadora todos al mismo tiempo, de ahí el término paralelo.
Inicialmente la plataforma PC permite disponer de hasta un máximo de
tres puertos paralelos, usualmente denominados LPT1, LPT2 y LPT3.
Exceptuando las nuevas computadoras iMac de la firma Apple Computers
todas las computadoras personales disponen al menos de un puerto paralelo
al cual generalmente se lo llama LPT1. A comienzos de la computación
personal (cuando reinaban las XT) el puerto paralelo venía incluido
en la plaqueta controladora de vídeo. Luego, con la llegada de las
controladoras VGA el puerto comenzó a ser incorporado en las
controladoras de unidades de disco (mas conocidas como multifunción).
Pero con la quinta generación en PC (cuando apareció el Pentium de Intel)
cambió todo nuevamente quedando la placa multifunción incorporada a la
placa base del sistema o Motherboard.

Los terminales del puerto paralelo sólo pueden manejar señales digitales,
cuyos valores de tensión representan estados altos o bajos. Cuando no hay
tensión en el pin se asume un estado lógico bajo mientras que cuando hay
una tensión cercana a los 5v el estado asumido es el alto. Cada pin puede
drenar un máximo de 50mA, insuficiente para manejar cualquier tipo de
carga mediana o pesada. Pero es suficiente para encender un diodo LED.

Para controlar el estado de los pines del puerto paralelo basta con
escribir un número entero positivo de 8 bits en la dirección del mismo.
El pin de datos 0, que físicamente está conectado al terminal 2 del
contector, asume el peso 1. Este es el bit de menos peso en la palabra
de datos de dicho puerto. Siguiendo la tabla de abajo observará que es
muy simple manejar puntualmente cada uno de los pines.

 

Por ejemplo, si queremos hacer que los terminales 4, 6, 8 y 9 del
puerto paralelo se enciendan quedando los otros apagados debemos sumar
los valores correspondientes a esos pines y enviar dicho resultado a
la dirección del puerto. En este ejemplo el dato a enviar sería:
4 + 16 + 64 + 128 lo que equivale a 212

Para que todos los pines se enciendan tendremos que enviar el valor 255,
mientras que para que todos se apaguen deberemos enviar el valor 0.

La dirección del puerto LPT1 usualmente es 378, la del puerto LPT2 suele
ser 278 y la del puerto LPT3 casi siempre es 3BC. Aunque esto depende de
como esté configurado su hardware. Una forma de determinar la dirección
del puerto es presionando la tecla Pause al comienzo de la carga del
sistema operativo. Verá una tabla donde el BIOS reporta los parámetros
básicos del equipo, incluyendo datos sobre los puertos.

Control de Potencia con Triacs:

Este circuito permite manejar cargas que funcionen con 220V de la red
eléctrica y que consuman no mas de 1500W. Las posibilidades son:
Lámparas, cafeteras, veladores, electrodomésticos, accesorios, etc.
Televisores y equipos de sonido también pueden ser conectados, pero
seria inútil ya que éstos equipos requieren ser encendidos por “soft”
presionando la tecla Power. Entonces, al darle alimentación el equipo
quedará a la espera de ser encendido.

circuitotriacs

La señal digital proveniente del puerto es limitada en corriente y
aplicada al cátodo del LED interno del optoacoplador. El ánodo de ese
diodo es cableado a MASA digital (pin 25 del puerto paralelo). El
brillo producido por el LED acciona el Triac del opto, que, a su vez,
acciona el triac de potencia. La red RC conectada en paralelo con el
triac de potencia limita la velocidad de evolución de la tensión ante
cargas inductivas.

El optoacoplador incluye en su interior un circuito de detección de
cruce por cero (denominado ZCC). Este sistema hace que la conmutación
sea posible sólo cuando el semiciclo de la corriente alterna se
encuentra en 0V.

El optoacoplador puede ser un MOC3040 ó un MOC3041. El triac debe ser
capaz de manejar 8A sobre 400V. Es indispensable montar el Triac en
un buen disipador térmico.

El circuito mostrado arriba corresponde a un solo canal. Para montar
un sistema de mas canales repetir este tantas veces como canales
necesarios. Recuerde conectar sólo un circuito a cada pin del puerto
paralelo.

Control de Portencia Con Relés:

El relé es un dispositivo mecánico capaz de comandar cargas pesadas
a partir de una pequeña tensión aplicada a su bobina. Básicamente la
bobina contenida en su interior genera un campo magnético que acciona
el interruptor mecánico. Ese interruptor es el encargado de manejar
la potencia en sí, quedando al circuito electrónico la labor de
“mover” la bobina. Permite así aislar mecánicamente la sección de
potencia de la de control. Pero para accionar la bobina la corriente
y tensión presente en un puerto paralelo no es suficiente.

circuitoreles

Este circuito es extremadamente simple y permite manejar ocho relés
con bobinas de 12V a partir de los pines de un puerto paralelo.
Podemos decir que TODOS los componentes de protección y limitación
de corriente, además de los transistores de potencia están incluidos
dentro del circuito integrado.

Si “miramos con la lupa” podremos ver en el interior del chip
ULN2803 ocho esquemas como el de abajo, uno para cada uno de los
canales.

canal

Es normal que la cápsula de este circuito integrado esté tibia con
respecto a la temperatura ambiente. Se debe, como era de suponerse,
a que la corriente requerida por cada relé pasa por sus “entrañas”
y, como sabemos, el manejo de corriente genera calor.

Con las llaves de cada relé el usuario puede manejar lo que le plazca,
siempre que no exceda las especificaciones de tensión y corriente
para la cual están diseñadas. De requerir mayores potencias se puede
emplear el relé para accionar un contactor industrial ú otro relé de
mayor corriente. Es una buena práctica colocar en cada relé un fusible
de protección. Siempre es mas simple cambiar un fusible que desoldar
un relé o reparar pistas de un circuito impreso.

En esta plaqueta he usado los 8 puertos de salida directamente con relés y los 4 puertos de entrada como interruptores, es decir, un circuito normal abierto entre el pin de entrada y masa.
Esta es la plaqueta terminada:
Nov2801

Estos puentes de alambre que se ven son errores míos en el diseño del pcb.

 Aquí pueden descargar los fuentes de control en Visual Basic 6.

Control Remoto para PC


Dicen que de las necesidades surgen las mejores ideas…y estoy convencido de que es así. La cuestión es que tengo unas cuantas películas en cd y las veo en el televisor a través de la salida tv out de la pc, pero me resultaba muy incomodo levantarme del sitio donde estaba viendolas para avanzar o retroceder en cierto momento de las mismas… así fué como me embarque en el proyecto de construirme un control remoto para la pc… no solamente para controlar los videos o la música a distancia sinó para ejecutar cualquier comando…
Éste control remoto también resulta muy útil para un departamento de sistemas, donde los servidores normalmente están en una habitación refrigerada y aislada de la oficina… es muy facil lanzar la ejecución de un script o comando a distancia…
Después de tener mucho tiempo la idea en background en mi cabeza analizando las posibilidades de implementación, llegué a la conclusión de que la manera mas facil de implementarlo sería a través del puerto serie, utilizando la linea DCD (Data Carrier Detect) , Pin 1 en una ficha DB9. Cuando un control remoto emite una señal infraroja, es captada por un receptor infrarojo, que, después de decodificarla, puede envirla como un tren de pulsos altos o bajos (ceros y unos) a la linea DCD. A partir de ahí solo es cuestión de analizar el patron del tren de pulsos a través de un programa y decidir que hacer en caso de que aparezca una secuencia dada.
Éste es el esquema electronico del receptor:
schematics-ir-receiver
La idea es que una vez construído el receptor, se graban los pulsos emitidos por un control remoto cualquiera (ej. de un tv o equipo de audio) y después se utiliza ese control remoto para controlar la pc.
El gran problema con que me encontré fué al programar algoritmo para identificar los patrones de pulsos que ingresan a la linea DCD… es bastante complejo diferenciar la secuencia de un botón Power de la de un botón Volumen, ya que al transformar la señal analogica en digital, puede haber una pequeña variacion en la cantidad de unos y ceros.
La solución a este problema me la dieron los muchachos que hicieron el lirc (Linux Infrared Remote Control) que ya habían pensado en lo mismo y tenían desarrollado el programa para trabajar de la misma manera que yo necesitaba.
La alimentación del circuito la tomamos del pin 7 RTS (request to send), con un diodo para evitar retroalimentación en éste pin.
Respecto del receptor infrarojo, éstos son algunos modelos que se pueden utilizar:
Todos estos modelos ya vienen con el decodificador necesario para obtener la señal esperada para la linea DCD. En caso de no conseguirlos, hay que buscar alguno que trabaje en la frecuencia de 38 kHz, ya que la mayoria de los control remoto, trabajan en ésta frecuencia.
El resto de los componentes se describe en el esquema de arriba.
tie_lirc1
Respecto del programa, aqui tienen una version del winlirc con los fuentes y todo. Pueden abrir el proyecto en Visual C++.

Cómo Conectar el Monitor de Mac a una PC


Resulta que en la empresa donde trabajo, había un monitor de 17″ Mac, de tubo plano…una belleza…y… carísimo. El tema es que no se utilizaba porque la Mac a la que se enchufaba tenía solo 16 Mb de RAM y disco de 8 Gb. Por lo tanto se me ocurrió que debería haber una manera de conectar ese monitor a una pc con una buena placa aceleradora de video para trabajar en diseño… y así es que buscando en internet encontré la equivalencia de pines entre la placa VGA y Mac:

  
Todo lo que hay que hacer es realizar el conexionado según los pines. Ojo con la soldadura en las fichas, y la calidad del cable de video, ya que puede haber interferencias. Tengo entendido que la conexión inversa, es decir, de PC a Mac también es posible, aunque no lo he probado.