universidad tecnologica nacional facultad regional san nicolas braille.pdf · facultad regional san...

66
UNIVERSIDAD TECNOLOGICA NACIONAL FACULTAD REGIONAL SAN NICOLAS INGENIERIA EN ELECTRONICA PROBLEMA DE INGENIERÍA TECNICAS DIGITALES III IMPRESORA BRAILLE Integrantes: - Chiconi, Juan Pablo - Giménez, Matías - Heis, Juan Gabriel - Lázzari, Claudio Docentes: - Profesor: Ing. Poblete, Felipe - Auxiliar: Ing. Gonzalez, Mariano AÑO 2009

Upload: phungxuyen

Post on 27-Sep-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

UNIVERSIDAD TECNOLOGICA NACIONAL FACULTAD REGIONAL SAN NICOLAS

INGENIERIA EN ELECTRONICA

PROBLEMA DE INGENIERÍA

TECNICAS DIGITALES III

IMPRESORA BRAILLE

Integrantes:

- Chiconi, Juan Pablo - Giménez, Matías - Heis, Juan Gabriel - Lázzari, Claudio

Docentes:

- Profesor: Ing. Poblete, Felipe - Auxiliar: Ing. Gonzalez, Mariano

AÑO 2009

Técnicas Digitales III – Problema de ingeniería

2

INDICE

OBJETIVOS DEL TRABAJO 3

MATERIAS INTEGRADAS 3

POSIBLES APLICACIONES 3

PROFESORES ENTREVISTADOS 3

BIBLIOGRAFÍA 3

INTRODUCCIÓN: 4

EL CÓDIGO BRAILLE: 4 Louis Braille 4 Sistema Braille 7

DESARROLLO 10

PARTE ELECTRO-MECÁNICA 10 Iniciación del proyecto: 10 PARTES QUE SE RETIRARON DE LA IMPRESORA ORIGINAL 11 Piezas que se colocaron 12

PARTE ELECTRÓNICA 23 Comunicación bidireccional mediante puerto paralelo 23 Confección de Placa controladora. 26 Control del motor PAP 31

TEORÍA DE FUNCIONAMIENTO 33

CIRCUITOS O DIAGRAMAS 34

EJECUCION DEL PROGRAMA 35 Programación 37 Ejemplos de impresión: 40

PRESUPUESTO 41

RESULTADOS Y FOTOS DE LAS IMPRESIONES BRAILLE 42

IMÁGENES (ANEXO) 43

PROGRAMA 44

Técnicas Digitales III – Problema de ingeniería

3

OBJETIVOS DEL TRABAJO Como objetivo principal de este trabajo podemos destacar la actividad que vincula diferentes especialidades de las ramas técnicas y tecnológicas, interactuando en un grupo de trabajo con diversas posturas y puntos de vista. Un objetivo muy importante es el de autosatisfacción, por ser un trabajo que puede ser perfectamente aplicado a la sociedad, más precisamente a personas con dificultades visuales y de escasos recursos económicos.

MATERIAS INTEGRADAS • Informática 2 - Ingeniería Industrial. • Informática 1 y 2 - Ingeniería electrónica. • Control. • Electrónica de Potencia. • Instrumentación.

POSIBLES APLICACIONES • Implementación de un periférico poco común pero de suma importancia para las personas con

deficiencias visuales. • Base para un proyecto a gran escala y aplicable a un mercado real.

PROFESORES ENTREVISTADOS • Lic. Juan Arce - Consulta: Threads - Multithreads. • Ing. Lucas Guadagnolli - Consulta: Visual Basic. • Ing. Hugo Francini - Consulta: Optoacoplador de precisión. • Ing. Marcelo Monjes

BIBLIOGRAFÍA • Sitios de Internet.

• www.Braille.org • www.biografiasyvidas.com/biografia/b/Braille.htm

• Libros. • Visual Basic 6 - Matías Blázquez Iglesias

Técnicas Digitales III – Problema de ingeniería

4

Introducción:

El código Braille:

Un poco de historia:

Louis Braille (Coupvray, Francia, 1809 - París, 1852) Educador e inventor francés del sistema de lectura y escritura táctil para invidentes que lleva su nombre, basado en un método de representación que utiliza celdas con seis puntos en relieve. El método Braille es en la actualidad el sistema de lectura y escritura punteada universalmente adoptado en los programas de educación de invidentes. Braille aplicó su novedoso método al alfabeto, a los números y a la notación musical.

A los tres años de edad sufrió un accidente que le privó de la vista: trataba de imitar la labor de su padre en el taller familiar de talabartería y se dañó uno de los ojos con el punzón que utilizaba para perforar el cuero. Algún tiempo después, el ojo enfermo infectó el ojo sano y el pequeño Louis perdió la vista para siempre. A pesar de su deficiencia física, Braille asistió durante dos años a la escuela de su localidad natal, y aunque demostró ser uno de los alumnos más aventajados, su familia creyó que el muchacho nunca podría aprender a leer y escribir, ni acceder a través de la educación a un prometedor futuro. Cuando cumplió los diez años ingresó en la escuela para chicos ciegos de París, una de las primeras instituciones especializadas en este campo que se inauguraron en todo el mundo. Las condiciones del centro eran muy duras; se imponía a los alumnos una severa disciplina que, sin embargo, no amedrentó el fuerte carácter del joven Braille. En el centro, los pupilos aprendían algunos oficios sencillos y recibían la mayor parte de su instrucción de forma oral. También asistían a clases de lectura porque el fundador de la escuela, Valentin Haüy, había conseguido desarrollar un sistema de impresión de libros con los caracteres en relieve para permitir la lectura táctil. El método era muy rudimentario: exigía una impresión individualizada en cobre

Técnicas Digitales III – Problema de ingeniería

5

para cada una de las letras y, aunque los alumnos podían tocarlas e identificarlas con las yemas de los dedos, no eran capaces de reproducirlas por sí mismos mediante la escritura. En 1821, un oficial del ejército llamado Charles Barbier de la Serre visitó la escuela para presentar un nuevo sistema de lectura y escritura táctil que podía introducirse en el programa educativo del centro. Barbier había inventado una técnica básica para que los soldados pudieran intercambiarse mensajes en las trincheras durante la noche sin necesidad de hablar, evitando así que el enemigo descubriera su posición. Su invento de escritura nocturna, bautizado con el nombre de Sonography, consistía en colocar sobre una superficie plana rectangular doce puntos en relieve que, al combinarse, representaban sonidos diferentes. El joven Louis Braille, que había conseguido avanzar notablemente en sus estudios y desarrollar un considerable talento para la música, percibió inmediatamente que las posibilidades del Sonography para la educación de invidentes pasaban por simplificar el sistema aportado por Barbier. En los meses siguientes experimentó con diferentes posibilidades y combinaciones hasta que encontró una solución idónea para reproducir la fonética básica que sólo requería la utilización de seis puntos en relieve. Continuó trabajando varios años más en el perfeccionamiento del sistema y desarrolló códigos diferentes para la enseñanza de materias como la música y las matemáticas. A pesar de las indudables ventajas que ofrecía para el desarrollo educativo de los niños ciegos, el método inventado por el joven francés no se implantó de forma inmediata. Existieron reticencias entre los docentes sobre la utilidad del sistema, y un profesor de la escuela llegó incluso a prohibir a los chicos su aprendizaje. Afortunadamente, el veto causó un efecto alentador entre los alumnos, que, a escondidas, se esmeraban por estudiar las composiciones de puntos ideadas por su compañero Louis y descubrían que no sólo eran capaces de leer textos sino también de escribirlos ellos mismos con un simple método de fabricación de puntos en relieve. Por primera vez los invidentes disfrutaban de una autonomía que hasta entonces les había sido vedada. Braille se convirtió en profesor de la escuela y se ganó la admiración de todos sus alumnos. Desgraciadamente, no vivió lo bastante para ver cómo su sistema se adoptaba en todo el mundo. Enfermo de tuberculosis, murió a los 43 años con el pesar de que probablemente su revolucionario invento desaparecería con él. No se cumplieron los malos presagios del pedagogo francés, porque ya eran muchos los que habían descubierto la eficacia de su método. En 1860, el sistema Braille se introdujo en la escuela para ciegos de San Luis (Estados Unidos). En 1868, un grupo de cuatro invidentes, liderado por el doctor Thomas Armitage, fundó en el Reino Unido una sociedad para impulsar el perfeccionamiento y la difusión de la literatura grabada en relieve para ciegos. Este pequeño grupo de amigos creció hasta convertirse en el Instituto Nacional de Ciegos, el mayor editor de textos en Braille en Europa y la mayor organización británica para personas con discapacidad visual. En el siglo XX, el método Braille se había implantado en casi todos los países del mundo. La gran aportación de Louis Braille a la educación y a la calidad de vida de la población invidente fue finalmente reconocida en su país: en 1952, cuando se cumplía el centenario de su muerte, su cuerpo fue trasladado al Panteón parisino donde reposan los restos de los héroes nacionales. Aquel mismo año, la Asociación Amigos de Louis Braille compró la casa de Coupvray donde en 1809 había nacido el educador, y poco después el Consejo Mundial para la Promoción Social de los Ciegos se encargó de su administración a través del Comité Louis Braille. En 1966, el estado francés inscribió la casa natal en el inventario de monumentos históricos. En 1984, cuando el

Técnicas Digitales III – Problema de ingeniería

6

Consejo se fusionó con la Federación Internacional de Ciegos y surgió la actual Unión Mundial de Ciegos, la casa natal y el Comité Braille pasaron a formar parte de la Unión. El sistema Braille El sistema Braille consiste en un código de 69 caracteres, constituidos por un rectángulo de seis puntos que conforman una figura determinada. Estos caracteres Braille están unidos en líneas sobre el papel y pueden leerse pasando las yemas de los dedos suavemente sobre el escrito. Durante el siglo XIX se habían realizado otros intentos para conseguir que los invidentes pudieran leer y escribir, aunque ninguno de los proyectos anteriores al Braille fue lo bastante satisfactorio. Braille decidió utilizar el sistema de grabación de los signos en relieve sobre un papel, ya utilizado anteriormente, pero usando un código alfabético distinto del latino y del griego.

