Sei sulla pagina 1di 9

MANEJADOS CON EL PUERTO DE LA IMPRESORA

Funciona solo con windows 98 o versiones


anteriores
El puerto de la impresora de una pc se puede encender y apagar usando
una de las siguientes lineas de QBASIC

OUT 888,0
OUT 632,0
El nmero '0' se altera de acuerdo a que cables se desea apagar o
encender. Ninguna de esta lineas es un progama hay que hacerlas correr
para que trabajen
Aunque el puerto de la impresora tiene 25 conecciones solo 8 son salidas
utilizables. Aqu mostramos 4 de ellas para controlar un simple robot.
Para cambiar de apagado (off) a encendido (on) se usa un nmero binario.
Por ejemplo el nmero binario 0101 (del cual el equivalente decimal es el
5) har que el motor vaya adelante.

Intenta las primeras lneas de QBASIC con este nmero


OUT 888,5
y fjate si algo pasa. Si no ocurre nada prueba con:
OUT 632,5
Usualmente el primero es el que mejor trabaja.

El robot simple que se ve arriba consiste de dos motores pegados por el


centro con pegamento epxico, un clip para evitar que se vaya de espaldas
y dos bolitas de goma en aseguradas en los ejes. La razn por la que no
tiene ruedas es que el puerto de la impresora slo tiene suficiente corriente
como para hacer funcionar motores de alta impedancia ( motor de
walkman o Mabuchi) en forma bastante lenta, si se coloca algn tipo de
engranaje, este no girar. Usando el eje con bolitas como ruedas se logra
reduccin de engranajes sin engranajes. Al colocar una bolita de goma en

el eje se logra mayor friccin.


Usualmente el puerto de la impresora se usa para hacer funcionar
transistores que a su vez harn funcionar a los motores, pero esto es un
poco ms complicado.
Asumiendo que las primeras lineas de QBASIC han funcionado las otras
que se necesitarn son:
OUT 888,6
(primero motor en reversa, segundo motor adelante - '6' es el decimal del
binario 0110)
OUT 888,9
(primero motor en reversa, segundo motor adelante - '9' es el decimal del
binario 1001)
y finalmente
OUT 888,10
(ambos motores en reversa - '10' es el decimal del binario 1010)
OUT 888,0 apaga ambos motores.
Nmeros binarios arriba de 11111111 (decimal 255) se puden usar para
hacer funcionar las ocho salidas.
Una forma fcil de crear un retraso de tiempo (time delay) es con el "loop"
for-next , por ejemplo:
FOR n=0 TO 10000: NEXT
Crear un corto pero perceptible retraso de tiempo, su duracin precisa
depende de la velocidad del procesador de la computadora. Para qeu
retraso sea ms largo se usa un nmero ms grande:
FOR n=0 TO 70000: NEXT
Un nmero ms pequeo nos dar un intervalo de tiempo ms pequeo.
Este programa encender ambos motores por un momento, luego har
que uno de ellos vaya en reversa:
OUT 888,5
FOR n=0 TO 9000: NEXT
OUT 888,9
La animacin de abajo muestra como se usan los nmeros binarios para
controlar las salidas:

Otro uso es el de encender Leds, aqu se conectan dos Leds a las


primeras salidas y ala tierra del puerto de la impresora por medio de un
resistor de 10 ohmios. El resistor es para limitar la corriente y tal vez no
sea necesario.

Si los LEDs se encienden y apagan usando el siguiente programa y la


regla en la que estn colocadas se hace ir de un lado al otro rapidamente,
se podr notar una carita en el aire producida por los Leds.
w=10
WHILE INKEY$<>CHR$(27)
OUT 632,2
FOR n= 0 TO w:NEXT
OUT 632,1
FOR n= 0 TO 5 * w:NEXT
OUT 632,2
FOR n= 0 TO w:NEXT
OUT 632,0
FOR n= 0 TO 15 * w:NEXT
WEND
La variable w define el ancho de la imagen; el multiplicador 5 define el
ancho de la boca; 15 define el espacio entre las caras. El programa
antiene fuincionando el "loop" WHILE-WEND hasta que se presiona
escape (escape es 27 en cdigo ASCII ).
Si el programa se hace ms sofisticado, se puede hacer que la cara guie
el ojo, etc. Usando ms Leds (se pueden usar ms de 8) obtendremos
imgenes ms interesantes. Una mejor forma de hacer esto es usar un

disco de Nipkov.

Usando las Entradas


Si se hace correr el siguente programa:
PRINT INP(889)
aparaecer un nmero en la pantalla, por ejemplo 120.
Si conectamos con un cablecito la tierra del puerto de la impresora con uno
de los pines

y se hace correr el programa, el nmero debera cambiar. El nuevo nmero


podra ser 56 por ejemplo.
Si se encuentra que el puerto de la impresora respondi al nmero 632
entonces el programa sera:
PRINT INP(633)
Hay 5 pines de entrada. Al conectar a tierra los otros pines se deben
producir otros nmeros. Por ejemplo 248,88,104,112. No trates de
entender el significado de estos nmeros. El mismo pin siempre producir
el mismo nmero. Conectando a tierra diferentes combinaciones de los
pines producirn nmeros diferentes.
Abajo un programa un poco mejorado para mostrar esto:
WHILE INKEY$<>CHR$(27)
PRINT INP(889)
WEND
Esto significa 'mantente yendo en loop hasta que no se presione la tecla
escape'; continuamente muestra el nmero que corresponde a la tierra o
de los pines de entrada.
Digamos que se ha establecido que los nmeros 120 y 56 indican si la
coneccin a tierra est tocando el pin de la primera entrada, se pude hacer
un interruptor de colisin para el robot.

