lcdproc -- 使LCD显示屏容易使用和制作
    ArticleCategory: [Choose a category, do not translate
    this]
    Hardware 
    AuthorImage:[Here we need a little image from you]
    ![[Photo of the Author]](../../common/images/Guido-S.gif) 
 
    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]
    ![[Illustration]](../../common/images2/article375/title.jpg) 
 
    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最初仅仅是一个程序,用它来往一个外部的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电源。
 
    
    如果你的并口不能胜任,也不要太担心。你可以使用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显示屏会非常酷,并且会享受到无穷的乐趣。
    
      
    
    参考资料