El alfabeto Braille La escritura se realizaba mediante impresiones en relieve sobre planchas, lo cual permitía un tipo de lectura analítica y táctil a la velocidad de 125 a 175 palabras por minuto. Las matrices que diseñó no sólo representaban letras sino también los números, los signos de puntuación y acentuación y algunas de las contracciones más usuales de los idiomas occidentales. Este sistema se publicó por primera vez en 1829 y fue presentado en su modelo más completo en 1837. No fue aceptado como oficial por la Institution des Aveugles hasta 1854, dos años después de la muerte de LouisBraille, y en 1878 se aprobó en el Congreso Internacional de París como sistema universalista de enseñanza de los invidentes. Las combinaciones de puntos en relieve están ordenadas en una tabla de ocho líneas horizontales; las dos primeras contienen diez matrices, y las seis restantes, nueve, ocho, siete, once, siete y siete respectivamente. Las matrices de las tres primeras líneas indican letras; las de las tres siguientes números y signos gramaticales. En la séptima línea se incluyen caracteres que permiten emplear adecuadamente los anteriores: contracciones, mayúsculas, etc., así como un indicador de que el siguiente carácter es numérico. La octava línea indica las notas musicales. En 1965 se realizó una adaptación del sistema Braille al lenguaje anglosajón, añadiendo símbolos de utilidad para las matemáticas superiores y otras disciplinas técnicas. El sistema Braille también permite la escritura, que se realiza gracias a dos planchas metálicas entre las cuales se coloca el papel; una de las ellas tiene seis agujeros para meter el punzón y horadar según el signo que se desea emplear. Actualmente el sistema Braille puede escribirse también con

Técnicas Digitales III – Problema de ingeniería

7

máquinas con seis llaves, una para cada punto de matriz Braille. La primera máquina para escribir en Braille la inventó Frank H. Hall en 1892.

Sistema Braille El código Braille se basa en una matriz de seis puntos distribuidos en dos columnas de tres puntos cada uno, dependiendo de la presencia o la ausencia de esos puntos, se obtienen 64 combinaciones diferentes con las cuales se pueden representar varias letras del alfabeto y signos de puntuación. A esta matriz de puntos se la conoce como símbolo generador, el cual tiene las siguientes especificaciones: La altura del punto (relieve) es de 0,508 mm; la separación entre los centros de los puntos de un mismo símbolo generador es de 2,5 mm (tanto horizontal como verticalmente). La distancia horizontal entre dos símbolos adyacentes es de 3,75mm (medida desde el centro del punto 4 del primer símbolo y el centro del punto 1 del segundo símbolo) y la distancia vertical entre dos símbolos generadores es de 5 mm (medida desde el centro del punto 6 del símbolo superior y el centro de del punto 4 del símbolo inferior).

Matriz generadora braille

Dimensiones de las celdas Braille

El sistema Braille utiliza diez símbolos esenciales, que representan las diez primeras letras del alfabeto latino ( desde la “A” hasta la “J”), cuyas combinaciones sólo emplean los puntos 1, 2, 4 y 5 (puntos superiores del símbolo generador). Para representar las letras de la K a la T, es igual que para las primeras diez pero agregando el punto inferior izquierdo (punto 3), a excepción de la letra Ñ que es un carácter especial propio del idioma español, y para las letras de la U a la Z se agregan

Técnicas Digitales III – Problema de ingeniería

8

los dos puntos inferiores (puntos 3 y 6), excepto para la W que también tiene una representación especial.

Alfabeto Braille

En algunos casos se recurre a la utilización de dos símbolos generadores para representar un solo carácter. Un ejemplo de esto son las letras mayúsculas y los números. Para lograr una letra mayúscula se antepone un símbolo especial (cuya combinación son los puntos 4 y 6) delante de la letra que se quiere representar, y para lograr una palabra completamente en mayúsculas se anteponen a la palabra dos de estos símbolos.

Representación de la mayúscula

Para lograr números se antepone un símbolo generador con la combinación 3, 4, 5 y 6 y luego se utilizan las letras de la A a la J para representar los números, dónde desde la letra A hasta la I le corresponden a los números del 1 al 9 respectivamente y la J coincide con el 0.

Técnicas Digitales III – Problema de ingeniería

9

Representación en código Braille de un número

También existe la representación para símbolos de puntuación y letras acentuadas. Para los signos de interrogación, admiración y comillas no hay diferencias entre los que abren y cierran, en cambio para los paréntesis existen dos símbolos diferentes.

Signos de puntuación y vocales acentuadas

Técnicas Digitales III – Problema de ingeniería

10

DESARROLLO

PARTE ELECTRO-MECÁNICA

Iniciación del proyecto: Cuando se escogió el proyecto de Impresora Braille instantáneamente surgió como duda principal qué y cómo se haría la parte mecánica. La deliberación fue unánime: "Utilizar como base una impresora ya existente y modificarla acorde a nuestro prototipo". En ese momento el reto fue encontrar una impresora que tenga ciertas características que permitan modificaciones acordes a nuestros conocimientos y que, a la vez, satisfagan las necesidades de la impresora Braille. Como parámetros fundamentales se busco que posea los siguientes: a) Robustez: La impresora debe ser resistente a los golpes que marcan la hoja. b) Sencillez: Debido a que hay que realizar modificaciones, es mejor trabajar con sistemas que no poseen una complejidad avanzada. c) Espacio: Como hay que añadir un elemento punzante con un electroimán, es conveniente que el lugar no sea reducido. d) Estándar: La impresora debe ser común y corriente, de esta manera se asegura que los repuestos se consiguen y permite una producción de varias Impresoras Braille. Llegado el momento de la elección se contaba con 4 impresoras. De HEWLET PACKARD el modelo HP 640C y de la marca EPSON una Stylus 440, una LX 300 y una LX 800. Las LX 300 y LX 800 son matriz de punto, la distancia entre el cabezal de impresión y donde pasa la hoja es reducida, por lo que se descartaron. En cuanto a la HP y la EPSON 440 la elección fue a favor de la HP por presentar mayor distancia entre el cabezal y la hoja, permitiendo un trabajo más simple, sencillo y eficiente.

HP 640 C

EPSON 440 EPSON LX 800

Técnicas Digitales III – Problema de ingeniería

11

EPSON LX 300

PARTES QUE SE RETIRARON DE LA IMPRESORA ORIGINAL A la impresora original se le retiraron algunas piezas que no se necesitaban o molestaban al nuevo mecanismo de impresión. Algunas de esas piezas son las siguientes: -Plásticos exteriores. -Motor Paso a Paso del sistema de limpieza de cabezal. -Plaqueta controladora, ésta fue reemplazada por una nueva de diseño propio. -Sensores de Hoja y finales de carrera, los ópticos fueron reemplazados por mecánicos y distribuidos de manera diferente. -Sistema de posicionamiento Grilla-Optoacoplador, fue removido completamente y se colocó un sistema diseñado en función a las dimensiones del Código Braille Estándar.

Impresora HP640C original

Técnicas Digitales III – Problema de ingeniería

12

Despiece Impresora

Aquí se ve que se retiró la plaqueta controladora, para dar lugar a la de diseño propio.

Piezas que se colocaron Que se agregó a la impresora original. Al modelo de la impresora HP 640C se le realizaron una serie de cambios necesarios para que la misma funcione como impresora Braille. -Lomo de apoyo de la hoja donde se efectúan los golpes del Electroimán.

Técnicas Digitales III – Problema de ingeniería

13

Como segundo paso se adapto una barra metálica la cual cumple la función de apoyo de los golpes del electroimán, la misma corrige la precisión de los golpes, obteniendo los resultados buscados.

Ésta pieza pertenece a una impresora EPSON, en la parte superior se colocó una goma a modo de amortiguar el golpe del punzón. Soporte anti cabeceo Una vez que ya tuvimos el electroimán y la barra adaptada surgió el inconveniente del cabeceo del electroimán, el cual se corrigió adaptándole un dispositivo metálico en la parte posterior del cabezal, el cual detiene su cabeceo. El soporte evita el movimiento del cabezal al golpear a lo largo de todo el ancho de la impresora.

Técnicas Digitales III – Problema de ingeniería

14

Grilla Como la impresora original tiene una grilla demasiado fina, lo que se hizo fue cambiar el conjunto grilla-optoacoplador. El optoacoplador es un estándar, éste resulto de precisión aceptable y costo reducido. La grilla fue creada a partir de una filmina sobre la cual se imprimieron las líneas con una impresora laser. Se probaron 3 grillas de distintos tamaños de línea y separación.

Todas las grillas se hicieron con una parte negra del mismo tamaño que la transparente. En el caso 1 la medida de cada línea fue de 0.312 mm, en la 2 fue de 0.625 mm y en la 3 de 1.25 mm. La 1 era la más precisa que las otras, pero al ser tan pequeñas el optoacoplador podía perder la lectura de alguna en cualquier momento. La 3 permitía trabajar con mas velocidad que las anteriores pero carecía de precisión. Solución: la 2 Es la relación justa entre precision y velocidad, ademas se asegura una correcta lectura del optoacoplador. Como la grilla es mas larga que el tamaño de una hoja tamaño oficio (el máximo tamaño que aceptaba la impresora laser) se tuvieron que pegar 2 grillas.

Esta es la plantilla sobre la cual se escribe en Braille, de esta plantilla se sacaron las medidas correspondientes a la separación, tamaño del punto, renglón, etc.

Técnicas Digitales III – Problema de ingeniería

15

Errores comunes de grilla Hay 2 tipos de errores en la impresión que son fácilmente identificables y muy diferenciados entre sí. El error de la fig. 1 no tiene un patrón, por lo que es del tipo aleatorio. Este error se debe a una mala lectura del optoacoplador, posiblemente una mala polarización o luz que entra en el recinto donde se encuentra el mismo causando una señal con mucho ruido. En la fig. 2 se ve que el error es en una zona, esto se debe a que la grilla tiene deficiencias, puede ser suciedad o que la grilla no tiene las líneas bien marcadas o gastadas.

fig. 1

fig. 2 Elemento Percutor Éste elemento fue uno de los grandes retos a cumplir, ya que tuvimos diferentes opciones y distintos puntos de vista. Se probaron diferentes elementos como relés, contactores, electroimanes de diversos tamaños inclusive de fabricación casera. Los más probados fueron: -Electroimán pequeño: El primer mecanismo probado fue un electroimán pequeño, el cual tenía una punta que pasaba por el centro del bobinado y realizaba un movimiento cuando éste se accionaba. Este dispositivo no tuvo éxito debido a que la fuerza aplicada a la punta no era suficiente para lo que se requería.

Técnicas Digitales III – Problema de ingeniería

16

-Electroimán mediano Al no obtener buenos resultados con el primer electroimán se optó por un segundo, el cual tenía un tamaño levemente superior al anterior pero los resultados también fueron negativos.

