Einführung
Seit meiner Jugend, als wir den alten DeskJet hatten, interessierte ich mich für Tintenstrahldruckerpatronen. Diese Patronen schienen sehr interessant zu sein, und sobald ihnen die Tinte ausgegangen war, nahm ich sie sofort für mich. Zu dieser Zeit konnte ich nichts mit ihnen anfangen, außer meine Hände zu zerlegen und schmutzig zu machen ... Ich wusste zwar, dass sich eine komplexe Elektronik im Inneren befand, aber als die Kontakte die Batterie berührten, passierte nichts Interessantes und mein Wissen über Elektronik für mehr nicht genug.
Wenig später, als ich Student wurde, gelang es mir, einen alten Tintenstrahldrucker zu bekommen. Zu dieser Zeit habe ich selbst einen Laserdrucker verwendet, daher war ich nicht sehr daran interessiert, aber es war interessant, die Patronen zu untersuchen und zu versuchen, sie zurückzuentwickeln. Ich habe tatsächlich
einen Artikel über die Verwaltung dieser Patronen geschrieben, und obwohl sie recht gut funktionierten, gab es auch Nachteile: Ich konnte die genaue Reihenfolge der Düsen immer noch nicht herausfinden, die Patrone war nur monochrom (mit Magenta gedruckt) und auch ziemlich alt und daher die Auflösung stellte sich als ziemlich niedrig heraus.
Vor kurzem begann meine Freundin zu malen, daher war dies eine gute Ausrede, um zu Tintenpatronen zurückzukehren, in der Hoffnung, dass ich etwas auf Leinwand zeichnen könnte. Diesmal hatte ich Glück: Es gelang mir, alle Düsen an die richtigen Signale zu binden. Darüber hinaus steuern Druckerpatronen heutzutage mehr Düsen mit weniger Signalen, was die Kartuschenverwaltung vereinfacht und die Oberfläche vergrößert, die in einem Durchgang abgedeckt werden kann.
Ich habe es endlich geschafft, die Kontrolle über die dreifarbige Patrone zu erlangen und in Farbe zu drucken!
Wenn Sie mit mir vom Haufen der Drucker zur vollständigen Kontrolle über die Druckerpatrone gehen möchten, habe ich auf der Hackaday Supercon 2018 einen Bericht darüber erstellt. Die Videoaufzeichnung der Rede wird unten hinzugefügt. Wenn Sie an den Details des Reverse Engineering interessiert sind, probieren Sie es aus. In diesem Artikel werde ich auf die technischen Details der von mir erstellten Elektronik sowie auf die spezifischen Details der Verwaltung der Kassette eingehen, damit Sie den Nyancat selbst mit ESP32 oder einem anderen Mikrocontroller zeichnen können.
Präsentationsanhang
Wenn Sie das Video noch nicht gesehen haben, finden Sie hier eine kurze Zusammenfassung: Ich habe die Farbpatrone für den HP1112-Drucker zerlegt (in China ist es eine HP 803-Patrone, aber die Artikelnummer hängt von der Region ab), habe Bilder des Kristalls aufgenommen und versucht, herauszufinden, wie sie funktioniert. Als ich nicht viel herausfinden konnte, begann ich, die zwischen dem Drucker und der Patrone übertragenen Signale zu lesen, herauszufinden, welche Signale gesendet werden müssen, damit die Patrone meinen Befehlen gehorcht, und druckte dann Nyancat und andere lustige Dinge.
Der Signal-Timing-Teil der Studie war hauptsächlich ein Versuch-und-Irrtum-Prozess. Ich kann nur raten, welche Art von Verbindung zwischen den Signalen besteht, daher war es ziemlich schwierig, die Reihenfolge zwischen den Flanken herauszufinden und welche Signale verzögert werden können und welche pünktlich übertragen werden sollten. Ich habe eine Siliziumpatrone für diese Informationen untersucht. Es stellte sich heraus, dass ich es tatsächlich geschafft habe, indem ich die Patrone unter das Mikroskop gestellt habe, aber überhaupt nicht wie erwartet.
Bevor ich bei Supercon sprach, habe ich Farbpatronen studiert, weil sie mir am interessantesten erschienen. Nach meiner Rückkehr von Supercon wollte ich die schwarze Patrone zurückentwickeln: Der Druckkopf ist größer als der der Farbpatrone, sodass ich mehr gleichzeitig drucken kann. Es ist wahrscheinlich auch nicht so schwierig, Unterstützung für diese Kassette hinzuzufügen: Die Pin-Anordnung scheint dieselbe zu sein, und ich wusste, dass das Protokoll höchstwahrscheinlich ähnlich sein würde, da ich bereits versucht hatte, die schwarze Kassette an meine Hardware anzuschließen. Obwohl die Software Farbbilder übertrug, gelang es ihr dennoch, etwas zu drucken.
Folgendes habe ich mit der Farbpatrone gemacht: Ich habe sie unter das Mikroskop geklebt, die Silikonbeschichtung von den Kontakten entfernt und mich darauf vorbereitet, mehrere Aufnahmen zu einem großen Bild zu kombinieren. Die schwarze Patrone unterschied sich jedoch von der Farbe darin, dass auf der Metallplatte mit Düsen mehr Beschriftungen angebracht waren: Unter der Silikonbeschichtung befanden sich versteckte Signalnamen für alle Kontakte!
(Übrigens, wenn Sie vollständige Mikroskopbilder in allen 40-Megapixel-Größen sehen möchten, dann ist hier die
Abschirmung und das
Silizium der Farbpatrone! Bewundern Sie die Komplexität der
Düsen und das
Kristallbild der schwarzen Patrone!)
Obwohl es nicht viel zu sein scheint, sind in einem Meer von nicht gekennzeichneten Leiterplatten, Chips ohne Referenzmaterialien und Artikeln, die nirgendwohin führen, die Namen mehrerer Signale ein echter Fund. Aus einer Ahnung heraus fuhr ich einzelne Signalnamen mit dem Namen "Hewlett Packard" in
Google Patents ein und entdeckte ein
bestimmtes Patent (und ein anderes,
älteres, auf das im ersten Bezug genommen wird) mit einer klaren Beschreibung der in den Kassetten verwendeten Technologien und Signale. Das würde mir so viel Zeit sparen, wenn ich mit dem Timing der Kassetten zu kämpfen hätte ... na ja. Ich kann aufrichtig sagen, dass dieser Hinweis sehr schwer zu finden war: Die Signale waren nicht nur mit Silikonfolie bedeckt, sondern erwiesen sich auch als winzig: Die Buchstaben sind nur 30 Mikrometer groß und dies ist weniger als die Dicke eines menschlichen Haares.
Das Patent beschreibt den internen Betrieb der Patrone und ist lesenswert (wenn Sie den dort verwendeten juristischen Jargon herausfinden können), um zu verstehen, wie seltsam die Logik ist, die HP manchmal zur Steuerung aller Düsen verwendet. Das Patent selbst ist nützlich, aber nicht ausreichend, um die Patrone zu steuern. Zumindest der Großteil der von mir durchgeführten Reverse Engineering-Arbeiten wäre noch notwendig, selbst wenn ich dieses Patent hätte.
Hier und unten werde ich die Namen der im Patent verwendeten Signale und Kontakte verwenden. Bitte beachten Sie, dass im Code immer noch meine eigenen Signalnamen zu finden sind. Ich werde der Dokumentation eine Übersetzungstabelle beifügen.
Datenkodierung
So sehen die untersuchten Patronen aus. Auf den ersten Blick handelt es sich um recht einfache Geräte: Im Inneren bestehen sie fast ausschließlich aus einem mit Tinte getränkten Schwamm. Bei der mit dem Drucker gelieferten Patrone ist nur sehr wenig Tinte vorhanden: Nur die Hälfte des Platzes in der Patrone wird von den Schwämmen eingenommen, und die Schwämme selbst sind ebenfalls zur Hälfte leer:

An der Seite befinden sich 16 Kontakte von unten, wo sich der Druckkopf befindet. Wie Sie im Mikroskop sehen konnten, befinden sich ungefähr 336 Düsen im Druckkopf der schwarzen Patrone und 612 Düsen in der Farbpatrone. Die Düsen sind in vertikalen Reihen am Druckkopf angeordnet, und jede Düse kann elektronisch gesteuert werden, so dass ein winziger Tropfen Tinte auf die Seite des in den Drucker eingelegten Papiers schießt. Durch vertikales Bewegen des Kopfes kann der Drucker einen „Streifen“ oder ein anderes Bild drucken. Bei einer schwarzen Patrone ist dieser Streifen ungefähr 15 mm lang und bei einer Farbpatrone 8 mm.
Offensichtlich können Düsen über Kontakte gesteuert werden. Laut den winzigen Druckkopfinschriften enthalten die Kontakte folgende Signale:
Da es nur 16 Kontakte gibt, muss es eine Art Multiplexschema zur Steuerung aller Düsen geben. Das Patent erklärt, wie es funktioniert: Die Düsensteuerung ist in 14 separate Gruppen unterteilt. Diese Gruppen werden nacheinander ausgelöst: Zuerst erhalten sie ihre Daten und Gruppe 1 wird ausgelöst, dann Gruppe 2 und so weiter. Jede Gruppe steuert maximal 24 Düsen und Daten für diese werden über drei Datenbusse übertragen. Bei einer Farbpatrone entsprechen die Daten in den drei Bussen den Farben: D1 sind die gelben Daten, D2 sind die Magentadaten und D3 steuert die Cyan-Düsen.
In dem Patent wird die Arbeit am Beispiel eines Datenbusses ausführlich beschrieben. Diese Figur aus dem Patent zeigt die verwendeten Signale:
Der Datenbus enthält acht Bytes, 0-7. Gerade Bytes werden von der Hinterkante von DCLK gesteuert, ungerade Bytes werden von den Hinterkanten von S1-S4 gesteuert. Düsen, deren Daten von den ersten vier Bytes gesteuert werden, können durch Stromversorgung über den Leistungsbus F3 eingeschaltet werden; Die den letzten vier Bits zugeordneten Düsen werden vom F5-Bus eingeschaltet.
Ich habe keine Ahnung, warum HP beschlossen hat, eine so komplexe Schaltung zur Verwaltung von Düsendaten zu verwenden. Wir können sagen, dass etwas Offensichtliches wie ein Schieberegister hier ganz normal funktioniert hätte. Ich verstehe, dass HP seine Patente als Waffe gegen Unternehmen verwendet, die Patronen nachfüllen. Vielleicht hat jemand bereits eine einfachere Lösung patentiert, und er musste sich diese komplexere Lösung einfallen lassen, um einzigartig zu sein.
In diesem Diagramm, das ich mit einem Logikanalysator erstellt habe, ist es nicht schwierig, die im Patent beschriebenen Signale zu finden:

Zusätzlich zur Steuerung der Düsen benötigt die Patrone auch ein Signal (csync), um zur nächsten Düsengruppe zu gelangen oder um sie zurückzusetzen und zur ersten Gruppe zurückzukehren. Es ist im Bild des logischen Analysators zu sehen: Es zeigt die vorletzte und letzte Gruppe von 14, und das csync-Signal hat in der letzten Gruppe eine erkennbare Form; Er führt einen „Reset“ der Kassette durch, damit die erste Gruppe als nächstes Daten empfängt. Dieses Signal kann auch verwendet werden, um Gruppen von Düsen in umgekehrter Reihenfolge zu umgehen; Dies ist nützlich, wenn sich der Druckkopf von links nach rechts und von rechts nach links bewegt. Obwohl das zweite Patent beschreibt, wie dies funktioniert, habe ich beschlossen, den Übergang zur nächsten Gruppe einfach zu codieren und die in meinen Bildern gezeigten Signale durch die csync-Linie zurückzusetzen.
Beachten Sie, dass dies alles mit einer ziemlich hohen Geschwindigkeit geschieht. Die Verzögerung zwischen den beiden Vorderflanken des DCLK-Signals beträgt ungefähr 0,4 μs, und der Abstand zwischen den Gruppen beträgt ungefähr 4 μs.
Jetzt wissen wir, dass jedes Bit in diesen drei Datenbussen mit 14 Bytes einen Operationsbefehl für eine Düse enthält. Wenn das Bit 0 ist, wird die entsprechende Düse ausgelöst; Wenn gleich 1, funktioniert die Düse nicht. Was wir nicht wissen, ist die Entsprechung zwischen Bits und Düsen. Wenn Sie sich die Präsentation angesehen haben, wissen Sie, wie ich es herausgefunden habe: Ich habe ein bekanntes Muster auf einem funktionierenden Drucker gedruckt, die Signale mit einem Logikanalysator abgefangen und dann herausgefunden, wie die Reihenfolge der Signale sein sollte, um die Signale wieder in das Originalbild zu decodieren
.
Leider scheint die Übereinstimmung von Bits mit Düsen ziemlich konstant, aber nicht vollständig logisch. Es scheint, dass dies hauptsächlich auf die Notwendigkeit zurückzuführen ist, die Düsen gleichzeitig in einem ausreichenden Abstand zu bewegen (um eine Überhitzung oder das Auftreten eines lokalen Vakuums im Tintenbehälter zu vermeiden). Darüber hinaus stellte ich fest, dass die einfache Weiterleitung von Signalen in einer Kassette die Übereinstimmung von Bit und Düse ziemlich verwirrend machen kann. In meiner Firmware habe ich diese Zuordnung einfach als Satz von Nachschlagetabellen implementiert.
Elektronik
Jetzt, da wir wissen, wie Signale funktionieren, können wir die Druckerpatrone mit einem einfachen Mikrocontroller steuern, oder? Nun, nicht sofort. Die Druckerpatrone verwendet keine einfache 5-V- oder 3,3-V-Logik. Datenbusse werden von 16-V- oder 9-V-Bussen gesteuert. Leistungsbusse werden ebenfalls von 16 V gesteuert und können je nach Anzahl der ausgelösten Düsen tatsächlich auf den Versorgungsstrom hochgezogen werden . Wir müssen eine Levelkonvertierung durchführen.
Als Pegelwandler habe ich den MC14504 gewählt. Dies ist ein alter unidirektionaler Hexadezimalpegel-Umwandlungschip, der die Spannung auf 18 V erhöhen kann. Obwohl dieser Chip auch rückblickend funktioniert, kann ich sagen, dass dies nicht die beste Wahl war: Er kann nur wenige mA ausgeben und hat eine ziemlich große Ausbreitungsverzögerung. Ich denke, es liefert eine Verzögerung einiger Ausgangssignale in Abhängigkeit von der Kassette und der Belastung der Chipausgänge. Ich habe mindestens eine Kassette, die eine kleine Zeiteinstellung benötigt, damit die Signale funktionieren, und ich denke, das ist der Grund. Leider sind vorgefertigte 16-V-Pegelwandler heute nicht so zugänglich, so dass ich sie nicht durch etwas Besseres ersetzen kann. Dieser klassische Chip mit ein wenig Anpassung reicht jedoch völlig aus.
Bei Powerbussen sind die Dinge etwas komplizierter. Neben der Tatsache, dass diese Kontakte einen großen Teil des Stroms aufnehmen, sind sie auch direkt mit den Widerständen der mitgelieferten Düsen verbunden: Wenn die Stromversorgung aus irgendeinem Grund zu lange erfolgt, brennen diese winzigen Widerstände aus und die Düse fällt vollständig aus. Darüber hinaus ist dies „zu lang“ ganz einfach zu erreichen: Es reicht aus, die Düsen nur für einige Mikrosekunden einzuschalten. Wenn Sie nur eine Millisekunde lang Strom liefern, verdampfen sie einfach und brechen die Düse vollständig. Um dies aufgrund eines Softwarefehlers oder einer schlechten Verbindung zu verhindern, habe ich eine Hardwarelogik hinzugefügt, die sicherstellt, dass der Impuls auf ein kleines Vielfaches von 10 μs begrenzt ist.

