无线电杂志

用Arduino扩展网络摄像头的I/O端口

时间:2012-12-11 09:39:57  作者:温正伟  来源:  查看:4983  评论:0
导读:如今网络已极为普及了,几乎家家都安装了宽带,手机也可以上网,而且带宽水平也越来越高,网络摄像头也因此越来越受人青睐了。如今的网络摄像头,通过网络可以向使用者传输视频、音频,支持多种的平台,如网页访问、智能手机访问,还有移动侦测报警、监控录像或云台..

如今网络已极为普及了,几乎家家都安装了宽带,手机也可以上网,而且带宽水平也越来越高,网络摄像头也因此越来越受人青睐了。如今的网络摄像头,通过网络可以向使用者传输视频、音频,支持多种的平台,如网页访问、智能手机访问,还有移动侦测报警、监控录像或云台控制等功能,而且不光有有线连接的,还有Wi-Fi无线连接的,安装和使用极为方便,价格也很便宜,所以在家居、办公等环境下的安防布置得到了广泛的使用。

一个朋友的小作坊也安装了几个网络摄像头,用于查看机器工作情况和安防,有一天他来找我,说他安装的无线网络摄像头上有个报警器输出I/O口,可以使用程序控制,还说要是多几个I/O输出就好了,这样可以用来远程控制一些设备上的电路。其实许多中低档的网络摄像头都有一个报警输出I/O口和一个报警输入I/O口,有些会带能输出PTZ(云台全方位控制)协议的串行端口,有少数产品还配有独立的串行端口,可以传输数据。那么只有一个输出端口,如何来控制多个开关量呢?下面来说一下我设计的一种解决方案。

方案设计

笔者使用的是国产某品牌的网络摄像头,型号是HS-733,外形小巧,看起来像个可爱的机器人。它除了可以使用网线连接,也可以通过Wi-Fi进行无线连接,具有一对报警输入输出端口和音频输出,自身带有云台,可以进行全方位的监控。它的设置和使用方法就不多说了,没有特别之处,按使用说明就可以设置好了。

报警输出是一个常开的继电器接口,使用程序可以控制它的开合,那么我们可以使用开和关让它输出一组二进制的编码吗?答案是肯定的。然后再使用电路对编码进行译码,并做串并转换转成并口输出。读者朋友这时应该会想到通常串并转换电路有时钟和数据2个信号,缺一不可,只有一个端口如何做呢?其实只要数据线上的数据严格遵循时序要求,每个数据时序都有一样的时间间隔,就可以做到单线串行传输。

为了在网络摄像头的报警输出端口产生串行数据,我使用厂家提供的OCX控件使用Delphi编写了一个软件对其功能函数进行调用,使得软件可以在界面上控制摄像头云台的动作,也可以连接USB游戏手柄进行控制。还有8个虚拟开关用软件精确地按照设定的时间间隔发送控制继电器开合的指令,摄像头通过网络接收到指令后,就按要求开关继电器,从而形成一组串行数据。因为网络信号具有不确定性,信号的中断可能造成指令的丢失,使得数据串数据错误,为了避免错误,我设定的数据串格式是1位起始码后跟8位数据位,每一位为50ms,重复2遍发送,要求译码电路接收2次后,对2次数据进行对比,相等时才认为传输是正确的。输出二进制数据时的示波器示显示的波形如图1所示。

硬件连接

译码电路我选用了Arduino UNO,对于这样的简单任务,Arduino是一个很好的选择,编程方便快捷,调试也方便。电路的连接方式极为简单,如图2所示,只要将摄像头输出的信号接入到Arduino的8号端口即可,而0~7号端口则是输出端口。为了方便测试,我在0~7号端口上连接了8个LED,限流电阻选用470Ω。0~7号端口对应电脑软件上的虚拟开关,虚拟开关打开或关闭时,相对应的Arduino端口就处在低电平或高电平,虚拟开关可以直接在软件界面上点击控制,也可以连接游戏手柄,用手柄上的按键进行控制。实际使用时,可以在输出端口上连接继电器控制电路或其他控制电路,实现具体的控制。

