lcdproc -- 使LCD显示屏容易使用和制作
ArticleCategory: [Choose a category, do not translate
this]
Hardware
AuthorImage:[Here we need a little image from you]
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 buttons和A LCD control panel for your
Linux server。那些都是关于昂贵的LCD面板,还有监视狗、ADC等等。
很久以前我就注意到所有那些额外的功能我们并不常用。
现在,这篇文章仅提供最基本的模型:LCD显示屏和2个按钮。对每个人来说都很容易制作。
ArticleIllustration:[This is the title picture for your
article]
ArticleBody:[The article body]
lcdprod是什么?
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的电源是可能的,问题是有一些并不是完全符合规范。
那么,如何判断你的并口能够足够支持在这种“电源自给”方案呢?
下面是一些测试:
-
安装lcdproc和“并口电源”补丁(见参考资料)。
-
照下面的描述配置/dec/LCDd.conf文件。
-
以root用户启动LCDd程序。
-
用一个数字伏特表测量针脚一个电压。它应该是4.90V或更高(从针脚1和针脚18=GND间测量)。
-
现在在并口的针脚1和针脚18间接一个33K的电阻,电压将会降到4.25伏。
如果你能得到更高的电压,你的并口就是好的,如果小于4.25伏,那么这一“电源自给”方案就无法使用。
如果你通过这一测试,那么你就可以使用这种“并口电源“方案,并使用tuxgraphics 20x2显示屏,
它已经经过测试,能正常工作。
如果你的并口不能胜任,也不要太担心。你可以使用PC内部的5V电源(为此你可能需要打开机箱),
或者使用USB接口提供的5V电源。
电路图
第一张电路图显示了使用“并口电源”方案的LCD显示屏和两个按钮间的连接。
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与两个按钮的连接方法:
像所有新的电子类文章一样,你还可以从shop.tuxgraphics.org
获得一个包含所有组件的工具箱。
我把LCD显示屏装在一个黑色的塑料框内:
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显示屏会非常酷,并且会享受到无穷的乐趣。
参考资料