微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 视频监控系统中云台控制模块的设计与实现

视频监控系统中云台控制模块的设计与实现

时间:10-16 来源:电子技术应用 点击:

随着多媒体技术和网络通信技术的迅速发展,视频监控技术在国民生产生活的各个领域得到了广泛应用。而云台控制系统的出现为增加视频监控系统的监控范围、提高摄像头的监控效率起到了巨大作用。对于云台控制系统,参考文献[1]提出了基于DSP芯片的云台控制系统,参考文献[2]提出了在Visual C++编程中利用ActiveX控件实现云台控制的方案。但是,这些方案由于没有现成的开发工具支持,开发周期长、成本高且开发出来的系统在网络环境不佳时,运行不够稳定。针对这种情况,以及ARM11微处理器具有优异的多媒体数据处理能力和高度智能化的特点,本文提出了运用Net-SNMP开发工具,通过在嵌入式ARM11平台上移植SNMP代理的方法实现IP网上云台的远程控制方案。

1 基于ARM11的嵌入式视频监控系统

如图1所示为典型的嵌入式视频监控系统[3],S3C6410处理器通过控制外围设备进行视频采集,并将压缩编码后的信号发送给监控终端。同时,嵌入式处理器通过网卡接收监控终端发送过来的云台控制命令,按照云台控制协议将其解码并通过RS485端口发送给云台,实现对云台的控制功能。


2 系统硬件设计

基于SNMP和ARM11的云台控制系统的硬件部分由主控制板模块、云台模块和传输模块组成。

系统硬件部分主要包括:微处理器及存储电路模块、电源时钟模块、网卡模块和外围接口电路模块等[3]。DM9000网卡用于从IP网接收远程控制命令;RS485串口用于微处理器与云台之间的通信。Flash用于存储各种固化程序;SDRAM用于系统运行时程序的存取; 串口RS232用于打印输出信息和程序的调试。

2.1 主控制板模块

主控制板模块(即核心控制器)S3C6410是三星公司基于ARM1176JZF-S内核构建的高性能多媒体应用微处理器,由于其内部集成了硬件编解码单元MFC,使其在多媒体信号处理上大大优于早期的同类产品。S3C6410内部结构复杂,其内部集成有1个LCD控制器、SDRAM控制器、NAND Flash控制器、I2C总线接口和看门狗计数器等。完善的外设和667 MHz的运行频率,使S3C6410处理器很适用于智能控制系统的开发。

2.2 云台模块

云台是一种安装在摄像机支撑物上的工作台,用于支撑摄像机以实现水平和垂直运动等辅助功能。一般云台摄像机内置有解码器,遵循云台控制标准协议,根据外部控制信号可以对其实现控制。本系统采用3030WQ型云台和PELCO-D云台协议。其云台协议如表1所示,系统硬件架构如图2所示。

云台数据格式为:1位起始位、8位数据位、1位停止位,无效验位。波特率为2 400 B/s。
云台的停止、左、右、上、下命令分别对应:0xff,0x01,0x00,0x00,0x00,0x00,0x01;0xff,0x01,0x00,0x04,
0xff,0x00,0x04;0xff,0x01,0x00,0x02,0xff,0x00,0x02;0xff,0x01,0x00,0x08,0x00,0xff,0x08;0xff,0x01,0x00,0x10,
0x00,0xff,0x10(这里的地址码均设为0x01)。

3 软件设计

软件设计包括嵌入式系统构建和应用软件两部分[4]。嵌入式系统部分按照华恒科技S3C6410用户手册构建,其包括了引导程序(Bootloader)、Linux内核、驱动等,软件框图如图3所示。

Bootloader、Linux内核和设备驱动程序形成基本的嵌入式运行环境,应用层软件snmpd为SNMP代理软件,负责接收、解码控制命令,并将解码后的命令通过串口RS485发送到云台模块,实现对云台运动方向的控制。

3.1 Linux2.6.21操作系统定制

本系统采用开放源代码的嵌入式Linux2.6.21作为操作系统。首先对Linux内核进行裁剪,保留本系统所需的NAND Sevice Support、UDP协议以及串口支持、套接字、NFS文件系统等。裁剪包括并口支持、USB口支持、WLAN协议支持、SD卡支持等驱动模块。将裁剪后的内核通过交叉编译器编译即可得到ARM处理器能够运行的文件。然后再将镜像文件通过Bootloader下载到目标板的Dataflash中。

3.2 应用程序snmpd的开发

3.2.1 Agent开发环境的建立

由于嵌入式Linux系统的资源有限,不可能在其上运行开发和调试工具,因此,采用"宿主机即目标机"的开发形式。宿主机和目标机通过串口与网口连接。宿主机是安装了Linux系统的PC机,在宿主机上建立交叉编译环境,程序在宿主机上进行编译,然后通过交叉编译工具得到在嵌入式操作系统上运行的可执行文件。本系统采用Linux2.6.21版本作为PC机的操作系统,编译器选用Arm-linux-gcc3.4.1版本,以Net-snmp v5.4.2作为开发工具,目标机CPU为ARM11微处理器。

3.2.2 MIB库的扩展

