A LCD control panel for your Linux server
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 Zhangcz
AboutTheAuthor:[A small biography about the author]
Guido喜欢Linux,不仅因为通过Linux可以发掘系统的潜力,而且还在于每个人都能参与其中。
Abstract:[Here you write a little summary]
在这个设计里,我们将设计一个控制面板。它主要由东芝公司的型号HD44780
的LCD显示和ATMEL公司的AT90S4433单片机(一种8位RISC的单片机)组成。二
种器件都价钱便宜,很容易得到。控制面板包括一个监控计算机的看门狗和两
个按键。通过按键和LCD显示,可以设置ip地址,ip掩码,网关,关机,读一
些统计数据,或者你想得到的任何东西。因为它们其中大多数的逻辑都可以使
用perl实现,很容易更改。
在这个设计里,你至少需要部分的安装linux avr开发环境。关于如何建立这个环境,在
Programming the AVR Microcontroller with GCC中有描述。
ArticleIllustration:[This is the title picture for your article]
ArticleBody:[The article body]
简介
这个装置的硬件基本功能已经在前面的文章中实现:
在我们的设计中,我们会走的更远。它增加了按键以便和用户交互,还包括一个监控
服务器的硬件的看门狗。在硬件设计中,还预留了一个模拟输入端。在这里我们没有
使用它,但是你可以链接一个比如象温度传感器之类的东西。
这个设计需要一点电子爱好者的技巧。整个的花费不是很多,不到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得到一个免费的版本。
原理图(点击可以得到一个大的图片):
印制板 (点击可以得到一个大的图片):
如果你想打印的话,这里由白色背景的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分钟之间。当然你可以在室外不过你一定
避免直接的日光曝晒(光太强了)。你可以在真正使用的板子之前用一块小角反复试验一下,来得到最佳的曝光
时间。
|
曝光的在蚀刻之前的板子 |
接下来板子需要在NaOH液体里浸泡几分钟。然后仔细检查一下,通过780黑色油漆标记校准一下。我总是
把孔做的大一点,因为我发现ANGEL软件的焊盘的孔对于制作敷铜电路板来说太小了。
|
未打孔的已经制作完成的板子 |
注意:不知怎地,继电器厂家在封装上没有达成一致。我使用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)。
这可以参见原理图。
在使用串口之前必须初始化它。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"),时间,负载。这会周期的更新的。
IP设置菜单
IP地址正在修改的例子
如何改变网关地址(缺省的路由)
结论
设计LCD控制面板需要一点电子爱好者的技术,但是电路是简单的。我们的LCD控制面板
是我所见过的功能最强大的并且很通用和廉价。
焊接愉快 :-)