图1 输出二进制数据时的示波器显示的波形

图2 摄像头与Arduino的连接

 

    根据编码规则,Arduino的解码程序的流程可以这样走:先判断8号端口电平是否为高,如果不为高,则是摄像头上的继电器没有闭合;如果为高,则说明继电器动作了,首先输出的是起始位,延时25ms,确认起始位后,进入存储数据位的代码段,因为每个位为50ms,所以每隔50ms采集一下,采集点正好位于方波的中心(见图3)。经过8次采集,把数据移入一个字节的变量中,再进行第二次采集,并把数据移入另一个变量。当2个变量的值相同时,说明数据接收正确。在这里只是使用了简单的校验方法,如果需要更加保险,可以再加个校验字节,或者让第二个字节为第一个字节的反码。最后就是把接收下来的数据反映到0~7号端口进行输出。

图3 采集数据示意图

 

PC端软件

    PC端软件的使用方法很简单,先执行压缩包里的OCX_install.exe,安装摄像头的控件,该控件只适用于HS-733系列的摄像头,别的摄像头笔者没有测试过。然后运行Goto_Joystick.exe,会在程序所在目录生成setup.ini。关闭程序,用记事本打开setup.ini文件,修改里面的IPCAM_Info项目的前4项值,分别是网络摄像头的IP地址、端口号、用户名以及密码。再次打开Goto_Joystick.exe,就可以连接摄像头进行控制了,界面如图4所示。

图4软件界面

图5 测试摄像头

 

测试时的情景如图5所示,这个制作还可以加入电机、电池、轮子来制作成时下流行的Wi-Fi智能小车,欢迎读者朋友对不足处指出意见和提议。

 

演示视频:http://www.cdle.net/thread-48471-1-1.html

 

Arduino代码

void setup()

{

  pinMode(8, INPUT); //端口设置 8号为输入

  pinMode(13, OUTPUT);

  pinMode(0, OUTPUT); 

  pinMode(1, OUTPUT);

  pinMode(2, OUTPUT);

  pinMode(3, OUTPUT); 

  pinMode(4, OUTPUT);

  pinMode(5, OUTPUT);

  pinMode(6, OUTPUT);

  pinMode(7, OUTPUT); 

}

void loop()

{

  byte val[2];

  byte tempa, tempb;

  val[0] = 0x00; //初始化2变量让其为反码

  val[1] = 0xFF;

  if (digitalRead(8) == HIGH) //为高时进入采集循环

    {

      for (tempa=0; tempa<2; tempa++) //2字节采集

        {

          delay(25);

          if (digitalRead(8) == HIGH) //起始位确认

            {

              for (tempb=0; tempb<8; tempb++) //D0-D7位

                {

                  val[tempa] = val[tempa]>>1;                 

                  delay(50);

                  if (digitalRead(8) == HIGH)

                    val[tempa] = val[tempa] | 0x80;

                  else

                    val[tempa] = val[tempa] & 0x7F;

                }

                delay(25);

            }

          else

            {

              val[0] = 0x00; //起始位不确认时初始变量

              val[1] = 0xFF;

            }

        }

      delay(50);    

      if (val[0] == val[1]) //判断2次数据变量是否相同,相同则在0-7号端口输出

        {

          for (tempb=0; tempb<8; tempb++)

            {

              if (val[0]&0x01)

                digitalWrite(tempb, LOW);

              else

                digitalWrite(tempb, HIGH);

              val[0] = val[0] >> 1;

            }

        }    

    }

}



评论区

已有0位网友发表评论
帐  号: 密码: (如果您还不是博趣会员,欢迎注册)
表  情:
内  容:
网友评论仅供其表达个人看法,并不表明博趣网同意其观点或证实其描述。