fig. 1 Electroimán pequeño. fig. 2 Electroimán mediano. -Electroimán casero Como tercera opción se decidió armar un electroimán. Los cálculos necesarios para poder realizarlo dieron como resultado que se necesitarían 3000 vueltas de alambre de cobre de 0,30mm de diámetro. Si bien éste dispositivo funcionó, la fuerza del mismo seguía siendo insuficiente para nuestra aplicación. Explicación de la elección de 3000 vueltas: El alambre de cobre utilizado tiene 0.30 mm de diámetro. Si calculamos su sección:

22

2 0.07072379865409476147057703470,070685832

30.0.. mmmmrS

S: Sección en milímetros cuadrados. r: Radio del alambre en milímetros.

Cálculo térmico Será el que determine en principio la sección del conductor. El valor eficaz de la intensidad de corriente nominal del circuito no tendrá que ocasionar un incremento de temperatura superior a la especificada para cada tipo de cable. Para los conductores aislados y sin envoltura de protección, la norma IRAM 2183 refiere las intensidades máximas admisibles para cables instalados en

Técnicas Digitales III – Problema de ingeniería

17

cañerías, servicio continuo, con temperaturas límites de 40°C para el ambiente, 70°C en el conductor y 160°C en caso de cortocircuito, tal como se muestra en la tabla siguiente: Sección del conductor de cobre según IRAM 2183

S (mm2) I (A) 1 9,6

1,5 13 2,5 18 4 24 6 31

10 43 16 59 25 77 35 96 50 116 70 148

Estos datos tienen el siguiente gráfico:

Ampliando la región inicial:

Técnicas Digitales III – Problema de ingeniería

18

Como se ve para 0.7 2mm de sección da entre 6.5 y 7.5 A. Supongamos 6.5 A, y como es prácticamente lineal, podemos deducir que para nuestro alambre (0.0707 2mm ) el límite será de aproximadamente 0.65 A, tomemos nuestro valor máximo de corriente en 0.55 A para no correr riesgos ni sobrecalentar demasiado el electroimán . El alambre de cobre de 0,30mm de diámetro tiene como resistencia promedio 0.2418 m/ . Para obtener mayor inducción se pensó en alimentar el electroimán con tensiones cercanas a los 24V. Con lo que el cálculo de metros necesarios será de :

IRVN.

N: Longitud del alambre en metros. V: Tensión aplicada en voltios. R: Resistencia del alambre por metro. I: Corriente aplicada en amperios.

mA

m

VmN 18055.0.2418.0

24

Como eje del electroimán utilizamos una lapicera de aproximadamente 10 mm de diámetro. La longitud de cada vuelta sobre el eje es de: mmL 0624.001.0..2

L: Perímetro de una circunferencia. Con lo que obtenemos: vueltasvueltasmmLmN 30002892

0624.0180

El bobinado se realizó colocando la lapicera en una agujereadora de bajas revoluciones. Para mantener el alambre dentro del rango deseado se colocaron arandelas de mica como tope. Se eligió este material por no presentar problemas frente al campo magnético del arrollamiento.

Técnicas Digitales III – Problema de ingeniería

19

Técnicas Digitales III – Problema de ingeniería

20

Pese a nuestros esfuerzos, éste electroimán no fue lo suficientemente potente como para marcar la hoja, por lo que se descartó. -Electroimán de impresora laser. Finalmente se consiguió un electroimán de tamaño y fuerza adecuado, el cual se adaptaba perfectamente a nuestros requisitos. El mismo era controlado con 12V de CC. Una vez obtenido el electroimán se adapto éste a la impresora, en el cual no tuvimos mayor inconveniente.

Técnicas Digitales III – Problema de ingeniería

21

El soporte plástico pertenecía a la impresora original, estaba dispuesto de forma tal que brindaba soporte al motor que efectúa la limpieza de cabezales de impresión (pieza removida, ya que para nuestro uso fue innecesaria). Como no coincidía la distancia del electroimán a la barra donde se producen los golpes se le colocó una especie de suplemento formado por un acrílico de 5 mm de espesor, de forma tal que se acople entre el electroimán y el soporte, permitiendo una sujeción fuerte y a su vez retirando el electroimán lo deseado.

Técnicas Digitales III – Problema de ingeniería

22

1 - soporte acrílico. 2- soporte electroimán. 3- electroimán.

Técnicas Digitales III – Problema de ingeniería

23

PARTE ELECTRÓNICA

Comunicación bidireccional mediante puerto paralelo En este proyecto se elige utilizar puerto paralelo debido a que la transferencia de datos y las velocidades en las que éstas se realizan son adecuadas para nuestras necesidades, destacándose además la sencillez del protocolo de transmisión. También se elige esta opción por ser uno de los puertos más utilizados para la comunicación entre las PC´s y las impresoras comunes. Esto quiere decir que la mayoría de las PC´s que existen hoy en día poseen puerto paralelo y de esta manera nuestro proyecto podrá adaptarse a casi cualquier computadora personal que posea este tipo de puerto (que hoy en día son la mayoría). El único problema que se encontró para la correcta configuración del puerto paralelo fue que el Sistema Operativo XP lo bloqueaba de manera tal que no podía ser accedido por el usuario. Por lo tanto para solucionar este inconveniente debió copiarse el archivo inpout32.dll en el directorio C:\Windows\System32. Se trabaja la computadora en modo bidireccional ECP (Enhanced Capability Port) que puede, como el EPP, leer y escribir a la velocidad del bus. Fue desarrollado por Microsoft y Hewlett-Packard. Se distingue por poseer capacidad de DMA, FIFO y compresión de datos RLE. El puerto paralelo mediante el conector DB-25 provee la lectura-escritura (entrada-salida de datos) con un nivel lógico de datos TTL, debemos saber como es la conexión porque el puerto paralelo se puede dañar y dejar daños irreparables en la Placa Madre de la PC. El hardware del puerto paralelo está muy limitado en cuanto a su capacidad de manejo de corriente y debemos cuidar la elevación de la misma. Para que esto no suceda se utilizó un 74HCT245 que ayuda a aislar el puerto y no permite retorno de corriente dañina o superior a las que maneja el puerto paralelo que son unos cuantos miliamperes.

Técnicas Digitales III – Problema de ingeniería

24

Este puerto dispone de tres registros de 8 bit cada uno (un byte), los cuales se denominan puertos o PORT, y cada uno de sus bits representa un pin determinado del puerto. Los pin's que van del 18 al 25 (ambos inclusive): Son para masa, y sirven para conectar las descargas de los circuitos. Puerto de datos (Pin 2 al 9): Es el PORT 888 y es de solo escritura, por éste registro enviaremos los datos al exterior de la PC. Puerto de estado (Pin 15, 13, 12, 10 y 11): Es el PORT 889 y es de solo lectura, 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 E7, E6, E5, E4 y E3 teniendo en cuenta que el bit E7 funciona en modo invertido. Puerto de control (Pin 1, 14, 16 y 17): Es el correspondiente al PORT 890, 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 C0, C1, C2 y C3, con un pequeño detalle, los bits C0, C1, y C3 están invertidos. En la siguiente imagen se pueden ver los tres registros, sus bits y los pines asignados a cada uno de ellos. La imagen corresponde a un conector DB-25 (Hembra).

La tensión de trabajo del puerto es de 5 voltios, por lo que necesitamos una fuente estabilizada o regulada de tensión, esto es importante tenerlo en cuenta, ya que estaremos enviando señales al puerto. Por otro lado, si bien se puede utilizar la PC para enviar señales al exterior sin necesitad de una fuente externa, es recomendable utilizarla y así no se exige demasiado al puerto y se evitan problemas. Como se dijo antes, para proteger el puerto de corrientes dañinas se utilizó el integrado 74HCT245 cuyos datos son los siguientes:

Técnicas Digitales III – Problema de ingeniería

25

Este integrado tiene la ventaja de ser bidireccional, es decir todos los pin's A pueden ser entradas y los B salidas si DIR (pin1 DR) se encuentra a nivel bajo (L), el modo invertido se obtiene con DR a nivel alto. Si el terminal OE (pin 19) se encuentra a nivel alto (H) el integrado pone los pin's A y B con alta impedancia, es decir ni entra ni sale señal alguna, en ese caso el estado de DR no tiene importancia. En la siguiente tabla se observan los nombres de los pines y sus funciones correspondientes.

En el siguiente esquema se puede observar la conexión entre el puerto paralelo y el buffer Nº1. En dicho esquema no se representaron todos los pines del puerto, sino los correspondientes al puerto de datos y los de masa, que son los que utilizamos para enviar datos desde la PC hacia el circuito de la impresora

Técnicas Digitales III – Problema de ingeniería

26

Confección de Placa controladora.

Técnicas Digitales III – Problema de ingeniería

27

Con la parte electrónica no teníamos más opción que crear una plaqueta que tenga distintas funciones:

Técnicas Digitales III – Problema de ingeniería

28

a) Drive para el motor de continua. b) Drive para el motor paso a paso. c) Comunicación bidireccional mediante puerto paralelo. d) Aislar la PC de la impresora. Explicación detallada de los ítems anteriores: a) Drive para el motor de continua. Esto se logró con un puente H, el cual permite mover el motor en ambos sentidos. Para obtener el máximo rendimiento de torque-- de este motor sin rescindir precisión se necesitó excitarlo con un tren de pulsos con modulación por ancho de pulsos o PWM. Conceptos básicos de PWM Supongamos alimentar a un motor con estos tipos de señales

El motor trabaja a mitad de velocidad.

El motor trabaja a mínima velocidad

El motor trabaja a máxima velocidad Motor de Continua

Técnicas Digitales III – Problema de ingeniería

29

b) Drive para el motor paso a paso. Breve introducción a los motores paso a paso Los motores paso a paso, son un caso particular dentro de los motores en general. La señal eléctrica de alimentación no es ni CC ni CA como en otros casos, sino un tren de pulsos que se suceden con una secuencia, previamente definida, a cada una de las bobinas que componen el estator. Cada vez que a alguna de estas bobinas se les aplica un pulso, el motor se desplaza un paso, y queda fijo en esa posición. Dependiendo de las características constructivas del motor este paso puede ser desde 90º hasta incluso 0,9º. Por lo tanto, si somos capaces de mover el motor en pequeños pasos, esto nos va a permitir controlar su posición, con mayor o menor precisión dependiendo del avance de cada paso. Además, variando la frecuencia con la que se aplican los pulsos, también estaremos variando la velocidad con que se mueve el motor, lo que nos permite realizar un control de velocidad. Por último si invertimos la secuencia de los pulsos de alimentación aplicados a las bobinas, estaremos realizando una inversión en el sentido de giro del motor. Resumiendo, definimos el motor paso a paso, como aquel motor cuyas bobinas del estator son alimentadas mediante trenes de pulsos, con una determinada frecuencia, y que permite: controlar la posición, controlar la velocidad y controlar el sentido de giro. Para nuestro proyecto se utilizó un motor paso a paso de imán permanente unipolar modelo PM55L-048 como el que muestra la siguiente figura:

Técnicas Digitales III – Problema de ingeniería

30

Los motores paso a paso de imán permanente tienen las siguientes características constructivas: El rotor está formado por un imán permanente, en forma de disco, y en cuya

superficie se encuentran mecanizados un determinado número de dientes. El estator tienen forma cilíndrica, y en su interior se encuentran diversos bobinados, que

al ser alimentados secuencialmente generan un campo magnético giratorio. Como resultado de las fuerzas de atracción-repulsión, el rotor se orientará dentro de este

campo magnético giratorio, lo que provocará su movimiento. La conmutación en la alimentación de las bobinas tiene que ser manejada por un

controlador externo. Los motores de imán permanente pueden ser clasificados en función del sentido de la intensidad que recorre los bobinados en dos grupos: 1. MOTORES PAP BIPOLARES: están formados por dos bobinas, y la intensidad que circula por ellas invierte su sentido sucesivamente (de ahí surge el nombre de bipolares). Se pueden reconocer externamente porque presentan cuatro conductores, uno para cada extremo de una bobina.

2. MOTORES PAP UNIPOLARES: en este caso el estator está formado por dos bobinas con tomas intermedias, lo que equivale a cuatro bobinas. Las tomas intermedias de las dos bobinas pueden estar interconectadas en el interior o no. Externamente se apreciarán cinco conductores en el primer caso, y seis en el segundo. La forma de alimentar este motor consiste en poner a masa la toma central e ir aplicando según una secuencia determinada pulsos de valor +V a un extremo de la bobina y al otro. De tal manera que la intensidad que circula por cada media bobina siempre lo hace en el mismo sentido, por eso se denominan unipolares.

A continuación se muestra la secuencia de excitación de bobinas para el funcionamiento de un motor unipolar en modo paso completo.

Técnicas Digitales III – Problema de ingeniería

31

Se puede conseguir una resolución mayor si entre paso y paso dejamos una bobina sin alimentar. A continuación se muestra la secuencia de excitación de bobinas para el funcionamiento de un motor unipolar en modo medio paso.

Control del motor PAP Para poder manejar el motor paso a paso que controla el movimiento de las hojas que ingresan a la impresora, se siguió la secuencia como lo indica la tabla de pasos completos. Esto se realizó enviando datos desde la PC, los cuales pasan por un buffer (cuyo único propósito es proteger el puerto de la PC) y de allí se dirigen al integrado ULN2003, el cual en su interior posee un conjunto de Darlingtons, lo que hace que las corrientes de las señales que se encuentran en su entrada (las cuales son muy bajas) sean amplificadas hasta 500mA, corriente suficiente para mover el motor PP y excitar el electroimán de tal forma que su movimiento tenga una fuerza adecuada para marcar la hoja con el punzón adherido a él.

Técnicas Digitales III – Problema de ingeniería

32

En el siguiente gráfico se puede observar la conexión de pines del integrado ULN2003.

Motor Paso a Paso

.

Técnicas Digitales III – Problema de ingeniería

33

TEORÍA DE FUNCIONAMIENTO

La impresora Braille consiste de dos partes fundamentales: el software de control y la impresora propiamente dicha. El software de control, realizado en Visual Basic 6, es un programa que consta de una pantalla principal que permite ingresar un texto ya sea ingresándolo por teclado o bien cargando un archivo .txt con el texto que se desee imprimir, el cual puede ser creado con cualquier edito de texto. Una vez ingresado el texto que se quiere imprimir, se procede a presionar un botón, incluido en el programa también, el cual pasa el texto por un “filtro” que elimina los caracteres no contemplados en el código Braille. Luego se le agregan los caracteres especiales de código Braille como por ejemplo los caracteres que anteceden las letras mayúsculas, números, etc. En el siguiente paso se divide el texto modificado en renglones que permiten solo 31 caracteres, donde las palabras nunca se cortan en el final de dicho renglón para una mejor interpretación del lenguaje. Por lo tanto las palabras que deberían ser cortadas pasan al siguiente renglón. A continuación el programa invierte el texto haciendo un espejado del mismo. Esto se debe a que la impresión Braille se realiza del lado opuesto al de la lectura del texto. Luego de esto a cada uno de los caracteres del texto le corresponde una matriz de 2 columnas y 3 filas, la cual está compuesta por ceros (0) y unos (1) ubicados en dicha matriz según le corresponda a cada carácter. Esto se hace para lograr una equivalencia con el código Braille ya que éste está compuesto por matrices de 2x3 cuyas componentes son puntos con relieve para que puedan ser interpretadas por las personas con dificultades visuales severas. En nuestro caso un cero indicará que el electroimán no debe actuar y un uno que si debe actuar. Por lo tanto luego de haber cambiado cada uno de los caracteres por su correspondiente matriz se procede a agrupar todos los ceros y unos del primer renglón, segundo renglón, etc. según corresponda. Una vez codificado el texto en ceros y unos se envían estos datos y algunos otros agregados por el puerto paralelo hacia la impresora propiamente dicha. El software también consta de una barra de herramientas y un botón que detiene la ejecución del programa en caso de existir algún error. EL hardware recibe los datos enviados por el puerto paralelo y éstos pasan por un buffer de entrada. De éstos datos se podrán interpretar los que son señales para el motor paso a paso, el motor de corriente continua y el electroimán. Los datos que van al motor paso a paso, salen del buffer de entrada y entran en un amplificador de corriente. Esto se hace para que la corriente que entra al motor sea la suficiente para que éste se mueva con un torque adecuado, el cual se traduce en el movimiento del rodillo que mueve las hojas a través de la impresora. Los datos correspondientes al motor de CC son enviados directamente a un puente H donde se controla el sentido de giro del motor según sea necesario. Este movimiento, mediante modulación por ancho de pulso se aplica a un carro donde se encuentran la punta y el electroimán que marcaran las hojas. Dicho carro se mueve a lo largo de la impresora. Asi se completa la secuencia de unos y ceros para terminar la impresión y girar el rodillo hasta sacar la hoja. Una vez que se termina la extracción de la hoja impresa se dispone del programa para, de ser necesario, realizar otra impresión.

Técnicas Digitales III – Problema de ingeniería

34

CIRCUITOS O DIAGRAMAS

Técnicas Digitales III – Problema de ingeniería

35

EJECUCION DEL PROGRAMA

Se elige desde el menu principal la opcion archivo-abrir. Se abre una pantalla como la que se muestra en la imagen donde uno elige unidad, carpeta y nombre de archivo.

Se elige el archivo y se pone aceptar. En este caso el archivo dice "IMPRESORA BRAILE" y en el segundo renglon tambien dice "IMPRESORA BRAILE".

Se puso esta "vista preliminar" para corroborar que el archivo abierto es el que realmente se quiere imprimir. Abajo del texto aparecen 3 botones. Imprimir, Volver (vuelve al menu anterior) y PARAR (el boton se activa solamente cuando se da la orden de imprimir). En esta imagen está imprimiendo. En el extremo inferior derecho aparece "IMPRIMIENDO" como indicador.

Técnicas Digitales III – Problema de ingeniería

36

Boton PARAR Esta función es vital para interrumpir la ejecución de la impresión. Esta función se activa cuando se presiona un botón llamado "PARAR" que se encuentra en la parte inferior del menú de impresión.

Una vez presionado este botón se pausa la impresión y aparece un cartel que dice EL PROCESO SE DETUVO. Desea interrumpir la operación? Si uno acepta se saca la hoja y la impresión termina. Si uno cancela la operación se retoma la impresión en el punto donde estaba y continúa normalmente. IMPRESION SATISFACTORIA Si la impresion termina sin inconvenientes lo indica como se ve en la imagen.

Al presionar el boton Aceptar se vuelve al menu principal por si el usuario desea realizar otra impresión o salir del programa.

Técnicas Digitales III – Problema de ingeniería

37

Programación En modulo1.bas se puede ver la declaración de variables públicas usadas en varios formularios como así también la utilización de diferentes librerías necesarias para el funcionamiento de algunas funciones. Ver anexo (programa). Principal.bas contiene las sentencias para que los datos se conviertan en movimientos de motores y electroimán.

Se pueden destacar los siguientes puntos: 1) Busca el archivo de la ruta seleccionada. 2) Carga línea por línea hasta el final del archivo. 3) Busca la última letra. 4) Implementa la función filtro, la cual solamente deja pasar los caracteres del código Braille. 5) Coloca # cuando se trata de un número. 6) Coloca $ cuando la palabra empieza con mayúscula. 7) Coloca $$ si la palabra está escrita en mayúsculas. 8) Separa en renglones de 29 caracteres c/u. (Como se escribe con la plantilla). Si el renglón no tiene 29 posiciones lo rellena con espacios. 9)Invierte el texto de manera que la posición 30 queda en la 1, la 29 en la 2 y así sucesivamente. Esto se hace así porque la escritura se hace de derecha a izquierda y la lectura del revés de la hoja y de izquierda a derecha. 10)Se llama a la función codificación. Lo que ésta función hace es partir cada renglón en 3 y así obtener la codificación de cada elemento del código en parte superior, media e inferior por separado. Básicamente es una tabla con la codificación de cada elemento, como ser minúsculas, mayúsculas, caracteres especiales y números. También se agregan caracteres para señalar fin de línea y fin de archivo. 11) Se llama a la función generador. Aquí se copian los primeros 30 caracteres pero con los códigos de la parte superior, luego el medio y finalmente la inferior; así se prosigue con los 30 caracteres restantes. O sea que los 30 primeros caracteres se convirtieron en 180 "1" o "0". Luego se revisa cada uno de estos "1" o "0" y si corresponde a "1" equivale a un punto con el electroimán, si es "0" es un espacio vacío, si es "*" es un cambio de línea y si es "/" es fin de la impresión. 12) Se llama a la función correspondiente a cada caracter(1,0,*,/). Aquí se detallan brevemente: "0" Función vacío Se mueve el carro hasta que el opto(que se encuentra posicionado en una posición de negro-fig. 1-) obtenga un blanco y luego encuentre otro negro, se hace así por si quedase posicionado en un

