| ![[Photo of the Author]](../../common/images/Guido-S.gif)  by  Guido Socher (homepage)
 
 关于作者:
 
 Guido喜欢Linux,不仅因为通过Linux可以发掘系统的潜力,而且还在于每个人都能参与其中。 目录:
 | 
 
A LCD control panel for your Linux server
 ![[Illustration]](../../common/images/article236/pic03_finalpanel_th.jpg) 
摘要:
  在这个设计里,我们将设计一个控制面板。它主要由东芝公司的型号HD44780
  的LCD显示和ATMEL公司的AT90S4433单片机(一种8位RISC的单片机)组成。二
  种器件都价钱便宜,很容易得到。控制面板包括一个监控计算机的看门狗和两
  个按键。通过按键和LCD显示,可以设置ip地址,ip掩码,网关,关机,读一
  些统计数据,或者你想得到的任何东西。因为它们其中大多数的逻辑都可以使
  用perl实现,很容易更改。
  
在这个设计里,你至少需要部分的安装linux avr开发环境。关于如何建立这个环境,在
  
  Programming the AVR Microcontroller with GCC中有描述。
  
   
简介
这个装置的硬件基本功能已经在前面的文章中实现:
  
  在我们的设计中,我们会走的更远。它增加了按键以便和用户交互,还包括一个监控
  服务器的硬件的看门狗。在硬件设计中,还预留了一个模拟输入端。在这里我们没有
  使用它,但是你可以链接一个比如象温度传感器之类的东西。
  
这个设计需要一点电子爱好者的技巧。整个的花费不是很多,不到40欧元的样子。
  
这个设计的意义在于在没有键盘和显示器的情况下,你能设置服务器。Linux是一
  个运行可靠的服务器的操作系统,很容易进行远程控制。问题在于你第一次把Linux连接到
  网络时,你必须设置它的ip地址,ip掩码和网关。这个Lcd控制面板会帮你做这些事情的。
  如果你在服务器旁边,你还可以通过它把服务器关机。
   
你需要啥?
  下面是建立这个系统所需物品的清单:
  1 个 Atmel At90S4433 单片机
  1 个28脚 7.25 mm IC 插座
  1 个 16脚 IC 插座
  1 个 MAX232
  1 个 小的 5V 继电器
  1 个4MHz 晶振
  2 个 LED (绿色和红色个一)
  1 个 BC547 NPN 三极管
  1 个BC557 PNP 三极管
  4 个1uF 电容 (普通或电解)
  2 个 27pF陶瓷电容
  1 个 10nF电容
  1 个100nF电容
  3 个 电阻 4k7
  2 个 电阻 2k2
  1 个 电阻 10K
  1 个 电阻 3k3
  2 个 电阻 100 欧姆
  3 个 电阻 470 欧姆
  3 个 电阻 1k
  1 个 电阻 220 Ohm
  1 个 4K7 变阻器(越小越好)
  1 个 4.3V稳压管
  2 个 小的触摸按键
  1 个 小封装的标准的二极管 (比如 1N4148,或者其他便宜的二极管)
  1 个 2 行 ×20 字符的带有 HD44780 兼容接口的 LCD 液晶模块
  
  我所见过的HD44780兼容的LCD一般是14线或16线接口。如果你是用3线或4线接口,
  你需要改动软件的相应部分。
  另外你还应该有为电源和RS232口准备的连线和插头。
  如果你有2个显示线,你可以把它安装在薄铝片上,然后固定到服务器的5.25英寸的槽上。
   
电路原理图和pcb图
  我使用angle软件在linux系统下制作的原理图和pcb图。它是一个很棒的软件,但是如果你不
  会使用的话,需要花一点时间学习它。 你可以在 
  cadsoftusa.com得到一个免费的版本。
  
    
原理图(点击可以得到一个大的图片):
  
  ![[Schematic]](../../common/images/article236/linuxlcdpanel_board_small.gif) 
  
印制板 (点击可以得到一个大的图片):
  
  ![[board]](../../common/images/article236/pic02_boardready_th.jpg) 
  
  如果你想打印的话,这里由白色背景的PCB图:
  
  白色背景的印制板
  (注意:这个不是你做PCB板所需的文件)
  
  angle文件如下:(gzip压缩,注意有些浏阅器在下载的同时已经解压的情况)
  
   
