树莓派 java 驱动 微雪 墨水屏 16灰阶 LUT
16灰度阶梯展示(未优化版)
- 下图为16灰阶梯度未优化版,可以看出,最黑的黑色颜色不够黑,且往右边越黑,灰阶越不明显,还有很大的优化空间,后续再聊优化。
LUT
前言
- 本文先不直接讲输出16灰阶的代码,而是讲讲16灰阶实现的基础——波形
- 一堆资料讲到可编程波形,看得都不知道啥意思,为啥要可编程,而且微雪墨水屏的dataSheet(数据手册)也不提,只是写到LUT寄存器,搞得好像LUT是个众所周知的东西。可是,你知道LUT是个什么东西么?
- 其实,我也只是模里模糊知道这个LUT是干啥用的,我觉得这大概够我理解如何驱动树莓派,展示16灰阶图片了
- 本文有些细节处可能会理解不对,如果大侠发现错误了,请指正,我马上改。目的是让更多的同学能一起玩墨水屏。
概念
- LUT指显示查找表(Look-Up-Table),具体概念先自己百度一下,这里不多提。
- 百度了一堆资料,还是不知道墨水屏的这个LUT是干啥的吧,正常,下边进入正题。
墨水屏的LUT
- 我使用的是4.2寸的墨水屏,分辨率为400x300,相当于有400x300个像素,即400x300个墨水胶囊,每个墨水胶囊的示例如下(百度来的图)
- 我们先记住上图中的几个最关键的内容
- 透明的顶层电极薄膜,叫做公共端,英语叫做common。在数据手册中,公共端的电压,表示为Vcom,特别注意这个Vcom。数据手册中多次提到的就是他。
- 黑色粒子——负电
- 白色粒子——正电
- 我们的眼睛,从上往下看
- 以上,得知,Vcom使用正电,正负电相吸原理,黑色粒子就贴到上层。Vcom使用负电,白色粒子贴到上层
- 再以上,得知,Vcom使用正电,显示黑色。Vcom负电,显示白色。
- 假设,Vcom上使用电压1秒钟,黑色或白色粒子完全可以抵达顶部或底部,毕竟粒子在胶囊中移动这小段距离也需要时间。
- 再假设,Vcom上使用电压0.5秒钟,粒子移动到一半。Vcom上使用电压0.n秒,粒子移动的距离为0.n 倍顶部到底部的距离。
- 根据以上假设,考虑以下场景:
Vcom场景
-
正电1s,负电2s,正电2s,负电2秒,正电0.5秒,断电(断电即稳态)。对应的墨水屏展示情况为:
- 黑色1s,白色2s,黑色2s,白色2s,0.5倍的黑色(相当于是灰色,因为只给了0.5秒的正电,黑色白色的粒子只跑到一半,混在一起,肉眼看到就是灰色),断电颜色保持。
- 为啥要一会正电一会负电呢,我理解,是让黑白粒子上下抖动一下,相当于是清屏,使墨水胶囊能展示更干净纯粹的黑色或白色。
- 以上,就是一个Vcom波形,这个波形,最终展示一个0.5倍的黑色——即灰色
-
在场景1波形得到的结果基础上。再对墨水屏上电,给另外一个波形,这个波形非常简单:0.2秒的正电,断电。对应墨水屏展示的情况为:
- 0.7倍的黑色(相当于0.5倍的黑色+0.2倍的黑色),断电颜色保持。
-
忽略场景2,在场景1波形得到的结果基础上。再对墨水屏上电,在给一个波形,这个波形也简单:0.3秒的负电,断电。对应墨水屏展示的情况为:
- 0.2倍的黑色(相当于0.5倍的黑色+0.3倍的白色=0.5倍的黑色-0.3倍的黑色 = 0.2倍的黑色,这里只是为了给大家讲明白原理,实际上不会这么精确),断电颜色保持。
-
以上,3个场景,都是Vcom波形,大家对波形的理解一定要开放:
- 波形可以是多个正负电结合,持续一段时间
- 波形可以是单个正电或负电,持续一段时间
- 波形甚至可以是不施加电压,也算是一个波形。
Vcom场景分析结论
- 根据以上3个场景,可以推理出其他色阶的展示。灰阶,无非就是波形的产物。
- 只要波形给到位了可以一把显示任意灰阶(如场景1)
- 在波形叠加的情况下,也可以从任意灰阶,直接跳到另一灰阶(如场景2、场景3)
实际LUT波形寄存器
-
我们先看下4.2寸屏的官方数据手册,具体有5个Vcom波形,在看过一堆其他的材料的基础上,讲讲我对这几个波形的理解,如果说错了,请指正。
- VCOM LUT(LUTC):我认为,这个是清屏的时候需要用到的波形,实际上,我也没完全搞清楚这个波形的作用是什么,感觉对应以上提到的场景1
- W2W LUT(LUTWW):w即white,白色。白色到白色的波形,相当于以上场景2(场景2为黑色到黑色的波形)的变种
- B2W LUT(LUTBW):b即black,黑色。黑色到白色的波形,相当于以上场景3.
- W2B LUT(LUTWB):白色到黑色的波形,相当于以上场景3(场景3为黑色到白色的波形)的变种
- B2B LUT(LUTBB):黑色到黑色的波形,相当于以上场景2.
-
这5个波形寄存器,其实数据形式(数据形式即每个字节分别代表什么意思)是一样的。但是微雪4.2寸墨水屏中,没有明确给出具体的数据形式该怎么传。所以只能看其他材料。
-
首先,我们要知道4.2寸屏幕的IC(即驱动芯片),这个数据手册中也没有给出,不知道微雪官方是出于什么考虑没有给出。我通过科学上网(如果大家需要看,也需要通过科学上网),我是视频地址,以下为视频的概要(芯片的数据手册均可以百度下载到)
- 树莓派4.2存屏幕的驱动芯片为IL0398
- 但是,IL0398材料并没明确说明波形数据形式如何
- 好在,IL0373芯片材料,同IL0398在波形的数据形式上,应该是一致的
-
IL0373芯片材料中,对Vcom波形的讲解见下:
- 20h为寄存器地址,需要以写指令形式写入,对应下表的bytes 1(注意,这里不是从0开始)
- bytes 2到7,表示一个波形的一部分,我就把他称为子波形吧。
- 一共可以对7个子波形设置,最终构成一个完整的波形。所以橙色这个bytes 2-7 repeated 7 times,说的就是bytes 2-7是一个子波形,一共7个波形的意思。最初看数据手册的时候,心里直骂:“啥意思!什么玩意!”
- 下边是对子波形的设置简介:
- bytes 2 字节讲解
- 这个byte可以设置4个波形,第一个波形使用D7 D6指定,第二个波形使用D5 D4指定,第三个波形D3 D2,第四个波形D1 D0.
- 先把VCM_DC理解为电压0
- 见以下数据手册截图,00b为VCM_DC,01b为VDH+VCM_DC(VCOMH)其实就是给VCOM正电,10b为VDL+VCM_DC(VCOML)其实就是给VCOM负电,11b为Floating。
- 在我的理解,00b和11b电压正常情况下,黑白粒子位置会保持不变,灰度不变。
- 如果VCOM使用01b(正电),结合前边的内容理解,屏幕会更黑
- 如果VCOM使用10b(负电),屏幕会更白
- 以上更黑或更白,不需要专门用脑袋记,知道这个概念就好
- bytes 3 字节:指定第一个Vcom电压(由byte2的D7 D6指定)的持续时长,单位应该为控制芯片的时钟周期
- bytes 4 字节:指定第二个Vcom电压(由byte2的D5 D4指定)的持续时长,单位应该为控制芯片的时钟周期
- bytes 5 字节:指定第三个Vcom电压(由byte2的D3 D2指定)的持续时长,单位应该为控制芯片的时钟周期
- bytes 6 字节:指定第四个Vcom电压(由byte2的D1 D0指定)的持续时长,单位应该为控制芯片的时钟周期
- bytes 7 字节:bytes2到bytes6做出的波形,要重复几次
- 因为VCOM LUT在4.2寸屏的使用上好像作用不大(我认为的),比如官方例程截图(官方例程的bytes 1已经由代码send_command写入,所以截图中的数据是从bytes 2开始)
- 最左侧一列的上边7个,就是表示波形定义,全为0x00,即4个电压全是00b指定的电压,即VCM_DC,可理解为电压0
- 以下截图,可以看出,只指定了第一个波形执行1次,其他的波形执行0次。这个VCOM波形我理解加不加对屏幕没有啥灰度上的变化。
- bytes2-bytes7定义第一个子波形。
- bytes8-bytes13定义另一个子波形。等等等等。一共定义7个子波形,共同拼接成一整个波形。
- bytes44,bytes45我也没搞懂是干啥用的,知道的同学还请指教,我看例程里边直接设置为0了。具体数据手册的说明见下:
- bytes 2 字节讲解
-
IL0373芯片材料中,对LUTWW波形的讲解见下,与VCOM LUT波形大同小异,就不专门再说一遍了。
墨水屏LUT波形玩法
- 上边讲了这许多,相信很多同学对这个LUT已经有概念了吧。
- 那怎么实现灰阶呢,大家应该也有概念了吧。
- 假如(仅仅是假如,这个值大家可以自己去调,都能得到对应屏幕的理想波形),VCOM上15个时钟周期的正电,显示完全的黑
- 将黑分为16级,在屏幕为纯白的情况下
- 显示第15级黑,则需在VCOM上给14个时钟周期的正电
- 显示第14级黑,则需在VCOM上给13个时钟周期的正电
- 显示第13级黑,则需在VCOM上给12个时钟周期的正电
…
n. 显示白,则需在VCOM上给0个时钟周期的正电
- 所以,墨水屏上的灰度,可以对这个Vcom施加不同时长的正负电,以实现灰度。
结语
- 关于本文,我认为,大的概念上是没错的,相信大家看完,也至少模糊知道墨水屏LUT的原理
- 小的概念上,包括VCOM LUT的bytes44 bytes45我也没搞懂具体是干啥的,希望懂的同学不吝赐教,共同成长。