Técnicas Digitales III – Problema de ingeniería

38

blanco -fig. 2- se mueve hasta obtener el negro, luego el blanco y luego se detiene en el negro. Si en cambio el opto se encuentra posicionado en un negro se mueve hasta el blanco y luego al negro.

De esta manera (que se cuenten las transiciones de negro a blanco y no solamente de cambio de estado alto a bajo) se lograron corregir los pequeños errores de posicionamiento. Cabe destacar que este fino control se realiza en un motor de corriente continua, mediante una modulación por ancho de pulso. Se planteó una relación de compromiso con el fin de sacrificar velocidad y obtener el máximo rendimiento en control minimizando el error de posicionamiento. Esto se logró con un ciclo de trabajo menor al 10 %.

%90909.0444

4044

msms

msmsms

ttt

offon

on

"1" Función marca Es el mismo funcionamiento que vacio, lo único que varía es que al finalizar ejecuta un punto con el electroimán. "*" Función nueva línea Mueve el carro en dirección opuesta a marca y vacío (se mueve hacia la derecha), al finalizar hace avanzar el papel, esto se logra mediante el motor paso a paso, alimentando individualmente cada una de las bobinas con la secuencia correcta y con pulsos de 5 ms.

Técnicas Digitales III – Problema de ingeniería

39

Las bobinas corresponden a los valores 8, 16, 32 y 64 del puerto paralelo. Para darle el tamaño de renglón se repite 5 veces este paso. "/" Función final: Se mueve el carro hacia la derecha hasta el sensor (posición de inicio) y luego se excita el motor paso a paso con el fin de que se extraiga la hoja. Al terminar envía un cartel que la impresión se realizó correctamente. También hay que destacar la función posición inicial que incluye tomar hoja y la función detener. Función posición inicial: Se mueve el carro hacia la izquierda con velocidad un instante (para separarlo del sensor si es que quedó contra el borde), luego lo hace hasta la derecha hasta tocar el sensor y luego vuelve hacia la izquierda con velocidad hasta el sensor izquierdo (se hace así para activar una traba mecánica que permite que con el mismo motor que avanza la hoja se puedan levantar las hojas de la bandeja y las tome correctamente), toma una hoja, luego el cabezal se mueve hacia la derecha y vuelve hasta la izquierda para liberarse de la traba mecánica; ahora coloca la hoja a la atura de la primer línea de impresión, el cabezal avanza 80 líneas para posicionarse en el punto donde se comienza a golpear. Función detener: Esta función es vital para interrumpir la ejecución de la impresión. Esta función se activa cuando se presiona un botón llamado "PARAR" que se encuentra en la parte inferior del menú de impresión. Una vez presionado este botón se pausa la impresión y aparece un cartel que dice EL PROCESO SE DETUVO. ¿Desea interrumpir la operación?

Técnicas Digitales III – Problema de ingeniería

40

Si uno acepta se saca la hoja y la impresión termina. Si uno cancela la operación se retoma la impresión en el punto donde estaba y continúa normalmente. Ver anexo (programa). Función TESTEO: Esta función se creó con el fin de comprobar el funcionamiento correcto de la impresora, prueba los sensores de fin de carrera, la grilla, el electroimán, el motor paso a paso y el motor de corriente continua. El proceso es muy sencillo. Primero se mueve el carro hacia la izquierda brevemente, esto lo hace para separarlo del sensor por si se encontrara en contacto. Luego se posiciona contra el sensor derecho, y después vuelve hacia la izquierda con velocidad hasta el sensor izquierdo (se hace así para activar una traba mecánica que permite que con el mismo motor que avanza la hoja se puedan levantar las hojas de la bandeja y las tome correctamente), toma una hoja, luego el cabezal se mueve hacia la derecha y vuelve hasta la izquierda para liberarse de la traba mecánica; ahora coloca la hoja a la atura de la primer línea de impresión, el cabezal avanza 80 líneas para posicionarse en el punto donde se comienza a golpear. Comienza a golpear en cada línea de la grilla encontrada y cuenta 60 posiciones, finalizado esto avanza la hoja un renglón y golpea de izquierda a derecha con cada línea 60 veces, llega al final, avanza un renglón y vuelve a repetir el proceso. Esto lo repite 5 veces con el fin de encontrar algún punto fuera de la línea del margen, de ser así indica que la grilla no se pudo leer correctamente.

Mientras se realiza el testeo el programa muestra esta pantalla para indicarlo.

Ejemplos de impresión:

Técnicas Digitales III – Problema de ingeniería

41

En la fig.1 se ve una impresion correcta, en la fig. 2 se ve que al volver de un renglón falló un punto (circulo rojo -posiblemente no se distingue un negro en la grilla-). Al finalizar el renglón se ve que pone 1 punto fuera de lugar (círculo azul), como el error es acumulativo se mantiene al bajar al renglón siguiente. Para corroborar el correcto funcionamiento, al finalizar el test, los puntos del primer renglón y del último deben estar alineados.

PRESUPUESTO

Los datos fueron recopilados de Internet (deremate.com, mercadolibre.com), service oficial (Carlos Amor Servicio Técnico), Negocio de Computación (Rei). Item Costo Impresora HP 640 c 140 Kit de mantenimiento 1150 Barilla tensora 45 goma 20 tornillos/arandelas/tuercas 12 sensores 21 optoacoplador 2 plaqueta 72 punzón 12 grilla impresa 2 lapicera 2,5 cinta/termocontraíble 9 total 1487,5

Técnicas Digitales III – Problema de ingeniería

42

RESULTADOS Y FOTOS DE LAS IMPRESIONES BRAILLE

En una visión general del proyecto se ve claramente que cumple con los objetivos propuestos, si bien sus prestaciones no se pueden comparadas con una impresora Braille profesional, deja en claro que a la hora de transmitir un mensaje vía código Braille lo hace muy bien, destacando un punto notorio pero nunca marcado de más (figs. 2 y 3), ya que ésto perjudica la sensibilidad de la yema del dedo. La velocidad de escritura es muy buena, aproximadamente 100 puntos por minuto y el costo de fabricación no superó los $ 1500.

fig. 1 En la fig. 1 dice BRAILLE!

fig. 2

fig. 3

Técnicas Digitales III – Problema de ingeniería

43

IMÁGENES (ANEXO)

Técnicas Digitales III – Problema de ingeniería

44

PROGRAMA ---------------MODULO1.BAS----------------------- Public ruta As String Public renglon As Integer Public textoagregado1 As String Public textoagregado2 As String Public espaciado As String Public invertido As String Public linea1 As String Public linea2 As String Public linea3 As String Public bandera As Integer Public detiene As Integer Public detenertest As Integer Public volver As Integer Public llama_final As Integer Public Declare Function Inp Lib "inpout32.dll" _ Alias "Inp32" (ByVal PortAddress As Integer) As Integer Public Declare Sub Out Lib "inpout32.dll" _ Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As Integer) Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long) --------------FIN-MODULO1.BAS----------------------- ---------------PRINCIPAL.BAS----------------------- Private Sub Form_activate() Dim textolinea As String Dim textoleido As String Open ruta For Input As #1 Do Until EOF(1) Line Input #1, textolinea textoleido = textoleido + textolinea + vbCrLf Loop Close #1 '------------------------------ longitud = Len(textoleido) For a = 1 To longitud individual = Mid$(textoleido, a, 1) If (individual <> Chr$(10) Or individual <> Chr$(13)) Then ult_letra = a End If Next a texto_aux = Mid$(textoleido, 1, ult_letra - 2) Text1.Text = texto_aux '------------------------------ End Sub Private Sub Command1_Click() StatusBar1.Panels.Add , "Impresion", "Imprimiendo trabajo.....", sbrText, LoadPicture(App.Path & "\imagenimpresora2.jpg") StatusBar1.Panels(1).AutoSize = sbrContents label1.Caption = "IMPRIMIENDO"

Técnicas Digitales III – Problema de ingeniería

45

Call filtro End Sub Private Function filtro() mayusculas = 0 numero = 0 For b = 1 To Len(Text1.Text) X = Mid$(Text1.Text, b, 1) If (X >= "a" And X <= "z") Or (X >= "A" And X <= "Z") Or (X >= "0" And X <= "9") Or (X = " ") Or (X = "á") Or (X = "é") Or (X = "í") Or (X = "ó") Or (X = "ú") Or (X = "Á") Or (X = "É") Or (X = "Í") Or (X = "Ó") Or (X = "Ú") Or (X = "ü") Or (X = ".") Or (X = ",") Or (X = ";") Or (X = ":") Or (X = "-") Or (X = "(") Or (X = ")") Or (X = "¿") Or (X = "?") Or (X = "¡") Or (X = "!") Or (X = "'") Or (X = Chr$(10)) Or (X = Chr$(13)) Then filtro_caracter = filtro_caracter + X End If Next b cant_caracteres = Len(filtro_caracter) texto = filtro_caracter For a = 1 To cant_caracteres letra = Mid(texto, a, 1) Select Case letra Case "a" To "z" If numero = 1 Then textoagregado1 = textoagregado1 + "%" mayusculas = 0 numero = 0 cont_mayusculas = 0 End If textoagregado1 = textoagregado1 + letra Case "A" To "Z" cont_mayusculas = cont_mayusculas + 1 If mayusculas = 1 Then textoagregado1 = textoagregado1 + letra End If If mayusculas = 0 Then textoagregado1 = textoagregado1 + "$" textoagregado1 = textoagregado1 + letra posición = a mayusculas = 1 numero = 0 End If Case " " textoagregado1 = textoagregado1 + letra mayusculas = 0 numero = 0 cont_mayusculas = 0 Case "0" To "9" If numero = 1 Then textoagregado1 = textoagregado1 + letra End If If numero = 0 Then textoagregado1 = textoagregado1 + "#" textoagregado1 = textoagregado1 + letra mayusculas = 0 numero = 1 End If cont_mayusculas = 0 Case Chr$(10) textoagregado1 = textoagregado1 + Chr$(10) mayusculas = 0 numero = 0 Case Chr$(13) textoagregado1 = textoagregado1 + Chr$(13)

Técnicas Digitales III – Problema de ingeniería

46

