Introduccion
Desde la juventud, cuando teníamos el viejo DeskJet, me interesaban los cartuchos de impresora de inyección de tinta. Estos cartuchos me parecieron muy interesantes y tan pronto como se quedaron sin tinta, me los llevé inmediatamente. En ese momento, no podía hacer nada con ellos, excepto desmontar y ensuciarme las manos ... Aunque sabía que había algún tipo de electrónica compleja en el interior, pero cuando los contactos tocaron la batería, no pasó nada interesante, y mi conocimiento de la electrónica para más no es suficiente
Un poco más tarde, cuando me convertí en estudiante, logré obtener una vieja impresora de inyección de tinta. En ese momento, yo mismo usaba una impresora láser, por lo que no estaba muy interesado en ella, pero fue interesante examinar los cartuchos e intentar hacer ingeniería inversa. De hecho,
escribí un artículo sobre la administración de estos cartuchos, y aunque funcionaron bastante bien, también hubo desventajas: todavía no podía entender el orden exacto de las boquillas, el cartucho era solo monocromo (impreso con un magenta), y también bastante viejo, y por lo tanto, la resolución resultó ser bastante bajo.
Recientemente, mi novia comenzó a pintar, así que esta fue una buena excusa para volver a los cartuchos de tinta con la esperanza de poder dibujar algo en el lienzo. Esta vez tuve suerte: logré encontrar una manera de unir todas las boquillas a las señales correctas. Además, hoy en día los cartuchos de impresora controlan más boquillas usando menos señales, lo que simplifica la administración de cartuchos y aumenta la superficie que puede cubrirse en una pasada.
¡Finalmente logré controlar el cartucho tricolor e imprimir a todo color!
Si desea acompañarme desde el montón de impresoras para completar el control del cartucho de la impresora, hice un informe al respecto en Hackaday Supercon 2018. La grabación de video del discurso se agrega a continuación. Si está interesado en los detalles de la ingeniería inversa, échele un vistazo. En el artículo, hablaré sobre los detalles técnicos de la electrónica que creé, así como los detalles específicos de la administración del cartucho para que usted mismo pueda dibujar el Nyancat usando ESP32 u otro microcontrolador.
Adjunto de presentación
Si no ha visto el video, aquí hay un breve resumen: separé el cartucho de color para la impresora HP1112 (en China es un cartucho HP 803, pero el número de artículo depende de la región), tomé fotos del cristal e intenté averiguar cómo funciona. Cuando no pude averiguar mucho, comencé a leer las señales transmitidas entre la impresora y el cartucho, descubrí qué señales enviar para que el cartucho obedeciera mis órdenes, y luego imprimí Nyancat y otras cosas divertidas.
La parte de sincronización de la señal del estudio fue principalmente un proceso de prueba y error. Solo puedo adivinar qué tipo de conexión existe entre las señales, por lo que fue bastante difícil determinar el orden entre los bordes y qué señales pueden retrasarse y cuáles deben transmitirse a tiempo. Estudié un cartucho de silicio para esta información. Resultó que realmente logré obtenerlo poniendo el cartucho bajo el microscopio, pero no del todo como esperaba.
Antes de hablar en Supercon, estudié los cartuchos de color porque me parecieron los más interesantes. Después de regresar de Supercon, quería realizar una ingeniería inversa del cartucho negro: su cabezal de impresión es más grande que el del cartucho de color, por lo que podría imprimir más a la vez. Es probable que agregar soporte para este cartucho no sea tan difícil: la disposición del pin parece la misma, y sabía que el protocolo probablemente sería similar, porque ya había intentado conectar el cartucho negro a mi hardware. Aunque el software estaba transmitiendo imágenes en color, todavía logró imprimir algo.
Esto es lo que hice con el cartucho de color: lo pegué bajo el microscopio, quité el recubrimiento de silicona de los contactos y me preparé para combinar varias tomas en una imagen grande. Sin embargo, el cartucho negro difería del color en que había más inscripciones en su placa de metal con boquillas: ¡debajo del revestimiento de silicona había nombres de señal ocultos para todos los contactos!
(Por cierto, si desea ver imágenes completas del microscopio en toda la grandeza de 40 megapíxeles, ¡aquí está el
escudo y el
silicio del cartucho de color! ¡Admire la complejidad de las
boquillas y la
imagen de cristal del cartucho negro!)
Aunque puede no parecer mucho, en un mar de placas de circuito impreso sin marcar, chips sin materiales de referencia y artículos que no conducen a ninguna parte, los nombres de varias señales son un verdadero hallazgo. En una corazonada, introduje nombres de señales individuales con el nombre "Hewlett Packard" en
Google Patents y descubrí una
patente específica (y otra
más antigua a la que hace referencia el primero) con una descripción clara de las tecnologías y señales utilizadas en los cartuchos. Eso me ahorraría mucho tiempo cuando luchaba con los tiempos de los cartuchos ... oh, bueno. Puedo decir sinceramente que esta sugerencia fue muy difícil de encontrar: las señales no solo estaban cubiertas con película de silicona, sino que también resultaron ser pequeñas: las letras tienen un tamaño de solo 30 micrómetros, y esto es menor que el grosor de un cabello humano.
La patente describe el funcionamiento interno del cartucho y vale la pena leerla (si puede descubrir la jerga legal que se usa allí) solo para comprender la extraña lógica que HP a veces usa para controlar todas las boquillas. La patente en sí es útil, pero no suficiente para controlar el cartucho; al menos la mayor parte del trabajo de ingeniería inversa que emprendí aún sería necesario, incluso si tuviera esta patente.
Aquí y más abajo usaré los nombres de las señales y contactos utilizados en la patente. Tenga en cuenta que en el código todavía se pueden encontrar mis propios nombres de señales; Incluiré una tabla de traducción junto con la documentación.
Codificación de datos
Entonces, así es como se ven los cartuchos en estudio. A simple vista, estos son dispositivos bastante simples: en su interior, consisten casi por completo en una esponja empapada de tinta. En el caso del cartucho que viene con la impresora, hay muy poca tinta: solo la mitad del espacio en el cartucho está ocupado por las esponjas, y las esponjas también están medio vacías:

En el lateral hay 16 contactos que van desde la parte inferior donde se encuentra el cabezal de impresión. Como puede ver en el microscopio, hay aproximadamente 336 inyectores en el cabezal de impresión del cartucho negro y 612 inyectores en el cartucho de color. Las boquillas están dispuestas en filas verticales en el cabezal de impresión, y cada boquilla se puede controlar electrónicamente para que arroje una pequeña gota de tinta hacia el lado del papel insertado en la impresora. Al mover el cabezal verticalmente, la impresora puede imprimir una "tira" o cualquier otra imagen; en el caso de un cartucho negro, esta tira tiene aproximadamente 15 mm de largo y 8 mm para un cartucho de color.
Obviamente, las boquillas se pueden controlar mediante contactos. Según las pequeñas inscripciones del cabezal de impresión, los contactos contienen las siguientes señales:
Como solo hay 16 contactos, debe haber algún tipo de esquema de multiplexación para controlar todas las boquillas. La patente explica cómo funciona: el control de la boquilla se divide en 14 grupos separados. Estos grupos se disparan secuencialmente: primero recibe sus datos y dispara el grupo 1, luego el grupo 2, y así sucesivamente. Cada grupo controla un máximo de 24 inyectores, y los datos para ellos se transmiten a través de tres buses de datos. En el caso de un cartucho de color, los datos en los tres buses corresponden a los colores: D1 es el dato amarillo, D2 es el dato magenta y D3 controla las boquillas cian.
En la patente, el trabajo se describe en detalle utilizando un bus de datos como ejemplo. Esta figura de la patente muestra las señales utilizadas:
El bus de datos contiene ocho bytes, 0-7. Los bytes pares están controlados por el borde posterior de DCLK, los bytes impares están controlados por los bordes finales de S1-S4. Las boquillas cuyos datos están controlados por los primeros cuatro bytes se pueden activar suministrando energía a través del bus de alimentación F3; Las boquillas asociadas con los últimos cuatro bits son activadas por el bus F5.
No tengo idea de por qué HP decidió usar un circuito tan complejo para administrar los datos de la boquilla. Podemos decir que algo obvio, como un registro de desplazamiento, habría funcionado con bastante normalidad aquí. Entiendo que HP usa sus patentes como un arma contra las compañías de recarga de cartuchos; quizás alguien ya haya patentado una solución más simple, y tuvieron que idear esta solución más compleja para ser únicos.
En este gráfico, realizado por mí en un analizador lógico, no es difícil encontrar las señales descritas en la patente:
Además de controlar las boquillas, el cartucho también necesita una señal (csync) para ir al siguiente grupo de boquillas o para reiniciar y regresar al primer grupo. Se puede ver en la imagen del analizador lógico: muestra los penúltimos y últimos grupos de 14, y la señal csync tiene una forma reconocible en el último grupo; realiza un "reinicio" del cartucho para que el primer grupo reciba los datos a continuación. Esta señal también se puede utilizar para evitar grupos de boquillas en el orden inverso; Esto es útil cuando el cabezal de impresión se mueve de izquierda a derecha y de derecha a izquierda. Aunque la segunda patente describe cómo funciona esto, decidí simplemente codificar la transición al siguiente grupo y restablecer las señales mostradas en mis imágenes por la línea csync.
Tenga en cuenta que todo esto sucede a una velocidad bastante alta; El retraso entre los dos bordes de la señal DCLK es de aproximadamente 0.4 μs, y la distancia entre los grupos es de aproximadamente 4 μs.
Ahora sabemos que cada bit en estos tres buses de datos de 14 bytes contiene un comando de operación para una boquilla. Si el bit es 0, entonces se activa la boquilla correspondiente; si es igual a 1, entonces la boquilla no funciona. Lo que no sabemos es la correspondencia entre brocas y boquillas. Si viste la presentación, entonces sabes cómo me las arreglé para resolverla: imprimí un patrón conocido en una impresora que funcionaba, interceptando las señales usando un analizador lógico, y luego descubrí cuál debería ser el orden de las señales para decodificar las señales a la imagen original.
.
Desafortunadamente, la coincidencia de bits con boquillas parece bastante constante, pero no completamente lógica. Parece que esto se debe principalmente a la necesidad de mover físicamente las boquillas simultáneamente a una distancia suficiente (para evitar el sobrecalentamiento o la aparición de un vacío local en el tanque de tinta). Además, también descubrí que la facilidad de enrutar las señales en un cartucho puede hacer que la coincidencia de boquillas y boquillas sea bastante confusa. En mi firmware, simplemente implementé esta asignación como un conjunto de tablas de búsqueda.
Electrónica
Ahora que sabemos cómo funcionan las señales, podemos controlar el cartucho de la impresora con un microcontrolador simple, ¿verdad? Bueno, no de inmediato. El cartucho de la impresora no utiliza una lógica simple de 5 V o 3,3 V. Los buses de datos están controlados por buses de 16 V o 9 V. Los buses de alimentación también están controlados por 16 V y, de hecho, dependiendo del número de boquillas activadas, se pueden conectar a la corriente de la fuente de alimentación. . Necesitamos realizar una conversión de nivel.
Como convertidor de nivel, elegí el MC14504. Este es un viejo chip de conversión de nivel hexadecimal unidireccional que puede aumentar el voltaje a 18 V. Aunque este chip también funciona, mirando hacia atrás, puedo decir que esta no era la mejor opción: solo puede generar unos pocos mA y tiene un retraso de propagación bastante grande. Creo que proporciona un retraso de algunas señales de salida dependiendo del cartucho y la carga aplicada a las salidas del chip. Tengo al menos un cartucho que necesita un pequeño ajuste de tiempo para que las señales funcionen, y creo que esa es la razón. Desafortunadamente, los convertidores de nivel de 16V ya no son tan accesibles hoy, así que no puedo reemplazarlo por algo mejor. Sin embargo, este chip clásico con un pequeño ajuste es suficiente.
Con los autobuses eléctricos, las cosas son un poco más complicadas. Además del hecho de que estos contactos toman una gran parte de la corriente, también están conectados directamente a las resistencias de las boquillas incluidas: si por alguna razón la alimentación se suministra durante demasiado tiempo, estas pequeñas resistencias se quemarán y la boquilla fallará por completo. Además, este "demasiado tiempo" es bastante simple de lograr: es suficiente para encender las boquillas por solo unos pocos microsegundos, y si suministra energía por solo un milisegundo, simplemente se evaporarán, rompiendo por completo la boquilla. Para evitar que esto suceda debido a un error de software o una mala conexión, agregué una lógica de hardware que garantiza que el pulso se limite a un pequeño múltiplo de 10 μs.

