資源描述:
《自制電腦紅外遙控接收器》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫(kù)。
1、自制電腦紅外遙控接收器(PC軟解碼)分類:〖嵌入式〗〖智能家居〗2009-10-1409:524649人閱讀評(píng)論(9)收藏舉報(bào)網(wǎng)上有很多介紹紅外遙控接收器制作的文章,但其中大部分是用單片進(jìn)行紅外解碼,然后再通過串口或USB把解碼后的按鍵信息傳入到PC的。這樣的電路制作起來,不僅造價(jià)相對(duì)偏高,而且需要對(duì)單片編程,這會(huì)令大部分軟件開發(fā)愛好者望而卻步。最近看到一篇僅需要7個(gè)簡(jiǎn)單元器件的紅外接收器,只需拿起烙鐵,不需硬件編程就可以制作完成,原理圖如下:?由原理圖我們可知,紅外接收頭把接收的紅外信號(hào)轉(zhuǎn)換為高低電平通
2、過串口的DSR管腳傳入到PC,PC軟件通過對(duì)DSR高低電平信號(hào)的時(shí)間曲線進(jìn)行分析,從而獲得相對(duì)應(yīng)的按鍵信息。紅外遙控器一般采用脈寬調(diào)制的串行碼,經(jīng)38kHz的載頻把紅外信號(hào)發(fā)射出去。其編碼信息一般由三部分組成:引導(dǎo)碼、地址碼和數(shù)據(jù)碼。一般信號(hào)長(zhǎng)度大約100ms左右,持續(xù)按鍵則重復(fù)發(fā)送(中間會(huì)有10ms以上的間歇)。常態(tài)下,紅外接收頭的輸出(OUT)都是高電平,引導(dǎo)碼信號(hào)首先會(huì)令紅外接收頭輸出一個(gè)大約10ms左右的低電平(不同遙控器有不同的時(shí)延),這可令接收設(shè)備從容判定信號(hào)的到來,而后面的地址碼和數(shù)據(jù)碼其電
3、平高低變化就相對(duì)較快了,大概在幾十或幾百個(gè)微秒之間。PC紅外遙控軟件一般選用Girder,在使用之前需要安裝“SFH-56pluginforGirder”這個(gè)插件(文件名"igorSFH-56Plug.dll"),否則不能正常處理我們這種電路的紅外接收器信號(hào)。可悲的是我至今沒找到這個(gè)插件,網(wǎng)上提供的很多鏈接都是壞的。即使找到了這個(gè)插件,要想在我們自己編寫的程序中使用也是困難的,因?yàn)镚irder并沒有為我們開發(fā)者提供API接口。既然Girder能用軟件實(shí)現(xiàn)紅外解碼,我們?yōu)槭裁床荒苣兀糠彩露家_動(dòng)大腦,積極行
4、動(dòng)才對(duì),下面就是我自己焊接的一個(gè)紅外接收器(元器件是在中發(fā)買的,一共不到10元錢,還富裕好多電阻、電容?。?(圖下方的紅外遙控器的接收器是基于USB的,僅支持Vista以上版本,并且不支持個(gè)人開發(fā),不過今天它終于發(fā)揮了它應(yīng)有的作用。當(dāng)然用電視或VCD遙控器也是可以的)硬件有了,但程序該從何編起呢?1、由于接收到的紅外信號(hào)在微秒級(jí)別中變化,對(duì)系統(tǒng)實(shí)時(shí)性要求較高,所以具備垃圾回收功能,實(shí)時(shí)性沒有保證的C#,似乎完不成這種信號(hào)的接收功能,所以我們選擇的是VC,由它實(shí)現(xiàn)高優(yōu)先級(jí)的線程去進(jìn)行信號(hào)接收。2、由于紅外遙
5、控信號(hào)是脈寬調(diào)制的串行碼,所以我們需要采集信號(hào)的寬度,顯然采用一般的時(shí)鐘函數(shù)來獲取時(shí)間間隔是不可行的,因?yàn)榫忍停晕覀冃栌貌捎枚嗝襟w時(shí)鐘和高精度計(jì)時(shí)的API函數(shù)。3、一般我們按鍵持續(xù)時(shí)間為幾秒鐘,并且由于按鍵發(fā)出前有一個(gè)10ms左右的引導(dǎo)信號(hào),所以我們的程序很容易判斷出信號(hào)起始點(diǎn),這樣我們一次僅需要接收一定量的原始數(shù)據(jù)就可以完成初步信號(hào)采集工作。4、對(duì)于我們的紅外接收程序來說并不需要實(shí)際解碼出紅外信號(hào)到底包含了那些具體的信息,只要其能夠區(qū)分出紅外遙控上的各個(gè)按鍵就行。5、由于紅接收器是通過串口RTS
6、管腳供電,且通過DSR傳遞紅外信號(hào)的,所以我們的程序即使不接收數(shù)據(jù),也要打開串口,不過僅需要處理RTS和DSR管腳的信號(hào)即可。好了,動(dòng)手去做,下面是用VC實(shí)現(xiàn)的一個(gè)DLL,其功能就是接收并記錄紅外信號(hào)的持續(xù)時(shí)間。核心代碼如下:DWORDWINAPIThreadProc(LPVOIDpParam){????????LARGE_INTEGERlitmp;????????LONGLONGQPart1,QPart2;????????doubledfFreq;???intiTime=0;?//微秒?????????
7、//獲得計(jì)數(shù)器的時(shí)鐘頻率????????QueryPerformanceFrequency(&litmp);????????dfFreq=(double)1000000.0/litmp.QuadPart;???????????????????DWORDModemState,oldModemState=MS_DSR_ON;????????????????//EV_BREAKorEV_CTSorEV_DSRorEV_ERRorEV_RINGorEV_RLSDorEV_RXCHARorEV_RXFLAGorEV
8、_TXEMPTY????????//SetCommMask(HSC_COM_Handle,EV_DSR);????????//DWORDEvtMask,dwError;????????//COMSTATcs;??????????while(HSC_Thread_RunFlag)????????{??????????????????//等待DSR信號(hào)發(fā)生變化???????//WaitCommEvent(HSC_COM_Handl