引言
从青年时代起,当我们拥有旧的DeskJet时,我就对喷墨打印机墨盒感兴趣。 这些墨盒看起来非常有趣,一旦墨水用完,我立即将它们带回自己。 那时,我无能为力,只能拆卸并弄脏我的手。尽管我知道里面有某种复杂的电子设备,但是当触点接触电池时,没有发生任何有趣的事情,而我对电子设备的了解更多。还不够
不久以后,当我成为一名学生时,我设法买了一台旧的喷墨打印机。 当时,我本人使用激光打印机,因此对它并不十分感兴趣,但是检查墨盒并尝试对其进行反向工程很有趣。 我实际上
写了一篇有关管理这些墨盒
的文章 ,尽管它们工作得很好,但也有一些缺点:我仍然无法弄清楚喷嘴的确切顺序,该墨盒只是单色的(用洋红色打印),而且还很旧,因此分辨率原来是相当低的。
最近,我的女友开始绘画,因此这是重回墨盒的好借口,希望我能在画布上画些东西。 这次我很幸运:我设法找到一种将所有喷嘴绑定到正确信号的方法。 此外,当今的打印机墨盒可以使用更少的信号来控制更多的喷嘴,从而简化了墨盒管理并增加了可一次通过的覆盖面积。
我终于设法控制了三色墨盒并进行了全色打印!
如果您想和我一起从打印机堆中完成打印机墨盒的控制,我在Hackaday Supercon 2018上作了关于它的报告。演讲的视频记录添加在下面。 如果您对逆向工程的细节感兴趣,请检查一下。 在本文中,我将讨论我创建的电子产品的技术细节,以及管理墨盒的具体细节,以便您自己可以使用ESP32或其他微控制器绘制Nyancat。
演示附件
如果您还没有观看视频,请参考以下简短摘要:我拆解了HP1112打印机的彩色墨盒(在中国,它是HP 803墨盒,但物品编号取决于所在地区),为水晶拍了照片,并试图弄清楚它的工作原理。 当我找不到很多东西时,我开始阅读打印机和墨盒之间传输的信号,找出要发送的信号以使墨盒服从我的命令,然后打印Nyancat和其他有趣的东西。
研究的信号定时部分主要是反复试验过程。 我只能猜测信号之间存在哪种连接,因此很难弄清边缘之间的顺序以及哪些信号可以延迟以及哪些信号应按时传输。 我研究了一个硅粉盒以获取此信息。 原来,我实际上是通过将墨盒放在显微镜下来设法获得它的,但一点也不像我预期的那样。
在Supercon演讲之前,我研究了彩色墨盒,因为它们对我来说似乎是最有趣的。 从Supercon回来后,我想对黑色墨盒进行反向工程:它的打印头比彩色墨盒大,所以我一次可以打印更多。 添加对该墨盒的支持可能也不是那么困难:引脚排列似乎相同,并且我知道协议很可能是相似的,因为我已经尝试过将黑色墨盒连接到我的硬件上。 即使该软件正在传输彩色图像,它仍然可以打印某些内容。
这是我对彩色墨盒所做的工作:我将其粘贴在显微镜下,从触点上除去了有机硅涂层,并准备将几张照片组合成一张大图像。 但是,黑色墨盒与彩色墨盒的区别在于黑色金属墨盒的喷嘴上有更多铭文:在硅胶涂层下,所有触点都有隐藏的信号名称!
(顺便说一句,如果您想查看所有40百万像素宏伟的完整显微镜图片,这里是彩色墨盒的
屏蔽层和
硅片 !请欣赏
喷嘴的复杂性和黑色墨盒的
晶体像 !)
尽管看起来似乎不多,但在无标记的印刷电路板,无参考材料的芯片和无处不在的物品的海洋中,确实找到了几种信号的名称。 我直觉将名为“ Hewlett Packard”的单个信号名称带入
Google Patents,并发现了一项
具体专利 (以及第
一个引用的另一个
较旧的 专利 ),其中清楚地描述了墨盒中使用的技术和信号。 当我为墨盒时间而苦苦挣扎时,这将为我节省很多时间。 我可以真诚地说,这个提示很难找到:信号不仅被有机硅膜覆盖,而且还变得很小:字母只有30微米大小,小于人发的厚度。
该专利描述了墨盒的内部操作,值得一读(如果您能弄清那里使用的法律术语),只是为了了解HP有时用来控制所有喷嘴的奇怪逻辑。 专利本身是有用的,但不足以控制墨盒。 即使我拥有这项专利,至少我仍然需要进行的大部分逆向工程工作。
在这里和下面,我将使用专利中使用的信号和触点的名称。 请注意,在代码中仍然可以找到我自己的信号名称; 我将在文档中包含翻译表。
资料编码
因此,这里是正在研究的墨盒的外观。 从表面上看,它们是相当简单的设备:在内部,它们几乎完全由浸有墨水的海绵组成。 对于打印机随附的墨盒,墨水很少:海绵中只有一半的空间被海绵占据,海绵本身也只有一半的空间:
在侧面,从打印头所在的底部开始有16个触点。 从显微镜中可以看到,黑色墨盒的打印头中大约有336个喷嘴,彩色墨盒中的大约612个喷嘴。 喷嘴垂直排列在打印头上,并且每个喷嘴都可以通过电子方式控制,以使其向着插入打印机的纸张侧面喷射一小滴墨水。 通过垂直移动打印头,打印机可以打印“条”或任何其他图像; 如果是黑色墨盒,则该条的长度约为15毫米,而彩色墨盒则为8毫米。
显然,可以使用触点控制喷嘴。 根据小巧的打印头铭文,触点包含以下信号:
由于只有16个触点,因此必须有某种多路复用方案来控制所有喷嘴。 该专利解释了其工作原理:喷嘴控制分为14个独立的组。 这些组是按顺序触发的:首先接收其数据并触发组1,然后触发组2,依此类推。 每个组最多控制24个喷嘴,它们的数据通过三个数据总线传输。 对于彩色墨盒,三个总线中的数据对应于颜色:D1是黄色数据,D2是洋红色数据,D3控制青色喷嘴。
在该专利中,以一个数据总线为例详细描述了工作。 专利中的此图显示了所使用的信号:
数据总线包含八个字节,0-7。 偶数字节由DCLK的后沿控制,奇数字节由S1-S4的后沿控制。 可以通过电源总线F3供电来打开由前四个字节控制数据的喷嘴。 与后四位相关的喷嘴由F5总线打开。
我不知道为什么惠普决定使用如此复杂的电路来管理喷嘴数据。 我们可以说,显而易见的东西,例如移位寄存器,在这里可以正常工作。 据我了解,惠普将其专利用作打击墨盒加注公司的武器。 也许有人已经申请了一种更简单的解决方案的专利,并且他们不得不想出这种更复杂的解决方案才能独树一帜。
在这张由我在逻辑分析仪上制作的图表上,找到专利中描述的信号并不难:
除了控制喷嘴之外,墨盒还需要一个信号(csync),以转到下一组喷嘴或重置并返回到第一组喷嘴。 从逻辑分析仪的图像中可以看出:它显示了倒数第二和最后一组14个,而csync信号在最后一组中具有可识别的形状; 他对盒带进行“重置”,以便第一组接收下一个数据。 该信号还可用于以相反的顺序绕过喷嘴组。 当打印头从左向右移动以及从右向左移动时,此功能很有用。 尽管第二项专利描述了它是如何工作的,但我还是决定简单地编码到下一组的转换,并通过csync线重置图像中显示的信号。
注意,所有这些都是以相当高的速度发生的。 DCLK信号的两个上升沿之间的延迟约为0.4μs,组之间的距离约为4μs。
现在我们知道这三个14字节的数据总线中的每个位都包含一个喷嘴的操作命令。 如果该位为0,则触发相应的喷嘴;否则为0。 如果等于1,则喷嘴不起作用。 我们不知道钻头和喷嘴之间的对应关系。 如果您观看了演示文稿,那么您就会知道如何设法解决该问题:我在工作的打印机上打印了一个已知的图案,使用逻辑分析仪截获了信号,然后确定了信号的顺序,以便将信号解码回原始图像。
。
不幸的是,钻头与喷嘴的匹配似乎相当恒定,但并非完全合乎逻辑。 看来这主要是由于需要同时以足够的距离同时物理移动喷嘴(以避免过热或墨水盒中出现局部真空)。 此外,我还发现,盒式磁带中路由信号的简便性会使钻头和喷嘴的匹配变得很混乱。 在我的固件中,我只是将此映射实现为一组查找表。
电子产品
现在我们知道信号是如何工作的,我们可以用一个简单的微控制器来控制打印机墨盒了,对吗? 好吧,不是马上。 打印机墨盒不使用简单的5 V或3.3 V逻辑,数据总线由16 V或9 V总线控制,电源总线也由16 V控制,实际上,根据触发喷嘴的数量,它们可以上拉至电源电流。 我们需要执行一个级别转换。
作为电平转换器,我选择了MC14504。 这是一个旧的单向十六进制电平转换芯片,可以将电压增加到18 V.虽然该芯片也可以工作,但回顾一下,我可以说这不是最佳选择:它只能输出几mA的电流并且具有相当大的传播延迟。 我认为它会根据盒带和施加到芯片输出的负载提供一些输出信号的延迟。 我至少有一个墨盒,需要一些定时调整才能使信号正常工作,我认为这就是原因。 不幸的是,现成的16V电平转换器在今天还不那么普及,因此我无法用更好的东西代替它。 但是,这种经过稍加调整的经典芯片就足够了。
使用电动公交车,事情变得更加复杂。 除了这些触点消耗大量电流这一事实外,它们还直接连接到随附喷嘴的电阻器上:如果由于某种原因供电时间过长,这些微小的电阻器将烧坏并且喷嘴将完全失效。 此外,这种“过长”的实现非常简单:仅打开喷嘴几毫秒就足够了;如果仅供电一毫秒,它们就会蒸发,从而完全损坏喷嘴。 为了防止由于软件错误或连接不良而发生这种情况,我添加了硬件逻辑,以确保将脉冲限制为10μs的较小倍数。
在第一个原型中,我留下了几个电平转换器,却不知道软件的工作方式,因此我用真正的单周期多谐振荡器解决了这个问题。 在该电路中,在74HC123中使用了两个多谐振荡器,产生脉冲,脉冲的宽度由连接到RCExt引脚的R / C组合设置。 最终的脉冲仅在输入信号增加的情况下生成,因此持续高电平的信号将不会导致除精确定义的杂散输出脉冲以外的任何信号。 此后,MC14504通道用作电平转换器以将电压升高至+16 V,并且P通道MOS晶体管提供必要的电流。
在第二块印刷电路板上,我意识到,如果更改电源触点的逻辑,以使其不使用电平转换电路的两个通道,那么仅两个MC14504芯片就足够了。 现在,我对脉冲宽度已经有了足够好的编程控制,但是我仍然希望对输入信号持续高电平进行保护。 这是我来到的图。 它的工作原理是:在正常状态下,信号CWRB_IN为低时,电容器C28为空,因为其中的任何电压都沿着R20和R21缓慢流动:晶体管Q4的栅极为高,并且PWRB_OUT与16 V电源总线断开。信号,Q6接地C28的一端; 由于其两端的电压为0 V,因此最初也会下拉其另一侧,该另一侧连接至栅极Q4。 向下拉Q4快门使其导通,这允许电流从+16 V流到PWRB_OUT。 在正常状态下,PWRB_IN足够快地切换回低电平状态,从而关闭了栅极Q4并中断了电流。 但是,当PWRB_IN为低电平时,C28缓慢充电:一侧接地至Q6,另一侧通过R21和R31连接至16V。 当电容器充分充电后,即使PWRB_IN仍处于高信号状态,Q4也会在其栅极上“看到”一个高电平并切断PWRB_OUT中的电流。 该机制确保PWRB_OUT仅在有限的时间内供电。
该电路还具有一个与16 V电源总线(R31)串联的小电阻,以及一个与输出信号(C15)并联的小电容器。 需要它们来“释放”电源信号的电压:没有它们,急于打开和关闭的Q4会引起一堆电磁干扰,使传输到盒式磁带的信号失真。
除了这种逻辑,别无其他。 显然,需要+9 V和+16 V电平转换器,而+9 V电源应相当适中:我没有注意到这些总线通常使用的电流超过几个mA。 由于它为喷嘴电阻供电,因此16 V电源应该更强一点:我这样做是为了使我的电源可以连续提供至少400 mA电流,并且还增加了很多去耦电容。
最后,图像处理和信号生成的最重要负担在于微控制器。 为此,我选择ESP32,主要是因为我花了一些功夫,还因为它具有功能强大的I2S控制器,该控制器使用非常方便的并行模式:实际上,我们可以设置时钟频率,指定I2S控制器的存储区,它将并行输出这些字节。 因此,它是生成必要控制信号的理想选择。 它具有两个功能强大的240 MHz内核的事实也有助于图像处理。
样机
当然,仅几个转换器和MOS晶体管不能成为工作的打印机墨盒控制器。 因此,我创建了一个单独的设备,将其作为试验墨盒及其功能的平台。 它具有一个ESP32模块,控制墨盒所需的逻辑,以及用于锂离子电池工作的多个电源。 它还配备了多个传感器,这些传感器旨在补偿人的手的不完美移动,还具有按钮和显示屏,可提供对打印图像的反馈。 让我们看一下这些组件,也许对于某人来说,它将成为暗盒黑客的灵感来源:
让我们从电源开始。 电源由锂离子电池供电,并转换为3.3 V,16 V和9V。传感器和ESP32需要3.3 V电压; 它是使用简单的LD78稳压器HT7833生成的。
两个升压转换器基于升压转换器芯片XR2203产生9 V和16 V的电压。请注意,16 V电源必须比9 V电源工作得多。盒式磁带从9 V消耗的电流仅为几毫安。在同一芯片上创建了两个升压转换器,仅仅是因为我足以为它们购买一种类型的组件。由于整个设备由锂离子电池供电,因此我们需要以某种方式对其充电。我的剩余空间很小,因此我添加了基于TP4056的锂离子电池充电器,以便可以从任何USB电源为电池充电。设备的智能由ESP-Wrover32模块提供。我使用了带有8 MiB闪存和8 MiB RAM SPI的选件;足以执行复杂的图像处理。该模块还有一个5针连接器,可用于编程和调试固件,以及两个按钮,可用于选择选项并在固件运行时开始渲染。选定的选项显示在160x80的小型彩色LCD屏幕上。屏幕具有SPI连接,可以由ESP32中可用的外围SPI连接器之一直接控制。这是墨盒接口。如上所述,它不是特别复杂。所有信号的电平都通过MC14504对进行转换,一个信号转换为9 V信号,一个信号转换为16 V.在该图上还显示了一个控制双电源总线的电平/保护移位电路。这是我使用的三种传感器。它们全部使用一条I2C总线连接,也就是说,在ESP32中,它们仅占用两个GPIO。这是用于测量运动的MPU9250惯性传感器单元(加速度计,陀螺仪和数字罗盘),三个激光距离传感器VL53L0X(仅一个),上下左右。这个想法是,通过组合这些信息,理论上可以确定墨盒的绝对位置。例如,在徒手运动绘制大型图像时,此功能很有用。后者是TCS3472颜色传感器。颜色传感器位于白色LED旁边;它可用于“复制”主题的颜色或补偿打印介质的颜色。由于我需要其他GPIO,因此我将GPIO扩展器连接到了总线。它控制着三个距离传感器的复位总线,LCD屏幕的复位总线,一个升压转换器和两个MOS晶体管(未显示),这些晶体管控制用于照亮颜色传感器目标的白色LED以及LCD屏幕的背光。距离传感器需要单独的复位总线,因为它们将在相同的I2C地址上开启。但是,它们确实具有在打开I2C地址后更改其地址的命令。通过打开它们并将它们一一移动到不同的I2C地址,我可以在同一I2C总线上控制所有三个。这是我根据电路设计的电路板。它的形状很奇怪,因为必须将其分成四个单独的板并“包围”打印机墨盒。它们在电气和物理上连接;这样做的好处是,印刷电路板的制造商不会将这种电路视为四块独立的电路板,而只需要为一块电路付费即可。另一个优点是,我可以将电路板组装为一个元件,然后在所有组件都位于同一平面上时对其进行测试。这使我在调试过程中无法仔细平衡组装好的设备。注意:VL53L0X传感器使用红外激光束;似乎它的强度足以突破我的“镜子”中的防红外线辐射滤镜,并在框架中显示为紫色的小光斑。组装后的最终结果是什么?请注意,当分离板时,它们之间的连接断开。板上有小的焊盘,您可以在其中焊接一小段电线并将其弯曲。显然,对于生产水平,您将需要使用FPC PCB或刚挠性PCB之类的技术,但是对于便宜的原型而言,这将是可行的。如果您想将此原型用作参考或进行试验,则可以下载KiCad项目文件(在同一位置也有pdf和gerber图)并自己组装或使用其子系统。由于这是一个原型,因此该软件相当异构。我将提供指向其开发所在的存储库的链接,但请记住,这几乎是整个开发周期的快照,因此它包含从逻辑分析仪的信号记录到印刷的Nyancat和Mona Lisa的所有顺序。不幸的是,这就是为什么该代码几乎没有文档记录的混乱,具有半完成的路径和旧代码的残留。如果您仍然想学习它,可以在git中克隆此 URL。但是,如果您对可以使用ESP32轻松控制打印机墨盒的软件更感兴趣(并包含用于通过另一个微控制器进行控制的有用步骤),请继续阅读。最低工作版本
为了使其他工匠更轻松地在自己的项目中使用打印机墨盒,我还创建了驱动程序的最低版本。它缺乏对所有外围设备和原型代码的破解的支持,但是该架构已被清理,因此可以成为进一步开发的坚实基础。该驱动程序有一个简单的示例程序,该程序在按下HELLO!按钮时会打印彩色或黑色墨盒。我没有为此创建专用设备,但实际上您可以重用上一节中的硬件:仅使用电源,ESP32和电平转换器并按自己的方案应用它们。您也可以完全使用上一节中描述的原型:只需提供恒定的高电平信号BOOST_EN就足够了,这样9 V / 16 V升压转换器始终处于导通状态。 (通过这种方式,我调试了代码。)代码本身可以在Github上找到,它是ESP-IDF项目的标准结构。主要驱动程序代码在组件/ printcart中 ;代码读取按钮,并决定作为包含在初始化代码时,打开喷嘴,以及主/ main.c中。在示例中,从嵌入的rgb图像中读取喷嘴数据。该系统具有以下体系结构:printcart_i2s.c包含一个用于ESP32控制器的I2S外设连接器并行模式的简单驱动程序。它选择两个缓冲区,并从缓冲区以3.3 MHz的频率将16位字传输到GPIO触点(最多16个触点)。 (这里,这些GPIO引脚连接到控制盒带的电平转换器。)每次缓冲区为空时,驱动程序都会执行事件处理程序以填充缓冲区。事件处理程序位于printcart_buffer_filler.c中。它从喷嘴数据队列接收喷嘴数据,并将其传递到printcart_genwaveform.c中的函数,该函数通过模板将这些喷嘴数据转换为信号。该模板取决于盒带的类型(彩色或黑色),您可以通过在浏览器中加载工具/ Waveform_editor.html来进行更改。另一方面,喷嘴数据队列是main.c中的循环过程。它等待按钮被按下,然后按下按钮,它通过解析一个简单的图像文件来生成喷嘴数据,该图像文件转换为原始rgb数据并嵌入到缝合的二进制文件中,从左到右扫描数据。因此,您可以按下按钮,将墨盒扫过纸张,然后将图像内容打印为墨水带。最终结果如下所示:在此非常值得注意的是,黑色墨盒的打印高度大约是彩色墨盒(0.7厘米和1.5厘米)的两倍,因此,如果您不需要颜色并且需要良好的可见性,则最好选择黑色墨盒。还需要注意的是,在main.c中定义了在两个盒带之间切换的功能;代码可以同时使用。目前尚不清楚为什么黑色图像中的线条模糊:可能是我的信号有误,或者是墨盒对测试有点厌倦了。尽管如此,打印的数据还是很漂亮且易于识别的。总结
这些打印机墨盒的反向工程是一个漫长的冒险,但是最终我的工作取得了丰硕的成果。尽管还存在一些难题(例如:ID触点有什么作用?),但我认为我已经很好地理解了墨盒中使用的信号之谜。我希望通过发布该项目的代码和图表,将打印机墨盒的使用添加到工匠,黑客和创作者的工具包中。我迫不及待想看到社区会提出的有趣的用法示例。如果您设法对我的工作做一些有趣的事情,请务必给我发消息。至于我创作艺术的意图……这个……可以这么称呼吗?