En el primer prototipo, dejé varios convertidores de nivel y no sabía cómo funcionaría el software, así que resolví el problema con un multivibrador real de ciclo único. En este circuito, se utilizan dos multivibradores en el 74HC123, generando pulsos, cuyo ancho se establece mediante la combinación de R / C conectado al pin RCExt. El pulso resultante se genera solo con una señal de entrada creciente, por lo que una señal constantemente alta no conducirá a nada más que un pulso de salida falso pero definido con precisión. Después de eso, el canal MC14504 se usa como un convertidor de nivel para elevar el voltaje a +16 V, y el transistor MOS del canal P proporciona la corriente necesaria.

En la segunda placa de circuito impreso, me di cuenta de que si cambio la lógica de los contactos de alimentación para que no utilicen dos canales del circuito de cambio de nivel, solo dos chips MC14504 serán suficientes. Ahora tengo suficiente control programático sobre el ancho del pulso, pero todavía quiero tener protección contra una señal de contacto de entrada constantemente alta. Aquí está el diagrama al que vine. Funciona así: en el estado normal con una señal baja PWRB_IN, el condensador C28 está vacío, porque cualquier voltaje en él fluye lentamente a lo largo de R20 y R21: la puerta del transistor Q4 es alta, y PWRB_OUT se desconecta del bus de alimentación de 16 V. Tan pronto como alto en PWRB_IN aparece alto señal, Q6 tierra un extremo de C28; Dado que el voltaje a través de él es 0 V, inicialmente esto también baja su otro lado, que está conectado a la puerta Q4. Tirar del obturador Q4 hacia abajo lo hace conductivo, y esto permite que la corriente fluya de +16 V a PWRB_OUT. En el estado normal, PWRB_IN vuelve al estado bajo lo suficientemente rápido, cerrando la puerta Q4 e interrumpiendo la corriente. Sin embargo, mientras PWRB_IN es bajo, el C28 se está cargando lentamente: un lado está conectado a tierra a Q6 y el otro está conectado a 16 V a través de R21 y R31. Cuando el condensador está suficientemente cargado, Q4 "ve" un nivel alto en su puerta y desconecta la corriente en PWRB_OUT, incluso si PWRB_IN todavía está en un estado de señal alta. Este mecanismo garantiza que PWRB_OUT solo suministre energía durante un período de tiempo limitado.
El circuito también tiene una pequeña resistencia conectada en serie con el bus de alimentación de 16 V (R31), así como un pequeño condensador conectado en paralelo con la señal de salida (C15). Son necesarios para "aliviar el voltaje" de la señal de potencia: sin ellos, un Q4 de encendido y apagado agudo inducirá una gran cantidad de interferencia electromagnética, distorsionando las señales transmitidas al cartucho.
Aparte de esta lógica, no se necesita nada más. Obviamente, se necesitan convertidores de nivel de +9 V y +16 V. La fuente de alimentación de +9 V debería ser bastante modesta: no noté que estos buses generalmente usaban más de unos pocos mA. Dado que alimenta las resistencias de la boquilla, la fuente de 16 V debería ser un poco más fuerte: lo hice para que la mía pudiera proporcionar al menos 400 mA de forma continua, y también agregué bastante capacitancia de desacoplamiento.
Finalmente, la carga más importante del procesamiento de imágenes y la generación de señales recae en el microcontrolador. Para este propósito, elegí ESP32, principalmente porque tomé algunas piezas del trabajo, pero también porque tiene un controlador I2S bastante potente que utiliza un modo paralelo muy conveniente: de hecho, solo podemos configurar la frecuencia del reloj, especifique el área de memoria para el controlador I2S y generará estos bytes en paralelo. Gracias a esto, es ideal para generar las señales de control necesarias; El hecho de que tenga dos potentes núcleos de 240 MHz también ayuda en el procesamiento de imágenes.
Prototipo
Por supuesto, varios convertidores y transistores MOS por sí solos no pueden convertirse en un controlador de cartucho de impresora que funcione. Por lo tanto, creé un dispositivo separado, concebido como una plataforma para experimentar con un cartucho y sus capacidades. Tiene un módulo ESP32, la lógica necesaria para controlar el cartucho y varias fuentes de alimentación para trabajar desde una celda de iones de litio. También está equipado con varios sensores diseñados para compensar los movimientos imperfectos de las manos de una persona, así como botones y una pantalla que proporciona información sobre las imágenes impresas. Echemos un vistazo a los componentes, tal vez para alguien se convierta en una inspiración para la piratería de cartuchos:


