用Arduino擴(kuò)展網(wǎng)絡(luò)攝像頭的I/O端口(附源代碼)

2013-08-29 10:01 來(lái)源:電源網(wǎng) 作者:鈴鐺

詳細(xì)說(shuō)明

如今網(wǎng)絡(luò)已極為普及了,幾乎家家都安裝了寬帶,手機(jī)也可以上網(wǎng),而且?guī)捤揭苍絹?lái)越高,網(wǎng)絡(luò)攝像頭也因此越來(lái)越受人青睞了。如今的網(wǎng)絡(luò)攝像頭,通過(guò)網(wǎng)絡(luò)可以向使用者傳輸視頻、音頻,支持多種的平臺(tái),如網(wǎng)頁(yè)訪問(wèn)、智能手機(jī)訪問(wèn),還有移動(dòng)偵測(cè)報(bào)警、監(jiān)控錄像或云臺(tái)控制等功能,而且不光有有線連接的,還有Wi-Fi無(wú)線連接的,安裝和使用極為方便,價(jià)格也很便宜,所以在家居、辦公等環(huán)境下的安防布置得到了廣泛的使用。

一個(gè)朋友的小作坊也安裝了幾個(gè)網(wǎng)絡(luò)攝像頭,用于查看機(jī)器工作情況和安防,有一天他來(lái)找我,說(shuō)他安裝的無(wú)線網(wǎng)絡(luò)攝像頭上有個(gè)報(bào)警器輸出I/O口,可以使用程序控制,還說(shuō)要是多幾個(gè)I/O輸出就好了,這樣可以用來(lái)遠(yuǎn)程控制一些設(shè)備上的電路。其實(shí)許多中低檔的網(wǎng)絡(luò)攝像頭都有一個(gè)報(bào)警輸出I/O口和一個(gè)報(bào)警輸入I/O口,有些會(huì)帶能輸出PTZ(云臺(tái)全方位控制)協(xié)議的串行端口,有少數(shù)產(chǎn)品還配有獨(dú)立的串行端口,可以傳輸數(shù)據(jù)。那么只有一個(gè)輸出端口,如何來(lái)控制多個(gè)開(kāi)關(guān)量呢?下面來(lái)說(shuō)一下我設(shè)計(jì)的一種解決方案。

方案設(shè)計(jì)

筆者使用的是國(guó)產(chǎn)某品牌的網(wǎng)絡(luò)攝像頭,型號(hào)是HS-733,外形小巧,看起來(lái)像個(gè)可愛(ài)的機(jī)器人。它除了可以使用網(wǎng)線連接,也可以通過(guò)Wi-Fi進(jìn)行無(wú)線連接,具有一對(duì)報(bào)警輸入輸出端口和音頻輸出,自身帶有云臺(tái),可以進(jìn)行全方位的監(jiān)控。它的設(shè)置和使用方法就不多說(shuō)了,沒(méi)有特別之處,按使用說(shuō)明就可以設(shè)置好了。

報(bào)警輸出是一個(gè)常開(kāi)的繼電器接口,使用程序可以控制它的開(kāi)合,那么我們可以使用開(kāi)和關(guān)讓它輸出一組二進(jìn)制的編碼嗎?答案是肯定的。然后再使用電路對(duì)編碼進(jìn)行譯碼,并做串并轉(zhuǎn)換轉(zhuǎn)成并口輸出。讀者朋友這時(shí)應(yīng)該會(huì)想到通常串并轉(zhuǎn)換電路有時(shí)鐘和數(shù)據(jù)2個(gè)信號(hào),缺一不可,只有一個(gè)端口如何做呢?其實(shí)只要數(shù)據(jù)線上的數(shù)據(jù)嚴(yán)格遵循時(shí)序要求,每個(gè)數(shù)據(jù)時(shí)序都有一樣的時(shí)間間隔,就可以做到單線串行傳輸。

