Arduino液晶屏技术调研 | imlab
Arduino液晶屏技术调研
October 27, 2012, 3:38 pm, :

Arduino技术调研——液晶屏幕

踏入十月以来,我们开始在arduino上着手做硬件方面的技术调研,期望能够了解能够选择什么样的硬件做原型,会有什么样的问题。主要接触有两块都是来自seeedstudio提供的屏幕,一块是2.8” TFT Touch Shield彩色触屏,一块是Grove OLED 96×96的16阶灰度屏

由于我自己本身是软件开发出身的,同时在制作原型方面更多是需要考虑如何用软件去驾驭这些硬件来达到我们的目标,因此我会通过尝试做不同的演示程序来发现这些硬件的可用性及限制在哪里,比如说在坐标上画线、画图案,整屏滚动输出文字,局部绘图等等。把一些测试用的程序放到这里了,以后还可能会更新。

下面是一些我对目前硬件的看法:

1. 两块液晶板同样都困扰过我的问题是,屏幕的刷新率并不高。我尝试过在320×240的2.8寸屏上通过它所提供的API,把所有点都画一次,需要花费的是2秒多的时间,即使是通过画矩形清屏,一秒钟也就最多画一次,这样就会限制了我们不可能用它来做一些流畅的动画展示。

后来请教过atommann之后了解到,其实液晶本身是应该支持快速刷新的,但瓶颈主要是在arduino往液晶控制器发绘图数据的通道,2.8寸屏是8位的总线,OLED屏用的是I2C的方式,都会比较慢,这是硬件设计。根据他的解释,其实如果我们只是做原型的话,并不需要对流畅性作此要求,如果需要流畅效果的话,只需在生产之前找硬件工程师修改一下设计,提高数据传输带宽就可以了。因此我们可以在原型阶段将就着用,同时,他的建议亦提醒了我,可以尽量通过少传数据的方式来提高流畅性,比如说,只更新局部区域而不整屏更新。

2. SeeedStudio在推出一些产品的时候,其实软件的API并没有开发得很完整,比如这块OLED,没有任何图形绘制API,只有文字显示和图片显示,而且色彩单一,根本无法体现出这块16阶灰度OLED的特点。我想这个跟产品本身的定位有关:它主要是面向开发人员使用,而且开放了完整的硬件资料,有一些熟悉硬件的软件工程师,完全有能力自己在上面进行二次开发,这样,他们并不需要花额外的成本来做好软件API,反而提高了产品研发的成本。另外,其实软件方面可以有更多的应用形式,每个人可能会有自己的设计方法,通过开源社区,可以使软件API方面得到弥补。

我在网上通过搜这块OLED的驱动芯片SSD1327,就找到了一个开源的图形库u8glib,主要面向各种8bit嵌入式系统的OLED和LCD显示的,在支持设备列表里面就可以找到SeeedStudio的这个产品,但是很遗憾,这个库只支持4阶灰度,如果我们希望用到上面的画线,画圈及旋转等绘图函数的话,就需要接受这个限制了。另外,它的设计跟原来SeeedStudio的API也不一样,在内存里用了两个小缓冲区,通过循环更新两个缓冲来显示整个屏幕的,好处是在缓冲区里面可以先画完draw()函数里定义的所有东西,再更新到屏幕上,提高显示流畅性;但缺点是它的缓冲区并不是完整的,是一片接一片地把整个屏幕绘完,必须按照它建议的写法去写绘制的代码,更新数据模型应该在picture loop以外做,否则会引起奇怪的显示。

3. 如前所说的,其实两块板都没有找到合适的任意更新屏幕局部区域的API,对灰度的支持也不完整,为了提高硬件的可用性,在研究它们API的同时,自己还在此基础上增加了一些方法,比如drawGrayBitmap(),通过一个字节2像素的数组来绘制16阶的位图,drawGrayBitmapArea(),在制定了矩形大小的情况下,可以局部更新指定的矩形区域,还有坐标定位等,这些在后面做原型展示的时候就会比较方便了。目前的方案还是以SeeedStudio API增强版本的基础上做原型开发,u8glib由于4阶色的限制而暂时不考虑了。

16阶灰度的表现力还是很不错的:
GrayScaleOLED Demo

 

October 30, 2012, 3:47 pm, Gao:

很棒的 AP I改良,16 阶灰度在原型阶段已经可以有很好表现了,;)我这边会再准备一些用进度条表示精力状况的 UI,不知道 Terry 同学用数字增减表示精力状态进度如何了,有没有遇到什么问题呢

October 30, 2012, 4:07 pm, Terry:

数字就是字符嘛,程序上来说不算什么问题

Leave a Reply

Your email address will not be published. Required fields are marked *


April 28, 2017, 12:16 pm, imlab.cc
Log in