Comencemos con la fuente de energía. La energía se suministra desde una celda de iones de litio y se convierte a 3.3 V, 16 V y 9 V. Se requiere un voltaje de 3.3 V para los sensores y ESP32; Se genera utilizando un simple regulador LD78 HT7833.
Los voltajes de 9 V y 16 V son generados por dos convertidores de impulso basados en el chip convertidor de impulso XR2203. Tenga en cuenta que una fuente de alimentación de 16 V debe trabajar mucho más que una fuente de alimentación de 9 V; el cartucho consume de 9 V solo unos pocos miliamperios. Se crearon dos convertidores de impulso en el mismo chip simplemente porque fue suficiente para mí comprar un tipo de componente para ambos.Dado que todo el dispositivo está alimentado por una celda de iones de litio, necesitamos cargarlo de alguna manera. Me queda poco espacio, así que agregué un cargador de batería de iones de litio basado en TP4056 para poder recargar la batería desde cualquier fuente de alimentación USB.La inteligencia del dispositivo es proporcionada por el módulo ESP-Wrover32. Utilicé la opción con 8 MiB de memoria flash y 8 MiB de RAM SPI; suficiente para realizar un procesamiento de imagen complejo. El módulo también tiene un conector de 5 pines que le permite programar y depurar el firmware, así como dos botones que se pueden usar para seleccionar opciones y comenzar a renderizar cuando el firmware se está ejecutando.Las opciones seleccionadas se muestran en una pequeña pantalla LCD a color de 160x80. La pantalla tiene una conexión SPI y puede controlarse directamente por uno de los conectores periféricos SPI disponibles en el ESP32.Esta es la interfaz del cartucho. Como se indicó anteriormente, no es particularmente complicado. El nivel de todas las señales es convertido por el par MC14504, uno para señales de 9 V y otro para señales de 16 V. También en el diagrama hay un circuito de cambio de nivel / protección que controla buses de potencia dual.