电路原理
  我简单介绍一下电路的工作原理。单片机AT90S4433有3个部分:PB,PC和PD。PC可以用做数字或模拟输入。所有的端口
  线可以用作数字输入或数字输出。输入还是输出由软件通过设置DDR(数据方向寄存器)来实现。我们把除23脚以外的端
  口线都用作数字输入或输出。Max232是一个电平转换器。RS232接口使用正负10V,Max232把它转换为0~5V。在1脚
 (RESET脚)你可以看到持续低电平(brownout)电路。这个电路在电源不足的情况下保持RESET脚低电平有效,防止单
  片机误操作。这会在启动和关机的几毫秒内会发生。这会保证系统会正常启动。
  
  你也许会奇怪和继电器线圈端并行的二极管,从极性上看来好像它不会起任何作用。不,它很重要!当你接通继电器线
  圈的时候,它会产生和接通方向相反的高压。没有二极管把高压导通,高压会损坏电路的。这个二极管很重要,虽然它很普通。
   
如何制作印制板
  为了蚀刻电路印制板,你首先需要在一个透明的绝缘体上打印这个postscript
  文件 (linuxlcdpanel.ps.gz)。
  在商店里你可以找到一种叫做Sinolit的半透明塑料。它是由Regulus生产,一般用来打印后处理(offset printing)。
  另一种替代品是60g的纸加透明的喷头(比如来自Kontakt Chemie的 pausklar 21)。
  
我已经把postscript格式的文件转换成了 PDF
  这是为了你没有postscript 打印系统的话。不过质量很差劲。
  
  
铜箔板曝光的时间依赖于光源。在正常的室内条件下,应该在1到2分钟之间。当然你可以在室外不过你一定
  避免直接的日光曝晒(光太强了)。你可以在真正使用的板子之前用一块小角反复试验一下,来得到最佳的曝光
  时间。
  
     
       
         | ![[before etching]](../../common/images/article236/pic01_beforeetching_th.jpg)  | 
      
        | 曝光的在蚀刻之前的板子 | 
    
  
  
  接下来板子需要在NaOH液体里浸泡几分钟。然后仔细检查一下,通过780黑色油漆标记校准一下。我总是
  把孔做的大一点,因为我发现ANGEL软件的焊盘的孔对于制作敷铜电路板来说太小了。
  
    
      
        | ![[after etching]](../../common/images/article236/pic02_boardready_th.jpg)  | 
     
      | 未打孔的已经制作完成的板子 | 
    
  
  
  注意:不知怎地,继电器厂家在封装上没有达成一致。我使用5v的由Matsushita生产的继电器。
  你的继电器也许和我的不一样因此你需要把你的电路板改动一下。
  
  如果你想得到很好的结果,你可以使用氯化铁(FeCl3)。氯化铁在室温条件下,蚀刻的成功率
  是很高的,它很好掌握很适于室内操作。你如果把你的板子直立放置在一个高的容器里,你会得到最
  好的效果。铜离子比铁离子重,如果你把氯化铁倒入一个小平底桶里面,铜离子会聚集到桶底,你的板
  子就放在那儿。
  
  在板子好了之后,你使用 松节油把板子清洗。它当你焊接的时候,会蒸发掉,这保护铜箔。
   
