詳細說明
如今網(wǎng)絡已極為普及了,幾乎家家都安裝了寬帶,手機也可以上網(wǎng),而且?guī)捤揭苍絹碓礁?,網(wǎng)絡攝像頭也因此越來越受人青睞了。如今的網(wǎng)絡攝像頭,通過網(wǎng)絡可以向使用者傳輸視頻、音頻,支持多種的平臺,如網(wǎng)頁訪問、智能手機訪問,還有移動偵測報警、監(jiān)控錄像或云臺控制等功能,而且不光有有線連接的,還有Wi-Fi無線連接的,安裝和使用極為方便,價格也很便宜,所以在家居、辦公等環(huán)境下的安防布置得到了廣泛的使用。
一個朋友的小作坊也安裝了幾個網(wǎng)絡攝像頭,用于查看機器工作情況和安防,有一天他來找我,說他安裝的無線網(wǎng)絡攝像頭上有個報警器輸出I/O口,可以使用程序控制,還說要是多幾個I/O輸出就好了,這樣可以用來遠程控制一些設備上的電路。其實許多中低檔的網(wǎng)絡攝像頭都有一個報警輸出I/O口和一個報警輸入I/O口,有些會帶能輸出PTZ(云臺全方位控制)協(xié)議的串行端口,有少數(shù)產(chǎn)品還配有獨立的串行端口,可以傳輸數(shù)據(jù)。那么只有一個輸出端口,如何來控制多個開關量呢?下面來說一下我設計的一種解決方案。
方案設計
筆者使用的是國產(chǎn)某品牌的網(wǎng)絡攝像頭,型號是HS-733,外形小巧,看起來像個可愛的機器人。它除了可以使用網(wǎng)線連接,也可以通過Wi-Fi進行無線連接,具有一對報警輸入輸出端口和音頻輸出,自身帶有云臺,可以進行全方位的監(jiān)控。它的設置和使用方法就不多說了,沒有特別之處,按使用說明就可以設置好了。
報警輸出是一個常開的繼電器接口,使用程序可以控制它的開合,那么我們可以使用開和關讓它輸出一組二進制的編碼嗎?答案是肯定的。然后再使用電路對編碼進行譯碼,并做串并轉換轉成并口輸出。讀者朋友這時應該會想到通常串并轉換電路有時鐘和數(shù)據(jù)2個信號,缺一不可,只有一個端口如何做呢?其實只要數(shù)據(jù)線上的數(shù)據(jù)嚴格遵循時序要求,每個數(shù)據(jù)時序都有一樣的時間間隔,就可以做到單線串行傳輸。
為了在網(wǎng)絡攝像頭的報警輸出端口產(chǎn)生串行數(shù)據(jù),我使用廠家提供的OCX控件使用Delphi編寫了一個軟件對其功能函數(shù)進行調(diào)用,使得軟件可以在界面上控制攝像頭云臺的動作,也可以連接USB游戲手柄進行控制。還有8個虛擬開關用軟件精確地按照設定的時間間隔發(fā)送控制繼電器開合的指令,攝像頭通過網(wǎng)絡接收到指令后,就按要求開關繼電器,從而形成一組串行數(shù)據(jù)。因為網(wǎng)絡信號具有不確定性,信號的中斷可能造成指令的丟失,使得數(shù)據(jù)串數(shù)據(jù)錯誤,為了避免錯誤,我設定的數(shù)據(jù)串格式是1位起始碼后跟8位數(shù)據(jù)位,每一位為50ms,重復2遍發(fā)送,要求譯碼電路接收2次后,對2次數(shù)據(jù)進行對比,相等時才認為傳輸是正確的。輸出二進制數(shù)據(jù)時的示波器示顯示的波形如圖1所示。
硬件連接
譯碼電路我選用了Arduino UNO,對于這樣的簡單任務,Arduino是一個很好的選擇,編程方便快捷,調(diào)試也方便。電路的連接方式極為簡單,如圖2所示,只要將攝像頭輸出的信號接入到Arduino的8號端口即可,而0~7號端口則是輸出端口。為了方便測試,我在0~7號端口上連接了8個LED,限流電阻選用470Ω。0~7號端口對應電腦軟件上的虛擬開關,虛擬開關打開或關閉時,相對應的Arduino端口就處在低電平或高電平,虛擬開關可以直接在軟件界面上點擊控制,也可以連接游戲手柄,用手柄上的按鍵進行控制。實際使用時,可以在輸出端口上連接繼電器控制電路或其他控制電路,實現(xiàn)具體的控制。
圖1 輸出二進制數(shù)據(jù)時的示波器顯示的波形
圖2 攝像頭與Arduino的連接
根據(jù)編碼規(guī)則,Arduino的解碼程序的流程可以這樣走:先判斷8號端口電平是否為高,如果不為高,則是攝像頭上的繼電器沒有閉合;如果為高,則說明繼電器動作了,首先輸出的是起始位,延時25ms,確認起始位后,進入存儲數(shù)據(jù)位的代碼段,因為每個位為50ms,所以每隔50ms采集一下,采集點正好位于方波的中心(見圖3)。經(jīng)過8次采集,把數(shù)據(jù)移入一個字節(jié)的變量中,再進行第二次采集,并把數(shù)據(jù)移入另一個變量。當2個變量的值同時,說明數(shù)據(jù)接收正確。在這里只是使用了簡單的校驗方法,如果需要更加保險,可以再加個校驗字節(jié),或者讓第二個字節(jié)為第一個字節(jié)的反碼。最后就是把接收下來的數(shù)據(jù)反映到0~7號端口進行輸出。
圖3 采集數(shù)據(jù)示意圖