mayusculas = 0 numero = 0 Case Else textoagregado1 = textoagregado1 + letra End Select Next Call mayuscula End Function Private Function mayuscula() For a = 1 To Len(textoagregado1) X = Mid$(textoagregado1, a, 1) If X = "$" Then Y = Mid$(textoagregado1, a + 1, 1) z = Mid$(textoagregado1, a + 2, 1) If Y <> " " And (z >= "A" And z <= "Z") Then X = X + "$" End If End If textoagregado2 = textoagregado2 + X Next a Call separarenglon End Function Private Function separarenglon() cont_30 = 0 ult_esp = 0 a = 0 cant_caracteres3 = Len(textoagregado2) pri_esp = 0 mul = 0 mitexto = "" dif_esp = 0 a = 0 If cant_caracteres3 <= 30 Then For d = 1 To cant_caracteres3 X = Mid$(textoagregado2, d, 1) If X = Chr$(13) Then cont_enter = d dif_esp = d - pri_esp - 1 textomacho = Mid(textoagregado2, (pri_esp + 1), dif_esp) espaciado = espaciado + textomacho For c = Len(textomacho) To 30 espaciado = espaciado + " " Next c espaciado = espaciado + Chr$(13) & Chr$(10) pri_esp = d + 1 End If Next d dif_esp_fin = cant_caracteres3 - cont_enter If dif_esp_fin >= 1 Then textomacho = Mid(textoagregado2, (cont_enter + 1), dif_esp_fin) espaciado = espaciado + textomacho For e = Len(textomacho) To 30 espaciado = espaciado + " " Next e End If End If

Técnicas Digitales III – Problema de ingeniería

47

If cant_caracteres3 > 30 Then Do a = a + 1 X = Mid$(textoagregado2, a, 1) cont_30 = cont_30 + 1 If X = " " Then ult_esp = a End If If X = Chr$(13) Then dif_esp = a - pri_esp - 1 textomacho = Mid(textoagregado2, (pri_esp + 1), dif_esp) espaciado = espaciado + textomacho esp_faltantes = 31 - Len(textomacho) For b = 1 To esp_faltantes espaciado = espaciado + " " Next b espaciado = espaciado + Chr$(13) & Chr$(10) pri_esp = a + 1 cont_30 = 0 ult_esp = a + 1 final_esp = ult_esp End If If cont_30 >= 31 Then final_esp = ult_esp dif_esp = ult_esp - pri_esp textomacho = Mid(textoagregado2, (pri_esp + 1), dif_esp) espaciado = espaciado + textomacho esp_faltantes = 31 - Len(textomacho) For b = 1 To esp_faltantes espaciado = espaciado + " " Next b espaciado = espaciado + Chr$(13) & Chr$(10) pri_esp = ult_esp cont_30 = a - ult_esp End If Loop Until a >= cant_caracteres3 If ult_esp < a Then dif_esp = cant_caracteres3 - final_esp textomacho = Mid(textoagregado2, (final_esp + 1), dif_esp) espaciado = espaciado + textomacho esp_faltantes = 30 - Len(textomacho) For b = 1 To esp_faltantes espaciado = espaciado + " " Next b End If End If Call inversor End Function Private Function inversor() re = "" For a = 1 To Len(espaciado) X = Mid$(espaciado, a, 1)

Técnicas Digitales III – Problema de ingeniería

48

If X = Chr$(10) Then X = "" If X = Chr$(13) Then For b = Len(re) - 1 To 1 Step -1 invertido = invertido + Mid$(re, b, 1) Next b re = "" invertido = invertido + Chr$(13) + Chr$(10) End If re = re + X Next a If re <> "" Then For b = Len(re) To 1 Step -1 If (Mid$(re, b, 1) <> Chr$(13)) And (Mid$(re, b, 1) <> Chr$(10)) Then invertido = invertido + Mid$(re, b, 1) End If Next b End If Call codificacion End Function Private Function codificacion() linea1 = "" linea2 = "" linea3 = "" long5 = Len(invertido) cont_31 = 0 mitexto = invertido renglon = long5 / 31 For a = 1 To long5 letra2 = Mid$(mitexto, a, 1) Select Case letra2 'MINUSCULAS Case "a" linea1 = linea1 + "01" linea2 = linea2 + "00" linea3 = linea3 + "00" Case "b" linea1 = linea1 + "01" linea2 = linea2 + "01" linea3 = linea3 + "00" Case "c" linea1 = linea1 + "11" linea2 = linea2 + "00" linea3 = linea3 + "00" Case "d" linea1 = linea1 + "11" linea2 = linea2 + "10" linea3 = linea3 + "00" Case "e" linea1 = linea1 + "01" linea2 = linea2 + "10" linea3 = linea3 + "00" Case "f" linea1 = linea1 + "11" linea2 = linea2 + "01" linea3 = linea3 + "00" Case "g" linea1 = linea1 + "11" linea2 = linea2 + "11" linea3 = linea3 + "00"

Técnicas Digitales III – Problema de ingeniería

49

Case "h" linea1 = linea1 + "01" linea2 = linea2 + "11" linea3 = linea3 + "00" Case "i" linea1 = linea1 + "10" linea2 = linea2 + "01" linea3 = linea3 + "00" Case "j" linea1 = linea1 + "10" linea2 = linea2 + "11" linea3 = linea3 + "00" Case "k" linea1 = linea1 + "01" linea2 = linea2 + "00" linea3 = linea3 + "01" Case "l" linea1 = linea1 + "01" linea2 = linea2 + "01" linea3 = linea3 + "01" Case "m" linea1 = linea1 + "11" linea2 = linea2 + "00" linea3 = linea3 + "01" Case "n" linea1 = linea1 + "11" linea2 = linea2 + "10" linea3 = linea3 + "01" Case "ñ" linea1 = linea1 + "11" linea2 = linea2 + "11" linea3 = linea3 + "10" Case "o" linea1 = linea1 + "01" linea2 = linea2 + "10" linea3 = linea3 + "01" Case "p" linea1 = linea1 + "11" linea2 = linea2 + "01" linea3 = linea3 + "01" Case "q" linea1 = linea1 + "11" linea2 = linea2 + "11" linea3 = linea3 + "01" Case "r" linea1 = linea1 + "01" linea2 = linea2 + "11" linea3 = linea3 + "01" Case "s" linea1 = linea1 + "10" linea2 = linea2 + "01" linea3 = linea3 + "01" Case "t" linea1 = linea1 + "10" linea2 = linea2 + "11" linea3 = linea3 + "01" Case "u" linea1 = linea1 + "01" linea2 = linea2 + "00" linea3 = linea3 + "11"

Técnicas Digitales III – Problema de ingeniería

50

Case "v" linea1 = linea1 + "01" linea2 = linea2 + "01" linea3 = linea3 + "11" Case "w" linea1 = linea1 + "10" linea2 = linea2 + "11" linea3 = linea3 + "10" Case "x" linea1 = linea1 + "11" linea2 = linea2 + "00" linea3 = linea3 + "11" Case "y" linea1 = linea1 + "11" linea2 = linea2 + "10" linea3 = linea3 + "11" Case "z" linea1 = linea1 + "01" linea2 = linea2 + "10" linea3 = linea3 + "11" 'MAYUSCULAS Case "A" linea1 = linea1 + "01" linea2 = linea2 + "00" linea3 = linea3 + "00" Case "B" linea1 = linea1 + "01" linea2 = linea2 + "01" linea3 = linea3 + "00" Case "C" linea1 = linea1 + "11" linea2 = linea2 + "00" linea3 = linea3 + "00" Case "D" linea1 = linea1 + "11" linea2 = linea2 + "10" linea3 = linea3 + "00" Case "E" linea1 = linea1 + "01" linea2 = linea2 + "10" linea3 = linea3 + "00" Case "F" linea1 = linea1 + "11" linea2 = linea2 + "01" linea3 = linea3 + "00" Case "G" linea1 = linea1 + "11" linea2 = linea2 + "11" linea3 = linea3 + "00" Case "H" linea1 = linea1 + "01" linea2 = linea2 + "11" linea3 = linea3 + "00" Case "I" linea1 = linea1 + "10" linea2 = linea2 + "01" linea3 = linea3 + "00" Case "J" linea1 = linea1 + "10" linea2 = linea2 + "11"

Técnicas Digitales III – Problema de ingeniería

51

linea3 = linea3 + "00" Case "K" linea1 = linea1 + "01" linea2 = linea2 + "00" linea3 = linea3 + "01" Case "L" linea1 = linea1 + "01" linea2 = linea2 + "01" linea3 = linea3 + "01" Case "M" linea1 = linea1 + "11" linea2 = linea2 + "00" linea3 = linea3 + "01" Case "N" linea1 = linea1 + "11" linea2 = linea2 + "10" linea3 = linea3 + "01" Case "Ñ" linea1 = linea1 + "11" linea2 = linea2 + "11" linea3 = linea3 + "10" Case "O" linea1 = linea1 + "01" linea2 = linea2 + "10" linea3 = linea3 + "01" Case "P" linea1 = linea1 + "11" linea2 = linea2 + "01" linea3 = linea3 + "01" Case "Q" linea1 = linea1 + "11" linea2 = linea2 + "11" linea3 = linea3 + "01" Case "R" linea1 = linea1 + "01" linea2 = linea2 + "11" linea3 = linea3 + "01" Case "S" linea1 = linea1 + "10" linea2 = linea2 + "01" linea3 = linea3 + "01" Case "T" linea1 = linea1 + "10" linea2 = linea2 + "11" linea3 = linea3 + "01" Case "U" linea1 = linea1 + "01" linea2 = linea2 + "00" linea3 = linea3 + "11" Case "V" linea1 = linea1 + "01" linea2 = linea2 + "01" linea3 = linea3 + "11" Case "W" linea1 = linea1 + "10" linea2 = linea2 + "11" linea3 = linea3 + "10" Case "X" linea1 = linea1 + "11" linea2 = linea2 + "00" linea3 = linea3 + "11"

Técnicas Digitales III – Problema de ingeniería

52