El programa es:
OUT 888,5
WHILE INKEY$<>CHR$(27)
PRINT INP(889)
WEND
Es como el ltimo programa pero tiene una lnea extra que hace que el
robot se encienda.
OUT 888,5
WHILE INKEY$<>CHR$(27)
IF INP(889)=56 THEN PRINT "there has been a collision"
WEND
OUT 888,0
Otro muy similar pero apaga el robot cuando se presiona la tecla 'escape'.
Lo que realmente se desea es un programa que diga 'reversa si pegas
contra algo'
OUT 888,5
IF INP(889)=56 THEN OUT 888,10
Lo malo es que funciona slo para una colisin (un choque), sera mejor si
se dijera 'si pegas contra algo al ir adelante ve hacia atrs o al revs, de
otra manera ve adelante (porque se supone que estbas yendo hacia
adelante).
Esta es una buena ilustracin de la dificultad de traducir el uso del sentido
comn a lenguaje lgico. Ya nosotros desarrollamos el sentido comn
naturalmente (claro, no todos) y no nos damos cuenta de su complejidad.
d=5
WHILE INKEY$<>CHR$(27)
IF INP(889)=56 THEN IF d=5 THEN d=10 ELSE d=5
OUT 888,d
WEND
OUT 888,0
El programa de arriba introduce una variable, d (se puede llamar como
sea) que se usa para describir la direccin del robot.

En la practica no trabaja muy bien porque la computadora va a un loop


miles de veces por segundo y cuando el robot choca contra algo no pude
tomar una desicin. Esto se puede arreglar introduciendo un "time delay":
'Si has golpeado contra algo retrocede un poco antes de preguntarte si has
golpeado contra algo nuevamente', veamos:
d=5
WHILE INKEY$<>CHR$(27)
IF INP(889)=56 THEN IF d=5 THEN d=10 ELSE d=5
OUT 888,d
IF INP(889)=56 THEN FOR n=0 TO 1000:NEXT
WEND
OUT 888,0
An un aparato tan simple es bastante complejo. Es mejor usar ingenio
mecnico para arreglar estos defectos y otros que se pudieran presentar.

MAS ENTRADAS
En el ejemplo, la segunda entrada nos da el nmero 248 cuando se
conecta a tierra. Si la primera entrada es conectada a tierra al mismo
tiempo , se muestra el nmero 184.
Es posible aislar las entradas por medio de 'suma binaria' (And). Si una o
ambas entradas se conectan a tierra, la siguiente aislar a la primera:
PRINT INP(889) AND 248
Esto nos dar 56 an cuando ambas se ha conectado a tierra; de igual
manera:
PRINT INP(889) AND 56
aislar la segunda entrada.
Este es todo el conocimiento de programacin que se necesita para leer
PWM (Pulse Width Modulation - modulacin de ancho de pulso); hay muchos
sensores sofisticados pero baratos en el mercado que usan salida PWM,
por ejemplo:
ojos ultrasonicos
brjula electronica
acelerometro
detector de colores
asumiendo que se conecta la salida PWM de uno de estos dipositivos a la
primera entrada (se deben conectar las tierras), el siguiemete programa
nos dar un nmero qie indicar aceleracin, color, etc.
WHILE INKEY$<>CHR$(27)
n=0
WHILE INP(889)=56
n=n+1
WEND
PRINT n
WEND

INTERFACE SIMPLE
Esta es una interface muy sencilla y un poco experimental:

Esta interface usa cuatro transistores comunes, como se han colocado


simetricamente en una tira de cartn, es topogrficamente simple.
Notemos que las tierras estn conectadas. Es poco probable que se daen
los componentes con slo una pila, por otra parte obtenemos una corriente
constante, es muy adecuado para usarlo con el robot que escribe.
La interface responder a los nmeros binarios 00,01 y 10 (decimales de
0,1 y 2) entonces el programa:
OUT 888,2
har que el motor vaya en una direccin
OUT 888,1
har que vaya en la direccin opuesta. A propsito, el comando
equivalente en lenguaje C es:
outportb(888,1);
el comando de entrada es muy similar:
inportb(889);
se debe incluir "dos.h". Me siento ms cmodo usando QBASIC.
Aparentemente se puede usar incluso Java.

DETECTANDO VOLTAJE
Algunas veces se desea medir un voltaje determinado, en vez de detectar
si est apagado o encendido (On - Off) esto se puede lograr midiendo el
tiempo que tarda un capacitor en cargarse usando un loop for-next

Arriba podemos ver un circuito simple, el transistor est controlado por el


cable de la segunda salida (el primero se usa como fuente de voltaje y est
siempre encendido); cuando la segunda salida est en on el transistor
conduce y vacia el capacitor (el primer loop for-next loop en el programa
hace esto). Tan pronto como se apaga el capacitor comienza a cargarse
por medio del potencimetro. El tiempo que se toma depende de cuanto
est conduciendo el LDR o Resistor Dependiente de la Luz.
WHILE INKEY$<>CHR$(27)
OUT 888,3
FOR n=0 TO 1000:NEXT
n=0
OUT 888,1
WHILE INP(889)=56
n=n+1
WEND
PRINT n
WEND
El valor de n crece hasta que hay suficiente voltaje para encender la
entrada (1.3 volts) y luego se muestra en la pantalla.
Cuanto ms correinte pase por el LDR, ms alto ser el nmero en la
pantalla. . En los dibujos se puede ver el LDR dirigido a una tarjeta de
gradiente e iluminado por un Led de alto brillo. Funciona como un
transductor linear sin friccin. Abajo se ve la tarjeta.

Tambin se puede usar un transductor giratorio.

AVISO AQUI

Potrebbero piacerti anche