墨水屏具有非易失性和高反射率的特点,显示效果柔和,常见于各种电子阅读器上。但其更新速率较慢,小型墨水屏通常需要几秒钟才能刷新一次。在业界,高刷墨水屏已经出现了一段时间并推向了市场。
电子爱好者们围绕墨水屏同样也做了大量的工作,如bitbank针对并口和串口墨水屏都写了很棒的驱动,并对串口墨水屏的ram占用进行了特别优化。
和光于26年中左右展示了DIY60Hz墨水屏显示屏的过程。核心思路为只更新变动的像素,从而实现了刷新率高的同时还具有良好的显示效果。 和光于随后又在该基础上发布了paperboy项目,实现了60Hz的gameboy模拟器。该项目发布后,同款墨水屏开发套件(已经停产)的二手价格出现了大幅上涨。
到那时为止,爱好者们能接触到的高刷墨水屏都是基于并口墨水屏的,其驱动芯片会暴露出行和列,可以很好地实现只变动需要变动的像素这一驱动方式。 但常见的小型墨水屏通常为串口驱动,其驱动方式更类似于小型OLED等屏幕,需要写入显示缓存并使用更新指令,难以实现高刷。
基于和光的驱动方式,kuslota于26年十月初发布了inkboy项目,成功实现了在1.54寸小型串口墨水屏上运行gameboy模拟器,并达成了30Hz的刷新率和四色灰度显示。 此类墨水屏成本仅10-30元人民币,价格亲民且有多家供应商提供,货源充足。kuslota同时也实现了四灰阶高刷。
本项目在此基础上进行。
本项目基于inkboy的思路,在CH32H417和CH32V303上实现了47Hz的墨水屏驱动,其具有和常见墨水屏厂商驱动一样(空气引号)较好(空气引号)的可移植性。
使用的墨水屏为SSD1681主控的1.54寸方形200x200墨水屏。理论上其他SPI屏幕(比如常见的152x152的方形屏,296*128的2.9寸长条形屏幕等)也可使用。
本项目包含两个显示例子,分别为0.01秒精度的秒表和2300粒子的流体模拟。CH32H417的大核负责计算显示内容,小核负责显示。显示驱动加上缓冲区的内存占用较高, 对于一个5k字节的墨水屏,整体占用会达到40k左右。不少用于储存每个像素的驱动预算。本项目在单核的单片机上也可运行,秒表demo在CH32V303上实测也是完全可用的。
驱动代码为vibe coded,但所有代码已经过人类阅读和清理。
inkboy所使用的驱动方式适合每个像素会被持续点亮或熄灭的场景。 每个像素点亮或熄灭的时间需要120ms以上,若像素的变化快于这个速度且亮暗不对称(比如长期熄灭的像素刚点亮20ms就又被熄灭了),就会对面板产生直流应力。 长期直流应力将会导致电荷进入胶囊中并损坏面板,使得屏幕出现“鬼影”。短期应力可以通过常规刷新消除,因此隔一段时间需要进行一次常规刷新。
可以通过对静应力进行计算和限制来缓解这个问题,例如像素若在熄灭之前只被点亮了20ms,那么熄灭的脉冲也只持续20ms而不是原来的120ms。 实际测试下来这种方式可以支持非常长时间的快速刷新,由于墨水粒子存在惯性,拖影很重。
本项目默认的做法是每隔一小段时间进行静应力的补偿,补偿只会往正在显示的方向进行(例如某像素在补偿时为黑色,且它本身存在白色的静应力,那么就多几帧黑色上去)。该方案补偿效果有限,但对显示效果影响极小。
本项目同样提供会限制总静应力的版本,文件名为epd_fast_net.c.bak,只需删除其.bak后缀并替换掉epd_fast.c(例如将epd_fast.c重命名为epd_fast.c.bak)并重新编译即可。
还有一种补偿方式是每隔一段时间对产生的应力进行一次统一补偿,但该补偿方式会完全破坏显示内容,补偿之后必须要进行常规刷新,意义不大。
归根结底,墨水屏本不是为快刷而生,在操作快刷时需要对显示内容多加注意,多用缓慢运动的色块,减少快速变化的内容或者快速横向运动的细线等。
repo中的源码为Mounriver Studio II项目,需要使用该IDE打开并进行编译和下载。由于目前WCH的新网页的Linux工具链下载链接已损坏(希望是暂时的),其他系统的交叉编译需要自行发挥。