Case "Y" linea1 = linea1 + "11" linea2 = linea2 + "10" linea3 = linea3 + "11" Case "Z" linea1 = linea1 + "01" linea2 = linea2 + "10" linea3 = linea3 + "11" 'OTROS Case Chr$(10) ' ENTER linea1 = linea1 + "-*" linea2 = linea2 + "-*" linea3 = linea3 + "-*" Case " " linea1 = linea1 + "00" linea2 = linea2 + "00" linea3 = linea3 + "00" Case "$" 'simbolo mayus linea1 = linea1 + "10" linea2 = linea2 + "00" linea3 = linea3 + "10" Case "#" 'simbolo numero linea1 = linea1 + "10" linea2 = linea2 + "10" linea3 = linea3 + "11" Case "," linea1 = linea1 + "00" linea2 = linea2 + "01" linea3 = linea3 + "00" Case "." linea1 = linea1 + "00" linea2 = linea2 + "00" linea3 = linea3 + "01" Case ";" linea1 = linea1 + "00" linea2 = linea2 + "01" linea3 = linea3 + "01" Case ":" linea1 = linea1 + "00" linea2 = linea2 + "11" linea3 = linea3 + "00" Case "-" linea1 = linea1 + "00" linea2 = linea2 + "00" linea3 = linea3 + "11" Case "¿" linea1 = linea1 + "00" linea2 = linea2 + "01" linea3 = linea3 + "10" Case "?" linea1 = linea1 + "00" linea2 = linea2 + "01" linea3 = linea3 + "10" Case "¡" linea1 = linea1 + "00" linea2 = linea2 + "11" linea3 = linea3 + "01" Case "!" linea1 = linea1 + "00"

Técnicas Digitales III – Problema de ingeniería

53

linea2 = linea2 + "11" linea3 = linea3 + "01" Case "'" linea1 = linea1 + "00" linea2 = linea2 + "01" linea3 = linea3 + "11" Case "(" linea1 = linea1 + "01" linea2 = linea2 + "01" linea3 = linea3 + "10" Case ")" linea1 = linea1 + "10" linea2 = linea2 + "10" linea3 = linea3 + "01" 'NUMEROS Case "1" linea1 = linea1 + "01" linea2 = linea2 + "00" linea3 = linea3 + "00" Case "2" linea1 = linea1 + "01" linea2 = linea2 + "01" linea3 = linea3 + "00" Case "3" linea1 = linea1 + "11" linea2 = linea2 + "00" linea3 = linea3 + "00" Case "4" linea1 = linea1 + "11" linea2 = linea2 + "10" linea3 = linea3 + "00" Case "5" linea1 = linea1 + "01" linea2 = linea2 + "10" linea3 = linea3 + "00" Case "6" linea1 = linea1 + "11" linea2 = linea2 + "01" linea3 = linea3 + "00" Case "7" linea1 = linea1 + "11" linea2 = linea2 + "11" linea3 = linea3 + "00" Case "8" linea1 = linea1 + "01" linea2 = linea2 + "11" linea3 = linea3 + "00" Case "9" linea1 = linea1 + "10" linea2 = linea2 + "01" linea3 = linea3 + "00" Case "0" linea1 = linea1 + "10" linea2 = linea2 + "11" linea3 = linea3 + "00" 'letras con acento Case "á"

Técnicas Digitales III – Problema de ingeniería

54

linea1 = linea1 + "01" linea2 = linea2 + "11" linea3 = linea3 + "11" Case "é" linea1 = linea1 + "10" linea2 = linea2 + "01" linea3 = linea3 + "11" Case "í" linea1 = linea1 + "10" linea2 = linea2 + "00" linea3 = linea3 + "01" Case "ó" linea1 = linea1 + "10" linea2 = linea2 + "00" linea3 = linea3 + "11" Case "ú" linea1 = linea1 + "10" linea2 = linea2 + "11" linea3 = linea3 + "11" Case "ü" linea1 = linea1 + "01" linea2 = linea2 + "11" linea3 = linea3 + "10" End Select Next a linea1 = linea1 + "-*" linea2 = linea2 + "-*" linea3 = linea3 + "-/" 'linea1 = linea1 + "//" Call generador End Function Private Function generador() Call posic_ini Texto1 = linea1 texto2 = linea2 texto3 = linea3 cant_caracteres = Len(Texto1) a = 0 noentra = 0 mitexto = Texto1 texto = "" '-------------------------------- b = 1 For a = 1 To renglon X = Mid$(Texto1, b, 62) texto = texto + X X = Mid$(texto2, b, 62) texto = texto + X X = Mid$(texto3, b, 62) texto = texto + X b = b + 62 DoEvents If detiene = 1 Then

Técnicas Digitales III – Problema de ingeniería

55

Call detener End If Next a '------------------------- a = 0 rng = 0 cant_caracteres2 = Len(texto) For a = 1 To cant_caracteres2 Sleep 2 lt = Mid(texto, a, 1) Sleep 2 Select Case lt Case "0" 'AVANZA MOTORCC 1 DoEvents If detiene = 1 Then Call detener End If Call vacio Case "1" 'ACTIVA ELECTROIMAN - AVANZA MOTORCC 1 DoEvents If detiene = 1 Then Call detener End If Call marca Case "*" 'CAMBIA DE LINEA DE LECTURA(AVANZA MOTORPP 2) DoEvents If detiene = 1 Then Call detener End If Call nueva_linea rng = rng + 1 If rng = 3 Then For r = 1 To 5 Out Val(888), Val(16) Sleep 5 Out Val(888), Val(32) Sleep 5 Out Val(888), Val(8) Sleep 5 Out Val(888), Val(64) Sleep 5 Next r rng = 0 End If Case "/" 'FIN DE LA IMPRESION DoEvents If detiene = 1 Then Call detener End If Call final End Select Next a End Function Private Function vacio() 'izquierda (888) 1 'derecha (888) 2 opt1 = 0 opt2 = 0 cont = 0 co = 1 Do Out Val(888), Val(1) Sleep 4 Out Val(888), Val(0) Sleep 40 opto2 = Inp(889) opto3 = opto2 And 16 If opto3 = 16 Then opt1 = 1

Técnicas Digitales III – Problema de ingeniería

56

End If If (opto3 = 0) And (opt1 = 1) Then opt2 = 1 End If If (opt1 = 1) And (opt2 = 1) Then opt1 = 0 opt2 = 0 cont = cont + 1 End If DoEvents If detiene = 1 Then Call detener End If Loop Until cont >= co End Function Private Function marca() 'izquierda (888) 1 'derecha (888) 2 opt1 = 0 opt2 = 0 cont = 0 co = 1 Do Out Val(888), Val(1) Sleep 4 Out Val(888), Val(0) Sleep 40 opto2 = Inp(889) opto3 = opto2 And 16 If opto3 = 16 Then opt1 = 1 End If If (opto3 = 0) And (opt1 = 1) Then opt2 = 1 End If If (opt1 = 1) And (opt2 = 1) Then opt1 = 0 opt2 = 0 Out Val(888), Val(0) Sleep 100 Out Val(888), Val(4) Sleep 10 Out Val(888), Val(0) Sleep 100 cont = cont + 1 End If DoEvents If detiene = 1 Then Call detener End If Loop Until cont >= co End Function Private Function nueva_linea() 'izquierda (888) 1 'derecha (888) 2 opt1 = 0 opt2 = 0 cont = 0 co = 60 Do Out Val(888), Val(2) Sleep 4 Out Val(888), Val(0) Sleep 40 opto2 = Inp(889) opto3 = opto2 And 16 If opto3 = 16 Then opt1 = 1 End If If (opto3 = 0) And (opt1 = 1) Then

Técnicas Digitales III – Problema de ingeniería

57

opt2 = 1 End If If (opt1 = 1) And (opt2 = 1) Then opt1 = 0 opt2 = 0 cont = cont + 1 End If DoEvents If detiene = 1 Then Call detener End If Loop Until cont >= co a = 0 For a = 1 To 5 Out Val(888), Val(16) Sleep 5 Out Val(888), Val(32) Sleep 5 Out Val(888), Val(8) Sleep 5 Out Val(888), Val(64) Sleep 5 DoEvents If detiene = 1 Then Call detener End If Next a Out Val(888), Val(0) Sleep 10 End Function Private Function final() 'izquierda (888) 1 'derecha (888) 2 opt1 = 0 opt2 = 0 cont = 0 co = 1 Do Out Val(888), Val(2) Sleep 4 Out Val(888), Val(0) Sleep 2 opto2 = Inp(889) opto3 = opto2 And 64 If opto3 = 0 Then opt1 = 1 End If If (opto3 = 64) And (opt1 = 1) Then opt2 = 1 End If If (opt1 = 1) And (opt2 = 1) Then opt1 = 0 opt2 = 0 Out Val(888), Val(16) Sleep 5 Out Val(888), Val(32) Sleep 5 Out Val(888), Val(8) Sleep 5 Out Val(888), Val(64) Sleep 5 cont = cont + 1 End If

Técnicas Digitales III – Problema de ingeniería

58

DoEvents If detiene = 1 Then Call detener End If Loop Until cont >= co For a = 1 To 350 Out Val(888), Val(16) Sleep 5 Out Val(888), Val(32) Sleep 5 Out Val(888), Val(8) Sleep 5 Out Val(888), Val(64) Sleep 5 DoEvents If detiene = 1 Then Call detener End If Next a Out Val(888), Val(0) Sleep 10 cartel = MsgBox("El Proceso de impresion se realizo correctamente", vbInformation + vbOKOnly, "Informacion") End Function Private Function posic_ini() 'izquierda (888) 1 'derecha (888) 2 ' --------------------------------------------------------------------------- Out Val(888), Val(1) Sleep 50 Out Val(888), Val(0) Sleep 10 '--------------------------------------------------------------------------- 'Avanza hasta el sensor derecho opt1 = 0 opt2 = 0 cont = 0 co = 1 Do Out Val(888), Val(2) opto2 = Inp(889) opto3 = opto2 And 64 If opto3 = 0 Then opt1 = 1 End If If (opto3 = 64) And (opt1 = 1) Then opt2 = 1 End If If (opt1 = 1) And (opt2 = 1) Then opt1 = 0 opt2 = 0 cont = cont + 1 End If DoEvents If detiene = 1 Then Call detener End If Loop Until cont >= co ' ---------------------------------------------------------------------------

Técnicas Digitales III – Problema de ingeniería

59

'Avanza hasta el sensor izquierdo opt1 = 0 opt2 = 0 cont = 0 co = 1 Do Out Val(888), Val(1) opto2 = Inp(889) opto3 = opto2 And 32 If opto3 = 0 Then opt1 = 1 End If If (opto3 = 32) And (opt1 = 1) Then opt2 = 1 End If If (opt1 = 1) And (opt2 = 1) Then opt1 = 0 opt2 = 0 cont = cont + 1 End If DoEvents If detiene = 1 Then Call detener End If Loop Until cont >= co ' --------------------------------------------------------------------------- 'Toma la hoja Out Val(888), Val(0) Sleep 10 a = 0 For a = 1 To 200 Out Val(888), Val(17) Sleep 5 Out Val(888), Val(33) Sleep 5 Out Val(888), Val(9) Sleep 5 Out Val(888), Val(65) Sleep 5 DoEvents If detiene = 1 Then Call detener End If Next a Out Val(888), Val(0) Sleep 10 Out Val(888), Val(2) Sleep 500 Out Val(888), Val(0) Sleep 10 Out Val(888), Val(1) Sleep 500 Out Val(888), Val(0) Sleep 100 Out Val(888), Val(2) Sleep 10 Out Val(888), Val(0) Sleep 10 For a = 1 To 80 Out Val(888), Val(16)

