基于LON总线的图像采集系统智能节点的开发
随着信息产业的发展和数字化产品的不断涌现,人们对住宅的要求也越来越高,与此对应的是对住宅的安全性也相应的提出了更高的要求。在我国[1],虽然"智能住宅"已提出了很多年,技术也正在逐渐完善和成熟,现场总线技术尤其是Lon Works技术,无论在智能家庭还是在别的领域都得到了长足的发展,但是总有些不太如意的地方,普及不够广泛。本文通过一个具体的实例,介绍了Lon Works技术在智能家庭的具体应用,并尽力把所需成本降到最低,以使类似的产品更多地应用到普通的每个家庭中。LON总线是美国ECHELON公司1991推出的为集散式监控系统提供的实现手段,并有一系列完整的开发平台。在此基础上,作者采用神经元芯片Neuron 3150并配合W77E58单片机系列开发了低成本的图像采集节点,并能通过上位机向用户发送手机短信,有效地弥补了现在的智能住宅的不足。
1 系统结构
本系统是智能家庭系统中的子系统,主要实现的是:当有人进入该区域时则立即进行图像采集,通过各个模块进行处理后经LON总线送入上位机并通知用户,该系统属于家庭安全防范中的一部分。由于本文的需要,只设置了1个节点(也可以有多个节点)。设计中采用通用的LonWorks节点模块,以神经元芯片Neuron3150作为主控制端,W77E58单片机作为受控端进行图像采集处理。其系统总体框图如图1所示。
2 硬件设计
2.1 ZM460图像采集模块
ZM460图像压缩模块采用JPEG压缩技术,是一种内置JPEG压缩功能的数字输出嵌入式摄像设备,图像具有多种分辨率,输出完整的JPEG文件并结合最适应的网络协议,将图像通过RS232/485串口输出图像。由于该智能节点实时性要求不是很高,故本文采用W77E58单片机来控制。
2.2 W77E58单片机芯片
W77E58单片机芯片是一个快速并与8051单片机兼容的微控制器,它的内核经过重新设计,提高了时钟的速度和存储器访问周期速度,W77E58的指令执行速度是标准8051单片机的1.5~3倍。在相同的吞吐量及低频时钟情况下,电源消耗也比8051单片机低。W77E58内含32 KB Flash EPROM,工作电压为4.5V~5.5V,具有1 KB片上外部存储器,当用户应用时使用片上SRAM,可节省更多IO口。FIFO存储器用作对ZM460图像采集模块所采集的图像数据进行缓存,调节W77E58单片机与ZM460图像采集模块之间速度的差异,从而采集到完整图像。ZM460模块与W77E58单片机之间采用的是RS232接口。
2.3 Neuron 3150芯片
Neuron 3150芯片是LON总线的核心,内部包括3个微处理器:MAC处理器、网络处理器、应用处理器。Neuron 3150芯片[2]的IO8、IO10通过双排针IO口分别与W77E58单片机的串行通信口RXD、TXD连接。因为神经元Neuron 3150芯片只支持半双工异步通信,所以应用程序处理器在处理其他事件时将不能够再顾及串行输入,有可能发生丢失串口字符的现象。为解决该问题,可以使用硬件握手协议,Neuron 3150芯片的IO0和IO1作为RST、CTS信号,分别与W77E58单片机的P2.4和P2.5引脚相连,为了增强驱动能力,中间再加1个反相器。如图2所示。
2.4 Neuron 3150芯片收发器
收发器是智能节点与LON网之间的接口,是通信电路的核心。双绞线收发器是最通用的收发器类型。本设计采用变压器耦合型收发器FTT-10A。神经元芯片收发器的电路图如图3所示。另外,还有晶振电路、复位电路和Service电路等。晶振电路为Neuron 3150芯片提供工作时钟。复位电路用于在智能节点上电时产生复位操作。
2.5 Neuron芯片与PC机的连接
Neuron芯片与PC机通过双绞线连接。主机是1台PC机,通过PCLTA可以自由地在Lon Works上进行网络通信。PCLTA(PC Lon Talk Adapter)是一个网络适配器,在驱动程序的作用下,主机通过PCLTA上网,充当上位机的角色,它是Lon Works网络的一个特殊节点,其作用是:与神经元芯片进行通信及与外界进行通信(包括手机)。
3 软件设计
单片机与Neuron 3150芯片之间的通信流程图如图4所示。
3.1 Neuron 3150芯片程序
在Neuron 3150芯片中,使用的IO口称为串口(Serial)输入/输出对象。管脚IO8、IO10分别设置为异步串行数据的输入线和输出线。该IO对象类型是用于使用异步串行数据格式传输数据的场合,如RS-232通信。传输格式是:1个开始位、1个数据位、1个停止位。输入串行IO对象将等待被接收的数据帧开始直到接收了202个以上字符所要时间才结束。限于篇幅,只给出下面接收程序:
//接收程序:
IO_0 output bit CTS;
IO_1 input bit RTS;
IO_10 input serial RXD;
Network output int fkmingling[b];
When (io_change(RTS)to 0)
{
Unsigned int num;
Unsigned long sum,getsum;
IO_out(CTS,1);
Num=io_in(RXD,inputbuf,7); //串口接收
}
- 嵌入式智能家庭网关的研究与设计(07-13)