Im ersten Prototyp habe ich mehrere Pegelkonverter verlassen und wusste nicht, wie die Software funktionieren würde. Deshalb habe ich das Problem mit einem echten Multivibrator mit einem Zyklus gelöst. In dieser Schaltung werden im 74HC123 zwei Multivibratoren verwendet, die Impulse erzeugen, deren Breite durch die Kombination von R / C eingestellt wird, die mit dem RCExt-Pin verbunden ist. Der resultierende Impuls wird nur mit zunehmendem Eingangssignal erzeugt, sodass ein konstant hohes Signal nur zu einem genau definierten, aber unechten Ausgangsimpuls führt. Danach wird der MC14504-Kanal als Pegelwandler verwendet, um die Spannung auf +16 V zu erhöhen, und der P-Kanal-MOS-Transistor liefert den erforderlichen Strom.

Auf der zweiten Leiterplatte wurde mir klar, dass nur zwei MC14504-Chips ausreichen, wenn ich die Logik der Leistungskontakte so ändere, dass sie nicht zwei Kanäle der Pegelverschiebungsschaltung verwenden. Jetzt habe ich eine gute programmatische Kontrolle über die Impulsbreite, möchte aber trotzdem Schutz vor einem konstant hohen Eingangskontaktsignal haben. Hier ist das Diagramm, zu dem ich gekommen bin. Dies funktioniert folgendermaßen: Im Normalzustand mit einem niedrigen Signal PWRB_IN ist der Kondensator C28 leer, da jede Spannung in ihm langsam entlang R20 und R21 fließt: Das Gate des Transistors Q4 ist hoch und PWRB_OUT wird vom 16-V-Leistungsbus getrennt. Sobald hoch in PWRB_IN hoch erscheint Signal, Q6 Masse ein Ende von C28; da die Spannung über ihm 0 V beträgt, zieht dies zunächst auch seine andere Seite nach unten, die mit dem Gate Q4 verbunden ist. Wenn Sie den Q4-Verschluss nach unten ziehen, wird er leitend. Dadurch kann Strom von +16 V nach PWRB_OUT fließen. Im Normalzustand schaltet PWRB_IN schnell genug in den niedrigen Zustand zurück, schließt das Gate Q4 und unterbricht den Strom. Während PWRB_IN niedrig ist, wird der C28 langsam aufgeladen: Eine Seite ist an Q6 geerdet und die andere ist über R21 und R31 mit 16 V verbunden. Wenn der Kondensator ausreichend geladen ist, "sieht" Q4 einen hohen Pegel an seinem Gate und schaltet den Strom in PWRB_OUT ab, selbst wenn sich PWRB_IN noch in einem hohen Signalzustand befindet. Dieser Mechanismus stellt sicher, dass PWRB_OUT nur für eine begrenzte Zeit Strom liefert.
Die Schaltung hat auch einen kleinen Widerstand, der in Reihe mit dem 16-V-Leistungsbus (R31) geschaltet ist, sowie einen kleinen Kondensator, der parallel zum Ausgangssignal (C15) geschaltet ist. Sie werden benötigt, um die Spannung des Stromversorgungssignals zu "entlasten": Ohne sie führt ein scharfes Ein- und Ausschalten von Q4 zu einer Reihe elektromagnetischer Störungen, die die an die Kassette übertragenen Signale verzerren.
Außer dieser Logik wird nichts mehr benötigt. Offensichtlich werden +9 V- und +16 V-Pegelwandler benötigt. Die +9 V-Stromversorgung sollte recht bescheiden sein: Ich habe nicht bemerkt, dass diese Busse im Allgemeinen mehr als ein paar mA verbrauchen. Da es die Düsenwiderstände speist, sollte die 16-V-Quelle etwas stärker sein: Ich habe es so gemacht, dass meine kontinuierlich mindestens 400 mA liefern kann, und außerdem eine Menge Entkopplungskapazität hinzugefügt.
Schließlich liegt die wichtigste Last der Bildverarbeitung und Signalerzeugung beim Mikrocontroller. Zu diesem Zweck habe ich mich für ESP32 entschieden, hauptsächlich, weil ich ein paar Teile von der Arbeit genommen habe, aber auch, weil es einen ziemlich leistungsstarken I2S-Controller hat, der einen sehr praktischen Parallelmodus verwendet: Tatsächlich können wir einfach die Taktfrequenz einstellen, Geben Sie den Speicherbereich für den I2S-Controller an, der diese Bytes parallel ausgibt. Dank dessen ist es ideal zur Erzeugung der notwendigen Steuersignale; Die Tatsache, dass es zwei leistungsstarke 240-MHz-Kerne hat, hilft auch bei der Bildverarbeitung.
Prototyp
Natürlich können mehrere Wandler und MOS-Transistoren allein keine funktionierende Druckerpatronensteuerung werden. Aus diesem Grund habe ich ein separates Gerät erstellt, das als Plattform für das Experimentieren mit einer Patrone und ihren Funktionen konzipiert ist. Es verfügt über ein ESP32-Modul, die zur Steuerung der Kassette erforderliche Logik und mehrere Netzteile für die Arbeit mit einer Lithium-Ionen-Zelle. Es ist außerdem mit mehreren Sensoren ausgestattet, die unvollständige Bewegungen der Hände einer Person ausgleichen sollen, sowie mit Tasten und einem Display, das Feedback zu gedruckten Bildern gibt. Werfen wir einen Blick auf die Komponenten, vielleicht wird es für jemanden eine Inspiration für das Hacken von Patronen:


Beginnen wir mit der Stromquelle. Die Stromversorgung erfolgt über eine Lithium-Ionen-Zelle und wird in 3,3 V, 16 V und 9 V umgewandelt. Für Sensoren und ESP32 ist eine Spannung von 3,3 V erforderlich. Es wird mit einem einfachen LD78-Regler HT7833 erzeugt.
Spannungen von 9 V und 16 V werden von zwei Aufwärtswandlern basierend auf dem Aufwärtswandlerchip XR2203 erzeugt. Bitte beachten Sie, dass ein 16-V-Netzteil viel härter arbeiten muss als ein 9-V-Netzteil. Die Patrone verbraucht ab 9 V nur wenige Milliampere. Zwei Aufwärtswandler wurden auf demselben Chip erstellt, nur weil es für mich ausreichte, einen Komponententyp für beide zu kaufen.Da das gesamte Gerät von einer Lithium-Ionen-Zelle gespeist wird, müssen wir es irgendwie aufladen. Ich habe nur noch wenig Platz, deshalb habe ich ein TP4056-basiertes Lithium-Ionen-Ladegerät hinzugefügt, damit ich den Akku von jeder USB-Stromquelle aufladen kann.Die Intelligenz des Geräts wird vom ESP-Wrover32-Modul bereitgestellt. Ich habe die Option mit 8 MiB Flash-Speicher und 8 MiB RAM SPI verwendet. genug, um eine komplexe Bildverarbeitung durchzuführen. Das Modul verfügt außerdem über einen 5-poligen Anschluss, über den Sie die Firmware programmieren und debuggen können, sowie über zwei Schaltflächen, mit denen Sie Optionen auswählen und mit dem Rendern beginnen können, wenn die Firmware ausgeführt wird.Ausgewählte Optionen werden auf einem kleinen kleinen LCD-Bildschirm (160 x 80) angezeigt. Der Bildschirm verfügt über eine SPI-Verbindung und kann direkt über einen der im ESP32 verfügbaren peripheren SPI-Anschlüsse gesteuert werden.Dies ist die Kassettenschnittstelle. Wie oben erwähnt, ist es nicht besonders kompliziert. Der Pegel aller Signale wird vom MC14504-Paar konvertiert, eines für 9-V-Signale und eines für 16-V-Signale. Auf dem Diagramm befindet sich auch eine Pegel- / Schutzschaltschaltung, die Doppelleistungsbusse steuert.