单片机端软件
  单片机端软件组织成以下几个文件:
  
  - lcd.c,
  lcd.h, lcd_hw.h:
  这是在avr上lcd显示的库文件。它以Peter Fleury (http://jump.tofleury/)的工作为基础。
  这个版本做了一些改动使它更灵活。你可以把LCD的引脚连接到单片机的任一脚,你只要在
  lcd_hw.h中做相应的定义。
  
- avr-util.c,
  avr-util.h:
  各种延时的函数。
  
- uart.c,
  uart.h: 这是RS232的接口库函数。它使用了硬件中断。每次单片机接受到一个字节,
  它就会执行SIGNAL(SIG_UART_RECV),接受的字节会拷贝到一个字符串缓存区。Lcd命令用
  一个换行符表示一个命令的结束。如果发现一个换行符,uart_rx_linecomplete就会设置成1,
  表示一个命令传输完毕。每次命令传输完毕后,服务器不是立即发下一命令,而是等待一段
  时间,单片机会返回命令成功(OK),或命令失败(ERR)等状态。(服务器端)PERL根据返回
  状态发送下一条命令。
  
- analog.c,
  analog.h: 模拟到数字的转换函数。它也使用了中断。一个数模转换启动后,程序等待
  SIG_ADC中断处理程序读出ADC寄存器的值。
  
- hardwarewd.c,
  hardwarewd.h:这是看门狗函数。我们使用内部分频(除以1024)的时钟刻度,计时器
  使用16位寄存器当溢出时变成8位的变量。按4M的晶振计算,大约每次溢出花费16秒。PERL
  程序为了表现计算机正常运行就必须周期的发送ascii命令给单片机,把控制溢出的变量设
  置成近可能大的值。否则,就表明计算机当机了,这个值越来越小,当它变成0,它就通过
  继电器重新硬件启动计算机。
  
- linuxlcdpanel.c:
  这是主程序。它不断的检查串口命令和按键的发生。
  
如果你想详细的了解软件,我推荐你读一下单片机的说明文档(datasheet)。在文章的
  附录部分你可以看到它,或者直接到 http://www.atmel.com/ 查找。
如果你只是想使用它,你可以从(download page)
  下载linuxlcdpanel-0.7.tar.gz,然后解压到一个目录,输入如下命令:
  
  make
make
  load
  
  或者直接使用已经编译的软件在命令行上执行它。很容易的。
  你可以在这个网页的第一篇文章里看到AVR如何编程
  Programming
  the AVR Microcontroller with GCC.
   
检验LCD控制面板
  LCD控制面板使用计算机的内部的5V电源。但是LCD控制面板第一次联机时,不能使用
  计算机电源。因为你会在焊接和安装的过程中会犯一些小错误。因为计算机的电源功
  率强劲,你要是真犯了在联机时你会看到电路和计算机黑烟腾起。第一步是使用外部
  电源测试它的电气的稳定性,然后下载软件到EPROM中。之后你会在LCD上看到"linux
  .org"图标。在下来,连接串口:
  
  MAX232 pin 14 to CTS (DB-9 pin 8)
  MAX232 pin 7 to RXD (DB-9 pin 2)
  MAX232 pin 13 to TXD (DB-9 pin 3)
  你也要把 DTR,DSR 和 CD连接到相应的 (DB-9 pin 4, 6 and 1)。
  
这可以参见原理图。
  
![[talking to the LCD panel over the serial line]](../../common/images/article236/test_with_cat.gif) 在使用串口之前必须初始化它。linuxlcdpanel-0.7.tar.gz的归档目录有一个ttydevinit,
  做的就是这件事。如果你的控制面板连接到串口2。你需要键入以下命令:
  在使用串口之前必须初始化它。linuxlcdpanel-0.7.tar.gz的归档目录有一个ttydevinit,
  做的就是这件事。如果你的控制面板连接到串口2。你需要键入以下命令:
  ./ttydevinit /dev/ttyS1
  这样你的串口驱动初始化为9600bps,你可以同你的控制面板"对话"了。打开2个XTERM的
  窗口,在其中一个键入"cat /dev/ttyS1",另一个"cat >/dev/ttyS1"。现在你可以键入
  命令比如,l=11 (打开 LED 1)或者 l=10 (关闭LED 1)。你在一个XTERM窗口中看到返回
  的状态信息"OK"。
所有的命令在 README.commands
  中有解释。
  
在源代码的目录中,有一个文件名为ttytest.pl的PEAL程序,它只是每隔一段
  时间就打开和关闭LED1。它只是一个演示如何控制LCD控制面板的例子程序。你可以以
  它为基础编写你自己的程序。看一下它的源程序,它学要一些PEAL的基础知识,不过它
  很短。
   
连接看门狗
  看门狗缺省设置是关闭的。你可以使用命令w=1激活它或使用命令s=x(x=0,1,2,。。,
  255)设置溢出时间。比如s=10表示计数器溢出的时间是16×10秒。服务器端程序需要周期
  的设置s以免看门狗溢出重启服务器。我知道Linux服务器很少当机的。但是如果当机而且
  附近没有人按RESER键,或者没有知道它在那里,因为它已经2年没有问题,这时看门狗的
  作用就会发挥了。
  
看门狗的重启只动作一次。这避免了在启动中系统检查文件系统时被再次重启的
  错误。启动后你的服务器端的程序应该激活它。
  
在连线上,你需要把连接重启(RESET)按键的2根连线旁边再并2根连线,另一
  端接到控制面板的看门狗驱动的继电器端。
   
怎么使用看门狗?
  看门狗保证系统能够执行程序,不能保证一个服务器或数据库在运行或做出响应。如果你
  想检查这类事情你应该运行crontab entry或类似的程序。你很肯定crontab一般不会出问
  题,看门狗则假定软件会正常运行。
  
你可以设计一个脚本,每隔15分钟下载自己服务器的一个页面。不过你要小心,
  如果你的服务器访问量很大,很可能你的请求会的不到应答。这样你要估计一下,比如
  最后的10次请求没有得到应答,你就重启机器或者标准重启(重启核心)(区别于"硬件重启")。
  
除此之外的应用就是监视磁盘使用空间。
  下面的shell命令在你的硬盘使用达到80%的时候会返回某些数据:
  df | egrep ' (8.%|9.%|100%) ' 
  这个也可以和crontab entry联合起来使用。
   
服务器上的脚本
  实现LCD控制面板的逻辑由PEAL实现,它的文件名是llp.pl。拷贝这个程序到/usr/sbin/。
  下一步拷贝ttydevinit到/usr/bin,拷贝ifconfig_llp.txt(在源代码归档目录的etc目录下)
  到/etc中,编辑ifconfig_llp.txt把地址改成你需要的:
  
  NETMASK=255.255.255.0
  IPADDR=10.0.0.4
  GATEWAY=10.0.0.2
  把/etc/rc.d/init.d/network做备份,拷贝源代码归档目录下的etc/network到
  /etc/rc.d/init.d/network。这个脚本和目录名称只在RedHat和Mandrake中有效。
  etc/network_all_distributions是一个更基本的脚本,可以工作在任何的发布
  的版本中。但是你必须指出init-rc在你的linux发布版本中的位置。这一点在
  各个发布版本有些许的差异。
  
编辑/etc/rc.d/init.d/network文件把下面一行改成
  /usr/sbin/llp.pl /dev/ttyS1&
如果你没有使用串口2的话。
  
现在你可以运行
  /etc/rc.d/init.d/network start
  观察一下LCD的反应。注意:它保存后会发挥作用而且会改变网络设置,但这些变化
  只有在下次重启中发挥作用。你可以改回从前的设置或者编辑/etc/ifconfig_llp.txt
  撤销你的改变。
   
Log files
  在llp.pl脚本中,写了一个LOG文件到/var/log/llp.log。这个LOG文件生长的很慢。
  基本上不用使用翻转(rotate)的方法。如果你要使用的话,你自己可以编写相应
  的程序。后翻转(post rotate)这里也没有涉及到。翻转文件的配置文件如下的样子:
  
  /var/log/llp.log {
nocompress
monthly
}
  手动关机,改变网络地址(ip,网管,掩码),还有硬件看门狗的触发重启动
  这些动作都会被LOG文件登记下来。当然,当系统当机的时候,你肯定不能登记
  看门狗的触发动作不过你可以在下次启动时把它登记下来。
   
控制面板的操作
  这里有一些LCD操作的截屏,不是全部的,你可以自己来试试。
  
主屏幕。显示一些名字(这里是"LINUXFOCUS"),时间,负载。这会周期的更新的。
  
![[main]](../../common/images/article236/display_inaction1.jpg) 
  
IP设置菜单
  ![[IP configuration menu]](../../common/images/article236/display_inaction2.jpg) 
 
  
IP地址正在修改的例子
  ![[change IP]](../../common/images/article236/display_inaction3.jpg) 
  
如何改变网关地址(缺省的路由)
  ![[GW]](../../common/images/article236/display_inaction5.jpg) 
   
结论
  ![[the final panel]](../../common/images/article236/linuxlcdpanelfinal.jpg) 设计LCD控制面板需要一点电子爱好者的技术,但是电路是简单的。我们的LCD控制面板
  是我所见过的功能最强大的并且很通用和廉价。
  焊接愉快 :-)
  设计LCD控制面板需要一点电子爱好者的技术,但是电路是简单的。我们的LCD控制面板
  是我所见过的功能最强大的并且很通用和廉价。
  焊接愉快 :-)
  
2002-03-22, generated by lfparser version 2.27