开发环境建立后,就可以进行SNMP代理软件的开发。依据Net-SNMP开发文档,要在SNMP代理中实现自定义的功能(云台控制)就需要对其MIB库进行相应的扩展。MIB文件的编写要遵循SNMP协议中SMI部分的要求[5-6]。下面是本文编写的实现云台控制功能的MIB库文件,本文将其命名为S3C6410.txt。

S3C6410-MIB DEFINITIONS ::= BEGIN
IMPORTS
TimeTicks FROM SNMPv2-SMI
enterprises FROM SNMPv2-SMI
OBJECT-GROUP,NOTIFICATION-GROUP FROM SNMPv2-CONF
OBJECT-TYPE, Integer32, Gauge32, MODULE-IDENTITY
FROM SNMPv2-SMI
TEXTUAL-CONVENTION FROM SNMPv2-TC;
S3C6410 OBJECT IDENTIFIER::={ enterprises 9000 }
DIRECTION OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"DIRECTION controll the directions of the camera.
The number '0' equals the command 'stop'
The number '1' equals the command 'left'
The number '2' equals the command 'right'
The number '3' equals the command 'up'
The number '4' equals the command 'down'
The other number equals the number '0'
"
DEFVAL { 0 }
::={ S3C6410 1 }
END
MIB文件S3C6410.txt描述了0、1、2、3、4分别代表的涵义。即,当SNMP代理软件(snmpd)接收到了控制端发送过来的0、1、2、3、4信息时,分别将其解释为stop、left、right、up、down命令。

3.2.3 C代码(框架)的自动生成和自定义功能的加入

按照SMI规范编写好MIB库文件后,将MIB文件放在usr/local/share/snmp/mibs/目录下面,并用Net-SNMP自带的mib2c工具生成相应的C文件S3C6410.c和S3C6410.h;然后将这两个C文件拷贝到net-snmp.5.4.2/agent/mibgroup/examples/目录下,并在生成的S3C6410.c模板上添加需要的功能[7]。下面是主要添加和修改的部分。

(1)依据PELCO-D云台协议定义一维字符型数组stop、left、right、up、down。当SNMP代理接收到stop、left等命令时,就可以按照下面的定义将命令翻译成云台模块可以识别的码流。
char stop[7]={0xff,0x01,0x00,0x00,0x00,0x00,0x01};//0
char left[7]={0xff,0x01,0x00,0x04,0xff,0x00,0x04};//1
char right[7]={0xff,0x01,0x00,0x02,0xff,0x00,0x02};//2
char up[7]={0xff,0x01,0x00,0x08,0x00,0xff,0x08};//3
char down[7]={0xff,0x01,0x00,0x10,0x00,0xff,0x10};//4

(2)打开串口并设置串口参数,SNMP代理通过串口控制云台转动。
open("/dev/s3c_serial1",O_RDWR | O_NDELAY |
O_NOCTTY)//打开串口
//设置串口参数
tio.c_cflag = B2400 |CS8 |CREAD |CLOCAL;
tio.c_cflag &= ~HUPCL;
tio.c_lflag = 0;
tio.c_iflag = IGNPAR;
tio.c_oflag = 0;
tio.c_cc[VTIME] = 0;
tio.c_cc[VMIN] = 0;
……

(3)在case MODE_SET_ACTION:下添加云台控制功能。
case MODE_SET_ACTION:
……
switch(direction)
{
case 0://当接收到0时执行stop命令
write(fd,stop,7);
close(fd);
break;
……
……
case 640://当接收到640时启动application
system("exec /mnt/nand/my.application &");
break;
default://错误处理
……
}

当snmpd接收到0、1、2…时,分别向串口写入stop、left、right…命令。

3.2.4 snmpd的编译、配置和移植

(1)在net-snmp-5.4.2.1目录下使用CC=arm-none-linux-gnueabi-gcc ./configure --build=i386-linux --host=arm-none-linux-gnueabi --enable-mini-agent --disable-ipv6 --with-endianness=little --disable-manuals --disable-ucd-snmp-compatibility --enable-as-needed --disable-embedded-perl --without-perl-modules --disable-snmptrapd-subagent --disable-applications --disable-scripts --with-mib-modules="S3C6410"命令进行配置编译选项,这里可以添加需要或者去掉一些不需要的选项。配置完成后使用make install命令进行编译、安装。编译得到的snmpd比较大,但可用arm-linux-strip snmpd进行处理即可得到需要的snmpd文件。

(2)snmpd.conf文件的配置。配置文件用于存放代理进程所需的配置信息。代理进程在初始化时访问该文件:读取所需的参数、地址以及启动运行及进入循环后读写SNMP报文所需的其他信息。下面是本设计中缩减后的SNMP代理配置文件内容:
# sec.name source community
com2sec local localhost public
com2sec mynetwork 192.168.1.0/24 public#我的网段
在168
为了便于测试,可以将组设置为可读写,如:group MyRWGroup v2c mynetwork。

(3)移植到目标开发板。将snmpd和修改后的snmpd.conf文件移到宿主机的Windows下。启动目标板,将snmpd文件上传到目标板/usr/sbin目录下(需要将访问权限更改为可执行),将snmpd.conf文件上传到/usr/local/share/snmp/下(不存在的目录先要创建)。然后就可以启动snmpd了。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top