Aquí hay tres tipos de sensores que utilicé. Todos ellos están conectados mediante un bus I2C, es decir, en ESP32 ocupan solo dos GPIO. Esta es la unidad de sensor inercial MPU9250 (acelerómetro, giroscopio y brújula digital) para medir el movimiento, tres sensores de distancia láser VL53L0X (solo se muestra uno), dirigidos hacia arriba, izquierda y derecha. La idea es que al combinar esta información, es teóricamente posible determinar la posición absoluta del cartucho. Esto es útil, por ejemplo, al dibujar imágenes grandes con un movimiento de mano libre. El último es el sensor de color TCS3472. El sensor de color se encuentra al lado del LED blanco; se puede usar para "copiar" el color del sujeto o para compensar el color del medio en el que imprimimos.
Como necesitaba GPIO adicionales, conecté un expansor GPIO al bus. Controla los buses de reinicio para los tres sensores de distancia, el bus de reinicio para la pantalla LCD, la inclusión de un convertidor de refuerzo y dos transistores MOS (no mostrados) que controlan el LED blanco utilizado para iluminar el objetivo del sensor de color y la luz de fondo de la pantalla LCD. Los sensores de distancia necesitan un bus de reinicio separado, ya que se encenderán en la misma dirección I2C. Sin embargo, tienen un comando que cambia la dirección I2C después de que se enciende. Al encenderlos y moverlos uno por uno a diferentes direcciones I2C, puedo controlar los tres en el mismo bus I2C.
Aquí está la placa de circuito que diseñé en función del circuito. Tiene una forma extraña, porque debe dividirse en cuatro placas separadas y "rodear" el cartucho de la impresora. Están conectados eléctrica y físicamente; La ventaja de esto es que los fabricantes de placas de circuito impreso no consideran que dicho circuito sea cuatro placas separadas y solo tiene que pagar por una.Otra ventaja es que puedo ensamblar el tablero como un elemento y luego probarlo cuando todos los componentes están en el mismo plano. Esto me permite no equilibrar cuidadosamente el dispositivo ensamblado durante la depuración. Una pequeña nota: los sensores VL53L0X usan un rayo láser infrarrojo; Parece que es lo suficientemente fuerte como para romper el filtro de protección contra la radiación infrarroja en mi "espejo" y aparece en el marco como pequeños puntos de luz púrpura.Y cuál será el resultado final después del montaje. Tenga en cuenta que cuando las tablas se separaron, las conexiones entre ellas se rompieron. Las placas tienen pequeñas almohadillas de soldadura a las que puede soldar un pequeño trozo de alambre y doblarlo. Obviamente, para el nivel de producción, necesitará usar tecnologías como FPC PCB o PCB rígido flexible, pero para un prototipo barato esto funcionará.Si desea utilizar este prototipo como referencia o experimentar con él, puede descargar los archivos del proyecto KiCad (también hay diagramas pdf y gerber en el mismo lugar) y ensamblarlo usted mismo, o usar sus subsistemas.Como se trata de un prototipo, el software es bastante ... heterogéneo. Daré un enlace al repositorio en el que se desarrolló, pero tenga en cuenta que este es un elenco de casi todo el ciclo de desarrollo, por lo que contiene todo en orden, desde las grabaciones de señal del analizador lógico hasta el Nyancat impreso y Mona Lisa. Desafortunadamente, es por eso que el código es un caos casi indocumentado con rutas a medio completar y restos del código anterior. Si todavía quieres aprenderlo, puedes clonar esta URL en git .Sin embargo, si está más interesado en el software que puede administrar fácilmente el cartucho de la impresora utilizando ESP32 (y contiene procedimientos útiles para controlarlo a través de otro microcontrolador), continúe leyendo.Versión mínima de trabajo
Para facilitar a otros artesanos el uso de cartuchos de impresora en sus propios proyectos, también creé una versión mínima del controlador. Carece de soporte para todos los periféricos y hacks del código prototipo, pero la arquitectura se limpia y, por lo tanto, puede convertirse en una base sólida para un mayor desarrollo. El controlador tiene un ejemplo simple de un programa que se imprime cuando se presiona el botón ¡HOLA! cartucho de color o negro.No creé un equipo especializado para ello, pero de hecho puedes reutilizar el hardware de la sección anterior: solo toma una fuente de alimentación , ESP32y convertidores de nively aplicarlos en su propio esquema. También puede usar completamente el prototipo descrito en la sección anterior: es suficiente simplemente proporcionar una señal alta constante BOOST_EN para que los convertidores de refuerzo de 9 V / 16 V estén siempre encendidos. (De esta forma depuré el código).El código en sí se puede encontrar en Github , está estructurado de manera estándar para el proyecto ESP-IDF. El código del controlador principal está en los componentes / printcart ; código del botón de leer y decidir cuándo encender la boquilla, así como el código de inicialización contenida en el / main.c principal . En el ejemplo, los datos de la boquilla se leen desde la imagen rgb incrustada.El sistema tiene la siguiente arquitectura: printcart_i2s.ccontiene un controlador simple para el modo paralelo de los conectores periféricos I2S del controlador ESP32. Selecciona dos buffers y transfiere de las palabras de 16 bits de buffers con una frecuencia de 3.3 MHz a contactos GPIO (máximo 16 contactos). (Aquí, estos pines GPIO están conectados a los convertidores de nivel que controlan el cartucho). Cada vez que el búfer está vacío, el controlador ejecuta un controlador de eventos para llenar el búfer.El controlador de eventos se encuentra en printcart_buffer_filler.c . Recibe datos de inyectores de la cola de datos de inyectores y los pasa a una función en printcart_genwaveform.c , que por plantilla convierte estos datos de inyectores en señales. La plantilla depende del tipo de cartucho (color o negro), y puede cambiarla cargando tools / waveform_editor.html en el navegador .Por otro lado, la cola de datos de los inyectores es el procedimiento de bucle en main.c. Espera a que se presione un botón, y cuando se presiona, genera datos de boquilla al analizar un archivo de imagen simple convertido en datos rgb sin procesar e incrustado en un archivo binario cosido, escaneando los datos de izquierda a derecha. Gracias a esto, puede presionar el botón, deslizar el cartucho sobre el papel e imprimir el contenido de la imagen como una tira de tinta.El resultado final se parece a esto:Es muy notable aquí que el cartucho negro imprime aproximadamente el doble de altura que el color (0.7 cm y 1.5 cm), por lo que si no necesita color y necesita buena visibilidad, entonces es mejor elegir un cartucho negro. También vale la pena señalar que en main.c se define que cambia entre dos cartuchos; El código puede funcionar con ambos. No está del todo claro por qué hay líneas borrosas en la imagen negra: tal vez hay un error en mi señal, o tal vez el cartucho está un poco cansado de probar. Sea como fuere, los datos impresos son hermosos y bien reconocibles.En conclusión
La ingeniería inversa de estos cartuchos de impresora fue una larga aventura, pero al final mi trabajo fue fructífero; aunque quedan algunos acertijos (por ejemplo: ¿qué hace el contacto de ID?), creo que he entendido bien los acertijos de las señales utilizadas en el cartucho. Espero que al publicar el código y los diagramas de este proyecto, agregue el uso de cartuchos de impresora al conjunto de herramientas de artesanos, piratas informáticos y creadores. No puedo esperar para ver ejemplos de uso interesantes que la comunidad presentará. Si logra hacer algo interesante con mi trabajo, asegúrese de enviarme un mensaje .En cuanto a mi intención de crear arte ... umm ... ¿se puede llamar así?