Técnicas Digitales III – Problema de ingeniería

60

Sleep 5 Out Val(888), Val(32) Sleep 5 Out Val(888), Val(8) Sleep 5 Out Val(888), Val(64) Sleep 5 DoEvents If detiene = 1 Then Call detener End If Next a Out Val(888), Val(1) Sleep 20 Out Val(888), Val(0) Sleep 10 ' --------------------------------------------------------------------------- 'Avanza 80 pasos hacia la derecha y se posiciona para empezar cont = 0 co = 80 Do Out Val(888), Val(2) Sleep 5 Out Val(888), Val(0) Sleep 10 opto2 = Inp(889) opto3 = opto2 And 16 If opto3 = 16 Then opt1 = 1 End If If (opto3 = 0) And (opt1 = 1) Then opt2 = 1 End If If (opt1 = 1) And (opt2 = 1) Then opt1 = 0 opt2 = 0 cont = cont + 1 End If DoEvents If detiene = 1 Then Call detener End If Loop Until cont >= co End Function Private Function detener() label1.Caption = "" a = MsgBox(" EL PROCESO SE DETUVO" + vbCrLf + vbCrLf + "Desea interrumpir la operación?", vbExclamation + vbOKCancel, "Salir") DoEvents If a = 1 Then Command1.Enabled = False Command2.Enabled = False Command3.Enabled = False label1.Caption = "ESPERE MIENTRAS SACA LA HOJA" StatusBar1.Panels.Clear StatusBar1.Panels.Add , "Impresion Abortada", "Sacando hoja.....", sbrText, LoadPicture(App.Path & "\imagenimpresora3.jpg") StatusBar1.Panels(1).AutoSize = sbrContents For l = 1 To 400 Out Val(888), Val(16) Sleep 10 Out Val(888), Val(32)

Técnicas Digitales III – Problema de ingeniería

61

Sleep 10 Out Val(888), Val(8) Sleep 10 Out Val(888), Val(64) Sleep 10 DoEvents Next l Out Val(888), Val(0) Sleep 10 End Unload Me detiene = 0 Form1.Show Form1.Enabled = True Form1.SetFocus DoEvents Else detiene = 0 DoEvents label1.Caption = "IMPRIMIENDO" StatusBar1.Panels.Add , "Impresion", "Imprimiendo trabajo.....", sbrText, LoadPicture(App.Path & "\imagenimpresora2.jpg") StatusBar1.Panels(1).AutoSize = sbrContents End If End Function ------------------FIN-PRINCIPAL.BAS------------------ ----------------FUNCION-PRIVADA-TESTEO--------------- Private Function testeo() detenertest = 0 'izquierda (888) 1 'derecha (888) 2 ' --------------------------------------------------------------------------- Out Val(888), Val(1) Sleep 50 Out Val(888), Val(0) Sleep 10 '--------------------------------------------------------------------------- 'Avanza hasta el sensor derecho opt1 = 0 opt2 = 0 cont = 0 co = 1 Do Out Val(888), Val(2) 'Sleep 5 'Out Val(888), Val(0) 'Sleep 10 opto2 = Inp(889) opto3 = opto2 And 64 If opto3 = 0 Then opt1 = 1 End If If (opto3 = 64) And (opt1 = 1) Then opt2 = 1 End If If (opt1 = 1) And (opt2 = 1) Then opt1 = 0 opt2 = 0 cont = cont + 1 End If

Técnicas Digitales III – Problema de ingeniería

62

DoEvents If detenertest = 1 Then Call detener_test End If Loop Until cont >= co ' --------------------------------------------------------------------------- 'Avanza hasta el sensor izquierdo opt1 = 0 opt2 = 0 cont = 0 co = 1 Do Out Val(888), Val(1) 'Sleep 10 'Out Val(888), Val(0) 'Sleep 2 opto2 = Inp(889) opto3 = opto2 And 32 If opto3 = 0 Then opt1 = 1 End If If (opto3 = 32) And (opt1 = 1) Then opt2 = 1 End If If (opt1 = 1) And (opt2 = 1) Then opt1 = 0 opt2 = 0 cont = cont + 1 End If DoEvents If detenertest = 1 Then Call detener_test End If Loop Until cont >= co ' --------------------------------------------------------------------------- 'Toma la hoja Out Val(888), Val(0) Sleep 10 a = 0 For a = 1 To 200 Out Val(888), Val(17) Sleep 5 Out Val(888), Val(33) Sleep 5 Out Val(888), Val(9) Sleep 5 Out Val(888), Val(65) Sleep 5 DoEvents If detenertest = 1 Then Call detener_test End If Next a Out Val(888), Val(0) Sleep 10 Out Val(888), Val(2) Sleep 500 Out Val(888), Val(0) Sleep 10 Out Val(888), Val(1) Sleep 500 Out Val(888), Val(0) Sleep 100

Técnicas Digitales III – Problema de ingeniería

63

Out Val(888), Val(2) Sleep 10 Out Val(888), Val(0) Sleep 10 For a = 1 To 80 Out Val(888), Val(16) Sleep 5 Out Val(888), Val(32) Sleep 5 Out Val(888), Val(8) Sleep 5 Out Val(888), Val(64) Sleep 5 DoEvents If detenertest = 1 Then Call detener_test End If Next a Out Val(888), Val(1) Sleep 20 Out Val(888), Val(0) Sleep 10 ' --------------------------------------------------------------------------- 'Avanza 80 pasos hacia la derecha y se posiciona para empezar cont = 0 co = 80 Do Out Val(888), Val(2) Sleep 5 Out Val(888), Val(0) Sleep 10 opto2 = Inp(889) opto3 = opto2 And 16 If opto3 = 16 Then opt1 = 1 End If If (opto3 = 0) And (opt1 = 1) Then opt2 = 1 End If If (opt1 = 1) And (opt2 = 1) Then opt1 = 0 opt2 = 0 'Sleep 100 'Out Val(888), Val(4) 'Sleep 10 'Out Val(888), Val(0) 'Sleep 100 cont = cont + 1 End If DoEvents If detenertest = 1 Then Call detener_test End If Loop Until cont >= co For vuelta = 1 To 5 '---------------------------------------------------------------- 'izquierda (888) 1 'derecha (888) 2 'avanza hacia la izquierda golpeando 60 veces opt1 = 0 opt2 = 0 cont = 0 co = 60 Do Out Val(888), Val(1)

Técnicas Digitales III – Problema de ingeniería

64

Sleep 5 Out Val(888), Val(0) Sleep 10 opto2 = Inp(889) opto3 = opto2 And 16 If opto3 = 16 Then opt1 = 1 End If If (opto3 = 0) And (opt1 = 1) Then opt2 = 1 End If If (opt1 = 1) And (opt2 = 1) Then opt1 = 0 opt2 = 0 cont = cont + 1 '----- ' golpea Sleep 100 Out Val(888), Val(4) Sleep 10 Out Val(888), Val(0) Sleep 100 '----- End If DoEvents If detenertest = 1 Then Call detener_test End If Loop Until cont >= co a = 0 For a = 1 To 5 Out Val(888), Val(16) Sleep 5 Out Val(888), Val(32) Sleep 5 Out Val(888), Val(8) Sleep 5 Out Val(888), Val(64) Sleep 5 DoEvents If detenertest = 1 Then Call detener_test End If Next a Out Val(888), Val(0) Sleep 10 '--------------------------------------------------------------------- '---------------------------------------------------------------- 'izquierda (888) 1 'derecha (888) 2 'avanza hacia la derecha golpeando 60 veces opt1 = 0 opt2 = 0 cont = 0 co = 60 Do Out Val(888), Val(2) Sleep 5

Técnicas Digitales III – Problema de ingeniería

65

Out Val(888), Val(0) Sleep 10 opto2 = Inp(889) opto3 = opto2 And 16 If opto3 = 16 Then opt1 = 1 End If If (opto3 = 0) And (opt1 = 1) Then opt2 = 1 End If If (opt1 = 1) And (opt2 = 1) Then opt1 = 0 opt2 = 0 cont = cont + 1 '----- ' golpea Sleep 100 Out Val(888), Val(4) Sleep 10 Out Val(888), Val(0) Sleep 100 '----- End If DoEvents If detenertest = 1 Then Call detener_test End If Loop Until cont >= co a = 0 For a = 1 To 5 Out Val(888), Val(16) Sleep 5 Out Val(888), Val(32) Sleep 5 Out Val(888), Val(8) Sleep 5 Out Val(888), Val(64) Sleep 5 DoEvents If detenertest = 1 Then Call detener_test End If Next a Out Val(888), Val(0) Sleep 10 '--------------------------------------------------------------------- Next vuelta For l = 1 To 200 Out Val(888), Val(16) Sleep 10 Out Val(888), Val(32) Sleep 10 Out Val(888), Val(8) Sleep 10 Out Val(888), Val(64) Sleep 10 DoEvents Next l Out Val(888), Val(0) Sleep 10

Técnicas Digitales III – Problema de ingeniería

66

End Function Private Sub Command1_Click() detenertest = 1 End Sub Private Sub Form_activate() Form4.SetFocus Call testeo 'Do While bandera = 0 'Sleep 100 'ProgressBar1.Value = ProgressBar1.Value + 1 'If ProgressBar1.Value >= 20 Then ProgressBar1.Value = 0 'DoEvents ' Loop a = MsgBox("El Proceso de testeo se realizo correctamente", vbInformation + vbOKOnly, "Informacion") Unload Me Form1.SetFocus End Sub Private Function detener_test() For l = 1 To 400 Out Val(888), Val(16) Sleep 10 Out Val(888), Val(32) Sleep 10 Out Val(888), Val(8) Sleep 10 Out Val(888), Val(64) Sleep 10 DoEvents Next l Out Val(888), Val(0) Sleep 10 End Unload Me detiene = 0 Form1.Show Form1.Enabled = True Form1.SetFocus DoEvents End Function ----------------FIN-FUNCION-PRIVADA-TESTEO---------------