lcdproc -- 使LCD显示屏容易使用和制作

ArticleCategory: [Choose a category, do not translate this]

Hardware

AuthorImage:[Here we need a little image from you]

[Photo of the Author]

TranslationInfo:[Author + translation history. mailto: or http://homepage]

original in en Guido Socher

en to zh_CN SEVEN

AboutTheAuthor:[A small biography about the author]

Guido喜欢Linux,因为对于开发自己的硬件来说,Linux确实是一个很好的系统。

Abstract:[Here you write a little summary]

期望能读到关于微控制器的文章的读者应该不用担心。我一定会继续写的。 我的下一篇文章将还是关于微控制器的,同时我也做了一个网页, 你可以在下面地址找到所有最近电子方面的文章: http://www.tuxgraphics.org/electronics/
我希望能在上面提供一个总览并使下面的链接容易访问。

这么长时间了,linuxfocus的读者可能还记得我的旧文章:March 2003: Linux USB LCD display with watchdog and buttonsA LCD control panel for your Linux server。那些都是关于昂贵的LCD面板,还有监视狗、ADC等等。 很久以前我就注意到所有那些额外的功能我们并不常用。

现在,这篇文章仅提供最基本的模型:LCD显示屏和2个按钮。对每个人来说都很容易制作。

ArticleIllustration:[This is the title picture for your article]

[Illustration]

ArticleBody:[The article body]

lcdprod是什么?

LCDd Lcdproc最初仅仅是一个程序,用它来往一个外部的LCD显示屏上显示诸如CPU LOAD、UPTIME、TIME等一些统计信息。经过很长时间的变化它成了一个通用的解决方案。 现在lcdproc软件包包括LCDd(一个通用的服务器的LCD驱动)和许多客户端程序。 其中的一个可执行的客户端程序仍然叫做lcdproc,它仍然用来显示一些服务器统计信息, 当然也还有其它一些客户端。这一客户机-服务器结构具有很大的优势: 你不需要使用特定的语言来写客户端,而只需在客户机和服务器之间使用简单的ASCII协议。 下面的例子实现了一个clock in just 36 lines of perl code。它能显示日期和时间,并且在最右上角显示一个叫做“心跳”的图标, 这一图标是由LCDd服务器程序加上的,它会定时闪烁表明显示屏是活动的。

在lcdproc中你还可以使用除字符串以外的其他东西: 比如柱状图、 滚动条、标题栏以及文本串等。在程序的开始你要首先定义那些对象(他们称作widgets), 然后使用数据填充这些对象。在LCDproc Developer's Guide中从第7页开始解释了如何使用它们。

例子little LCD clock的主要部分如下:
#!/usr/bin/perl -w
....
# initiate the communication:
print $remote "hello\n";
....
# set our name and define a text string widget
print $remote "client_set name lcdtime\n";
print $remote "screen_add scr1\n";
print $remote "widget_add scr1 str1 string\n";
....
while(1)
{
    ....
    $date = scalar localtime;
    # now write to the LCD:
    print $remote "widget_set scr1 str1 1 1 \"$date\"\n";
    sleep 10;
}
非常简单是吧?那么接下来让我们来做一些更有用的东西。

硬件

按照规范PC机的并行口使用5V的电压。现在,如果你看一下当今的LCD数据表 (e.g from tuxgraphics: http://shop.tuxgraphics.org/electronic/lcd.html)就可以发现,即使现在的显示屏比较大,它们却需要极少的电源-仅仅2mA的电流! 既然只需这么小的电流,那么仅仅使用并行口就可能直接驱动。 这一做法的优点是你不需要任何额外的电源控制器。仅仅是一个LCD显示屏和一个接在并行口上的并行接头。 非常方便使用。

使用一个并口提供5V的电源是可能的,问题是有一些并不是完全符合规范。 那么,如何判断你的并口能够足够支持在这种“电源自给”方案呢? 下面是一些测试:
  1. 安装lcdproc和“并口电源”补丁(见参考资料)。
  2. 照下面的描述配置/dec/LCDd.conf文件。
  3. 以root用户启动LCDd程序。
  4. 用一个数字伏特表测量针脚一个电压。它应该是4.90V或更高(从针脚1和针脚18=GND间测量)。
  5. 现在在并口的针脚1和针脚18间接一个33K的电阻,电压将会降到4.25伏。 如果你能得到更高的电压,你的并口就是好的,如果小于4.25伏,那么这一“电源自给”方案就无法使用。
如果你通过这一测试,那么你就可以使用这种“并口电源“方案,并使用tuxgraphics 20x2显示屏, 它已经经过测试,能正常工作。

usb A connector pinout 如果你的并口不能胜任,也不要太担心。你可以使用PC内部的5V电源(为此你可能需要打开机箱), 或者使用USB接口提供的5V电源。

电路图

第一张电路图显示了使用“并口电源”方案的LCD显示屏和两个按钮间的连接。
parallel port powered LCD display

Parallel port  
pin 1 , strobe  = 220, supply voltage
pin 2 , D0      = LCD pin D4
pin 3 , D1      = LCD pin D5
pin 4 , D2      = LCD pin D6
pin 5 , D3      = LCD pin D7

pin 6 , D4      = LCD pin RS
pin 7 , D5      = LCD pin RW
pin 8 , D6      = LCD pin EN

pin 10, ACK     = button A, upper red button
pin 12, PE      = button C, lower black button

pin 14, strobe  = 220, supply voltage
pin 16, strobe  = 220, supply voltage
pin 17, strobe  = 220, supply voltage

pin 18, ground  = 0V, GND


第二幅图显示了使用外接电源的LCD与两个按钮的连接方法:
parallel port powered LCD display


像所有新的电子类文章一样,你还可以从shop.tuxgraphics.org 获得一个包含所有组件的工具箱。

我把LCD显示屏装在一个黑色的塑料框内:
my display, back

my display, front

lcdproc并口电源补丁

LCDd总是给显示屏发送一些数据。所以你可以使用一些二极管从信号线上获取电源。 问题是即使工作在很小的电流的情况下,二极管也会造成至少0.5伏的电压下降。 我们不能承担这一问题。不过,如果你只使用一个显示屏的话,倒是有好多空闲的输出线。 没有比给LCDd程序打个补丁更容易的事了,使用这一补丁可以令所有的空闲输出线永远保持“1”。 我们仍然插入一些电阻来做一些最小的短路保护(或者可能是愚蠢的错误的保护 ;-))。 lcdproc-0.4.5的补丁可以从下载区找到,你可以这样使用它:
tar zxvf lcdproc-0.4.5.tar.gz
cd lcdproc-0.4.5
patch -p 1 < lcdproc-0.4.5-pp-powerpatch-v1.txt
./configure --enable-drivers=hd44780
make

make install

(或者你只需要将LCDd.conf拷贝到/etc,并将sever/LCDd拷贝到/usr/bin)

LCDd.conf文件

/etc/LCDd.conf 文件是我们的LCD驱动和服务器(LCDd进程)的配置文件。 为了使用本文中所讲的HD44780兼容的显示屏,我们需要在/etc/LCDd.conf文件中去掉相关的注释。
[server]
Driver=HD44780

[HD44780]
# Hitachi HD44780 driver

Port=0x3BC
# Port where the LPT is. Usual values are 0x278, 0x378 and 0x3BC

ConnectionType=4bit
Keypad=yes
Backlight=no

Size=20x2
# Specifies the size of the LCD.

DelayMult=4
DelayBus=true
比较困难的部分是端口地址(0x278, 0x378和0x3BC)。如何才能知道你并口的IO地址呢? 最简单的办法是装入parport内核模块(modprobe parport),然后查看/proc/ioports
modprobe parport
modprobe parport_pc

cat /proc/ioports

...
0388-0389 : OPL2/3 (left)
038a-038b : OPL2/3 (right)
03bc-03be : parport0
03c0-03df : vga+
03f6-03f6 : ide0
...

在这个例子中你可以使用: 0x3bc

我们自己的应用程序

在本文的开始你已经看到给LCD发送一个字符串是多么简单,但如果你想要一个交互的LCD (使用两个按钮)的话,事情就变得复杂一些了。在这个例子中我们需要避免使用sleep语句, 否则的话在休眠期间程序不会对按钮做出响应。同时,我们需要一个阻塞语句来停止循环。 我们所需要的就是系统调用“select”。它将在运行超时或显示屏上按下一个按钮后使程序停止运行。

我们的程序将提供一些状态信息(比方说mem,swap,cpu,time等),你也可以使用这些按钮来关机。

脚本的名字叫servermenu_pl,你可以从下载区找到。

在这里我只提供这么一个基本的应用程序,因为就以前文章的经验来讲, 大部分读者只是想知道如何做一些事情,然后用他们自己的程序来实现它。 我收到好多邮件,有各种各样的点子:CD烧制工作站、气象站PC、告警系统等等, 只需要稍稍修改一下代码,所有这些都可以做。
使用lcdproc和这些LCD显示屏会非常酷,并且会享受到无穷的乐趣。
servermenu in operation

参考资料