Piratage d'une cartouche couleur HP: la transformer en imprimante portable

image

Présentation


Depuis la jeunesse, lorsque nous avions l'ancien DeskJet, je m'intéressais aux cartouches d'imprimante à jet d'encre. Ces cartouches semblaient très intéressantes et dès qu'elles manquaient d'encre, je les prenais immédiatement pour moi. A cette époque, je ne pouvais rien faire avec eux, sauf pour démonter et me salir les mains ... Bien que je sache qu'il y avait une sorte d'électronique complexe à l'intérieur, mais quand les contacts ont touché la batterie, rien d'intéressant ne s'est passé, et ma connaissance de l'électronique pour plus pas assez.

Un peu plus tard, quand je suis devenu étudiant, j'ai réussi à me procurer une vieille imprimante à jet d'encre. A cette époque, j'utilisais moi-même une imprimante laser, donc ça ne m'intéressait pas beaucoup, mais c'était intéressant d'examiner les cartouches et d'essayer de les désosser. J'ai en fait écrit un article sur la gestion de ces cartouches, et même si elles fonctionnaient assez bien, il y avait aussi des inconvénients: je ne pouvais toujours pas déterminer l'ordre exact des buses, la cartouche était uniquement monochrome (imprimée avec un magenta), et également assez ancienne, et donc la résolution s'est avéré assez faible.

Récemment, ma petite amie a commencé à peindre, donc c'était une bonne excuse pour revenir aux cartouches d'encre dans l'espoir que je serais en mesure de dessiner quelque chose sur toile. Cette fois, j'ai eu de la chance: j'ai réussi à trouver un moyen de lier toutes les buses aux bons signaux. De plus, les cartouches d'imprimante contrôlent aujourd'hui plus de buses en utilisant moins de signaux, ce qui simplifie la gestion des cartouches et augmente la surface pouvant être couverte en un seul passage.

J'ai finalement réussi à contrôler la cartouche trichromique et à imprimer en quadrichromie!

Si vous voulez aller avec moi du tas d'imprimantes au contrôle complet de la cartouche d'imprimante, j'en ai fait un rapport à Hackaday Supercon 2018. L'enregistrement vidéo du discours est ajouté ci-dessous. Si vous êtes intéressé par les détails de la rétro-ingénierie, consultez-la. Dans l'article, je parlerai des détails techniques de l'électronique que j'ai créée, ainsi que des détails spécifiques de la gestion de la cartouche afin que vous puissiez vous-même dessiner le Nyancat en utilisant ESP32 ou un autre microcontrôleur.


Attachement de présentation


Si vous n'avez pas regardé la vidéo, voici un bref résumé: j'ai démonté la cartouche couleur pour l'imprimante HP1112 (en Chine, il s'agit d'une cartouche HP 803, mais le numéro d'article dépend de la région), j'ai pris des photos du cristal et j'ai essayé de comprendre comment cela fonctionne. Quand je n'ai pas pu en savoir beaucoup, j'ai commencé à lire les signaux transmis entre l'imprimante et la cartouche, j'ai déterminé quels signaux envoyer pour que la cartouche obéisse à mes commandes, puis j'ai imprimé Nyancat et d'autres choses amusantes.

La partie de synchronisation du signal de l'étude était principalement un processus d'essais et d'erreurs. Je ne peux que deviner quel type de connexion existe entre les signaux, il était donc assez difficile de comprendre l'ordre entre les bords et quels signaux peuvent être retardés et lesquels doivent être transmis à temps. J'ai étudié une cartouche de silicium pour cette information. Il s'est avéré que j'ai réussi à l'obtenir en plaçant la cartouche sous le microscope, mais pas du tout comme je m'y attendais.

Avant de parler à Supercon, j'ai étudié les cartouches couleur car elles me semblaient les plus intéressantes. À mon retour de Supercon, je voulais faire de l'ingénierie inverse de la cartouche noire: sa tête d'impression est plus grande que celle de la cartouche couleur, donc je pouvais imprimer plus à la fois. Il n'est probablement pas difficile non plus d'ajouter un support pour cette cartouche: la disposition des broches semble la même, et je savais que le protocole serait probablement similaire, car j'avais déjà essayé de connecter la cartouche noire à mon matériel. Même si le logiciel transmettait des images en couleur, il a quand même réussi à imprimer quelque chose.