為了在網(wǎng)絡(luò)攝像頭的報(bào)警輸出端口產(chǎn)生串行數(shù)據(jù),我使用廠家提供的OCX控件使用Delphi編寫(xiě)了一個(gè)軟件對(duì)其功能函數(shù)進(jìn)行調(diào)用,使得軟件可以在界面上控制攝像頭云臺(tái)的動(dòng)作,也可以連接USB游戲手柄進(jìn)行控制。還有8個(gè)虛擬開(kāi)關(guān)用軟件精確地按照設(shè)定的時(shí)間間隔發(fā)送控制繼電器開(kāi)合的指令,攝像頭通過(guò)網(wǎng)絡(luò)接收到指令后,就按要求開(kāi)關(guān)繼電器,從而形成一組串行數(shù)據(jù)。因?yàn)榫W(wǎng)絡(luò)信號(hào)具有不確定性,信號(hào)的中斷可能造成指令的丟失,使得數(shù)據(jù)串?dāng)?shù)據(jù)錯(cuò)誤,為了避免錯(cuò)誤,我設(shè)定的數(shù)據(jù)串格式是1位起始碼后跟8位數(shù)據(jù)位,每一位為50ms,重復(fù)2遍發(fā)送,要求譯碼電路接收2次后,對(duì)2次數(shù)據(jù)進(jìn)行對(duì)比,相等時(shí)才認(rèn)為傳輸是正確的。輸出二進(jìn)制數(shù)據(jù)時(shí)的示波器示顯示的波形如圖1所示。

硬件連接

譯碼電路我選用了Arduino UNO,對(duì)于這樣的簡(jiǎn)單任務(wù),Arduino是一個(gè)很好的選擇,編程方便快捷,調(diào)試也方便。電路的連接方式極為簡(jiǎn)單,如圖2所示,只要將攝像頭輸出的信號(hào)接入到Arduino的8號(hào)端口即可,而0~7號(hào)端口則是輸出端口。為了方便測(cè)試,我在0~7號(hào)端口上連接了8個(gè)LED,限流電阻選用470Ω。0~7號(hào)端口對(duì)應(yīng)電腦軟件上的虛擬開(kāi)關(guān),虛擬開(kāi)關(guān)打開(kāi)或關(guān)閉時(shí),相對(duì)應(yīng)的Arduino端口就處在低電平或高電平,虛擬開(kāi)關(guān)可以直接在軟件界面上點(diǎn)擊控制,也可以連接游戲手柄,用手柄上的按鍵進(jìn)行控制。實(shí)際使用時(shí),可以在輸出端口上連接繼電器控制電路或其他控制電路,實(shí)現(xiàn)具體的控制。

32120758_4


圖1 輸出二進(jìn)制數(shù)據(jù)時(shí)的示波器顯示的波形

02


圖2 攝像頭與Arduino的連接

根據(jù)編碼規(guī)則,Arduino的解碼程序的流程可以這樣走:先判斷8號(hào)端口電平是否為高,如果不為高,則是攝像頭上的繼電器沒(méi)有閉合;如果為高,則說(shuō)明繼電器動(dòng)作了,首先輸出的是起始位,延時(shí)25ms,確認(rèn)起始位后,進(jìn)入存儲(chǔ)數(shù)據(jù)位的代碼段,因?yàn)槊總€(gè)位為50ms,所以每隔50ms采集一下,采集點(diǎn)正好位于方波的中心(見(jiàn)圖3)。經(jīng)過(guò)8次采集,把數(shù)據(jù)移入一個(gè)字節(jié)的變量中,再進(jìn)行第二次采集,并把數(shù)據(jù)移入另一個(gè)變量。當(dāng)2個(gè)變量的值同時(shí),說(shuō)明數(shù)據(jù)接收正確。在這里只是使用了簡(jiǎn)單的校驗(yàn)方法,如果需要更加保險(xiǎn),可以再加個(gè)校驗(yàn)字節(jié),或者讓第二個(gè)字節(jié)為第一個(gè)字節(jié)的反碼。最后就是把接收下來(lái)的數(shù)據(jù)反映到0~7號(hào)端口進(jìn)行輸出。

03


圖3 采集數(shù)據(jù)示意圖

1 2 > 
攝像頭 Arduino I/O端口

相關(guān)閱讀

暫無(wú)數(shù)據(jù)

一周熱門(mén)