Hier sind drei Arten von Sensoren, die ich verwendet habe. Alle von ihnen sind über einen I2C-Bus verbunden, dh in ESP32 belegen sie nur zwei GPIOs. Dies ist die Trägheitssensoreinheit MPU9250 (Beschleunigungsmesser, Gyroskop und digitaler Kompass) zur Bewegungsmessung, drei Laser-Abstandssensoren VL53L0X (nur einer abgebildet), nach oben, links und rechts gerichtet. Die Idee ist, dass es durch Kombinieren dieser Informationen theoretisch möglich ist, die absolute Position der Patrone zu bestimmen. Dies ist beispielsweise nützlich, wenn Sie große Bilder mit einer Freihandbewegung zeichnen. Letzteres ist der Farbsensor TCS3472. Der Farbsensor befindet sich neben der weißen LED. Es kann verwendet werden, um die Farbe vom Motiv zu „kopieren“ oder um die Farbe des Mediums zu kompensieren, auf das wir drucken.
Da ich zusätzliche GPIOs benötigte, habe ich einen GPIO-Expander an den Bus angeschlossen. Es steuert die Rücksetzbusse für die drei Abstandssensoren, den Rücksetzbus für den LCD-Bildschirm, den Einbau eines Aufwärtswandlers und zwei MOS-Transistoren (nicht gezeigt), die die weiße LED steuern, mit der das Ziel für den Farbsensor beleuchtet wird, sowie die Hintergrundbeleuchtung des LCD-Bildschirms. Abstandssensoren benötigen einen separaten Reset-Bus, da sie an derselben I2C-Adresse eingeschaltet werden. Sie haben jedoch einen Befehl, der die I2C-Adresse nach dem Einschalten ändert. Durch Einschalten und Verschieben nacheinander an verschiedene I2C-Adressen kann ich alle drei auf demselben I2C-Bus steuern.
Hier ist die Leiterplatte, die ich basierend auf der Schaltung entworfen habe. Es hat eine seltsame Form, da es in vier separate Karten unterteilt werden muss und die Druckerpatrone "umgibt". Sie sind elektrisch und physikalisch verbunden; Dies hat den Vorteil, dass die Hersteller von Leiterplatten eine solche Schaltung nicht als vier separate Leiterplatten betrachten und Sie nur für eine bezahlen müssen.Ein weiterer Vorteil ist, dass ich die Platine als ein Element zusammenbauen und dann testen kann, wenn sich alle Komponenten in derselben Ebene befinden. Dadurch kann ich das zusammengebaute Gerät beim Debuggen nicht sorgfältig ausbalancieren. Ein kleiner Hinweis: VL53L0X-Sensoren verwenden einen Infrarotlaserstrahl. Es scheint stark genug zu sein, um den Filter zum Schutz vor Infrarotstrahlung in meinem „Spiegel“ zu durchbrechen, und erscheint im Rahmen als kleine lila Lichtflecken.Und was wird das Endergebnis nach der Montage sein. Beachten Sie, dass beim Trennen der Platinen die Verbindungen zwischen ihnen unterbrochen wurden. Die Platinen haben kleine Lötpads, an die Sie ein kleines Stück Draht anlöten und biegen können. Für die Produktionsebene müssen Sie natürlich Technologien wie FPC-Leiterplatten oder Flex-Rigid-Leiterplatten verwenden, aber für einen billigen Prototyp funktioniert dies.Wenn Sie diesen Prototyp als Referenz verwenden oder damit experimentieren möchten, können Sie die KiCad-Projektdateien herunterladen (es gibt auch PDF- und Gerber-Diagramme an derselben Stelle) und ihn selbst zusammenstellen oder seine Subsysteme verwenden.Da es sich um einen Prototyp handelt, ist die Software eher ... heterogen. Ich werde einen Link zu dem Repository geben, in dem es entwickelt wurde, aber denken Sie daran, dass dies eine Momentaufnahme fast des gesamten Entwicklungszyklus ist, sodass alles in der richtigen Reihenfolge enthalten ist, von Signalaufzeichnungen durch einen Logikanalysator bis hin zu gedruckten Nyancat und Mona Lisa. Leider ist der Code deshalb fast undokumentiertes Chaos mit halbfertigen Pfaden und Überresten des alten Codes. Wenn Sie es noch lernen möchten, können Sie diese URL in git klonen .Wenn Sie jedoch mehr an Software interessiert sind, die die Druckerpatrone einfach mit ESP32 steuern kann (und nützliche Verfahren zur Steuerung über einen anderen Mikrocontroller enthält), lesen Sie weiter.Minimale Arbeitsversion
Um anderen Handwerkern die Verwendung von Druckerpatronen in ihren eigenen Projekten zu erleichtern, habe ich auch eine minimal funktionierende Version des Treibers erstellt. Es fehlt die Unterstützung für alle Peripheriegeräte und Hacks aus dem Prototypcode, aber die Architektur wird bereinigt und kann daher eine solide Grundlage für die weitere Entwicklung bilden. Der Treiber hat ein einfaches Beispiel für ein Programm, das gedruckt wird, wenn die HELLO! -Taste gedrückt wird Farbe oder schwarze Patrone.Ich habe keine speziellen Geräte dafür erstellt, aber tatsächlich können Sie die Hardware aus dem vorherigen Abschnitt wiederverwenden: Nehmen Sie einfach ein Netzteil , ESP32und Pegelwandlerund wenden Sie sie in Ihrem eigenen Schema an. Sie können den im vorherigen Abschnitt beschriebenen Prototyp auch vollständig verwenden: Es reicht aus, einfach ein konstant hohes Signal BOOST_EN bereitzustellen, damit die 9-V / 16-V-Aufwärtswandler immer eingeschaltet sind. (Auf diese Weise habe ich den Code debuggt.)Der Code selbst befindet sich auf Github und ist standardmäßig für das ESP-IDF-Projekt strukturiert. Der Haupttreibercode befindet sich in components / printcart . Codelesetaste und entscheiden , wann auf der Düse zu drehen, sowie die Code Initialisierung im enthaltenen Haupt / main.c . In diesem Beispiel werden Düsendaten aus dem eingebetteten RGB-Bild gelesen.Das System hat die folgende Architektur: printcart_i2s.centhält einen einfachen Treiber für den Parallelmodus der I2S-Peripherieanschlüsse des ESP32-Controllers. Es wählt zwei Puffer aus und überträgt aus den Puffern 16-Bit-Wörter mit einer Frequenz von 3,3 MHz an GPIO-Kontakte (maximal 16 Kontakte). (Hier sind diese GPIO-Pins mit den Pegelwandlern verbunden, die die Kassette steuern.) Jedes Mal, wenn der Puffer leer ist, führt der Treiber einen Ereignishandler aus, um den Puffer zu füllen.Der Ereignishandler befindet sich in printcart_buffer_filler.c . Es empfängt Düsendaten aus der Düsendatenwarteschlange und übergibt sie an eine Funktion in printcart_genwaveform.c , die diese Düsendaten per Vorlage in Signale umwandelt. Die Vorlage hängt vom Typ der Kassette ab (Farbe oder Schwarz). Sie können sie ändern, indem Sie tools / waveform_editor.html in den Browser laden .Andererseits ist die Düsendatenwarteschlange die Schleifenprozedur in main.c. Es wartet darauf, dass eine Taste gedrückt wird, und generiert beim Drücken Düsendaten, indem es eine einfache Bilddatei analysiert, die in RGB-Rohdaten konvertiert und in eine zusammengefügte Binärdatei eingebettet ist, wobei die Daten von links nach rechts gescannt werden. Dank dessen können Sie die Taste drücken, die Patrone über das Papier streichen und den Bildinhalt in Form eines Tintenstreifens drucken.Das Endergebnis sieht ungefähr so aus:Hier fällt auf, dass die schwarze Patrone etwa doppelt so hoch ist wie die Farbe (0,7 cm und 1,5 cm). Wenn Sie also keine Farbe benötigen und eine gute Sichtbarkeit benötigen, ist es besser, eine schwarze Patrone zu wählen. Es ist auch erwähnenswert, dass in main.c definiert ist, dass zwischen zwei Patronen gewechselt wird. Code kann mit beiden arbeiten. Es ist nicht ganz klar, warum das schwarze Bild unscharfe Linien aufweist: Möglicherweise liegt ein Fehler in meinem Signal vor, oder die Patrone ist ein wenig müde vom Testen. Wie dem auch sei, die gedruckten Daten sind schön und gut erkennbar.Abschließend
- , ; (: ID?), , , . , , , . , , . - ,
.
… … ?