Arduino convierte series en paralelo: la llama paralela
Después de que un joven pasó jugando con Amigas y se metió en todo tipo de problemas en la red informática de la escuela, siempre tuve una debilidad en mi corazón por el hardware de los años 80 y 90. Esto se extiende más allá de las propias computadoras, y hasta ahora incluye módems, fotocopiadoras e incluso la muy deteriorada impresora de matriz de puntos.
Mi socio en la piratería [Cosmos2000] Recientemente se encontró con una increíble impresora Commodore MPS 1230. Su interfaz paralela era muy adecuada en su día, sin embargo los puertos paralelos son escasos como chips SID. Afortunadamente, estas dos interfaces son fáciles de trabajar y simples. Ha comenzado el trabajo en un dispositivo para casar estos dos mundos diferentes.
Entrar: La llama paralela
Mientras galopaba por la costa este de Australia, [Cosmos2000] estaba trabajando duro. Después de algunas investigaciones, se determinó que sería relativamente sencillo para Arduino convertir los datos seriales entrantes en salida paralela a la impresora. Después de algunas pruebas en un Arduino Uno, se construyó un dispositivo a medida, en una caja de proyecto de plástico gloriosamente, nada menos.
ATMEGA328 funciona como el cerebro de la operación, con MAX232 adjunto para la conversión de nivel de TTL a niveles de voltaje RS232. Los datos en serie se reciben en las líneas de hardware TX / RX. Ocho salidas digitales funcionan como interfaz paralela. Cuando un byte se vuelve súper serial, los bits individuales se colocan en las líneas digitales individuales conectadas al puerto paralelo de la impresora. En este punto, la línea estroboscópica se baja, lo que indica al dispositivo fijo que puede estar leyendo el puerto. Después de dos microsegundos, vuelve alto, listo para que el siguiente byte sintonice las líneas de salida. Así es como funcionan las interfaces paralelas sin una señal de reloj, utilizando la luz estroboscópica para indicar cuándo se pueden leer los datos.
Ahora, [Cosmos2000] extendió su mano, preguntándome si tenía un nombre para el nuevo edificio.
“Hm. ¿Paraleloslam? "
"Hecho. ¡Hola! "
Haciéndolo útil
Con el trabajo de preparación hecho y las pruebas iniciales exitosas, visité [Cosmos2000] en un domingo nublado. La interfaz funcionó bien con fragmentos de texto cortos, pero somos grandes fanáticos de imprimir fotos y gráficos de alta calidad en estos dispositivos minuciosamente lentos. Desafortunadamente, no es posible simplemente transmitir datos gráficos a través del puerto serie, ya que la impresora no puede sostenerse por sí misma y solo tiene un búfer limitado. Es posible tener suerte a veces funcionando con una velocidad en baudios demasiado baja, pero las impresoras matriciales son bastante lentas. Necesitábamos una solución adecuada.
[Cosmos2000]esquema original para el Paralleloslam. Algunas funciones no se implementaron, como jerseys para la selección de baudios. Esta es precisamente la razón por la que los puertos paralelos tienen una línea BUS que indica cuando un dispositivo fijo no puede aceptar datos adicionales. De manera similar, las interfaces seriales tienen diferentes métodos de control de flujo para tratar el mismo problema. Necesitábamos traducir de uno a otro.
Estábamos más familiarizados con el pin CTS, o Clear to Send, en el lado de la serie. Cuando este pin está activo, le indica al host que el dispositivo fijo está listo para recibir datos adicionales. Decidimos implementar el control de flujo mediante este método. Para ello, se instaló el Arduino para controlar la línea BUS en el puerto paralelo de la impresora, activando la línea CTS siempre que la línea ocupada estuviera inactiva.
Cuando nuestra tarea quedó clara, siguieron horas de burla. Los pines seriales se confundían repetidamente, y había una doble verificación regular de los cables para asegurarse de que los pines de control de flujo estuvieran ocupados. Finalmente, después de mucha consternación, escuchamos los familiares BUZZ y ca-CHUNK cuando nuestro impresor geriátrico cobró vida. Si nunca antes ha visto a dos adultos gritar y animar en una matriz de puntos, apuesto a que no pasó mucho tiempo con los lectores de La-Tecnologia.
Acción
Siempre divirtiéndonos con la construcción, pero siempre disfrutamos poniendo el hardware en sus pasos. Pasamos una buena tarde haciendo un logo e imprimiéndolo una y otra vez antes de cargar varias fotos y gráficos a través de la máquina.
La velocidad se tuvo en cuenta durante el desarrollo. Probamos el dispositivo con éxito a 1200 y 9600 bits por segundo, sin problemas. Con un tiempo estroboscópico de 2 microsegundos, y asumiendo que el resto del código necesita aproximadamente el mismo tiempo para ejecutarse, esto nos da una posible velocidad máxima de 250.000 bytes por segundo (tenga en cuenta los bytes, porque el código paralelo genera 8 bits a la vez). . Esto se ajusta aproximadamente al límite del puerto serie de hardware del ATMEGA328, que es capaz de 2 millones de bits por segundo si está configurado correctamente.
Sin embargo, para alcanzar esta velocidad de manera confiable, sospecho que se necesitarán varias optimizaciones de código. Al carecer de hardware que requiera tal rendimiento, mantuvimos nuestras pruebas hasta el extremo inferior del espectro. Sin embargo, sería divertido probarlo, y creo que no sería demasiado difícil alcanzar al menos 115.200 bits por segundo ingresando a través de serie y ser empujado a través del puerto paralelo con la configuración actual.
Dividiéndolo alrededor
Con nuestro éxito confirmado, decidimos compartir el proyecto. El código ha demostrado ser bastante confiable para nuestros propósitos, aunque si su matriz de puntos tiene un papel crítico para la seguridad, reconsidere sus elecciones de vida y envíenos una foto de su Paraleloslam haciendo un buen trabajo. Sin embargo, pase lo que pase depende de ti.
Los recursos están disponibles en Github para su revisión. No es una construcción ordenada y perfecta en píxeles. Se recomienda tener experiencia con interfaces seriales, ya que a menudo es necesario depurar de acuerdo con los diversos cables y dispositivos que utilice. Sin embargo, para aquellos con los conocimientos y las herramientas necesarios, debería ser útil. Nos interesaría especialmente si alguien utiliza este trabajo para otros dispositivos paralelos. Todo lo que recibe datos en un modo de byte simple con comunicación unidireccional debe funcionar teóricamente. Como siempre, su kilometraje puede variar.
Delaware [Cosmos2000] y yo mismo, te deseamos la mejor de las suertes con tus aventuras con dispositivos retro.
https://www.youtube.com/watch?v=dBLh1lk5htI
Andy Pugh dice:
¿Es esta algún tipo de interfaz paralela tal que no es posible un convertidor de USB a paralelo que no se puede construir?
Tengo un trazador de placa USB por el simple medio de encontrar espacio interno para un convertidor listo y cableado a los pines de la placa de circuito impreso. Pero creo que fue grave (han pasado 15 años ..)
Tago Lewin dice:
No, simplemente no teníamos uno de esos y teníamos un arduino por ahí.
Sin embargo, no son buenos según lo que escuché, los USB a Parallels.
Andy Pugh dice:
Tengo uno en el estante a mi lado, por una extraña coincidencia. pero cuando tu única herramienta es un Arduino cada problema parece un clavo, como dicen.
Creo que funcionan bien para la impresión, pero solo que lo hacen, no hay una forma real de usarlos como un bus EPP o para el control pin a pin por máquinas CNC, etc.reinicia dice:
La mayoría de los convertidores de USB a LPT simplemente implementan un dispositivo LP rudimentario y en realidad no exponen las E / S paralelas. Algunos conjuntos de chips (me viene a la mente USS720) le permiten dividir a la mitad las líneas paralelas, pero la velocidad de datos es extremadamente lento. Tengo una reescritura parcial en el enlace de abajo, de hace muchos años; con suerte, todos hemos avanzado hacia cosas mejores.
http://reboots.g-cipher.net/lcd/index.html
yetihehe dice:
No son buenos porque el usb tiene una latencia de 1 ms, lo cual es una lástima para el control directo de los motores paso a paso en cnc. Un puerto paralelo directo tiene una latencia mucho mejor. Pero solo para enviar datos donde no está interesado en la velocidad de datos correcta, debe estar en orden.
macona dice:
Si. Pero también puede obtener PCI, PCIe, Cardbus, FireWire y expressport. Creo que incluso he visto adaptadores compactos de puerto paralelo Lightning.
Eric R Mockler dice:
Sería un artículo aburrido sobre cómo señalar una impresora paralela y usar el dispositivo USB del estante. Pero funcionan bien. Tenía un HP Plotter paralelo que me gustaría tener todavía.
Colin Gale dice:
Hay conversores paralelos USB, ya que el mercado de USB serial existe bueno y malo, lo principal a menudo es cómo el controlador (Windows / cliente) hablaría con el dispositivo, hasta que xp muchos controladores insertarían datos en el puerto lpt (x) en memoria leyendo las líneas de retorno como respuesta, por ejemplo, una línea de confirmación (similar a cómo funcionaba una cadena de computadora), la otra cosa es el voltaje, a menudo los puertos USB no tendrían suficientes gruñidos para alimentar los datos. Las líneas y los chips eléctricos parásitos dentro de las impresoras (o jtag / eeprom / plotter) no tendrían suficiente jugo para funcionar, una buena tarjeta PCI a lpt en este caso es la única forma, son raros, aunque por lo que se necesita una buena alternativa. . Una solución que tengo para el problema 1 mencionado anteriormente es usar una caja virtual para simular la computadora y usar vbox para pasar datos desde su lpt virtual a su usb lpt. (no pasa usb). para el problema dos, el conmutador lpt activo puede funcionar (belkin fabricó algunos buenos cables usb-lpt que funcionaron con todos los dispositivos y conmutadores lpt activos, excepto unos pocos).
Ahora estoy tratando de revivir un cortador Mercury (modelo de 25w) y es un buen controlador de Windows XP, lpt parásito o serial que casi se instala en Windows 7-32bit, era gratis, así que no tengo quejas, pero ahora qué caja puse todos esos módems cero, adaptadores directos y 25p-9p que nunca volveríamos a necesitar .....Andy Pugh dice:
Las tarjetas PCI paralelas no son infrecuentes. ¡Amazon está lleno de ellos!
Compré 5 hace aproximadamente un año solo para hacer una encuesta en la que a) funcionaría con LinuxCNC yb) funcionaría con dispositivos de bus EPP para control CNC.
NOTO !! A pesar de una opinión que se escucha con frecuencia, LinuxCNC no necesita un puerto P y, de hecho, el consejo general es usar algo mejor, como una tarjeta PCI o una interfaz Ethernet para control de movimiento.Ostraco dice:
Sorprendentemente, incluso si esos puertos * no se recuperan o se eliminan, generalmente hay un encabezado en algún lugar que puede hacerlo.
* Parte del aglomerado.
RW versión 0.0.1 dice:
Más preocupante es la rareza de las ranuras PCI, al menos en sistemas no entusiastas, es decir, computadoras de escritorio de caja negra sin marca, que se convierten principalmente en factores de forma pequeña que probablemente necesitan tarjetas de perfil.
Andy Pugh dice:
Sí, me di cuenta de esto hoy cuando estaba tratando de encontrar una placa base PCI para alguien. Todavía existen, pero son raros.
Afortunadamente, las tarjetas PCI más populares para LinuxCNC también tienen una variante PCIe. (Mi propio torno usa 6i24)
Neil dice:
Dinosaurio aquí. Utilizo un puerto paralelo con LinuxCNC para conducir X-Carve. Me las arreglo [Atom D525] (https://ark.intel.com/content/www/us/en/ark/products/48952/intel-desktop-board-d525mw.html). He oído que los procesadores Atom tienen una buena latencia de interrupción mía. [Haswell DQ87PG](https://ark.intel.com/content/www/us/en/ark/products/70903/intel-desktop-board-dq87pg.html) tiene un puerto paralelo real y no solo un encabezado.
Dave dice:
En algún lugar de mi casa, creo que hay un Citizen 120D + con un serial !! interfaz.
Debería vincularlo para que sea una grabadora de salida MQTT con una caja llena de fanfold 🙂Cuando configura el controlador de impresora en Workbench, lo elige en serie o en paralelo y con el mismo controlador de dispositivo, ¡simplemente funciona!
Ha sido un tiempodarkspr1te dice:
120D era una matriz de puntos de 9 pines y en todo el Reino Unido en los años 90, tengo buenos recuerdos de imprimir mi código pascal en una forma determinada 120d, oki y epson también tenían las mismas impresoras en el mercado al mismo tiempo.
Tago Lewin dice:
Sí, lo configuró como una serie en el Amiga. Paralleloslam luego voltea sus pines GPIO, lanza un byte a lo largo del puerto paralelo e ingresa al siguiente. ¡Y así!
Los controladores de la impresora eran entonces muy simples, simplemente enviaban una gran cantidad de datos binarios. Ya sea que inserte esto en la impresora 8 bits a la vez o 1 bit a la vez, las instrucciones son las mismas. 🙂
Beto dice:
Esto tiene una huella mucho más pequeña: https://www.tindie.com/products/Ron/grbl-to-db25-cnc-shield-with-arduino-uno-r3/
Y también puedes darle un código g.Viejo pedo dice:
Creo recordar que este es el objetivo de UART-IC. Como 8250 o 16550 o AY3-1015D. Construí estas cosas a finales de los 70, principios de los 80. ¿No debería llamarse simplemente UART ??? Me estoy perdiendo de algo ???
darkspr1te dice:
Los primeros uarts y los puertos de impresora eran de memoria directa, esta latencia era la más baja, los más nuevos tienen costos livianos, problemas de controladores, comparabilidad y otros problemas que causan.
KC8KVA dice:
También recuerdo los días del Puerto Paralelo. Desde la humilde matriz de puntos de Okidata en mi C-64 hasta la HP Deskjet para mi AMIGA, entiendo de dónde vienes. Felicitaciones por ese logro y un proyecto muy lindo. Oh, mi manejador en los viejos tiempos de AMIGA era un intermediario. 😉 Coraje de nuevo.
Tago Lewin dice:
Máquinas asombrosas, hey. ¡Me alegra que lo hayas disfrutado!
Ene. dice:
Qué bueno verlos trabajar. Un proyecto divertido.
Sería bueno verlos usar el puerto serie CBM en lugar de paralelo, pero considerando la complejidad adicional y las posibles trampas de ese protocolo (de ninguna manera relacionado con RS-232), puedo entender por qué apuntaban a uno central. Es divertido ver cómo la impresora antigua imprime imágenes provenientes de una computadora moderna. Pero quizás las partes más divertidas fueron que las imágenes se desvanecieron gradualmente de oscuro a gris claro durante la impresión ... ahhh recuerdos.sasodomo dice:
Por casualidad informé este comentario y me gustaría señalar que es demasiado fácil hacerlo. Quizás una ventana de confirmación sería buena.
Tago Lewin dice:
¡Decir ah! Sí, usamos un cartucho que rellenamos (algo toscamente). Los resultados posteriores son más consistentes. ¡Mira este artículo en unas semanas!
IDENTIFICACIÓN dice:
Nunca lleve un Arduino al combate SN74HC595 ...
Tago Lewin dice:
Literalmente aprendí esto dos semanas después de que construimos el proyecto anterior, ¡y supe que alguien lo captaría en los comentarios! ¿Se ocupan del control de flujo? Seguramente OEM haría eso en el día que cuente.
JoshF dice:
No se ve, pero eso es solo un "no" de distancia.
Neil dice:
> "Establecer la línea CTS activamente cuando la línea ocupada estaba inactiva"
¿No es esa una tarea 7404 o todavía está sucediendo?
Bunsen dice:
Lo que no extraerá un reloj de la señal UART ni privará a los bits de inicio / parada. Para eso, como dijo Oldfart en algunos comentarios, un chip UART es útil. Un receptor de tasa de baudios fija sería un pequeño proyecto divertido factible en lógica discreta.
Steven Roberts dice:
¿Podría reprogramarse para realizar un convertidor serial a GPIB?
Tago Lewin dice:
¡Quizás! No conozco el estándar, pero me sorprendería que Arduino no pudiera manejarlo.
RW versión 0.0.3 dice:
Hmmm, me pregunto si puedo abusar de esto combinado con esp 8266 en el entorno arduino y los controladores plip para hacer dongles wifi de puerto paralelo para cosas antiguas.
Elmars dice:
Entiendo, fue un proyecto divertido ... Pero para aquellos que solo necesitan imprimir en una impresora antigua solo en paralelo, hay una manera más fácil. Utilice Jetdirect EX Plus, 300X o 500X. Los precios comienzan en $ 10 y más, (WAY UP) en su sitio de venta de basura / basura en línea favorito (por ejemplo, Ebay). Estos son servidores de impresión en red habilitados para DHCP y son compatibles con las últimas versiones de Windows que utilizan el protocolo LPR.
Para divertirse de verdad, conéctelos a una de las antiguas impresoras de IBM para divertirse con pancartas plegables de gran formato.
RW versión 0.0.1 dice:
Oye, tengo uno de esos carritos anchos y ocultos con 24 pines que seguro que algún día será la única solución posible a algún vil problema ...