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 número '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 número
binario. Por ejemplo el número binario 0101 (del cual el equivalente decimal es el 5)
hará que el motor vaya adelante.
Intenta las primeras líneas de QBASIC con este número
OUT 888,5
y fíjate 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 epóxico, un clip para evitar que se vaya de espaldas y dos bolitas de goma en
aseguradas en los ejes. La razón por la que no tiene ruedas es que el puerto de la
impresora sólo tiene suficiente corriente como para hacer funcionar motores de alta
impedancia ( motor de walkman o Mabuchi) en forma bastante lenta, si se coloca algún tipo
de engranaje, este no girará. Usando el eje con bolitas como ruedas se logra reducción
de engranajes sin engranajes. Al colocar una bolita de goma en el eje se logra mayor
fricción.
Usualmente el puerto de la impresora se usa para hacer funcionar transistores que a
su vez harán funcionar a los motores, pero esto es un poco más complicado.
Asumiendo que las primeras lineas de
QBASIC han funcionado las otras que se necesitarán 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.
Números binarios arriba de 11111111 (decimal 255) se puden usar para hacer funcionar las
ocho salidas.
Una forma fácil 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 duración precisa depende de
la velocidad del procesador de la computadora. Para qeu retraso sea más largo se usa un
número más grande:
FOR n=0 TO 70000: NEXT
Un número más pequeño nos dará un intervalo de tiempo más pequeño.
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 animación de abajo muestra como se usan los números 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 están
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 código
ASCII ).
Si el programa se hace más sofisticado, se puede hacer que la cara guiñe el ojo,
etc. Usando más Leds (se pueden usar más de 8) obtendremos imágenes más 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 número 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 número debería cambiar. El nuevo número podría ser 56
por ejemplo.
Si se encuentra que el puerto de la impresora respondió al número 632 entonces el
programa sería:
PRINT INP(633)
Hay 5 pines de entrada. Al conectar a tierra los otros pines se deben producir otros
números. Por ejemplo 248,88,104,112. No trates de entender el significado de estos
números. El mismo pin siempre producirá el mismo número. Conectando a tierra diferentes
combinaciones de los pines producirán números 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 número que corresponde a la tierra o de los pines de entrada.
Digamos que se ha establecido que los números 120 y 56 indican si la conección a tierra
está tocando el pin de la primera entrada, se pude hacer un interruptor de colisión 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 línea 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 sólo para una colisión (un choque), sería mejor si se dijera
'si pegas contra algo al ir adelante ve hacia atrás o al revés, de otra manera ve
adelante (porque se supone que estbas yendo hacia adelante).
Esta es una buena ilustración de la dificultad de traducir el uso del sentido común a
lenguaje lógico. Ya nosotros desarrollamos el sentido común 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 dirección 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 desición. 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
Aún un aparato tan simple es bastante complejo. Es mejor usar ingenio mecánico para
arreglar estos defectos y otros que se pudieran presentar.
MAS ENTRADAS
En el ejemplo, la segunda entrada nos da el número 248 cuando se conecta a tierra. Si la
primera entrada es conectada a tierra al mismo tiempo , se muestra el número 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 aún 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 programación que se necesita para leer PWM
(Pulse Width Modulation - modulación
de ancho de pulso); hay muchos sensores sofisticados pero baratos en el mercado que usan
salida PWM, por ejemplo:
ojos ultrasonicos
brújula 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 número qie indicará
aceleración, 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 cartón, es topográficamente simple. Notemos que las tierras están conectadas.
Es poco probable que se dañen los componentes con sólo una pila, por otra parte
obtenemos una corriente constante, es muy adecuado para usarlo con el robot que escribe.
La interface responderá a los números binarios 00,01 y 10 (decimales de 0,1 y 2)
entonces el programa:
OUT 888,2
hará que el motor vaya en una dirección
OUT 888,1
hará que vaya en la dirección opuesta. A propósito, 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 más cómodo 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 potenciómetro. 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 más correinte pase por el LDR, más alto será el número 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 fricción. Abajo se ve la tarjeta.
También se puede usar un transductor giratorio.
!
AVISO AQUI
GRAN OFERTA Libro: Introducción a las Enerías Alternativas con EXPERIMENTOS!