Voici ce que j'ai fait avec la cartouche couleur: je l'ai collée sous le microscope, retiré le revêtement en silicone des contacts et préparé à combiner plusieurs clichés en une seule grande image. Cependant, la cartouche noire différait de la couleur en ce qu'il y avait plus d'inscriptions sur sa plaque métallique avec des buses: sous le revêtement en silicone, il y avait des noms de signaux cachés pour tous les contacts!

image

(Au fait, si vous voulez voir des images au microscope complètes dans toute la grandeur de 40 mégapixels, alors voici le bouclier et le silicium de la cartouche couleur! Admirez la complexité des buses et l' image cristalline de la cartouche noire!)

Bien que cela puisse ne pas sembler beaucoup, dans une mer de cartes de circuits imprimés non marquées, de puces sans matériaux de référence et articles qui ne mènent nulle part, les noms de plusieurs signaux sont une vraie trouvaille. Sur une intuition, j'ai conduit des noms de signaux individuels avec le nom "Hewlett Packard" dans Google Brevets et découvert un brevet spécifique (et un autre, plus ancien référencé par le premier) avec une description claire des technologies et des signaux utilisés dans les cartouches. Cela me ferait gagner beaucoup de temps lorsque je me débattais avec le timing des cartouches ... eh bien. Je peux dire sincèrement que cet indice était très difficile à trouver: les signaux étaient non seulement recouverts d'un film de silicone, mais aussi minuscules: les lettres ne mesurent que 30 micromètres, ce qui est inférieur à l'épaisseur d'un cheveu humain.

Le brevet décrit le fonctionnement interne de la cartouche et mérite d'être lu (si vous pouvez comprendre le jargon juridique utilisé ici) juste pour comprendre comment la logique étrange que HP utilise parfois pour contrôler toutes les buses. Le brevet lui-même est utile, mais pas suffisant pour contrôler la cartouche; au moins la majeure partie du travail d'ingénierie inverse que j'ai entrepris serait encore nécessaire, même si j'avais ce brevet.

Ici et ci-dessous, j'utiliserai les noms des signaux et contacts utilisés dans le brevet. Veuillez noter que dans le code mes propres noms de signaux peuvent toujours être trouvés; Je vais inclure une table de traduction avec la documentation.

Encodage des données



Voici donc à quoi ressemblent les cartouches à l'étude. À première vue, ce sont des appareils assez simples: à l'intérieur, ils sont presque entièrement constitués d'une éponge imbibée d'encre. Dans le cas de la cartouche livrée avec l'imprimante, il y a très peu d'encre: seulement la moitié de l'espace dans la cartouche est occupée par les éponges, et les éponges elles-mêmes sont également à moitié vides:


Sur le côté, 16 contacts partent du bas où se trouve la tête d'impression. Comme vous pouvez le voir au microscope, il y a environ 336 buses dans la tête d'impression de la cartouche noire et 612 buses dans la cartouche couleur. Les buses sont disposées en rangées verticales sur la tête d'impression, et chaque buse peut être contrôlée électroniquement de sorte qu'elle tire une petite goutte d'encre vers le bas du côté du papier inséré dans l'imprimante. En déplaçant la tête verticalement, l'imprimante peut imprimer une «bande» ou toute autre image; dans le cas d'une cartouche noire, cette bande mesure environ 15 mm de long et 8 mm pour une cartouche couleur.

De toute évidence, les buses peuvent être contrôlées à l'aide de contacts. Selon les minuscules inscriptions des têtes d'impression, les contacts contiennent les signaux suivants:


Puisqu'il n'y a que 16 contacts, il doit y avoir une sorte de schéma de multiplexage pour contrôler toutes les buses. Le brevet explique comment cela fonctionne: le contrôle des buses est divisé en 14 groupes distincts. Ces groupes sont déclenchés séquentiellement: ils reçoivent d'abord leurs données et le groupe 1 est déclenché, puis le groupe 2, etc. Chaque groupe contrôle un maximum de 24 buses, et leurs données sont transmises via trois bus de données. Dans le cas d'une cartouche couleur, les données dans les trois bus correspondent aux couleurs: D1 sont les données jaunes, D2 sont les données magenta et D3 contrôle les buses cyan.

Dans le brevet, le travail est décrit en détail en utilisant un bus de données comme exemple. Cette figure du brevet montre les signaux utilisés:


Le bus de données contient huit octets, 0-7. Même les octets sont contrôlés par le bord arrière de DCLK, les octets impairs sont contrôlés par les bords arrière de S1-S4. Les buses dont les données sont contrôlées par les quatre premiers octets peuvent être activées en fournissant de l'énergie via le bus d'alimentation F3; les buses associées aux quatre derniers bits sont activées par le bus F5.

Je ne sais pas pourquoi HP a décidé d'utiliser un circuit aussi complexe pour gérer les données des buses. Nous pouvons dire que quelque chose d'évident, comme un registre à décalage, aurait fonctionné normalement ici. Je comprends que HP utilise ses brevets comme une arme contre les sociétés de recharge de cartouches; peut-être que quelqu'un a déjà breveté une solution plus simple, et il a dû trouver cette solution plus complexe pour être unique.

Sur ce graphique, réalisé par mes soins sur un analyseur logique, il n'est pas difficile de retrouver les signaux décrits dans le brevet:


En plus de contrôler les buses, la cartouche a également besoin d'un signal (csync) pour passer au groupe de buses suivant ou pour se réinitialiser et revenir au premier groupe. Il peut être vu dans l'image de l'analyseur logique: il montre l'avant-dernier et le dernier groupe de 14, et le signal csync a une forme reconnaissable dans le dernier groupe; il effectue une «réinitialisation» de la cartouche afin que le premier groupe reçoive ensuite les données. Ce signal peut également être utilisé pour contourner des groupes de buses dans l'ordre inverse; ceci est utile lorsque la tête d'impression se déplace de gauche à droite et de droite à gauche. Bien que le deuxième brevet décrive comment cela fonctionne, j'ai décidé de simplement coder la transition vers le groupe suivant et de réinitialiser les signaux affichés dans mes images par la ligne csync.

Notez que tout cela se produit à une vitesse assez élevée; le retard entre les deux fronts avant du signal DCLK est d'environ 0,4 µs, et la distance entre les groupes est d'environ 4 µs.

Nous savons maintenant que chaque bit de ces trois bus de données de 14 octets contient une commande d'opération pour une buse. Si le bit est 0, la buse correspondante est déclenchée; s'il est égal à 1, la buse ne fonctionne pas. Ce que nous ne savons pas, c'est la correspondance entre les bits et les buses. Si vous avez regardé la présentation, vous savez comment j'ai réussi à le comprendre: j'ai imprimé un motif connu sur une imprimante en état de marche, interceptant les signaux à l'aide d'un analyseur logique, puis j'ai déterminé l'ordre des signaux afin de décoder les signaux vers l'image d'origine.
.
Malheureusement, la correspondance des bits aux buses semble assez constante, mais pas complètement logique. Il semble que cela soit principalement dû à la nécessité de déplacer physiquement les buses simultanément à une distance suffisante (pour éviter une surchauffe ou l'apparition d'un vide local dans le réservoir d'encre). En outre, j'ai également constaté que la facilité de routage des signaux dans une cartouche peut rendre la correspondance entre les bits et les buses assez déroutante. Dans mon firmware, j'ai simplement implémenté ce mappage comme un ensemble de tables de recherche.

Électronique


Maintenant que nous savons comment fonctionnent les signaux, nous pouvons contrôler la cartouche d'imprimante avec un simple microcontrôleur, non? Enfin, pas tout de suite. La cartouche d'imprimante n'utilise pas une logique simple 5 V ou 3,3 V. Les bus de données sont contrôlés par des bus 16 V ou 9 V. Les bus d'alimentation sont également contrôlés par 16 V et, en fait, en fonction du nombre de buses déclenchées, ils peuvent être tirés jusqu'au courant d'alimentation . Nous devons effectuer une conversion de niveau.

En tant que convertisseur de niveau, j'ai choisi le MC14504. Il s'agit d'une ancienne puce de conversion de niveau hexadécimale unidirectionnelle qui peut augmenter la tension à 18 V.Bien que cette puce fonctionne également, avec le recul, je peux dire que ce n'était pas le meilleur choix: elle ne peut produire que quelques mA et a un retard de propagation assez important. Je pense qu'il fournit un retard de certains signaux de sortie en fonction de la cartouche et de la charge appliquée aux sorties de la puce. J'ai au moins une cartouche qui a besoin d'un petit ajustement de synchronisation pour que les signaux fonctionnent, et je pense que c'est la raison. Malheureusement, les convertisseurs de niveau 16V prêts à l'emploi ne sont pas aussi accessibles aujourd'hui, donc je ne peux pas le remplacer par quelque chose de mieux. Cependant, cette puce classique avec un peu d'ajustement suffit amplement.

Avec les bus électriques, les choses sont un peu plus compliquées. En plus du fait que ces contacts absorbent une grande partie du courant, ils sont également directement connectés aux résistances des buses incluses: si, pour une raison quelconque, l'alimentation est fournie trop longtemps, ces minuscules résistances brûleront et la buse échouera complètement. De plus, ce «trop long» est assez simple à réaliser: il suffit d'allumer les buses pendant seulement quelques microsecondes, et si vous n'alimentez que pendant une milliseconde, elles s'évaporeront simplement, cassant complètement la buse. Pour éviter que cela ne se produise en raison d'un bug logiciel ou d'une mauvaise connexion, j'ai ajouté une logique matérielle qui garantit que l'impulsion est limitée à un petit multiple de 10 μs.


Dans le premier prototype, j'ai laissé plusieurs convertisseurs de niveau et je ne savais pas comment le logiciel fonctionnerait, j'ai donc résolu le problème avec un véritable multivibrateur à cycle unique. Dans ce circuit, deux multivibrateurs sont utilisés dans le 74HC123, générant des impulsions, dont la largeur est définie par la combinaison de R / C connecté à la broche RCExt. L'impulsion résultante est générée uniquement avec un signal d'entrée croissant, de sorte qu'un signal constamment élevé ne conduira à rien d'autre qu'une impulsion de sortie définie avec précision, mais parasite. Après cela, le canal MC14504 est utilisé comme convertisseur de niveau pour augmenter la tension à +16 V, et le transistor MOS à canal P fournit le courant nécessaire.


Sur la deuxième carte de circuit imprimé, j'ai réalisé que si je change la logique des contacts de puissance afin qu'ils n'utilisent pas deux canaux du circuit de décalage de niveau, alors seulement deux puces MC14504 suffiront. Maintenant, j'ai un bon contrôle programmatique sur la largeur d'impulsion, mais je veux toujours avoir une protection contre un signal de contact d'entrée constamment élevé. Voici le schéma auquel je suis arrivé. Cela fonctionne comme ceci: dans l'état normal avec un signal faible PWRB_IN, le condensateur C28 est vide, car toute tension y circule lentement le long de R20 et R21: la grille du transistor Q4 est élevée, et PWRB_OUT est déconnecté du bus d'alimentation 16 V. Dès que PWRB_IN élevé apparaît élevé signal, Q6 masse une extrémité de C28; comme la tension aux bornes de celle-ci est de 0 V, cela abaisse également son autre côté, qui est connecté à la grille Q4. Le fait de tirer l'obturateur Q4 vers le bas le rend conducteur, ce qui permet au courant de circuler de +16 V à PWRB_OUT. Dans l'état normal, PWRB_IN revient assez rapidement à l'état bas, fermant la porte Q4 et interrompant le courant. Cependant, alors que PWRB_IN est faible, le C28 se charge lentement: un côté est mis à la terre à Q6, et l'autre est connecté à 16 V via R21 et R31. Lorsque le condensateur est suffisamment chargé, Q4 «voit» un niveau élevé sur sa grille et coupe le courant dans PWRB_OUT, même si PWRB_IN est toujours dans un état de signal élevé. Ce mécanisme garantit que PWRB_OUT ne fournit de l'énergie que pendant une durée limitée.

Le circuit possède également une petite résistance connectée en série avec le bus d'alimentation 16 V (R31), ainsi qu'un petit condensateur connecté en parallèle avec le signal de sortie (C15). Ils sont nécessaires pour "relâcher la tension" du signal de puissance: sans eux, une mise en marche / arrêt nette Q4 induira un tas d'interférences électromagnétiques, déformant les signaux transmis à la cartouche.

À part cette logique, rien de plus n'est nécessaire. Évidemment, des convertisseurs de niveau +9 V et +16 V sont nécessaires. L'alimentation +9 V devrait être assez modeste: je n'ai pas remarqué que ces bus utilisaient généralement plus de quelques mA. Puisqu'elle alimente les résistances des buses, la source 16 V devrait être un peu plus forte: je l'ai fait pour que la mienne puisse fournir au moins 400 mA en continu, et j'ai également ajouté beaucoup de capacité de découplage.

Enfin, le fardeau le plus important du traitement de l'image et de la génération du signal incombe au microcontrôleur. Pour cela, j'ai choisi ESP32, principalement parce que j'ai pris quelques morceaux de travail, mais aussi parce qu'il a un contrôleur I2S assez puissant qui utilise un mode parallèle très pratique: en fait, on peut juste régler la fréquence d'horloge, spécifiez la zone de mémoire pour le contrôleur I2S et il sortira ces octets en parallèle. Grâce à cela, il est idéal pour générer les signaux de commande nécessaires; Le fait qu'il dispose de deux cœurs puissants de 240 MHz contribue également au traitement d'image.

Prototype


Bien sûr, plusieurs convertisseurs et transistors MOS ne peuvent pas à eux seuls devenir un contrôleur de cartouche d'imprimante fonctionnel. Par conséquent, j'ai créé un appareil séparé, conçu comme une plate-forme pour expérimenter avec une cartouche et ses capacités. Il possède un module ESP32, la logique nécessaire pour contrôler la cartouche et plusieurs alimentations pour travailler à partir d'une cellule lithium-ion. Il est également équipé de plusieurs capteurs conçus pour compenser les mouvements imparfaits des mains d'une personne, ainsi que de boutons et d'un écran qui fournit des informations sur les images imprimées. Jetons un coup d'œil aux composants, peut-être que pour quelqu'un, cela deviendra une inspiration pour le piratage des cartouches:



Commençons par la source d'alimentation. L'alimentation est fournie par une cellule lithium-ion et convertie en 3,3 V, 16 V et 9 V. Une tension de 3,3 V est requise pour les capteurs et l'ESP32; il est généré à l'aide d'un simple régulateur LD78 HT7833. 9 16 , XR2203. , 16 , 9 ; 9 . , .

- , - . , - TP4056, USB- .


ESP-Wrover32. 8 - 8 SPI; . 5- , , , .


- 160x80. SPI SPI-, ESP32.


. , . MC14504, 9 16 . /, .




. I2C, ESP32 GPIO. MPU9250 (, ) , VL53L0X ( ), , . , , . , , . — TCS3472. ; «» , .


GPIO, GPIO. , -, - ( ), , , -. , I2C-. , I2C- . I2C-, I2C-.


Voici le circuit imprimé que j'ai conçu en fonction du circuit. Il a une forme étrange, car il doit être divisé en quatre cartes distinctes et "entourer" la cartouche d'imprimante. Ils sont connectés électriquement et physiquement; l'avantage de cela est que les fabricants de cartes de circuits imprimés ne considèrent pas un tel circuit comme quatre cartes distinctes et que vous ne devez en payer qu'une.


Un autre avantage est que je peux assembler la carte en un seul élément, puis la tester lorsque tous les composants sont sur le même plan. Cela me permet de ne pas équilibrer soigneusement le périphérique assemblé pendant le débogage. Une petite remarque: les capteurs VL53L0X utilisent un faisceau laser infrarouge; Il semble qu'il soit assez fort pour percer le filtre de protection contre les rayonnements infrarouges dans mon «miroir» et apparaît dans le cadre comme de petits points violets de lumière.


. , . , . , FPC PCB flex-rigid PCB, .

, KiCad ( pdf gerber) , .

, … . , , , , , Nyancat . , . , git URL.

, ESP32 ( ), .


Pour permettre aux autres artisans d'utiliser plus facilement les cartouches d'imprimante dans leurs propres projets, j'ai également créé une version de travail minimale du pilote. Il ne prend pas en charge tous les périphériques et les hacks du code prototype, mais l'architecture est nettoyée et peut donc devenir une base solide pour un développement ultérieur. Le pilote a un exemple simple d'un programme qui imprime lorsque le bouton HELLO! Est enfoncé cartouche couleur ou noire.

Je n'ai pas créé d'équipement spécialisé pour cela, mais en fait, vous pouvez réutiliser le matériel de la section précédente: prenez simplement une alimentation , ESP32
et des convertisseurs de niveau . : BOOST_EN, 9 /16 . ( .)

Github , ESP-IDF. components/printcart ; , , , main/main.c . rgb-.

: printcart_i2s.c I2S ESP32. 16- 3,3 GPIO ( 16 ). ( GPIO , .) .

printcart_buffer_filler.c . printcart_genwaveform.c , . ( ), , tools/waveform_editor.html .

D'un autre côté, la file d'attente de données de buse est la procédure de boucle dans main.c. Il attend qu'un bouton soit pressé et lorsqu'il est pressé, il génère des données de buse en analysant un simple fichier image converti en données RVB brutes et incorporé dans un fichier binaire assemblé, en balayant les données de gauche à droite. Grâce à cela, vous pouvez appuyer sur le bouton, balayer la cartouche sur le papier et imprimer le contenu de l'image sous la forme d'une bande d'encre.

Le résultat final ressemble à ceci:


, , (0,7 1,5 ), , . , main.c define, ; . , : , , , . , .

En conclusion


- , ; (: ID?), , , . , , , . , , . - , .

… … ?

Source: https://habr.com/ru/post/fr443582/


All Articles